diff --git a/src/Core/Models/Api/Request/SelectionReadOnlyRequestModel.cs b/src/Core/Models/Api/Request/SelectionReadOnlyRequestModel.cs index d903b3cce5..cb4f5619cd 100644 --- a/src/Core/Models/Api/Request/SelectionReadOnlyRequestModel.cs +++ b/src/Core/Models/Api/Request/SelectionReadOnlyRequestModel.cs @@ -11,13 +11,15 @@ namespace Bit.Core.Models.Api [Required] public string Id { get; set; } public bool ReadOnly { get; set; } + public bool HidePasswords { get; set; } public SelectionReadOnly ToSelectionReadOnly() { return new SelectionReadOnly { Id = new Guid(Id), - ReadOnly = ReadOnly + ReadOnly = ReadOnly, + HidePasswords = HidePasswords }; } } diff --git a/src/Core/Models/Api/Response/CipherResponseModel.cs b/src/Core/Models/Api/Response/CipherResponseModel.cs index 348fa551c6..95457d5ed3 100644 --- a/src/Core/Models/Api/Response/CipherResponseModel.cs +++ b/src/Core/Models/Api/Response/CipherResponseModel.cs @@ -89,11 +89,13 @@ namespace Bit.Core.Models.Api FolderId = cipher.FolderId?.ToString(); Favorite = cipher.Favorite; Edit = cipher.Edit; + ViewPassword = cipher.ViewPassword; } public string FolderId { get; set; } public bool Favorite { get; set; } public bool Edit { get; set; } + public bool ViewPassword { get; set; } } public class CipherDetailsResponseModel : CipherResponseModel diff --git a/src/Core/Models/Api/Response/CollectionResponseModel.cs b/src/Core/Models/Api/Response/CollectionResponseModel.cs index 2161fbf9fb..901027a9ed 100644 --- a/src/Core/Models/Api/Response/CollectionResponseModel.cs +++ b/src/Core/Models/Api/Response/CollectionResponseModel.cs @@ -34,9 +34,11 @@ namespace Bit.Core.Models.Api : base(collectionDetails, "collectionDetails") { ReadOnly = collectionDetails.ReadOnly; + HidePasswords = collectionDetails.HidePasswords; } public bool ReadOnly { get; set; } + public bool HidePasswords { get; set; } } public class CollectionGroupDetailsResponseModel : CollectionResponseModel diff --git a/src/Core/Models/Api/Response/SelectionReadOnlyResponseModel.cs b/src/Core/Models/Api/Response/SelectionReadOnlyResponseModel.cs index 35400ebac6..0f3f238a4a 100644 --- a/src/Core/Models/Api/Response/SelectionReadOnlyResponseModel.cs +++ b/src/Core/Models/Api/Response/SelectionReadOnlyResponseModel.cs @@ -14,9 +14,11 @@ namespace Bit.Core.Models.Api Id = selection.Id.ToString(); ReadOnly = selection.ReadOnly; + HidePasswords = selection.HidePasswords; } public string Id { get; set; } public bool ReadOnly { get; set; } + public bool HidePasswords { get; set; } } } diff --git a/src/Core/Models/Data/CipherDetails.cs b/src/Core/Models/Data/CipherDetails.cs index d40567287b..7098cd8b8f 100644 --- a/src/Core/Models/Data/CipherDetails.cs +++ b/src/Core/Models/Data/CipherDetails.cs @@ -7,5 +7,6 @@ namespace Core.Models.Data public Guid? FolderId { get; set; } public bool Favorite { get; set; } public bool Edit { get; set; } + public bool ViewPassword { get; set; } } } diff --git a/src/Core/Models/Data/CollectionDetails.cs b/src/Core/Models/Data/CollectionDetails.cs index 54325135ae..62f3c46fd0 100644 --- a/src/Core/Models/Data/CollectionDetails.cs +++ b/src/Core/Models/Data/CollectionDetails.cs @@ -5,5 +5,6 @@ namespace Bit.Core.Models.Data public class CollectionDetails : Collection { public bool ReadOnly { get; set; } + public bool HidePasswords { get; set; } } } diff --git a/src/Core/Models/Data/SelectionReadOnly.cs b/src/Core/Models/Data/SelectionReadOnly.cs index a8193e5fca..fb72778128 100644 --- a/src/Core/Models/Data/SelectionReadOnly.cs +++ b/src/Core/Models/Data/SelectionReadOnly.cs @@ -6,5 +6,6 @@ namespace Bit.Core.Models.Data { public Guid Id { get; set; } public bool ReadOnly { get; set; } + public bool HidePasswords { get; set; } } } diff --git a/src/Core/Utilities/CoreHelpers.cs b/src/Core/Utilities/CoreHelpers.cs index 38761168e0..bf71f7c562 100644 --- a/src/Core/Utilities/CoreHelpers.cs +++ b/src/Core/Utilities/CoreHelpers.cs @@ -125,6 +125,8 @@ namespace Bit.Core.Utilities table.Columns.Add(idColumn); var readOnlyColumn = new DataColumn("ReadOnly", typeof(bool)); table.Columns.Add(readOnlyColumn); + var hidePasswordsColumn = new DataColumn("HidePasswords", typeof(bool)); + table.Columns.Add(hidePasswordsColumn); if (values != null) { @@ -133,6 +135,7 @@ namespace Bit.Core.Utilities var row = table.NewRow(); row[idColumn] = value.Id; row[readOnlyColumn] = value.ReadOnly; + row[hidePasswordsColumn] = value.HidePasswords; table.Rows.Add(row); } } diff --git a/src/Sql/dbo/Functions/UserCipherDetails.sql b/src/Sql/dbo/Functions/UserCipherDetails.sql index 2c19246a2b..7549807b94 100644 --- a/src/Sql/dbo/Functions/UserCipherDetails.sql +++ b/src/Sql/dbo/Functions/UserCipherDetails.sql @@ -23,6 +23,13 @@ SELECT THEN 1 ELSE 0 END [Edit], + CASE + WHEN + CU.[HidePasswords] = 0 + OR CG.[HidePasswords] = 0 + THEN 1 + ELSE 0 + END [ViewPassword], CASE WHEN O.[UseTotp] = 1 THEN 1 @@ -55,6 +62,7 @@ UNION ALL SELECT *, 1 [Edit], + 1 [ViewPassword], 0 [OrganizationUseTotp] FROM [dbo].[CipherDetails](@UserId) diff --git a/src/Sql/dbo/Functions/UserCollectionDetails.sql b/src/Sql/dbo/Functions/UserCollectionDetails.sql index f8eb2d9cce..ceea95d3ef 100644 --- a/src/Sql/dbo/Functions/UserCollectionDetails.sql +++ b/src/Sql/dbo/Functions/UserCollectionDetails.sql @@ -11,7 +11,14 @@ SELECT OR CG.[ReadOnly] = 0 THEN 0 ELSE 1 - END [ReadOnly] + END [ReadOnly], + CASE + WHEN + CU.[HidePasswords] = 0 + OR CG.[HidePasswords] = 0 + THEN 0 + ELSE 1 + END [HidePasswords] FROM [dbo].[CollectionView] C INNER JOIN diff --git a/src/Sql/dbo/Stored Procedures/CollectionUser_ReadByCollectionId.sql b/src/Sql/dbo/Stored Procedures/CollectionUser_ReadByCollectionId.sql index 472ff820b4..467ecb3e1b 100644 --- a/src/Sql/dbo/Stored Procedures/CollectionUser_ReadByCollectionId.sql +++ b/src/Sql/dbo/Stored Procedures/CollectionUser_ReadByCollectionId.sql @@ -6,7 +6,8 @@ BEGIN SELECT [OrganizationUserId] [Id], - [ReadOnly] + [ReadOnly], + [HidePasswords] FROM [dbo].[CollectionUser] WHERE diff --git a/src/Sql/dbo/Stored Procedures/CollectionUser_UpdateUsers.sql b/src/Sql/dbo/Stored Procedures/CollectionUser_UpdateUsers.sql index f27e4110ef..027fc48ac2 100644 --- a/src/Sql/dbo/Stored Procedures/CollectionUser_UpdateUsers.sql +++ b/src/Sql/dbo/Stored Procedures/CollectionUser_UpdateUsers.sql @@ -35,10 +35,15 @@ BEGIN ( @CollectionId, [Source].[Id], - [Source].[ReadOnly] + [Source].[ReadOnly], + [Source].[HidePasswords] ) - WHEN MATCHED AND [Target].[ReadOnly] != [Source].[ReadOnly] THEN - UPDATE SET [Target].[ReadOnly] = [Source].[ReadOnly] + WHEN MATCHED AND ( + [Target].[ReadOnly] != [Source].[ReadOnly] + OR [Target].[HidePasswords] != [Source].[HidePasswords] + ) THEN + UPDATE SET [Target].[ReadOnly] = [Source].[ReadOnly], + [Target].[HidePasswords] = [Source].[HidePasswords] WHEN NOT MATCHED BY SOURCE AND [Target].[CollectionId] = @CollectionId THEN DELETE diff --git a/src/Sql/dbo/Stored Procedures/Collection_CreateWithGroups.sql b/src/Sql/dbo/Stored Procedures/Collection_CreateWithGroups.sql index b0475a4a73..c577e1f02a 100644 --- a/src/Sql/dbo/Stored Procedures/Collection_CreateWithGroups.sql +++ b/src/Sql/dbo/Stored Procedures/Collection_CreateWithGroups.sql @@ -24,12 +24,14 @@ BEGIN ( [CollectionId], [GroupId], - [ReadOnly] + [ReadOnly], + [HidePasswords] ) SELECT @Id, [Id], - [ReadOnly] + [ReadOnly], + [HidePasswords] FROM @Groups WHERE diff --git a/src/Sql/dbo/Stored Procedures/Collection_ReadWithGroupsById.sql b/src/Sql/dbo/Stored Procedures/Collection_ReadWithGroupsById.sql index d9caec30f9..4230dca985 100644 --- a/src/Sql/dbo/Stored Procedures/Collection_ReadWithGroupsById.sql +++ b/src/Sql/dbo/Stored Procedures/Collection_ReadWithGroupsById.sql @@ -8,7 +8,8 @@ BEGIN SELECT [GroupId] [Id], - [ReadOnly] + [ReadOnly], + [HidePasswords] FROM [dbo].[CollectionGroup] WHERE diff --git a/src/Sql/dbo/Stored Procedures/Collection_ReadWithGroupsByIdUserId.sql b/src/Sql/dbo/Stored Procedures/Collection_ReadWithGroupsByIdUserId.sql index 40ad021931..7d30e777bd 100644 --- a/src/Sql/dbo/Stored Procedures/Collection_ReadWithGroupsByIdUserId.sql +++ b/src/Sql/dbo/Stored Procedures/Collection_ReadWithGroupsByIdUserId.sql @@ -9,7 +9,8 @@ BEGIN SELECT [GroupId] [Id], - [ReadOnly] + [ReadOnly], + [HidePasswords] FROM [dbo].[CollectionGroup] WHERE diff --git a/src/Sql/dbo/Stored Procedures/Collection_UpdateWithGroups.sql b/src/Sql/dbo/Stored Procedures/Collection_UpdateWithGroups.sql index f11231dc71..b0bfba442b 100644 --- a/src/Sql/dbo/Stored Procedures/Collection_UpdateWithGroups.sql +++ b/src/Sql/dbo/Stored Procedures/Collection_UpdateWithGroups.sql @@ -33,10 +33,15 @@ BEGIN ( @Id, [Source].[Id], - [Source].[ReadOnly] + [Source].[ReadOnly], + [Source].[HidePasswords] ) - WHEN MATCHED AND [Target].[ReadOnly] != [Source].[ReadOnly] THEN - UPDATE SET [Target].[ReadOnly] = [Source].[ReadOnly] + WHEN MATCHED AND ( + [Target].[ReadOnly] != [Source].[ReadOnly] + OR [Target].[HidePasswords] != [Source].[HidePasswords] + ) THEN + UPDATE SET [Target].[ReadOnly] = [Source].[ReadOnly], + [Target].[HidePasswords] = [Source].[HidePasswords] WHEN NOT MATCHED BY SOURCE AND [Target].[CollectionId] = @Id THEN DELETE diff --git a/src/Sql/dbo/Stored Procedures/Group_CreateWithCollections.sql b/src/Sql/dbo/Stored Procedures/Group_CreateWithCollections.sql index 84a56fa49e..b41637522e 100644 --- a/src/Sql/dbo/Stored Procedures/Group_CreateWithCollections.sql +++ b/src/Sql/dbo/Stored Procedures/Group_CreateWithCollections.sql @@ -25,12 +25,14 @@ BEGIN ( [CollectionId], [GroupId], - [ReadOnly] + [ReadOnly], + [HidePasswords] ) SELECT [Id], @Id, - [ReadOnly] + [ReadOnly], + [HidePasswords] FROM @Collections WHERE diff --git a/src/Sql/dbo/Stored Procedures/Group_ReadWithCollectionsById.sql b/src/Sql/dbo/Stored Procedures/Group_ReadWithCollectionsById.sql index e06a8cb9aa..22bcbf8374 100644 --- a/src/Sql/dbo/Stored Procedures/Group_ReadWithCollectionsById.sql +++ b/src/Sql/dbo/Stored Procedures/Group_ReadWithCollectionsById.sql @@ -8,7 +8,8 @@ BEGIN SELECT [CollectionId] [Id], - [ReadOnly] + [ReadOnly], + [HidePasswords] FROM [dbo].[CollectionGroup] WHERE diff --git a/src/Sql/dbo/Stored Procedures/Group_UpdateWithCollections.sql b/src/Sql/dbo/Stored Procedures/Group_UpdateWithCollections.sql index 460c12b443..2b3f4a4d8f 100644 --- a/src/Sql/dbo/Stored Procedures/Group_UpdateWithCollections.sql +++ b/src/Sql/dbo/Stored Procedures/Group_UpdateWithCollections.sql @@ -34,10 +34,15 @@ BEGIN ( [Source].[Id], @Id, - [Source].[ReadOnly] + [Source].[ReadOnly], + [Source].[HidePasswords] ) - WHEN MATCHED AND [Target].[ReadOnly] != [Source].[ReadOnly] THEN - UPDATE SET [Target].[ReadOnly] = [Source].[ReadOnly] + WHEN MATCHED AND ( + [Target].[ReadOnly] != [Source].[ReadOnly] + OR [Target].[HidePasswords] != [Source].[HidePasswords] + ) THEN + UPDATE SET [Target].[ReadOnly] = [Source].[ReadOnly], + [Target].[HidePasswords] = [Source].[HidePasswords] WHEN NOT MATCHED BY SOURCE AND [Target].[GroupId] = @Id THEN DELETE diff --git a/src/Sql/dbo/Stored Procedures/OrganizationUserUserDetails_ReadWithCollectionsById.sql b/src/Sql/dbo/Stored Procedures/OrganizationUserUserDetails_ReadWithCollectionsById.sql index b9c3245e8d..89173c7aee 100644 --- a/src/Sql/dbo/Stored Procedures/OrganizationUserUserDetails_ReadWithCollectionsById.sql +++ b/src/Sql/dbo/Stored Procedures/OrganizationUserUserDetails_ReadWithCollectionsById.sql @@ -8,7 +8,8 @@ BEGIN SELECT CU.[CollectionId] Id, - CU.[ReadOnly] + CU.[ReadOnly], + CU.[HidePasswords] FROM [dbo].[OrganizationUser] OU INNER JOIN diff --git a/src/Sql/dbo/Stored Procedures/OrganizationUser_CreateWithCollections.sql b/src/Sql/dbo/Stored Procedures/OrganizationUser_CreateWithCollections.sql index 1c7c88c757..de7f21d3d7 100644 --- a/src/Sql/dbo/Stored Procedures/OrganizationUser_CreateWithCollections.sql +++ b/src/Sql/dbo/Stored Procedures/OrganizationUser_CreateWithCollections.sql @@ -29,12 +29,14 @@ BEGIN ( [CollectionId], [OrganizationUserId], - [ReadOnly] + [ReadOnly], + [HidePasswords] ) SELECT [Id], @Id, - [ReadOnly] + [ReadOnly], + [HidePasswords] FROM @Collections WHERE diff --git a/src/Sql/dbo/Stored Procedures/OrganizationUser_ReadWithCollectionsById.sql b/src/Sql/dbo/Stored Procedures/OrganizationUser_ReadWithCollectionsById.sql index 39177f37f2..6675be82b4 100644 --- a/src/Sql/dbo/Stored Procedures/OrganizationUser_ReadWithCollectionsById.sql +++ b/src/Sql/dbo/Stored Procedures/OrganizationUser_ReadWithCollectionsById.sql @@ -8,7 +8,8 @@ BEGIN SELECT CU.[CollectionId] Id, - CU.[ReadOnly] + CU.[ReadOnly], + CU.[HidePasswords] FROM [dbo].[OrganizationUser] OU INNER JOIN diff --git a/src/Sql/dbo/Stored Procedures/OrganizationUser_UpdateWithCollections.sql b/src/Sql/dbo/Stored Procedures/OrganizationUser_UpdateWithCollections.sql index b35d688775..6c9dea062a 100644 --- a/src/Sql/dbo/Stored Procedures/OrganizationUser_UpdateWithCollections.sql +++ b/src/Sql/dbo/Stored Procedures/OrganizationUser_UpdateWithCollections.sql @@ -38,10 +38,15 @@ BEGIN ( [Source].[Id], @Id, - [Source].[ReadOnly] + [Source].[ReadOnly], + [Source].[HidePasswords] ) - WHEN MATCHED AND [Target].[ReadOnly] != [Source].[ReadOnly] THEN - UPDATE SET [Target].[ReadOnly] = [Source].[ReadOnly] + WHEN MATCHED AND ( + [Target].[ReadOnly] != [Source].[ReadOnly] + OR [Target].[HidePasswords] != [Source].[HidePasswords] + ) THEN + UPDATE SET [Target].[ReadOnly] = [Source].[ReadOnly], + [Target].[HidePasswords] = [Source].[HidePasswords] WHEN NOT MATCHED BY SOURCE AND [Target].[OrganizationUserId] = @Id THEN DELETE diff --git a/src/Sql/dbo/Tables/CollectionGroup.sql b/src/Sql/dbo/Tables/CollectionGroup.sql index d3398b7a25..255a6a6ca4 100644 --- a/src/Sql/dbo/Tables/CollectionGroup.sql +++ b/src/Sql/dbo/Tables/CollectionGroup.sql @@ -1,7 +1,8 @@ CREATE TABLE [dbo].[CollectionGroup] ( - [CollectionId] UNIQUEIDENTIFIER NOT NULL, - [GroupId] UNIQUEIDENTIFIER NOT NULL, - [ReadOnly] BIT NOT NULL, + [CollectionId] UNIQUEIDENTIFIER NOT NULL, + [GroupId] UNIQUEIDENTIFIER NOT NULL, + [ReadOnly] BIT NOT NULL, + [HidePasswords] BIT NOT NULL DEFAULT 0, CONSTRAINT [PK_CollectionGroup] PRIMARY KEY CLUSTERED ([CollectionId] ASC, [GroupId] ASC), CONSTRAINT [FK_CollectionGroup_Collection] FOREIGN KEY ([CollectionId]) REFERENCES [dbo].[Collection] ([Id]), CONSTRAINT [FK_CollectionGroup_Group] FOREIGN KEY ([GroupId]) REFERENCES [dbo].[Group] ([Id]) ON DELETE CASCADE diff --git a/src/Sql/dbo/Tables/CollectionUser.sql b/src/Sql/dbo/Tables/CollectionUser.sql index 4bb60ab56c..976d27872b 100644 --- a/src/Sql/dbo/Tables/CollectionUser.sql +++ b/src/Sql/dbo/Tables/CollectionUser.sql @@ -2,6 +2,7 @@ [CollectionId] UNIQUEIDENTIFIER NOT NULL, [OrganizationUserId] UNIQUEIDENTIFIER NOT NULL, [ReadOnly] BIT NOT NULL, + [HidePasswords] BIT NOT NULL DEFAULT 0, CONSTRAINT [PK_CollectionUser] PRIMARY KEY CLUSTERED ([CollectionId] ASC, [OrganizationUserId] ASC), CONSTRAINT [FK_CollectionUser_Collection] FOREIGN KEY ([CollectionId]) REFERENCES [dbo].[Collection] ([Id]) ON DELETE CASCADE, CONSTRAINT [FK_CollectionUser_OrganizationUser] FOREIGN KEY ([OrganizationUserId]) REFERENCES [dbo].[OrganizationUser] ([Id]) diff --git a/src/Sql/dbo/User Defined Types/SelectionReadOnlyArray.sql b/src/Sql/dbo/User Defined Types/SelectionReadOnlyArray.sql index 90f737b173..f2e19b1a09 100644 --- a/src/Sql/dbo/User Defined Types/SelectionReadOnlyArray.sql +++ b/src/Sql/dbo/User Defined Types/SelectionReadOnlyArray.sql @@ -1,4 +1,5 @@ CREATE TYPE [dbo].[SelectionReadOnlyArray] AS TABLE ( - [Id] UNIQUEIDENTIFIER NOT NULL, - [ReadOnly] BIT NOT NULL); + [Id] UNIQUEIDENTIFIER NOT NULL, + [ReadOnly] BIT NOT NULL, + [HidePasswords] BIT NOT NULL);