ldap.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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 = "uid=root,cn=users,dc=dsm"
  15. BindPassword = "12345678"
  16. FQDN = "192.168.1.147"
  17. BaseDN = "cn=users,dc=dsm"
  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. for _, v := range result.Entries {
  45. v.PrettyPrint(4)
  46. }
  47. }
  48. // Ldap Connection without TLS
  49. func (handler *ldapHandler) Connect() (*ldap.Conn, error) {
  50. // You can also use IP instead of FQDN
  51. l, err := ldap.DialURL(fmt.Sprintf("ldap://%s:389", FQDN))
  52. if err != nil {
  53. return nil, err
  54. }
  55. return l, nil
  56. }
  57. // Normal Bind and Search
  58. func (handler *ldapHandler) BindAndSearch(l *ldap.Conn) (*ldap.SearchResult, error) {
  59. l.Bind(BindUsername, BindPassword)
  60. searchReq := ldap.NewSearchRequest(
  61. BaseDN,
  62. //ldap.ScopeBaseObject, // you can also use ldap.ScopeWholeSubtree
  63. ldap.ScopeWholeSubtree,
  64. ldap.NeverDerefAliases,
  65. 0,
  66. 0,
  67. false,
  68. Filter,
  69. []string{"uid", "memberOf"},
  70. nil,
  71. )
  72. result, err := l.Search(searchReq)
  73. if err != nil {
  74. return nil, fmt.Errorf("Search Error: %s", err)
  75. }
  76. if len(result.Entries) > 0 {
  77. return result, nil
  78. } else {
  79. return nil, fmt.Errorf("Couldn't fetch search entries")
  80. }
  81. }