Compare commits

...
3 Commits
Author SHA1 Message Date
DenozordecandCursor f8e7437210 fix(ui): убрать горизонтальный скролл в шторке сертификата
Docker images / prepare-release (push) Successful in 5s
Docker images / backend-test (push) Successful in 1m56s
Docker images / frontend-image (push) Successful in 3m9s
Docker images / updater-image (push) Successful in 49s
Docker images / backend-image (push) Successful in 2m46s
Docker images / notify-webhook (push) Skipped
Docker images / publish-release (push) Successful in 11s
Co-authored-by: Cursor <[email protected]>
2026-09-13 01:22:36 +07:00
DenozordecandCursor e0364d45df test(ipsec): закрепить отсутствие proposal-ключей в .sswan
Co-authored-by: Cursor <[email protected]>
2026-09-13 01:22:36 +07:00
DenozordecandCursor bbff586da2 fix(ipsec): убрать невалидный ike-proposal из .sswan-профиля
Co-authored-by: Cursor <[email protected]>
2026-09-13 01:22:36 +07:00
3 changed files with 18 additions and 10 deletions
@@ -101,6 +101,10 @@ import { identityRosBody } from "./ipsec-ros.js"
assert.equal(remote.addr, "vpn.example.com")
assert.equal(remote.id, "vpn.example.com")
assert.equal(local.p12, "cDEy")
// ike-proposal/esp-proposal не задаём: верхний регистр strongSwan не парсит,
// а его defaults совместимы с профилем MikroTik.
assert.equal("ike-proposal" in parsed, false)
assert.equal("esp-proposal" in parsed, false)
}
{
+7 -3
View File
@@ -253,7 +253,13 @@ export function findFreePoolIp(range: string, taken: Iterable<string>): string |
// ── клиентские конфиги ──────────────────────────────────────────────────────
/** strongSwan (Android/iOS) .sswan-профиль с встроенным .p12. */
/**
* strongSwan Android .sswan-профиль с встроенным .p12.
* `ike-proposal`/`esp-proposal` намеренно не задаём: приложение берёт свои defaults,
* которые пересекаются с профилем MikroTik (aes256-sha256-modp2048); фиксированный
* неполный список лишь сужает совместимость.
* @see https://docs.strongswan.org/docs/latest/os/androidVpnClientProfiles.html
*/
export function buildSswanConfig(args: {
name: string
serverEndpoint: string
@@ -269,8 +275,6 @@ export function buildSswanConfig(args: {
type: "ikev2-cert",
remote: { addr: args.serverEndpoint, id: args.serverId },
local: { p12: args.p12B64 },
"ike-proposal": "AES256-SHA256-MODP2048",
"esp-proposal": "AES256-SHA256-MODP2048",
},
null,
2,
+7 -7
View File
@@ -78,7 +78,7 @@ function IpsecCertSheet({
</SheetDescription>
</SheetHeader>
<div className="flex-1 overflow-y-auto px-6 py-5 flex flex-col gap-5">
<div className="flex-1 min-w-0 overflow-y-auto overflow-x-hidden px-6 py-5 flex flex-col gap-5">
{!bundle ? (
<p className="text-sm text-muted-foreground">
Бандл сертификата пуст перезапустите экспорт с новой парольной фразой.
@@ -119,7 +119,7 @@ function IpsecCertSheet({
</div>
</FormField>
{bundle.serverEndpoint ? (
<p className="text-xs text-muted-foreground">
<p className="text-xs text-muted-foreground break-all">
Сервер: <span className="font-mono">{bundle.serverEndpoint}</span>
</p>
) : null}
@@ -129,7 +129,7 @@ function IpsecCertSheet({
<SectionTitle>Файлы</SectionTitle>
<Button
variant="outline"
className="justify-start"
className="justify-start min-w-0"
disabled={!canDownload}
onClick={() => {
if (!bundle) return
@@ -138,12 +138,12 @@ function IpsecCertSheet({
}}
>
<DownloadIcon className="size-4" />
{bundle.filename} (.p12, сертификат + ключ)
<span className="truncate">{bundle.filename} (.p12, сертификат + ключ)</span>
</Button>
{bundle.sswanContent && bundle.sswanFilename ? (
<Button
variant="outline"
className="justify-start"
className="justify-start min-w-0"
disabled={!canDownload}
onClick={() => {
if (!bundle.sswanContent || !bundle.sswanFilename) return
@@ -152,7 +152,7 @@ function IpsecCertSheet({
}}
>
<DownloadIcon className="size-4" />
{bundle.sswanFilename} (strongSwan)
<span className="truncate">{bundle.sswanFilename} (strongSwan)</span>
</Button>
) : null}
{bundle.instructions ? (
@@ -172,7 +172,7 @@ function IpsecCertSheet({
</div>
{bundle.instructions ? (
<pre className="max-h-72 overflow-auto rounded-md border bg-muted/40 p-3 text-[11px] leading-relaxed whitespace-pre-wrap">
<pre className="max-h-72 overflow-y-auto overflow-x-hidden rounded-md border bg-muted/40 p-3 text-[11px] leading-relaxed whitespace-pre-wrap break-words">
{bundle.instructions}
</pre>
) : null}