1 package ldap
2
3 import (
4 "fmt"
5
6 ber "github.com/go-asn1-ber/asn1-ber"
7 )
8
9 const (
10 passwordModifyOID = "1.3.6.1.4.1.4203.1.11.1"
11 )
12
13
14 type PasswordModifyRequest struct {
15
16
17
18 UserIdentity string
19
20 OldPassword string
21
22 NewPassword string
23 }
24
25
26 type PasswordModifyResult struct {
27
28 GeneratedPassword string
29
30 Referral string
31 }
32
33 func (req *PasswordModifyRequest) appendTo(envelope *ber.Packet) error {
34 pkt := ber.Encode(ber.ClassApplication, ber.TypeConstructed, ApplicationExtendedRequest, nil, "Password Modify Extended Operation")
35 pkt.AppendChild(ber.NewString(ber.ClassContext, ber.TypePrimitive, 0, passwordModifyOID, "Extended Request Name: Password Modify OID"))
36
37 extendedRequestValue := ber.Encode(ber.ClassContext, ber.TypePrimitive, 1, nil, "Extended Request Value: Password Modify Request")
38 passwordModifyRequestValue := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "Password Modify Request")
39 if req.UserIdentity != "" {
40 passwordModifyRequestValue.AppendChild(ber.NewString(ber.ClassContext, ber.TypePrimitive, 0, req.UserIdentity, "User Identity"))
41 }
42 if req.OldPassword != "" {
43 passwordModifyRequestValue.AppendChild(ber.NewString(ber.ClassContext, ber.TypePrimitive, 1, req.OldPassword, "Old Password"))
44 }
45 if req.NewPassword != "" {
46 passwordModifyRequestValue.AppendChild(ber.NewString(ber.ClassContext, ber.TypePrimitive, 2, req.NewPassword, "New Password"))
47 }
48 extendedRequestValue.AppendChild(passwordModifyRequestValue)
49
50 pkt.AppendChild(extendedRequestValue)
51
52 envelope.AppendChild(pkt)
53
54 return nil
55 }
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 func NewPasswordModifyRequest(userIdentity string, oldPassword string, newPassword string) *PasswordModifyRequest {
74 return &PasswordModifyRequest{
75 UserIdentity: userIdentity,
76 OldPassword: oldPassword,
77 NewPassword: newPassword,
78 }
79 }
80
81
82 func (l *Conn) PasswordModify(passwordModifyRequest *PasswordModifyRequest) (*PasswordModifyResult, error) {
83 msgCtx, err := l.doRequest(passwordModifyRequest)
84 if err != nil {
85 return nil, err
86 }
87 defer l.finishMessage(msgCtx)
88
89 packet, err := l.readPacket(msgCtx)
90 if err != nil {
91 return nil, err
92 }
93
94 result := &PasswordModifyResult{}
95
96 if packet.Children[1].Tag == ApplicationExtendedResponse {
97 if err = GetLDAPError(packet); err != nil {
98 result.Referral = getReferral(err, packet)
99
100 return result, err
101 }
102 } else {
103 return nil, NewError(ErrorUnexpectedResponse, fmt.Errorf("unexpected Response: %d", packet.Children[1].Tag))
104 }
105
106 extendedResponse := packet.Children[1]
107 for _, child := range extendedResponse.Children {
108 if child.Tag == ber.TagEmbeddedPDV {
109 passwordModifyResponseValue := ber.DecodePacket(child.Data.Bytes())
110 if len(passwordModifyResponseValue.Children) == 1 {
111 if passwordModifyResponseValue.Children[0].Tag == ber.TagEOC {
112 result.GeneratedPassword = ber.DecodeString(passwordModifyResponseValue.Children[0].Data.Bytes())
113 }
114 }
115 }
116 }
117
118 return result, nil
119 }
120
View as plain text