web_login.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. package ldap
  2. import (
  3. "encoding/json"
  4. "log"
  5. "net/http"
  6. "strconv"
  7. "imuslab.com/arozos/mod/utils"
  8. )
  9. //LOGIN related function
  10. //functions basically same as arozos's original function
  11. func (ldap *ldapHandler) HandleLoginPage(w http.ResponseWriter, r *http.Request) {
  12. checkLDAPenabled := ldap.readSingleConfig("enabled")
  13. if checkLDAPenabled == "false" {
  14. utils.SendTextResponse(w, "LDAP not enabled.")
  15. return
  16. }
  17. //load the template from file and inject necessary variables
  18. red, _ := utils.Mv(r, "redirect", false)
  19. //Append the redirection addr into the template
  20. imgsrc := "./web/" + ldap.iconSystem
  21. if !utils.FileExists(imgsrc) {
  22. imgsrc = "./web/img/public/auth_icon.png"
  23. }
  24. imageBase64, _ := utils.LoadImageAsBase64(imgsrc)
  25. parsedPage, err := utils.Templateload("web/login.system", map[string]interface{}{
  26. "redirection_addr": red,
  27. "usercount": strconv.Itoa(ldap.ag.GetUserCounts()),
  28. "service_logo": imageBase64,
  29. "login_addr": "system/auth/ldap/login",
  30. })
  31. if err != nil {
  32. panic("Error. Unable to parse login page. Is web directory data exists?")
  33. }
  34. w.Header().Add("Content-Type", "text/html; charset=UTF-8")
  35. w.Write([]byte(parsedPage))
  36. }
  37. func (ldap *ldapHandler) HandleNewPasswordPage(w http.ResponseWriter, r *http.Request) {
  38. checkLDAPenabled := ldap.readSingleConfig("enabled")
  39. if checkLDAPenabled == "false" {
  40. utils.SendTextResponse(w, "LDAP not enabled.")
  41. return
  42. }
  43. //get the parameter from the request
  44. acc, err := utils.Mv(r, "username", false)
  45. if err != nil {
  46. utils.SendErrorResponse(w, err.Error())
  47. return
  48. }
  49. displayname, err := utils.Mv(r, "displayname", false)
  50. if err != nil {
  51. utils.SendErrorResponse(w, err.Error())
  52. return
  53. }
  54. key, err := utils.Mv(r, "authkey", false)
  55. if err != nil {
  56. utils.SendErrorResponse(w, err.Error())
  57. return
  58. }
  59. //init the web interface
  60. imgsrc := "./web/" + ldap.iconSystem
  61. if !utils.FileExists(imgsrc) {
  62. imgsrc = "./web/img/public/auth_icon.png"
  63. }
  64. imageBase64, _ := utils.LoadImageAsBase64(imgsrc)
  65. template, err := utils.Templateload("system/ldap/newPasswordTemplate.html", map[string]interface{}{
  66. "vendor_logo": imageBase64,
  67. "username": acc,
  68. "display_name": displayname,
  69. "key": key,
  70. })
  71. if err != nil {
  72. log.Fatal(err)
  73. }
  74. w.Header().Set("Content-Type", "text/html; charset=UTF-8")
  75. w.Write([]byte(template))
  76. }
  77. func (ldap *ldapHandler) HandleLogin(w http.ResponseWriter, r *http.Request) {
  78. checkLDAPenabled := ldap.readSingleConfig("enabled")
  79. if checkLDAPenabled == "false" {
  80. utils.SendTextResponse(w, "LDAP not enabled.")
  81. return
  82. }
  83. //Get username from request using POST mode
  84. username, err := utils.Mv(r, "username", true)
  85. if err != nil {
  86. //Username not defined
  87. log.Println("[System Auth] Someone trying to login with username: " + username)
  88. //Write to log
  89. ldap.ag.Logger.LogAuth(r, false)
  90. utils.SendErrorResponse(w, "Username not defined or empty.")
  91. return
  92. }
  93. //Get password from request using POST mode
  94. password, err := utils.Mv(r, "password", true)
  95. if err != nil {
  96. //Password not defined
  97. ldap.ag.Logger.LogAuth(r, false)
  98. utils.SendErrorResponse(w, "Password not defined or empty.")
  99. return
  100. }
  101. //Get rememberme settings
  102. rememberme := false
  103. rmbme, _ := utils.Mv(r, "rmbme", true)
  104. if rmbme == "true" {
  105. rememberme = true
  106. }
  107. //Check the database and see if this user is in the database
  108. passwordCorrect, err := ldap.ldapreader.Authenticate(username, password)
  109. if err != nil {
  110. ldap.ag.Logger.LogAuth(r, false)
  111. utils.SendErrorResponse(w, "Unable to connect to LDAP server")
  112. log.Println("LDAP Authentication error, " + err.Error())
  113. return
  114. }
  115. //The database contain this user information. Check its password if it is correct
  116. if passwordCorrect {
  117. //Password correct
  118. //if user not exist then redirect to create pwd screen
  119. if !ldap.ag.UserExists(username) {
  120. authkey := ldap.syncdb.Store(username)
  121. utils.SendJSONResponse(w, "{\"redirect\":\"system/auth/ldap/newPassword?username="+username+"&displayname="+username+"&authkey="+authkey+"\"}")
  122. } else {
  123. // Set user as authenticated
  124. ldap.ag.LoginUserByRequest(w, r, username, rememberme)
  125. //Print the login message to console
  126. log.Println(username + " logged in.")
  127. ldap.ag.Logger.LogAuth(r, true)
  128. utils.SendOK(w)
  129. }
  130. } else {
  131. //Password incorrect
  132. log.Println(username + " has entered an invalid username or password")
  133. utils.SendErrorResponse(w, "Invalid username or password")
  134. ldap.ag.Logger.LogAuth(r, false)
  135. return
  136. }
  137. }
  138. func (ldap *ldapHandler) HandleSetPassword(w http.ResponseWriter, r *http.Request) {
  139. checkLDAPenabled := ldap.readSingleConfig("enabled")
  140. if checkLDAPenabled == "false" {
  141. utils.SendTextResponse(w, "LDAP not enabled.")
  142. return
  143. }
  144. //get paramters from request
  145. username, err := utils.Mv(r, "username", true)
  146. if err != nil {
  147. utils.SendErrorResponse(w, err.Error())
  148. return
  149. }
  150. password, err := utils.Mv(r, "password", true)
  151. if err != nil {
  152. utils.SendErrorResponse(w, err.Error())
  153. return
  154. }
  155. authkey, err := utils.Mv(r, "authkey", true)
  156. if err != nil {
  157. utils.SendErrorResponse(w, err.Error())
  158. return
  159. }
  160. //check if the input key matches the database's username
  161. isValid := ldap.syncdb.Read(authkey) == username
  162. ldap.syncdb.Delete(authkey) // remove the key, aka key is one time use only
  163. //if db data match the username, proceed
  164. if isValid {
  165. //if not exists
  166. if !ldap.ag.UserExists(username) {
  167. //get the user from ldap server
  168. ldapUser, err := ldap.ldapreader.GetUser(username)
  169. if err != nil {
  170. utils.SendErrorResponse(w, err.Error())
  171. return
  172. }
  173. //convert the ldap usergroup to arozos usergroup
  174. convertedInfo := ldap.convertGroup(ldapUser)
  175. //create user account and login
  176. ldap.ag.CreateUserAccount(username, password, convertedInfo.EquivGroup)
  177. ldap.ag.Logger.LogAuth(r, true)
  178. ldap.ag.LoginUserByRequest(w, r, username, false)
  179. utils.SendOK(w)
  180. return
  181. } else {
  182. //if exist then return error
  183. utils.SendErrorResponse(w, "User exists, please contact the system administrator if you believe this is an error.")
  184. return
  185. }
  186. } else {
  187. utils.SendErrorResponse(w, "Improper key detected")
  188. log.Println(r.RemoteAddr + " attempted to use invaild key to create new user but failed")
  189. return
  190. }
  191. }
  192. //HandleCheckLDAP check if ldap is enabled
  193. func (ldap *ldapHandler) HandleCheckLDAP(w http.ResponseWriter, r *http.Request) {
  194. enabledB := false
  195. enabled := ldap.readSingleConfig("enabled")
  196. if enabled == "true" {
  197. enabledB = true
  198. }
  199. type returnFormat struct {
  200. Enabled bool `json:"enabled"`
  201. }
  202. json, err := json.Marshal(returnFormat{Enabled: enabledB})
  203. if err != nil {
  204. utils.SendErrorResponse(w, "Error occurred while marshalling JSON response")
  205. }
  206. utils.SendJSONResponse(w, string(json))
  207. }