@@ -28,6 +28,7 @@ type Client struct {
2828 conn * zk.Conn
2929
3030 addrlist string
31+ auth string
3132 timeout time.Duration
3233
3334 logger * zkLogger
@@ -45,16 +46,16 @@ func (l *zkLogger) Printf(format string, v ...interface{}) {
4546 }
4647}
4748
48- func New (addrlist string , timeout time.Duration ) (* Client , error ) {
49- return NewWithLogfunc (addrlist , timeout , DefaultLogfunc )
49+ func New (addrlist string , auth string , timeout time.Duration ) (* Client , error ) {
50+ return NewWithLogfunc (addrlist , auth , timeout , DefaultLogfunc )
5051}
5152
52- func NewWithLogfunc (addrlist string , timeout time.Duration , logfunc func (foramt string , v ... interface {})) (* Client , error ) {
53+ func NewWithLogfunc (addrlist string , auth string , timeout time.Duration , logfunc func (foramt string , v ... interface {})) (* Client , error ) {
5354 if timeout <= 0 {
5455 timeout = time .Second * 5
5556 }
5657 c := & Client {
57- addrlist : addrlist , timeout : timeout ,
58+ addrlist : addrlist , auth : auth , timeout : timeout ,
5859 logger : & zkLogger {logfunc },
5960 }
6061 if err := c .reset (); err != nil {
@@ -77,6 +78,12 @@ func (c *Client) reset() error {
7778
7879 c .logger .Printf ("zkclient setup new connection to %s" , c .addrlist )
7980
81+ if c .auth != "" {
82+ if err := c .conn .AddAuth ("digest" , []byte (c .auth )); err != nil {
83+ return errors .Trace (err )
84+ }
85+ }
86+
8087 go func () {
8188 for e := range events {
8289 log .Debugf ("zookeeper event: %+v" , e )
@@ -155,7 +162,15 @@ func (c *Client) mkdir(conn *zk.Conn, path string) error {
155162 if err := c .mkdir (conn , filepath .Dir (path )); err != nil {
156163 return err
157164 }
158- _ , err := conn .Create (path , []byte {}, 0 , zk .WorldACL (zk .PermAll ))
165+ var acl []zk.ACL
166+
167+ if c .auth != "" {
168+ auth := strings .Split (c .auth , ":" )
169+ acl = zk .DigestACL (zk .PermAll , auth [0 ], auth [1 ])
170+ } else {
171+ acl = zk .WorldACL (zk .PermAll )
172+ }
173+ _ , err := conn .Create (path , []byte {}, 0 , acl )
159174 if err != nil && errors .NotEqual (err , zk .ErrNodeExists ) {
160175 return errors .Trace (err )
161176 }
@@ -213,7 +228,16 @@ func (c *Client) create(conn *zk.Conn, path string, data []byte, flag int32) (st
213228 if err := c .mkdir (conn , filepath .Dir (path )); err != nil {
214229 return "" , err
215230 }
216- p , err := conn .Create (path , data , flag , zk .WorldACL (zk .PermAdmin | zk .PermRead | zk .PermWrite ))
231+
232+ var acl []zk.ACL
233+
234+ if c .auth != "" {
235+ auth := strings .Split (c .auth , ":" )
236+ acl = zk .DigestACL (zk .PermAdmin | zk .PermRead | zk .PermWrite , auth [0 ], auth [1 ])
237+ } else {
238+ acl = zk .WorldACL (zk .PermAdmin | zk .PermRead | zk .PermWrite )
239+ }
240+ p , err := conn .Create (path , data , flag , acl )
217241 if err != nil {
218242 return "" , errors .Trace (err )
219243 }
0 commit comments