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: ''