From a0d6884fd7bb7fbf140ca72d65f977cb101b912e Mon Sep 17 00:00:00 2001 From: Baptiste Grob <60621355+baptiste-grob@users.noreply.github.com> Date: Fri, 4 Sep 2020 19:01:22 +0200 Subject: [PATCH 01/15] fix: prevent importing backup files with version > 003 --- .../javascripts/directives/views/accountMenu.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/app/assets/javascripts/directives/views/accountMenu.js b/app/assets/javascripts/directives/views/accountMenu.js index a14389ed6..fb38bef4e 100644 --- a/app/assets/javascripts/directives/views/accountMenu.js +++ b/app/assets/javascripts/directives/views/accountMenu.js @@ -377,6 +377,17 @@ class AccountMenuCtrl extends PureCtrl { } async performImport(data, password) { + if (data.keyParams) { + if (Number(data.keyParams.version) > 3) { + this.setState({ + importData: null + }); + this.alertManager.alert({ + text: "This backup file was created using a later version of the application and cannot be imported." + }); + return; + } + } await this.setState({ importData: { ...this.state.importData, From 157b6c50b23f6da836d9943402b9d2c0cf72e2de Mon Sep 17 00:00:00 2001 From: Baptiste Grob <60621355+baptiste-grob@users.noreply.github.com> Date: Fri, 4 Sep 2020 19:02:04 +0200 Subject: [PATCH 02/15] chore(version): 3.3.10 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 82642176c..da58c5090 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "standard-notes-web", - "version": "3.3.6", + "version": "3.3.10", "license": "AGPL-3.0-or-later", "repository": { "type": "git", From 3b525ae40ac11a74864c2ed5584f13d09b0ce9c7 Mon Sep 17 00:00:00 2001 From: Baptiste Grob <60621355+baptiste-grob@users.noreply.github.com> Date: Mon, 7 Sep 2020 10:33:10 +0200 Subject: [PATCH 03/15] fix: handle keyParams and auth_params in import --- .../directives/views/accountMenu.js | 23 +++++++++---------- app/assets/javascripts/strings.js | 2 ++ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/app/assets/javascripts/directives/views/accountMenu.js b/app/assets/javascripts/directives/views/accountMenu.js index fb38bef4e..ad65243a6 100644 --- a/app/assets/javascripts/directives/views/accountMenu.js +++ b/app/assets/javascripts/directives/views/accountMenu.js @@ -20,6 +20,7 @@ import { STRING_GENERATING_REGISTER_KEYS, StringImportError } from '@/strings'; +import { STRING_IMPORT_FAILED_NEWER_BACKUP } from '../../strings'; const ELEMENT_ID_IMPORT_PASSWORD_INPUT = 'import-password-request'; @@ -204,7 +205,7 @@ class AccountMenuCtrl extends PureCtrl { text: STRING_NON_MATCHING_PASSWORDS }); return; - } + } await this.setFormDataState({ confirmPassword: false, status: STRING_GENERATING_REGISTER_KEYS, @@ -336,7 +337,7 @@ class AccountMenuCtrl extends PureCtrl { } /** - * @template + * @template */ async importFileSelected(files) { const run = async () => { @@ -377,17 +378,15 @@ class AccountMenuCtrl extends PureCtrl { } async performImport(data, password) { - if (data.keyParams) { - if (Number(data.keyParams.version) > 3) { - this.setState({ - importData: null - }); - this.alertManager.alert({ - text: "This backup file was created using a later version of the application and cannot be imported." - }); - return; - } + if ( + data.keyParams || + (data.auth_params && Number(data.auth_params.version) > protocolManager.version()) + ) { + this.setState({ importData: null }); + this.alertManager.alert({ text: STRING_IMPORT_FAILED_NEWER_BACKUP }); + return; } + await this.setState({ importData: { ...this.state.importData, diff --git a/app/assets/javascripts/strings.js b/app/assets/javascripts/strings.js index 863af915a..a8d39d397 100644 --- a/app/assets/javascripts/strings.js +++ b/app/assets/javascripts/strings.js @@ -49,3 +49,5 @@ export function StringImportError({errorCount}) { /** @password_change */ export const STRING_FAILED_PASSWORD_CHANGE = "There was an error re-encrypting your items. Your password was changed, but not all your items were properly re-encrypted and synced. You should try syncing again. If all else fails, you should restore your notes from backup."; + +export const STRING_IMPORT_FAILED_NEWER_BACKUP = "This backup file was created using a newer version of the application and cannot be imported here. Please update your application and try again."; From 7f03922b6768cf9dc4b5f05d5a46b94732df8054 Mon Sep 17 00:00:00 2001 From: Baptiste Grob <60621355+baptiste-grob@users.noreply.github.com> Date: Mon, 7 Sep 2020 10:34:20 +0200 Subject: [PATCH 04/15] fix: do not run ruby-dependent command on install --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index da58c5090..f868aa8e3 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,6 @@ "start": "webpack-dev-server --progress", "bundle": "webpack --mode production", "precompile:assets": "bundle exec rails assets:precompile", - "postinstall": "npm run precompile:assets", "build": "bundle install && npm ci && npm run precompile:assets && npm run bundle", "submodules": "git submodule update --init --force --remote", "test": "karma start karma.conf.js --single-run", From a1727b1b1e92d96596f80934d20d3cb1daab1035 Mon Sep 17 00:00:00 2001 From: Baptiste Grob <60621355+baptiste-grob@users.noreply.github.com> Date: Mon, 7 Sep 2020 11:20:45 +0200 Subject: [PATCH 05/15] fix: show import error sooner --- .../javascripts/directives/views/accountMenu.js | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/app/assets/javascripts/directives/views/accountMenu.js b/app/assets/javascripts/directives/views/accountMenu.js index ad65243a6..71915f825 100644 --- a/app/assets/javascripts/directives/views/accountMenu.js +++ b/app/assets/javascripts/directives/views/accountMenu.js @@ -346,6 +346,12 @@ class AccountMenuCtrl extends PureCtrl { if (!data) { return; } + const version = data?.auth_params?.version || data?.keyParams?.version; + if (!protocolManager.supportedVersions().includes(version)) { + this.setState({ importData: null }); + this.alertManager.alert({ text: STRING_IMPORT_FAILED_NEWER_BACKUP }); + return; + } if (data.auth_params) { await this.setState({ importData: { @@ -378,15 +384,6 @@ class AccountMenuCtrl extends PureCtrl { } async performImport(data, password) { - if ( - data.keyParams || - (data.auth_params && Number(data.auth_params.version) > protocolManager.version()) - ) { - this.setState({ importData: null }); - this.alertManager.alert({ text: STRING_IMPORT_FAILED_NEWER_BACKUP }); - return; - } - await this.setState({ importData: { ...this.state.importData, From 6f798e3ba9a7f565da022916e8e50546c0fb5cf2 Mon Sep 17 00:00:00 2001 From: Baptiste Grob <60621355+baptiste-grob@users.noreply.github.com> Date: Tue, 8 Sep 2020 18:01:05 +0200 Subject: [PATCH 06/15] fix: check backup file version first before importing --- app/assets/javascripts/directives/views/accountMenu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/directives/views/accountMenu.js b/app/assets/javascripts/directives/views/accountMenu.js index 71915f825..79878f480 100644 --- a/app/assets/javascripts/directives/views/accountMenu.js +++ b/app/assets/javascripts/directives/views/accountMenu.js @@ -346,7 +346,7 @@ class AccountMenuCtrl extends PureCtrl { if (!data) { return; } - const version = data?.auth_params?.version || data?.keyParams?.version; + const version = data.version || data.auth_params?.version || data?.keyParams?.version; if (!protocolManager.supportedVersions().includes(version)) { this.setState({ importData: null }); this.alertManager.alert({ text: STRING_IMPORT_FAILED_NEWER_BACKUP }); From 990b76324e7a220386d8cf6c0710896176beeb43 Mon Sep 17 00:00:00 2001 From: Baptiste Grob <60621355+baptiste-grob@users.noreply.github.com> Date: Tue, 8 Sep 2020 18:01:39 +0200 Subject: [PATCH 07/15] chore(version): 3.3.11 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index ae96eea2e..9a10aedf7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "standard-notes-web", - "version": "3.3.6", + "version": "3.3.11", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index f868aa8e3..4223224c7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "standard-notes-web", - "version": "3.3.10", + "version": "3.3.11", "license": "AGPL-3.0-or-later", "repository": { "type": "git", From ec0a9687f5f805efea64d468fb180695321b3bdc Mon Sep 17 00:00:00 2001 From: Baptiste Grob <60621355+baptiste-grob@users.noreply.github.com> Date: Wed, 9 Sep 2020 17:42:28 +0200 Subject: [PATCH 08/15] chore: bundle --- dist/javascripts/app.js | 2 +- dist/javascripts/app.js.map | 2 +- dist/stylesheets/app.css | 2 +- dist/stylesheets/app.css.map | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dist/javascripts/app.js b/dist/javascripts/app.js index 288ce909f..41c40770a 100644 --- a/dist/javascripts/app.js +++ b/dist/javascripts/app.js @@ -26,5 +26,5 @@ return e.mode.CTRGladman=function(){var t=e.lib.BlockCipherMode.extend();functio * (c) 2010-2018 Google, Inc. http://angularjs.org * License: MIT */ -!function(e){"use strict";var t={objectMaxDepth:5,urlErrorParamsEnabled:!0};function n(e){if(!L(e))return t;N(e.objectMaxDepth)&&(t.objectMaxDepth=r(e.objectMaxDepth)?e.objectMaxDepth:NaN),N(e.urlErrorParamsEnabled)&&Y(e.urlErrorParamsEnabled)&&(t.urlErrorParamsEnabled=e.urlErrorParamsEnabled)}function r(e){return H(e)&&e>0}function i(e,n){n=n||Error;var r="https://errors.angularjs.org/1.7.9/",i=r.replace(".","\\.")+"[\\s\\S]*",a=new RegExp(i,"g");return function(){var i,o,s=arguments[0],c=arguments[1],u="["+(e?e+":":"")+s+"] ",l=fe(arguments,2).map((function(e){return He(e,t.objectMaxDepth)}));if(u+=c.replace(/\{\d+\}/g,(function(e){var t=+e.slice(1,-1);return t=0&&t-1 in e||"function"==typeof e.item)}function x(e,t,n){var r,i;if(e)if(K(e))for(r in e)"prototype"!==r&&"length"!==r&&"name"!==r&&e.hasOwnProperty(r)&&t.call(n,e[r],r,e);else if(V(e)||w(e)){var a="object"!=typeof e;for(r=0,i=e.length;r=0&&e.splice(n,1),n}function ae(e,t,n){var i,a,o=[],s=[];if(n=r(n)?n:NaN,t){if((a=t)&&H(a.length)&&X.test(m.call(a))||(i=t,"[object ArrayBuffer]"===m.call(i)))throw g("cpta","Can't copy! TypedArray destination cannot be mutated.");if(e===t)throw g("cpi","Can't copy! Source and destination are identical.");return V(t)?t.length=0:x(t,(function(e,n){"$$hashKey"!==n&&delete t[n]})),o.push(e),s.push(t),c(e,t,n)}return u(e,n);function c(e,t,n){if(--n<0)return"...";var r,i=t.$$hashKey;if(V(e))for(var a=0,o=e.length;a2?fe(arguments,2):[];return!K(t)||t instanceof RegExp?t:n.length?function(){return arguments.length?t.apply(e,le(n,arguments,0)):t.apply(e,n)}:function(){return arguments.length?t.apply(e,arguments):t.call(e)}}function de(t,n){var r=n;return"string"==typeof t&&"$"===t.charAt(0)&&"$"===t.charAt(1)?r=void 0:J(n)?r="$WINDOW":n&&e.document===n?r="$DOCUMENT":G(n)&&(r="$SCOPE"),r}function he(e,t){if(!F(e))return H(t)||(t=t?2:null),JSON.stringify(e,de,t)}function ve(e){return B(e)?JSON.parse(e):e}var me=/:/g;function ye(e,t){e=e.replace(me,"");var n=Date.parse("Jan 01, 1970 00:00:00 "+e)/6e4;return E(n)?t:n}function ge(e,t){return(e=new Date(e.getTime())).setMinutes(e.getMinutes()+t),e}function be(e,t,n){n=n?-1:1;var r=e.getTimezoneOffset();return ge(e,n*(ye(t,r)-r))}function ke(e){e=o(e).clone().empty();var t=o("
").append(e).html();try{return e[0].nodeType===Ue?f(t):t.match(/^(<[^>]+>)/)[1].replace(/^<([\w-]+)/,(function(e,t){return"<"+f(t)}))}catch(e){return f(t)}}function we(e){try{return decodeURIComponent(e)}catch(e){}}function xe(e){var t={};return x((e||"").split("&"),(function(e){var n,r,i;e&&(r=e=e.replace(/\+/g,"%20"),-1!==(n=e.indexOf("="))&&(r=e.substring(0,n),i=e.substring(n+1)),N(r=we(r))&&(i=!N(i)||we(i),l.call(t,r)?V(t[r])?t[r].push(i):t[r]=[t[r],i]:t[r]=i))})),t}function Se(e){return $e(e,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function $e(e,t){return encodeURIComponent(e).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,t?"%20":"+")}var _e=["ng-","data-ng-","ng:","x-ng-"];var Me=function(t){var n=t.currentScript;if(!n)return!0;if(!(n instanceof e.HTMLScriptElement||n instanceof e.SVGScriptElement))return!1;var r=n.attributes;return[r.getNamedItem("src"),r.getNamedItem("href"),r.getNamedItem("xlink:href")].every((function(e){if(!e)return!0;if(!e.value)return!1;var n=t.createElement("a");if(n.href=e.value,t.location.origin===n.origin)return!0;switch(n.protocol){case"http:":case"https:":case"ftp:":case"blob:":case"file:":case"data:":return!0;default:return!1}}))}(e.document);function Ce(t,n){var r,i,a={};if(x(_e,(function(e){var n=e+"app";!r&&t.hasAttribute&&t.hasAttribute(n)&&(r=t,i=t.getAttribute(n))})),x(_e,(function(e){var n,a=e+"app";!r&&(n=t.querySelector("["+a.replace(":","\\:")+"]"))&&(r=n,i=n.getAttribute(a))})),r){if(!Me)return void e.console.error("AngularJS: disabling automatic bootstrap.