From 5ea6bc42513d143f2dd86e24b9f4b6ac9dba1035 Mon Sep 17 00:00:00 2001 From: LandaMm Date: Wed, 11 Jun 2025 20:33:34 +0200 Subject: [PATCH] feat: build device info util --- internal/util/session.go | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 internal/util/session.go diff --git a/internal/util/session.go b/internal/util/session.go new file mode 100644 index 0000000..2c20a0e --- /dev/null +++ b/internal/util/session.go @@ -0,0 +1,39 @@ +package util + +import ( + "encoding/json" + "fmt" + "log" + + "gitea.local/admin/hspguard/internal/types" + "github.com/avct/uasurfer" +) + +func BuildDeviceInfo(userAgent string, remoteAddr string) []byte { + 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 := GetLocation(remoteAddr); err != nil { + log.Printf("WARN: Failed to get location from ip (%s): %v\n", remoteAddr, err) + } else { + log.Printf("DEBUG: Response from IP fetcher: %#v\n", location) + deviceInfo.Location = fmt.Sprintf("%s, %s, %s", location.Country, location.Region, location.City) + } + + serialized, err := json.Marshal(deviceInfo) + if err != nil { + log.Printf("ERR: Failed to serialize device info: %v\n", err) + serialized = []byte{'{', '}'} + } + + return serialized +}