This commit is contained in:
Barış Soner Uşaklı
2019-03-25 11:46:35 -04:00
16 changed files with 133 additions and 78 deletions

View File

@@ -273,13 +273,20 @@ function continueLogin(req, res, next) {
if (passwordExpiry && passwordExpiry < Date.now()) {
winston.verbose('[auth] Triggering password reset for uid ' + userData.uid + ' due to password policy');
req.session.passwordExpired = true;
user.reset.generate(userData.uid, function (err, code) {
async.series({
code: async.apply(user.reset.generate, userData.uid),
buildHeader: async.apply(middleware.buildHeader, req, res),
header: async.apply(middleware.generateHeader, req, res, {}),
}, function (err, payload) {
if (err) {
return helpers.noScriptErrors(req, res, err.message, 403);
}
res.status(200).send({
next: nconf.get('relative_path') + '/reset/' + code,
next: nconf.get('relative_path') + '/reset/' + payload.code,
header: payload.header,
config: res.locals.config,
});
});
} else {

View File

@@ -62,10 +62,10 @@ Controllers.reset = function (req, res, next) {
};
if (req.params.code) {
// Save to session and redirect
req.session.reset_code = req.params.code;
res.redirect(nconf.get('relative_path') + '/reset');
} else if (req.session.reset_code) {
}
if (req.session.reset_code) {
// Validate and save to local variable before removing from session
user.reset.validate(req.session.reset_code, function (err, valid) {
if (err) {

View File

@@ -69,6 +69,7 @@ function loadConfig(configFile) {
nconf.set('base_templates_path', path.join(nconf.get('themes_path'), 'nodebb-theme-persona/templates'));
nconf.set('upload_path', path.resolve(nconf.get('base_dir'), nconf.get('upload_path')));
nconf.set('upload_url', '/assets/uploads');
if (nconf.get('url')) {
nconf.set('url_parsed', url.parse(nconf.get('url')));

View File

@@ -126,6 +126,25 @@ User.sendPasswordResetEmail = function (socket, uids, callback) {
}, callback);
};
User.forcePasswordReset = function (socket, uids, callback) {
if (!Array.isArray(uids)) {
return callback(new Error('[[error:invalid-data]]'));
}
uids = uids.filter(uid => parseInt(uid, 10));
async.each(uids, function (uid, next) {
async.waterfall([
function (next) {
user.setUserField(uid, 'passwordExpiry', Date.now(), next);
},
function (next) {
user.auth.revokeAllSessions(uid, next);
},
], next);
}, callback);
};
User.deleteUsers = function (socket, uids, callback) {
deleteUsers(socket, uids, function (uid, next) {
user.deleteAccount(uid, next);

View File

@@ -62,7 +62,12 @@ function leaveCurrentRoom(socket) {
SocketMeta.getServerTime = function (socket, data, callback) {
// Returns server time in milliseconds
callback(null, Date.now());
const now = new Date();
callback(null, {
timestamp: now.getTime(),
offset: now.getTimezoneOffset(),
});
};
module.exports = SocketMeta;

View File

@@ -99,7 +99,6 @@ function setupConfigs() {
nconf.set('use_port', !!urlObject.port);
nconf.set('relative_path', relativePath);
nconf.set('port', nconf.get('PORT') || nconf.get('port') || urlObject.port || (nconf.get('PORT_ENV_VAR') ? nconf.get(nconf.get('PORT_ENV_VAR')) : false) || 4567);
nconf.set('upload_url', '/assets/uploads');
}
function printStartupInfo() {

View File

@@ -20,7 +20,32 @@
<br />
<div class="plugins row">
<div class="col-lg-9">
<div class="acp-sidebar col-lg-3 col-lg-push-9">
<div class="panel panel-default">
<div class="panel-heading">[[admin/extend/plugins:plugin-search]]</div>
<div class="panel-body">
<input autofocus class="form-control" type="text" id="plugin-search" placeholder="[[admin/extend/plugins:plugin-search-placeholder]]"/><br/>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">[[admin/extend/plugins:reorder-plugins]]</div>
<div class="panel-body">
<button class="btn btn-default btn-block" id="plugin-order"><i class="fa fa-exchange"></i> [[admin/extend/plugins:order-active]]</button>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">[[admin/extend/plugins:dev-interested]]</div>
<div class="panel-body">
<p>
[[admin/extend/plugins:docs-info]]
</p>
</div>
</div>
</div>
<div class="col-lg-9 col-lg-pull-3">
<div class="tab-content">
<div class="tab-pane fade active in" id="installed">
<ul class="installed">
@@ -48,32 +73,6 @@
</div>
</div>
<div class="col-lg-3 acp-sidebar">
<div class="panel panel-default">
<div class="panel-heading">[[admin/extend/plugins:plugin-search]]</div>
<div class="panel-body">
<input autofocus class="form-control" type="text" id="plugin-search" placeholder="[[admin/extend/plugins:plugin-search-placeholder]]"/><br/>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">[[admin/extend/plugins:reorder-plugins]]</div>
<div class="panel-body">
<button class="btn btn-default btn-block" id="plugin-order"><i class="fa fa-exchange"></i> [[admin/extend/plugins:order-active]]</button>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">[[admin/extend/plugins:dev-interested]]</div>
<div class="panel-body">
<p>
[[admin/extend/plugins:docs-info]]
</p>
</div>
</div>
</div>
<div class="modal fade" id="order-active-plugins-modal">
<div class="modal-dialog">
<div class="modal-content">

View File

@@ -11,6 +11,7 @@
<li><a href="#" class="validate-email"><i class="fa fa-fw fa-check"></i> [[admin/manage/users:validate-email]]</a></li>
<li><a href="#" class="send-validation-email"><i class="fa fa-fw fa-mail-forward"></i> [[admin/manage/users:send-validation-email]]</a></li>
<li><a href="#" class="password-reset-email"><i class="fa fa-fw fa-key"></i> [[admin/manage/users:password-reset-email]]</a></li>
<li><a href="#" class="force-password-reset"><i class="fa fa-fw fa-unlock-alt"></i> [[admin/manage/users:force-password-reset]]</a></li>
<li class="divider"></li>
<li><a href="#" class="ban-user"><i class="fa fa-fw fa-gavel"></i> [[admin/manage/users:ban]]</a></li>
<li><a href="#" class="ban-user-temporary"><i class="fa fa-fw fa-clock-o"></i>[[admin/manage/users:temp-ban]]</a></li>