From 77d6c4f6f9afe89a5725737ddb8a6f20ac6dcaff Mon Sep 17 00:00:00 2001 From: Dennis Rathjen Date: Sat, 11 Nov 2023 22:08:24 +0100 Subject: [PATCH] added env param TELEMETRY_USER_CHECK --- README.md | 10 ++++++---- libs/logger.js | 16 ++++++++-------- libs/pixelItRepo.js | 1 - main.js | 33 ++++++++++++++++++++------------- 4 files changed, 34 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 16a7382..5c70adb 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ pixelit_api: - /etc/localtime:/etc/localtime:ro environment: PORT: 8080 + TELEMETRY_USER_CHECK: false MYSQL_HOST: host MYSQL_DATABASE: database MYSQL_USER: user @@ -54,19 +55,20 @@ Install dependencies with `npm install` and run dev server with `npn run dev`. ## Changelog -### **WORK IN PROGRESS** +### 1.8.0 (2023-11-11) - (o0shojo0o) only active telemetry users can see statistics +- (o0shojo0o) added ENV param `TELEMETRY_USER_CHECK` -### 1.7.2 (2023-11-03)* +### 1.7.2 (2023-11-03) - (o0shojo0o) small fixes -### 1.7.1 (2023-11-03)* +### 1.7.1 (2023-11-03) - (o0shojo0o) added more statistics to endpoint `Statistics` -### 1.7.0 (2023-11-03)* +### 1.7.0 (2023-11-03) - (o0shojo0o) added new api endpoint `Statistics` diff --git a/libs/logger.js b/libs/logger.js index 0c31df8..ea2066b 100644 --- a/libs/logger.js +++ b/libs/logger.js @@ -4,14 +4,14 @@ let seqAPiKey = null if (!process.env.SEQ_SERVER || process.env.SEQ_SERVER.length == 0) { isSEQEnabled = false - console.warn(prepareLogForConsole('SEQ_SERVER not set', null, new Date())) + console.warn(prepareLogForConsole('Warn', 'SEQ_SERVER not set', null, new Date())) } if (!process.env.SEQ_APIKEY || process.env.SEQ_APIKEY.length == 0) { - console.warn(prepareLogForConsole('SEQ_APIKEY not set', null, new Date())) + console.warn(prepareLogForConsole('Warn', 'SEQ_APIKEY not set', null, new Date())) } else { seqAPiKey = process.env.SEQ_APIKEY - console.log(prepareLogForConsole('SEQ_APIKEY set', null, new Date())) + console.log(prepareLogForConsole('Info', 'SEQ_APIKEY set', null, new Date())) } const logger = new seq.Logger({ @@ -27,7 +27,7 @@ function enrichProperties(properties) { return properties } -function prepareLogForConsole(message, properties, dateTime) { +function prepareLogForConsole(lvl, message, properties, dateTime) { let extendedInformation = '' if (properties && properties.sourceIP) { extendedInformation += `[SourceIP: ${properties.sourceIP}` @@ -45,14 +45,14 @@ function prepareLogForConsole(message, properties, dateTime) { message = message.replace(`{${key}}`, properties[key]) } } - return `[${dateTime.toISOString().slice(0, 10)}T${dateTime.toLocaleTimeString()}]${extendedInformation} ${message}` + return `[${dateTime.toISOString()}][${lvl}]${extendedInformation} ${message}` } module.exports = { info: (message, properties) => { const dateTime = new Date() properties = enrichProperties(properties) - console.log(prepareLogForConsole(message, properties, dateTime)) + console.log(prepareLogForConsole('Info', message, properties, dateTime)) if (isSEQEnabled) { logger.emit({ timestamp: dateTime, @@ -65,7 +65,7 @@ module.exports = { warn: (message, properties) => { const dateTime = new Date() properties = enrichProperties(properties) - console.warn(prepareLogForConsole(message, properties, dateTime)) + console.warn(prepareLogForConsole('Warn', message, properties, dateTime)) if (isSEQEnabled) { logger.emit({ timestamp: dateTime, @@ -78,7 +78,7 @@ module.exports = { error: (message, properties) => { const dateTime = new Date() properties = enrichProperties(properties) - console.error(prepareLogForConsole(message, properties, dateTime)) + console.error(prepareLogForConsole('Error', message, properties, dateTime)) if (isSEQEnabled) { logger.emit({ timestamp: dateTime, diff --git a/libs/pixelItRepo.js b/libs/pixelItRepo.js index 5ea6ae2..0439fef 100644 --- a/libs/pixelItRepo.js +++ b/libs/pixelItRepo.js @@ -171,7 +171,6 @@ async function isTelemetryUser(uuid) { let sqlResult try { sqlResult = await connection.query(`SELECT EXISTS(SELECT uuid FROM pixel_it_telemetry where last_change >= CURRENT_DATE - INTERVAL 30 DAY AND UUID = ? LIMIT 1) as isTelemetryUser`, uuid); - console.log(sqlResult[0]) return sqlResult[0][0].isTelemetryUser == 1 } catch (error) { log.error('isTelemetryUser: {error}', { error: error }) diff --git a/main.js b/main.js index 133e986..0031adf 100644 --- a/main.js +++ b/main.js @@ -13,6 +13,7 @@ const repo = require('./libs/pixelItRepo'); const { apiLimiter, telemetryLimiter, saveBitmapLimiter } = require('./libs/rateLimit'); const port = process.env.PORT || 8080; +const telemetryUserCheck = process.env.TELEMETRY_USER_CHECK ? process.env.TELEMETRY_USER_CHECK.toUpperCase() == "TRUE" : false // defining the Express app const app = express(); @@ -86,39 +87,45 @@ app.post('/api/Telemetry', telemetryLimiter, async (req, res) => { res.sendStatus(200); }); -app.get(['/api/UserMap'], async (req, res) => { +app.get(['/api/UserMap', '/api/UserMapData'], async (req, res) => { const sourceIP = tools.getIPFromRequest(req); const rawUrl = tools.getRawURLFromRequest(req); + const uuid = req.query.uuid || ''; - const isTelemetryUser = (await cache.getOrSet(`IsTelemetryUser_UUID:${req.query.uuid}`, () => { return repo.isTelemetryUser(req.query.uuid) }, 30)) ?? {}; + if (telemetryUserCheck == true) { + const isTelemetryUser = (await cache.getOrSet(`IsTelemetryUser_UUID:${uuid}`, () => { return repo.isTelemetryUser(uuid) }, 30)) ?? {}; - if (!isTelemetryUser && isTelemetryUser == false) { - res.send({ coords: [], error: { telemetryUser: false } }); - log.info('{apiPath}: UserMap NOT delivered, reason: no telemetry user!', { apiPath: 'UserMap', sourceIP, rawUrl, useragent: req.useragent, uuid: req.query.uuid, rateLimit: req.rateLimit, }); - return; + if (!isTelemetryUser && isTelemetryUser == false) { + res.send({ coords: [], error: { telemetryUser: false } }); + log.info('{apiPath}: UserMap NOT delivered, reason: no telemetry user!', { apiPath: 'UserMap', sourceIP, rawUrl, useragent: req.useragent, uuid: uuid, rateLimit: req.rateLimit, }); + return; + } } const userMapData = (await cache.getOrSet('UserMap', () => { return repo.getUserMapData() }, 30)) ?? []; - log.info('{apiPath}: UserMap ({count} user) successfully delivered', { apiPath: 'UserMap', count: userMapData.length, sourceIP, rawUrl, useragent: req.useragent, rateLimit: req.rateLimit, }); + log.info('{apiPath}: UserMap ({count} user) successfully delivered', { apiPath: 'UserMap', count: userMapData.length, sourceIP, rawUrl, useragent: req.useragent, rateLimit: req.rateLimit, uuid: uuid, }); res.send({ coords: userMapData }); }); app.get('/api/Statistics', async (req, res) => { const sourceIP = tools.getIPFromRequest(req); const rawUrl = tools.getRawURLFromRequest(req); + const uuid = req.query.uuid || ''; - const isTelemetryUser = (await cache.getOrSet(`IsTelemetryUser_UUID:${req.query.uuid}`, () => { return repo.isTelemetryUser(req.query.uuid) }, 30)) ?? {}; + if (telemetryUserCheck == true) { + const isTelemetryUser = (await cache.getOrSet(`IsTelemetryUser_UUID:${uuid}`, () => { return repo.isTelemetryUser(uuid) }, 30)) ?? {}; - if (!isTelemetryUser && isTelemetryUser == false) { - res.send({ error: { telemetryUser: false } }); - log.info('{apiPath}: Statistics NOT delivered, reason: no telemetry user!', { apiPath: 'Statistics', sourceIP, rawUrl, useragent: req.useragent, uuid: req.query.uuid, rateLimit: req.rateLimit, }); - return; + if (telemetryUserCheck == true && !isTelemetryUser && isTelemetryUser == false) { + res.send({ error: { telemetryUser: false } }); + log.info('{apiPath}: Statistics NOT delivered, reason: no telemetry user!', { apiPath: 'Statistics', sourceIP, rawUrl, useragent: req.useragent, uuid: uuid, rateLimit: req.rateLimit, }); + return; + } } const statistics = (await cache.getOrSet('Statistics', () => { return repo.getStatistics() }, 30)) ?? {}; - log.info('{apiPath}: Statistics successfully delivered', { apiPath: 'Statistics', sourceIP, rawUrl, useragent: req.useragent, rateLimit: req.rateLimit, uuid: req.query.uuid, }); + log.info('{apiPath}: Statistics successfully delivered', { apiPath: 'Statistics', sourceIP, rawUrl, useragent: req.useragent, rateLimit: req.rateLimit, uuid: uuid, }); res.send(statistics); });