package authentication import ( "crypto/tls" "net/mail" "github.com/go-ldap/ldap/v3" "golang.org/x/text/encoding/unicode" ) // LDAPClientFactory an interface of factory of LDAP clients. type LDAPClientFactory interface { DialURL(addr string, opts ...ldap.DialOpt) (client LDAPClient, err error) } // LDAPClient is a cut down version of the ldap.Client interface with just the methods we use. // // Methods added to this interface that have a direct correlation with one from ldap.Client should have the same signature. type LDAPClient interface { Close() StartTLS(config *tls.Config) (err error) Bind(username, password string) (err error) UnauthenticatedBind(username string) (err error) Modify(modifyRequest *ldap.ModifyRequest) (err error) PasswordModify(pwdModifyRequest *ldap.PasswordModifyRequest) (pwdModifyResult *ldap.PasswordModifyResult, err error) Search(searchRequest *ldap.SearchRequest) (searchResult *ldap.SearchResult, err error) } // UserDetails represent the details retrieved for a given user. type UserDetails struct { Username string DisplayName string Emails []string Groups []string } // Addresses returns the Emails []string as []mail.Address formatted with DisplayName as the Name attribute. func (d UserDetails) Addresses() (addresses []mail.Address) { if len(d.Emails) == 0 { return nil } addresses = make([]mail.Address, len(d.Emails)) for i, email := range d.Emails { addresses[i] = mail.Address{ Name: d.DisplayName, Address: email, } } return addresses } type ldapUserProfile struct { DN string Emails []string DisplayName string Username string } // LDAPSupportedFeatures represents features which a server may support which are implemented in code. type LDAPSupportedFeatures struct { Extensions LDAPSupportedExtensions ControlTypes LDAPSupportedControlTypes } // LDAPSupportedExtensions represents extensions which a server may support which are implemented in code. type LDAPSupportedExtensions struct { TLS bool PwdModifyExOp bool } // LDAPSupportedControlTypes represents control types which a server may support which are implemented in code. type LDAPSupportedControlTypes struct { MsftPwdPolHints bool MsftPwdPolHintsDeprecated bool } var utf16LittleEndian = unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM)