diff options
author | Christoph Wurst <christoph@winzerhof-wurst.at> | 2019-01-31 18:41:06 +0100 |
---|---|---|
committer | Christoph Wurst <christoph@winzerhof-wurst.at> | 2019-02-01 08:24:13 +0100 |
commit | 9de02d326799285896e163cb7b6b1b47a1a5bbb9 (patch) | |
tree | dc513d4fc21e3b9d749cd9aaee68cadff9d796af /core/src | |
parent | dbfa8b65a10105daa39333a5db655cc678b3b645 (diff) | |
download | nextcloud-server-9de02d326799285896e163cb7b6b1b47a1a5bbb9.tar.gz nextcloud-server-9de02d326799285896e163cb7b6b1b47a1a5bbb9.zip |
Move OC.PasswordConfirmation to the server bundle
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
Diffstat (limited to 'core/src')
-rw-r--r-- | core/src/OC/index.js | 2 | ||||
-rw-r--r-- | core/src/OC/password-confirmation.js | 126 |
2 files changed, 128 insertions, 0 deletions
diff --git a/core/src/OC/index.js b/core/src/OC/index.js index 16c5b87520b..6779eb7d7f7 100644 --- a/core/src/OC/index.js +++ b/core/src/OC/index.js @@ -27,6 +27,7 @@ import EventSource from './eventsource' import L10N from './l10n' import msg from './msg' import Notification from './notification' +import PasswordConfirmation from './password-confirmation' import Plugins from './plugins' import search from './search' @@ -40,6 +41,7 @@ export default { L10N, msg, Notification, + PasswordConfirmation, Plugins, search, } diff --git a/core/src/OC/password-confirmation.js b/core/src/OC/password-confirmation.js new file mode 100644 index 00000000000..a38f32b4b5e --- /dev/null +++ b/core/src/OC/password-confirmation.js @@ -0,0 +1,126 @@ +/* global nc_pageLoad */ + +/* + * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at> + * + * @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +import _ from 'underscore' +import $ from 'jquery' +import moment from 'moment' + +import OC from './index' + +/** + * @namespace OC.PasswordConfirmation + */ +export default { + callback: null, + + pageLoadTime: null, + + init: function () { + $('.password-confirm-required').on('click', _.bind(this.requirePasswordConfirmation, this)); + this.pageLoadTime = moment.now(); + }, + + requiresPasswordConfirmation: function () { + var serverTimeDiff = this.pageLoadTime - (nc_pageLoad * 1000); + var timeSinceLogin = moment.now() - (serverTimeDiff + (nc_lastLogin * 1000)); + + // if timeSinceLogin > 30 minutes and user backend allows password confirmation + return (backendAllowsPasswordConfirmation && timeSinceLogin > 30 * 60 * 1000); + }, + + /** + * @param {function} callback + */ + requirePasswordConfirmation: function (callback, options, rejectCallback) { + options = typeof options !== 'undefined' ? options : {}; + var defaults = { + title: t('core', 'Authentication required'), + text: t( + 'core', + 'This action requires you to confirm your password' + ), + confirm: t('core', 'Confirm'), + label: t('core', 'Password'), + error: '', + }; + + var config = _.extend(defaults, options); + + var self = this; + + if (this.requiresPasswordConfirmation()) { + OC.dialogs.prompt( + config.text, + config.title, + function (result, password) { + if (result && password !== '') { + self._confirmPassword(password, config); + } else if (_.isFunction(rejectCallback)) { + rejectCallback() + } + }, + true, + config.label, + true + ).then(function () { + var $dialog = $('.oc-dialog:visible'); + $dialog.find('.ui-icon').remove(); + $dialog.addClass('password-confirmation'); + if (config.error !== '') { + var $error = $('<p></p>').addClass('msg warning').text(config.error); + } + $dialog.find('.oc-dialog-content').append($error); + $dialog.find('.oc-dialog-buttonrow').addClass('aside'); + + var $buttons = $dialog.find('button'); + $buttons.eq(0).hide(); + $buttons.eq(1).text(config.confirm); + }); + } + + this.callback = callback; + }, + + _confirmPassword: function (password, config) { + var self = this; + + $.ajax({ + url: OC.generateUrl('/login/confirm'), + data: { + password: password + }, + type: 'POST', + success: function (response) { + nc_lastLogin = response.lastLogin; + + if (_.isFunction(self.callback)) { + self.callback(); + } + }, + error: function () { + config.error = t('core', 'Failed to authenticate, try again'); + OC.PasswordConfirmation.requirePasswordConfirmation(self.callback, config); + } + }); + } +}; |