snappymail/dev/View/Popup/TwoFactorConfiguration.js
2016-07-05 22:52:52 +03:00

240 lines
5.8 KiB
JavaScript

var
window = require('window'),
_ = require('_'),
ko = require('ko'),
qr = require('qr'),
Enums = require('Common/Enums'),
Utils = require('Common/Utils'),
Translator = require('Common/Translator'),
Settings = require('Storage/Settings'),
Remote = require('Remote/User/Ajax'),
kn = require('Knoin/Knoin'),
AbstractView = require('Knoin/AbstractView');
/**
* @constructor
* @extends AbstractView
*/
function TwoFactorConfigurationPopupView()
{
AbstractView.call(this, 'Popups', 'PopupsTwoFactorConfiguration');
this.lock = ko.observable(false);
this.capaTwoFactor = Settings.capa(Enums.Capa.TwoFactor);
this.processing = ko.observable(false);
this.clearing = ko.observable(false);
this.secreting = ko.observable(false);
this.viewUser = ko.observable('');
this.twoFactorStatus = ko.observable(false);
this.twoFactorTested = ko.observable(false);
this.viewSecret = ko.observable('');
this.viewBackupCodes = ko.observable('');
this.viewUrlTitle = ko.observable('');
this.viewUrl = ko.observable('');
this.viewEnable_ = ko.observable(false);
this.viewEnable = ko.computed({
'owner': this,
'read': this.viewEnable_,
'write': function(bValue) {
var self = this;
bValue = !!bValue;
if (bValue && this.twoFactorTested())
{
this.viewEnable_(bValue);
Remote.enableTwoFactor(function(sResult, oData) {
if (Enums.StorageResultType.Success !== sResult || !oData || !oData.Result)
{
self.viewEnable_(false);
}
}, true);
}
else
{
if (!bValue)
{
this.viewEnable_(bValue);
}
Remote.enableTwoFactor(function(sResult, oData) {
if (Enums.StorageResultType.Success !== sResult || !oData || !oData.Result)
{
self.viewEnable_(false);
}
}, false);
}
}
});
this.viewTwoFactorEnableTooltip = ko.computed(function() {
Translator.trigger();
return this.twoFactorTested() || this.viewEnable_() ? '' :
Translator.i18n('POPUPS_TWO_FACTOR_CFG/TWO_FACTOR_SECRET_TEST_BEFORE_DESC');
}, this);
this.viewTwoFactorStatus = ko.computed(function() {
Translator.trigger();
return Translator.i18n(this.twoFactorStatus() ?
'POPUPS_TWO_FACTOR_CFG/TWO_FACTOR_SECRET_CONFIGURED_DESC' :
'POPUPS_TWO_FACTOR_CFG/TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC'
);
}, this);
this.twoFactorAllowedEnable = ko.computed(function() {
return this.viewEnable() || this.twoFactorTested();
}, this);
this.onResult = _.bind(this.onResult, this);
this.onShowSecretResult = _.bind(this.onShowSecretResult, this);
kn.constructorEnd(this);
}
kn.extendAsViewModel(['View/Popup/TwoFactorConfiguration', 'TwoFactorConfigurationPopupView'], TwoFactorConfigurationPopupView);
_.extend(TwoFactorConfigurationPopupView.prototype, AbstractView.prototype);
TwoFactorConfigurationPopupView.prototype.showSecret = function()
{
this.secreting(true);
Remote.showTwoFactorSecret(this.onShowSecretResult);
};
TwoFactorConfigurationPopupView.prototype.hideSecret = function()
{
this.viewSecret('');
this.viewBackupCodes('');
this.viewUrlTitle('');
this.viewUrl('');
};
TwoFactorConfigurationPopupView.prototype.createTwoFactor = function()
{
this.processing(true);
Remote.createTwoFactor(this.onResult);
};
TwoFactorConfigurationPopupView.prototype.logout = function()
{
require('App/User').default.logout();
};
TwoFactorConfigurationPopupView.prototype.testTwoFactor = function()
{
require('Knoin/Knoin').showScreenPopup(require('View/Popup/TwoFactorTest'), [this.twoFactorTested]);
};
TwoFactorConfigurationPopupView.prototype.clearTwoFactor = function()
{
this.viewSecret('');
this.viewBackupCodes('');
this.viewUrlTitle('');
this.viewUrl('');
this.twoFactorTested(false);
this.clearing(true);
Remote.clearTwoFactor(this.onResult);
};
TwoFactorConfigurationPopupView.prototype.onShow = function(bLock)
{
this.lock(!!bLock);
this.viewSecret('');
this.viewBackupCodes('');
this.viewUrlTitle('');
this.viewUrl('');
};
TwoFactorConfigurationPopupView.prototype.onHide = function()
{
if (this.lock())
{
window.location.reload();
}
};
TwoFactorConfigurationPopupView.prototype.getQr = function()
{
return 'otpauth://totp/' + window.encodeURIComponent(this.viewUser()) +
'?secret=' + window.encodeURIComponent(this.viewSecret()) +
'&issuer=' + window.encodeURIComponent('');
};
TwoFactorConfigurationPopupView.prototype.onResult = function(sResult, oData)
{
this.processing(false);
this.clearing(false);
if (Enums.StorageResultType.Success === sResult && oData && oData.Result)
{
this.viewUser(Utils.pString(oData.Result.User));
this.viewEnable_(!!oData.Result.Enable);
this.twoFactorStatus(!!oData.Result.IsSet);
this.twoFactorTested(!!oData.Result.Tested);
this.viewSecret(Utils.pString(oData.Result.Secret));
this.viewBackupCodes(Utils.pString(oData.Result.BackupCodes).replace(/[\s]+/g, ' '));
this.viewUrlTitle(Utils.pString(oData.Result.UrlTitle));
this.viewUrl(qr.toDataURL({level: 'M', size: 8, value: this.getQr()}));
}
else
{
this.viewUser('');
this.viewEnable_(false);
this.twoFactorStatus(false);
this.twoFactorTested(false);
this.viewSecret('');
this.viewBackupCodes('');
this.viewUrlTitle('');
this.viewUrl('');
}
};
TwoFactorConfigurationPopupView.prototype.onShowSecretResult = function(sResult, oData)
{
this.secreting(false);
if (Enums.StorageResultType.Success === sResult && oData && oData.Result)
{
this.viewSecret(Utils.pString(oData.Result.Secret));
this.viewUrlTitle(Utils.pString(oData.Result.UrlTitle));
this.viewUrl(qr.toDataURL({level: 'M', size: 6, value: this.getQr()}));
}
else
{
this.viewSecret('');
this.viewUrlTitle('');
this.viewUrl('');
}
};
TwoFactorConfigurationPopupView.prototype.onBuild = function()
{
if (this.capaTwoFactor)
{
this.processing(true);
Remote.getTwoFactor(this.onResult);
}
};
module.exports = TwoFactorConfigurationPopupView;