From 1fa3eb49adda582bab594284eb3f39439ff9c666 Mon Sep 17 00:00:00 2001 From: hinton Date: Thu, 21 May 2020 15:49:56 +0200 Subject: [PATCH 1/6] Add support for collections with hide passwords --- src/models/data/cipherData.ts | 2 ++ src/models/domain/cipher.ts | 3 +++ src/models/domain/collection.ts | 4 +++- src/models/request/selectionReadOnlyRequest.ts | 4 +++- src/models/response/cipherResponse.ts | 8 +++++++- src/models/response/selectionReadOnlyResponse.ts | 2 ++ src/models/view/cipherView.ts | 2 ++ src/models/view/collectionView.ts | 2 ++ 8 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/models/data/cipherData.ts b/src/models/data/cipherData.ts index 9a45c73dae..fc87ae60d6 100644 --- a/src/models/data/cipherData.ts +++ b/src/models/data/cipherData.ts @@ -16,6 +16,7 @@ export class CipherData { folderId: string; userId: string; edit: boolean; + viewPassword: boolean; organizationUseTotp: boolean; favorite: boolean; revisionDate: string; @@ -43,6 +44,7 @@ export class CipherData { this.folderId = response.folderId; this.userId = userId; this.edit = response.edit; + this.viewPassword = response.viewPassword; this.organizationUseTotp = response.organizationUseTotp; this.favorite = response.favorite; this.revisionDate = response.revisionDate; diff --git a/src/models/domain/cipher.ts b/src/models/domain/cipher.ts index 647251f4ea..f0c37cf75c 100644 --- a/src/models/domain/cipher.ts +++ b/src/models/domain/cipher.ts @@ -24,6 +24,7 @@ export class Cipher extends Domain { favorite: boolean; organizationUseTotp: boolean; edit: boolean; + viewPassword: boolean; revisionDate: Date; localData: any; login: Login; @@ -55,6 +56,7 @@ export class Cipher extends Domain { this.favorite = obj.favorite; this.organizationUseTotp = obj.organizationUseTotp; this.edit = obj.edit; + this.viewPassword = obj.viewPassword; this.revisionDate = obj.revisionDate != null ? new Date(obj.revisionDate) : null; this.collectionIds = obj.collectionIds; this.localData = localData; @@ -169,6 +171,7 @@ export class Cipher extends Domain { c.folderId = this.folderId; c.userId = this.organizationId != null ? userId : null; c.edit = this.edit; + c.viewPassword = this.viewPassword; c.organizationUseTotp = this.organizationUseTotp; c.favorite = this.favorite; c.revisionDate = this.revisionDate != null ? this.revisionDate.toISOString() : null; diff --git a/src/models/domain/collection.ts b/src/models/domain/collection.ts index 59bbf24d07..6ed5f216f9 100644 --- a/src/models/domain/collection.ts +++ b/src/models/domain/collection.ts @@ -11,6 +11,7 @@ export class Collection extends Domain { name: CipherString; externalId: string; readOnly: boolean; + hidePasswords: boolean; constructor(obj?: CollectionData, alreadyEncrypted: boolean = false) { super(); @@ -24,7 +25,8 @@ export class Collection extends Domain { name: null, externalId: null, readOnly: null, - }, alreadyEncrypted, ['id', 'organizationId', 'externalId', 'readOnly']); + hidePasswords: null, + }, alreadyEncrypted, ['id', 'organizationId', 'externalId', 'readOnly', 'hidePasswords']); } decrypt(): Promise { diff --git a/src/models/request/selectionReadOnlyRequest.ts b/src/models/request/selectionReadOnlyRequest.ts index e947b0a364..d001edb2b0 100644 --- a/src/models/request/selectionReadOnlyRequest.ts +++ b/src/models/request/selectionReadOnlyRequest.ts @@ -1,9 +1,11 @@ export class SelectionReadOnlyRequest { id: string; readOnly: boolean; + hidePasswords: boolean; - constructor(id: string, readOnly: boolean) { + constructor(id: string, readOnly: boolean, hidePasswords: boolean) { this.id = id; this.readOnly = readOnly; + this.hidePasswords = hidePasswords; } } diff --git a/src/models/response/cipherResponse.ts b/src/models/response/cipherResponse.ts index 580e21fa7e..32555a65b8 100644 --- a/src/models/response/cipherResponse.ts +++ b/src/models/response/cipherResponse.ts @@ -22,6 +22,7 @@ export class CipherResponse extends BaseResponse { secureNote: SecureNoteApi; favorite: boolean; edit: boolean; + viewPassword: boolean; organizationUseTotp: boolean; revisionDate: string; attachments: AttachmentResponse[]; @@ -38,7 +39,12 @@ export class CipherResponse extends BaseResponse { this.name = this.getResponseProperty('Name'); this.notes = this.getResponseProperty('Notes'); this.favorite = this.getResponseProperty('Favorite') || false; - this.edit = this.getResponseProperty('Edit') || true; + this.edit = !!this.getResponseProperty('Edit'); + if (this.getResponseProperty('ViewPassword') == null) { + this.viewPassword = true; + } else { + this.viewPassword = this.getResponseProperty('ViewPassword'); + } this.organizationUseTotp = this.getResponseProperty('OrganizationUseTotp'); this.revisionDate = this.getResponseProperty('RevisionDate'); this.collectionIds = this.getResponseProperty('CollectionIds'); diff --git a/src/models/response/selectionReadOnlyResponse.ts b/src/models/response/selectionReadOnlyResponse.ts index 5bdfc6e417..ebcf524746 100644 --- a/src/models/response/selectionReadOnlyResponse.ts +++ b/src/models/response/selectionReadOnlyResponse.ts @@ -3,10 +3,12 @@ import { BaseResponse } from './baseResponse'; export class SelectionReadOnlyResponse extends BaseResponse { id: string; readOnly: boolean; + hidePasswords: boolean; constructor(response: any) { super(response); this.id = this.getResponseProperty('Id'); this.readOnly = this.getResponseProperty('ReadOnly'); + this.hidePasswords = this.getResponseProperty('HidePasswords'); } } diff --git a/src/models/view/cipherView.ts b/src/models/view/cipherView.ts index e1c8d5fa66..4cd0daf039 100644 --- a/src/models/view/cipherView.ts +++ b/src/models/view/cipherView.ts @@ -21,6 +21,7 @@ export class CipherView implements View { favorite = false; organizationUseTotp = false; edit = false; + viewPassword = true; localData: any; login = new LoginView(); identity = new IdentityView(); @@ -44,6 +45,7 @@ export class CipherView implements View { this.favorite = c.favorite; this.organizationUseTotp = c.organizationUseTotp; this.edit = c.edit; + this.viewPassword = c.viewPassword; this.type = c.type; this.localData = c.localData; this.collectionIds = c.collectionIds; diff --git a/src/models/view/collectionView.ts b/src/models/view/collectionView.ts index 622a9e4cf0..9c27c9fb58 100644 --- a/src/models/view/collectionView.ts +++ b/src/models/view/collectionView.ts @@ -11,6 +11,7 @@ export class CollectionView implements View, ITreeNodeObject { name: string = null; externalId: string = null; readOnly: boolean = null; + hidePasswords: boolean = null; constructor(c?: Collection | CollectionGroupDetailsResponse) { if (!c) { @@ -22,6 +23,7 @@ export class CollectionView implements View, ITreeNodeObject { this.externalId = c.externalId; if (c instanceof Collection) { this.readOnly = c.readOnly; + this.hidePasswords = c.hidePasswords; } } } From 34402571e7615e9edcd688225ceb79085abbcc46 Mon Sep 17 00:00:00 2001 From: hinton Date: Wed, 3 Jun 2020 20:45:53 +0200 Subject: [PATCH 2/6] Add newField property to FieldView, used for allowing edits for new fields --- src/angular/components/add-edit.component.ts | 1 + src/models/view/fieldView.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/angular/components/add-edit.component.ts b/src/angular/components/add-edit.component.ts index 389f6d4908..87c7cd3f8c 100644 --- a/src/angular/components/add-edit.component.ts +++ b/src/angular/components/add-edit.component.ts @@ -296,6 +296,7 @@ export class AddEditComponent implements OnInit { const f = new FieldView(); f.type = this.addFieldType; + f.newField = true; this.cipher.fields.push(f); } diff --git a/src/models/view/fieldView.ts b/src/models/view/fieldView.ts index 20d695da15..e09d5957dd 100644 --- a/src/models/view/fieldView.ts +++ b/src/models/view/fieldView.ts @@ -8,6 +8,7 @@ export class FieldView implements View { name: string = null; value: string = null; type: FieldType = null; + newField: boolean = false; // Marks if the filed is new and haven't been saved constructor(f?: Field) { if (!f) { From 4d776ca0efc8f1ba712b6659c559f6de846ad124 Mon Sep 17 00:00:00 2001 From: hinton Date: Thu, 4 Jun 2020 22:15:45 +0200 Subject: [PATCH 3/6] Fix spelling mistakes --- src/models/view/fieldView.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/models/view/fieldView.ts b/src/models/view/fieldView.ts index e09d5957dd..c839e1ecb6 100644 --- a/src/models/view/fieldView.ts +++ b/src/models/view/fieldView.ts @@ -8,7 +8,7 @@ export class FieldView implements View { name: string = null; value: string = null; type: FieldType = null; - newField: boolean = false; // Marks if the filed is new and haven't been saved + newField: boolean = false; // Marks if the field is new and hasn't been saved constructor(f?: Field) { if (!f) { From 6e52c2846d70afd0659f272aa3b1553fd26e1775 Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Wed, 27 May 2020 15:21:53 -0400 Subject: [PATCH 4/6] getEnterprisePortalSignInToken api (#105) --- src/abstractions/api.service.ts | 1 + src/services/api.service.ts | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/src/abstractions/api.service.ts b/src/abstractions/api.service.ts index 1fc71b9c1c..dec3062ae7 100644 --- a/src/abstractions/api.service.ts +++ b/src/abstractions/api.service.ts @@ -139,6 +139,7 @@ export abstract class ApiService { postAccountRecoverDelete: (request: DeleteRecoverRequest) => Promise; postAccountRecoverDeleteToken: (request: VerifyDeleteRecoverRequest) => Promise; postAccountKdf: (request: KdfRequest) => Promise; + getEnterprisePortalSignInToken: () => Promise; getFolder: (id: string) => Promise; postFolder: (request: FolderRequest) => Promise; diff --git a/src/services/api.service.ts b/src/services/api.service.ts index 70a91f36c3..e8c5c0d462 100644 --- a/src/services/api.service.ts +++ b/src/services/api.service.ts @@ -321,6 +321,11 @@ export class ApiService implements ApiServiceAbstraction { return this.send('POST', '/accounts/kdf', request, true, false); } + async getEnterprisePortalSignInToken(): Promise { + const r = await this.send('GET', '/accounts/enterprise-portal-signin-token', null, true, true); + return r as string; + } + // Folder APIs async getFolder(id: string): Promise { From 17298cf188ea90d2fd79607aa27b575a26f5ce8b Mon Sep 17 00:00:00 2001 From: Vincent Salucci <26154748+vincentsalucci@users.noreply.github.com> Date: Thu, 28 May 2020 13:09:55 -0500 Subject: [PATCH 5/6] Bug fix: made lock default conditional check (#106) --- src/services/vaultTimeout.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/vaultTimeout.service.ts b/src/services/vaultTimeout.service.ts index bc13667f9b..2601dc5454 100644 --- a/src/services/vaultTimeout.service.ts +++ b/src/services/vaultTimeout.service.ts @@ -81,7 +81,7 @@ export class VaultTimeoutService implements VaultTimeoutServiceAbstraction { if (diffSeconds >= vaultTimeoutSeconds) { // Pivot based on the saved vault timeout action const timeoutAction = await this.storageService.get(ConstantsService.vaultTimeoutActionKey); - timeoutAction === 'lock' ? await this.lock(true) : await this.logOut(); + timeoutAction === 'logOut' ? await this.logOut() : await this.lock(true); } } From d1e4eebebb679a19fa673195f3f33516247a9524 Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Mon, 1 Jun 2020 14:31:42 -0400 Subject: [PATCH 6/6] check for empty string on malformed URL (#108) --- src/misc/utils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/misc/utils.ts b/src/misc/utils.ts index 5c86ccd94c..e0b7041356 100644 --- a/src/misc/utils.ts +++ b/src/misc/utils.ts @@ -157,7 +157,7 @@ export class Utils { static getHostname(uriString: string): string { const url = Utils.getUrl(uriString); try { - return url != null ? url.hostname : null; + return url != null && url.hostname !== '' ? url.hostname : null; } catch { return null; } @@ -166,7 +166,7 @@ export class Utils { static getHost(uriString: string): string { const url = Utils.getUrl(uriString); try { - return url != null ? url.host : null; + return url != null && url.host !== '' ? url.host : null; } catch { return null; }