summaryrefslogtreecommitdiff
path: root/src/nshd/hackers_git/db_passwd.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/nshd/hackers_git/db_passwd.go')
-rw-r--r--src/nshd/hackers_git/db_passwd.go108
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
}