Browse Source

Persistent Lock and improved usability for Locking flow

Fixes #128
pull/223/head
Ramiro Saenz 9 years ago
parent
commit
5e531499d8
  1. 10
      app/Application.js
  2. 143
      app/util/MD5.js
  3. 8
      app/ux/WebView.js
  4. 136
      app/view/main/MainController.js

10
app/Application.js

@ -4,7 +4,8 @@ Ext.define('Rambox.Application', {
,name: 'Rambox' ,name: 'Rambox'
,requires: [ ,requires: [
'Rambox.ux.Firebase' 'Rambox.ux.Firebase'
,'Rambox.util.MD5'
] ]
,stores: [ ,stores: [
@ -108,7 +109,7 @@ Ext.define('Rambox.Application', {
,handler: function(key) { ,handler: function(key) {
var btn = Ext.getCmp('disturbBtn'); var btn = Ext.getCmp('disturbBtn');
btn.toggle(); btn.toggle();
Ext.cq1('app-main').getController().dontDisturb(btn); Ext.cq1('app-main').getController().dontDisturb(btn, true);
} }
} }
,{ ,{
@ -163,6 +164,11 @@ Ext.define('Rambox.Application', {
console.info('Your version is the latest. No need to update.') console.info('Your version is the latest. No need to update.')
}); });
if ( localStorage.getItem('locked') ) {
console.info('Lock Rambox:', 'Enabled');
Ext.cq1('app-main').getController().showLockWindow();
}
// Remove spinner // Remove spinner
Ext.get('spinner').destroy(); Ext.get('spinner').destroy();
} }

143
app/util/MD5.js

@ -0,0 +1,143 @@
Ext.define('Rambox.util.MD5', {
singleton: true
,encypt: function(s, raw, hexcase, chrsz) {
raw = raw || false;
hexcase = hexcase || false;
chrsz = chrsz || 8;
function safe_add(x, y){
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xFFFF);
}
function bit_rol(num, cnt){
return (num << cnt) | (num >>> (32 - cnt));
}
function md5_cmn(q, a, b, x, s, t){
return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
}
function md5_ff(a, b, c, d, x, s, t){
return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
}
function md5_gg(a, b, c, d, x, s, t){
return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
}
function md5_hh(a, b, c, d, x, s, t){
return md5_cmn(b ^ c ^ d, a, b, x, s, t);
}
function md5_ii(a, b, c, d, x, s, t){
return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
}
function core_md5(x, len){
x[len >> 5] |= 0x80 << ((len) % 32);
x[(((len + 64) >>> 9) << 4) + 14] = len;
var a = 1732584193;
var b = -271733879;
var c = -1732584194;
var d = 271733878;
for(var i = 0; i < x.length; i += 16){
var olda = a;
var oldb = b;
var oldc = c;
var oldd = d;
a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819);
b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426);
c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416);
d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682);
d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329);
a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
c = md5_gg(c, d, a, b, x[i+11], 14, 643717713);
b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083);
c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438);
d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501);
a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473);
b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562);
b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353);
c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174);
d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189);
a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
c = md5_hh(c, d, a, b, x[i+15], 16, 530742520);
b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415);
c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571);
d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359);
d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649);
a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259);
b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
a = safe_add(a, olda);
b = safe_add(b, oldb);
c = safe_add(c, oldc);
d = safe_add(d, oldd);
}
return [a, b, c, d];
}
function str2binl(str){
var bin = [];
var mask = (1 << chrsz) - 1;
for(var i = 0; i < str.length * chrsz; i += chrsz) {
bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
}
return bin;
}
function binl2str(bin){
var str = "";
var mask = (1 << chrsz) - 1;
for(var i = 0; i < bin.length * 32; i += chrsz) {
str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
}
return str;
}
function binl2hex(binarray){
var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
var str = "";
for(var i = 0; i < binarray.length * 4; i++) {
str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) + hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF);
}
return str;
}
return (raw ? binl2str(core_md5(str2binl(s), s.length * chrsz)) : binl2hex(core_md5(str2binl(s), s.length * chrsz)) );
}
});

8
app/ux/WebView.js

@ -130,11 +130,15 @@ Ext.define('Rambox.ux.WebView',{
webview.addEventListener("dom-ready", function(e) { webview.addEventListener("dom-ready", function(e) {
// Mute Webview // Mute Webview
if ( me.muted ) me.setAudioMuted(me.muted); if ( me.muted || localStorage.getItem('locked') ) me.setAudioMuted(true);
// Notifications in Webview // Notifications in Webview
webview.executeJavaScript('var originalNotification = Notification;'); webview.executeJavaScript('var originalNotification = Notification;');
if ( me.notifications ) me.setNotifications(me.notifications); if ( me.notifications ) {
me.setNotifications(me.notifications);
} else if ( localStorage.getItem('locked') ) {
me.setNotifications(false);
}
// Injected code to detect new messages // Injected code to detect new messages
if ( me.record ) { if ( me.record ) {

136
app/view/main/MainController.js

@ -750,6 +750,8 @@ Ext.define('Rambox.view.main.MainController', {
btn.setText('Don\'t Disturb: ' + ( btn.pressed ? 'ON' : 'OFF' )); btn.setText('Don\'t Disturb: ' + ( btn.pressed ? 'ON' : 'OFF' ));
// If this method is called from Lock method, prevent showing toast
if ( !e ) return;
Ext.toast({ Ext.toast({
html: btn.pressed ? 'ENABLED' : 'DISABLED' html: btn.pressed ? 'ENABLED' : 'DISABLED'
,title: 'Don\'t Disturb' ,title: 'Don\'t Disturb'
@ -776,65 +778,19 @@ Ext.define('Rambox.view.main.MainController', {
}); });
return false; return false;
} }
console.info('Lock Rambox:', 'Enabled');
// Save encrypted password in localStorage to show locked when app is reopen
localStorage.setItem('locked', Rambox.util.MD5.encypt(text));
// Google Analytics Event // Google Analytics Event
ga_storage._trackEvent('Usability', 'locked'); ga_storage._trackEvent('Usability', 'locked');
me.lookupReference('disturbBtn').setPressed(true); me.lookupReference('disturbBtn').setPressed(true);
me.dontDisturb(me.lookupReference('disturbBtn'), false, true); me.dontDisturb(me.lookupReference('disturbBtn'), false, true);
var winLock = Ext.create('Ext.window.Window', {
width: '100%' me.showLockWindow();
,height: '100%'
,closable: false
,minimizable: false
,maximizable: false
,draggable: false
,onEsc: Ext.emptyFn
,layout: 'center'
,bodyStyle: 'background-color:#2e658e;'
,items: [
{
xtype: 'container'
,layout: 'vbox'
,items: [
{
xtype: 'image'
,src: 'resources/Icon.png'
,width: 256
,height: 256
}
,{
xtype: 'component'
,autoEl: {
tag: 'h1'
,html: 'Rambox is locked'
,style: 'text-align:center;width:256px;'
}
}
,{
xtype: 'textfield'
,inputType: 'password'
,width: 256
}
,{
xtype: 'button'
,text: 'UNLOCK'
,glyph: 'xf13e@FontAwesome'
,width: 256
,scale: 'large'
,handler: function() {
if ( text === winLock.down('textfield').getValue() ) {
winLock.close();
me.lookupReference('disturbBtn').setPressed(false);
me.dontDisturb(me.lookupReference('disturbBtn'));
} else {
winLock.down('textfield').markInvalid('Unlock password is invalid');
}
}
}
]
}
]
}).show();
} }
}); });
msgbox2.textField.inputEl.dom.type = 'password'; msgbox2.textField.inputEl.dom.type = 'password';
@ -843,6 +799,78 @@ Ext.define('Rambox.view.main.MainController', {
msgbox.textField.inputEl.dom.type = 'password'; msgbox.textField.inputEl.dom.type = 'password';
} }
,showLockWindow: function() {
var me = this;
var validateFn = function() {
if ( localStorage.getItem('locked') === Rambox.util.MD5.encypt(winLock.down('textfield').getValue()) ) {
console.info('Lock Rambox:', 'Disabled');
localStorage.removeItem('locked');
winLock.close();
me.lookupReference('disturbBtn').setPressed(false);
me.dontDisturb(me.lookupReference('disturbBtn'), false);
} else {
winLock.down('textfield').reset();
winLock.down('textfield').markInvalid('Unlock password is invalid');
}
};
var winLock = Ext.create('Ext.window.Window', {
width: '100%'
,height: '100%'
,closable: false
,minimizable: false
,maximizable: false
,draggable: false
,onEsc: Ext.emptyFn
,layout: 'center'
,bodyStyle: 'background-color:#2e658e;'
,items: [
{
xtype: 'container'
,layout: 'vbox'
,items: [
{
xtype: 'image'
,src: 'resources/Icon.png'
,width: 256
,height: 256
}
,{
xtype: 'component'
,autoEl: {
tag: 'h1'
,html: 'Rambox is locked'
,style: 'text-align:center;width:256px;'
}
}
,{
xtype: 'textfield'
,inputType: 'password'
,width: 256
,listeners: {
specialkey: function(field, e){
if ( e.getKey() == e.ENTER ) {
validateFn();
}
}
}
}
,{
xtype: 'button'
,text: 'UNLOCK'
,glyph: 'xf13e@FontAwesome'
,width: 256
,scale: 'large'
,handler: validateFn
}
]
}
]
}).show();
winLock.down('textfield').focus(1000);
}
,login: function(btn) { ,login: function(btn) {
var me = this; var me = this;

Loading…
Cancel
Save