From 8ea58432c9ddea5f9706cf0122ee26301103e528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 8 Jun 2021 11:50:52 -0400 Subject: [PATCH] feat: show ip on acp manage users update url on search show matching ip when searching by ip add ip to export csv --- public/language/en-GB/admin/manage/users.json | 1 + public/src/admin/manage/users.js | 10 +++++++++- src/controllers/admin/users.js | 14 ++++++++++++-- src/user/admin.js | 8 +++++--- src/views/admin/manage/users.tpl | 2 ++ 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/public/language/en-GB/admin/manage/users.json b/public/language/en-GB/admin/manage/users.json index 76488baeb7..15624056c9 100644 --- a/public/language/en-GB/admin/manage/users.json +++ b/public/language/en-GB/admin/manage/users.json @@ -47,6 +47,7 @@ "users.uid": "uid", "users.username": "username", "users.email": "email", + "users.ip": "IP", "users.postcount": "postcount", "users.reputation": "reputation", "users.flags": "flags", diff --git a/public/src/admin/manage/users.js b/public/src/admin/manage/users.js index 5552e89d4a..4270d4c23e 100644 --- a/public/src/admin/manage/users.js +++ b/public/src/admin/manage/users.js @@ -426,7 +426,15 @@ define('admin/manage/users', [ params.page = query.page; params.sortBy = params.sortBy || 'lastonline'; var qs = decodeURIComponent($.param(params)); - $.get(config.relative_path + '/api/admin/manage/users?' + qs, renderSearchResults).fail(function (xhrErr) { + $.get(config.relative_path + '/api/admin/manage/users?' + qs, function (data) { + renderSearchResults(data); + const url = config.relative_path + '/admin/manage/users?' + qs; + if (history.pushState) { + history.pushState({ + url: url, + }, null, window.location.protocol + '//' + window.location.host + url); + } + }).fail(function (xhrErr) { if (xhrErr && xhrErr.responseJSON && xhrErr.responseJSON.error) { app.alertError(xhrErr.responseJSON.error); } diff --git a/src/controllers/admin/users.js b/src/controllers/admin/users.js index c03be8c049..d6166bc165 100644 --- a/src/controllers/admin/users.js +++ b/src/controllers/admin/users.js @@ -147,7 +147,11 @@ usersController.search = async function (req, res) { const uids = searchData.users.map(user => user && user.uid); searchData.users = await loadUserInfo(req.uid, uids); - + if (req.query.searchBy === 'ip') { + searchData.users.forEach((user) => { + user.ip = user.ips.find(ip => ip.includes(String(req.query.query))); + }); + } searchData.query = validator.escape(String(req.query.query || '')); searchData.page = page; searchData.resultsPerPage = resultsPerPage; @@ -157,10 +161,14 @@ usersController.search = async function (req, res) { }; async function loadUserInfo(callerUid, uids) { - const [isAdmin, userData, lastonline] = await Promise.all([ + async function getIPs() { + return await Promise.all(uids.map(uid => db.getSortedSetRevRange(`uid:${uid}:ip`, 0, -1))); + } + const [isAdmin, userData, lastonline, ips] = await Promise.all([ user.isAdministrator(uids), user.getUsersWithFields(uids, userFields, callerUid), db.sortedSetScores('users:online', uids), + getIPs(), ]); userData.forEach((user, index) => { if (user) { @@ -169,6 +177,8 @@ async function loadUserInfo(callerUid, uids) { const timestamp = lastonline[index] || user.joindate; user.lastonline = timestamp; user.lastonlineISO = utils.toISOString(timestamp); + user.ips = ips[index]; + user.ip = ips[index] && ips[index][0] ? ips[index][0] : null; } }); return userData; diff --git a/src/user/admin.js b/src/user/admin.js index 51468a2a1b..209b864d13 100644 --- a/src/user/admin.js +++ b/src/user/admin.js @@ -55,12 +55,14 @@ module.exports = function (User) { path.join(baseDir, 'build/export', 'users.csv'), 'w' ); - fs.promises.appendFile(fd, `${data.fields.join(',')}\n`); + fs.promises.appendFile(fd, `${data.fields.join(',')},ip\n`); await batch.processSortedSet('users:joindate', async (uids) => { const usersData = await User.getUsersFields(uids, data.fields.slice()); + const ips = await Promise.all(uids.map(uid => db.getSortedSetRevRange(`uid:${uid}:ip`, 0, -1))); let line = ''; - usersData.forEach((user) => { - line += `${data.fields.map(field => user[field]).join(',')}\n`; + usersData.forEach((user, index) => { + const userIPs = ips[index] ? ips[index].join(',') : ''; + line += `${data.fields.map(field => user[field]).join(',')},"${userIPs}"\n`; }); await fs.promises.appendFile(fd, line); diff --git a/src/views/admin/manage/users.tpl b/src/views/admin/manage/users.tpl index 0cdd099ae2..85de84ea56 100644 --- a/src/views/admin/manage/users.tpl +++ b/src/views/admin/manage/users.tpl @@ -89,6 +89,7 @@ [[admin/manage/users:users.uid]] [[admin/manage/users:users.username]] [[admin/manage/users:users.email]] + [[admin/manage/users:users.ip]] [[admin/manage/users:users.postcount]] {{{if sort_postcount}}}{{{end}}} [[admin/manage/users:users.reputation]] {{{if sort_reputation}}}{{{end}}} [[admin/manage/users:users.flags]] {{{if sort_flags}}}{{{end}}} @@ -107,6 +108,7 @@ {users.email} + {users.ip} {users.postcount} {users.reputation} {users.flags}0