// Copyright 2015-2016 Luke Shumaker . // // This is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as // published by the Free Software Foundation; either version 2 of // the License, or (at your option) any later version. // // This software is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public // License along with this manual; if not, see // . // Package hackers_nslcd_backend is an nslcd_server Backend that // speaks to hackers.git. package hackers_nslcd_backend import ( "parabola_hackers" "sync" nslcd_server "lukeshu.com/git/go/libnslcd.git/proto/server" nslcd_systemd "lukeshu.com/git/go/libnslcd.git/systemd" "lukeshu.com/git/go/libsystemd.git/sd_daemon/logger" ) type config struct { Pam_password_prohibit_message string } type Hackers struct { nslcd_server.NilBackend lock sync.RWMutex CfgFilename string cfg config users map[int32]parabola_hackers.User groups map[string]map[string]bool } var _ nslcd_systemd.Backend = &Hackers{} var _ nslcd_server.Backend = &Hackers{} func (o *Hackers) Init() error { logger.Debug("hackers.git: CfgFilename = %v", o.CfgFilename) err := o.Reload() if err != nil { logger.Err("hackers.git: Could not initialize: %v", err) return err } return nil } func (o *Hackers) Close() { logger.Info("hackers.git: Closing session") o.lock.Lock() defer o.lock.Unlock() o.users = make(map[int32]parabola_hackers.User, 0) o.groups = make(map[string]map[string]bool) } func (o *Hackers) Reload() error { logger.Info("hackers.git: Loading session") o.lock.Lock() defer o.lock.Unlock() var err error o.cfg, err = parse_config(o.CfgFilename) if err != nil { return err } logger.Info("hackers.git: pam_password_prohibit_message: %#v", o.cfg.Pam_password_prohibit_message) logger.Debug("hackers.git: Parsing user data") o.users, err = parabola_hackers.LoadAllUsers() if err != nil { return err } o.groups = make(map[string]map[string]bool) for uid, user := range o.users { user.Passwd.GID = usersGid var _err error user.Passwd.PwHash, _err = parabola_hackers.LoadUserPassword(user.Passwd.HomeDir + "/.password") if _err != nil { logger.Debug("hackers.git: Ignoring password: %v", _err) } o.users[uid] = user for _, groupname := range user.Groups { o.add_user_to_group(user.Passwd.Name, groupname) } } return nil } func (o *Hackers) name2uid(name string) int32 { for uid, data := range o.users { if data.Passwd.Name == name { return uid } } return -1 } func (o *Hackers) add_user_to_group(username string, groupname string) { group, found := o.groups[groupname] if !found { group = make(map[string]bool) o.groups[groupname] = group } group[username] = true }