From 599816364254e2143a1de6ae800c2dd29a63bf24 Mon Sep 17 00:00:00 2001 From: pqhuy1987 Date: Thu, 11 Jun 2026 12:56:45 +0700 Subject: [PATCH] =?UTF-8?q?[CLAUDE]=20Infra:=20fix=20lock-demo-user=20prod?= =?UTF-8?q?=20NO-OP=20=E2=80=94=20union=2020=20UAT-matrix=20email=20+=20De?= =?UTF-8?q?moUserPassword=2012=20k=C3=BD=20t=E1=BB=B1=20(S58)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Run #381 cicd phát hiện LockDemoSampleUsersAsync NO-OP trên prod: 14 email named-person là population Dev-only. Root cause sâu: DemoUserPassword 11 ký tự < prod RequiredLength=12 → CreateAsync silent-fail mọi startup từ trước tới giờ (luôn cả nv.cao/nv.truong IT pool — root cause helpdesk inert S56 — và 5 real staff thiếu account). Fix (anh chốt 3 quyết định qua AskUserQuestion): - Union 20 email UAT-matrix prod thật (act/equ/fin/hra/pm/qs × nv/pp/tp + bod.1/2, tạo tay 05-13) vào lock list — exact-email only, KHÔNG pattern (binh.le@ là người thật sát scheme demo). - DemoUserPassword User@123456 → User@1234567 (12 ký tự, thỏa policy prod) → startup tới trên prod sẽ TẠO named-person (rồi lock ngay cùng startup) + nv.cao/nv.truong ACTIVE (helpdesk sống lại) + 5 real staff. - GIỮ ACTIVE: nv.test (creds cicd smoke-verify) + chuong.phan@solution.com.vn (typo domain nhưng có thể login thật anh Chương — xác nhận rồi dọn sau). Trade-off deadline 15:00: ship trước, test-specialist viết guard test sau (test-after justify — list-data fix, logic lock không đổi). Co-Authored-By: Claude Fable 5 --- .../Persistence/DbInitializer.cs | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/src/Backend/SolutionErp.Infrastructure/Persistence/DbInitializer.cs b/src/Backend/SolutionErp.Infrastructure/Persistence/DbInitializer.cs index 808d176..8be29e2 100644 --- a/src/Backend/SolutionErp.Infrastructure/Persistence/DbInitializer.cs +++ b/src/Backend/SolutionErp.Infrastructure/Persistence/DbInitializer.cs @@ -1538,27 +1538,50 @@ public static class DbInitializer // - Nếu user đã có → verify dept + position + roles, fix nếu drift // - Try-catch per-user → 1 fail không abort 12 còn lại // - Log chi tiết success/fixed/created/failed counts - // Default password: User@123456 (warn log để rotate prod). - private const string DemoUserPassword = "User@123456"; + // Default password: User@1234567 (warn log để rotate prod). + // [S58 2026-06-11] 11→12 ký tự: prod set Identity:Password:RequiredLength=12 + // (appsettings.Production.json) → CreateAsync silent-fail MỌI user dùng const này + // trên prod từ trước tới giờ (named-person sample + nv.cao/nv.truong IT pool + + // 5 real staff — root cause "helpdesk inert" S56). User Dev cũ giữ pass cũ + // (const chỉ áp dụng lúc CREATE user mới, không đổi pass existing). + private const string DemoUserPassword = "User@1234567"; - // [S57bis 2026-06-11] Khóa 14/16 demo sample user — sếp yêu cầu "clear dữ liệu cũ", + // [S57bis 2026-06-11] Khóa demo sample user — sếp yêu cầu "clear dữ liệu cũ", // anh chốt scope: CHỈ khóa user demo (GIỮ phiếu/HĐ/NCC/dự án demo). Ungated idempotent // (mirror SeedRealMasterDataAsync philosophy): chạy mọi startup → khóa BỀN kể cả ai - // re-activate nhầm. GIỮ ACTIVE có chủ đích: + // re-activate nhầm. Email không tồn tại trong DB → skip vô hại. + // [S58 2026-06-11] +20 email UAT-matrix `{dept}.{nv|pp|tp}@` + `bod.{1,2}@` = population + // prod THẬT (tạo TAY qua admin UI 2026-05-13 — chưa từng nằm trong seed). 14 email + // named-person = population Dev (prod không có — DemoUserPassword cũ 11 ký tự fail + // RequiredLength=12, đã fix). KHÔNG khóa theo pattern/regex: binh.le@/binh.lethanh@ + // là người thật nằm sát scheme demo — CHỈ exact-email list. + // GIỮ ACTIVE có chủ đích (KHÔNG đưa vào list): // - nv.cao + nv.truong : IT helpdesk round-robin pool (S52 P11-D) — khóa nốt SAU KHI // anh gán ≥1 user thật vào Phòng CNTT (ops-pending S56), tránh helpdesk chết hẳn. // - catalog.manager : account chức năng quản danh mục dùng chung (Plan CA S29). + // - nv.test : creds cicd-monitor smoke-verify prod sau deploy (anh chốt S58). + // - chuong.phan@solution.com.vn (domain thiếu 's', không trong seed): typo-dup của bản + // @solutions nhưng có thể là login thật anh Chương đang dùng — giữ, xác nhận rồi dọn sau. // Muốn mở lại 1 user có chủ đích → gỡ email khỏi list này + admin re-activate. private static async Task LockDemoSampleUsersAsync( UserManager userManager, ILogger logger) { string[] emails = [ + // Population Dev — named-person sample seed (16 trừ nv.cao/nv.truong) "bod.huynh@solutions.com.vn", "bod.le@solutions.com.vn", "bod.tran@solutions.com.vn", "pm.nguyen@solutions.com.vn", "pm.le@solutions.com.vn", "ccm.tran@solutions.com.vn", "pro.pham@solutions.com.vn", "fin.do@solutions.com.vn", "act.vu@solutions.com.vn", "equ.bui@solutions.com.vn", "hra.dang@solutions.com.vn", "qs.hoang@solutions.com.vn", "qs.ngo@solutions.com.vn", "nv.dinh@solutions.com.vn", + // Population prod — UAT-matrix tạo tay 2026-05-13 (S58) + "act.nv@solutions.com.vn", "act.pp@solutions.com.vn", "act.tp@solutions.com.vn", + "bod.1@solutions.com.vn", "bod.2@solutions.com.vn", + "equ.nv@solutions.com.vn", "equ.pp@solutions.com.vn", "equ.tp@solutions.com.vn", + "fin.nv@solutions.com.vn", "fin.pp@solutions.com.vn", "fin.tp@solutions.com.vn", + "hra.nv@solutions.com.vn", "hra.pp@solutions.com.vn", "hra.tp@solutions.com.vn", + "pm.nv@solutions.com.vn", "pm.pp@solutions.com.vn", "pm.tp@solutions.com.vn", + "qs.nv@solutions.com.vn", "qs.pp@solutions.com.vn", "qs.tp@solutions.com.vn", ]; var locked = 0;