From 10767496353ebb2aa9ced1b50cf5f8f6ca0aaef8 Mon Sep 17 00:00:00 2001 From: Daniel James Smith Date: Thu, 3 Mar 2022 15:41:48 +0100 Subject: [PATCH] Add importing of 1passwords 1pux files (#1507) * Pull in jslib * Install jszip * Display help on selecting 1pux importer * Unzip 1pux and pass content of export.data to 1pux importer * Update jslib --- jslib | 2 +- package-lock.json | 119 ++++++++++++++++++++++++++++ package.json | 1 + src/app/tools/import.component.html | 5 +- src/app/tools/import.component.ts | 21 +++++ 5 files changed, 146 insertions(+), 2 deletions(-) diff --git a/jslib b/jslib index adfc2f234d..8e112a1c33 160000 --- a/jslib +++ b/jslib @@ -1 +1 @@ -Subproject commit adfc2f234d146e80695623af768b15d2616df8c4 +Subproject commit 8e112a1c33928cdd96206c9e167d045280826a93 diff --git a/package-lock.json b/package-lock.json index 56d694e4c5..0448c4ce32 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "core-js": "^3.11.0", "date-input-polyfill": "^2.14.0", "jquery": "3.6.0", + "jszip": "^3.7.1", "ngx-infinite-scroll": "^10.0.1", "ngx-toastr": "14.1.4", "node-forge": "^0.10.0", @@ -108,6 +109,7 @@ } }, "jslib/common": { + "name": "@bitwarden/jslib-common", "version": "0.0.0", "license": "GPL-3.0", "dependencies": { @@ -4640,6 +4642,11 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, "node_modules/immutable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", @@ -5253,6 +5260,39 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jszip": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", + "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -5284,6 +5324,14 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lilconfig": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", @@ -6267,6 +6315,11 @@ "node": ">=4" } }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "node_modules/papaparse": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.1.tgz", @@ -7352,6 +7405,14 @@ "node": ">= 0.8.0" } }, + "node_modules/set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -12328,6 +12389,11 @@ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, "immutable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", @@ -12751,6 +12817,41 @@ "graceful-fs": "^4.1.6" } }, + "jszip": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", + "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -12773,6 +12874,14 @@ "type-check": "~0.4.0" } }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, "lilconfig": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", @@ -13503,6 +13612,11 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "papaparse": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.1.tgz", @@ -14313,6 +14427,11 @@ "send": "0.17.2" } }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", diff --git a/package.json b/package.json index 64d077ea0f..7a0397db5f 100644 --- a/package.json +++ b/package.json @@ -91,6 +91,7 @@ "core-js": "^3.11.0", "date-input-polyfill": "^2.14.0", "jquery": "3.6.0", + "jszip": "^3.7.1", "ngx-infinite-scroll": "^10.0.1", "ngx-toastr": "14.1.4", "node-forge": "^0.10.0", diff --git a/src/app/tools/import.component.html b/src/app/tools/import.component.html index dce3b029b7..339aefd0d5 100644 --- a/src/app/tools/import.component.html +++ b/src/app/tools/import.component.html @@ -110,7 +110,10 @@ See detailed instructions on our help site at diff --git a/src/app/tools/import.component.ts b/src/app/tools/import.component.ts index cf0880a347..c274c29b23 100644 --- a/src/app/tools/import.component.ts +++ b/src/app/tools/import.component.ts @@ -1,5 +1,6 @@ import { Component, OnInit } from "@angular/core"; import { Router } from "@angular/router"; +import * as JSZip from "jszip"; import Swal, { SweetAlertIcon } from "sweetalert2"; import { I18nService } from "jslib-common/abstractions/i18n.service"; @@ -181,6 +182,10 @@ export class ImportComponent implements OnInit { } private getFileContents(file: File): Promise { + if (this.format === "1password1pux") { + return this.extract1PuxContent(file); + } + return new Promise((resolve, reject) => { const reader = new FileReader(); reader.readAsText(file, "utf-8"); @@ -204,4 +209,20 @@ export class ImportComponent implements OnInit { }; }); } + + private extract1PuxContent(file: File): Promise { + return new JSZip() + .loadAsync(file) + .then((zip) => { + return zip.file("export.data").async("string"); + }) + .then( + function success(content) { + return content; + }, + function error(e) { + return ""; + } + ); + } }