diff options
Diffstat (limited to 'src/nshd/hackers_git/db_passwd.go')
-rw-r--r-- | src/nshd/hackers_git/db_passwd.go | 78 |
1 files changed, 69 insertions, 9 deletions
diff --git a/src/nshd/hackers_git/db_passwd.go b/src/nshd/hackers_git/db_passwd.go index f0a0257..e8a6838 100644 --- a/src/nshd/hackers_git/db_passwd.go +++ b/src/nshd/hackers_git/db_passwd.go @@ -1,22 +1,82 @@ package hackers_git -import p "nslcd_proto" +import ( + p "nslcd_proto" + "nslcd_proto/util" +) + +/* Note that the output password hash value should be one of: + <empty> - no password set, allow login without password + ! - used to prevent logins + x - "valid" encrypted password that does not match any valid password + 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 { o.lock.RLock() defer o.lock.RUnlock() - // TODO - return nil + + uid := o.name2uid(string(req)) + 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}) } + func (o *Hackers) Passwd_ByUID(cred p.Ucred, req p.Request_Passwd_ByUID) p.Passwd_Enumerator { o.lock.RLock() defer o.lock.RUnlock() - // TODO - return nil + + user, found := o.users[int32(req)] + 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}) } -func (o *Hackers) Passwd_All(cred p.Ucred, req p.Request_Passwd_All) p.Passwd_Enumerator { + +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 + passwd.PwHash = "x" // only put actual hashes in the Shadow DB + e.uids = e.uids[1:] + return &passwd, nil + } + if len(e.uids) == 0 && !e.done { + e.done = true + e.backend.lock.RUnlock() + } + return nil, nil +} + +func (e *allPasswdEnumerator) GenericGetNext() (interface{}, error) { + return e.GetNext() +} + +func (o *Hackers) newAllPasswdEnumerator() *allPasswdEnumerator { o.lock.RLock() - defer o.lock.RUnlock() - // TODO - return nil + e := allPasswdEnumerator{ + uids: make([]int32, len(o.users)), + backend: o, + done: false, + } + for uid, _ := range o.users { + e.uids = append(e.uids, uid) + } + return &e +} + +func (o *Hackers) Passwd_All(cred p.Ucred, req p.Request_Passwd_All) p.Passwd_Enumerator { + return o.newAllPasswdEnumerator() } |