using Microsoft.EntityFrameworkCore.Migrations; #nullable disable namespace ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.Migrations { /// /// ConfigurationDatabase-012: replaces the plaintext KeyValue column with a /// KeyHash column holding a deterministic HMAC-SHA256 hash of the key. /// /// /// A hash is one-way: existing plaintext keys cannot be converted to hashes /// without the originals. This migration therefore deletes all existing API-key /// rows. Every existing API key must be re-issued after this /// migration is applied — create new keys via the CLI / Management API / Central /// UI, distribute the one-time plaintext to callers, and approve them on methods. /// public partial class HashApiKeyValue : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) { // Existing keys hold only plaintext, which cannot be hashed back. They // must be re-issued, so remove them before the column change to keep the // new unique KeyHash index satisfiable. migrationBuilder.Sql("DELETE FROM ApiKeys;"); migrationBuilder.DropIndex( name: "IX_ApiKeys_KeyValue", table: "ApiKeys"); migrationBuilder.DropColumn( name: "KeyValue", table: "ApiKeys"); migrationBuilder.AddColumn( name: "KeyHash", table: "ApiKeys", type: "nvarchar(256)", maxLength: 256, nullable: false, defaultValue: ""); migrationBuilder.CreateIndex( name: "IX_ApiKeys_KeyHash", table: "ApiKeys", column: "KeyHash", unique: true); } /// protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropIndex( name: "IX_ApiKeys_KeyHash", table: "ApiKeys"); migrationBuilder.DropColumn( name: "KeyHash", table: "ApiKeys"); migrationBuilder.AddColumn( name: "KeyValue", table: "ApiKeys", type: "nvarchar(500)", maxLength: 500, nullable: false, defaultValue: ""); migrationBuilder.CreateIndex( name: "IX_ApiKeys_KeyValue", table: "ApiKeys", column: "KeyValue", unique: true); } } }