From f085f2e271f9f0f1b2bf6e8d5a7d59742ff01ece Mon Sep 17 00:00:00 2001 From: LandaMm Date: Wed, 11 Jun 2025 18:47:45 +0200 Subject: [PATCH] feat: create user session --- internal/auth/login.go | 52 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/internal/auth/login.go b/internal/auth/login.go index cab16a6..c5993e7 100644 --- a/internal/auth/login.go +++ b/internal/auth/login.go @@ -2,11 +2,15 @@ package auth import ( "encoding/json" + "fmt" "log" "net/http" + "gitea.local/admin/hspguard/internal/repository" + "gitea.local/admin/hspguard/internal/types" "gitea.local/admin/hspguard/internal/util" "gitea.local/admin/hspguard/internal/web" + "github.com/avct/uasurfer" ) type LoginParams struct { @@ -47,6 +51,50 @@ func (h *AuthHandler) login(w http.ResponseWriter, r *http.Request) { return } + userAgent := r.UserAgent() + + var deviceInfo types.DeviceInfo + + parsed := uasurfer.Parse(userAgent) + + deviceInfo.Browser = parsed.Browser.Name.StringTrimPrefix() + deviceInfo.BrowserVersion = fmt.Sprintf("%d.%d.%d", parsed.Browser.Version.Major, parsed.Browser.Version.Minor, parsed.Browser.Version.Patch) + deviceInfo.DeviceName = fmt.Sprintf("%s %s", parsed.OS.Platform.StringTrimPrefix(), parsed.OS.Name.StringTrimPrefix()) + deviceInfo.DeviceType = parsed.DeviceType.StringTrimPrefix() + deviceInfo.OS = parsed.OS.Platform.StringTrimPrefix() + deviceInfo.OSVersion = fmt.Sprintf("%d.%d.%d", parsed.OS.Version.Major, parsed.OS.Version.Minor, parsed.OS.Version.Patch) + deviceInfo.UserAgent = userAgent + + if location, err := util.GetLocation(r.RemoteAddr); err != nil { + log.Println("WARN: Failed to get location from ip (%s): %v\n", r.RemoteAddr, err) + } else { + deviceInfo.Location = fmt.Sprintf("%s, %s, %s", location.Country, location.Region, location.City) + } + + serialized, err := json.Marshal(deviceInfo) + if err != nil { + log.Println("ERR: Failed to serialize device info: %v\n", err) + serialized = []byte{'{', '}'} + } + + // Create User Session + session, err := h.repo.CreateUserSession(r.Context(), repository.CreateUserSessionParams{ + UserID: user.ID, + SessionType: "user", + ExpiresAt: &refresh.ExpiresAt, + LastActive: nil, + IpAddress: &r.RemoteAddr, + UserAgent: &userAgent, + AccessTokenID: &access.ID, + RefreshTokenID: &refresh.ID, + DeviceInfo: serialized, + }) + if err != nil { + log.Println("ERR: Failedd to create user session after logging in: %v\n", err) + } + + log.Println("INFO: User session created for '%s': %#v\n", user.Email, session) + if err := h.repo.UpdateLastLogin(r.Context(), user.ID); err != nil { web.Error(w, "failed to update user's last login", http.StatusInternalServerError) return @@ -68,8 +116,8 @@ func (h *AuthHandler) login(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") if err := encoder.Encode(Response{ - AccessToken: access, - RefreshToken: refresh, + AccessToken: access.Token, + RefreshToken: refresh.Token, FullName: user.FullName, Email: user.Email, Id: user.ID.String(),