diff options
author | Luke Shumaker <lukeshu@sbcglobal.net> | 2015-09-12 10:35:52 -0600 |
---|---|---|
committer | Luke Shumaker <lukeshu@sbcglobal.net> | 2015-09-12 10:35:52 -0600 |
commit | e8199ec88c7ca8107c4fb9238e383a4a9eb981ee (patch) | |
tree | 250c514c0cb4ec2b8bd442f4e80e916fb8ad6f2c /src/nshd/hackers_git/db_passwd.go | |
parent | f0302e1ac1a12711a9f49c3d7a62bcdfcaca7eed (diff) |
Derp, channels and goroutines are enumerators
Diffstat (limited to 'src/nshd/hackers_git/db_passwd.go')
-rw-r--r-- | src/nshd/hackers_git/db_passwd.go | 108 |
1 files changed, 43 insertions, 65 deletions
diff --git a/src/nshd/hackers_git/db_passwd.go b/src/nshd/hackers_git/db_passwd.go index 32570fb..cc8c711 100644 --- a/src/nshd/hackers_git/db_passwd.go +++ b/src/nshd/hackers_git/db_passwd.go @@ -1,9 +1,6 @@ package hackers_git -import ( - p "nslcd_proto" - "nslcd_proto/util" -) +import p "nslcd_proto" /* Note that the output password hash value should be one of: <empty> - no password set, allow login without password @@ -12,73 +9,54 @@ import ( often used to indicate that the password is defined elsewhere other - encrypted password, in crypt(3) format */ -func (o *Hackers) Passwd_ByName(cred p.Ucred, req p.Request_Passwd_ByName) p.Passwd_Enumerator { +func (o *Hackers) Passwd_ByName(cred p.Ucred, req p.Request_Passwd_ByName) <-chan p.Passwd { o.lock.RLock() - defer o.lock.RUnlock() - - uid := o.name2uid(req.Name) - if uid < 0 { - return util.Passwd_Ø{} - } - passwd := o.users[uid].passwd - passwd.PwHash = "x" // only put actual hashes in the Shadow DB - - return util.New_Passwd_List([]p.Passwd{passwd}) + ret := make(chan p.Passwd) + go func() { + defer o.lock.RUnlock() + defer close(ret) + + uid := o.name2uid(req.Name) + if uid < 0 { + return + } + passwd := o.users[uid].passwd + passwd.PwHash = "x" // only put actual hashes in the Shadow DB + ret <- passwd + }() + return ret } -func (o *Hackers) Passwd_ByUID(cred p.Ucred, req p.Request_Passwd_ByUID) p.Passwd_Enumerator { +func (o *Hackers) Passwd_ByUID(cred p.Ucred, req p.Request_Passwd_ByUID) <-chan p.Passwd { o.lock.RLock() - defer o.lock.RUnlock() - - user, found := o.users[req.UID] - if !found { - return util.Passwd_Ø{} - } - passwd := user.passwd - passwd.PwHash = "x" // only put actual hashes in the Shadow DB - - return util.New_Passwd_List([]p.Passwd{passwd}) -} - -type allPasswdEnumerator struct { - uids []int32 - backend *Hackers - done bool -} - -func (e *allPasswdEnumerator) GetNext() (*p.Passwd, error) { - if len(e.uids) > 0 { - passwd := e.backend.users[e.uids[0]].passwd + ret := make(chan p.Passwd) + go func() { + defer o.lock.RUnlock() + defer close(ret) + + user, found := o.users[req.UID] + if !found { + return + } + passwd := user.passwd passwd.PwHash = "x" // only put actual hashes in the Shadow DB - e.uids = e.uids[1:] - return &passwd, nil - } else if !e.done { - e.done = true - e.backend.lock.RUnlock() - } - return nil, nil -} - -func (o *allPasswdEnumerator) GenericGetNext() (n *interface{}, err error) { - a, err := o.GetNext() - if a != nil { - b := (interface{})(*a) - n = &b - } - return + ret <- passwd + }() + return ret } -func (o *Hackers) Passwd_All(cred p.Ucred, req p.Request_Passwd_All) p.Passwd_Enumerator { +func (o *Hackers) Passwd_All(cred p.Ucred, req p.Request_Passwd_All) <-chan p.Passwd { o.lock.RLock() - e := allPasswdEnumerator{ - uids: make([]int32, len(o.users)), - backend: o, - done: false, - } - i := uint(0) - for uid, _ := range o.users { - e.uids[i] = uid - i++ - } - return &e + ret := make(chan p.Passwd) + go func() { + defer o.lock.RUnlock() + defer close(ret) + + for _, user := range o.users { + passwd := user.passwd + passwd.PwHash = "x" // only put actual hashes in the Shadow DB + ret <- passwd + } + }() + return ret } |