From 7fc0ab97f340ada87dddd28b11802eb45efd35d9 Mon Sep 17 00:00:00 2001 From: David Frankel <42774874+frankeld@users.noreply.github.com> Date: Thu, 24 Mar 2022 15:33:28 -0600 Subject: [PATCH 1/6] [bug] Fix Safari CSV importer for URL and Notes (#730) --- common/src/importers/safariCsvImporter.ts | 3 +- .../importers/safariCsvImporter.spec.ts | 74 +++++++++++++++++++ .../safariCsv/oldSimplePasswordData.csv.ts | 2 + .../safariCsv/simplePasswordData.csv.ts | 3 + 4 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 spec/common/importers/safariCsvImporter.spec.ts create mode 100644 spec/common/importers/testData/safariCsv/oldSimplePasswordData.csv.ts create mode 100644 spec/common/importers/testData/safariCsv/simplePasswordData.csv.ts diff --git a/common/src/importers/safariCsvImporter.ts b/common/src/importers/safariCsvImporter.ts index 156c2767..786b2827 100644 --- a/common/src/importers/safariCsvImporter.ts +++ b/common/src/importers/safariCsvImporter.ts @@ -17,8 +17,9 @@ export class SafariCsvImporter extends BaseImporter implements Importer { cipher.name = this.getValueOrDefault(value.Title, "--"); cipher.login.username = this.getValueOrDefault(value.Username); cipher.login.password = this.getValueOrDefault(value.Password); - cipher.login.uris = this.makeUriArray(value.Url); + cipher.login.uris = this.makeUriArray(value.Url ?? value.URL); cipher.login.totp = this.getValueOrDefault(value.OTPAuth); + cipher.notes = this.getValueOrDefault(value.Notes); this.cleanupCipher(cipher); result.ciphers.push(cipher); }); diff --git a/spec/common/importers/safariCsvImporter.spec.ts b/spec/common/importers/safariCsvImporter.spec.ts new file mode 100644 index 00000000..5fcd33ae --- /dev/null +++ b/spec/common/importers/safariCsvImporter.spec.ts @@ -0,0 +1,74 @@ +import { SafariCsvImporter as Importer } from "jslib-common/importers/SafariCsvImporter"; +import { CipherView } from "jslib-common/models/view/cipherView"; +import { LoginUriView } from "jslib-common/models/view/loginUriView"; +import { LoginView } from "jslib-common/models/view/loginView"; + +import { data as oldSimplePasswordData } from "./testData/safariCsv/oldSimplePasswordData.csv"; +import { data as simplePasswordData } from "./testData/safariCsv/simplePasswordData.csv"; + +const CipherData = [ + { + title: "should parse URLs in new CSV format", + csv: simplePasswordData, + expected: Object.assign(new CipherView(), { + id: null, + organizationId: null, + folderId: null, + name: "example.com (example_user)", + login: Object.assign(new LoginView(), { + username: "example_user", + password: "example_p@ssword", + uris: [ + Object.assign(new LoginUriView(), { + uri: "https://example.com", + }), + ], + totp: "otpauth://totp/test?secret=examplesecret", + }), + notes: "Example note\nMore notes on new line", + type: 1, + }), + }, + { + title: "should parse URLs in old CSV format", + csv: oldSimplePasswordData, + expected: Object.assign(new CipherView(), { + id: null, + organizationId: null, + folderId: null, + name: "example.com (example_user)", + login: Object.assign(new LoginView(), { + username: "example_user", + password: "example_p@ssword", + uris: [ + Object.assign(new LoginUriView(), { + uri: "https://example.com", + }), + ], + }), + type: 1, + }), + }, +]; + +describe("Safari CSV Importer", () => { + CipherData.forEach((data) => { + it(data.title, async () => { + const importer = new Importer(); + const result = await importer.parse(data.csv); + expect(result != null).toBe(true); + expect(result.ciphers.length).toBeGreaterThan(0); + + const cipher = result.ciphers.shift(); + let property: keyof typeof data.expected; + for (property in data.expected) { + // eslint-disable-next-line + if (data.expected.hasOwnProperty(property)) { + // eslint-disable-next-line + expect(cipher.hasOwnProperty(property)).toBe(true); + expect(cipher[property]).toEqual(data.expected[property]); + } + } + }); + }); +}); diff --git a/spec/common/importers/testData/safariCsv/oldSimplePasswordData.csv.ts b/spec/common/importers/testData/safariCsv/oldSimplePasswordData.csv.ts new file mode 100644 index 00000000..f4dce0e7 --- /dev/null +++ b/spec/common/importers/testData/safariCsv/oldSimplePasswordData.csv.ts @@ -0,0 +1,2 @@ +export const data = `Title,Url,Username,Password +example.com (example_user),https://example.com,example_user,example_p@ssword`; diff --git a/spec/common/importers/testData/safariCsv/simplePasswordData.csv.ts b/spec/common/importers/testData/safariCsv/simplePasswordData.csv.ts new file mode 100644 index 00000000..52c7de8e --- /dev/null +++ b/spec/common/importers/testData/safariCsv/simplePasswordData.csv.ts @@ -0,0 +1,3 @@ +export const data = `Title,URL,Username,Password,Notes,OTPAuth +example.com (example_user),https://example.com,example_user,example_p@ssword,"Example note +More notes on new line",otpauth://totp/test?secret=examplesecret`; From a825e86921ecb17a5e3917a65c6ae83370b2160b Mon Sep 17 00:00:00 2001 From: Daniel James Smith Date: Thu, 24 Mar 2022 22:45:37 +0100 Subject: [PATCH 2/6] Fix import path for safari importer (#740) --- spec/common/importers/safariCsvImporter.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/common/importers/safariCsvImporter.spec.ts b/spec/common/importers/safariCsvImporter.spec.ts index 5fcd33ae..f1e1186f 100644 --- a/spec/common/importers/safariCsvImporter.spec.ts +++ b/spec/common/importers/safariCsvImporter.spec.ts @@ -1,4 +1,4 @@ -import { SafariCsvImporter as Importer } from "jslib-common/importers/SafariCsvImporter"; +import { SafariCsvImporter as Importer } from "jslib-common/importers/safariCsvImporter"; import { CipherView } from "jslib-common/models/view/cipherView"; import { LoginUriView } from "jslib-common/models/view/loginUriView"; import { LoginView } from "jslib-common/models/view/loginView"; From 81607e810e5454eba65d43d66061c6d1658e70e8 Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Fri, 25 Mar 2022 10:13:50 +0100 Subject: [PATCH 3/6] Force updates to be silent (#739) --- electron/src/updater.main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/electron/src/updater.main.ts b/electron/src/updater.main.ts index c6105494..881208f8 100644 --- a/electron/src/updater.main.ts +++ b/electron/src/updater.main.ts @@ -109,7 +109,7 @@ export class UpdaterMain { if (result.response === 0) { // Quit and install have a different window logic, setting `isQuitting` just to be safe. this.windowMain.isQuitting = true; - autoUpdater.quitAndInstall(false, true); + autoUpdater.quitAndInstall(true, true); } }); From fa73c13b8c9ed35cbb9909e342b143fa8a57f1a0 Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Fri, 25 Mar 2022 05:32:01 -0400 Subject: [PATCH 4/6] support for username gen website setting (#738) --- angular/src/components/password-generator.component.ts | 4 ++++ angular/src/services/jslib-services.module.ts | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/angular/src/components/password-generator.component.ts b/angular/src/components/password-generator.component.ts index 06e24422..1ad6fd63 100644 --- a/angular/src/components/password-generator.component.ts +++ b/angular/src/components/password-generator.component.ts @@ -29,6 +29,7 @@ export class PasswordGeneratorComponent implements OnInit { avoidAmbiguous = false; showWebsiteOption = false; enforcedPasswordPolicyOptions: PasswordGeneratorPolicyOptions; + usernameWebsite: string = null; constructor( protected passwordGenerationService: PasswordGenerationService, @@ -95,6 +96,9 @@ export class PasswordGeneratorComponent implements OnInit { if (!this.showWebsiteOption) { this.usernameOptions.subaddressType = this.usernameOptions.catchallType = "random"; } + if (this.usernameWebsite != null) { + this.usernameOptions.website = this.usernameWebsite; + } if (qParams.type === "username" || qParams.type === "password") { this.type = qParams.type; diff --git a/angular/src/services/jslib-services.module.ts b/angular/src/services/jslib-services.module.ts index 068b0ee3..d35deeb1 100644 --- a/angular/src/services/jslib-services.module.ts +++ b/angular/src/services/jslib-services.module.ts @@ -36,6 +36,7 @@ import { TokenService as TokenServiceAbstraction } from "jslib-common/abstractio import { TotpService as TotpServiceAbstraction } from "jslib-common/abstractions/totp.service"; import { TwoFactorService as TwoFactorServiceAbstraction } from "jslib-common/abstractions/twoFactor.service"; import { UserVerificationService as UserVerificationServiceAbstraction } from "jslib-common/abstractions/userVerification.service"; +import { UsernameGenerationService as UsernameGenerationServiceAbstraction } from "jslib-common/abstractions/usernameGeneration.service"; import { VaultTimeoutService as VaultTimeoutServiceAbstraction } from "jslib-common/abstractions/vaultTimeout.service"; import { StateFactory } from "jslib-common/factories/stateFactory"; import { Account } from "jslib-common/models/domain/account"; @@ -69,6 +70,7 @@ import { TokenService } from "jslib-common/services/token.service"; import { TotpService } from "jslib-common/services/totp.service"; import { TwoFactorService } from "jslib-common/services/twoFactor.service"; import { UserVerificationService } from "jslib-common/services/userVerification.service"; +import { UsernameGenerationService } from "jslib-common/services/usernameGeneration.service"; import { VaultTimeoutService } from "jslib-common/services/vaultTimeout.service"; import { WebCryptoFunctionService } from "jslib-common/services/webCryptoFunction.service"; @@ -198,6 +200,11 @@ import { ValidationService } from "./validation.service"; useClass: PasswordGenerationService, deps: [CryptoServiceAbstraction, PolicyServiceAbstraction, StateServiceAbstraction], }, + { + provide: UsernameGenerationServiceAbstraction, + useClass: UsernameGenerationService, + deps: [CryptoServiceAbstraction, StateServiceAbstraction], + }, { provide: ApiServiceAbstraction, useFactory: ( From 9d1df26dfafacb621ca06edfcc618c6e9ee8e328 Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Sun, 27 Mar 2022 22:32:21 +0200 Subject: [PATCH 5/6] Fix jslibModule forms (#742) --- angular/src/jslib.module.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/angular/src/jslib.module.ts b/angular/src/jslib.module.ts index 215e83e4..8fdc888a 100644 --- a/angular/src/jslib.module.ts +++ b/angular/src/jslib.module.ts @@ -1,5 +1,6 @@ import { CommonModule } from "@angular/common"; import { NgModule } from "@angular/core"; +import { FormsModule, ReactiveFormsModule } from "@angular/forms"; import { AvatarComponent } from "./components/avatar.component"; import { CalloutComponent } from "./components/callout.component"; @@ -35,6 +36,8 @@ import { UserNamePipe } from "./pipes/user-name.pipe"; closeButton: true, }), CommonModule, + FormsModule, + ReactiveFormsModule, ], declarations: [ A11yInvalidDirective, @@ -89,6 +92,6 @@ import { UserNamePipe } from "./pipes/user-name.pipe"; VerifyMasterPasswordComponent, ExportScopeCalloutComponent, ], - providers: [UserNamePipe, SearchPipe], + providers: [UserNamePipe, SearchPipe, I18nPipe], }) export class JslibModule {} From 13ef7aea7d39c1d0f026011f3d71387e7b5971ce Mon Sep 17 00:00:00 2001 From: Thomas Rittson <31796059+eliykat@users.noreply.github.com> Date: Mon, 28 Mar 2022 06:40:47 +1000 Subject: [PATCH 6/6] Add DatePipe provider to JslibModule (#741) --- angular/src/jslib.module.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/angular/src/jslib.module.ts b/angular/src/jslib.module.ts index 8fdc888a..d00842d4 100644 --- a/angular/src/jslib.module.ts +++ b/angular/src/jslib.module.ts @@ -1,4 +1,4 @@ -import { CommonModule } from "@angular/common"; +import { CommonModule, DatePipe } from "@angular/common"; import { NgModule } from "@angular/core"; import { FormsModule, ReactiveFormsModule } from "@angular/forms"; @@ -92,6 +92,6 @@ import { UserNamePipe } from "./pipes/user-name.pipe"; VerifyMasterPasswordComponent, ExportScopeCalloutComponent, ], - providers: [UserNamePipe, SearchPipe, I18nPipe], + providers: [UserNamePipe, SearchPipe, I18nPipe, DatePipe], }) export class JslibModule {}