diff --git a/modules/core/client/app/trans-string-en.js b/modules/core/client/app/trans-string-en.js index 037d10ac..7a9a3fd9 100644 --- a/modules/core/client/app/trans-string-en.js +++ b/modules/core/client/app/trans-string-en.js @@ -19,8 +19,8 @@ DEMO_INFO: 'Welcome to demo site, you can sign up manual to create a normal account or sign in as demo admin with account demo and password demoAdmin12#, but don`t delete any demo data please, thanks!', WARNING_POPUP_STRING: 'This is a DEMO SITE, all resources are for download testing only, please delete it within 24 hours after the test is completed, we recommend that you buy genuine resources!', - VALUE_NULL: 'NULL', - VALUE_CUSTOM: 'CUSTOM', + VALUE_NULL: 'Null', + VALUE_CUSTOM: 'Custom', VALUE_SELECT_ALL: 'Select All', BTN_REMOVE: 'Remove', BTN_CONTINUE: 'Continue', @@ -479,7 +479,7 @@ TORRENT_DELETE_SUCCESSFULLY: 'Torrent delete successfully', TORRENT_DELETE_ERROR: 'Torrent delete failed', TORRENT_DELETE_REASON: 'Please select or enter the delete reason for uploader:', - TORRENT_ENTER_DELETE_REASON: 'Please enter custom delete reason', + TORRENT_ENTER_DELETE_REASON: 'Please enter custom operate reason', TORRENT_DELETE_REASON_OVERVIEW: 'The torrent overview info is not complete or missing', TORRENT_DELETE_REASON_NFO: 'The torrent NFO info is not complete or missing', TORRENT_DELETE_REASON_QUALITY: 'The torrent quality is too low', @@ -643,6 +643,18 @@ RESET_VIP_DATA_SUCCESSFULLY: 'reset user vip data successfully', RESET_VIP_DATA_FAILED: 'reset user vip data failed', + BANNED: { + CONFIRM_CANCEL: 'Cancel', + CONFIRM_OK: 'Ok', + CONFIRM_HEADER_TEXT: 'Banned confirm', + CONFIRM_BODY_TEXT: 'Are you sure want to banned user: {{uname}} ?', + REASON_TITLE: 'Please select the banned reason to notice user:', + REASON_ILLEGAL_SIGN_IN: 'Illegal sign in', + REASON_ACCOUNT_TRADE: 'Account trade', + REASON_EXAMINATION_NOT_FINISHED: 'Examination not finished', + REASON_VIOLATED_RULES: 'Violated the sites user behavior rules' + }, + SCORE_NUMBER: 'Score number', SCORE_TITLE: 'Add user score', SET_SCORE_SUCCESSFULLY: 'Add user score successfully', @@ -1809,7 +1821,7 @@ //admin operate user account history message HISTORY: { ADMIN_UPDATE_USER_ROLE: '`{{by.displayName}}` update account role to: `{{role}}`', - ADMIN_UPDATE_USER_STATUS: '`{{by.displayName}}` update account status to: `{{status}}`', + ADMIN_UPDATE_USER_STATUS: '`{{by.displayName}}` update account status to: `{{status}}`, reason: {{reason | translate}}', ADMIN_UPDATE_USER_SCORE: '`{{by.displayName}}` update account score: `{{score}}`', ADMIN_UPDATE_USER_UPLOADED: '`{{by.displayName}}` update account uploaded: `{{uploaded | bytes:2}}`', ADMIN_UPDATE_USER_DOWNLOADED: '`{{by.displayName}}` update account downloaded: `{{downloaded | bytes:2}}`', @@ -1838,7 +1850,7 @@ RESET_PASSWORD_TO_FREQUENT: 'Reset password operation is too frequent, you can do once only in {{hours}} hours, next time is: {{nextTime | date: "yyyy-MM-dd HH:mm:ss"}}', INVALID_USERNAME: 'Invalid username!', INVALID_PASSWORD: 'Invalid password!', - YOU_ARE_BANNED: 'You are banned from the server!', + YOU_ARE_BANNED: 'You are banned from the server, The banned reason is: {{reason}}', ACCOUNT_IS_NOT_ACTIVATED: 'Your account is not activated, you should active first!', ONLY_VIP_CAN_DOWNLOAD: 'This torrent is only for Vip users', CAN_NOT_DOWNLOAD_BANNED: 'Download failed, you are banned from server', diff --git a/modules/core/client/app/trans-string-zh-tw.js b/modules/core/client/app/trans-string-zh-tw.js index 139569a3..ee1da162 100644 --- a/modules/core/client/app/trans-string-zh-tw.js +++ b/modules/core/client/app/trans-string-zh-tw.js @@ -479,7 +479,7 @@ TORRENT_DELETE_SUCCESSFULLY: '種子刪除成功', TORRENT_DELETE_ERROR: '種子刪除失敗', TORRENT_DELETE_REASON: '請選擇或輸入一個刪除種子的理由給上傳者:', - TORRENT_ENTER_DELETE_REASON: '請輸入自定義刪除理由', + TORRENT_ENTER_DELETE_REASON: '請輸入自定義操作理由', TORRENT_DELETE_REASON_OVERVIEW: '種子簡介資訊缺少或者不完整', TORRENT_DELETE_REASON_NFO: '種子NFO資訊缺少或者不完整', TORRENT_DELETE_REASON_QUALITY: '種子資源質量太低下', @@ -643,6 +643,18 @@ RESET_VIP_DATA_SUCCESSFULLY: '重置用戶vip狀態資料成功', RESET_VIP_DATA_FAILED: '重置用戶vip狀態資料失敗', + BANNED: { + CONFIRM_CANCEL: '取消', + CONFIRM_OK: '確定', + CONFIRM_HEADER_TEXT: 'Banned 確認', + CONFIRM_BODY_TEXT: '您確定要 ban 掉用戶 {{uname}} 嗎?', + REASON_TITLE: '請選擇或自定義一個理由通知用戶:', + REASON_ILLEGAL_SIGN_IN: '非法的註冊', + REASON_ACCOUNT_TRADE: '涉嫌帳戶交易', + REASON_EXAMINATION_NOT_FINISHED: '考核未完成', + REASON_VIOLATED_RULES: '違返站內用戶行為準則' + }, + SCORE_NUMBER: '積分數', SCORE_TITLE: '新增積分', SET_SCORE_SUCCESSFULLY: '新增用戶積分成功', @@ -1809,7 +1821,7 @@ //admin operate user account history message HISTORY: { ADMIN_UPDATE_USER_ROLE: '`{{by.displayName}}` 改變帳戶角色為: `{{role}}`', - ADMIN_UPDATE_USER_STATUS: '`{{by.displayName}}` 改變帳戶狀態為: `{{status}}`', + ADMIN_UPDATE_USER_STATUS: '`{{by.displayName}}` 改變帳戶狀態為: `{{status}}`,理由: {{reason | translate}}', ADMIN_UPDATE_USER_SCORE: '`{{by.displayName}}` 修改帳戶積分: `{{score}}`', ADMIN_UPDATE_USER_UPLOADED: '`{{by.displayName}}` 修改帳戶上傳量: `{{uploaded | bytes:2}}`', ADMIN_UPDATE_USER_DOWNLOADED: '`{{by.displayName}}` 修改帳戶下載量: `{{downloaded | bytes:2}}`', @@ -1838,7 +1850,7 @@ RESET_PASSWORD_TO_FREQUENT: '密碼重置操作過於頻繁, 您在 {{hours}} 小時內只能操作一次, 下次可操作時間為: {{nextTime | date: "yyyy-MM-dd HH:mm:ss"}}', INVALID_USERNAME: '無效的用戶名稱!', INVALID_PASSWORD: '無效的密碼!', - YOU_ARE_BANNED: '您已被伺服器禁止(banned)!', + YOU_ARE_BANNED: '您已被伺服器禁止(banned),被禁止的理由為:{{reason}}', ACCOUNT_IS_NOT_ACTIVATED: '您的帳戶未啟用, 請啟用後再試!', ONLY_VIP_CAN_DOWNLOAD: '該種子只有VIP用戶才可以下載', CAN_NOT_DOWNLOAD_BANNED: '下載失敗, 您被伺服器禁止(banned)', diff --git a/modules/core/client/app/trans-string-zh.js b/modules/core/client/app/trans-string-zh.js index 04f0a274..cf78ab22 100644 --- a/modules/core/client/app/trans-string-zh.js +++ b/modules/core/client/app/trans-string-zh.js @@ -479,7 +479,7 @@ TORRENT_DELETE_SUCCESSFULLY: '种子删除成功', TORRENT_DELETE_ERROR: '种子删除失败', TORRENT_DELETE_REASON: '请选择或输入一个删除种子的理由给上传者:', - TORRENT_ENTER_DELETE_REASON: '请输入自定义删除理由', + TORRENT_ENTER_DELETE_REASON: '请输入自定义操作理由', TORRENT_DELETE_REASON_OVERVIEW: '种子简介信息缺少或者不完整', TORRENT_DELETE_REASON_NFO: '种子NFO信息缺少或者不完整', TORRENT_DELETE_REASON_QUALITY: '种子资源质量太低下', @@ -643,6 +643,18 @@ RESET_VIP_DATA_SUCCESSFULLY: '重置用户vip状态数据成功', RESET_VIP_DATA_FAILED: '重置用户vip状态数据失败', + BANNED: { + CONFIRM_CANCEL: '取消', + CONFIRM_OK: '确定', + CONFIRM_HEADER_TEXT: 'Banned 确认', + CONFIRM_BODY_TEXT: '您确定要 ban 掉用户 {{uname}} 吗?', + REASON_TITLE: '请选择或自定义一个理由通知用户:', + REASON_ILLEGAL_SIGN_IN: '非法的注册', + REASON_ACCOUNT_TRADE: '涉嫌帐户交易', + REASON_EXAMINATION_NOT_FINISHED: '考核未完成', + REASON_VIOLATED_RULES: '违返站内用户行为准则' + }, + SCORE_NUMBER: '积分数', SCORE_TITLE: '添加积分', SET_SCORE_SUCCESSFULLY: '添加用户积分成功', @@ -1809,7 +1821,7 @@ //admin operate user account history message HISTORY: { ADMIN_UPDATE_USER_ROLE: '`{{by.displayName}}` 改变帐户角色为: `{{role}}`', - ADMIN_UPDATE_USER_STATUS: '`{{by.displayName}}` 改变帐户状态为: `{{status}}`', + ADMIN_UPDATE_USER_STATUS: '`{{by.displayName}}` 改变帐户状态为: `{{status}}`,理由: {{reason | translate}}', ADMIN_UPDATE_USER_SCORE: '`{{by.displayName}}` 修改帐户积分: `{{score}}`', ADMIN_UPDATE_USER_UPLOADED: '`{{by.displayName}}` 修改帐户上传量: `{{uploaded | bytes:2}}`', ADMIN_UPDATE_USER_DOWNLOADED: '`{{by.displayName}}` 修改帐户下载量: `{{downloaded | bytes:2}}`', @@ -1838,7 +1850,7 @@ RESET_PASSWORD_TO_FREQUENT: '密码重置操作过于频繁, 您在 {{hours}} 小时内只能操作一次, 下次可操作时间为: {{nextTime | date: "yyyy-MM-dd HH:mm:ss"}}', INVALID_USERNAME: '无效的用户名!', INVALID_PASSWORD: '无效的密码!', - YOU_ARE_BANNED: '您已被服务器禁止(banned)!', + YOU_ARE_BANNED: '您已被服务器禁止(banned),被禁止的理由为:{{reason}}', ACCOUNT_IS_NOT_ACTIVATED: '您的帐户未激活, 请激活后再试!', ONLY_VIP_CAN_DOWNLOAD: '该种子只有VIP用户才可以下载', CAN_NOT_DOWNLOAD_BANNED: '下载失败, 您被服务器禁止(banned)', diff --git a/modules/systems/server/controllers/systems.server.controller.js b/modules/systems/server/controllers/systems.server.controller.js index f5a50234..16c8eb0b 100644 --- a/modules/systems/server/controllers/systems.server.controller.js +++ b/modules/systems/server/controllers/systems.server.controller.js @@ -387,7 +387,12 @@ exports.banAllUnfinishedUser = function (req, res) { if (req.user.isAdmin) { var user = req.model; - User.update({'examinationData.isFinished': false}, {$set: {status: 'banned'}}, {multi: true}, function (err, num) { + User.update({'examinationData.isFinished': false}, { + $set: { + status: 'banned', + banReason: 'BANNED.REASON_EXAMINATION_NOT_FINISHED' + } + }, {multi: true}, function (err, num) { if (err) { return res.status(422).send({ message: errorHandler.getErrorMessage(err) diff --git a/modules/users/client/controllers/admin/user.client.controller.js b/modules/users/client/controllers/admin/user.client.controller.js index 9964f4e2..123c115d 100644 --- a/modules/users/client/controllers/admin/user.client.controller.js +++ b/modules/users/client/controllers/admin/user.client.controller.js @@ -7,11 +7,11 @@ UserController.$inject = ['$scope', '$state', '$window', 'Authentication', 'userResolve', 'Notification', 'NotifycationService', 'MeanTorrentConfig', 'AdminService', 'ScoreLevelService', 'DebugConsoleService', 'TorrentGetInfoServices', 'SideOverlay', 'MakerGroupService', '$filter', '$translate', - 'marked']; + 'marked', 'ModalConfirmService']; function UserController($scope, $state, $window, Authentication, user, Notification, NotifycationService, MeanTorrentConfig, AdminService, ScoreLevelService, mtDebug, TorrentGetInfoServices, SideOverlay, MakerGroupService, $filter, $translate, - marked) { + marked, ModalConfirmService) { var vm = this; vm.TGI = TorrentGetInfoServices; vm.authentication = Authentication; @@ -326,12 +326,47 @@ */ vm.onUserStatusChanged = function () { var user = vm.user; - AdminService.setUserStatus({ - userId: user._id, - userStatus: vm.selectedStatus - }) - .then(onSuccess) - .catch(onError); + + if (vm.selectedStatus === 'banned') { + var modalOptions = { + closeButtonText: $translate.instant('BANNED.CONFIRM_CANCEL'), + actionButtonText: $translate.instant('BANNED.CONFIRM_OK'), + headerText: $translate.instant('BANNED.CONFIRM_HEADER_TEXT'), + bodyText: $translate.instant('BANNED.CONFIRM_BODY_TEXT', {uname: user.displayName}), + + selectOptions: { + enable: true, + title: 'BANNED.REASON_TITLE', + options: [ + 'BANNED.REASON_ILLEGAL_SIGN_IN', + 'BANNED.REASON_ACCOUNT_TRADE', + 'BANNED.REASON_EXAMINATION_NOT_FINISHED', + 'BANNED.REASON_VIOLATED_RULES' + ] + } + }; + ModalConfirmService.showModal({}, modalOptions) + .then(function (result) { + var reason = result.reason; + if (reason === 'CUSTOM') reason = result.custom; + + AdminService.setUserStatus({ + userId: user._id, + userStatus: vm.selectedStatus, + banReason: reason + }) + .then(onSuccess) + .catch(onError); + }); + } else { + AdminService.setUserStatus({ + userId: user._id, + userStatus: vm.selectedStatus, + banReason: '' + }) + .then(onSuccess) + .catch(onError); + } function onSuccess(response) { vm.user = response; diff --git a/modules/users/client/controllers/authentication.client.controller.js b/modules/users/client/controllers/authentication.client.controller.js index 1c1c222a..c1ced432 100644 --- a/modules/users/client/controllers/authentication.client.controller.js +++ b/modules/users/client/controllers/authentication.client.controller.js @@ -193,7 +193,7 @@ } function onUserSigninError(response) { - NotifycationService.showErrorNotify(response.data.message, 'SIGN.SIGNIN_ERROR'); + NotifycationService.showErrorNotify(response.data.message, 'SIGN.SIGNIN_ERROR', {reason: $translate.instant(response.data.reason)}); } } diff --git a/modules/users/client/services/users.client.service.js b/modules/users/client/services/users.client.service.js index 153aab8b..00add32e 100644 --- a/modules/users/client/services/users.client.service.js +++ b/modules/users/client/services/users.client.service.js @@ -251,7 +251,8 @@ url: '/api/users/:userId/status', params: { userId: '@userId', - userStatus: '@userStatus' + userStatus: '@userStatus', + banReason: '@banReason' }, interceptor: {response: removeCache} }, diff --git a/modules/users/server/config/strategies/local.js b/modules/users/server/config/strategies/local.js index d246681c..a8f1fb44 100644 --- a/modules/users/server/config/strategies/local.js +++ b/modules/users/server/config/strategies/local.js @@ -45,7 +45,8 @@ module.exports = function () { } if (user.status === 'banned') { return done(null, false, { - message: 'SERVER.YOU_ARE_BANNED' + message: 'SERVER.YOU_ARE_BANNED', + reason: user.banReason }); } if (user.status === 'inactive') { @@ -54,13 +55,6 @@ module.exports = function () { }); } - // if ((moment(Date.now()) - moment(user.last_signed)) > signConfig.idle.accountIdleForTime) { - // user.update({ - // $set: {status: 'idle'} - // }).exec(); - // user.status = 'idle'; - // } - user.updateSignedTime(); return done(null, user); diff --git a/modules/users/server/controllers/admin.server.controller.js b/modules/users/server/controllers/admin.server.controller.js index 7616dd18..1f7fdd31 100644 --- a/modules/users/server/controllers/admin.server.controller.js +++ b/modules/users/server/controllers/admin.server.controller.js @@ -270,7 +270,10 @@ exports.updateUserRole = function (req, res) { */ exports.updateUserStatus = function (req, res) { var user = req.model; - var tp = {status: req.body.userStatus}; + var tp = { + status: req.body.userStatus, + banReason: req.body.banReason + }; if (user.status === 'idle' && req.body.userStatus === 'normal') { tp.last_signed = Date.now(); @@ -290,11 +293,13 @@ exports.updateUserStatus = function (req, res) { //create trace log traceLogCreate(req, traceConfig.action.adminUpdateUserStatus, { user: user._id, - status: req.body.userStatus + status: req.body.userStatus, + reason: req.body.banReason === '' ? 'VALUE_NULL' : req.body.banReason }); // write history history.insert(user._id, historyConfig.action.adminUpdateUserStatus, { status: req.body.userStatus, + reason: req.body.banReason === '' ? 'VALUE_NULL' : req.body.banReason, by: req.user._id }); } diff --git a/modules/users/server/models/user.server.model.js b/modules/users/server/models/user.server.model.js index 98bba1c0..7957868e 100644 --- a/modules/users/server/models/user.server.model.js +++ b/modules/users/server/models/user.server.model.js @@ -149,6 +149,10 @@ var UserSchema = new Schema({ type: String, default: 'inactive' }, + banReason: { + type: String, + default: '' + }, vip_start_at: { type: Date, default: ''