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 }