Browse Source

Replace Auth0 with file backup, fix service removal.

This took some doing, but fixed the service removal thanks to ES6
Promises and a lot of detective work.

Also removed Auth0, and replaced it with a human-readable JSON
exporter/importer that works in the same way.
pull/3202/head
TheGoddessInari 7 years ago
parent
commit
5940fa1111
  1. 2
      app.js
  2. 7
      app/Application.js
  3. 284
      app/package-lock.json
  4. 8
      app/package.json
  5. 256
      app/ux/Auth0.js
  6. 65
      app/ux/FileBackup.js
  7. 67
      app/view/main/Main.js
  8. 120
      app/view/main/MainController.js
  9. 1
      app/view/preferences/PreferencesController.js
  10. 171
      package-lock.json
  11. 15
      package.json

2
app.js

@ -1,5 +1,3 @@
var auth0, lock; // Auth0 vars
// Sencha App // Sencha App
Ext.setGlyphFontFamily('FontAwesome'); Ext.setGlyphFontFamily('FontAwesome');
Ext.application({ Ext.application({

7
app/Application.js

@ -4,7 +4,7 @@ Ext.define('Rambox.Application', {
,name: 'Rambox' ,name: 'Rambox'
,requires: [ ,requires: [
'Rambox.ux.Auth0' 'Rambox.ux.FileBackup'
,'Rambox.util.MD5' ,'Rambox.util.MD5'
,'Ext.window.Toast' ,'Ext.window.Toast'
,'Ext.util.Cookies' ,'Ext.util.Cookies'
@ -27,14 +27,11 @@ Ext.define('Rambox.Application', {
,launch: function () { ,launch: function () {
// Load language for Ext JS library // Load language for Ext JS library
Ext.Loader.loadScript({url: Ext.util.Format.format("ext/packages/ext-locale/build/ext-locale-{0}.js", localStorage.getItem('locale-auth0') || 'en')}); Ext.Loader.loadScript({url: Ext.util.Format.format("ext/packages/ext-locale/build/ext-locale-{0}.js", localStorage.getItem('locale') || 'en')});
// Initialize Auth0
if ( auth0Cfg.clientID !== '' && auth0Cfg.domain !== '' ) Rambox.ux.Auth0.init();
// Set cookies to help Tooltip.io messages segmentation // Set cookies to help Tooltip.io messages segmentation
Ext.util.Cookies.set('version', require('electron').remote.app.getVersion()); Ext.util.Cookies.set('version', require('electron').remote.app.getVersion());
if ( Ext.util.Cookies.get('auth0') === null ) Ext.util.Cookies.set('auth0', false);
// Check for updates // Check for updates
if ( require('electron').remote.process.argv.indexOf('--without-update') === -1 ) Rambox.app.checkUpdate(true); if ( require('electron').remote.process.argv.indexOf('--without-update') === -1 ) Rambox.app.checkUpdate(true);

284
app/package-lock.json generated

@ -0,0 +1,284 @@
{
"name": "Rambox",
"version": "0.5.18",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"applescript": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/applescript/-/applescript-1.0.0.tgz",
"integrity": "sha1-u4evVoytA0pOSMS9r2Bno6JwExc="
},
"auto-launch-patched": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/auto-launch-patched/-/auto-launch-patched-5.0.2.tgz",
"integrity": "sha1-8a5oPIwTG93Pr68YHuMsqGbwejM=",
"requires": {
"applescript": "^1.0.0",
"mkdirp": "^0.5.1",
"path-is-absolute": "^1.0.0",
"untildify": "^3.0.2",
"winreg": "1.2.2"
}
},
"conf": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/conf/-/conf-2.0.0.tgz",
"integrity": "sha512-iCLzBsGFi8S73EANsEJZz0JnJ/e5VZef/kSaxydYZLAvw0rFNAUx5R7K5leC/CXXR2mZfXWhUvcZOO/dM2D5xg==",
"requires": {
"dot-prop": "^4.1.0",
"env-paths": "^1.0.0",
"make-dir": "^1.0.0",
"pkg-up": "^2.0.0",
"write-file-atomic": "^2.3.0"
}
},
"dot-prop": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
"integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
"requires": {
"is-obj": "^1.0.0"
}
},
"electron-context-menu": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/electron-context-menu/-/electron-context-menu-0.10.0.tgz",
"integrity": "sha512-8dv+cOIpGuSmxAje3qdydd7kzfUTHBiEq6V80CqW76P5M92sEl0WpHHhNKxKFZ2L+mNr5Lp4R9qGjyfDiYI8yg==",
"requires": {
"electron-dl": "^1.2.0",
"electron-is-dev": "^0.3.0"
}
},
"electron-dl": {
"version": "1.12.0",
"resolved": "https://registry.npmjs.org/electron-dl/-/electron-dl-1.12.0.tgz",
"integrity": "sha512-UMc2CL45Ybpvu66LDPYzwmDRmYK4Ivz+wdnTM0eXcNMztvQwhixAk2UPme1c7McqG8bAlKEkQpZn3epmQy4EWg==",
"requires": {
"ext-name": "^5.0.0",
"pupa": "^1.0.0",
"unused-filename": "^1.0.0"
}
},
"electron-is-dev": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-0.3.0.tgz",
"integrity": "sha1-FOb9pcaOnk7L7/nM8DfL18BcWv4="
},
"electron-store": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/electron-store/-/electron-store-2.0.0.tgz",
"integrity": "sha512-1WCFYHsYvZBqDsoaS0Relnz0rd81ZkBAI0Fgx7Nq2UWU77rSNs1qxm4S6uH7TCZ0bV3LQpJFk7id/is/ZgoOPA==",
"requires": {
"conf": "^2.0.0"
}
},
"env-paths": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz",
"integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA="
},
"ext-list": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz",
"integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==",
"requires": {
"mime-db": "^1.28.0"
}
},
"ext-name": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz",
"integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==",
"requires": {
"ext-list": "^2.0.0",
"sort-keys-length": "^1.0.0"
}
},
"find-up": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
"integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
"requires": {
"locate-path": "^2.0.0"
}
},
"graceful-fs": {
"version": "4.1.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
"integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
},
"imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
},
"is-obj": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
"integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
},
"is-plain-obj": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
"integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
},
"locate-path": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
"integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
"requires": {
"p-locate": "^2.0.0",
"path-exists": "^3.0.0"
}
},
"make-dir": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
"integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
"requires": {
"pify": "^3.0.0"
}
},
"mime": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz",
"integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg=="
},
"mime-db": {
"version": "1.35.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz",
"integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg=="
},
"minimist": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
},
"mkdirp": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"requires": {
"minimist": "0.0.8"
}
},
"modify-filename": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/modify-filename/-/modify-filename-1.1.0.tgz",
"integrity": "sha1-mi3sg4Bvuy2XXyK+7IWcoms5OqE="
},
"os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
},
"p-limit": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
"integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
"requires": {
"p-try": "^1.0.0"
}
},
"p-locate": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
"integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
"requires": {
"p-limit": "^1.1.0"
}
},
"p-try": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
"integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
},
"path-exists": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
"integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
},
"pify": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
"integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
},
"pkg-up": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz",
"integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=",
"requires": {
"find-up": "^2.1.0"
}
},
"pupa": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/pupa/-/pupa-1.0.0.tgz",
"integrity": "sha1-mpVopa9+ZXuEYqbp1TKHQ1YM7/Y="
},
"signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
},
"sort-keys": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
"integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
"requires": {
"is-plain-obj": "^1.0.0"
}
},
"sort-keys-length": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz",
"integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=",
"requires": {
"sort-keys": "^1.0.0"
}
},
"tmp": {
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
"integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
"requires": {
"os-tmpdir": "~1.0.2"
}
},
"untildify": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz",
"integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA=="
},
"unused-filename": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unused-filename/-/unused-filename-1.0.0.tgz",
"integrity": "sha1-00CID3GuIRXrqhMlvvBcxmhEacY=",
"requires": {
"modify-filename": "^1.1.0",
"path-exists": "^3.0.0"
}
},
"winreg": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/winreg/-/winreg-1.2.2.tgz",
"integrity": "sha1-hQmvo7ccW70RCm18YkfsZ3NsWY8="
},
"write-file-atomic": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
"integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
"requires": {
"graceful-fs": "^4.1.11",
"imurmurhash": "^0.1.4",
"signal-exit": "^3.0.2"
}
}
}
}

8
app/package.json

@ -29,13 +29,11 @@
"author": "TheGoddessInari <thegoddessinari@gmail.com>", "author": "TheGoddessInari <thegoddessinari@gmail.com>",
"license": "GPL-3.0", "license": "GPL-3.0",
"dependencies": { "dependencies": {
"auth0-js": "^8.12.3",
"auth0-lock": "^10.22.0",
"auto-launch-patched": "5.0.2", "auto-launch-patched": "5.0.2",
"electron-store": "2.0.0", "electron-store": "^2.0.0",
"electron-context-menu": "0.10.0", "electron-context-menu": "^0.10.0",
"electron-is-dev": "^0.3.0", "electron-is-dev": "^0.3.0",
"mime": "^2.3.1", "mime": "^2.3.1",
"tmp": "0.0.33" "tmp": "^0.0.33"
} }
} }

256
app/ux/Auth0.js

@ -1,256 +0,0 @@
Ext.define('Rambox.ux.Auth0', {
singleton: true
// private
,lock: null
,auth0: null
,backupCurrent: false
,init: function() {
var me = this;
var Auth0Lock = require('auth0-lock')['default'];
var Auth0 = require('auth0-js');
// Auth0 Config
me.lock = new Auth0Lock(auth0Cfg.clientID, auth0Cfg.domain, {
autoclose: true
,autofocus: true
,auth: {
redirect: false
,params: {scope: 'openid offline_access'}
}
,theme: {
logo: 'resources/Icon.png'
,primaryColor: '#0675A0'
}
,languageDictionary: {
title: 'Rambox-OS Account'
}
,popupOptions: {
nodeIntegration: 'no'
}
,language: localStorage.getItem('locale-auth0') === null ? 'en' : localStorage.getItem('locale-auth0')
});
me.auth0 = new Auth0.WebAuth({ clientID: auth0Cfg.clientID, domain : auth0Cfg.domain });
me.defineEvents();
}
,defineEvents: function() {
var me = this;
me.lock.on("authenticated", function(authResult) {
me.lock.getProfile(authResult.idToken, function(err, profile) {
if ( err ) {
if ( err.error === 401 || err.error === 'Unauthorized' ) return me.renewToken(me.checkConfiguration);
Ext.Msg.hide();
return Ext.Msg.show({
title: 'Error'
,message: 'There was an error getting the profile: ' + err.error_description
,icon: Ext.Msg.ERROR
,buttons: Ext.Msg.OK
});
}
// Display a spinner while waiting
Ext.Msg.wait(locale['app.window[29]'], locale['app.window[28]']);
// Set cookies to help Tooltip.io messages segmentation
Ext.util.Cookies.set('auth0', true);
// User is logged in
// Save the profile and JWT.
localStorage.setItem('profile', JSON.stringify(profile));
localStorage.setItem('id_token', authResult.idToken);
localStorage.setItem('refresh_token', authResult.refreshToken);
if ( !Ext.isEmpty(profile.user_metadata) && !Ext.isEmpty(profile.user_metadata.services) && !me.backupCurrent ) {
Ext.each(profile.user_metadata.services, function(s) {
var service = Ext.create('Rambox.model.Service', s);
service.save();
Ext.getStore('Services').add(service);
});
require('electron').remote.getCurrentWindow().reload();
}
Ext.Msg.hide();
Ext.cq1('app-main').getViewModel().set('username', profile.name);
Ext.cq1('app-main').getViewModel().set('avatar', profile.picture);
});
});
}
,backupConfiguration: function(callback) {
var me = this;
Ext.Msg.wait('Saving backup...', 'Please wait...');
// Getting all services
var lastupdate = (new Date()).toJSON();
var services = [];
Ext.getStore('Services').each(function(service) {
var s = Ext.clone(service);
delete s.data.id;
delete s.data.zoomLevel;
services.push(s.data);
});
Ext.Ajax.request({
url: 'https://rambox.auth0.com/api/v2/users/'+Ext.decode(localStorage.getItem('profile')).user_id
,method: 'PATCH'
,headers: { authorization: "Bearer " + localStorage.getItem('id_token') }
,jsonData: { user_metadata: { services: services, services_lastupdate: lastupdate } }
,success: function(response) {
Ext.Msg.hide();
// Save the last update in localStorage
var profile = Ext.decode(localStorage.getItem('profile'));
if ( !profile.user_metadata ) profile.user_metadata = {};
profile.user_metadata.services_lastupdate = lastupdate;
localStorage.setItem('profile', Ext.encode(profile));
Ext.cq1('app-main').getViewModel().set('last_sync', new Date(lastupdate).toUTCString());
Ext.toast({
html: '<i class="fa fa-check fa-3x fa-pull-left" aria-hidden="true"></i> Your configuration were successfully backed up.'
,title: 'Synchronize Configuration'
,width: 300
,align: 't'
,closable: false
});
if ( Ext.isFunction(callback) ) callback.bind(me)();
}
,failure: function(response) {
if ( response.status === 401 ) return me.renewToken(me.backupConfiguration);
Ext.Msg.hide();
Ext.toast({
html: '<i class="fa fa-times fa-3x fa-pull-left" aria-hidden="true"></i> Error occurred when trying to backup your configuration.'
,title: 'Synchronize Configuration'
,width: 300
,align: 't'
,closable: false
});
if ( Ext.isFunction(callback) ) callback.bind(me)();
console.error(response);
}
});
}
,restoreConfiguration: function() {
var me = this;
me.lock.getProfile(localStorage.getItem('id_token'), function (err, profile) {
if ( err ) {
if ( err.error === 401 || err.error === 'Unauthorized' ) return me.renewToken(me.checkConfiguration);
return Ext.Msg.show({
title: 'Error'
,message: 'There was an error getting the profile: ' + err.error_description
,icon: Ext.Msg.ERROR
,buttons: Ext.Msg.OK
});
}
// First we remove all current services
Ext.cq1('app-main').getController().removeAllServices(false, function() {
Ext.each(profile.user_metadata.services, function(s) {
var service = Ext.create('Rambox.model.Service', s);
service.save();
Ext.getStore('Services').add(service);
});
require('electron').remote.getCurrentWindow().reload();
});
});
}
,checkConfiguration: function() {
var me = this;
me.lock.getProfile(localStorage.getItem('id_token'), function (err, profile) {
if ( err ) {
if ( err.error === 401 || err.error === 'Unauthorized' ) return me.renewToken(me.checkConfiguration);
return Ext.Msg.show({
title: 'Error'
,message: 'There was an error getting the profile: ' + err.error_description
,icon: Ext.Msg.ERROR
,buttons: Ext.Msg.OK
});
}
if ( !profile.user_metadata ) {
Ext.toast({
html: 'You don\'t have any backup yet.'
,title: 'Synchronize Configuration'
,width: 300
,align: 't'
,closable: false
});
return;
}
if ( Math.floor(new Date(profile.user_metadata.services_lastupdate) / 1000) > Math.floor(new Date(Ext.decode(localStorage.getItem('profile')).user_metadata.services_lastupdate) / 1000) ) {
Ext.toast({
html: 'Your settings are out of date.'
,title: 'Synchronize Configuration'
,width: 300
,align: 't'
,closable: false
});
} else {
Ext.toast({
html: 'Latest backup is already applied.'
,title: 'Synchronize Configuration'
,width: 300
,align: 't'
,closable: false
});
}
});
}
,renewToken: function(callback) {
var me = this;
Ext.Ajax.request({
url: 'https://rambox.auth0.com/delegation'
,method: 'POST'
,jsonData: {
grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer'
,client_id: auth0Cfg.clientID
,refresh_token: localStorage.getItem('refresh_token')
,api_type: 'app'
}
,success: function(response) {
var json = Ext.decode(response.responseText);
localStorage.setItem('id_token', json.id_token);
if ( Ext.isFunction(callback) ) callback.bind(me)();
}
,failure: function(response) {
console.error(response);
}
});
}
,login: function() {
var me = this;
me.lock.show();
}
,logout: function() {
var me = this;
localStorage.removeItem('profile');
localStorage.removeItem('id_token');
localStorage.removeItem('refresh_token');
// Set cookies to help Tooltip.io messages segmentation
Ext.util.Cookies.set('auth0', false);
}
});

65
app/ux/FileBackup.js

@ -0,0 +1,65 @@
const remote = require('electron').remote;
const dialog = remote.dialog;
const app = remote.app;
const fs = require('fs');
const path = require('path');
const userPath = app.getPath('userData');
const defaultFileName = 'rambox-backup.json';
const myDefaultPath = userPath + path.sep + defaultFileName;
Ext.define('Rambox.ux.FileBackup', {
singleton: true,
BackupConfiguration: function (callback) {
var me = this;
let services = [];
Ext.getStore('Services').each(function(service) {
const s = Ext.clone(service);
delete s.data.id;
delete s.data.zoomLevel;
services.push(s.data);
});
const json_string = JSON.stringify(services, null, 4);
dialog.showSaveDialog({
defaultPath: myDefaultPath
}, function(filename, bookmark) {
if (!filename) return;
fs.writeFile(filename, json_string, function(err) {
if (err) {
console.log(err);
}
});
});
if (Ext.isFunction(callback)) callback.bind(me)();
},
restoreConfiguration: function () {
var me = this;
dialog.showOpenDialog({
defaultPath: myDefaultPath,
properties: ['openFile']
}, function(filePaths, bookmarks) {
if (filePaths.length === 1) {
const filePath = filePaths[0];
console.log(filePath);
fs.readFile(filePath, function (err, data) {
if (err) {
console.log(err);
}
const services = JSON.parse(data);
if (services) {
console.dir(services);
Ext.cq1('app-main').getController().removeAllServices(true, function() {
Ext.each(services, function(s) {
const service = Ext.create('Rambox.model.Service', s);
service.save();
Ext.getStore('Services').add(service);
});
remote.getCurrentWindow().reload();
});
}
});
}
});
}
});

67
app/view/main/Main.js

@ -265,61 +265,22 @@ Ext.define('Rambox.view.main.Main', {
,style: 'border-radius: 50%;border:2px solid #d8d8d8;' ,style: 'border-radius: 50%;border:2px solid #d8d8d8;'
} }
,{ ,{
id: 'usernameBtn' text: 'Backup'
,bind: { ,glyph: 'xf0c7@FontAwesome'
text: '{username}' ,id: 'backupBtn'
,hidden: '{!username}' ,tooltip: 'Backup services to disk'
} ,scope: Rambox.ux.FileBackup
,menu: [ ,handler: Rambox.ux.FileBackup.backupConfiguration
{
text: 'Synchronize Configuration'
,glyph: 'xf0c2@FontAwesome'
,menu: [
{
xtype: 'label'
,bind: {
html: '<b class="menu-title">Last Sync: {last_sync}</b>'
}
}
,{
text: 'Backup'
,glyph: 'xf0ee@FontAwesome'
,scope: Rambox.ux.Auth0
,handler: Rambox.ux.Auth0.backupConfiguration
}
,{
text: 'Restore'
,glyph: 'xf0ed@FontAwesome'
,scope: Rambox.ux.Auth0
,handler: Rambox.ux.Auth0.restoreConfiguration
}
,{
text: 'Check for updated backup'
,glyph: 'xf021@FontAwesome'
,scope: Rambox.ux.Auth0
,handler: Rambox.ux.Auth0.checkConfiguration
}
]
}
,'-'
,{
text: locale['app.main[21]']
,glyph: 'xf08b@FontAwesome'
,handler: 'logout'
}
]
}
,{
text: locale['app.main[22]']
,icon: 'resources/auth0.png'
,id: 'loginBtn'
,tooltip: locale['app.main[23]']+'<br /><br /><i>'+locale['app.main[24]']+' Auth0 (https://auth0.com)</i>'
,bind: {
hidden: '{username}'
}
,handler: 'login'
} }
,{ ,{
text: 'Restore'
,glyph: 'xf115@FontAwesome'
,id: 'restoreBtn'
,tooltip: 'Restore services from disk'
,scope: Rambox.ux.FileBackup
,handler: Rambox.ux.FileBackup.restoreConfiguration
}
,{
tooltip: locale['preferences[0]'] tooltip: locale['preferences[0]']
,glyph: 'xf013@FontAwesome' ,glyph: 'xf013@FontAwesome'
,handler: 'openPreferences' ,handler: 'openPreferences'

120
app/view/main/MainController.js

@ -9,7 +9,9 @@ Ext.define('Rambox.view.main.MainController', {
tabPanel.setTabPosition(config.tabbar_location); tabPanel.setTabPosition(config.tabbar_location);
tabPanel.setTabRotation(0); tabPanel.setTabRotation(0);
let reorderer = tabPanel.plugins.find((plugin) => plugin.ptype === "tabreorderer"); let reorderer = tabPanel.plugins.find(function(plugin) {
return plugin.ptype === "tabreorderer";
});
if ( reorderer !== undefined ) { if ( reorderer !== undefined ) {
const names = reorderer.container.getLayout().names; const names = reorderer.container.getLayout().names;
@ -56,7 +58,7 @@ Ext.define('Rambox.view.main.MainController', {
var store = Ext.getStore('Services'); var store = Ext.getStore('Services');
var align = 'left'; var align = 'left';
store.suspendEvent('remove'); store.suspendEvent('childmove');
Ext.each(tabPanel.items.items, function(t, i) { Ext.each(tabPanel.items.items, function(t, i) {
if ( t.id !== 'ramboxTab' && t.id !== 'tbfill' && t.record.get('enabled') ) { if ( t.id !== 'ramboxTab' && t.id !== 'tbfill' && t.record.get('enabled') ) {
var rec = store.getById(t.record.get('id')); var rec = store.getById(t.record.get('id'));
@ -72,7 +74,7 @@ Ext.define('Rambox.view.main.MainController', {
}); });
store.load(); store.load();
store.resumeEvent('remove'); store.resumeEvent('childmove');
} }
,showServiceTab: function( grid, record, tr, rowIndex, e ) { ,showServiceTab: function( grid, record, tr, rowIndex, e ) {
@ -125,47 +127,44 @@ Ext.define('Rambox.view.main.MainController', {
}); });
} }
,removeServiceFn: function(serviceId, total, actual) { ,removeServiceFn: function(serviceId, total, actual, resolve) {
var me = this; var me = this;
if ( !serviceId ) return false; if ( !serviceId ) return false;
// Get Record // Get Record
var rec = Ext.getStore('Services').getById(serviceId); const rec = Ext.getStore('Services').getById(serviceId);
if ( !rec.get('enabled') ) { if ( !rec.get('enabled') ) {
rec.set('enabled', true); rec.set('enabled', true);
me.onEnableDisableService(null, Ext.getStore('Services').indexOf(rec), true, null, true); me.onEnableDisableService(null, Ext.getStore('Services').indexOf(rec), true, null, true);
Ext.defer(function() { const tab = Ext.getCmp('tab_'+serviceId);
// Get Tab const webview = tab.getWebView();
var tab = Ext.getCmp('tab_'+serviceId);
// Clear all trash data webview.addEventListener("did-start-loading", function() {
const webview = tab.getWebView(); clearData(webview, tab, resolve);
});
webview.addEventListener("did-start-loading", function() {
clearData(webview, tab);
});
}, 1000);
} else { } else {
// Get Tab // Get Tab
var tab = Ext.getCmp('tab_'+serviceId);
// Clear all trash data // Clear all trash data
const tab = Ext.getCmp('tab_'+serviceId);
const webview = tab.getWebView(); const webview = tab.getWebView();
clearData(webview, tab); clearData(webview, tab, resolve);
} }
const config = ipc.sendSync('getConfig'); const config = ipc.sendSync('getConfig');
if ( config.default_service === rec.get('id') ) ipc.send('setConfig', Ext.apply(config, { default_service: 'ramboxTab' })); if ( config.default_service === rec.get('id') ) ipc.send('setConfig', Ext.apply(config, { default_service: 'ramboxTab' }));
function clearData(webview, tab) { function clearData(webview, tab, resolve) {
webview.getWebContents().clearHistory(); webview.getWebContents().clearHistory();
webview.getWebContents().session.flushStorageData(); webview.getWebContents().session.flushStorageData();
webview.getWebContents().session.clearCache(function() { webview.getWebContents().session.clearCache(function () {
webview.getWebContents().session.clearStorageData(function() { webview.getWebContents().session.clearStorageData(function () {
webview.getWebContents().session.cookies.flushStore(function() { webview.getWebContents().session.cookies.flushStore(function() {
// Remove record from localStorage // Remove record from localStorage
Ext.getStore('Services').remove(rec); Ext.getStore('Services').remove(rec);
// Close tab // Close tab
tab.close(); tab.close();
if ( Ext.isFunction(resolve) ) resolve();
// Close waiting message // Close waiting message
if ( total === actual ) Ext.Msg.hide(); if ( total === actual ) Ext.Msg.hide();
}); });
@ -191,33 +190,44 @@ Ext.define('Rambox.view.main.MainController', {
// Clear counter for unread messaging // Clear counter for unread messaging
document.title = 'Rambox-OS'; document.title = 'Rambox-OS';
const store = Ext.getStore('Services');
if ( btn ) { if ( btn ) {
Ext.Msg.confirm(locale['app.window[12]'], locale['app.window[14]'], function(btnId) { Ext.Msg.confirm(locale['app.window[12]'], locale['app.window[14]'], function(btnId) {
if ( btnId === 'yes' ) { if ( btnId === 'yes' ) {
Ext.cq1('app-main').suspendEvent('remove');
Ext.getStore('Services').load();
Ext.Msg.wait('Please wait until we clear all.', 'Removing...'); Ext.Msg.wait('Please wait until we clear all.', 'Removing...');
const count = Ext.getStore('Services').getCount(); _removeAllServices(callback);
var i = 1;
Ext.Array.each(Ext.getStore('Services').collect('id'), function(serviceId) {
me.removeServiceFn(serviceId, count, i++);
});
if ( Ext.isFunction(callback) ) callback();
Ext.cq1('app-main').resumeEvent('remove');
document.title = 'Rambox-OS';
} }
}); });
} else { } else {
Ext.cq1('app-main').suspendEvent('remove'); _removeAllServices(callback);
Ext.getStore('Services').load(); }
const count = Ext.getStore('Services').getCount(); function _removeAllServices (callback) {
var i = 1; store.load(function(records, operation, success) {
Ext.Array.each(Ext.getStore('Services').collect('id'), function(serviceId) { store.suspendEvent('remove');
me.removeServiceFn(serviceId, count, i++); store.suspendEvent('childmove');
const count = store.getCount();
let i = 1;
let promises = [];
Ext.Array.each(store.collect('id'), function(serviceId) {
promises.push(new Promise(function(resolve) {
me.removeServiceFn(serviceId, count, i++, resolve);
}));
});
Promise.all(promises)
.then(function(value) {
if ( Ext.isFunction(callback) ) callback();
})
.catch(function(err) {
console.error('Error removing services: ' + err);
Ext.Msg.alert('Error!','Error removing services: ' + err);
})
.then(function() { // Replace when Promise.finally when available.
store.resumeEvent('childmove');
store.resumeEvent('remove');
document.title = 'Rambox-OS';
});
}); });
if ( Ext.isFunction(callback) ) callback();
Ext.cq1('app-main').resumeEvent('remove');
document.title = 'Rambox-OS';
} }
} }
@ -458,36 +468,4 @@ Ext.define('Rambox.view.main.MainController', {
Ext.create('Rambox.view.preferences.Preferences').show(); Ext.create('Rambox.view.preferences.Preferences').show();
} }
,login: function(btn) {
var me = this;
Rambox.ux.Auth0.login();
}
,logout: function(btn) {
var me = this;
var logoutFn = function(callback) {
Ext.Msg.wait(locale['app.window[37]'], locale['app.main[21]']);
// Logout from Auth0
Rambox.ux.Auth0.logout();
Ext.cq1('app-main').getViewModel().set('username', '');
Ext.cq1('app-main').getViewModel().set('avatar', '');
if ( Ext.isFunction(callback) ) callback();
};
if ( btn ) {
Ext.Msg.confirm(locale['app.main[21]'], locale['app.window[38]'], function(btnId) {
if ( btnId === 'yes' ) {
logoutFn(me.removeAllServices.bind(me));
}
});
} else {
logoutFn();
}
}
}); });

1
app/view/preferences/PreferencesController.js

@ -48,7 +48,6 @@ Ext.define('Rambox.view.preferences.PreferencesController', {
// Locale // Locale
if ( values.locale !== ipc.sendSync('getConfig').locale ) { if ( values.locale !== ipc.sendSync('getConfig').locale ) {
localStorage.setItem('locale', values.locale); localStorage.setItem('locale', values.locale);
localStorage.setItem('locale-auth0', me.getView().down('form').down('combo[name="locale"]').getSelection().get('auth0'));
Ext.Msg.confirm('Action required', 'To change the language of Rambox, you need to reload the app. Do you want to do it now?', function(btnId) { Ext.Msg.confirm('Action required', 'To change the language of Rambox, you need to reload the app. Do you want to do it now?', function(btnId) {
if ( btnId === 'yes' ) ipc.send('relaunchApp'); if ( btnId === 'yes' ) ipc.send('relaunchApp');
}); });

171
package-lock.json generated

@ -24,6 +24,12 @@
"integrity": "sha512-LAQ1d4OPfSJ/BMbI2DuizmYrrkD9JMaTdi2hQTlI53lQ4kRQPyZQRS4CYQ7O66bnBBnP/oYdRxbk++X0xuFU6A==", "integrity": "sha512-LAQ1d4OPfSJ/BMbI2DuizmYrrkD9JMaTdi2hQTlI53lQ4kRQPyZQRS4CYQ7O66bnBBnP/oYdRxbk++X0xuFU6A==",
"dev": true "dev": true
}, },
"@types/node": {
"version": "8.10.24",
"resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.24.tgz",
"integrity": "sha512-5YaBKa6oFuWy7ptIFMATyftIcpZTZtvgrzPThEbs+kl4Uu41oUxiRunG0k32QZjD6MXMELls//ry/epNxc11aQ==",
"dev": true
},
"abbrev": { "abbrev": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@ -126,33 +132,32 @@
} }
}, },
"app-builder-bin": { "app-builder-bin": {
"version": "2.0.0", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-2.0.0.tgz", "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-2.1.1.tgz",
"integrity": "sha512-JUJ1Wiaig1589MxF110HHh5I5v9hn2Qu4ZeleNwSZHfD1S2LrCxm4H+q7Snr/rWlWdEChFoWM2lj11Cdl4LP0Q==", "integrity": "sha512-ye0fQcG/msVKJcHBOZOfXf8kIkHoY+1ZYpWyFH/jyeNRwlsdBQCmg0A+pbbTyvjiet9XQzPVA7s21oyRhUixRQ==",
"dev": true "dev": true
}, },
"app-builder-lib": { "app-builder-lib": {
"version": "20.26.1", "version": "20.27.1",
"resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-20.26.1.tgz", "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-20.27.1.tgz",
"integrity": "sha512-tLRC9bU3f7TgeK//jjDfhwzQymmLACkcs6vC/5VZLstVigg0G55RejsD4cCP3YA7fdUNNH6MaOAUh4l9FblCMg==", "integrity": "sha512-nuGl5s6dGp0lbLfM3Ef/tst3ZAeKznBb+SB0zNjHR8chbU7338451y7TfDXkcLQVkvMivfhwIRlUCyN/sH5KKA==",
"dev": true, "dev": true,
"requires": { "requires": {
"7zip-bin": "~4.0.2", "7zip-bin": "~4.0.2",
"app-builder-bin": "2.0.0", "app-builder-bin": "2.1.1",
"async-exit-hook": "^2.0.1", "async-exit-hook": "^2.0.1",
"bluebird-lst": "^1.0.5", "bluebird-lst": "^1.0.5",
"builder-util": "5.20.1", "builder-util": "6.0.0",
"builder-util-runtime": "4.4.1", "builder-util-runtime": "4.4.1",
"chromium-pickle-js": "^0.2.0", "chromium-pickle-js": "^0.2.0",
"debug": "^3.1.0", "debug": "^3.1.0",
"ejs": "^2.6.1", "ejs": "^2.6.1",
"electron-osx-sign": "0.4.10", "electron-osx-sign": "0.4.10",
"electron-publish": "20.26.0", "electron-publish": "20.27.0",
"env-paths": "^1.0.0",
"fs-extra-p": "^4.6.1", "fs-extra-p": "^4.6.1",
"hosted-git-info": "^2.7.1", "hosted-git-info": "^2.7.1",
"is-ci": "^1.1.0", "is-ci": "^1.1.0",
"isbinaryfile": "^3.0.2", "isbinaryfile": "^3.0.3",
"js-yaml": "^3.12.0", "js-yaml": "^3.12.0",
"lazy-val": "^1.0.3", "lazy-val": "^1.0.3",
"minimatch": "^3.0.4", "minimatch": "^3.0.4",
@ -161,7 +166,6 @@
"read-config-file": "3.1.0", "read-config-file": "3.1.0",
"sanitize-filename": "^1.6.1", "sanitize-filename": "^1.6.1",
"semver": "^5.5.0", "semver": "^5.5.0",
"sumchecker": "^2.0.2",
"temp-file": "^3.1.3" "temp-file": "^3.1.3"
}, },
"dependencies": { "dependencies": {
@ -781,13 +785,13 @@
"dev": true "dev": true
}, },
"builder-util": { "builder-util": {
"version": "5.20.1", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/builder-util/-/builder-util-5.20.1.tgz", "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-6.0.0.tgz",
"integrity": "sha512-rqSl3Tbi/sECIVWAys8Blic4UEzUpZkGgmVXR2mZwdVPreNnfY3MHqSGSxlJRMTqxSsO0SgxnAEnanBNw4212g==", "integrity": "sha512-PPwBEQa8zNcgd0ht2IozdD9QDdrADSl/TkceGcErkT7By1v8LLcomBAThm+t+0Ebm7q6JJbdL2SShM6wbXRCUg==",
"dev": true, "dev": true,
"requires": { "requires": {
"7zip-bin": "~4.0.2", "7zip-bin": "~4.0.2",
"app-builder-bin": "2.0.0", "app-builder-bin": "2.1.1",
"bluebird-lst": "^1.0.5", "bluebird-lst": "^1.0.5",
"builder-util-runtime": "^4.4.1", "builder-util-runtime": "^4.4.1",
"chalk": "^2.4.1", "chalk": "^2.4.1",
@ -2002,14 +2006,14 @@
} }
}, },
"dmg-builder": { "dmg-builder": {
"version": "5.1.0", "version": "5.2.0",
"resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-5.1.0.tgz", "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-5.2.0.tgz",
"integrity": "sha512-Pyi64um0eZMwwyZeKM2ckhwuCQCvudcRXDwREHm7m9hYzzfKVWmExYXIV0+a9aaeqHesqxwfWyTwl3lwThW+Bw==", "integrity": "sha512-0doOlH/Lew4St3X5UwEyuj763sDa4GIJPBDr/0hDywPn06atclRO36Bf6oEy9BEp7YaNV5aoaOfH3l8SBBacYQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"app-builder-lib": "~20.26.0", "app-builder-lib": "~20.27.0",
"bluebird-lst": "^1.0.5", "bluebird-lst": "^1.0.5",
"builder-util": "~5.20.0", "builder-util": "~6.0.0",
"fs-extra-p": "^4.6.1", "fs-extra-p": "^4.6.1",
"iconv-lite": "^0.4.23", "iconv-lite": "^0.4.23",
"js-yaml": "^3.12.0", "js-yaml": "^3.12.0",
@ -2071,18 +2075,29 @@
"integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==",
"dev": true "dev": true
}, },
"electron": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/electron/-/electron-2.0.7.tgz",
"integrity": "sha512-MRrDE6mrp+ZrIBpZM27pxbO2yEDKYfkmc6Ll79BtedMNEZsY4+oblupeDJL6RM6meUIp82KMo63W7fP65Tb89Q==",
"dev": true,
"requires": {
"@types/node": "^8.0.24",
"electron-download": "^3.0.1",
"extract-zip": "^1.0.3"
}
},
"electron-builder": { "electron-builder": {
"version": "20.26.1", "version": "20.27.1",
"resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-20.26.1.tgz", "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-20.27.1.tgz",
"integrity": "sha512-WEqb8BVdcc8uSfWW9TA9WrltG4TDydwhlUIINkyXVOz68ckV56dSt383unTT9Awo+6oFsjABZdMMYtAjLAuDEw==", "integrity": "sha512-jsrUX2t8Yx8n5lVzIZ7AOMGlSYSb2iZhD+BX1DQ9H0O2FNDhWBNRfQQyj0mM2slNsk+5RWpK8FpOOsn5Z8BIqw==",
"dev": true, "dev": true,
"requires": { "requires": {
"app-builder-lib": "20.26.1", "app-builder-lib": "20.27.1",
"bluebird-lst": "^1.0.5", "bluebird-lst": "^1.0.5",
"builder-util": "5.20.1", "builder-util": "6.0.0",
"builder-util-runtime": "4.4.1", "builder-util-runtime": "4.4.1",
"chalk": "^2.4.1", "chalk": "^2.4.1",
"dmg-builder": "5.1.0", "dmg-builder": "5.2.0",
"fs-extra-p": "^4.6.1", "fs-extra-p": "^4.6.1",
"is-ci": "^1.1.0", "is-ci": "^1.1.0",
"lazy-val": "^1.0.3", "lazy-val": "^1.0.3",
@ -2137,6 +2152,63 @@
} }
} }
}, },
"electron-download": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/electron-download/-/electron-download-3.3.0.tgz",
"integrity": "sha1-LP1U1pZsAZxNSa1l++Zcyc3vaMg=",
"dev": true,
"requires": {
"debug": "^2.2.0",
"fs-extra": "^0.30.0",
"home-path": "^1.0.1",
"minimist": "^1.2.0",
"nugget": "^2.0.0",
"path-exists": "^2.1.0",
"rc": "^1.1.2",
"semver": "^5.3.0",
"sumchecker": "^1.2.0"
},
"dependencies": {
"fs-extra": {
"version": "0.30.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz",
"integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
"jsonfile": "^2.1.0",
"klaw": "^1.0.0",
"path-is-absolute": "^1.0.0",
"rimraf": "^2.2.8"
}
},
"minimist": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"dev": true
},
"path-exists": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
"integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
"dev": true,
"requires": {
"pinkie-promise": "^2.0.0"
}
},
"sumchecker": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-1.3.1.tgz",
"integrity": "sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0=",
"dev": true,
"requires": {
"debug": "^2.2.0",
"es6-promise": "^4.0.5"
}
}
}
},
"electron-osx-sign": { "electron-osx-sign": {
"version": "0.4.10", "version": "0.4.10",
"resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.10.tgz", "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.10.tgz",
@ -2177,26 +2249,18 @@
} }
}, },
"electron-publish": { "electron-publish": {
"version": "20.26.0", "version": "20.27.0",
"resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-20.26.0.tgz", "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-20.27.0.tgz",
"integrity": "sha512-CPh/U+qyyG8HXrS3s/E2JAgrmysIMDij9VTqz2QAUAwExH1e5V06iII0eMn47BFRRVqw4yF8VMzefuugpwAbkg==", "integrity": "sha512-bmyA9PbXeYDoh2S3Q5Rcs/AT3XUKxPnx0aChfy/qbsPBc/DtZirKuHh8B9SVjo8nK9wqm531rempyEOh3LAkDw==",
"dev": true, "dev": true,
"requires": { "requires": {
"bluebird-lst": "^1.0.5", "bluebird-lst": "^1.0.5",
"builder-util": "~5.20.0", "builder-util": "~6.0.0",
"builder-util-runtime": "^4.4.1", "builder-util-runtime": "^4.4.1",
"chalk": "^2.4.1", "chalk": "^2.4.1",
"fs-extra-p": "^4.6.1", "fs-extra-p": "^4.6.1",
"lazy-val": "^1.0.3", "lazy-val": "^1.0.3",
"mime": "^2.3.1" "mime": "^2.3.1"
},
"dependencies": {
"mime": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz",
"integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==",
"dev": true
}
} }
}, },
"end-of-stream": { "end-of-stream": {
@ -2223,6 +2287,12 @@
"is-arrayish": "^0.2.1" "is-arrayish": "^0.2.1"
} }
}, },
"es6-promise": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz",
"integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==",
"dev": true
},
"escape-string-regexp": { "escape-string-regexp": {
"version": "1.0.5", "version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
@ -2881,6 +2951,12 @@
"integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
"dev": true "dev": true
}, },
"home-path": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.6.tgz",
"integrity": "sha512-wo+yjrdAtoXt43Vy92a+0IPCYViiyLAHyp0QVS4xL/tfvVz5sXIW1ubLZk3nhVkD92fQpUMKX+fzMjr5F489vw==",
"dev": true
},
"hosted-git-info": { "hosted-git-info": {
"version": "2.7.1", "version": "2.7.1",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
@ -3263,10 +3339,13 @@
"dev": true "dev": true
}, },
"isbinaryfile": { "isbinaryfile": {
"version": "3.0.2", "version": "3.0.3",
"resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz",
"integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==",
"dev": true "dev": true,
"requires": {
"buffer-alloc": "^1.2.0"
}
}, },
"isexe": { "isexe": {
"version": "2.0.0", "version": "2.0.0",
@ -3606,6 +3685,12 @@
"to-regex": "^3.0.2" "to-regex": "^3.0.2"
} }
}, },
"mime": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz",
"integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==",
"dev": true
},
"mime-types": { "mime-types": {
"version": "2.1.19", "version": "2.1.19",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz",

15
package.json

@ -5,7 +5,7 @@
"start:debug": "electron electron/main.js --enable-logging", "start:debug": "electron electron/main.js --enable-logging",
"test": "./node_modules/.bin/mocha test/tests/**/*.spec.js", "test": "./node_modules/.bin/mocha test/tests/**/*.spec.js",
"clean": "rimraf ./build/production", "clean": "rimraf ./build/production",
"compile": "sencha app build && cpy app/package.json build/production/Rambox/", "compile": "sencha app build && cpy app/package.json app/package-lock.json build/production/Rambox/",
"recompile": "npm run distclean && npm run compile", "recompile": "npm run distclean && npm run compile",
"distclean": "rimraf ./dist", "distclean": "rimraf ./dist",
"distclean:win": "rimraf ./dist/win-{ia32-,}unpacked", "distclean:win": "rimraf ./dist/win-{ia32-,}unpacked",
@ -102,13 +102,14 @@
}, },
"devDependencies": { "devDependencies": {
"asar": "^0.14.3", "asar": "^0.14.3",
"chai": "4.1.2", "chai": "^4.1.2",
"cpy-cli": "2.0.0", "cpy-cli": "^2.0.0",
"crowdin": "1.0.0", "crowdin": "^1.0.0",
"csvjson": "5.1.0", "csvjson": "^5.1.0",
"electron-builder": "^20.26.1", "electron": "^2.0.7",
"electron-builder": "^20.27.1",
"mocha": "^5.2.0", "mocha": "^5.2.0",
"rimraf": "2.6.2", "rimraf": "^2.6.2",
"spectron": "^3.8.0" "spectron": "^3.8.0"
} }
} }

Loading…
Cancel
Save