diff --git a/src/api/index.js b/src/api/index.js index 45c53aa910..7c6a4e7552 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -10,4 +10,6 @@ module.exports = { categories: require('./categories'), flags: require('./flags'), files: require('./files'), + + utils: require('./utils'), }; diff --git a/src/api/utils.js b/src/api/utils.js new file mode 100644 index 0000000000..ca10069703 --- /dev/null +++ b/src/api/utils.js @@ -0,0 +1,11 @@ +'use strict'; + +const db = require('../database'); + +const utils = module.exports; + +// internal token management utilities only + +utils.log = async (token) => { + await db.sortedSetAdd('tokens:lastSeen', Date.now(), token); +}; diff --git a/src/middleware/index.js b/src/middleware/index.js index 86452f6b0b..e174febe51 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -16,6 +16,7 @@ const analytics = require('../analytics'); const privileges = require('../privileges'); const cacheCreate = require('../cache/lru'); const helpers = require('./helpers'); +const api = require('../api'); const controllers = { api: require('../controllers/api'), @@ -115,6 +116,15 @@ middleware.prepareAPI = function prepareAPI(req, res, next) { next(); }; +middleware.logApiUsage = async function logApiUsage(req, res, next) { + if (req.headers.hasOwnProperty('authorization')) { + const [, token] = req.headers.authorization.split(' '); + await api.utils.log(token); + } + + next(); +}; + middleware.routeTouchIcon = function routeTouchIcon(req, res) { if (meta.config['brand:touchIcon'] && validator.isURL(meta.config['brand:touchIcon'])) { return res.redirect(meta.config['brand:touchIcon']); diff --git a/src/routes/helpers.js b/src/routes/helpers.js index 6d0976f8d5..834ecfabfe 100644 --- a/src/routes/helpers.js +++ b/src/routes/helpers.js @@ -57,6 +57,7 @@ helpers.setupApiRoute = function (...args) { middleware.maintenanceMode, middleware.registrationComplete, middleware.pluginHooks, + middleware.logApiUsage, ...middlewares, ]; diff --git a/src/routes/write/index.js b/src/routes/write/index.js index 04d3207e05..2209aefbda 100644 --- a/src/routes/write/index.js +++ b/src/routes/write/index.js @@ -6,6 +6,7 @@ const plugins = require('../../plugins'); const middleware = require('../../middleware'); const writeControllers = require('../../controllers/write'); const helpers = require('../../controllers/helpers'); +const { setupApiRoute } = require('../helpers'); const Write = module.exports; @@ -43,8 +44,8 @@ Write.reload = async (params) => { router.use('/api/v3/files', require('./files')()); router.use('/api/v3/utilities', require('./utilities')()); - router.get('/api/v3/ping', writeControllers.utilities.ping.get); - router.post('/api/v3/ping', middleware.authenticateRequest, middleware.ensureLoggedIn, writeControllers.utilities.ping.post); + setupApiRoute(router, 'get', '/api/v3/ping', writeControllers.utilities.ping.get); + setupApiRoute(router, 'post', '/api/v3/ping', writeControllers.utilities.ping.post); /** * Plugins can add routes to the Write API by attaching a listener to the