51Degrees / device-detection-go

European Union Public License 1.2
0 stars 3 forks source link

Cannot get property using Device ID #3

Closed Xbozon closed 2 years ago

Xbozon commented 2 years ago

Reproduction order:

  1. Get Device ID using UserAgent
  2. Using Device ID, or part of it, try to get BrowserName or HardwareVendor value

Test:

package main

import (
   "fmt"
   "strings"

   "fodegrees/dd"
)

const root = "./"
// User-Agent string of Firefox Web browser version 41 on desktop.
const uaDesktop = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0"

func main() {
   var (
      path  = "resources/51DegreesV4"
      files = []string{"51Degrees-LiteV4.1.hash"}
   )

   manager := dd.NewResourceManager()
   filePath, err := dd.GetFilePath(root+path, files)
   if err != nil {
      panic(err)
   }

   err = dd.InitManagerFromFile(manager, *dd.NewConfigHash(dd.Balanced), "", filePath)
   if err != nil {
      panic(err)
   }

   /* test */

   // Get ID based on UserAgent
   id, err := getValueFromUserAgent(manager, uaDesktop, "id")
   if err != nil {
      fmt.Println(err)
   }

   // Get the correct browser name using the same UserAgent
   expectedBrowserName, err := getValueFromUserAgent(manager, uaDesktop, "BrowserName")
   if err != nil {
      fmt.Println(err)
   }
   // Tried to get the same browser using the ID
   gotBrowserName, err := getValueFromDeviceID(manager, id, "BrowserName")
   if err != nil {
      fmt.Println(err)
   }

   // Check that they match
   if expectedBrowserName != gotBrowserName {
      fmt.Println("ERROR", "expectedBrowserName != gotBrowserName " + expectedBrowserName + " != " + gotBrowserName)
   }

   /* test with browser id */

   // 15364-38914-90352-18092, 15364 - hardwareID, 38914 - OperatingSystemID, 90352 - BrowserID, 18092 - IsCrawler.
   browserID := strings.Split(id, string('-'))[2]

   gotBrowserName, err = getValueFromDeviceID(manager, browserID, "BrowserName")
   if err != nil {
      fmt.Println(err)
   }

   if expectedBrowserName != gotBrowserName {
      fmt.Println("ERROR", "expectedBrowserName != gotBrowserName " + expectedBrowserName + " != " + gotBrowserName)
   }
}

func getValueFromUserAgent(manager *dd.ResourceManager, userAgent, key string) (res string, err error) {
   results := dd.NewResultsHash(manager, 1, 0)
   defer results.Free()

   err = results.MatchUserAgent(userAgent)
   if err != nil {
      return
   }

   res = getValue(results, key)
   return
}

func getValueFromDeviceID(manager *dd.ResourceManager, id, key string) (res string, err error) {
   results := dd.NewResultsHash(manager, 1, 0)
   defer results.Free()

   err = results.MatchDeviceId(id)
   if err != nil {
      return
   }

   res = getValue(results, key)
   return
}

func getValue(results *dd.ResultsHash, propertyName string) string {
   if strings.ToLower(propertyName) == "id" {
      value, err := results.DeviceId()
      if err != nil {
         return err.Error()
      }
      return value
   }

   // Get the values in string
   value, err := results.ValuesString(propertyName, ",")
   if err != nil {
      return err.Error()
   }

   hasValues, err := results.HasValues(propertyName)
   if err != nil {
      return err.Error()
   }

   if !hasValues {
      return "no value"
   }

   return value
}

At any attempt !hasValue = false, and the value is not returned

tungntpham commented 2 years ago

Hi @Xbozon,

We have identified this as a bug in our C library. You can find further details here. We will schedule time to investigate the issue and will keep you updated.

Kind regards, Tung.

tungntpham commented 2 years ago

Hi @Xbozon,

We have released v4.3.3 that contains a fix for this. Please have a try and let us know if it works for you.

Kind regards, Tung.

Xbozon commented 2 years ago

@tungntpham Everything works, thank you!