server.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package sso
  2. import (
  3. "context"
  4. "net/http"
  5. "strconv"
  6. "time"
  7. "imuslab.com/zoraxy/mod/utils"
  8. )
  9. /*
  10. server.go
  11. This is the router for the SSO authentication interface
  12. */
  13. func (h *SSOHandler) InitSSOPortal(portalServerPort int) {
  14. //Create a new web server for the SSO portal
  15. pmux := http.NewServeMux()
  16. fs := http.FileServer(http.FS(staticFiles))
  17. pmux.Handle("/", fs)
  18. //Register API endpoint for the SSO portal
  19. pmux.HandleFunc("/login", h.HandleLogin)
  20. //Add more API endpoints here
  21. h.ssoPortalMux = pmux
  22. }
  23. // StartSSOPortal start the SSO portal server
  24. func (h *SSOHandler) StartSSOPortal() error {
  25. h.ssoPortalServer = &http.Server{
  26. Addr: ":" + strconv.Itoa(h.Config.PortalServerPort),
  27. Handler: h.ssoPortalMux,
  28. }
  29. err := h.ssoPortalServer.ListenAndServe()
  30. if err != nil {
  31. h.Log("Failed to start SSO portal server", err)
  32. }
  33. return err
  34. }
  35. // StopSSOPortal stop the SSO portal server
  36. func (h *SSOHandler) StopSSOPortal() error {
  37. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  38. defer cancel()
  39. err := h.ssoPortalServer.Shutdown(ctx)
  40. if err != nil {
  41. h.Log("Failed to stop SSO portal server", err)
  42. return err
  43. }
  44. return nil
  45. }
  46. // HandleLogin handle the login request
  47. func (h *SSOHandler) HandleLogin(w http.ResponseWriter, r *http.Request) {
  48. //Handle the login request
  49. username, err := utils.PostPara(r, "username")
  50. if err != nil {
  51. utils.SendErrorResponse(w, "invalid username or password")
  52. return
  53. }
  54. password, err := utils.PostPara(r, "password")
  55. if err != nil {
  56. utils.SendErrorResponse(w, "invalid username or password")
  57. return
  58. }
  59. rememberMe, err := utils.PostBool(r, "remember_me")
  60. if err != nil {
  61. rememberMe = false
  62. }
  63. //Check if the user exists
  64. userEntry, err := h.SSO_GetUser(username)
  65. if err != nil {
  66. utils.SendErrorResponse(w, "user not found")
  67. return
  68. }
  69. //Check if the password is correct
  70. if !userEntry.VerifyPassword(password) {
  71. utils.SendErrorResponse(w, "incorrect password")
  72. return
  73. }
  74. //Create a new session for the user
  75. session, _ := h.cookieStore.Get(r, "Zoraxy-SSO")
  76. session.Values["username"] = username
  77. if rememberMe {
  78. session.Options.MaxAge = 86400 * 15 //15 days
  79. } else {
  80. session.Options.MaxAge = 3600 //1 hour
  81. }
  82. session.Save(r, w) //Save the session
  83. utils.SendOK(w)
  84. }