-
Notifications
You must be signed in to change notification settings - Fork 357
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
add ModifyDN() - moddn/modrdn #54
Changes from 3 commits
54f6f7d
834049a
f0d509c
c4c4920
81dd048
5360120
8a8ccdd
e4bd062
36e991f
8ae3d79
42e38fa
ccbe116
eaa1486
9dfc2bf
9f7c832
51d69fe
9b19d60
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
// File contains ModifyDN functionality | ||
// | ||
// https://tools.ietf.org/html/rfc4511 | ||
// ModifyDNRequest ::= [APPLICATION 12] SEQUENCE { | ||
// entry LDAPDN, | ||
// newrdn RelativeLDAPDN, | ||
// deleteoldrdn BOOLEAN, | ||
// newSuperior [0] LDAPDN OPTIONAL } | ||
// | ||
// | ||
package ldap | ||
|
||
import ( | ||
"errors" | ||
"log" | ||
|
||
"gopkg.in/asn1-ber.v1" | ||
) | ||
|
||
type ModifyDNRequest struct { | ||
DN string | ||
NewRDN string | ||
DeleteOldRDN bool | ||
NewSuperior string | ||
} | ||
|
||
// set "newSup" to empty string for just renaming, to move w/o renaming the "rdn" must be the first | ||
// RDN of the given DN | ||
func NewModifyDNRequest(dn string, rdn string, delOld bool, newSup string) *ModifyDNRequest { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For future documentation clarity (godoc) it wouldn't hurt to have 3 short examples:
Or just actual There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. made an moddn_test.go with the 3 examples |
||
return &ModifyDNRequest{ | ||
DN: dn, | ||
NewRDN: rdn, | ||
DeleteOldRDN: delOld, | ||
NewSuperior: newSup, | ||
} | ||
} | ||
|
||
func (m ModifyDNRequest) encode() *ber.Packet { | ||
request := ber.Encode(ber.ClassApplication, ber.TypeConstructed, ApplicationModifyDNRequest, nil, "Modify DN Request") | ||
request.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, m.DN, "DN")) | ||
request.AppendChild(ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, m.NewRDN, "New RDN")) | ||
request.AppendChild(ber.NewBoolean(ber.ClassUniversal, ber.TypePrimitive, ber.TagBoolean, m.DeleteOldRDN, "Delete old RDN")) | ||
if m.NewSuperior != "" { | ||
request.AppendChild(ber.NewString(ber.ClassContext, ber.TypePrimitive, 0, m.NewSuperior, "New Superior")) | ||
} | ||
return request | ||
} | ||
|
||
// Rename the given DN and optionally move to another base (when the "newSup" argument | ||
// to NewModifyDNRequest() is not ""). | ||
func (l *Conn) ModifyDN(m *ModifyDNRequest) error { | ||
messageID := l.nextMessageID() | ||
packet := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "LDAP Request") | ||
packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, messageID, "MessageID")) | ||
packet.AppendChild(m.encode()) | ||
|
||
l.Debug.PrintPacket(packet) | ||
|
||
channel, err := l.sendMessage(packet) | ||
if err != nil { | ||
return err | ||
} | ||
if channel == nil { | ||
return NewError(ErrorNetwork, errors.New("ldap: could not send message")) | ||
} | ||
defer l.finishMessage(messageID) | ||
|
||
l.Debug.Printf("%d: waiting for response", messageID) | ||
packet = <-channel | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. needs to be updated for changes in #57:
|
||
l.Debug.Printf("%d: got response %p", messageID, packet) | ||
if packet == nil { | ||
return NewError(ErrorNetwork, errors.New("ldap: could not retrieve message")) | ||
} | ||
|
||
if l.Debug { | ||
if err := addLDAPDescriptions(packet); err != nil { | ||
return err | ||
} | ||
ber.PrintPacket(packet) | ||
} | ||
|
||
if packet.Children[1].Tag == ApplicationModifyDNResponse { | ||
resultCode, resultDescription := getLDAPResultCode(packet) | ||
if resultCode != 0 { | ||
return NewError(resultCode, errors.New(resultDescription)) | ||
} | ||
} else { | ||
log.Printf("Unexpected Response: %d", packet.Children[1].Tag) | ||
} | ||
|
||
l.Debug.Printf("%d: returning", messageID) | ||
return nil | ||
} | ||
|
||
// vim: ts=4 sw=4 noexpandtab nolist | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. drop this line |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lead the comment with function name, expand abbreviations, split parameter usage tips into separate lines/sentences (maybe even with examples?)