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.go78
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()
}