/**
 *  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;

import org.apache.kerby.asn1.EnumType;

public enum KrbErrorCode implements EnumType {
    KDC_ERR_NONE(0, "No error"),
    KDC_ERR_NAME_EXP(1, "Client's entry in database has expired"),
    KDC_ERR_SERVICE_EXP(2, "Server's entry in database has expired"),
    KDC_ERR_BAD_PVNO(3, "Requested protocol version number not supported"),
    KDC_ERR_C_OLD_MAST_KVNO(4, "Client's key encrypted in old master key"),
    KDC_ERR_S_OLD_MAST_KVNO(5, "Server's key encrypted in old master key"),
    KDC_ERR_C_PRINCIPAL_UNKNOWN(6, "Client not found in Kerberos database"),
    KDC_ERR_S_PRINCIPAL_UNKNOWN(7, "Server not found in Kerberos database"),
    KDC_ERR_PRINCIPAL_NOT_UNIQUE(8, "Multiple principal entries in database"),
    KDC_ERR_NULL_KEY(9, "The client or server has a null key"),
    KDC_ERR_CANNOT_POSTDATE(10, "Ticket not eligible for postdating"),
    KDC_ERR_NEVER_VALID(11, "Requested start time is later than end time"),
    KDC_ERR_POLICY(12, "KDC policy rejects request"),
    KDC_ERR_BADOPTION(13, "KDC cannot accommodate requested option"),
    KDC_ERR_ETYPE_NOSUPP(14, "KDC has no support for encryption type"),
    KDC_ERR_SUMTYPE_NOSUPP(15, "KDC has no support for checksum type"),
    KDC_ERR_PADATA_TYPE_NOSUPP(16, "KDC has no support for padata type"),
    KDC_ERR_TRTYPE_NOSUPP(17, "KDC has no support for transited type"),
    KDC_ERR_CLIENT_REVOKED(18, "Clients credentials have been revoked"),
    KDC_ERR_SERVICE_REVOKED(19, "Credentials for server have been revoked"),
    KDC_ERR_TGT_REVOKED(20, "TGT has been revoked"),
    KDC_ERR_CLIENT_NOTYET(21, "Client not yet valid; try again later"),
    KDC_ERR_SERVICE_NOTYET(22, "Server not yet valid; try again later"),
    KDC_ERR_KEY_EXPIRED(23, "Password has expired; change password to reset"),
    KDC_ERR_PREAUTH_FAILED(24, "Pre-authentication information was invalid"),
    KDC_ERR_PREAUTH_REQUIRED(25, "Additional pre-authentication required"),
    KDC_ERR_SERVER_NOMATCH(26, "Requested server and ticket don't match"),
    KDC_ERR_MUST_USE_USER2USER(27, "Server valid for user2user only"),
    KDC_ERR_PATH_NOT_ACCEPTED(28, "KDC Policy rejects transited path"),
    KDC_ERR_SVC_UNAVAILABLE(29, "A service is not available"),
    KRB_AP_ERR_BAD_INTEGRITY(31, "Integrity check on decrypted field failed"),
    KRB_AP_ERR_TKT_EXPIRED(32, "Ticket expired"),
    KRB_AP_ERR_TKT_NYV(33, "Ticket not yet valid"),
    KRB_AP_ERR_REPEAT(34, "Request is a replay"),
    KRB_AP_ERR_NOT_US(35, "The ticket isn't for us"),
    KRB_AP_ERR_BADMATCH(36, "Ticket and authenticator don't match"),
    KRB_AP_ERR_SKEW(37, "Clock skew too great"),
    KRB_AP_ERR_BADADDR(38, "Incorrect net address"),
    KRB_AP_ERR_BADVERSION(39, "Protocol version mismatch"),
    KRB_AP_ERR_MSG_TYPE(40, "Invalid msg type"),
    KRB_AP_ERR_MODIFIED(41, "Message stream modified"),
    KRB_AP_ERR_BADORDER(42, "Message out of order"),
    KRB_AP_ERR_BADKEYVER(44, "Specified version of key is not available"),
    KRB_AP_ERR_NOKEY(45, "Service key not available"),
    KRB_AP_ERR_MUT_FAIL(46, "Mutual authentication failed"),
    KRB_AP_ERR_BADDIRECTION(47, "Incorrect message direction"),
    KRB_AP_ERR_METHOD(48, "Alternative authentication method required"),
    KRB_AP_ERR_BADSEQ(49, "Incorrect sequence number in message"),
    KRB_AP_ERR_INAPP_CKSUM(50, "Inappropriate type of checksum in message"),
    KRB_AP_PATH_NOT_ACCEPTED(51, "Policy rejects transited path"),
    RESPONSE_TOO_BIG(52, "Response too big for UDP; retry with TCP"),
    KRB_ERR_GENERIC(60, "Generic error (description in e-text)"),
    FIELD_TOOLONG(61, "Field is too long for this implementation"),
    KDC_ERR_CLIENT_NOT_TRUSTED(62, "Client is not trusted"),
    KDC_NOT_TRUSTED(63, "KDC is not trusted"),
    KDC_ERR_INVALID_SIG(64, "Signature is invalid"),
    KDC_ERR_DH_KEY_PARAMETERS_NOT_ACCEPTED(65, "Diffie-Hellman (DH) key parameters not accepted."),
    CERTIFICATE_MISMATCH(66, "Certificates do not match"),
    KRB_AP_ERR_NO_TGT(67, "No TGT available to validate USER-TO-USER"),
    WRONG_REALM(68, "Wrong realm"),
    KRB_AP_ERR_USER_TO_USER_REQUIRED(69, "Ticket must be for USER-TO-USER"),
    KDC_ERR_CANT_VERIFY_CERTIFICATE(70, "Can't verify certificate"),
    KDC_ERR_INVALID_CERTIFICATE(71, "Invalid certificate"),
    KDC_ERR_REVOKED_CERTIFICATE(72, "Revoked certificate"),
    KDC_ERR_REVOCATION_STATUS_UNKNOWN(73, "Revocation status unknown"),
    REVOCATION_STATUS_UNAVAILABLE(74, "Revocation status unavailable"),
    KDC_ERR_CLIENT_NAME_MISMATCH(75, "Client names do not match"),
    KDC_NAME_MISMATCH(76, "KDC names do not match"),
    KDC_ERR_INCONSISTENT_KEY_PURPOSE(77, "Inconsistent key purpose"),
    KDC_ERR_DIGEST_IN_CERT_NOT_ACCEPTED(78, "Digest in certificate not accepted"),
    KDC_ERR_PA_CHECKSUM_MUST_BE_INCLUDED(79, "PA checksum must be included"),
    KDC_ERR_DIGEST_IN_SIGNED_DATA_NOT_ACCEPTED(80, "Digest in signed data not accepted"),
    KDC_ERR_PUBLIC_KEY_ENCRYPTION_NOT_SUPPORTED(81, "Public key encryption not supported"),
    KRB_AP_ERR_PRINCIPAL_UNKNOWN(82, "A well-known Kerberos principal name is used but not supported"),
    TOKEN_PREAUTH_NOT_ALLOWED(83, "Token preauth is not allowed"),

    KRB_TIMEOUT(5000, "Network timeout"),
    UNKNOWN_ERR(5001, "Unknown error");

    private final int value;
    private final String message;

    KrbErrorCode(int value, String message) {
        this.value = value;
        this.message = message;
    }

    public static KrbErrorCode fromValue(Integer value) {
        if (value != null) {
            for (EnumType e : values()) {
                if (e.getValue() == value.intValue()) {
                    return (KrbErrorCode) e;
                }
            }
        }

        return KRB_ERR_GENERIC;
    }

    public int getValue() {
        return value;
    }

    @Override
    public String getName() {
        return name();
    }

    public String getMessage() {
        return message;
    }
}
