register.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. package register
  2. /*
  3. Register Module
  4. author: tobychui
  5. Register interface handler
  6. */
  7. import (
  8. "bufio"
  9. "encoding/base64"
  10. "encoding/json"
  11. "errors"
  12. "io/ioutil"
  13. "log"
  14. "net/http"
  15. "os"
  16. "strings"
  17. "github.com/valyala/fasttemplate"
  18. auth "imuslab.com/arozos/mod/auth"
  19. db "imuslab.com/arozos/mod/database"
  20. permission "imuslab.com/arozos/mod/permission"
  21. )
  22. type RegisterOptions struct {
  23. Hostname string
  24. VendorIcon string
  25. }
  26. type RegisterHandler struct {
  27. database *db.Database
  28. authAgent *auth.AuthAgent
  29. permissionHandler *permission.PermissionHandler
  30. options RegisterOptions
  31. DefaultUserGroup string
  32. AllowRegistry bool
  33. }
  34. func NewRegisterHandler(database *db.Database, authAgent *auth.AuthAgent, ph *permission.PermissionHandler, options RegisterOptions) *RegisterHandler {
  35. //Create the database for registration
  36. database.NewTable("register")
  37. //Check if the default group has been set. If not a new usergroup
  38. defaultUserGroup := ""
  39. if database.KeyExists("register", "defaultGroup") {
  40. //Use the configured default group
  41. database.Read("register", "defaultGroup", &defaultUserGroup)
  42. //Check the group exists
  43. if !ph.GroupExists(defaultUserGroup) {
  44. //Group not exists. Create default group.
  45. if !ph.GroupExists("default") {
  46. createDefaultGroup(ph)
  47. }
  48. defaultUserGroup = "default"
  49. }
  50. } else {
  51. //Default group not set or not exists. Create a new default group
  52. if !ph.GroupExists("default") {
  53. createDefaultGroup(ph)
  54. }
  55. defaultUserGroup = "default"
  56. }
  57. return &RegisterHandler{
  58. database: database,
  59. options: options,
  60. permissionHandler: ph,
  61. authAgent: authAgent,
  62. DefaultUserGroup: defaultUserGroup,
  63. AllowRegistry: true,
  64. }
  65. }
  66. //Create the default usergroup used by new users
  67. func createDefaultGroup(ph *permission.PermissionHandler) {
  68. //Default storage space: 15GB
  69. ph.NewPermissionGroup("default", false, 15<<30, []string{}, "Desktop")
  70. }
  71. func (h *RegisterHandler) HandleRegisterCheck(w http.ResponseWriter, r *http.Request) {
  72. if h.AllowRegistry {
  73. sendJSONResponse(w, "true")
  74. } else {
  75. sendJSONResponse(w, "false")
  76. }
  77. }
  78. //Handle and serve the register itnerface
  79. func (h *RegisterHandler) HandleRegisterInterface(w http.ResponseWriter, r *http.Request) {
  80. //Serve the register interface
  81. if h.AllowRegistry {
  82. template, err := ioutil.ReadFile("system/auth/register.system")
  83. if err != nil {
  84. log.Println("Template not found: system/auth/register.system")
  85. http.NotFound(w, r)
  86. return
  87. }
  88. //Load the vendor icon as base64
  89. imagecontent, _ := readImageFileAsBase64(h.options.VendorIcon)
  90. //Apply templates
  91. t := fasttemplate.New(string(template), "{{", "}}")
  92. s := t.ExecuteString(map[string]interface{}{
  93. "host_name": h.options.Hostname,
  94. "vendor_logo": imagecontent,
  95. })
  96. w.Write([]byte(s))
  97. } else {
  98. //Registry is closed
  99. http.NotFound(w, r)
  100. }
  101. }
  102. func readImageFileAsBase64(src string) (string, error) {
  103. f, err := os.Open(src)
  104. if err != nil {
  105. return "", err
  106. }
  107. reader := bufio.NewReader(f)
  108. content, err := ioutil.ReadAll(reader)
  109. if err != nil {
  110. return "", err
  111. }
  112. encoded := base64.StdEncoding.EncodeToString(content)
  113. return encoded, nil
  114. }
  115. //Get the default usergroup for this register handler
  116. func (h *RegisterHandler) GetDefaultUserGroup() string {
  117. return h.DefaultUserGroup
  118. }
  119. //Set the default usergroup for this register handler
  120. func (h *RegisterHandler) SetDefaultUserGroup(groupname string) error {
  121. if !h.permissionHandler.GroupExists(groupname) {
  122. return errors.New("Group not exists")
  123. }
  124. //Update the default registry in struct
  125. h.DefaultUserGroup = groupname
  126. //Write change to database
  127. h.database.Write("register", "defaultGroup", groupname)
  128. return nil
  129. }
  130. //Toggle registry on the fly
  131. func (h *RegisterHandler) SetAllowRegistry(allow bool) {
  132. h.AllowRegistry = allow
  133. }
  134. //Clearn Register information by removing all users info whose account is no longer registered
  135. func (h *RegisterHandler) CleanRegisters() {
  136. entries, _ := h.database.ListTable("register")
  137. for _, keypairs := range entries {
  138. if strings.Contains(string(keypairs[0]), "user/email/") {
  139. c := strings.Split(string(keypairs[0]), "/")
  140. //Get username and emails
  141. username := c[len(c)-1]
  142. if !h.authAgent.UserExists(username) {
  143. //Delete this record
  144. h.database.Delete("register", string(keypairs[0]))
  145. }
  146. }
  147. }
  148. }
  149. func (h *RegisterHandler) ListAllUserEmails() [][]interface{} {
  150. results := [][]interface{}{}
  151. entries, _ := h.database.ListTable("register")
  152. for _, keypairs := range entries {
  153. if strings.Contains(string(keypairs[0]), "user/email/") {
  154. c := strings.Split(string(keypairs[0]), "/")
  155. //Get username and emails
  156. username := c[len(c)-1]
  157. email := ""
  158. json.Unmarshal(keypairs[1], &email)
  159. //Check if the user still registered in the system
  160. userStillRegistered := h.authAgent.UserExists(username)
  161. results = append(results, []interface{}{username, email, userStillRegistered})
  162. }
  163. }
  164. return results
  165. }
  166. //Handle the request for creating a new user
  167. func (h *RegisterHandler) HandleRegisterRequest(w http.ResponseWriter, r *http.Request) {
  168. if h.AllowRegistry == false {
  169. sendErrorResponse(w, "Public account registry is currently closed")
  170. return
  171. }
  172. //Get input paramter
  173. email, err := mv(r, "email", true)
  174. if err != nil {
  175. sendErrorResponse(w, "Invalid Email")
  176. return
  177. }
  178. username, err := mv(r, "username", true)
  179. if username == "" || strings.TrimSpace(username) == "" || err != nil {
  180. sendErrorResponse(w, "Invalid Username")
  181. return
  182. }
  183. password, err := mv(r, "password", true)
  184. if password == "" || err != nil {
  185. sendErrorResponse(w, "Invalid Password")
  186. return
  187. }
  188. //Check if password too short
  189. if len(password) < 8 {
  190. sendErrorResponse(w, "Password too short. Must be at least 8 characters.")
  191. return
  192. }
  193. //Check if the username is too short
  194. if len(username) < 2 {
  195. sendErrorResponse(w, "Username too short. Must be at least 2 characters.")
  196. return
  197. }
  198. //Check if the user already exists
  199. if h.authAgent.UserExists(username) {
  200. sendErrorResponse(w, "This username has already been used")
  201. return
  202. }
  203. //Get the default user group for public registration
  204. defaultGroup := h.DefaultUserGroup
  205. if h.permissionHandler.GroupExists(defaultGroup) == false {
  206. //Public registry user group not exists. Raise 500 Error
  207. log.Println("[CRITICAL] PUBLIC REGISTRY USER GROUP NOT FOUND! PLEASE RESTART YOUR SYSTEM!")
  208. sendErrorResponse(w, "Internal Server Error")
  209. return
  210. }
  211. //OK. Record this user to the system
  212. err = h.authAgent.CreateUserAccount(username, password, []string{defaultGroup})
  213. if err != nil {
  214. sendErrorResponse(w, err.Error())
  215. return
  216. }
  217. //Write email to database as well
  218. h.database.Write("register", "user/email/"+username, email)
  219. sendOK(w)
  220. log.Println("New User Registered: ", email, username, strings.Repeat("*", len(password)))
  221. }