2018-07-21 11:01:20 -04:00
package user
import (
"errors"
"fmt"
"log"
"strings"
"github.com/spf13/cobra"
"github.com/spf13/viper"
2022-06-11 01:15:44 -04:00
ldap "github.com/go-ldap/ldap/v3"
2018-07-21 11:01:20 -04:00
)
var (
flagUserAttributes [ ] string
)
func init ( ) {
// define user delete subcommand flags
userEditCmd . Flags ( ) . StringP ( "base_ou" , "o" , "" , "LDAP OU where your user entries are stored" )
userEditCmd . Flags ( ) . StringP ( "uid_attribute" , "a" , "uid" , "LDAP DN attribute for users" )
userEditCmd . Flags ( ) . StringVarP ( & flagUserUsername , "username" , "u" , "" , "Username of user to delete" )
userEditCmd . Flags ( ) . StringSliceVarP ( & flagUserAttributes , "attributes" , "m" , [ ] string { } , "Comma-separated or multi-flagged list of attributes to change (format: attr=value)" )
// bind config file values to user delete flags
viper . BindPFlag ( "user.base_ou" , userEditCmd . Flags ( ) . Lookup ( "base_ou" ) )
viper . BindPFlag ( "user.uid_attr" , userEditCmd . Flags ( ) . Lookup ( "uid_attribute" ) )
}
// define user edit subcommand
var userEditCmd = & cobra . Command {
Use : "edit" ,
Short : "Edit an LDAP user in the directory" ,
Long : ` Edit an LDAP user resource in the directory. ` ,
Run : func ( cmd * cobra . Command , args [ ] string ) {
// check if any attributes were given
if len ( flagUserAttributes ) < 1 {
log . Fatal ( errors . New ( "You didn't supply any user attributes" ) )
}
// create new LDAP connection
l , err := ldap . Dial ( "tcp" , fmt . Sprintf ( "%s:%d" , viper . GetString ( "host" ) , viper . GetInt ( "port" ) ) )
if err != nil {
log . Fatal ( err )
}
defer l . Close ( )
// bind as the admin user
err = l . Bind ( viper . GetString ( "bind_dn" ) , viper . GetString ( "bind_pw" ) )
if err != nil {
log . Fatal ( err )
}
// set up user DN
userDn := fmt . Sprintf ( "%s=%s,%s" , viper . GetString ( "user.uid_attr" ) , flagUserUsername , viper . GetString ( "user.base_ou" ) )
// create a new edit request object
2022-06-11 01:15:44 -04:00
modifyRequest := ldap . NewModifyRequest ( userDn , nil )
2018-07-21 11:01:20 -04:00
// loop through list of attribute changes
for _ , attrModify := range flagUserAttributes {
attr := strings . Split ( attrModify , "=" )
modifyRequest . Replace ( attr [ 0 ] , [ ] string { attr [ 1 ] } )
}
// perform the modify operation
err = l . Modify ( modifyRequest )
if err != nil {
log . Fatal ( err )
}
} ,
}