package eDir import ( "github.com/go-ldap/ldap" "crypto/tls" "fmt" "strings" ) const ( ldapURL = "auth.edir.rackspace.com" ldapPort = uint16(389) ldapTLSPort = uint16(636) ) type ( Bind struct { User string Pass string } UserGroup struct { SSO string Groups []string } ) func GeteDirGroups(user string) ([]UserGroup, error) { var ret []UserGroup l, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", ldapURL, ldapPort)) if err != nil { return ret, err } defer l.Close() searchRequest := ldap.NewSearchRequest( "ou=Users,o=rackspace", ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, fmt.Sprintf("(&(cn=%v))", user), []string{"dn", "cn", "groupMembership"}, nil, ) sr, err := l.Search(searchRequest) if err != nil { return ret, err } r := strings.NewReplacer( "cn=", "", ",o=rackspace", "", ",ou=Groups", "", ",ou=Users", "", ",ou=POSIXGroups", "") for _, entry := range sr.Entries { var groups []string for _, group := range entry.GetAttributeValues("groupMembership") { groups = append(groups, r.Replace(group)) } ret = append(ret, UserGroup{SSO: r.Replace(entry.DN), Groups: groups}) } return ret, nil } func GetTLSeDirGroups(user string, b Bind) ([]UserGroup, error) { var ret []UserGroup l, err := ldap.DialTLS( "tcp", fmt.Sprintf("%s:%d", ldapURL, ldapTLSPort), &tls.Config{InsecureSkipVerify: true}, ) if err != nil { return ret, err } defer l.Close() err = l.Bind(fmt.Sprintf("cn=%s,ou=Users,o=rackspace", b.User), b.Pass) if err != nil { return ret, err } searchRequest := ldap.NewSearchRequest( "ou=Users,o=rackspace", ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, fmt.Sprintf("(&(cn=%v))", user), []string{"dn", "cn", "groupMembership"}, nil, ) sr, err := l.Search(searchRequest) if err != nil { return ret, err } r := strings.NewReplacer( "cn=", "", ",o=rackspace", "", ",ou=Groups", "", ",ou=Users", "", ",ou=POSIXGroups", "") for _, entry := range sr.Entries { var groups []string for _, group := range entry.GetAttributeValues("groupMembership") { groups = append(groups, r.Replace(group)) } ret = append(ret, UserGroup{SSO: r.Replace(entry.DN), Groups: groups}) } return ret, nil }