/**
 *  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.kerb.admin.kadmin;

import org.apache.kerby.KOptions;
import org.apache.kerby.kerberos.kerb.KrbException;

import java.io.File;
import java.util.List;

/**
 * Server side admin facilities from remote, similar to MIT kadmin remote mode.
 */
public interface Kadmin {

    /**
     * Get the kadmin principal name.
     *
     * @return The kadmin principal name.
     */
    String getKadminPrincipal();

    /**
     * Add principal to backend.
     *
     * @param principal The principal to be added into backend
     * @throws KrbException e
     */
    void addPrincipal(String principal) throws KrbException;

    /**
     * Add principal to backend.
     *
     * @param principal The principal to be added into backend
     * @param kOptions The KOptions with principal info
     * @throws KrbException e
     */
    void addPrincipal(String principal, KOptions kOptions) throws KrbException;

    /**
     * Add principal to backend.
     *
     * @param principal The principal to be added into backend
     * @param password  The password to create encryption key
     * @throws KrbException e
     */
    void addPrincipal(String principal, String password) throws KrbException;

    /**
     * Add principal to backend.
     *
     * @param principal The principal to be added into backend
     * @param password  The password to create encryption key
     * @param kOptions  The KOptions with principal info
     * @throws KrbException e
     */
    void addPrincipal(String principal, String password,
                      KOptions kOptions) throws KrbException;

    /**
     * Export all the keys of the specified principal into the specified keytab
     * file.
     *
     * @param keytabFile The keytab file
     * @param principal The principal name
     * @throws KrbException e
     */
    void exportKeytab(File keytabFile, String principal) throws KrbException;

    /**
     * Export all the keys of the specified principals into the specified keytab
     * file.
     *
     * @param keytabFile The keytab file
     * @param principals The principal names
     * @throws KrbException e
     */
    void exportKeytab(File keytabFile,
                      List<String> principals) throws KrbException;

    /**
     * Export all identity keys to the specified keytab file.
     *
     * @param keytabFile The keytab file
     * @throws KrbException e
     */
    void exportKeytab(File keytabFile) throws KrbException;

    /**
     * Remove all the keys of the specified principal in the specified keytab
     * file.
     *
     * @param keytabFile The keytab file
     * @param principal The principal name
     * @throws KrbException e
     */
    void removeKeytabEntriesOf(File keytabFile, String principal)
            throws KrbException;

    /**
     * Remove all the keys of the specified principal with specified kvno
     * in the specified keytab file.
     *
     * @param keytabFile The keytab file
     * @param principal The principal name
     * @param kvno The kvno
     * @throws KrbException e
     */
    void removeKeytabEntriesOf(File keytabFile, String principal, int kvno)
            throws KrbException;

    /**
     * Remove all the old keys of the specified principal
     * in the specified keytab file.
     *
     * @param keytabFile The keytab file
     * @param principal The principal name
     * @throws KrbException e
     */
    void removeOldKeytabEntriesOf(File keytabFile, String principal)
            throws KrbException;

    /**
     * Delete the principal in backend.
     *
     * @param principal The principal to be deleted from backend
     * @throws KrbException e
     */
    void deletePrincipal(String principal) throws KrbException;

    /**
     * Modify the principal with KOptions.
     *
     * @param principal The principal to be modified
     * @param kOptions The KOptions with changed principal info
     * @throws KrbException e
     */
    void modifyPrincipal(String principal, KOptions kOptions) throws KrbException;

    /**
     * Rename the principal.
     *
     * @param oldPrincipalName The original principal name
     * @param newPrincipalName The new principal name
     * @throws KrbException e
     */
    void renamePrincipal(String oldPrincipalName,
                         String newPrincipalName) throws KrbException;

    /**
     * Get all the principal names from backend.
     *
     * @return principal list
     * @throws KrbException e
     */
    List<String> getPrincipals() throws KrbException;

    /**
     * Get all the principal names that meets the pattern
     *
     * @param globString The glob string for matching
     * @return Principal names
     * @throws KrbException e
     */
    List<String> getPrincipals(String globString) throws KrbException;

    /**
     * Change the password of specified principal.
     *
     * @param principal The principal to be updated password
     * @param newPassword The new password
     * @throws KrbException e
     */
    void changePassword(String principal, String newPassword) throws KrbException;

    /**
     * Update the random keys of specified principal.
     *
     * @param principal The principal to be updated keys
     * @throws KrbException e
     */
    void updateKeys(String principal) throws KrbException;

    /**
     * Release any resources associated.
     *
     * @throws KrbException e
     */
    void release() throws KrbException;
}
