forked from Deuxfleurs/bottin
94 lines
2.9 KiB
Go
94 lines
2.9 KiB
Go
|
package message
|
||
|
|
||
|
import "fmt"
|
||
|
|
||
|
// BindRequest ::= [APPLICATION 0] SEQUENCE {
|
||
|
// version INTEGER (1 .. 127),
|
||
|
// name LDAPDN,
|
||
|
// authentication AuthenticationChoice }
|
||
|
|
||
|
func (request *BindRequest) Name() LDAPDN {
|
||
|
return request.name
|
||
|
}
|
||
|
|
||
|
func (request *BindRequest) Authentication() AuthenticationChoice {
|
||
|
return request.authentication
|
||
|
}
|
||
|
|
||
|
func (request *BindRequest) AuthenticationSimple() OCTETSTRING {
|
||
|
return request.Authentication().(OCTETSTRING)
|
||
|
}
|
||
|
|
||
|
func (request *BindRequest) AuthenticationChoice() string {
|
||
|
switch request.Authentication().(type) {
|
||
|
case OCTETSTRING:
|
||
|
return "simple"
|
||
|
case SaslCredentials:
|
||
|
return "sasl"
|
||
|
}
|
||
|
return ""
|
||
|
}
|
||
|
|
||
|
func readBindRequest(bytes *Bytes) (bindrequest BindRequest, err error) {
|
||
|
err = bytes.ReadSubBytes(classApplication, TagBindRequest, bindrequest.readComponents)
|
||
|
if err != nil {
|
||
|
err = LdapError{fmt.Sprintf("readBindRequest:\n%s", err.Error())}
|
||
|
return
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func (request *BindRequest) readComponents(bytes *Bytes) (err error) {
|
||
|
request.version, err = readINTEGER(bytes)
|
||
|
if err != nil {
|
||
|
err = LdapError{fmt.Sprintf("readComponents:\n%s", err.Error())}
|
||
|
return
|
||
|
}
|
||
|
if !(request.version >= BindRequestVersionMin && request.version <= BindRequestVersionMax) {
|
||
|
err = LdapError{fmt.Sprintf("readComponents: invalid version %d, must be between %d and %d", request.version, BindRequestVersionMin, BindRequestVersionMax)}
|
||
|
return
|
||
|
}
|
||
|
request.name, err = readLDAPDN(bytes)
|
||
|
if err != nil {
|
||
|
err = LdapError{fmt.Sprintf("readComponents:\n%s", err.Error())}
|
||
|
return
|
||
|
}
|
||
|
request.authentication, err = readAuthenticationChoice(bytes)
|
||
|
if err != nil {
|
||
|
err = LdapError{fmt.Sprintf("readComponents:\n%s", err.Error())}
|
||
|
return
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func (request BindRequest) write(bytes *Bytes) (size int) {
|
||
|
switch request.authentication.(type) {
|
||
|
case OCTETSTRING:
|
||
|
size += request.authentication.(OCTETSTRING).writeTagged(bytes, classContextSpecific, TagAuthenticationChoiceSimple)
|
||
|
case SaslCredentials:
|
||
|
size += request.authentication.(SaslCredentials).writeTagged(bytes, classContextSpecific, TagAuthenticationChoiceSaslCredentials)
|
||
|
default:
|
||
|
panic(fmt.Sprintf("Unknown authentication choice: %#v", request.authentication))
|
||
|
}
|
||
|
size += request.name.write(bytes)
|
||
|
size += request.version.write(bytes)
|
||
|
size += bytes.WriteTagAndLength(classApplication, isCompound, TagBindRequest, size)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func (request BindRequest) size() (size int) {
|
||
|
size += request.version.size()
|
||
|
size += request.name.size()
|
||
|
switch request.authentication.(type) {
|
||
|
case OCTETSTRING:
|
||
|
size += request.authentication.(OCTETSTRING).sizeTagged(TagAuthenticationChoiceSimple)
|
||
|
case SaslCredentials:
|
||
|
size += request.authentication.(SaslCredentials).sizeTagged(TagAuthenticationChoiceSaslCredentials)
|
||
|
default:
|
||
|
panic(fmt.Sprintf("Unknown authentication choice: %#v", request.authentication))
|
||
|
}
|
||
|
|
||
|
size += sizeTagAndLength(TagBindRequest, size)
|
||
|
return
|
||
|
}
|