diff --git a/ee/fleetd-chrome/src/tables/os_version.test.ts b/ee/fleetd-chrome/src/tables/os_version.test.ts index 2948839242..7a954b281b 100644 --- a/ee/fleetd-chrome/src/tables/os_version.test.ts +++ b/ee/fleetd-chrome/src/tables/os_version.test.ts @@ -39,6 +39,8 @@ describe("os_version", () => { ); const db = await VirtualDatabase.init(); + globalThis.DB = db; + const res = await db.query("select * from os_version"); expect(res).toEqual({ data: [ @@ -55,7 +57,7 @@ describe("os_version", () => { codename: "ChromeOS 13.2.1", }, ], - warnings: null, + warnings: "", }); }); @@ -83,6 +85,7 @@ describe("os_version", () => { console.warn = jest.fn(); const db = await VirtualDatabase.init(); + globalThis.DB = db; const res = await db.query("select * from os_version"); expect(res).toEqual({ data: [ @@ -99,7 +102,7 @@ describe("os_version", () => { codename: "ChromeOS 13.2.1", }, ], - warnings: null, + warnings: "", }); expect(console.warn).toHaveBeenCalledWith( expect.stringContaining("expected 4 segments") @@ -111,18 +114,18 @@ describe("os_version", () => { global.navigator.userAgentData = { getHighEntropyValues: jest.fn(() => Promise.resolve({ - data: { - fullVersionList: [ - { brand: "Not even chrome", version: "110.0.5481.177" }, - ], - }, + fullVersionList: [ + { brand: "Not even Chrome", version: "103.0.5060.134" }, + { brand: "Not chrome", version: "103.0.5060.134" }, + ], }) ), }; const db = await VirtualDatabase.init(); - expect(async () => { - await db.query("select * from os_version"); - }).rejects.toThrow(); + globalThis.DB = db; + + const res = await db.query("select * from os_version"); + expect(res.warnings).toContain("environment does not look like Chrome"); }); }); diff --git a/ee/fleetd-chrome/src/tables/os_version.ts b/ee/fleetd-chrome/src/tables/os_version.ts index 2c35517dbd..f63b093560 100644 --- a/ee/fleetd-chrome/src/tables/os_version.ts +++ b/ee/fleetd-chrome/src/tables/os_version.ts @@ -24,49 +24,96 @@ export default class TableOSVersion extends Table { } async generate() { - // @ts-expect-error Typescript doesn't include the userAgentData API yet. - const data = await navigator.userAgentData.getHighEntropyValues([ - "fullVersionList", - "platform", - "platformVersion", - ]); + let warningsArray = []; let version = ""; - for (let entry of data.fullVersionList) { - if (entry.brand === "Google Chrome") { - version = entry.version; - break; + let name = ""; + let codename = ""; + let major = ""; + let minor = ""; + let build = ""; + let patch = ""; + try { + // @ts-expect-error Typescript doesn't include the userAgentData API yet. + const data = await navigator.userAgentData.getHighEntropyValues([ + "fullVersionList", + "platform", + "platformVersion", + ]); + + for (let entry of data.fullVersionList) { + if (entry.brand === "Google Chrome") { + version = entry.version; + break; + } } - } - if (version === "") { - throw new Error("environment does not look like Chrome"); + if (version === "") { + throw new Error("environment does not look like Chrome"); + } + name = this.getName(data.platform); + codename = this.getCodename(data.platformVersion); + + // Note MAJOR.MINOR.BUILD.PATCH (see https://www.chromium.org/developers/version-numbers/) + const splits = version.split("."); + if (splits.length !== 4) { + console.warn( + `Chrome version ${version} does not have expected 4 segments` + ); + } else { + [major, minor, build, patch] = splits; + } + } catch (err) { + console.warn("getHighEntropyValues:", err); + warningsArray.push({ + column: "version", + error_message: err.message.toString(), + }); + warningsArray.push({ + column: "major", + error_message: err.message.toString(), + }); + warningsArray.push({ + column: "minor", + error_message: err.message.toString(), + }); + warningsArray.push({ + column: "build", + error_message: err.message.toString(), + }); + warningsArray.push({ + column: "patch", + error_message: err.message.toString(), + }); + warningsArray.push({ + column: "codename", + error_message: err.message.toString(), + }); + warningsArray.push({ + column: "platform_like", + error_message: err.message.toString(), + }); } - // Note MAJOR.MINOR.BUILD.PATCH (see https://www.chromium.org/developers/version-numbers/) - const splits = version.split("."); - let major = "", - minor = "", - build = "", - patch = ""; - if (splits.length !== 4) { - console.warn( - `Chrome version ${version} does not have expected 4 segments` - ); - } else { - [major, minor, build, patch] = splits; + let arch; + try { + // Note we can actually get the platform of Chrome running on non-ChromeOS devices, but instead + // we just hardcode to "chrome" so that Fleet always sees this Chrome extension as a Chrome + // device even when we are doing local dev on a non-ChromeOS machine. + const platformInfo = await chrome.runtime.getPlatformInfo(); + arch = platformInfo.arch; + } catch (err) { + console.warn("get cpu info:", err); + warningsArray.push({ + column: "arch", + error_message: err.message.toString(), + }); } - // Note we can actually get the platform of Chrome running on non-ChromeOS devices, but instead - // we just hardcode to "chrome" so that Fleet always sees this Chrome extension as a Chrome - // device even when we are doing local dev on a non-ChromeOS machine. - const platformInfo = await chrome.runtime.getPlatformInfo(); - const { arch } = platformInfo; - // Some of these values won't actually be correct on a non-chromeOS machine. return { data: [ { - name: this.getName(data.platform), + name, platform: "chrome", platform_like: "chrome", version, @@ -74,11 +121,12 @@ export default class TableOSVersion extends Table { minor, build, patch, - codename: this.getCodename(data.platformVersion), + codename, // https://developer.chrome.com/docs/extensions/reference/runtime/#type-PlatformArch - arch: arch, + arch, }, ], + warnings: warningsArray, }; } }