Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions v3/extended.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,14 @@ func (l *Conn) Extended(er *ExtendedRequest) (*ExtendedResponse, error) {
}

for _, child := range extResp.Children {
// responseName [10] and responseValue [11] are context-class and
// optional. The preceding resultCode is a universal ENUMERATED whose
// tag number (10) is the same as responseName, so a child must be
// matched on its class as well, otherwise the resultCode is read as
// the responseName whenever the server omits the latter.
if child.ClassType != ber.ClassContext {
continue
}
switch child.Tag {
case ber.TagEnumerated:
response.Name = child.Data.String()
Expand Down
37 changes: 37 additions & 0 deletions v3/extended_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import (
"testing"

ber "github.com/go-asn1-ber/asn1-ber"
"github.com/stretchr/testify/assert"
)

Expand Down Expand Up @@ -35,6 +36,42 @@
t.Logf("%#v\n", rfc4532resp)
}

// TestExtendedResponseNameOmitted feeds a successful ExtendedResponse that
// carries a responseValue but no responseName. The resultCode is a universal
// ENUMERATED whose tag number matches responseName [10]; decoding must not
// report the result code as the name.
func TestExtendedResponseNameOmitted(t *testing.T) {
ptc := newPacketTranslatorConn()
defer ptc.Close()

Check failure on line 45 in v3/extended_test.go

View workflow job for this annotation

GitHub Actions / lint

Error return value of `ptc.Close` is not checked (errcheck)

conn := NewConn(ptc, false)
conn.Start()
defer conn.Close()

Check failure on line 49 in v3/extended_test.go

View workflow job for this annotation

GitHub Actions / lint

Error return value of `conn.Close` is not checked (errcheck)

go func() {
req, err := ptc.ReceiveRequest()
if err != nil {
return
}
msgID := req.Children[0].Value.(int64)

resp := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "LDAP Response")
resp.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, msgID, "MessageID"))
extResp := ber.Encode(ber.ClassApplication, ber.TypeConstructed, ApplicationExtendedResponse, nil, "Extended Response")
extResp.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagEnumerated, 0, "resultCode"))
extResp.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, "", "matchedDN"))
extResp.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, "", "diagnosticMessage"))
extResp.AppendChild(ber.NewString(ber.ClassContext, ber.TypePrimitive, ber.TagEmbeddedPDV, "payload", "responseValue"))
resp.AppendChild(extResp)
_ = ptc.SendResponse(resp)
}()

result, err := conn.Extended(NewExtendedRequest("1.2.3.4", nil))
assert.NoError(t, err)
assert.Equal(t, "", result.Name)
assert.NotNil(t, result.Value)
}

func TestExtendedRequest_FastBind(t *testing.T) {
conn, err := DialURL(ldapServer)
if err != nil {
Expand Down
Loading