40 lines
1.3 KiB
Go
40 lines
1.3 KiB
Go
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
|
|
}
|