summaryrefslogtreecommitdiffstats
path: root/core/src
diff options
context:
space:
mode:
authorChristoph Wurst <christoph@winzerhof-wurst.at>2019-01-31 18:41:06 +0100
committerChristoph Wurst <christoph@winzerhof-wurst.at>2019-02-01 08:24:13 +0100
commit9de02d326799285896e163cb7b6b1b47a1a5bbb9 (patch)
treedc513d4fc21e3b9d749cd9aaee68cadff9d796af /core/src
parentdbfa8b65a10105daa39333a5db655cc678b3b645 (diff)
downloadnextcloud-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.js2
-rw-r--r--core/src/OC/password-confirmation.js126
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);
+ }
+ });
+ }
+};