-
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 9 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,104 @@ | ||
// Package ldap - moddn.go 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" | ||
) | ||
|
||
// ModifyDNRequest holds the request to modify a DN | ||
type ModifyDNRequest struct { | ||
DN string | ||
NewRDN string | ||
DeleteOldRDN bool | ||
NewSuperior string | ||
} | ||
|
||
// NewModifyDNRequest creates a new request which can be passed to ModifyDN(). | ||
// | ||
// To move an object in the tree, set the "newSup" to the new parent entry DN. Use an | ||
// empty string for just changing the object's RDN. | ||
// | ||
// For moving the object without renaming the "rdn" must be the first | ||
// RDN of the given DN. | ||
// | ||
// A call like | ||
// mdnReq := NewModifyDNRequest("uid=someone,dc=example,dc=org", "uid=newname", true, "") | ||
// will setup the request to just rename uid=someone,dc=example,dc=org to | ||
// uid=newname,dc=example,dc=org. | ||
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 | ||
} | ||
|
||
// ModifyDN renames the given DN and optionally move to another base (when the "newSup" argument | ||
// to NewModifyDNRequest() is not ""). | ||
func (l *Conn) ModifyDN(m *ModifyDNRequest) error { | ||
packet := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "LDAP Request") | ||
packet.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, l.nextMessageID, "MessageID")) | ||
packet.AppendChild(m.encode()) | ||
|
||
l.Debug.PrintPacket(packet) | ||
|
||
msgCtx, err := l.sendMessage(packet) | ||
if err != nil { | ||
return err | ||
} | ||
defer l.finishMessage(msgCtx) | ||
|
||
l.Debug.Printf("%d: waiting for response", msgCtx.id) | ||
packetResponse, ok := <-msgCtx.responses | ||
if !ok { | ||
return NewError(ErrorNetwork, errors.New("ldap: channel closed")) | ||
} | ||
packet, err = packetResponse.ReadPacket() | ||
l.Debug.Printf("%d: got response %p", msgCtx.id, packet) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
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", msgCtx.id) | ||
return nil | ||
} |
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.
Example for moving without renaming? Also a comma "without renaming, the"