Encrypted messaging app
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
2.4 KiB

  1. package Auth
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "time"
  6. "git.tovijaeschke.xyz/tovi/Envelope/Backend/Database"
  7. "git.tovijaeschke.xyz/tovi/Envelope/Backend/Models"
  8. "github.com/gofrs/uuid"
  9. )
  10. type Credentials struct {
  11. Username string `json:"username"`
  12. Password string `json:"password"`
  13. }
  14. type loginResponse struct {
  15. Status string `json:"status"`
  16. Message string `json:"message"`
  17. AsymmetricPublicKey string `json:"asymmetric_public_key"`
  18. AsymmetricPrivateKey string `json:"asymmetric_private_key"`
  19. }
  20. func makeLoginResponse(w http.ResponseWriter, code int, message, pubKey, privKey string) {
  21. var (
  22. status string = "error"
  23. returnJson []byte
  24. err error
  25. )
  26. if code > 200 && code < 300 {
  27. status = "success"
  28. }
  29. returnJson, err = json.MarshalIndent(loginResponse{
  30. Status: status,
  31. Message: message,
  32. AsymmetricPublicKey: pubKey,
  33. AsymmetricPrivateKey: privKey,
  34. }, "", " ")
  35. if err != nil {
  36. http.Error(w, "Error", http.StatusInternalServerError)
  37. w.WriteHeader(http.StatusInternalServerError)
  38. return
  39. }
  40. // Return updated json
  41. w.WriteHeader(code)
  42. w.Write(returnJson)
  43. }
  44. func Login(w http.ResponseWriter, r *http.Request) {
  45. var (
  46. creds Credentials
  47. userData Models.User
  48. sessionToken uuid.UUID
  49. expiresAt time.Time
  50. err error
  51. )
  52. err = json.NewDecoder(r.Body).Decode(&creds)
  53. if err != nil {
  54. makeLoginResponse(w, http.StatusInternalServerError, "An error occurred", "", "")
  55. return
  56. }
  57. userData, err = Database.GetUserByUsername(creds.Username)
  58. if err != nil {
  59. makeLoginResponse(w, http.StatusUnauthorized, "An error occurred", "", "")
  60. return
  61. }
  62. if !CheckPasswordHash(creds.Password, userData.Password) {
  63. makeLoginResponse(w, http.StatusUnauthorized, "An error occurred", "", "")
  64. return
  65. }
  66. sessionToken, err = uuid.NewV4()
  67. if err != nil {
  68. makeLoginResponse(w, http.StatusInternalServerError, "An error occurred", "", "")
  69. return
  70. }
  71. expiresAt = time.Now().Add(1 * time.Hour)
  72. Sessions[sessionToken.String()] = Session{
  73. UserID: userData.ID.String(),
  74. Username: userData.Username,
  75. Expiry: expiresAt,
  76. }
  77. http.SetCookie(w, &http.Cookie{
  78. Name: "session_token",
  79. Value: sessionToken.String(),
  80. Expires: expiresAt,
  81. })
  82. makeLoginResponse(
  83. w,
  84. http.StatusOK,
  85. "Successfully logged in",
  86. userData.AsymmetricPublicKey,
  87. userData.AsymmetricPrivateKey,
  88. )
  89. }