fix(ipsec): сохранять общий сертификат при удалении identity
This commit is contained in:
1 parent
58f5c48a97
commit
d52c48e5ed
14 files changed
+506
-14
No files matched your search
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"date": "2026-10-10",
|
||||
"runtime": {
|
||||
"backend": "ux-refs114",
|
||||
"frontend": "ux-keepcert115"
|
||||
},
|
||||
"httpMocks": false,
|
||||
"cases": [
|
||||
{
|
||||
"theme": "dark",
|
||||
"width": 1280,
|
||||
"sharedCertificateUncheckedAndDisabled": true,
|
||||
"scopeExplained": true,
|
||||
"noDialogOverflow": true,
|
||||
"confirmedDelete": false
|
||||
},
|
||||
{
|
||||
"theme": "dark",
|
||||
"width": 320,
|
||||
"sharedCertificateUncheckedAndDisabled": true,
|
||||
"scopeExplained": true,
|
||||
"noDialogOverflow": true,
|
||||
"confirmedDelete": false
|
||||
},
|
||||
{
|
||||
"theme": "light",
|
||||
"width": 1280,
|
||||
"sharedCertificateUncheckedAndDisabled": true,
|
||||
"scopeExplained": true,
|
||||
"noDialogOverflow": true,
|
||||
"confirmedDelete": false
|
||||
},
|
||||
{
|
||||
"theme": "light",
|
||||
"width": 320,
|
||||
"sharedCertificateUncheckedAndDisabled": true,
|
||||
"scopeExplained": true,
|
||||
"noDialogOverflow": true,
|
||||
"confirmedDelete": true
|
||||
}
|
||||
],
|
||||
"pageErrors": [],
|
||||
"applicationWrites": [
|
||||
{
|
||||
"method": "DELETE",
|
||||
"path": "/api/ipsec/users/1/identity%3A*B",
|
||||
"query": "?removeCertificate=false"
|
||||
}
|
||||
],
|
||||
"scope": "Four real confirmation dialogs, one mobile UI DELETE preserving shared certificate"
|
||||
}
|
||||
@@ -0,0 +1,295 @@
|
||||
{
|
||||
"date": "2026-10-10",
|
||||
"block": "12.5.115",
|
||||
"deployment": {
|
||||
"date": "2026-10-10",
|
||||
"baseCommit": "58f5c48",
|
||||
"frontendBaseContext": "build-alias112-front",
|
||||
"frontendContext": "build-keepcert115-front",
|
||||
"override": "app/(main)/ipsec/page.tsx",
|
||||
"sourceSha256": "9e2fb7457410a837e0d9f2b0cbdb4201a0874b039f0a2f0202cc68bab6ebfd5c",
|
||||
"containers": {
|
||||
"backend": {
|
||||
"imageTag": "mmapp-test/backend:ux-refs114",
|
||||
"imageId": "sha256:df345a34f4e178b8a15fe5c537173f33a79eb15681a5e62b76a4aa7dab0017a6",
|
||||
"state": "running",
|
||||
"health": "healthy"
|
||||
},
|
||||
"frontend": {
|
||||
"imageTag": "mmapp-test/frontend:ux-keepcert115",
|
||||
"imageId": "sha256:98cd215a1c944f0883b0676d58a2df93ac689f488343b70b8360594848df81cf",
|
||||
"state": "running",
|
||||
"health": null
|
||||
},
|
||||
"postgres": {
|
||||
"imageTag": "postgres:18-alpine",
|
||||
"imageId": "sha256:77f585114c32fbca283dc835b0596f4e52b51b4c6662d7810b2f4084f60a1873",
|
||||
"state": "running",
|
||||
"health": "healthy"
|
||||
}
|
||||
}
|
||||
},
|
||||
"sourceByteHashMatches": true,
|
||||
"native": {
|
||||
"date": "2026-10-10",
|
||||
"block": "12.5.115",
|
||||
"name": "mm-ipsec115-1791641218646",
|
||||
"cn": "mm-ipsec115-1791641218646",
|
||||
"observations": [
|
||||
{
|
||||
"serverId": 1,
|
||||
"active": [
|
||||
{
|
||||
".id": "*1",
|
||||
"id": "CN=mm-ipsec115-1791641218646",
|
||||
"state": "established",
|
||||
"dynamic-address": "198.18.115.250",
|
||||
"remote-address": "104.165.244.7",
|
||||
"uptime": "1s"
|
||||
}
|
||||
],
|
||||
"catalog": [
|
||||
{
|
||||
"name": "CN=mm-ipsec115-1791641218646",
|
||||
"commonName": "CN=mm-ipsec115-1791641218646",
|
||||
"certName": "ipsec-user-mm-ipsec115-1791641218646-decoy",
|
||||
"online": false
|
||||
},
|
||||
{
|
||||
"name": "mm-ipsec115-1791641218646",
|
||||
"commonName": "mm-ipsec115-1791641218646",
|
||||
"certName": "ipsec-user-mm-ipsec115-1791641218646",
|
||||
"online": true,
|
||||
"activeAddress": "198.18.115.250"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"serverId": 2,
|
||||
"active": [
|
||||
{
|
||||
".id": "*1",
|
||||
"id": "194.226.121.150",
|
||||
"state": "established",
|
||||
"remote-address": "194.226.121.150",
|
||||
"uptime": "1s"
|
||||
}
|
||||
],
|
||||
"catalog": []
|
||||
}
|
||||
],
|
||||
"cleanup": [
|
||||
{
|
||||
"serverId": 1,
|
||||
"/system/logging": true,
|
||||
"/ip/ipsec/identity": true,
|
||||
"/ip/ipsec/peer": true,
|
||||
"/ip/ipsec/policy": true,
|
||||
"/ip/ipsec/policy/group": true,
|
||||
"/ip/ipsec/mode-config": true,
|
||||
"/ip/ipsec/proposal": true,
|
||||
"/ip/ipsec/profile": true,
|
||||
"/certificate": true,
|
||||
"/file": true,
|
||||
"/ip/address": true,
|
||||
"/ip/route": true,
|
||||
"/ip/firewall/nat": true
|
||||
},
|
||||
{
|
||||
"serverId": 2,
|
||||
"/system/logging": true,
|
||||
"/ip/ipsec/identity": true,
|
||||
"/ip/ipsec/peer": true,
|
||||
"/ip/ipsec/policy": true,
|
||||
"/ip/ipsec/policy/group": true,
|
||||
"/ip/ipsec/mode-config": true,
|
||||
"/ip/ipsec/proposal": true,
|
||||
"/ip/ipsec/profile": true,
|
||||
"/certificate": true,
|
||||
"/file": true,
|
||||
"/ip/address": true,
|
||||
"/ip/route": true,
|
||||
"/ip/firewall/nat": true
|
||||
}
|
||||
],
|
||||
"databaseWrites": "Two successful API mutations invoke history recording; deduplication may avoid new rows",
|
||||
"certificate": {
|
||||
"name": "ipsec-user-mm-ipsec115-1791641218646",
|
||||
"common-name": "mm-ipsec115-1791641218646",
|
||||
"ca": "mm-ipsec115-1791641218646-ca",
|
||||
"key-usage": "digital-signature,key-encipherment,tls-client"
|
||||
},
|
||||
"certificates": [
|
||||
[
|
||||
{
|
||||
"name": "mm-ipsec115-1791641218646-ca",
|
||||
"trusted": "true",
|
||||
"trust-store": "all",
|
||||
"invalid-before": "2026-10-10 17:06:59",
|
||||
"invalid-after": "2026-10-12 17:06:59",
|
||||
"common-name": "mm-ipsec115-1791641218646-CA"
|
||||
},
|
||||
{
|
||||
"name": "mm-ipsec115-1791641218646-server",
|
||||
"trusted": "false",
|
||||
"trust-store": "all",
|
||||
"ca": "mm-ipsec115-1791641218646-ca",
|
||||
"invalid-before": "2026-10-10 17:07:00",
|
||||
"invalid-after": "2026-10-12 17:07:00",
|
||||
"common-name": "194.226.121.150"
|
||||
},
|
||||
{
|
||||
"name": "ipsec-user-mm-ipsec115-1791641218646",
|
||||
"trusted": "false",
|
||||
"trust-store": "all",
|
||||
"ca": "mm-ipsec115-1791641218646-ca",
|
||||
"invalid-before": "2026-10-10 17:07:01",
|
||||
"invalid-after": "2026-10-12 17:07:01",
|
||||
"common-name": "mm-ipsec115-1791641218646"
|
||||
},
|
||||
{
|
||||
"name": "ipsec-user-mm-ipsec115-1791641218646-decoy",
|
||||
"trusted": "false",
|
||||
"trust-store": "all",
|
||||
"ca": "mm-ipsec115-1791641218646-ca",
|
||||
"invalid-before": "2026-10-10 17:07:01",
|
||||
"invalid-after": "2026-10-12 17:07:01",
|
||||
"common-name": "CN=mm-ipsec115-1791641218646"
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
"name": "mm-ipsec115-1791641218646-client-imported",
|
||||
"trusted": "true",
|
||||
"trust-store": "ipsec",
|
||||
"invalid-before": "2026-10-10 16:07:01",
|
||||
"invalid-after": "2026-10-12 16:07:01",
|
||||
"common-name": "mm-ipsec115-1791641218646"
|
||||
},
|
||||
{
|
||||
"name": "mm-ipsec115-1791641218646-ca-imported",
|
||||
"trusted": "true",
|
||||
"trust-store": "ipsec",
|
||||
"invalid-before": "2026-10-10 16:06:59",
|
||||
"invalid-after": "2026-10-12 16:06:59",
|
||||
"common-name": "mm-ipsec115-1791641218646-CA"
|
||||
}
|
||||
]
|
||||
],
|
||||
"catalogCorrect": true,
|
||||
"dnPhase": {
|
||||
"active": [
|
||||
{
|
||||
".id": "*1",
|
||||
"id": "CN=mm-ipsec115-1791641218646",
|
||||
"state": "established",
|
||||
"dynamic-address": "198.18.115.250",
|
||||
"remote-address": "104.165.244.7",
|
||||
"uptime": "1s"
|
||||
}
|
||||
],
|
||||
"clients": [
|
||||
{
|
||||
"name": "CN=mm-ipsec115-1791641218646",
|
||||
"commonName": "CN=mm-ipsec115-1791641218646",
|
||||
"certName": "ipsec-user-mm-ipsec115-1791641218646-decoy",
|
||||
"online": false
|
||||
},
|
||||
{
|
||||
"name": "mm-ipsec115-1791641218646",
|
||||
"commonName": "mm-ipsec115-1791641218646",
|
||||
"certName": "ipsec-user-mm-ipsec115-1791641218646",
|
||||
"online": true,
|
||||
"activeAddress": "198.18.115.250"
|
||||
}
|
||||
],
|
||||
"decoyOnline": false
|
||||
},
|
||||
"fqdnPhase": {
|
||||
"configuredRemoteId": "fqdn:mm-ipsec115-1791641218646.example",
|
||||
"nativeId": "mm-ipsec115-1791641218646.example",
|
||||
"assignedAddress": "198.18.115.250",
|
||||
"originalOnline": true,
|
||||
"decoyOnline": false
|
||||
},
|
||||
"aliasName": "mm-ipsec115-1791641218646-extra",
|
||||
"aliasPhase": {
|
||||
"native": [
|
||||
{
|
||||
"id": "mm-ipsec115-1791641218646.example",
|
||||
"state": "established",
|
||||
"dynamic-address": "198.18.115.250"
|
||||
}
|
||||
],
|
||||
"clients": [
|
||||
{
|
||||
"name": "CN=mm-ipsec115-1791641218646",
|
||||
"kind": "cert",
|
||||
"online": false
|
||||
},
|
||||
{
|
||||
"name": "mm-ipsec115-1791641218646",
|
||||
"kind": "cert",
|
||||
"online": false,
|
||||
"sessionAmbiguous": true
|
||||
},
|
||||
{
|
||||
"name": "mm-ipsec115-1791641218646-extra",
|
||||
"kind": "cert",
|
||||
"online": false,
|
||||
"sessionAmbiguous": true
|
||||
}
|
||||
],
|
||||
"summary": {
|
||||
"clientsTotal": 3,
|
||||
"clientsOnline": 0,
|
||||
"clientsSessionAmbiguous": 2
|
||||
}
|
||||
},
|
||||
"renameReply": {
|
||||
"error": "RouterOS: RouterOS API error 400 on /ip/ipsec/identity/*B: {\"detail\":\"failure: a matching identity already exists\",\"error\":400,\"message\":\"Bad Request\"}"
|
||||
},
|
||||
"targetGuards": {
|
||||
"certificatePatch409": true,
|
||||
"certificateDelete409": true,
|
||||
"sharedCertificateIdentityDelete409": true,
|
||||
"selectedIdentityPatchNativeMatchingConflict": true,
|
||||
"bothCommentsUnchanged": true
|
||||
},
|
||||
"uiDelete": {
|
||||
"selectedIdentityAbsent": true,
|
||||
"sharedCertificateNativeIdPreserved": true,
|
||||
"otherIdentityPreserved": true
|
||||
},
|
||||
"recovered": {
|
||||
"originalOnline": true,
|
||||
"sessionAmbiguous": false,
|
||||
"activeAddress": "198.18.115.250",
|
||||
"selectedIdentityPatch200AfterRemovingDuplicate": true,
|
||||
"originalCommentRestored": true
|
||||
}
|
||||
},
|
||||
"browserEvidence": "browser-ipsec-keepcert-2026-10-10.json",
|
||||
"local": {
|
||||
"eslintPassed": true,
|
||||
"sourceTypeScriptPassed": true,
|
||||
"productionBuildPassed": true,
|
||||
"uniqueE2eAccepted": 26,
|
||||
"firstRun": {
|
||||
"passed": 22,
|
||||
"failed": 4,
|
||||
"reason": "Modal hides background buttons from accessibility tree; use includeHidden to check retained DOM rows"
|
||||
},
|
||||
"correctedRerun": {
|
||||
"passed": 4,
|
||||
"seconds": 9.8
|
||||
}
|
||||
},
|
||||
"bounds": [
|
||||
"Backend remains refs114; only frontend rebuilt",
|
||||
"One real mobile UI DELETE with removeCertificate=false; four dialogs, not four deletes",
|
||||
"Foreign mode-config retained by API guard and removed only by owned fixture cleanup",
|
||||
"History recording invoked by DELETE and subsequent PATCH; inserted revision count not claimed",
|
||||
"No full regression or new encryption/data-plane acceptance"
|
||||
]
|
||||
}
|
||||
Reference in new issue
Block a user