282 lines
11 KiB
Go
282 lines
11 KiB
Go
package message
|
|
|
|
import "fmt"
|
|
|
|
//
|
|
// LDAPResult ::= SEQUENCE {
|
|
// resultCode ENUMERATED {
|
|
// success (0),
|
|
// operationsError (1),
|
|
// protocolError (2),
|
|
// timeLimitExceeded (3),
|
|
// sizeLimitExceeded (4),
|
|
// compareFalse (5),
|
|
// compareTrue (6),
|
|
// authMethodNotSupported (7),
|
|
// strongerAuthRequired (8),
|
|
// -- 9 reserved --
|
|
// referral (10),
|
|
// adminLimitExceeded (11),
|
|
// unavailableCriticalExtension (12),
|
|
// confidentialityRequired (13),
|
|
// saslBindInProgress (14),
|
|
//
|
|
//
|
|
//
|
|
//Sermersheim Standards Track [Page 55]
|
|
//
|
|
//
|
|
//RFC 4511 LDAPv3 June 2006
|
|
//
|
|
//
|
|
// noSuchAttribute (16),
|
|
// undefinedAttributeType (17),
|
|
// inappropriateMatching (18),
|
|
// constraintViolation (19),
|
|
// attributeOrValueExists (20),
|
|
// invalidAttributeSyntax (21),
|
|
// -- 22-31 unused --
|
|
// noSuchObject (32),
|
|
// aliasProblem (33),
|
|
// invalidDNSyntax (34),
|
|
// -- 35 reserved for undefined isLeaf --
|
|
// aliasDereferencingProblem (36),
|
|
// -- 37-47 unused --
|
|
// inappropriateAuthentication (48),
|
|
// invalidCredentials (49),
|
|
// insufficientAccessRights (50),
|
|
// busy (51),
|
|
// unavailable (52),
|
|
// unwillingToPerform (53),
|
|
// loopDetect (54),
|
|
// -- 55-63 unused --
|
|
// namingViolation (64),
|
|
// objectClassViolation (65),
|
|
// notAllowedOnNonLeaf (66),
|
|
// notAllowedOnRDN (67),
|
|
// entryAlreadyExists (68),
|
|
// objectClassModsProhibited (69),
|
|
// -- 70 reserved for CLDAP --
|
|
// affectsMultipleDSAs (71),
|
|
// -- 72-79 unused --
|
|
// other (80),
|
|
// ... },
|
|
// matchedDN LDAPDN,
|
|
// diagnosticMessage LDAPString,
|
|
// referral [3] Referral OPTIONAL }
|
|
func readTaggedLDAPResult(bytes *Bytes, class int, tag int) (ret LDAPResult, err error) {
|
|
err = bytes.ReadSubBytes(class, tag, ret.readComponents)
|
|
if err != nil {
|
|
err = LdapError{fmt.Sprintf("readTaggedLDAPResult:\n%s", err.Error())}
|
|
}
|
|
return
|
|
}
|
|
func readLDAPResult(bytes *Bytes) (ldapresult LDAPResult, err error) {
|
|
return readTaggedLDAPResult(bytes, classUniversal, tagSequence)
|
|
}
|
|
func (ldapresult *LDAPResult) readComponents(bytes *Bytes) (err error) {
|
|
ldapresult.resultCode, err = readENUMERATED(bytes, EnumeratedLDAPResultCode)
|
|
if err != nil {
|
|
err = LdapError{fmt.Sprintf("readComponents:\n%s", err.Error())}
|
|
return
|
|
}
|
|
ldapresult.matchedDN, err = readLDAPDN(bytes)
|
|
if err != nil {
|
|
err = LdapError{fmt.Sprintf("readComponents:\n%s", err.Error())}
|
|
return
|
|
}
|
|
ldapresult.diagnosticMessage, err = readLDAPString(bytes)
|
|
if err != nil {
|
|
err = LdapError{fmt.Sprintf("readComponents:\n%s", err.Error())}
|
|
return
|
|
}
|
|
if bytes.HasMoreData() {
|
|
var tag TagAndLength
|
|
tag, err = bytes.PreviewTagAndLength()
|
|
if err != nil {
|
|
err = LdapError{fmt.Sprintf("readComponents:\n%s", err.Error())}
|
|
return
|
|
}
|
|
if tag.Tag == TagLDAPResultReferral {
|
|
var referral Referral
|
|
referral, err = readTaggedReferral(bytes, classContextSpecific, TagLDAPResultReferral)
|
|
if err != nil {
|
|
err = LdapError{fmt.Sprintf("readComponents:\n%s", err.Error())}
|
|
return
|
|
}
|
|
ldapresult.referral = referral.Pointer()
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
//
|
|
// LDAPResult ::= SEQUENCE {
|
|
// resultCode ENUMERATED {
|
|
// success (0),
|
|
// operationsError (1),
|
|
// protocolError (2),
|
|
// timeLimitExceeded (3),
|
|
// sizeLimitExceeded (4),
|
|
// compareFalse (5),
|
|
// compareTrue (6),
|
|
// authMethodNotSupported (7),
|
|
// strongerAuthRequired (8),
|
|
// -- 9 reserved --
|
|
// referral (10),
|
|
// adminLimitExceeded (11),
|
|
// unavailableCriticalExtension (12),
|
|
// confidentialityRequired (13),
|
|
// saslBindInProgress (14),
|
|
//
|
|
//
|
|
//
|
|
//Sermersheim Standards Track [Page 55]
|
|
//
|
|
//
|
|
//RFC 4511 LDAPv3 June 2006
|
|
//
|
|
//
|
|
// noSuchAttribute (16),
|
|
// undefinedAttributeType (17),
|
|
// inappropriateMatching (18),
|
|
// constraintViolation (19),
|
|
// attributeOrValueExists (20),
|
|
// invalidAttributeSyntax (21),
|
|
// -- 22-31 unused --
|
|
// noSuchObject (32),
|
|
// aliasProblem (33),
|
|
// invalidDNSyntax (34),
|
|
// -- 35 reserved for undefined isLeaf --
|
|
// aliasDereferencingProblem (36),
|
|
// -- 37-47 unused --
|
|
// inappropriateAuthentication (48),
|
|
// invalidCredentials (49),
|
|
// insufficientAccessRights (50),
|
|
// busy (51),
|
|
// unavailable (52),
|
|
// unwillingToPerform (53),
|
|
// loopDetect (54),
|
|
// -- 55-63 unused --
|
|
// namingViolation (64),
|
|
// objectClassViolation (65),
|
|
// notAllowedOnNonLeaf (66),
|
|
// notAllowedOnRDN (67),
|
|
// entryAlreadyExists (68),
|
|
// objectClassModsProhibited (69),
|
|
// -- 70 reserved for CLDAP --
|
|
// affectsMultipleDSAs (71),
|
|
// -- 72-79 unused --
|
|
// other (80),
|
|
// ... },
|
|
// matchedDN LDAPDN,
|
|
// diagnosticMessage LDAPString,
|
|
// referral [3] Referral OPTIONAL }
|
|
func (l LDAPResult) write(bytes *Bytes) (size int) {
|
|
size += l.writeComponents(bytes)
|
|
size += bytes.WriteTagAndLength(classUniversal, isCompound, tagSequence, size)
|
|
return
|
|
}
|
|
func (l LDAPResult) writeComponents(bytes *Bytes) (size int) {
|
|
if l.referral != nil {
|
|
size += l.referral.writeTagged(bytes, classContextSpecific, TagLDAPResultReferral)
|
|
}
|
|
size += l.diagnosticMessage.write(bytes)
|
|
size += l.matchedDN.write(bytes)
|
|
size += l.resultCode.write(bytes)
|
|
return
|
|
}
|
|
|
|
//
|
|
// LDAPResult ::= SEQUENCE {
|
|
// resultCode ENUMERATED {
|
|
// success (0),
|
|
// operationsError (1),
|
|
// protocolError (2),
|
|
// timeLimitExceeded (3),
|
|
// sizeLimitExceeded (4),
|
|
// compareFalse (5),
|
|
// compareTrue (6),
|
|
// authMethodNotSupported (7),
|
|
// strongerAuthRequired (8),
|
|
// -- 9 reserved --
|
|
// referral (10),
|
|
// adminLimitExceeded (11),
|
|
// unavailableCriticalExtension (12),
|
|
// confidentialityRequired (13),
|
|
// saslBindInProgress (14),
|
|
//
|
|
//
|
|
//
|
|
//Sermersheim Standards Track [Page 55]
|
|
//
|
|
//
|
|
//RFC 4511 LDAPv3 June 2006
|
|
//
|
|
//
|
|
// noSuchAttribute (16),
|
|
// undefinedAttributeType (17),
|
|
// inappropriateMatching (18),
|
|
// constraintViolation (19),
|
|
// attributeOrValueExists (20),
|
|
// invalidAttributeSyntax (21),
|
|
// -- 22-31 unused --
|
|
// noSuchObject (32),
|
|
// aliasProblem (33),
|
|
// invalidDNSyntax (34),
|
|
// -- 35 reserved for undefined isLeaf --
|
|
// aliasDereferencingProblem (36),
|
|
// -- 37-47 unused --
|
|
// inappropriateAuthentication (48),
|
|
// invalidCredentials (49),
|
|
// insufficientAccessRights (50),
|
|
// busy (51),
|
|
// unavailable (52),
|
|
// unwillingToPerform (53),
|
|
// loopDetect (54),
|
|
// -- 55-63 unused --
|
|
// namingViolation (64),
|
|
// objectClassViolation (65),
|
|
// notAllowedOnNonLeaf (66),
|
|
// notAllowedOnRDN (67),
|
|
// entryAlreadyExists (68),
|
|
// objectClassModsProhibited (69),
|
|
// -- 70 reserved for CLDAP --
|
|
// affectsMultipleDSAs (71),
|
|
// -- 72-79 unused --
|
|
// other (80),
|
|
// ... },
|
|
// matchedDN LDAPDN,
|
|
// diagnosticMessage LDAPString,
|
|
// referral [3] Referral OPTIONAL }
|
|
func (l LDAPResult) size() (size int) {
|
|
size += l.sizeComponents()
|
|
size += sizeTagAndLength(tagSequence, size)
|
|
return
|
|
}
|
|
func (l LDAPResult) sizeTagged(tag int) (size int) {
|
|
size += l.sizeComponents()
|
|
size += sizeTagAndLength(tag, size)
|
|
return
|
|
}
|
|
func (l LDAPResult) sizeComponents() (size int) {
|
|
if l.referral != nil {
|
|
size += l.referral.sizeTagged(TagLDAPResultReferral)
|
|
}
|
|
size += l.diagnosticMessage.size()
|
|
size += l.matchedDN.size()
|
|
size += l.resultCode.size()
|
|
return
|
|
}
|
|
func (l *LDAPResult) SetResultCode(code int) {
|
|
l.resultCode = ENUMERATED(code)
|
|
}
|
|
func (l *LDAPResult) SeMatchedDN(code string) {
|
|
l.matchedDN = LDAPDN(code)
|
|
}
|
|
func (l *LDAPResult) SetDiagnosticMessage(code string) {
|
|
l.diagnosticMessage = LDAPString(code)
|
|
}
|
|
func (l *LDAPResult) SetReferral(r *Referral) {
|
|
l.referral = r
|
|
}
|