From 839e6aae47373154e32bc3a363343aa16947d04e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Salgado?= Date: Mon, 26 Oct 2020 16:03:02 +0000 Subject: [PATCH] refactor: user agent parsing --- lib/new-admin/admin-server.js | 4 ++- lib/new-admin/graphql/schema.js | 6 ++-- lib/new-admin/login.js | 10 ++---- lib/token-manager.js | 6 ++-- .../1603438527057-add-browser-os-info.js | 3 +- .../pages/TokenManagement/TokenManagement.js | 31 +++++-------------- .../TokenManagement/TokenManagement.styles.js | 10 ------ new-lamassu-admin/src/utils/browser-os.js | 14 --------- 8 files changed, 21 insertions(+), 63 deletions(-) delete mode 100644 new-lamassu-admin/src/pages/TokenManagement/TokenManagement.styles.js delete mode 100644 new-lamassu-admin/src/utils/browser-os.js diff --git a/lib/new-admin/admin-server.js b/lib/new-admin/admin-server.js index cbc85541..79927743 100644 --- a/lib/new-admin/admin-server.js +++ b/lib/new-admin/admin-server.js @@ -68,10 +68,12 @@ app.use('/front-camera-photo', serveStatic(frontCameraBasedir, { index: false }) app.get('/api/register', (req, res, next) => { const otp = req.query.otp + const ua = req.headers['user-agent'] + const ip = req.ip if (!otp) return next() - return login.register(req) + return login.register(otp, ua, ip) .then(r => { if (r.expired) return res.status(401).send('OTP expired, generate new registration link') diff --git a/lib/new-admin/graphql/schema.js b/lib/new-admin/graphql/schema.js index cb1a9e2b..09e7645b 100644 --- a/lib/new-admin/graphql/schema.js +++ b/lib/new-admin/graphql/schema.js @@ -160,6 +160,8 @@ const typeDefs = gql` token: String! name: String! created: Date! + user_agent: String! + ip_address: String! } type Transaction { @@ -224,7 +226,7 @@ const typeDefs = gql` transactionsCsv(from: Date, until: Date, limit: Int, offset: Int): String accounts: JSONObject config: JSONObject - userTokens(browser: String!, os: String!): [UserToken] + userTokens: [UserToken] } enum MachineAction { @@ -283,7 +285,7 @@ const resolvers = { transactions.batch(from, until, limit, offset).then(parseAsync), config: () => settingsLoader.loadLatestConfigOrNone(), accounts: () => settingsLoader.loadAccounts(), - userTokens: (...[, { browser, os }]) => tokenManager.getTokenList(browser, os) + userTokens: () => tokenManager.getTokenList() }, Mutation: { machineAction: (...[, { deviceId, action, cassette1, cassette2, newName }]) => machineAction({ deviceId, action, cassette1, cassette2, newName }), diff --git a/lib/new-admin/login.js b/lib/new-admin/login.js index 278c4714..4f58c3d3 100644 --- a/lib/new-admin/login.js +++ b/lib/new-admin/login.js @@ -1,6 +1,5 @@ const crypto = require('crypto') -const browserOS = require('../../new-lamassu-admin/src/utils/browser-os') const db = require('../db') function generateOTP (name) { @@ -22,18 +21,15 @@ function validateOTP (otp) { .catch(() => ({ success: false, expired: false })) } -function register (req) { - const otp = req.query.otp - +function register (otp, ua, ip) { return validateOTP(otp) .then(r => { if (!r.success) return r - const deviceInfo = browserOS.getInformation(req.headers['user-agent']) const token = crypto.randomBytes(32).toString('hex') - const sql = 'insert into user_tokens (token, name, browser_version, os_version, ip_address) values ($1, $2, $3, $4, $5)' + const sql = 'insert into user_tokens (token, name, user_agent, ip_address) values ($1, $2, $3, $4)' - return db.none(sql, [token, r.name, deviceInfo.browser, deviceInfo.OS, browserOS.getRequestIP(req)]) + return db.none(sql, [token, r.name, ua, ip]) .then(() => ({ success: true, token: token })) }) .catch(() => ({ success: false, expired: false })) diff --git a/lib/token-manager.js b/lib/token-manager.js index 25e52b88..32209969 100644 --- a/lib/token-manager.js +++ b/lib/token-manager.js @@ -1,8 +1,8 @@ const db = require('./db') -function getTokenList (browser, os) { - const sql = `select * from user_tokens where browser_version=$1 and os_version=$2` - return db.any(sql, [browser, os]) +function getTokenList () { + const sql = `select * from user_tokens` + return db.any(sql) } function revokeToken (token) { diff --git a/migrations/1603438527057-add-browser-os-info.js b/migrations/1603438527057-add-browser-os-info.js index e0e5e613..b4e75aa8 100644 --- a/migrations/1603438527057-add-browser-os-info.js +++ b/migrations/1603438527057-add-browser-os-info.js @@ -2,8 +2,7 @@ const db = require('./db') exports.up = function (next) { var sql = [ - 'ALTER TABLE user_tokens ADD COLUMN browser_version text', - 'ALTER TABLE user_tokens ADD COLUMN os_version text', + 'ALTER TABLE user_tokens ADD COLUMN user_agent text', 'ALTER TABLE user_tokens ADD COLUMN ip_address inet', ] diff --git a/new-lamassu-admin/src/pages/TokenManagement/TokenManagement.js b/new-lamassu-admin/src/pages/TokenManagement/TokenManagement.js index 57aad2a4..7d1fc085 100644 --- a/new-lamassu-admin/src/pages/TokenManagement/TokenManagement.js +++ b/new-lamassu-admin/src/pages/TokenManagement/TokenManagement.js @@ -1,26 +1,22 @@ import { useQuery, useMutation } from '@apollo/react-hooks' -import { makeStyles } from '@material-ui/core/styles' import gql from 'graphql-tag' import moment from 'moment' import * as R from 'ramda' import React from 'react' -import Title from 'src/components/Title' import { IconButton } from 'src/components/buttons' +import TitleSection from 'src/components/layout/TitleSection' import DataTable from 'src/components/tables/DataTable' import { ReactComponent as DeleteIcon } from 'src/styling/icons/action/delete/enabled.svg' -import * as browserOS from 'src/utils/browser-os' - -import { mainStyles } from './TokenManagement.styles' - -const useStyles = makeStyles(mainStyles) const GET_USER_TOKENS = gql` - query userTokens($browser: String!, $os: String!) { - userTokens(browser: $browser, os: $os) { + query userTokens { + userTokens { token name created + user_agent + ip_address } } ` @@ -34,16 +30,7 @@ const REVOKE_USER_TOKEN = gql` ` const Tokens = () => { - const classes = useStyles() - - const userAgent = browserOS.getInformation(navigator.userAgent) - - const { data: tknResponse } = useQuery(GET_USER_TOKENS, { - variables: { - browser: `${userAgent.browser}`, - os: `${userAgent.OS}` - } - }) + const { data: tknResponse } = useQuery(GET_USER_TOKENS) const [revokeToken] = useMutation(REVOKE_USER_TOKEN, { refetchQueries: () => ['userTokens'] @@ -96,11 +83,7 @@ const Tokens = () => { return ( <> -
-
- Token Management -
-
+