From e4605cb83be940a1189163439027e6434e2c1b55 Mon Sep 17 00:00:00 2001 From: Sebastian Rettig Date: Sat, 4 Jun 2022 14:21:32 +0200 Subject: [PATCH] fix: removed node-machine-id (#2269) --- package-lock.json | 32 +++----- package.json | 1 - server/src/config/IH5PEditorSettings.ts | 1 + server/src/config/SettingsCache.ts | 73 ++++++++++++------- .../src/config/__test__/SettingsCache.test.ts | 34 ++++++++- server/src/config/defaultSettings.ts | 3 +- server/src/main.ts | 15 ++-- server/src/routes/index.ts | 2 +- server/src/routes/trackingRoutes.ts | 12 +-- test/data/settings.json | 2 +- 10 files changed, 104 insertions(+), 71 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9d68420b1..6d4982632 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "lumi", - "version": "0.9.0-beta.6", + "version": "0.9.2-beta.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "lumi", - "version": "0.9.0-beta.6", + "version": "0.9.2-beta.1", "dependencies": { "@lumieducation/h5p-express": "9.1.2", "@lumieducation/h5p-html-exporter": "9.1.2", @@ -26,7 +26,6 @@ "i18next-node-fs-backend": "2.1.3", "matomo-tracker": "2.2.4", "nanoid": "3.3.2", - "node-machine-id": "1.1.12", "object-hash": "3.0.0", "promisepipe": "3.0.0", "recursive-readdir": "2.2.2", @@ -19521,8 +19520,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} + "dev": true }, "json-schema-traverse": { "version": "0.4.1", @@ -19587,8 +19585,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/@electron/remote/-/remote-2.0.4.tgz", "integrity": "sha512-8m2P/d2RH986PmMW5lKygbPEjEYJ7RgCe37Y8DQ1wujKMH6VjmLIB+Y+DP2SA611svCZc58TRSd8FraGvcfGZw==", - "dev": true, - "requires": {} + "dev": true }, "@electron/universal": { "version": "1.2.0", @@ -20253,8 +20250,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, - "requires": {} + "dev": true }, "@octokit/plugin-rest-endpoint-methods": { "version": "5.13.0", @@ -23524,8 +23520,7 @@ "ws": { "version": "8.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "requires": {} + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==" } } }, @@ -23550,8 +23545,7 @@ "version": "8.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "dev": true, - "requires": {} + "dev": true } } }, @@ -25593,8 +25587,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "requires": {} + "dev": true }, "jest-regex-util": { "version": "27.5.1", @@ -29028,8 +29021,7 @@ "postcss-safe-parser": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", - "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", - "requires": {} + "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==" }, "postcss-url": { "version": "10.1.3", @@ -29258,8 +29250,7 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true, - "requires": {} + "dev": true } } }, @@ -31812,8 +31803,7 @@ "version": "7.5.7", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "dev": true, - "requires": {} + "dev": true }, "xdg-basedir": { "version": "4.0.0", diff --git a/package.json b/package.json index ab544ec36..f9ed8e217 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,6 @@ "i18next-node-fs-backend": "2.1.3", "matomo-tracker": "2.2.4", "nanoid": "3.3.2", - "node-machine-id": "1.1.12", "object-hash": "3.0.0", "promisepipe": "3.0.0", "recursive-readdir": "2.2.2", diff --git a/server/src/config/IH5PEditorSettings.ts b/server/src/config/IH5PEditorSettings.ts index 1cf715ec7..30f71c61b 100644 --- a/server/src/config/IH5PEditorSettings.ts +++ b/server/src/config/IH5PEditorSettings.ts @@ -8,6 +8,7 @@ export default interface IH5PEditorSettings { h5pUuid: string; language: string; lastVersion: string; + machineId: string; privacyPolicyConsent: boolean; token: string; usageStatistics: boolean; diff --git a/server/src/config/SettingsCache.ts b/server/src/config/SettingsCache.ts index fdc9fa8df..7474082c5 100644 --- a/server/src/config/SettingsCache.ts +++ b/server/src/config/SettingsCache.ts @@ -5,6 +5,7 @@ import { supportedLocales } from '../boot/i18n'; import defaultSettings from './defaultSettings'; import IH5PEditorSettings from './IH5PEditorSettings'; import Logger from '../helpers/Logger'; +import { nanoid } from 'nanoid'; const log = new Logger('SettingsStorage'); @@ -93,41 +94,56 @@ export default class SettingsStorage { * same */ public validateAndFixSettings(settings: IH5PEditorSettings): boolean { + let changed = false; + log.debug(`Validating settings. Language: ${settings.language}`); let lng = settings.language; if (!lng) { settings.language = 'en'; - return true; - } - // allow regular language codes like de-DE or zh-HANS - if ( - !/^[a-z]{2,3}(-[A-Z]{2,6})?$/i.test(settings.language) || - !supportedLocales.find((l) => l.code === lng) - ) { - log.debug( - 'The language in the settings is either malformed or not in the list of supported locales.' - ); - // converts es-419 into es - const res = /^([a-z]{2,3})(-.{2,6})?$/i.exec(settings.language); - if (res.length > 0) { - log.debug('Removing variant code from language'); - lng = res[1]; - } - } - if (supportedLocales.find((l) => l.code === lng)) { - if (settings.language !== lng) { + changed = true; + } else { + let lngOk = false; + // allow regular language codes like de-DE or zh-HANS + if ( + !/^[a-z]{2,3}(-[A-Z]{2,6})?$/i.test(settings.language) || + !supportedLocales.find((l) => l.code === lng) + ) { log.debug( - `Changing language '${settings.language}' to '${lng}'` + 'The language in the settings is either malformed or not in the list of supported locales.' ); - settings.language = lng; - return true; + // converts es-419 into es + const res = /^([a-z]{2,3})(-.{2,6})?$/i.exec(settings.language); + if (res.length > 0) { + log.debug('Removing variant code from language'); + lng = res[1]; + } + } + if (supportedLocales.find((l) => l.code === lng)) { + if (settings.language !== lng) { + log.debug( + `Changing language '${settings.language}' to '${lng}'` + ); + settings.language = lng; + changed = true; + lngOk = true; + } + log.debug('Language code is ok'); + lngOk = true; + } + if (!lngOk) { + log.debug('Falling back to English language.'); + settings.language = 'en'; + changed = true; } - log.debug('Language code is ok'); - return false; } - log.debug('Falling back to English language.'); - settings.language = 'en'; - return true; + + if (!settings.machineId || settings.machineId === '') { + log.debug('Generating new machine id'); + settings.machineId = nanoid(); + changed = true; + } + + return changed; } /** @@ -241,7 +257,8 @@ export default class SettingsStorage { lastVersion: loadedSettings.lastVersion, privacyPolicyConsent: loadedSettings.privacyPolicyConsent, token: loadedSettings.token, - usageStatistics: loadedSettings.usageStatistics + usageStatistics: loadedSettings.usageStatistics, + machineId: loadedSettings.machineId } }; } diff --git a/server/src/config/__test__/SettingsCache.test.ts b/server/src/config/__test__/SettingsCache.test.ts index cd3c63157..e1e9db4d2 100644 --- a/server/src/config/__test__/SettingsCache.test.ts +++ b/server/src/config/__test__/SettingsCache.test.ts @@ -8,20 +8,48 @@ describe('SettingsCache', () => { }); it('fixed es-419 (Spanish, Latin America) language codes', () => { - const settings = { ...defaultSettings, language: 'es-419' }; + const settings = { + ...defaultSettings, + machineId: '123', + language: 'es-419' + }; expect(settingsCache.validateAndFixSettings(settings)).toBe(true); expect(settings.language).toEqual('es'); }); it('leaves language codes like es-MX', () => { - const settings = { ...defaultSettings, language: 'es-mx' }; + const settings = { + ...defaultSettings, + machineId: '123', + language: 'es-mx' + }; expect(settingsCache.validateAndFixSettings(settings)).toBe(false); expect(settings.language).toEqual('es-mx'); }); it('leaves language codes like es', () => { - const settings = { ...defaultSettings, language: 'es' }; + const settings = { + ...defaultSettings, + machineId: '123', + language: 'es' + }; expect(settingsCache.validateAndFixSettings(settings)).toBe(false); expect(settings.language).toEqual('es'); }); + + it('generates machineId', () => { + const settings = { ...defaultSettings }; + expect(settingsCache.validateAndFixSettings(settings)).toBe(true); + expect(settings.machineId).not.toEqual(''); + }); + + it('leaves existing machineId', () => { + const settings = { + ...defaultSettings, + language: 'de', + machineId: 'asd' + }; + expect(settingsCache.validateAndFixSettings(settings)).toBe(false); + expect(settings.machineId).toEqual('asd'); + }); }); diff --git a/server/src/config/defaultSettings.ts b/server/src/config/defaultSettings.ts index 56e52aafc..000048e8e 100644 --- a/server/src/config/defaultSettings.ts +++ b/server/src/config/defaultSettings.ts @@ -13,7 +13,8 @@ const defaultSettings: IH5PEditorSettings = { privacyPolicyConsent: false, token: '', usageStatistics: false, - h5pUuid: '' + h5pUuid: '', + machineId: '' }; export default defaultSettings; diff --git a/server/src/main.ts b/server/src/main.ts index 9b2e93bf9..1e07d0870 100644 --- a/server/src/main.ts +++ b/server/src/main.ts @@ -16,7 +16,6 @@ import initUpdater from './services/updater'; import createWebsocket from './boot/websocket'; import serverConfigFactory from './config/defaultPaths'; import matomo from './boot/matomo'; -import { machineId } from 'node-machine-id'; import i18next from 'i18next'; import fsExtra from 'fs-extra'; @@ -203,11 +202,12 @@ if (!gotSingleInstanceLock) { app.on('before-quit', async () => { try { - if ((await settingsCache.getSettings()).usageStatistics) { + const settings = await settingsCache.getSettings(); + if (settings.usageStatistics) { const data = { url: '/Lumi', - _id: await machineId(), - uid: await machineId(), + _id: settings.machineId, + uid: settings.machineId, e_c: 'App', e_a: 'quit', lang: electron.app.getLocale(), @@ -320,11 +320,12 @@ if (!gotSingleInstanceLock) { } try { - if ((await settingsCache.getSettings()).usageStatistics) { + const settings = await settingsCache.getSettings(); + if (settings.usageStatistics) { const data = { url: '/Lumi', - _id: await machineId(), - uid: await machineId(), + _id: settings.machineId, + uid: settings.machineId, e_c: 'App', e_a: 'start', lang: electron.app.getLocale(), diff --git a/server/src/routes/index.ts b/server/src/routes/index.ts index 5f9a2d4ad..f0a26f904 100644 --- a/server/src/routes/index.ts +++ b/server/src/routes/index.ts @@ -46,7 +46,7 @@ export default function ( log.info('setting up routes'); router.use('/api/v1/auth', authRoutes()); - router.use('/api/v1/track', trackingRoutes(serverConfig, settingsCache)); + router.use('/api/v1/track', trackingRoutes(settingsCache)); router.use( '/api/v1/analytics', analyticRoutes(getBrowserWindow, electronState) diff --git a/server/src/routes/trackingRoutes.ts b/server/src/routes/trackingRoutes.ts index f4a9ccbe5..988c2e075 100644 --- a/server/src/routes/trackingRoutes.ts +++ b/server/src/routes/trackingRoutes.ts @@ -1,20 +1,15 @@ import express from 'express'; import matomo from '../boot/matomo'; import * as Sentry from '@sentry/node'; -import IServerConfig from '../config/IPaths'; import electron from 'electron'; import * as os from 'os'; -import { machineId } from 'node-machine-id'; import { nanoid } from 'nanoid'; import SettingsCache from '../config/SettingsCache'; const id = nanoid(16); -export default function ( - serverConfig: IServerConfig, - settingsCache: SettingsCache -): express.Router { +export default function (settingsCache: SettingsCache): express.Router { const router = express.Router(); router.post( `/`, @@ -24,12 +19,13 @@ export default function ( next: express.NextFunction ) => { try { - if ((await settingsCache.getSettings()).usageStatistics) { + const settings = await settingsCache.getSettings(); + if (settings.usageStatistics) { const { action, category, name, value } = req.body; const data = { url: '/Lumi', _id: id, - uid: await machineId(), + uid: settings.machineId, e_c: category, e_a: action, e_n: name, diff --git a/test/data/settings.json b/test/data/settings.json index 8f6bb05d7..928f4a270 100644 --- a/test/data/settings.json +++ b/test/data/settings.json @@ -1 +1 @@ -{"bugTracking":false,"firstOpen":false,"lastVersion":"11.3.0","language":"en","privacyPolicyConsent":true,"usageStatistics":false,"autoUpdates":false,"test":"abc","enableLumiRun":false,"h5pUuid":"test"} +{"autoUpdates":false,"bugTracking":false,"enableLumiRun":false,"firstOpen":false,"language":"en","lastVersion":"11.3.0","privacyPolicyConsent":true,"usageStatistics":false,"h5pUuid":"test","machineId":"XzUd-SetAHhqIMGPDNuFz","test":"abc"}