Skip to content

Commit 2de97af

Browse files
make Modify method return result and err
1 parent 9f0d712 commit 2de97af

File tree

3 files changed

+31
-14
lines changed

3 files changed

+31
-14
lines changed

client.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ type Client interface {
1717

1818
Add(addRequest *AddRequest) error
1919
Del(delRequest *DelRequest) error
20-
Modify(modifyRequest *ModifyRequest) error
20+
Modify(modifyRequest *ModifyRequest) (*ModifyResult, error)
2121
ModifyDN(modifyDNRequest *ModifyDNRequest) error
2222

2323
Compare(dn, attribute, value string) (bool, error)

example_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ func ExampleConn_Modify() {
154154
modify.Add("description", []string{"An example user"})
155155
modify.Replace("mail", []string{"[email protected]"})
156156

157-
err = l.Modify(modify)
157+
_, err = l.Modify(modify)
158158
if err != nil {
159159
log.Fatal(err)
160160
}

modify.go

+29-12
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ package ldap
2727

2828
import (
2929
"errors"
30-
"log"
30+
"fmt"
3131

3232
"gopkg.in/asn1-ber.v1"
3333
)
@@ -47,6 +47,12 @@ type PartialAttribute struct {
4747
Vals []string
4848
}
4949

50+
// ModifyResult holds the server's response to a modify request
51+
type ModifyResult struct {
52+
// Controls are the returned controls
53+
Controls []Control
54+
}
55+
5056
func (p *PartialAttribute) encode() *ber.Packet {
5157
seq := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "PartialAttribute")
5258
seq.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, p.Type, "Type"))
@@ -125,7 +131,7 @@ func NewModifyRequest(
125131
}
126132

127133
// Modify performs the ModifyRequest
128-
func (l *Conn) Modify(modifyRequest *ModifyRequest) error {
134+
func (l *Conn) Modify(modifyRequest *ModifyRequest) (*ModifyResult, error) {
129135
packet := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "LDAP Request")
130136
packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, l.nextMessageID(), "MessageID"))
131137
packet.AppendChild(modifyRequest.encode())
@@ -137,37 +143,48 @@ func (l *Conn) Modify(modifyRequest *ModifyRequest) error {
137143

138144
msgCtx, err := l.sendMessage(packet)
139145
if err != nil {
140-
return err
146+
return nil, err
141147
}
142148
defer l.finishMessage(msgCtx)
143149

150+
result := &ModifyResult{
151+
Controls: make([]Control, 0),
152+
}
153+
144154
l.Debug.Printf("%d: waiting for response", msgCtx.id)
145155
packetResponse, ok := <-msgCtx.responses
146156
if !ok {
147-
return NewError(ErrorNetwork, errors.New("ldap: response channel closed"))
157+
return nil, NewError(ErrorNetwork, errors.New("ldap: response channel closed"))
148158
}
149159
packet, err = packetResponse.ReadPacket()
150160
l.Debug.Printf("%d: got response %p", msgCtx.id, packet)
151161
if err != nil {
152-
return err
162+
return nil, err
153163
}
154164

155165
if l.Debug {
156166
if err := addLDAPDescriptions(packet); err != nil {
157-
return err
167+
return nil, err
158168
}
159169
ber.PrintPacket(packet)
160170
}
161171

162-
if packet.Children[1].Tag == ApplicationModifyResponse {
172+
switch packet.Children[1].Tag {
173+
case ApplicationModifyResponse:
163174
err := GetLDAPError(packet)
164175
if err != nil {
165-
return err
176+
return nil, err
177+
}
178+
if len(packet.Children) == 3 {
179+
for _, child := range packet.Children[2].Children {
180+
decodedChild, err := DecodeControl(child)
181+
if err != nil {
182+
return nil, fmt.Errorf("failed to decode child control: %s", err)
183+
}
184+
result.Controls = append(result.Controls, decodedChild)
185+
}
166186
}
167-
} else {
168-
log.Printf("Unexpected Response: %d", packet.Children[1].Tag)
169187
}
170-
171188
l.Debug.Printf("%d: returning", msgCtx.id)
172-
return nil
189+
return result, nil
173190
}

0 commit comments

Comments
 (0)