mirror of
https://github.com/netauth/ldap.git
synced 2026-11-03 11:43:44 -06:00
57 lines
1.4 KiB
Go
57 lines
1.4 KiB
Go
package ldap
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/vjeantet/goldap/message"
|
|
)
|
|
|
|
// resultCode round-trips a result response through its wire encoding
|
|
// and pulls the result code back out of it. The goldap result types
|
|
// expose setters but no getters, so the encoding is the only way to
|
|
// read it back.
|
|
func resultCode(t *testing.T, po message.ProtocolOp) int {
|
|
t.Helper()
|
|
|
|
m := message.NewLDAPMessageWithProtocolOp(po)
|
|
m.SetMessageID(1)
|
|
b, err := m.Write()
|
|
if err != nil {
|
|
t.Fatalf("encoding response: %s", err)
|
|
}
|
|
raw := b.Bytes()
|
|
|
|
// Descend from the LDAPMessage SEQUENCE into the protocolOp,
|
|
// whose first element is always the resultCode for the result
|
|
// types this server sends.
|
|
var e error
|
|
off := 0
|
|
if _, off, e = message.ParseTagAndLength(raw, off); e != nil {
|
|
t.Fatalf("message tag: %s", e)
|
|
}
|
|
var id message.TagAndLength
|
|
if id, off, e = message.ParseTagAndLength(raw, off); e != nil {
|
|
t.Fatalf("messageID tag: %s", e)
|
|
}
|
|
off += id.Length
|
|
if _, off, e = message.ParseTagAndLength(raw, off); e != nil {
|
|
t.Fatalf("protocolOp tag: %s", e)
|
|
}
|
|
|
|
codeTL, off, e := message.ParseTagAndLength(raw, off)
|
|
if e != nil {
|
|
t.Fatalf("resultCode tag: %s", e)
|
|
}
|
|
if codeTL.Tag != 0x0a {
|
|
t.Fatalf("first element of the protocolOp is tag %d, want 10 (ENUMERATED)", codeTL.Tag)
|
|
}
|
|
if off+codeTL.Length > len(raw) {
|
|
t.Fatal("result code truncated")
|
|
}
|
|
code := 0
|
|
for _, b := range raw[off : off+codeTL.Length] {
|
|
code = code<<8 | int(b)
|
|
}
|
|
return code
|
|
}
|