From f294b6687462c67d82014c6787aaaa80e3ac3689 Mon Sep 17 00:00:00 2001 From: MrArmonius Date: Thu, 8 Jul 2021 16:22:30 +0200 Subject: [PATCH] test_automatique fini et fonctionnel --- test_automatic/integration.go | 169 ++++++++++++++++++++++++++++------ 1 file changed, 143 insertions(+), 26 deletions(-) diff --git a/test_automatic/integration.go b/test_automatic/integration.go index 336260b..f25979e 100644 --- a/test_automatic/integration.go +++ b/test_automatic/integration.go @@ -7,10 +7,19 @@ import ( "math/rand" "strings" "errors" + "os" ) + +const bindusername = "cn=admin,dc=deuxfleurs,dc=fr" +const adresse = "127.0.0.1" +const port = 1389 +var bindpassword string + var all_names = make(map[string]struct{}) + + func printError(LDAPError error) { if LDAPError != nil { log.Fatal(LDAPError) @@ -165,23 +174,25 @@ func test_attributes(l *ldap.Conn, tab_AddRequest []ldap.AddRequest, filter_obje return nil } -func clean(l *ldap.Conn, AddReq_users, AddReq_groups []ldap.AddRequest) (err error){ +func clean(l *ldap.Conn, AddReq_users, AddReq_groups []ldap.AddRequest,user, group bool) (err error){ log.Debug("Debut clean") - for _,req := range AddReq_users { - delReq := ldap.NewDelRequest(req.DN,nil) - err = l.Del(delReq) - if err != nil { - return + if(user) { + for _,req := range AddReq_users { + delReq := ldap.NewDelRequest(req.DN,nil) + err = l.Del(delReq) + if err != nil { + return + } } } - log.Debug("Fin users - Debut groups") - for _,req := range AddReq_groups { - delReq := ldap.NewDelRequest(req.DN, nil) - err = l.Del(delReq) - if err != nil { - return + if group { + for _,req := range AddReq_groups { + delReq := ldap.NewDelRequest(req.DN, nil) + err = l.Del(delReq) + if err != nil { + return + } } - } defer log.Debug("Fin clean") return @@ -205,14 +216,103 @@ func test_modify_attributes(l *ldap.Conn, r *rand.Rand, tab_AddReq []ldap.AddReq return } +func add_user_in_groups(l *ldap.Conn, r *rand.Rand, users, groups []ldap.AddRequest) (err error) { + for _,group := range groups { + numberUsers := r.Intn(19) + 1 //Always a minimum of 1 user + list_users := []string{} + for i:=0; i < numberUsers; i++ { + list_users = append(list_users, users[i].DN) + } + modifyReq := ldap.NewModifyRequest( group.DN, nil) + modifyReq.Add("member", list_users) + + err = l.Modify(modifyReq) + if err != nil { + log.Warn(fmt.Sprintf("Error: ModifyReq failed, func:add_users_in_groups from group:\n %d",group)) + return + } + } + return +} + +func delete_groups(l *ldap.Conn, groups []ldap.AddRequest) (list map[string][]string ,err error) { + list = make(map[string][]string) + for _, group := range groups { + //Get lists_users + cn := strings.Split(group.DN,",")[0] + search_req := ldap.NewSearchRequest( + "ou=groups,dc=deuxfleurs,dc=fr", + ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, + fmt.Sprintf("(&(objectclass=groupOfNames)(%s))",cn), + []string{"member"}, + nil, + ) + res , err := l.Search(search_req) + if err != nil { + log.Warn(fmt.Sprintf("Error Search: func: delete_groups_and_check_memberOf, from group: \n %d", group)) + return list, err + } + if len(res.Entries) != 1 { + err = errors.New(fmt.Sprintf("SearchResult get: %s, SearchResult wanted: 1", len(res.Entries))) + return list, err + } + EntryAtt := res.Entries[0].Attributes + list_users := []string{} + for _, att := range EntryAtt { + list_users = append(list_users ,att.Values[0]) + } + + //Del group + del := ldap.NewDelRequest( group.DN, nil) + err = l.Del(del) + if err != nil { + return list, err + } + list[group.DN] = list_users + } + return +} + +func check_memberOf(l *ldap.Conn, list map[string][]string) (err error) { + //Check the memberOf of all users + for groupeDN,_ := range list{ + search_req := ldap.NewSearchRequest( + "ou=users,dc=deuxfleurs,dc=fr", + ldap.ScopeWholeSubtree, ldap.NeverDerefAliases,0 ,0, false, + fmt.Sprintf("(&(objectclass=inetOrgPerson)(memberOf=%s))",groupeDN), + []string{"cn"}, + nil, + ) + res, err := l.Search(search_req) + if err != nil { + return err + } + if len(res.Entries) != 0 { + err = errors.New(fmt.Sprintf("L'user '%s' a encore le DN d'un groupe supprimé: %s",res.Entries[0].Attributes[0].Values[0],groupeDN)) + return err + } + } + return err +} + +func reconnect(l *ldap.Conn) (l_nouv *ldap.Conn, err error){ + l.Close() + l_nouv, err = ldap.Dial("tcp", fmt.Sprintf("%s:%d",adresse,port)) + if err != nil { + return + } + err = l_nouv.Bind(bindusername, bindpassword) + return +} + + func main() { - bindusername :="cn=admin,dc=deuxfleurs,dc=fr" - bindpassword := "FhvuwPzk0ko" + bindpassword = "FhvuwPzk0ko" + if len(os.Args)==2 { + bindpassword = os.Args[1] + } - adresse := "127.0.0.1" - port := 1389 - - log.SetLevel(log.TraceLevel) + //log.SetLevel(log.TraceLevel) //Create a connection with Bottin server l, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", adresse, port)) @@ -259,13 +359,8 @@ func main() { //Close the connection and open an other. If we don't do this, bottin server send a wrong answer. Comment this part if you want to try this - l.Close() - l, err = ldap.Dial("tcp", fmt.Sprintf("%s:%d",adresse, port)) + l,err = reconnect(l) printError(err) - err = l.Bind(bindusername, bindpassword) - printError(err) - defer l.Close() - //Modify attributes users and groups. //Modify users' attributes and check them @@ -294,11 +389,33 @@ func main() { printError(err) log.Info("Les modifications ont bien été prises en compte") + //Close the connection + l, err = reconnect(l) + printError(err) //Add users in group, search them, delete several samples and search again to be sur it's good + err = add_user_in_groups(l, r, tab_AddRequest_users, tab_AddRequest_groups) + printError(err) + log.Info("Ajout d'users dans les groupes fait") + + //Close the connection + l, err = reconnect(l) + printError(err) + + list, err := delete_groups(l, tab_AddRequest_groups) + printError(err) + log.Info("groupe supprimé") + + + l,err = reconnect(l) + printError(err) + + err = check_memberOf(l, list) + printError(err) + log.Info("Le memberOf a été correctement vidé") //Clean: Delete all users and groups (not OU users and groups) - err = clean(l, tab_AddRequest_users, tab_AddRequest_groups) + err = clean(l, tab_AddRequest_users, tab_AddRequest_groups, true, false) printError(err) log.Info("Clean succes")