- package Auth
-
- import (
- "database/sql/driver"
- "encoding/json"
- "fmt"
- "net/http"
- "time"
-
- "git.tovijaeschke.xyz/tovi/Envelope/Backend/Database"
- "git.tovijaeschke.xyz/tovi/Envelope/Backend/Models"
- )
-
- type credentials struct {
- Username string `json:"username"`
- Password string `json:"password"`
- }
-
- type loginResponse struct {
- UserID string `json:"user_id"`
- Username string `json:"username"`
- AsymmetricPublicKey string `json:"asymmetric_public_key"`
- AsymmetricPrivateKey string `json:"asymmetric_private_key"`
- SymmetricKey string `json:"symmetric_key"`
- MessageExpiryDefault string `json:"message_expiry_default"`
- ImageLink string `json:"image_link"`
- }
-
- // Login logs the user into the system
- func Login(w http.ResponseWriter, r *http.Request) {
- var (
- creds credentials
- user Models.User
- session Models.Session
- expiresAt time.Time
- messageExpiryRaw driver.Value
- messageExpiry string
- imageLink string
- returnJSON []byte
- err error
- )
-
- err = json.NewDecoder(r.Body).Decode(&creds)
- if err != nil {
- http.Error(w, "Unauthorized", http.StatusUnauthorized)
- return
- }
-
- user, err = Database.GetUserByUsername(creds.Username)
- if err != nil {
- http.Error(w, "Unauthorized", http.StatusUnauthorized)
- return
- }
-
- if !CheckPasswordHash(creds.Password, user.Password) {
- http.Error(w, "Unauthorized", http.StatusUnauthorized)
- return
- }
-
- // TODO: Revisit before production
- expiresAt = time.Now().Add(12 * time.Hour)
-
- session = Models.Session{
- UserID: user.ID,
- Expiry: expiresAt,
- }
-
- err = Database.CreateSession(&session)
- if err != nil {
- http.Error(w, "Unauthorized", http.StatusUnauthorized)
- return
- }
-
- http.SetCookie(w, &http.Cookie{
- Name: "session_token",
- Value: session.ID.String(),
- Expires: expiresAt,
- })
-
- if user.AttachmentID != nil {
- imageLink = fmt.Sprintf(
- "http://192.168.1.5:8080/files/%s",
- user.Attachment.FilePath,
- )
- }
-
- messageExpiryRaw, _ = user.MessageExpiryDefault.Value()
- messageExpiry, _ = messageExpiryRaw.(string)
-
- returnJSON, err = json.MarshalIndent(loginResponse{
- UserID: user.ID.String(),
- Username: user.Username,
- AsymmetricPublicKey: user.AsymmetricPublicKey,
- AsymmetricPrivateKey: user.AsymmetricPrivateKey,
- SymmetricKey: user.SymmetricKey,
- MessageExpiryDefault: messageExpiry,
- ImageLink: imageLink,
- }, "", " ")
-
- if err != nil {
- http.Error(w, "Unauthorized", http.StatusUnauthorized)
- return
- }
-
- // Return updated json
- w.WriteHeader(http.StatusOK)
- w.Write(returnJSON)
- }
|