main.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. package main
  2. import (
  3. "github.com/kataras/iris"
  4. "github.com/kataras/go-template/html"
  5. "fmt"
  6. "git.mmnx.de/Moe/usermanager"
  7. "git.mmnx.de/Moe/databaseutils"
  8. "git.mmnx.de/Moe/configutils"
  9. "git.mmnx.de/Moe/templatehelpers"
  10. "golang.org/x/crypto/bcrypt"
  11. // "errors"
  12. "strconv"
  13. )
  14. type pageUserParams struct { // TODO outsource
  15. HasError string
  16. Error string
  17. ReqDir string
  18. Username string
  19. Email string
  20. Admin string
  21. }
  22. func main() {
  23. conf := configutils.ReadConfig("config.json") // read config
  24. configutils.Conf = &conf // store conf globally accessible
  25. databaseutils.DBUtil = &databaseutils.DBUtils{configutils.Conf.DBUser, configutils.Conf.DBPass, configutils.Conf.DBHost, configutils.Conf.DBName, nil} // init dbutils
  26. databaseutils.DBUtil.Connect() // connect to db
  27. users := make([]usermanager.User, 0) // users list
  28. usermanager.Users = &users // store globally accessible
  29. fmt.Print("") // for not needing to remove fmt ...
  30. iris.Config.IsDevelopment = true
  31. //iris.Config.Render.Template.Gzip = true
  32. /** HELPER FUNCTION EXAMPLE **/
  33. /*config := html.DefaultConfig()
  34. config.Layout = "layouts/main.html"
  35. config.Helpers["boldme"] = func(input string) raymond.SafeString {
  36. return raymond.SafeString("<b> " + input + "</b>")
  37. }*/
  38. /** ROUTING **/
  39. iris.UseTemplate(html.New(html.Config{ // main layout for all pages (like a wrapper for boxes we register downwards)
  40. Layout: "layouts/main.html",
  41. }))
  42. iris.Static("/js", "./static/js", 1) // make js files in static/js available via /js
  43. iris.Static("/css", "./static/css", 1)
  44. iris.Static("/img", "./static/img", 1)
  45. iris.Static("/static", "./static/static", 1)
  46. iris.Post("/login", loginHandler) // login form handler
  47. iris.Post("/register", registerHandler, usermanager.LogoutHandler) // handles registration, logs user out
  48. iris.Post("/account", usermanager.AuthHandler, accountUpdateHandler, usermanager.LogoutHandler) // account management
  49. iris.Post("/admin", usermanager.AuthHandler, usermanager.AdminHandler, adminPostHandler) // admin panel
  50. iris.Get("/login", templateHandler) // TODO not when logged in
  51. iris.Get("/logout", usermanager.AuthHandler, usermanager.LogoutHandler)
  52. iris.Get("/register", templateHandler) // TODO not when logged in
  53. iris.Get("/", usermanager.AuthHandler, templateHandler)
  54. iris.Get("/account", usermanager.AuthHandler, templateHandler)
  55. iris.Get("/help", usermanager.AuthHandler, templateHandler)
  56. iris.Get("/admin", usermanager.AuthHandler, usermanager.AdminHandler, templateHandler)
  57. /** OTHER **/
  58. iris.Listen(":8080")
  59. }
  60. func loginHandler(ctx *iris.Context) {
  61. username := ctx.FormValueString("username") // POST values from login form
  62. password := ctx.FormValueString("password")
  63. user := usermanager.User{} // new user
  64. tokenString, err := user.Login(username, password) // try to login
  65. if err != nil {
  66. templatehelpers.ShowError(err.Error(), ctx, "login")
  67. } else {
  68. ctx.SetCookieKV("token", tokenString)
  69. templatehelpers.ShowNotification("Login successfull", ctx, "home")
  70. }
  71. }
  72. func registerHandler(ctx *iris.Context) { // TODO outsource
  73. token := ctx.FormValueString("token") // POST values from login form
  74. username := ctx.FormValueString("username")
  75. password := ctx.FormValueString("password")
  76. user := usermanager.User{} // new user
  77. tokenUserID, err := usermanager.SearchUserByTokenInDB(token) // user, we're going to change
  78. if err != nil {
  79. templatehelpers.ShowError(err.Error(), ctx, "register")
  80. return
  81. }
  82. tokenUserIDStr := strconv.FormatInt(int64(tokenUserID), 10)
  83. if err != nil {
  84. templatehelpers.ShowError(err.Error(), ctx, "register")
  85. return
  86. }
  87. tokenUser, err := usermanager.GetUserFromDB(tokenUserIDStr)
  88. if err != nil {
  89. templatehelpers.ShowError(err.Error(), ctx, "register")
  90. return
  91. }
  92. unusedTokens := usermanager.GetTokens(false) // get all unused tokens
  93. usedTokens := usermanager.GetTokens(true) // get all used tokens
  94. unusedToken := usermanager.IsTokenUsed(unusedTokens, token)
  95. usedToken := usermanager.IsTokenUsed(usedTokens, token)
  96. if !unusedToken && !usedToken { // token doesnt exist
  97. templatehelpers.ShowError(usermanager.ERR_INVALID_TOKEN, ctx, "register")
  98. }
  99. userID := usermanager.SearchUserByUsernameInDB(username) // check if a user with that name already exists
  100. if userID != -1 {
  101. tokenUserIDInt, err := strconv.Atoi(tokenUser.ID) // convert userID to int ...
  102. if err != nil {
  103. templatehelpers.ShowError(err.Error(), ctx, "register")
  104. return
  105. }
  106. if userID != tokenUserIDInt { // tries to steal another users identity
  107. templatehelpers.ShowError(usermanager.ERR_USERNAME_TAKEN, ctx, "register")
  108. return
  109. } // if it's his own name, that's "taken" he can change
  110. }
  111. if unusedToken {
  112. passwordBin, _ := bcrypt.GenerateFromPassword([]byte(password), 15) // hash password
  113. err := usermanager.RegisterUserWithToken(username, string(passwordBin), token) // register user
  114. if err != nil {
  115. templatehelpers.ShowError(err.Error(), ctx, "register")
  116. return
  117. }
  118. tokenString, err := user.Login(username, password) // try to login
  119. if err != nil {
  120. templatehelpers.ShowError(err.Error(), ctx, "login")
  121. } else {
  122. ctx.SetCookieKV("token", tokenString)
  123. templatehelpers.ShowNotification("registration successfull", ctx, "home")
  124. }
  125. } else {
  126. if err := usermanager.UserUpdateProcessor(username, password, tokenUserIDStr); err != nil {
  127. templatehelpers.ShowError(err.Error(), ctx, "register")
  128. return
  129. } else {
  130. tokenString, err := user.Login(username, password) // try to login with new data
  131. if err != nil {
  132. templatehelpers.ShowError(err.Error(), ctx, "login")
  133. }
  134. ctx.SetCookieKV("token", tokenString)
  135. templatehelpers.ShowNotification("reset successfull", ctx, "home")
  136. }
  137. }
  138. }
  139. func accountUpdateHandler(ctx *iris.Context) {
  140. username := ctx.FormValueString("username") // POST values
  141. password := ctx.FormValueString("password")
  142. userID := ctx.GetString("userID")
  143. if err := usermanager.UserUpdateProcessor(username, password, userID); err != nil {
  144. templatehelpers.ShowError(err.Error(), ctx, "account")
  145. return
  146. }
  147. templatehelpers.ShowNotification("updated successfull", ctx, "account")
  148. }
  149. func adminPostHandler(ctx *iris.Context) {
  150. _ = usermanager.GenerateTokens(5) // generate tokens and store in db, we don't need them now
  151. templatehelpers.ShowNotification("tokens generated", ctx, "admin")
  152. }
  153. func templateHandler(ctx *iris.Context) {
  154. var params usermanager.PageUserParams
  155. userID := ctx.GetString("userID")
  156. user, err := usermanager.GetUser(userID)
  157. if err != nil {
  158. if err.Error() != "User not logged in" {
  159. fmt.Println(err.Error())
  160. }
  161. }
  162. template := ""
  163. switch ctx.RequestPath(false) {
  164. default:
  165. template = "home"
  166. params = usermanager.PageUserParams{"0", "", template, user.Username, user.Admin, []string{}}
  167. case "/":
  168. template = "home"
  169. params = usermanager.PageUserParams{"0", "", template, user.Username, user.Admin, []string{}}
  170. case "/account":
  171. template = "account"
  172. params = usermanager.PageUserParams{"0", "", template, user.Username, user.Admin, []string{}}
  173. case "/help":
  174. template = "help"
  175. params = usermanager.PageUserParams{"0", "", template, user.Username, user.Admin, []string{}}
  176. case "/admin":
  177. template = "admin"
  178. tokens := usermanager.GetTokens(false)
  179. params = usermanager.PageUserParams{"0", "", template, user.Username, user.Admin, tokens}
  180. case "/login":
  181. template = "login"
  182. params = usermanager.PageUserParams{"0", "", template, "", "0", []string{}}
  183. case "/register":
  184. template = "register"
  185. params = usermanager.PageUserParams{"0", "", template, "", "0", []string{}}
  186. }
  187. ctx.MustRender(template + "_box.html", params);
  188. }