@@ -27,7 +27,7 @@ package ldap
27
27
28
28
import (
29
29
"errors"
30
- "log "
30
+ "fmt "
31
31
32
32
"gopkg.in/asn1-ber.v1"
33
33
)
@@ -47,6 +47,12 @@ type PartialAttribute struct {
47
47
Vals []string
48
48
}
49
49
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
+
50
56
func (p * PartialAttribute ) encode () * ber.Packet {
51
57
seq := ber .Encode (ber .ClassUniversal , ber .TypeConstructed , ber .TagSequence , nil , "PartialAttribute" )
52
58
seq .AppendChild (ber .NewString (ber .ClassUniversal , ber .TypePrimitive , ber .TagOctetString , p .Type , "Type" ))
@@ -125,7 +131,7 @@ func NewModifyRequest(
125
131
}
126
132
127
133
// Modify performs the ModifyRequest
128
- func (l * Conn ) Modify (modifyRequest * ModifyRequest ) error {
134
+ func (l * Conn ) Modify (modifyRequest * ModifyRequest ) ( * ModifyResult , error ) {
129
135
packet := ber .Encode (ber .ClassUniversal , ber .TypeConstructed , ber .TagSequence , nil , "LDAP Request" )
130
136
packet .AppendChild (ber .NewInteger (ber .ClassUniversal , ber .TypePrimitive , ber .TagInteger , l .nextMessageID (), "MessageID" ))
131
137
packet .AppendChild (modifyRequest .encode ())
@@ -137,37 +143,48 @@ func (l *Conn) Modify(modifyRequest *ModifyRequest) error {
137
143
138
144
msgCtx , err := l .sendMessage (packet )
139
145
if err != nil {
140
- return err
146
+ return nil , err
141
147
}
142
148
defer l .finishMessage (msgCtx )
143
149
150
+ result := & ModifyResult {
151
+ Controls : make ([]Control , 0 ),
152
+ }
153
+
144
154
l .Debug .Printf ("%d: waiting for response" , msgCtx .id )
145
155
packetResponse , ok := <- msgCtx .responses
146
156
if ! ok {
147
- return NewError (ErrorNetwork , errors .New ("ldap: response channel closed" ))
157
+ return nil , NewError (ErrorNetwork , errors .New ("ldap: response channel closed" ))
148
158
}
149
159
packet , err = packetResponse .ReadPacket ()
150
160
l .Debug .Printf ("%d: got response %p" , msgCtx .id , packet )
151
161
if err != nil {
152
- return err
162
+ return nil , err
153
163
}
154
164
155
165
if l .Debug {
156
166
if err := addLDAPDescriptions (packet ); err != nil {
157
- return err
167
+ return nil , err
158
168
}
159
169
ber .PrintPacket (packet )
160
170
}
161
171
162
- if packet .Children [1 ].Tag == ApplicationModifyResponse {
172
+ switch packet .Children [1 ].Tag {
173
+ case ApplicationModifyResponse :
163
174
err := GetLDAPError (packet )
164
175
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
+ }
166
186
}
167
- } else {
168
- log .Printf ("Unexpected Response: %d" , packet .Children [1 ].Tag )
169
187
}
170
-
171
188
l .Debug .Printf ("%d: returning" , msgCtx .id )
172
- return nil
189
+ return result , nil
173
190
}
0 commit comments