%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/components/bitrix/security.user.recovery.codes/templates/.default/ |
Current File : /home/bitrix/www/bitrix/components/bitrix/security.user.recovery.codes/templates/.default/script.js |
BX.namespace('BX.Security'); BX.Security.UserRecoveryCodes = (function getUserOtp(BX) { "use strict"; var Otp = function(options) { var defaults = { 'actionUrl': location.href, 'ui': { 'containerId': 'recovery-codes-container' } }; options = options || {}; this._options = mergeObjects(defaults, options); this._container = BX(this._options.ui.containerId); this.codesTemplate = null; this.codesContainer = null; this.initializeInterface(); }; Otp.prototype.initializeInterface = function(data) { var regenerateButtons = this._container.querySelectorAll('[data-role="regenerate-button"]'); var codeTemplate = this._container.querySelector('[data-role="code-template"]'); if (codeTemplate) { this.codesContainer = codeTemplate.parentNode; this.codesTemplate = codeTemplate.cloneNode(true); } [].forEach.call( regenerateButtons, function bindRegeneration(item) { BX.bind(item, 'click', this.onRegenerate.bind(this)); }, this ); }; Otp.prototype.onRegenerate = function(event) { if (event) event.preventDefault(); this.sendRequest( 'regenerate', null, (function onGetParams(response) { this.drawRecoveryCodes(response.codes); }).bind(this) ); }; Otp.prototype.drawRecoveryCodes = function(codes) { // Clean old codes [].forEach.call( this._container.querySelectorAll('[data-autoclear="yes"]'), function cleanElement(element) { BX.remove(element); }, this ); // Create new:-) [].forEach.call( codes, function drawCode(code) { var node = this.codesTemplate.cloneNode(true); node.style.display = ''; if (code.USED == 'Y' && node.getAttribute('data-used-class')) BX.addClass(node, node.getAttribute('data-used-class')); var childs = node.querySelectorAll("*"); [].forEach.call( childs, function initCodeTemplate(element) { if (code.USED != 'Y' && element.getAttribute('data-visible-on-used') == 'yes') { BX.remove(element); return; } var role = element.getAttribute('data-code-template-role'); switch (role) { case 'code': element.innerHTML = BX.util.htmlspecialchars(code.VALUE); break; case 'using-date': if (code.USING_DATE) element.innerHTML = BX.util.htmlspecialchars(code.USING_DATE); break; default: break; } }, this ); this.codesContainer.appendChild(node); }, this ); }; Otp.prototype.sendRequest = function(action, data, onSuccess, onFailure) { data = data || {}; data.action = action || 'check'; data.sessid = BX.bitrix_sessid(); data = BX.ajax.prepareData(data); return BX.ajax({ 'method': 'POST', 'dataType': 'json', 'url': this._options.actionUrl, 'data': data, 'onsuccess': BX.proxy(function proxySuccess(response) { return this.onRequestSuccess(onSuccess, response); }, this), 'onfailure': BX.proxy(function proxySuccess(response) { return this.onRequestFailed(onFailure, response); }, this) }); }; Otp.prototype.onRequestSuccess = function(callback, response) { if (!response['status']) { this.onRequestFailed(null, response); } else if (response['status'] !== 'ok') { this.onRequestFailed(null, response); } else { callback(response); } }; Otp.prototype.onRequestFailed = function(callback, response) { if (!callback) { if (response['error']) this.showError(response['error']); else this.showError(BX.message('SECURITY_OTP_UNKNOWN_ERROR')); } else { callback(response); } }; Otp.prototype.showError = function(errorMessage) { if (!this._errorContainer) return; var errorElement = BX.create('div', { 'children': [ BX.create('div', { 'text': BX.message('SECURITY_OTP_ERROR_TITLE') }), BX.create('div', { 'html': errorMessage }) ], attrs: {className: "bx-notice error"} }); this._errorContainer.appendChild(errorElement); }; Otp.prototype.clearErrors = function() { if (!this._errorContainer) return; BX.cleanNode(this._errorContainer); }; Otp.prototype.onComplete = function() { location.href = this._successfulUrl; }; function mergeObjects(origin, add) { for (var p in add) { if (!add.hasOwnProperty(p)) continue; if (add[p] && add[p].constructor === Object) { if (origin[p] && origin[p].constructor === Object) { origin[p] = mergeObjects(origin[p], add[p]); } else { origin[p] = clone(add[p]); } } else { origin[p] = add[p]; } } return origin; } function clone(o) { return JSON.parse(JSON.stringify(o)); } return Otp; }(BX));