mirror of
https://github.com/netbirdio/netbird.git
synced 2024-11-24 17:13:30 +01:00
Handling invalid UTF-8 character in sys info (#2360)
In some operation systems, the sys info contains invalid characters. In this patch try to keep the original fallback logic but filter out the cases when the character is invalid.
This commit is contained in:
parent
cbf9f2058e
commit
0c8f8a62c7
@ -1,11 +1,12 @@
|
|||||||
package system
|
package system
|
||||||
|
|
||||||
import (
|
import (
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Test_sysInfo(t *testing.T) {
|
func Test_sysInfoMac(t *testing.T) {
|
||||||
t.Skip("skipping darwin test")
|
t.Skip("skipping darwin test")
|
||||||
serialNum, prodName, manufacturer := sysInfo()
|
serialNum, prodName, manufacturer := sysInfo()
|
||||||
if serialNum == "" {
|
if serialNum == "" {
|
||||||
|
@ -21,6 +21,26 @@ import (
|
|||||||
"github.com/netbirdio/netbird/version"
|
"github.com/netbirdio/netbird/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type SysInfoGetter interface {
|
||||||
|
GetSysInfo() SysInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
type SysInfoWrapper struct {
|
||||||
|
si sysinfo.SysInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s SysInfoWrapper) GetSysInfo() SysInfo {
|
||||||
|
s.si.GetSysInfo()
|
||||||
|
return SysInfo{
|
||||||
|
ChassisSerial: s.si.Chassis.Serial,
|
||||||
|
ProductSerial: s.si.Product.Serial,
|
||||||
|
BoardSerial: s.si.Board.Serial,
|
||||||
|
ProductName: s.si.Product.Name,
|
||||||
|
BoardName: s.si.Board.Name,
|
||||||
|
ProductVendor: s.si.Product.Vendor,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// GetInfo retrieves and parses the system information
|
// GetInfo retrieves and parses the system information
|
||||||
func GetInfo(ctx context.Context) *Info {
|
func GetInfo(ctx context.Context) *Info {
|
||||||
info := _getInfo()
|
info := _getInfo()
|
||||||
@ -45,7 +65,8 @@ func GetInfo(ctx context.Context) *Info {
|
|||||||
log.Warnf("failed to discover network addresses: %s", err)
|
log.Warnf("failed to discover network addresses: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
serialNum, prodName, manufacturer := sysInfo()
|
si := SysInfoWrapper{}
|
||||||
|
serialNum, prodName, manufacturer := sysInfo(si.GetSysInfo())
|
||||||
|
|
||||||
env := Environment{
|
env := Environment{
|
||||||
Cloud: detect_cloud.Detect(ctx),
|
Cloud: detect_cloud.Detect(ctx),
|
||||||
@ -87,20 +108,36 @@ func _getInfo() string {
|
|||||||
return out.String()
|
return out.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
func sysInfo() (serialNumber string, productName string, manufacturer string) {
|
func sysInfo(si SysInfo) (string, string, string) {
|
||||||
var si sysinfo.SysInfo
|
|
||||||
si.GetSysInfo()
|
|
||||||
isascii := regexp.MustCompile("^[[:ascii:]]+$")
|
isascii := regexp.MustCompile("^[[:ascii:]]+$")
|
||||||
serial := si.Chassis.Serial
|
|
||||||
if (serial == "Default string" || serial == "") && si.Product.Serial != "" {
|
serials := []string{si.ChassisSerial, si.ProductSerial}
|
||||||
serial = si.Product.Serial
|
serial := ""
|
||||||
|
|
||||||
|
for _, s := range serials {
|
||||||
|
if isascii.MatchString(s) {
|
||||||
|
serial = s
|
||||||
|
if s != "Default string" {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!isascii.MatchString(serial)) && si.Board.Serial != "" {
|
|
||||||
serial = si.Board.Serial
|
if serial == "" && isascii.MatchString(si.BoardSerial) {
|
||||||
|
serial = si.BoardSerial
|
||||||
}
|
}
|
||||||
name := si.Product.Name
|
|
||||||
if (!isascii.MatchString(name)) && si.Board.Name != "" {
|
var name string
|
||||||
name = si.Board.Name
|
for _, n := range []string{si.ProductName, si.BoardName} {
|
||||||
|
if isascii.MatchString(n) {
|
||||||
|
name = n
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return serial, name, si.Product.Vendor
|
|
||||||
|
var manufacturer string
|
||||||
|
if isascii.MatchString(si.ProductVendor) {
|
||||||
|
manufacturer = si.ProductVendor
|
||||||
|
}
|
||||||
|
return serial, name, manufacturer
|
||||||
}
|
}
|
||||||
|
12
client/system/sysinfo_linux.go
Normal file
12
client/system/sysinfo_linux.go
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
package system
|
||||||
|
|
||||||
|
// SysInfo used to moc out the sysinfo getter
|
||||||
|
type SysInfo struct {
|
||||||
|
ChassisSerial string
|
||||||
|
ProductSerial string
|
||||||
|
BoardSerial string
|
||||||
|
|
||||||
|
ProductName string
|
||||||
|
BoardName string
|
||||||
|
ProductVendor string
|
||||||
|
}
|
198
client/system/sysinfo_linux_test.go
Normal file
198
client/system/sysinfo_linux_test.go
Normal file
@ -0,0 +1,198 @@
|
|||||||
|
package system
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func Test_sysInfo(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
sysInfo SysInfo
|
||||||
|
wantSerialNum string
|
||||||
|
wantProdName string
|
||||||
|
wantManufacturer string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "Test Case 1",
|
||||||
|
sysInfo: SysInfo{
|
||||||
|
ChassisSerial: "Default string",
|
||||||
|
ProductSerial: "Default string",
|
||||||
|
BoardSerial: "M80-G8013200245",
|
||||||
|
ProductName: "B650M-HDV/M.2",
|
||||||
|
BoardName: "B650M-HDV/M.2",
|
||||||
|
ProductVendor: "ASRock",
|
||||||
|
},
|
||||||
|
wantSerialNum: "Default string",
|
||||||
|
wantProdName: "B650M-HDV/M.2",
|
||||||
|
wantManufacturer: "ASRock",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Empty Chassis Serial",
|
||||||
|
sysInfo: SysInfo{
|
||||||
|
ChassisSerial: "",
|
||||||
|
ProductSerial: "Default string",
|
||||||
|
BoardSerial: "M80-G8013200245",
|
||||||
|
ProductName: "B650M-HDV/M.2",
|
||||||
|
BoardName: "B650M-HDV/M.2",
|
||||||
|
ProductVendor: "ASRock",
|
||||||
|
},
|
||||||
|
wantSerialNum: "Default string",
|
||||||
|
wantProdName: "B650M-HDV/M.2",
|
||||||
|
wantManufacturer: "ASRock",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Empty Chassis Serial",
|
||||||
|
sysInfo: SysInfo{
|
||||||
|
ChassisSerial: "",
|
||||||
|
ProductSerial: "Default string",
|
||||||
|
BoardSerial: "M80-G8013200245",
|
||||||
|
ProductName: "B650M-HDV/M.2",
|
||||||
|
BoardName: "B650M-HDV/M.2",
|
||||||
|
ProductVendor: "ASRock",
|
||||||
|
},
|
||||||
|
wantSerialNum: "Default string",
|
||||||
|
wantProdName: "B650M-HDV/M.2",
|
||||||
|
wantManufacturer: "ASRock",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Fallback to Product Serial",
|
||||||
|
sysInfo: SysInfo{
|
||||||
|
ChassisSerial: "Default string",
|
||||||
|
ProductSerial: "Product serial",
|
||||||
|
BoardSerial: "M80-G8013200245",
|
||||||
|
ProductName: "B650M-HDV/M.2",
|
||||||
|
BoardName: "B650M-HDV/M.2",
|
||||||
|
ProductVendor: "ASRock",
|
||||||
|
},
|
||||||
|
wantSerialNum: "Product serial",
|
||||||
|
wantProdName: "B650M-HDV/M.2",
|
||||||
|
wantManufacturer: "ASRock",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Fallback to Product Serial with default string",
|
||||||
|
sysInfo: SysInfo{
|
||||||
|
ChassisSerial: "Default string",
|
||||||
|
ProductSerial: "Default string",
|
||||||
|
BoardSerial: "M80-G8013200245",
|
||||||
|
ProductName: "B650M-HDV/M.2",
|
||||||
|
BoardName: "B650M-HDV/M.2",
|
||||||
|
ProductVendor: "ASRock",
|
||||||
|
},
|
||||||
|
wantSerialNum: "Default string",
|
||||||
|
wantProdName: "B650M-HDV/M.2",
|
||||||
|
wantManufacturer: "ASRock",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Non UTF-8 in Chassis Serial",
|
||||||
|
sysInfo: SysInfo{
|
||||||
|
ChassisSerial: "\x80",
|
||||||
|
ProductSerial: "Product serial",
|
||||||
|
BoardSerial: "M80-G8013200245",
|
||||||
|
ProductName: "B650M-HDV/M.2",
|
||||||
|
BoardName: "B650M-HDV/M.2",
|
||||||
|
ProductVendor: "ASRock",
|
||||||
|
},
|
||||||
|
wantSerialNum: "Product serial",
|
||||||
|
wantProdName: "B650M-HDV/M.2",
|
||||||
|
wantManufacturer: "ASRock",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Non UTF-8 in Chassis Serial and Product Serial",
|
||||||
|
sysInfo: SysInfo{
|
||||||
|
ChassisSerial: "\x80",
|
||||||
|
ProductSerial: "\x80",
|
||||||
|
BoardSerial: "M80-G8013200245",
|
||||||
|
ProductName: "B650M-HDV/M.2",
|
||||||
|
BoardName: "B650M-HDV/M.2",
|
||||||
|
ProductVendor: "ASRock",
|
||||||
|
},
|
||||||
|
wantSerialNum: "M80-G8013200245",
|
||||||
|
wantProdName: "B650M-HDV/M.2",
|
||||||
|
wantManufacturer: "ASRock",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Non UTF-8 in Chassis Serial and Product Serial and BoardSerial",
|
||||||
|
sysInfo: SysInfo{
|
||||||
|
ChassisSerial: "\x80",
|
||||||
|
ProductSerial: "\x80",
|
||||||
|
BoardSerial: "\x80",
|
||||||
|
ProductName: "B650M-HDV/M.2",
|
||||||
|
BoardName: "B650M-HDV/M.2",
|
||||||
|
ProductVendor: "ASRock",
|
||||||
|
},
|
||||||
|
wantSerialNum: "",
|
||||||
|
wantProdName: "B650M-HDV/M.2",
|
||||||
|
wantManufacturer: "ASRock",
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
name: "Empty Product Name",
|
||||||
|
sysInfo: SysInfo{
|
||||||
|
ChassisSerial: "Default string",
|
||||||
|
ProductSerial: "Default string",
|
||||||
|
BoardSerial: "M80-G8013200245",
|
||||||
|
ProductName: "",
|
||||||
|
BoardName: "boardname",
|
||||||
|
ProductVendor: "ASRock",
|
||||||
|
},
|
||||||
|
wantSerialNum: "Default string",
|
||||||
|
wantProdName: "boardname",
|
||||||
|
wantManufacturer: "ASRock",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Invalid Product Name",
|
||||||
|
sysInfo: SysInfo{
|
||||||
|
ChassisSerial: "Default string",
|
||||||
|
ProductSerial: "Default string",
|
||||||
|
BoardSerial: "M80-G8013200245",
|
||||||
|
ProductName: "\x80",
|
||||||
|
BoardName: "boardname",
|
||||||
|
ProductVendor: "ASRock",
|
||||||
|
},
|
||||||
|
wantSerialNum: "Default string",
|
||||||
|
wantProdName: "boardname",
|
||||||
|
wantManufacturer: "ASRock",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Invalid BoardName Name",
|
||||||
|
sysInfo: SysInfo{
|
||||||
|
ChassisSerial: "Default string",
|
||||||
|
ProductSerial: "Default string",
|
||||||
|
BoardSerial: "M80-G8013200245",
|
||||||
|
ProductName: "\x80",
|
||||||
|
BoardName: "\x80",
|
||||||
|
ProductVendor: "ASRock",
|
||||||
|
},
|
||||||
|
wantSerialNum: "Default string",
|
||||||
|
wantProdName: "",
|
||||||
|
wantManufacturer: "ASRock",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Invalid chars",
|
||||||
|
sysInfo: SysInfo{
|
||||||
|
ChassisSerial: "\x80",
|
||||||
|
ProductSerial: "\x80",
|
||||||
|
BoardSerial: "\x80",
|
||||||
|
ProductName: "\x80",
|
||||||
|
BoardName: "\x80",
|
||||||
|
ProductVendor: "\x80",
|
||||||
|
},
|
||||||
|
wantSerialNum: "",
|
||||||
|
wantProdName: "",
|
||||||
|
wantManufacturer: "",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
gotSerialNum, gotProdName, gotManufacturer := sysInfo(tt.sysInfo)
|
||||||
|
if gotSerialNum != tt.wantSerialNum {
|
||||||
|
t.Errorf("sysInfo() gotSerialNum = %v, want %v", gotSerialNum, tt.wantSerialNum)
|
||||||
|
}
|
||||||
|
if gotProdName != tt.wantProdName {
|
||||||
|
t.Errorf("sysInfo() gotProdName = %v, want %v", gotProdName, tt.wantProdName)
|
||||||
|
}
|
||||||
|
if gotManufacturer != tt.wantManufacturer {
|
||||||
|
t.Errorf("sysInfo() gotManufacturer = %v, want %v", gotManufacturer, tt.wantManufacturer)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
@ -10,7 +10,7 @@ import (
|
|||||||
func EncryptMessage(remotePubKey wgtypes.Key, ourPrivateKey wgtypes.Key, message pb.Message) ([]byte, error) {
|
func EncryptMessage(remotePubKey wgtypes.Key, ourPrivateKey wgtypes.Key, message pb.Message) ([]byte, error) {
|
||||||
byteResp, err := pb.Marshal(message)
|
byteResp, err := pb.Marshal(message)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("failed marshalling message %v", err)
|
log.Errorf("failed marshalling message %v, %+v", err, message.String())
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user