package client

import (
	

	
	
)

// Kpasswd server response codes.
const (
	KRB5_KPASSWD_SUCCESS             = 0
	KRB5_KPASSWD_MALFORMED           = 1
	KRB5_KPASSWD_HARDERROR           = 2
	KRB5_KPASSWD_AUTHERROR           = 3
	KRB5_KPASSWD_SOFTERROR           = 4
	KRB5_KPASSWD_ACCESSDENIED        = 5
	KRB5_KPASSWD_BAD_VERSION         = 6
	KRB5_KPASSWD_INITIAL_FLAG_NEEDED = 7
)

// ChangePasswd changes the password of the client to the value provided.
func ( *Client) ( string) (bool, error) {
	,  := messages.NewASReqForChgPasswd(.Credentials.Domain(), .Config, .Credentials.CName())
	if  != nil {
		return false, 
	}
	,  := .ASExchange(.Credentials.Domain(), , 0)
	if  != nil {
		return false, 
	}

	, ,  := kadmin.ChangePasswdMsg(.Credentials.CName(), .Credentials.Domain(), , .Ticket, .DecryptedEncPart.Key)
	if  != nil {
		return false, 
	}
	,  := .sendToKPasswd()
	if  != nil {
		return false, 
	}
	 = .Decrypt()
	if  != nil {
		return false, 
	}
	if .ResultCode != KRB5_KPASSWD_SUCCESS {
		return false, fmt.Errorf("error response from kadmin: code: %d; result: %s; krberror: %v", .ResultCode, .Result, .KRBError)
	}
	.Credentials.WithPassword()
	return true, nil
}

func ( *Client) ( kadmin.Request) ( kadmin.Reply,  error) {
	, ,  := .Config.GetKpasswdServers(.Credentials.Domain(), true)
	if  != nil {
		return
	}
	,  := .Marshal()
	if  != nil {
		return
	}
	var  []byte
	if len() <= .Config.LibDefaults.UDPPreferenceLimit {
		,  = dialSendUDP(, )
		if  != nil {
			return
		}
	} else {
		,  = dialSendTCP(, )
		if  != nil {
			return
		}
	}
	 = .Unmarshal()
	return
}