blob: c6c31129a33a0c42a973d6fcd7da58928b172a25 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.kerby.kerberos.tool.kadmin;
import org.apache.kerby.config.Conf;
import org.apache.kerby.kerberos.kerb.server.KdcConfig;
import org.apache.kerby.kerberos.tool.kadmin.executor.*;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.Scanner;
public class Kadmin {
private static final String PROMPT = Kadmin.class.getSimpleName() + ".local";
private static final String REQUEST_LIST = "Available " + PROMPT + " requests:\n" +
"\n" +
"add_principal, addprinc, ank\n" +
" Add principal\n" +
"delete_principal, delprinc\n" +
" Delete principal\n" +
"modify_principal, modprinc\n" +
" Modify principal\n" +
"rename_principal, renprinc\n" +
" Rename principal\n" +
"change_password, cpw Change password\n" +
"get_principal, getprinc Get principal\n" +
"list_principals, listprincs, get_principals, getprincs\n" +
" List principals\n" +
"add_policy, addpol Add policy\n" +
"modify_policy, modpol Modify policy\n" +
"delete_policy, delpol Delete policy\n" +
"get_policy, getpol Get policy\n" +
"list_policies, listpols, get_policies, getpols\n" +
" List policies\n" +
"get_privs, getprivs Get privileges\n" +
"ktadd, xst Add entry(s) to a keytab\n" +
"ktremove, ktrem Remove entry(s) from a keytab\n" +
"lock Lock database exclusively (use with extreme caution!)\n" +
"unlock Release exclusive database lock\n" +
"purgekeys Purge previously retained old keys from a principal\n" +
"get_strings, getstrs Show string attributes on a principal\n" +
"set_string, setstr Set a string attribute on a principal\n" +
"del_string, delstr Delete a string attribute on a principal\n" +
"list_requests, lr, ? List available requests.\n" +
"quit, exit, q Exit program.";
private static KdcConfig kdcConfig;
private static Conf backendConfig;
private static void execute(String command) {
//omit the leading and trailing whitespace.
command = command.trim();
if (command.equals("list_requests") ||
command.equals("lr") ||
command.equals("?")) {
System.out.println(REQUEST_LIST);
return;
}
KadminCommandExecutor executor = null;
if (command.startsWith("add_principal") ||
command.startsWith("addprinc") ||
command.startsWith("ank")) {
executor = new AddPrincipalExecutor(kdcConfig, backendConfig);
} else if (command.startsWith("ktadd") ||
command.startsWith("xst")) {
executor = new KeytabAddExecutor(backendConfig);
} else if (command.startsWith("delete_principal") ||
command.startsWith("delprinc")) {
executor = new DeletePrincipalExecutor(backendConfig);
} else if (command.startsWith("modify_principal") ||
command.startsWith("modprinc")) {
executor = new ModifyPrincipalExecutor(kdcConfig, backendConfig);
} else if (command.startsWith("rename_principal") ||
command.startsWith("renprinc")) {
executor = new RenamePrincipalExecutor(backendConfig);
} else if (command.startsWith("get_principal") || command.startsWith("getprinc") ||
command.startsWith("Get principal")) {
executor = new GetPrincipalExcutor(backendConfig);
} else if (command.startsWith("list_principals") ||
command.startsWith("listprincs") || command.startsWith("get_principals") ||
command.startsWith("getprincs") || command.startsWith("List principals")) {
executor = new ListPrincipalExcutor(backendConfig);
}
if (executor == null) {
System.out.println("Unknown request \"" + command + "\". Type \"?\" for a request list.");
return;
}
executor.execute(command);
}
private static void initConfig(String[] args) {
File confDir;
if (args.length == 0) {
String envDir;
try {
Map<String, String> mapEnv = System.getenv();
envDir = mapEnv.get("KRB5_KDC_DIR");
} catch (SecurityException e) {
envDir = null;
}
if(envDir != null) {
confDir = new File(envDir);
} else {
confDir = new File("/etc/kerby/");// for Linux. TODO: fix for Win etc.
}
} else {
confDir = new File(args[0]);
}
if (confDir.exists()) {
File kdcConfFile = new File(confDir, "kdc.conf");
if (kdcConfFile.exists()) {
kdcConfig = new KdcConfig();
try {
kdcConfig.addIniConfig(kdcConfFile);
} catch (IOException e) {
System.err.println("Can not load the kdc configuration file " + kdcConfFile.getAbsolutePath());
e.printStackTrace();
}
}
File backendConfigFile = new File(confDir, "backend.conf");
if (backendConfigFile.exists()) {
backendConfig = new Conf();
try {
backendConfig.addIniConfig(backendConfigFile);
} catch (IOException e) {
System.err.println("Can not load the backend configuration file " + backendConfigFile.getAbsolutePath());
e.printStackTrace();
}
}
} else {
throw new RuntimeException("Can not find configuration directory");
}
}
public static void main(String[] args) {
initConfig(args);
System.out.print(PROMPT + ": ");
try (Scanner scanner = new Scanner(System.in)) {
String input = scanner.nextLine();
while (!(input.equals("quit") ||
input.equals("exit") ||
input.equals("q"))) {
execute(input);
System.out.print(PROMPT + ": ");
input = scanner.nextLine();
}
}
}
}