memberships: Return user public keys from /api/users

Change-Id: I82ffc7d396c2775aee07e04aeaab757615a258b0
diff --git a/core/installer/server/dodo-app/server.go b/core/installer/server/dodo-app/server.go
index 2bbbb7c..5e0e2e0 100644
--- a/core/installer/server/dodo-app/server.go
+++ b/core/installer/server/dodo-app/server.go
@@ -1709,7 +1709,7 @@
 		fmt.Println(err)
 		return
 	}
-	keyToUser := make(map[string]string)
+	existingPublicKeys := make(map[string]struct{})
 	for _, clientUser := range allClientUsers {
 		if clientUser == "admin" || clientUser == "fluxcd" {
 			continue
@@ -1728,15 +1728,19 @@
 			}
 			for _, existingKey := range existingKeys {
 				cleanKey := soft.CleanKey(existingKey)
-				keyOk := slices.ContainsFunc(userData.SSHPublicKeys, func(key string) bool {
+				found := slices.ContainsFunc(userData.SSHPublicKeys, func(key string) bool {
 					return cleanKey == soft.CleanKey(key)
 				})
-				if !keyOk {
+				if !found {
 					if err := s.client.RemovePublicKey(clientUser, existingKey); err != nil {
 						fmt.Println(err)
 					}
 				} else {
-					keyToUser[cleanKey] = clientUser
+					if _, ok := existingPublicKeys[cleanKey]; ok {
+						fmt.Println(fmt.Errorf("duplicate key: %s", cleanKey))
+						return
+					}
+					existingPublicKeys[cleanKey] = struct{}{}
 				}
 			}
 		}
@@ -1762,15 +1766,11 @@
 		} else {
 			for _, key := range u.SSHPublicKeys {
 				cleanKey := soft.CleanKey(key)
-				if user, ok := keyToUser[cleanKey]; ok {
-					if u.Username != user {
-						panic("MUST NOT REACH! IMPOSSIBLE KEY USER RECORD")
+				if _, ok := existingPublicKeys[cleanKey]; !ok {
+					if err := s.client.AddPublicKey(u.Username, cleanKey); err != nil {
+						fmt.Println(err)
+						return
 					}
-					continue
-				}
-				if err := s.client.AddPublicKey(u.Username, cleanKey); err != nil {
-					fmt.Println(err)
-					return
 				}
 			}
 		}
@@ -1785,7 +1785,7 @@
 		}
 		for _, u := range users {
 			if err := s.client.AddReadWriteCollaborator(r, u.Username); err != nil {
-				fmt.Println(err)
+				fmt.Printf("%s %s\n", u.Username, err)
 				continue
 			}
 		}