jdk/src/windows/classes/sun/security/krb5/internal/tools/Ktab.java
author weijun
Wed, 24 Nov 2010 07:43:06 +0800
changeset 7296 fa827ef8c75e
parent 7037 9fd3887c8010
child 9499 f3115698a012
permissions -rw-r--r--
7002036: ktab return code changes on a error case Reviewed-by: valeriep
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
7037
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
     2
 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     4
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
90ce3da70b43 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 3317
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 3317
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    10
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
90ce3da70b43 Initial load
duke
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
90ce3da70b43 Initial load
duke
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    15
 * accompanied this code).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    16
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
90ce3da70b43 Initial load
duke
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 3317
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 3317
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 3317
diff changeset
    23
 * questions.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    24
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    25
90ce3da70b43 Initial load
duke
parents:
diff changeset
    26
/*
90ce3da70b43 Initial load
duke
parents:
diff changeset
    27
 *  (C) Copyright IBM Corp. 1999 All Rights Reserved.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    28
 *  Copyright 1997 The Open Group Research Institute.  All rights reserved.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    29
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    30
90ce3da70b43 Initial load
duke
parents:
diff changeset
    31
package sun.security.krb5.internal.tools;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    32
90ce3da70b43 Initial load
duke
parents:
diff changeset
    33
import sun.security.krb5.*;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    34
import sun.security.krb5.internal.ktab.*;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    35
import java.io.IOException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    36
import java.io.BufferedReader;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    37
import java.io.InputStreamReader;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    38
import java.io.File;
3317
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
    39
import java.text.DateFormat;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    40
import java.util.Arrays;
3317
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
    41
import java.util.Date;
7037
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
    42
import java.util.Locale;
3317
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
    43
import sun.security.krb5.internal.crypto.EType;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    44
/**
90ce3da70b43 Initial load
duke
parents:
diff changeset
    45
 * This class can execute as a command-line tool to help the user manage
7037
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
    46
 * entries in the key table.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    47
 * Available functions include list/add/update/delete service key(s).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    48
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    49
 * @author Yanni Zhang
90ce3da70b43 Initial load
duke
parents:
diff changeset
    50
 * @author Ram Marti
90ce3da70b43 Initial load
duke
parents:
diff changeset
    51
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    52
90ce3da70b43 Initial load
duke
parents:
diff changeset
    53
public class Ktab {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    54
    // KeyTabAdmin admin;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    55
    KeyTab table;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    56
    char action;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    57
    String name;   // name and directory of key table
90ce3da70b43 Initial load
duke
parents:
diff changeset
    58
    String principal;
3317
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
    59
    boolean showEType;
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
    60
    boolean showTime;
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
    61
    int etype = -1;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    62
    char[] password = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    63
7037
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
    64
    boolean forced = false; // true if delete without prompt. Default false
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
    65
    boolean append = false; // true if new keys are appended. Default false
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
    66
    int vDel = -1;          // kvno to delete, -1 all, -2 old. Default -1
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
    67
    int vAdd = -1;          // kvno to add. Default -1, means auto incremented
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
    68
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    69
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
    70
     * The main program that can be invoked at command line.
7037
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
    71
     * See {@link #printHelp} for usages.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    72
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    73
    public static void main(String[] args) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    74
        Ktab ktab = new Ktab();
90ce3da70b43 Initial load
duke
parents:
diff changeset
    75
        if ((args.length == 1) && (args[0].equalsIgnoreCase("-help"))) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    76
            ktab.printHelp();
7037
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
    77
            return;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    78
        } else if ((args == null) || (args.length == 0)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    79
            ktab.action = 'l';
90ce3da70b43 Initial load
duke
parents:
diff changeset
    80
        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    81
            ktab.processArgs(args);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    82
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    83
        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    84
            if (ktab.name == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    85
                //  ktab.admin = new KeyTabAdmin();    // use the default keytab.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    86
                ktab.table = KeyTab.getInstance();
90ce3da70b43 Initial load
duke
parents:
diff changeset
    87
                if (ktab.table == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    88
                    if (ktab.action == 'a') {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    89
                        ktab.table = KeyTab.create();
90ce3da70b43 Initial load
duke
parents:
diff changeset
    90
                    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    91
                        System.out.println("No default key table exists.");
90ce3da70b43 Initial load
duke
parents:
diff changeset
    92
                        System.exit(-1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    93
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    94
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    95
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    96
                if ((ktab.action != 'a') &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
    97
                    !(new File(ktab.name)).exists()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    98
                    System.out.println("Key table " +
90ce3da70b43 Initial load
duke
parents:
diff changeset
    99
                                ktab.name + " does not exist.");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   100
                    System.exit(-1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   101
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   102
                    ktab.table = KeyTab.getInstance(ktab.name);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   103
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   104
                if (ktab.table == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   105
                    if (ktab.action == 'a') {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   106
                        ktab.table = KeyTab.create(ktab.name);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   107
                    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   108
                        System.out.println("The format of key table " +
90ce3da70b43 Initial load
duke
parents:
diff changeset
   109
                                ktab.name + " is incorrect.");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   110
                        System.exit(-1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   111
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   112
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   113
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   114
        } catch (RealmException e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   115
            System.err.println("Error loading key table.");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   116
            System.exit(-1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   117
        } catch (IOException e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   118
            System.err.println("Error loading key table.");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   119
            System.exit(-1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   120
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   121
        switch (ktab.action) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   122
        case 'l':
90ce3da70b43 Initial load
duke
parents:
diff changeset
   123
            ktab.listKt();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   124
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   125
        case 'a':
90ce3da70b43 Initial load
duke
parents:
diff changeset
   126
            ktab.addEntry();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   127
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   128
        case 'd':
90ce3da70b43 Initial load
duke
parents:
diff changeset
   129
            ktab.deleteEntry();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   130
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   131
        default:
7296
fa827ef8c75e 7002036: ktab return code changes on a error case
weijun
parents: 7037
diff changeset
   132
            ktab.error("A command must be provided");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   133
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   134
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   135
90ce3da70b43 Initial load
duke
parents:
diff changeset
   136
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   137
     * Parses the command line arguments.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   138
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   139
    void processArgs(String[] args) {
7037
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   140
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   141
        // Commands (should appear before options):
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   142
        //   -l
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   143
        //   -a <princ>
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   144
        //   -d <princ>
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   145
        // Options:
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   146
        //   -e <etype> (for -d)
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   147
        //   -e (for -l)
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   148
        //   -n <kvno>
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   149
        //   -k <keytab>
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   150
        //   -t
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   151
        //   -f
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   152
        //   -append
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   153
        // Optional extra arguments:
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   154
        //   password for -a
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   155
        //   [kvno|all|old] for -d
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   156
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   157
        boolean argAlreadyAppeared = false;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   158
        for (int i = 0; i < args.length; i++) {
7037
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   159
            if (args[i].startsWith("-")) {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   160
                switch (args[i].toLowerCase(Locale.US)) {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   161
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   162
                    // Commands
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   163
                    case "-l":   // list
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   164
                        action = 'l';
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   165
                        break;
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   166
                    case "-a":   // add a new entry to keytab.
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   167
                        action = 'a';
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   168
                        if (++i >= args.length || args[i].startsWith("-")) {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   169
                            error("A principal name must be specified after -a");
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   170
                        }
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   171
                        principal = args[i];
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   172
                        break;
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   173
                    case "-d":   // delete entries
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   174
                        action = 'd';
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   175
                        if (++i >= args.length || args[i].startsWith("-")) {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   176
                            error("A principal name must be specified after -d");
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   177
                        }
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   178
                        principal = args[i];
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   179
                        break;
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   180
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   181
                        // Options
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   182
                    case "-e":
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   183
                        if (action == 'l') {    // list etypes
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   184
                            showEType = true;
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   185
                        } else if (action == 'd') { // delete etypes
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   186
                            if (++i >= args.length || args[i].startsWith("-")) {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   187
                                error("An etype must be specified after -e");
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   188
                            }
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   189
                            try {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   190
                                etype = Integer.parseInt(args[i]);
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   191
                                if (etype <= 0) {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   192
                                    throw new NumberFormatException();
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   193
                                }
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   194
                            } catch (NumberFormatException nfe) {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   195
                                error(args[i] + " is not a valid etype");
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   196
                            }
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   197
                        } else {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   198
                            error(args[i] + " is not valid after -" + action);
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   199
                        }
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   200
                        break;
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   201
                    case "-n":   // kvno for -a
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   202
                        if (++i >= args.length || args[i].startsWith("-")) {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   203
                            error("A KVNO must be specified after -n");
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   204
                        }
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   205
                        try {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   206
                            vAdd = Integer.parseInt(args[i]);
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   207
                            if (vAdd < 0) {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   208
                                throw new NumberFormatException();
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   209
                            }
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   210
                        } catch (NumberFormatException nfe) {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   211
                            error(args[i] + " is not a valid KVNO");
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   212
                        }
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   213
                        break;
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   214
                    case "-k":  // specify keytab to use
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   215
                        if (++i >= args.length || args[i].startsWith("-")) {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   216
                            error("A keytab name must be specified after -k");
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   217
                        }
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   218
                        if (args[i].length() >= 5 &&
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   219
                            args[i].substring(0, 5).equalsIgnoreCase("FILE:")) {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   220
                            name = args[i].substring(5);
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   221
                        } else {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   222
                            name = args[i];
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   223
                        }
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   224
                        break;
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   225
                    case "-t":   // list timestamps
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   226
                        showTime = true;
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   227
                        break;
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   228
                    case "-f":   // force delete, no prompt
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   229
                        forced = true;
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   230
                        break;
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   231
                    case "-append": // -a, new keys append to file
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   232
                        append = true;
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   233
                        break;
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   234
                    default:
7296
fa827ef8c75e 7002036: ktab return code changes on a error case
weijun
parents: 7037
diff changeset
   235
                        error("Unknown command: " + args[i]);
7037
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   236
                        break;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   237
                }
7037
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   238
            } else {    // optional standalone arguments
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   239
                if (argAlreadyAppeared) {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   240
                    error("Useless extra argument " + args[i]);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   241
                }
7037
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   242
                if (action == 'a') {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   243
                    password = args[i].toCharArray();
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   244
                } else if (action == 'd') {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   245
                    switch (args[i]) {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   246
                        case "all": vDel = -1; break;
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   247
                        case "old": vDel = -2; break;
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   248
                        default: {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   249
                            try {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   250
                                vDel = Integer.parseInt(args[i]);
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   251
                                if (vDel < 0) {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   252
                                    throw new NumberFormatException();
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   253
                                }
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   254
                            } catch (NumberFormatException nfe) {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   255
                                error(args[i] + " is not a valid KVNO");
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   256
                            }
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   257
                        }
3317
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   258
                    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   259
                } else {
7037
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   260
                    error("Useless extra argument " + args[i]);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   261
                }
7037
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   262
                argAlreadyAppeared = true;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   263
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   264
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   265
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   266
90ce3da70b43 Initial load
duke
parents:
diff changeset
   267
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   268
     * Adds a service key to key table. If the specified key table does not
90ce3da70b43 Initial load
duke
parents:
diff changeset
   269
     * exist, the program will automatically generate
90ce3da70b43 Initial load
duke
parents:
diff changeset
   270
     * a new key table.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   271
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   272
    void addEntry() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   273
        PrincipalName pname = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   274
        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   275
            pname = new PrincipalName(principal);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   276
            if (pname.getRealm() == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   277
                pname.setRealm(Config.getInstance().getDefaultRealm());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   278
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   279
        } catch (KrbException e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   280
            System.err.println("Failed to add " + principal +
90ce3da70b43 Initial load
duke
parents:
diff changeset
   281
                               " to keytab.");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   282
            e.printStackTrace();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   283
            System.exit(-1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   284
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   285
        if (password == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   286
            try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   287
                BufferedReader cis =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   288
                    new BufferedReader(new InputStreamReader(System.in));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   289
                System.out.print("Password for " + pname.toString() + ":");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   290
                System.out.flush();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   291
                password = cis.readLine().toCharArray();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   292
            } catch (IOException e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   293
                System.err.println("Failed to read the password.");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   294
                e.printStackTrace();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   295
                System.exit(-1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   296
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   297
90ce3da70b43 Initial load
duke
parents:
diff changeset
   298
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   299
        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   300
            // admin.addEntry(pname, password);
7037
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   301
            table.addEntry(pname, password, vAdd, append);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   302
            Arrays.fill(password, '0');  // clear password
90ce3da70b43 Initial load
duke
parents:
diff changeset
   303
            // admin.save();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   304
            table.save();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   305
            System.out.println("Done!");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   306
            System.out.println("Service key for " + principal +
90ce3da70b43 Initial load
duke
parents:
diff changeset
   307
                               " is saved in " + table.tabName());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   308
90ce3da70b43 Initial load
duke
parents:
diff changeset
   309
        } catch (KrbException e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   310
            System.err.println("Failed to add " + principal + " to keytab.");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   311
            e.printStackTrace();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   312
            System.exit(-1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   313
        } catch (IOException e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   314
            System.err.println("Failed to save new entry.");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   315
            e.printStackTrace();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   316
            System.exit(-1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   317
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   318
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   319
90ce3da70b43 Initial load
duke
parents:
diff changeset
   320
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   321
     * Lists key table name and entries in it.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   322
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   323
    void listKt() {
3317
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   324
        System.out.println("Keytab name: " + KeyTab.tabName());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   325
        KeyTabEntry[] entries = table.getEntries();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   326
        if ((entries != null) && (entries.length > 0)) {
3317
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   327
            String[][] output = new String[entries.length+1][showTime?3:2];
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   328
            int column = 0;
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   329
            output[0][column++] = "KVNO";
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   330
            if (showTime) output[0][column++] = "Timestamp";
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   331
            output[0][column++] = "Principal";
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   332
            for (int i = 0; i < entries.length; i++) {
3317
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   333
                column = 0;
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   334
                output[i+1][column++] = entries[i].getKey().
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   335
                        getKeyVersionNumber().toString();
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   336
                if (showTime) output[i+1][column++] =
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   337
                        DateFormat.getDateTimeInstance(
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   338
                        DateFormat.SHORT, DateFormat.SHORT).format(
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   339
                        new Date(entries[i].getTimeStamp().getTime()));
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   340
                String princ = entries[i].getService().toString();
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   341
                if (showEType) {
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   342
                    int e = entries[i].getKey().getEType();
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   343
                    output[i+1][column++] = princ + " (" + e + ":" +
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   344
                            EType.toString(e) + ")";
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   345
                } else {
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   346
                    output[i+1][column++] = princ;
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   347
                }
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   348
            }
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   349
            int[] width = new int[column];
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   350
            for (int j=0; j<column; j++) {
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   351
                for (int i=0; i <= entries.length; i++) {
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   352
                    if (output[i][j].length() > width[j]) {
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   353
                        width[j] = output[i][j].length();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   354
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   355
                }
3317
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   356
                if (j != 0) width[j] = -width[j];
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   357
            }
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   358
            for (int j=0; j<column; j++) {
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   359
                System.out.printf("%" + width[j] + "s ", output[0][j]);
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   360
            }
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   361
            System.out.println();
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   362
            for (int j=0; j<column; j++) {
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   363
                for (int k=0; k<Math.abs(width[j]); k++) System.out.print("-");
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   364
                System.out.print(" ");
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   365
            }
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   366
            System.out.println();
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   367
            for (int i=0; i<entries.length; i++) {
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   368
                for (int j=0; j<column; j++) {
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   369
                    System.out.printf("%" + width[j] + "s ", output[i+1][j]);
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   370
                }
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   371
                System.out.println();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   372
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   373
        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   374
            System.out.println("0 entry.");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   375
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   376
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   377
90ce3da70b43 Initial load
duke
parents:
diff changeset
   378
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   379
     * Deletes an entry from the key table.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   380
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   381
    void deleteEntry() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   382
        PrincipalName pname = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   383
        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   384
            pname = new PrincipalName(principal);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   385
            if (pname.getRealm() == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   386
                pname.setRealm(Config.getInstance().getDefaultRealm());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   387
            }
7037
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   388
            if (!forced) {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   389
                String answer;
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   390
                BufferedReader cis =
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   391
                    new BufferedReader(new InputStreamReader(System.in));
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   392
                System.out.print("Are you sure you want to delete "+
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   393
                        "service key(s) for " + pname.toString() +
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   394
                        " (" + (etype==-1?"all etypes":("etype="+etype)) + ", " +
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   395
                        (vDel==-1?"all kvno":(vDel==-2?"old kvno":("kvno=" + vDel))) +
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   396
                        ") in " + table.tabName() + "? (Y/[N]): ");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   397
7037
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   398
                System.out.flush();
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   399
                answer = cis.readLine();
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   400
                if (answer.equalsIgnoreCase("Y") ||
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   401
                    answer.equalsIgnoreCase("Yes"));
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   402
                else {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   403
                    // no error, the user did not want to delete the entry
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   404
                    System.exit(0);
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   405
                }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   406
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   407
        } catch (KrbException e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   408
            System.err.println("Error occured while deleting the entry. "+
90ce3da70b43 Initial load
duke
parents:
diff changeset
   409
                               "Deletion failed.");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   410
            e.printStackTrace();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   411
            System.exit(-1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   412
        } catch (IOException e) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   413
            System.err.println("Error occured while deleting the entry. "+
90ce3da70b43 Initial load
duke
parents:
diff changeset
   414
                               " Deletion failed.");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   415
            e.printStackTrace();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   416
            System.exit(-1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   417
        }
3317
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   418
7037
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   419
        int count = table.deleteEntries(pname, etype, vDel);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   420
3317
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   421
        if (count == 0) {
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   422
            System.err.println("No matched entry in the keytab. " +
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   423
                               "Deletion fails.");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   424
            System.exit(-1);
3317
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   425
        } else {
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   426
            try {
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   427
                table.save();
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   428
            } catch (IOException e) {
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   429
                System.err.println("Error occurs while saving the keytab. " +
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   430
                                   "Deletion fails.");
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   431
                e.printStackTrace();
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   432
                System.exit(-1);
a1ea2f1893f9 6854308: more ktab options
weijun
parents: 2
diff changeset
   433
            }
7037
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   434
            System.out.println("Done! " + count + " entries removed.");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   435
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   436
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   437
7037
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   438
    void error(String... errors) {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   439
        for (String error: errors) {
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   440
            System.out.println("Error: " + error + ".");
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   441
        }
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   442
        printHelp();
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   443
        System.exit(-1);
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   444
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   445
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   446
     * Prints out the help information.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   447
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   448
    void printHelp() {
7037
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   449
        System.out.println("\nUsage: ktab <commands> <options>");
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   450
        System.out.println();
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   451
        System.out.println("Available commands:");
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   452
        System.out.println();
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   453
        System.out.println("-l [-e] [-t]\n"
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   454
                + "    list the keytab name and entries. -e with etype, -t with timestamp.");
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   455
        System.out.println("-a <principal name> [<password>] [-n <kvno>] [-append]\n"
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   456
                + "    add new key entries to the keytab for the given principal name with\n"
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   457
                + "    optional <password>. If a <kvno> is specified, new keys' Key Version\n"
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   458
                + "    Numbers equal to the value, otherwise, automatically incrementing\n"
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   459
                + "    the Key Version Numbers. If -append is specified, new keys are\n"
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   460
                + "    appended to the keytab, otherwise, old keys for the\n"
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   461
                + "    same principal are removed.");
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   462
        System.out.println("-d <principal name> [-f] [-e <etype>] [<kvno> | all | old]\n"
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   463
                + "    delete key entries from the keytab for the specified principal. If\n"
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   464
                + "    <kvno> is specified, delete keys whose Key Version Numbers match\n"
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   465
                + "    kvno. If \"all\" is specified, delete all keys. If \"old\" is specified,\n"
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   466
                + "    delete all keys except those with the highest kvno. Default action\n"
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   467
                + "    is \"all\". If <etype> is specified, only keys of this encryption type\n"
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   468
                + "    are deleted. <etype> should be specified as the numberic value etype\n"
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   469
                + "    defined in RFC 3961, section 8. A prompt to confirm the deletion is\n"
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   470
                + "    displayed unless -f is specified.");
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   471
        System.out.println();
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   472
        System.out.println("Common option(s):");
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   473
        System.out.println();
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   474
        System.out.println("-k <keytab name>\n"
9fd3887c8010 6950546: "ktab -d name etype" to "ktab -d name [-e etype] [kvno | all | old]"
weijun
parents: 5506
diff changeset
   475
                + "    specify keytab name and path with prefix FILE:");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   476
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   477
}