|
@@ -4,6 +4,7 @@ import (
|
|
|
"encoding/json"
|
|
|
"log"
|
|
|
"net/http"
|
|
|
+ "regexp"
|
|
|
"strconv"
|
|
|
|
|
|
auth "imuslab.com/arozos/mod/auth"
|
|
@@ -11,13 +12,15 @@ import (
|
|
|
reg "imuslab.com/arozos/mod/auth/register"
|
|
|
"imuslab.com/arozos/mod/common"
|
|
|
db "imuslab.com/arozos/mod/database"
|
|
|
+ permission "imuslab.com/arozos/mod/permission"
|
|
|
)
|
|
|
|
|
|
type ldapHandler struct {
|
|
|
- ag *auth.AuthAgent
|
|
|
- ldapreader *ldapreader.LdapReader
|
|
|
- reg *reg.RegisterHandler
|
|
|
- coredb *db.Database
|
|
|
+ ag *auth.AuthAgent
|
|
|
+ ldapreader *ldapreader.LdapReader
|
|
|
+ reg *reg.RegisterHandler
|
|
|
+ coredb *db.Database
|
|
|
+ permissionHandler *permission.PermissionHandler
|
|
|
}
|
|
|
|
|
|
type Config struct {
|
|
@@ -29,22 +32,19 @@ type Config struct {
|
|
|
BaseDN string `json:"base_dn"`
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
-const (
|
|
|
- BindUsername = "uid=root,cn=users,dc=dsm"
|
|
|
- BindPassword = "12345678"
|
|
|
- FQDN = "192.168.1.147"
|
|
|
- BaseDN = "cn=users,dc=dsm"
|
|
|
-)
|
|
|
-*/
|
|
|
+type UserAccount struct {
|
|
|
+ Username string `json:"username"`
|
|
|
+ Group []string `json:"group"`
|
|
|
+ EquivGroup []string `json:"equiv_group"`
|
|
|
+}
|
|
|
|
|
|
/*
|
|
|
-TODO: not sure why enabled will keep enable
|
|
|
+TODO: not sure why auto redirect will keep enable
|
|
|
|
|
|
*/
|
|
|
|
|
|
//NewLdapHandler xxx
|
|
|
-func NewLdapHandler(authAgent *auth.AuthAgent, register *reg.RegisterHandler, coreDb *db.Database) *ldapHandler {
|
|
|
+func NewLdapHandler(authAgent *auth.AuthAgent, register *reg.RegisterHandler, coreDb *db.Database, permissionHandler *permission.PermissionHandler) *ldapHandler {
|
|
|
//ldap handler init
|
|
|
log.Println("Starting LDAP client...")
|
|
|
err := coreDb.NewTable("ldap")
|
|
@@ -60,10 +60,11 @@ func NewLdapHandler(authAgent *auth.AuthAgent, register *reg.RegisterHandler, co
|
|
|
BaseDN := readSingleConfig("BaseDN", coreDb)
|
|
|
|
|
|
LDAPHandler := ldapHandler{
|
|
|
- ag: authAgent,
|
|
|
- ldapreader: ldapreader.NewLDAPReader(BindUsername, BindPassword, FQDN, BaseDN),
|
|
|
- reg: register,
|
|
|
- coredb: coreDb,
|
|
|
+ ag: authAgent,
|
|
|
+ ldapreader: ldapreader.NewLDAPReader(BindUsername, BindPassword, FQDN, BaseDN),
|
|
|
+ reg: register,
|
|
|
+ coredb: coreDb,
|
|
|
+ permissionHandler: permissionHandler,
|
|
|
}
|
|
|
|
|
|
return &LDAPHandler
|
|
@@ -167,9 +168,73 @@ func (ldap *ldapHandler) WriteConfig(w http.ResponseWriter, r *http.Request) {
|
|
|
common.SendOK(w)
|
|
|
}
|
|
|
|
|
|
-func (handler *ldapHandler) SyncInformation() {
|
|
|
- result, _ := handler.ldapreader.GetAllUser()
|
|
|
- for _, v := range result {
|
|
|
- v.PrettyPrint(4)
|
|
|
+//@para limit: -1 means unlimited
|
|
|
+func (ldap *ldapHandler) getAllUser(limit int) []UserAccount {
|
|
|
+ var accounts []UserAccount
|
|
|
+ result, _ := ldap.ldapreader.GetAllUser()
|
|
|
+ //loop through the result
|
|
|
+ for i, v := range result {
|
|
|
+ //check the group belongs
|
|
|
+ var Group []string
|
|
|
+ var EquivGroup []string
|
|
|
+ regexSyntax := regexp.MustCompile("cn=([^,]+),")
|
|
|
+ for _, v := range v.GetAttributeValues("memberOf") {
|
|
|
+ groups := regexSyntax.FindStringSubmatch(v)
|
|
|
+ if len(groups) > 0 {
|
|
|
+ //check if the LDAP group is already exists in ArOZOS system
|
|
|
+ if ldap.permissionHandler.GroupExists(groups[1]) {
|
|
|
+ EquivGroup = append(EquivGroup, groups[1])
|
|
|
+ }
|
|
|
+ //LDAP list
|
|
|
+ Group = append(Group, groups[1])
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if len(EquivGroup) < 1 {
|
|
|
+ EquivGroup = append(EquivGroup, ldap.reg.DefaultUserGroup)
|
|
|
+ }
|
|
|
+ account := UserAccount{
|
|
|
+ Username: v.GetAttributeValue("uid"),
|
|
|
+ Group: Group,
|
|
|
+ EquivGroup: EquivGroup,
|
|
|
+ }
|
|
|
+ accounts = append(accounts, account)
|
|
|
+ if i > limit && limit != -1 {
|
|
|
+ break
|
|
|
+ }
|
|
|
}
|
|
|
+ return accounts[1:]
|
|
|
+}
|
|
|
+
|
|
|
+func (ldap *ldapHandler) TestConnection(w http.ResponseWriter, r *http.Request) {
|
|
|
+ //marshall it and return
|
|
|
+ accountJSON, err := json.Marshal(ldap.getAllUser(10))
|
|
|
+ if err != nil {
|
|
|
+ empty, err := json.Marshal(UserAccount{})
|
|
|
+ if err != nil {
|
|
|
+ common.SendErrorResponse(w, "Error while marshalling information")
|
|
|
+ }
|
|
|
+ common.SendJSONResponse(w, string(empty))
|
|
|
+ }
|
|
|
+ common.SendJSONResponse(w, string(accountJSON))
|
|
|
+}
|
|
|
+
|
|
|
+func (ldap *ldapHandler) SyncorizeUser(w http.ResponseWriter, r *http.Request) {
|
|
|
+ ldapUsersList := ldap.getAllUser(-1)
|
|
|
+ //arozUsersList := ldap.ag.ListUsers()
|
|
|
+
|
|
|
+ for _, ldapUser := range ldapUsersList {
|
|
|
+ //check if user does not exist in system
|
|
|
+ if !ldap.ag.UserExists(ldapUser.Username) {
|
|
|
+ //TODO change password
|
|
|
+ //TODO reg.GetDefaultUserGroup()
|
|
|
+ ldap.ag.CreateUserAccount(ldapUser.Username, "P@ssw0rd", ldapUser.EquivGroup)
|
|
|
+ } else {
|
|
|
+ //if exists, then check if the user group is the same with ldap's setting
|
|
|
+ //ldapUserCurrentEquivGroup, _ := ldap.permissionHandler.GetUsersPermissionGroup(ldapUser.Username)
|
|
|
+ //for _, ldapUserNewEquivGroup := range ldapUser.EquivGroup {
|
|
|
+ // if ldap.ag.
|
|
|
+ //}
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|