ldap.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. package ldap
  2. import (
  3. "encoding/json"
  4. "log"
  5. "net/http"
  6. "strconv"
  7. auth "imuslab.com/arozos/mod/auth"
  8. "imuslab.com/arozos/mod/auth/ldap/ldapreader"
  9. reg "imuslab.com/arozos/mod/auth/register"
  10. "imuslab.com/arozos/mod/common"
  11. db "imuslab.com/arozos/mod/database"
  12. )
  13. type ldapHandler struct {
  14. ag *auth.AuthAgent
  15. ldapreader *ldapreader.LdapReader
  16. reg *reg.RegisterHandler
  17. coredb *db.Database
  18. }
  19. type Config struct {
  20. Enabled bool `json:"enabled"`
  21. AutoRedirect bool `json:"auto_redirect"`
  22. BindUsername string `json:"bind_username"`
  23. BindPassword string `json:"bind_password"`
  24. FQDN string `json:"fqdn"`
  25. BaseDN string `json:"base_dn"`
  26. }
  27. /*
  28. const (
  29. BindUsername = "uid=root,cn=users,dc=dsm"
  30. BindPassword = "12345678"
  31. FQDN = "192.168.1.147"
  32. BaseDN = "cn=users,dc=dsm"
  33. )
  34. */
  35. /*
  36. TODO: not sure why enabled will keep enable
  37. */
  38. //NewLdapHandler xxx
  39. func NewLdapHandler(authAgent *auth.AuthAgent, register *reg.RegisterHandler, coreDb *db.Database) *ldapHandler {
  40. //ldap handler init
  41. log.Println("Starting LDAP client...")
  42. err := coreDb.NewTable("ldap")
  43. if err != nil {
  44. log.Println("Failed to create LDAP database. Terminating.")
  45. panic(err)
  46. }
  47. //key value to be used for LDAP authentication
  48. BindUsername := readSingleConfig("BindUsername", coreDb)
  49. BindPassword := readSingleConfig("BindPassword", coreDb)
  50. FQDN := readSingleConfig("FQDN", coreDb)
  51. BaseDN := readSingleConfig("BaseDN", coreDb)
  52. LDAPHandler := ldapHandler{
  53. ag: authAgent,
  54. ldapreader: ldapreader.NewLDAPReader(BindUsername, BindPassword, FQDN, BaseDN),
  55. reg: register,
  56. coredb: coreDb,
  57. }
  58. return &LDAPHandler
  59. }
  60. func (ldap *ldapHandler) ReadConfig(w http.ResponseWriter, r *http.Request) {
  61. //basic components
  62. enabled, err := strconv.ParseBool(ldap.readSingleConfig("enabled"))
  63. if err != nil {
  64. common.SendTextResponse(w, "Invalid config value [key=enabled].")
  65. return
  66. }
  67. autoredirect, err := strconv.ParseBool(ldap.readSingleConfig("autoredirect"))
  68. if err != nil {
  69. common.SendTextResponse(w, "Invalid config value [key=autoredirect].")
  70. return
  71. }
  72. //get the LDAP config from db
  73. BindUsername := ldap.readSingleConfig("BindUsername")
  74. BindPassword := ldap.readSingleConfig("BindPassword")
  75. FQDN := ldap.readSingleConfig("FQDN")
  76. BaseDN := ldap.readSingleConfig("BaseDN")
  77. //marshall it and return
  78. config, err := json.Marshal(Config{
  79. Enabled: enabled,
  80. AutoRedirect: autoredirect,
  81. BindUsername: BindUsername,
  82. BindPassword: BindPassword,
  83. FQDN: FQDN,
  84. BaseDN: BaseDN,
  85. })
  86. if err != nil {
  87. empty, err := json.Marshal(Config{})
  88. if err != nil {
  89. common.SendErrorResponse(w, "Error while marshalling config")
  90. }
  91. common.SendJSONResponse(w, string(empty))
  92. }
  93. common.SendJSONResponse(w, string(config))
  94. }
  95. func (ldap *ldapHandler) WriteConfig(w http.ResponseWriter, r *http.Request) {
  96. enabled, err := common.Mv(r, "enabled", true)
  97. if err != nil {
  98. common.SendErrorResponse(w, "enabled field can't be empty")
  99. return
  100. }
  101. autoredirect, err := common.Mv(r, "autoredirect", true)
  102. if err != nil {
  103. common.SendErrorResponse(w, "enabled field can't be empty")
  104. return
  105. }
  106. //allow empty fields if enabled is false
  107. showError := true
  108. if enabled != "true" {
  109. showError = false
  110. }
  111. //four fields to store the LDAP authentication information
  112. BindUsername, err := common.Mv(r, "bind_username", true)
  113. if err != nil {
  114. if showError {
  115. common.SendErrorResponse(w, "bind_username field can't be empty")
  116. return
  117. }
  118. }
  119. BindPassword, err := common.Mv(r, "bind_password", true)
  120. if err != nil {
  121. if showError {
  122. common.SendErrorResponse(w, "bind_password field can't be empty")
  123. return
  124. }
  125. }
  126. FQDN, err := common.Mv(r, "fqdn", true)
  127. if err != nil {
  128. if showError {
  129. common.SendErrorResponse(w, "fqdn field can't be empty")
  130. return
  131. }
  132. }
  133. BaseDN, err := common.Mv(r, "base_dn", true)
  134. if err != nil {
  135. if showError {
  136. common.SendErrorResponse(w, "base_dn field can't be empty")
  137. return
  138. }
  139. }
  140. ldap.coredb.Write("ldap", "enabled", enabled)
  141. ldap.coredb.Write("ldap", "autoredirect", autoredirect)
  142. ldap.coredb.Write("ldap", "BindUsername", BindUsername)
  143. ldap.coredb.Write("ldap", "BindPassword", BindPassword)
  144. ldap.coredb.Write("ldap", "FQDN", FQDN)
  145. ldap.coredb.Write("ldap", "BaseDN", BaseDN)
  146. //update the new authencation infromation
  147. ldap.ldapreader = ldapreader.NewLDAPReader(BindUsername, BindPassword, FQDN, BaseDN)
  148. common.SendOK(w)
  149. }
  150. func (handler *ldapHandler) SyncInformation() {
  151. result, _ := handler.ldapreader.GetAllUser()
  152. for _, v := range result {
  153. v.PrettyPrint(4)
  154. }
  155. }