ldap.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package ldap
  2. import (
  3. "fmt"
  4. "log"
  5. "github.com/go-ldap/ldap"
  6. auth "imuslab.com/arozos/mod/auth"
  7. reg "imuslab.com/arozos/mod/auth/register"
  8. db "imuslab.com/arozos/mod/database"
  9. )
  10. type ldapHandler struct {
  11. ag *auth.AuthAgent
  12. }
  13. const (
  14. BindUsername = "read-only-admin"
  15. BindPassword = "password"
  16. FQDN = "ldap.forumsys.com"
  17. BaseDN = "ou=mathematicians,dc=example,dc=com"
  18. Filter = "(objectClass=*)"
  19. )
  20. //NewOauthHandler xxx
  21. func NewLdapHandler(authAgent *auth.AuthAgent, register *reg.RegisterHandler, coreDb *db.Database) *ldapHandler {
  22. err := coreDb.NewTable("oauth")
  23. if err != nil {
  24. log.Println("Failed to create oauth database. Terminating.")
  25. panic(err)
  26. }
  27. NewlyCreatedOauthHandler := ldapHandler{
  28. ag: authAgent,
  29. }
  30. return &NewlyCreatedOauthHandler
  31. }
  32. func (handler *ldapHandler) Ldap() {
  33. // Non-TLS Connection
  34. l, err := handler.Connect()
  35. if err != nil {
  36. log.Fatal(err)
  37. }
  38. defer l.Close()
  39. // Normal Bind and Search
  40. result, err := handler.BindAndSearch(l)
  41. if err != nil {
  42. log.Fatal(err)
  43. }
  44. result.Entries[0].PrettyPrint(4)
  45. }
  46. // Ldap Connection without TLS
  47. func (handler *ldapHandler) Connect() (*ldap.Conn, error) {
  48. // You can also use IP instead of FQDN
  49. l, err := ldap.DialURL(fmt.Sprintf("ldap://%s:389", FQDN))
  50. if err != nil {
  51. return nil, err
  52. }
  53. return l, nil
  54. }
  55. // Normal Bind and Search
  56. func (handler *ldapHandler) BindAndSearch(l *ldap.Conn) (*ldap.SearchResult, error) {
  57. l.Bind(BindUsername, BindPassword)
  58. searchReq := ldap.NewSearchRequest(
  59. BaseDN,
  60. ldap.ScopeBaseObject, // you can also use ldap.ScopeWholeSubtree
  61. ldap.NeverDerefAliases,
  62. 0,
  63. 0,
  64. false,
  65. Filter,
  66. []string{},
  67. nil,
  68. )
  69. result, err := l.Search(searchReq)
  70. if err != nil {
  71. return nil, fmt.Errorf("Search Error: %s", err)
  72. }
  73. if len(result.Entries) > 0 {
  74. return result, nil
  75. } else {
  76. return nil, fmt.Errorf("Couldn't fetch search entries")
  77. }
  78. }