diff --git a/src/Sql/dbo/Vault/Stored Procedures/Cipher/Cipher_Create.sql b/src/Sql/dbo/Vault/Stored Procedures/Cipher/Cipher_Create.sql
index eb49136895..be110c898a 100644
--- a/src/Sql/dbo/Vault/Stored Procedures/Cipher/Cipher_Create.sql
+++ b/src/Sql/dbo/Vault/Stored Procedures/Cipher/Cipher_Create.sql
@@ -13,6 +13,7 @@
@Reprompt TINYINT,
@Key VARCHAR(MAX) = NULL,
@ArchivedDate DATETIME2(7) = NULL
+ @Archives NVARCHAR(MAX) = NULL
AS
BEGIN
SET NOCOUNT ON
@@ -31,7 +32,8 @@ BEGIN
[DeletedDate],
[Reprompt],
[Key],
- [ArchivedDate]
+ [ArchivedDate],
+ [Archives]
)
VALUES
(
@@ -47,7 +49,8 @@ BEGIN
@DeletedDate,
@Reprompt,
@Key,
- @ArchivedDate
+ @ArchivedDate,
+ @Archives
)
IF @OrganizationId IS NOT NULL
diff --git a/src/Sql/dbo/Vault/Stored Procedures/Cipher/Cipher_CreateWithCollections.sql b/src/Sql/dbo/Vault/Stored Procedures/Cipher/Cipher_CreateWithCollections.sql
index c6816a1226..2a53a2d095 100644
--- a/src/Sql/dbo/Vault/Stored Procedures/Cipher/Cipher_CreateWithCollections.sql
+++ b/src/Sql/dbo/Vault/Stored Procedures/Cipher/Cipher_CreateWithCollections.sql
@@ -13,7 +13,8 @@
@Reprompt TINYINT,
@Key VARCHAR(MAX) = NULL,
@CollectionIds AS [dbo].[GuidIdArray] READONLY,
- @ArchivedDate DATETIME2(7) = NULL
+ @ArchivedDate DATETIME2(7) = NULL,
+ @Archives NVARCHAR(MAX) = NULL
AS
BEGIN
SET NOCOUNT ON
diff --git a/util/Migrator/DbScripts/2025-12-02_AddCipherArchives.sql b/util/Migrator/DbScripts/2025-12-02_AddCipherArchives.sql
index bbfe5d91e3..681c25d3b1 100644
--- a/util/Migrator/DbScripts/2025-12-02_AddCipherArchives.sql
+++ b/util/Migrator/DbScripts/2025-12-02_AddCipherArchives.sql
@@ -262,3 +262,116 @@ BEGIN
SELECT @UtcNow
END
GO
+
+IF OBJECT_ID('[dbo].[Cipher_Create]') IS NOT NULL
+BEGIN
+ DROP PROCEDURE [dbo].[Cipher_Create];
+END
+GO
+
+CREATE PROCEDURE [dbo].[Cipher_Create]
+ @Id UNIQUEIDENTIFIER OUTPUT,
+ @UserId UNIQUEIDENTIFIER,
+ @OrganizationId UNIQUEIDENTIFIER,
+ @Type TINYINT,
+ @Data NVARCHAR(MAX),
+ @Favorites NVARCHAR(MAX),
+ @Folders NVARCHAR(MAX),
+ @Attachments NVARCHAR(MAX), -- not used
+ @CreationDate DATETIME2(7),
+ @RevisionDate DATETIME2(7),
+ @DeletedDate DATETIME2(7),
+ @Reprompt TINYINT,
+ @Key VARCHAR(MAX) = NULL,
+ @ArchivedDate DATETIME2(7) = NULL
+ @Archives NVARCHAR(MAX) = NULL
+AS
+BEGIN
+ SET NOCOUNT ON
+
+ INSERT INTO [dbo].[Cipher]
+ (
+ [Id],
+ [UserId],
+ [OrganizationId],
+ [Type],
+ [Data],
+ [Favorites],
+ [Folders],
+ [CreationDate],
+ [RevisionDate],
+ [DeletedDate],
+ [Reprompt],
+ [Key],
+ [ArchivedDate],
+ [Archives]
+ )
+ VALUES
+ (
+ @Id,
+ CASE WHEN @OrganizationId IS NULL THEN @UserId ELSE NULL END,
+ @OrganizationId,
+ @Type,
+ @Data,
+ @Favorites,
+ @Folders,
+ @CreationDate,
+ @RevisionDate,
+ @DeletedDate,
+ @Reprompt,
+ @Key,
+ @ArchivedDate,
+ @Archives
+ )
+
+ IF @OrganizationId IS NOT NULL
+ BEGIN
+ EXEC [dbo].[User_BumpAccountRevisionDateByCipherId] @Id, @OrganizationId
+ END
+ ELSE IF @UserId IS NOT NULL
+ BEGIN
+ EXEC [dbo].[User_BumpAccountRevisionDate] @UserId
+ END
+END
+GO
+
+IF OBJECT_ID('[dbo].[Cipher_CreateWithCollections]') IS NOT NULL
+BEGIN
+ DROP PROCEDURE [dbo].[Cipher_CreateWithCollections];
+END
+GO
+
+CREATE PROCEDURE [dbo].[Cipher_CreateWithCollections]
+ @Id UNIQUEIDENTIFIER,
+ @UserId UNIQUEIDENTIFIER,
+ @OrganizationId UNIQUEIDENTIFIER,
+ @Type TINYINT,
+ @Data NVARCHAR(MAX),
+ @Favorites NVARCHAR(MAX),
+ @Folders NVARCHAR(MAX),
+ @Attachments NVARCHAR(MAX),
+ @CreationDate DATETIME2(7),
+ @RevisionDate DATETIME2(7),
+ @DeletedDate DATETIME2(7),
+ @Reprompt TINYINT,
+ @Key VARCHAR(MAX) = NULL,
+ @CollectionIds AS [dbo].[GuidIdArray] READONLY,
+ @ArchivedDate DATETIME2(7) = NULL,
+ @Archives NVARCHAR(MAX) = NULL
+AS
+BEGIN
+ SET NOCOUNT ON
+
+ EXEC [dbo].[Cipher_Create] @Id, @UserId, @OrganizationId, @Type, @Data, @Favorites, @Folders,
+ @Attachments, @CreationDate, @RevisionDate, @DeletedDate, @Reprompt, @Key, @ArchivedDate
+
+ DECLARE @UpdateCollectionsSuccess INT
+ EXEC @UpdateCollectionsSuccess = [dbo].[Cipher_UpdateCollections] @Id, @UserId, @OrganizationId, @CollectionIds
+
+ -- Bump the account revision date AFTER collections are assigned.
+ IF @UpdateCollectionsSuccess = 0
+ BEGIN
+ EXEC [dbo].[User_BumpAccountRevisionDateByCipherId] @Id, @OrganizationId
+ END
+END
+GO
diff --git a/util/MySqlMigrations/Migrations/20251203004842_AddCipherArchives.Designer.cs b/util/MySqlMigrations/Migrations/20251203174921_AddCipherArchives.Designer.cs
similarity index 99%
rename from util/MySqlMigrations/Migrations/20251203004842_AddCipherArchives.Designer.cs
rename to util/MySqlMigrations/Migrations/20251203174921_AddCipherArchives.Designer.cs
index b795566ae6..87c784da2a 100644
--- a/util/MySqlMigrations/Migrations/20251203004842_AddCipherArchives.Designer.cs
+++ b/util/MySqlMigrations/Migrations/20251203174921_AddCipherArchives.Designer.cs
@@ -12,7 +12,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace Bit.MySqlMigrations.Migrations
{
[DbContext(typeof(DatabaseContext))]
- [Migration("20251203004842_AddCipherArchives")]
+ [Migration("20251203174921_AddCipherArchives")]
partial class AddCipherArchives
{
///
diff --git a/util/MySqlMigrations/Migrations/20251203004842_AddCipherArchives.cs b/util/MySqlMigrations/Migrations/20251203174921_AddCipherArchives.cs
similarity index 55%
rename from util/MySqlMigrations/Migrations/20251203004842_AddCipherArchives.cs
rename to util/MySqlMigrations/Migrations/20251203174921_AddCipherArchives.cs
index 90638b3e5b..31b7ca2249 100644
--- a/util/MySqlMigrations/Migrations/20251203004842_AddCipherArchives.cs
+++ b/util/MySqlMigrations/Migrations/20251203174921_AddCipherArchives.cs
@@ -10,19 +10,12 @@ public partial class AddCipherArchives : Migration
///
protected override void Up(MigrationBuilder migrationBuilder)
{
- migrationBuilder.AddColumn(
- name: "Archives",
- table: "Cipher",
- type: "longtext",
- nullable: true)
- .Annotation("MySql:CharSet", "utf8mb4");
+
}
///
protected override void Down(MigrationBuilder migrationBuilder)
{
- migrationBuilder.DropColumn(
- name: "Archives",
- table: "Cipher");
+
}
}
diff --git a/util/PostgresMigrations/Migrations/20251203004812_AddCipherArchives.Designer.cs b/util/PostgresMigrations/Migrations/20251203174911_AddCipherArchives.Designer.cs
similarity index 99%
rename from util/PostgresMigrations/Migrations/20251203004812_AddCipherArchives.Designer.cs
rename to util/PostgresMigrations/Migrations/20251203174911_AddCipherArchives.Designer.cs
index 108dbb505f..c9125eac9f 100644
--- a/util/PostgresMigrations/Migrations/20251203004812_AddCipherArchives.Designer.cs
+++ b/util/PostgresMigrations/Migrations/20251203174911_AddCipherArchives.Designer.cs
@@ -12,7 +12,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
namespace Bit.PostgresMigrations.Migrations
{
[DbContext(typeof(DatabaseContext))]
- [Migration("20251203004812_AddCipherArchives")]
+ [Migration("20251203174911_AddCipherArchives")]
partial class AddCipherArchives
{
///
diff --git a/util/PostgresMigrations/Migrations/20251203004812_AddCipherArchives.cs b/util/PostgresMigrations/Migrations/20251203174911_AddCipherArchives.cs
similarity index 60%
rename from util/PostgresMigrations/Migrations/20251203004812_AddCipherArchives.cs
rename to util/PostgresMigrations/Migrations/20251203174911_AddCipherArchives.cs
index 9deab6d279..3cf4a55dda 100644
--- a/util/PostgresMigrations/Migrations/20251203004812_AddCipherArchives.cs
+++ b/util/PostgresMigrations/Migrations/20251203174911_AddCipherArchives.cs
@@ -10,18 +10,12 @@ public partial class AddCipherArchives : Migration
///
protected override void Up(MigrationBuilder migrationBuilder)
{
- migrationBuilder.AddColumn(
- name: "Archives",
- table: "Cipher",
- type: "text",
- nullable: true);
+
}
///
protected override void Down(MigrationBuilder migrationBuilder)
{
- migrationBuilder.DropColumn(
- name: "Archives",
- table: "Cipher");
+
}
}
diff --git a/util/SqliteMigrations/Migrations/20251203004807_AddCipherArchives.Designer.cs b/util/SqliteMigrations/Migrations/20251203174916_AddCipherArchives.Designer.cs
similarity index 99%
rename from util/SqliteMigrations/Migrations/20251203004807_AddCipherArchives.Designer.cs
rename to util/SqliteMigrations/Migrations/20251203174916_AddCipherArchives.Designer.cs
index 18e0246492..7f2f49c811 100644
--- a/util/SqliteMigrations/Migrations/20251203004807_AddCipherArchives.Designer.cs
+++ b/util/SqliteMigrations/Migrations/20251203174916_AddCipherArchives.Designer.cs
@@ -11,7 +11,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace Bit.SqliteMigrations.Migrations
{
[DbContext(typeof(DatabaseContext))]
- [Migration("20251203004807_AddCipherArchives")]
+ [Migration("20251203174916_AddCipherArchives")]
partial class AddCipherArchives
{
///
diff --git a/util/SqliteMigrations/Migrations/20251203004807_AddCipherArchives.cs b/util/SqliteMigrations/Migrations/20251203174916_AddCipherArchives.cs
similarity index 60%
rename from util/SqliteMigrations/Migrations/20251203004807_AddCipherArchives.cs
rename to util/SqliteMigrations/Migrations/20251203174916_AddCipherArchives.cs
index 287926db02..0616caa2fd 100644
--- a/util/SqliteMigrations/Migrations/20251203004807_AddCipherArchives.cs
+++ b/util/SqliteMigrations/Migrations/20251203174916_AddCipherArchives.cs
@@ -10,18 +10,12 @@ public partial class AddCipherArchives : Migration
///
protected override void Up(MigrationBuilder migrationBuilder)
{
- migrationBuilder.AddColumn(
- name: "Archives",
- table: "Cipher",
- type: "TEXT",
- nullable: true);
+
}
///
protected override void Down(MigrationBuilder migrationBuilder)
{
- migrationBuilder.DropColumn(
- name: "Archives",
- table: "Cipher");
+
}
}