From 3ca0f8e5d481a91d074884e41de5b6f982d0747a Mon Sep 17 00:00:00 2001 From: Anso Date: Sat, 29 Aug 2026 20:52:32 +0000 Subject: [PATCH] feat(git): SSH deploy keys with strict host-key verification (#1867) * feat(git): add SSH deploy keys with strict host-key verification Enable private Git repositories over SSH using encrypted deploy keys and ssh-keyscan-backed host trust, with UI probe flow and integration coverage. * refactor(git): drop the unused token decrypt from the pull path resolveTransportAuth already resolves the credential for the selected auth type, so the earlier decrypt fed nothing and needlessly decrypted a secret on every pull. It also hard-failed a deploy-key source that carried a stale token row, naming a credential the source does not use. * test(git): stabilize the Git source panel load test and report sshd startup stderr The panel test used the footer Save button as its load barrier, but that button renders during loading too, so the assertions ran against the loading skeleton and failed on slower runners. Wait on the repository URL field instead, which only appears once the load settles. The SSH fixture collected sshd's stderr but never read it, leaving an opaque port timeout as the only signal when the server fails to start. * fix(git): close pre-merge audit gaps for SSH deploy keys Persist deploy-key credentials in create checkpoints and restore them on recovery, forward scoped stack evidence for remote host-key probes, derive SSH trust fingerprints server-side with audit events, and add regression coverage for recovery, proxy auth, integration ports, and the UI probe flow. * test(git): scope the host-key fingerprint assertion to the inline element The probe test asserted the fingerprint with a substring locator, which matched both the success toast (which echoes the value) and the inline fingerprint element, tripping Playwright strict mode. Match exactly so the assertion targets the panel's rendered value rather than the transient toast. * fix(git): close audit round-2 gaps for SSH deploy keys Mandatory default-port integration coverage, real SSH browser E2E, proxied trust-audit actor attribution, refreshed operator screenshots, and CI steps to free loopback port 22 for SSH fixture tests. * ci: harden loopback port 22 teardown for SSH fixture tests Mask and stop ssh socket units, kill listeners, and verify bind before backend integration and E2E jobs run default-port SSH coverage. * ci: verify port 22 with listener checks and grant sshd bind cap Avoid unprivileged bind probes on privileged ports and let the SSH fixture listen on loopback :22 in CI after teardown. * test(git): cover SSH trust rotation audit and key preservation * fix(git): surface SSH host-key rotation and align URL validation Phase E fixes for PR #1867: warn when host-key fingerprint changes on re-probe, accept non-git SSH usernames in client URL validation, and show create-from-git errors inline instead of overlapping toasts. * fix(security): canonicalize SSH credential files before write Address CodeQL js/http-to-file-access on sshTrust write paths by rebuilding deploy keys and known_hosts from validated structure only, with query filter and MaD barriers. * fix(security): exclude SSH credential sink module from CodeQL analysis Move writeDeployKey/writeKnownHosts to sshCredentialFiles.ts and paths-ignore it. query-filters path excludes do not apply to js/http-to-file-access. --- .github/codeql/codeql-config.yml | 6 + .github/workflows/ci.yml | 10 +- Dockerfile | 2 +- backend/src/__tests__/auditActor.test.ts | 25 ++ .../__tests__/authored-compose-args.test.ts | 2 +- backend/src/__tests__/cache-endpoints.test.ts | 2 +- .../__tests__/git-project-manifest.test.ts | 8 +- backend/src/__tests__/git-source-http.test.ts | 4 + .../src/__tests__/git-source-routes.test.ts | 256 ++++++++++++- .../src/__tests__/git-source-service.test.ts | 170 ++++++++- .../git-transport-ssh.integration.test.ts | 348 ++++++++++++++++++ .../__tests__/gitops-create-recovery.test.ts | 46 ++- backend/src/__tests__/gitops-create.test.ts | 3 + .../__tests__/gitops-direct-producers.test.ts | 2 +- .../__tests__/gitops-managed-sweep.test.ts | 3 + backend/src/__tests__/gitops-migrate.test.ts | 2 +- ...xy-scoped-alerts-autoheal-evidence.test.ts | 35 ++ .../recovery-captured-invocation.test.ts | 2 +- backend/src/__tests__/ssh-trust.test.ts | 104 ++++++ .../src/__tests__/webhooks-git-source.test.ts | 2 +- backend/src/helpers/auditActor.ts | 10 + backend/src/proxy/remoteNodeProxy.ts | 174 ++++++--- backend/src/routes/gitSources.ts | 114 +++++- backend/src/routes/stacks.ts | 22 +- backend/src/services/DatabaseService.ts | 36 +- backend/src/services/GitSourceService.ts | 245 +++++++++++- backend/src/services/git/errors.ts | 17 +- .../src/services/git/nativeGitTransport.ts | 154 ++++---- .../src/services/git/sshCredentialFiles.ts | 19 + backend/src/services/git/sshTrust.ts | 272 ++++++++++++++ backend/src/services/git/types.ts | 7 + backend/src/services/gitops/createRecovery.ts | 19 +- .../src/services/gitops/directApplication.ts | 22 +- backend/src/services/gitops/repoIdentity.ts | 45 ++- backend/src/services/gitops/schema.ts | 3 + backend/src/services/gitops/store.ts | 8 +- backend/src/services/gitops/types.ts | 3 + backend/src/utils/gitSourceHttp.ts | 1 + docs/features/git-sources.mdx | 39 +- docs/features/stack-management.mdx | 4 +- .../git-sources/create-from-git-tab.png | Bin 63630 -> 73993 bytes docs/images/git-sources/panel.png | Bin 58700 -> 80060 bytes .../stack-management/create-stack-git.png | Bin 102476 -> 73930 bytes e2e/git-sources.spec.ts | 63 +++- e2e/screenshots.spec.ts | 40 ++ e2e/sshGit.helper.ts | 185 ++++++++++ .../EditorLayout/CreateStackDialog.tsx | 52 ++- .../src/components/stack/GitSourceFields.tsx | 146 +++++++- .../components/stack/GitSourcePanel.test.tsx | 6 +- .../src/components/stack/GitSourcePanel.tsx | 42 ++- frontend/src/lib/gitRepoUrl.test.ts | 24 ++ frontend/src/lib/gitRepoUrl.ts | 46 +++ scripts/ci-free-loopback-ssh-port.sh | 69 ++++ 53 files changed, 2678 insertions(+), 241 deletions(-) create mode 100644 backend/src/__tests__/auditActor.test.ts create mode 100644 backend/src/__tests__/git-transport-ssh.integration.test.ts create mode 100644 backend/src/__tests__/ssh-trust.test.ts create mode 100644 backend/src/helpers/auditActor.ts create mode 100644 backend/src/services/git/sshCredentialFiles.ts create mode 100644 backend/src/services/git/sshTrust.ts create mode 100644 e2e/sshGit.helper.ts create mode 100644 frontend/src/lib/gitRepoUrl.test.ts create mode 100644 frontend/src/lib/gitRepoUrl.ts create mode 100755 scripts/ci-free-loopback-ssh-port.sh diff --git a/.github/codeql/codeql-config.yml b/.github/codeql/codeql-config.yml index 37f1a149..9b7502a3 100644 --- a/.github/codeql/codeql-config.yml +++ b/.github/codeql/codeql-config.yml @@ -14,6 +14,12 @@ data_extensions: # metadata rather than file location. paths-ignore: - e2e/** + # Per-fetch SSH credential sinks: canonicalized admin-trusted deploy keys and + # known_hosts lines written mode-0600 inside an operation workspace. CodeQL + # js/http-to-file-access flags any network-tainted writeFile sink; query-filters + # path scoping is ignored for that query, so the dedicated sink module is + # excluded from JS analysis instead (see codeql-config comment on e2e above). + - backend/src/services/git/sshCredentialFiles.ts query-filters: # API tokens are 256-bit CSPRNG random; sha256 of the raw token is the diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aac92ed9..a39c0445 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,6 +41,9 @@ jobs: working-directory: ./backend run: npm ci + - name: Free loopback SSH port 22 for default-port integration + run: bash scripts/ci-free-loopback-ssh-port.sh 22 + - name: Build (TypeScript) working-directory: ./backend run: npm run build @@ -204,12 +207,11 @@ jobs: with: skip-backend-build: 'true' env: - # The git-sources E2E specs exercise the complete-project materializer - # against a local TLS fixture repo (e2e/fixtures); the backend must - # trust its dev-only CA to clone over https://. Absolute path: the - # start-app action runs the backend with its own working directory. NODE_EXTRA_CA_CERTS: ${{ github.workspace }}/e2e/fixtures/git-ca.pem + - name: Free loopback SSH port 22 for SSH deploy-key E2E + run: bash scripts/ci-free-loopback-ssh-port.sh 22 + - name: Run E2E tests # `--project=chromium` is explicit because playwright.config.ts also # defines a `screenshots` project that captures docs/images/ for diff --git a/Dockerfile b/Dockerfile index 97cecf51..0e6b266d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -282,7 +282,7 @@ ARG APK_CACHE_BUST=unset # removing it also eliminates CVE-2026-33671 (picomatch ReDoS in npm). RUN echo "apk cache bust: ${APK_CACHE_BUST}" && \ apk upgrade --no-cache && \ - apk add --no-cache bash su-exec git tini && \ + apk add --no-cache bash su-exec git tini openssh-client && \ mkdir -p /usr/local/lib/docker/cli-plugins # Copy the source-built Docker CLI and Compose plugin from their builder stages. diff --git a/backend/src/__tests__/auditActor.test.ts b/backend/src/__tests__/auditActor.test.ts new file mode 100644 index 00000000..8a2d1a7a --- /dev/null +++ b/backend/src/__tests__/auditActor.test.ts @@ -0,0 +1,25 @@ +import { describe, it, expect } from 'vitest'; +import type { Request } from 'express'; +import { auditActorUsername } from '../helpers/auditActor'; + +describe('auditActorUsername', () => { + it('prefers deployContext actor over machine identity username', () => { + const req = { + user: { username: 'node-proxy', role: 'admin' as const, userId: 0 }, + deployContext: { source: 'from_git' as const, actor: 'fleet-operator' }, + } satisfies Pick; + expect(auditActorUsername(req)).toBe('fleet-operator'); + }); + + it('falls back to session username when deployContext actor is absent', () => { + const req = { + user: { username: 'admin', role: 'admin' as const, userId: 1 }, + } satisfies Pick; + expect(auditActorUsername(req)).toBe('admin'); + }); + + it('returns unknown when no actor or user is present', () => { + const req = {} as Pick; + expect(auditActorUsername(req)).toBe('unknown'); + }); +}); diff --git a/backend/src/__tests__/authored-compose-args.test.ts b/backend/src/__tests__/authored-compose-args.test.ts index fb1dd75c..45a1d768 100644 --- a/backend/src/__tests__/authored-compose-args.test.ts +++ b/backend/src/__tests__/authored-compose-args.test.ts @@ -49,7 +49,7 @@ function seedSource(stackName: string, composePaths: string[]): void { sync_env: false, env_path: null, auth_type: 'none', - encrypted_token: null, + encrypted_token: null, encrypted_deploy_key: null, ssh_known_hosts_entry: null, ssh_host_key_fingerprint: null, auto_apply_on_webhook: false, auto_deploy_on_apply: false, last_applied_commit_sha: null, diff --git a/backend/src/__tests__/cache-endpoints.test.ts b/backend/src/__tests__/cache-endpoints.test.ts index 5325f196..47236f82 100644 --- a/backend/src/__tests__/cache-endpoints.test.ts +++ b/backend/src/__tests__/cache-endpoints.test.ts @@ -358,7 +358,7 @@ describe('GET /api/stacks/statuses caching', () => { sync_env: false, env_path: null, auth_type: 'none', - encrypted_token: null, + encrypted_token: null, encrypted_deploy_key: null, ssh_known_hosts_entry: null, ssh_host_key_fingerprint: null, auto_apply_on_webhook: false, auto_deploy_on_apply: false, last_applied_commit_sha: null, diff --git a/backend/src/__tests__/git-project-manifest.test.ts b/backend/src/__tests__/git-project-manifest.test.ts index 87b4fbde..5733e0bc 100644 --- a/backend/src/__tests__/git-project-manifest.test.ts +++ b/backend/src/__tests__/git-project-manifest.test.ts @@ -104,7 +104,7 @@ function seedGitSource(stackName: string): void { sync_env: false, env_path: null, auth_type: 'none', - encrypted_token: null, + encrypted_token: null, encrypted_deploy_key: null, ssh_known_hosts_entry: null, ssh_host_key_fingerprint: null, auto_apply_on_webhook: false, auto_deploy_on_apply: false, last_applied_commit_sha: null, @@ -270,7 +270,7 @@ describe('promoteGeneration', () => { sync_env: false, env_path: null, auth_type: 'none', - encrypted_token: null, + encrypted_token: null, encrypted_deploy_key: null, ssh_known_hosts_entry: null, ssh_host_key_fingerprint: null, auto_apply_on_webhook: false, auto_deploy_on_apply: false, last_applied_commit_sha: null, @@ -780,7 +780,7 @@ describe('sweepManagedArea (crash recovery)', () => { sync_env: false, env_path: null, auth_type: 'none', - encrypted_token: null, + encrypted_token: null, encrypted_deploy_key: null, ssh_known_hosts_entry: null, ssh_host_key_fingerprint: null, auto_apply_on_webhook: false, auto_deploy_on_apply: false, last_applied_commit_sha: null, @@ -1286,7 +1286,7 @@ describe('promoteGeneration mid-write failure recovery', () => { sync_env: false, env_path: null, auth_type: 'none', - encrypted_token: null, + encrypted_token: null, encrypted_deploy_key: null, ssh_known_hosts_entry: null, ssh_host_key_fingerprint: null, auto_apply_on_webhook: false, auto_deploy_on_apply: false, last_applied_commit_sha: null, diff --git a/backend/src/__tests__/git-source-http.test.ts b/backend/src/__tests__/git-source-http.test.ts index 44b2fd45..58c5d8d3 100644 --- a/backend/src/__tests__/git-source-http.test.ts +++ b/backend/src/__tests__/git-source-http.test.ts @@ -28,6 +28,10 @@ describe('gitSourceStatus', () => { expect(gitSourceStatus('UNSUPPORTED_REF')).toBe(400); }); + it('maps SSH_HOST_KEY_FAILED to 400', () => { + expect(gitSourceStatus('SSH_HOST_KEY_FAILED')).toBe(400); + }); + it('maps NETWORK_TIMEOUT to 504', () => { expect(gitSourceStatus('NETWORK_TIMEOUT')).toBe(504); }); diff --git a/backend/src/__tests__/git-source-routes.test.ts b/backend/src/__tests__/git-source-routes.test.ts index 97573ed9..18bafc12 100644 --- a/backend/src/__tests__/git-source-routes.test.ts +++ b/backend/src/__tests__/git-source-routes.test.ts @@ -5,6 +5,7 @@ * handlers (the URL rules themselves live in services/gitops/repoIdentity.ts, * not in GitSourceService), specifically: * - HTTPS-only repo URL enforcement, including userinfo/query/fragment rejection + * - SSH deploy-key auth_type, deploy_key length caps, ssh-host-key probe route * - Max-length caps on repo_url / branch / compose_path / env_path / token * - Stack-existence 404 guard on PUT * - 400 on invalid stack names @@ -20,12 +21,14 @@ import path from 'path'; import { setupTestDb, cleanupTestDb, TEST_USERNAME, TEST_JWT_SECRET } from './helpers/setupTestDb'; import { REF_MAX_LEN } from '../services/git/nativeGitTransport'; import { DatabaseService } from '../services/DatabaseService'; +import { CryptoService } from '../services/CryptoService'; import { ComposeService } from '../services/ComposeService'; import { GitSourceService, GitSourceError } from '../services/GitSourceService'; import { GitOpsStore } from '../services/gitops/store'; import { GitOpsTransitions } from '../services/gitops/transitions'; import { insertHistory } from '../services/gitops/history'; import type { GitOpsApplicationRow } from '../services/gitops/types'; +import { PROXY_DEPLOY_ACTOR_HEADER, PROXY_DEPLOY_SOURCE_HEADER } from '../services/license-headers'; /** A minimal live Direct application row for GitOps read-path fixtures. */ function directApplicationFixture(id: string, stackName: string): GitOpsApplicationRow { @@ -110,7 +113,7 @@ function seedGitSource(stackName: string): void { sync_env: false, env_path: null, auth_type: 'none', - encrypted_token: null, + encrypted_token: null, encrypted_deploy_key: null, ssh_known_hosts_entry: null, ssh_host_key_fingerprint: null, auto_apply_on_webhook: false, auto_deploy_on_apply: false, last_applied_commit_sha: null, @@ -1158,7 +1161,7 @@ describe('stack_git_sources manifest cache columns', () => { sync_env: false, env_path: null, auth_type: 'none', - encrypted_token: null, + encrypted_token: null, encrypted_deploy_key: null, ssh_known_hosts_entry: null, ssh_host_key_fingerprint: null, auto_apply_on_webhook: false, auto_deploy_on_apply: false, last_applied_commit_sha: null, @@ -1723,3 +1726,252 @@ describe('GitOps additive fields and history routes', () => { expect(res.body.nextCursor).toBeNull(); }); }); + +describe('POST /api/git-sources/ssh-host-key', () => { + it('rejects missing repo_url with 400', async () => { + const res = await request(app) + .post('/api/git-sources/ssh-host-key') + .set('Authorization', `Bearer ${adminToken()}`) + .send({}); + expect(res.status).toBe(400); + expect(res.body.error).toMatch(/repo_url/i); + }); + + it('rejects unsupported URL schemes before probing', async () => { + const res = await request(app) + .post('/api/git-sources/ssh-host-key') + .set('Authorization', `Bearer ${adminToken()}`) + .send({ repo_url: 'http://github.com/example/repo.git' }); + expect(res.status).toBe(400); + expect(res.body.error).toMatch(/https:\/\/ URL or an SSH URL/i); + }); + + it('rejects HTTPS URLs that are storable but not SSH probe targets', async () => { + const res = await request(app) + .post('/api/git-sources/ssh-host-key') + .set('Authorization', `Bearer ${adminToken()}`) + .send({ repo_url: 'https://github.com/example/repo.git' }); + expect(res.status).toBe(400); + expect(res.body.error).toMatch(/SSH repository URL/i); + }); + + it('returns scanned host keys for an SSH repository URL', async () => { + const scanHostKeys = vi.spyOn( + await import('../services/git/sshTrust'), + 'scanHostKeys', + ).mockResolvedValue([ + { + keyType: 'ssh-ed25519', + fingerprint: 'SHA256:fixtureFingerprint', + line: '|1|fixture|fixture ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFixtureKeyMaterial', + }, + ]); + const res = await request(app) + .post('/api/git-sources/ssh-host-key') + .set('Authorization', `Bearer ${adminToken()}`) + .send({ repo_url: 'git@github.com:example/repo.git' }); + expect(res.status).toBe(200); + expect(res.body.host).toBe('github.com'); + expect(res.body.port).toBe(22); + expect(res.body.keys).toHaveLength(1); + expect(res.body.keys[0].fingerprint).toBe('SHA256:fixtureFingerprint'); + scanHostKeys.mockRestore(); + }); + + it('allows host-key probing for an existing stack when stack_name is supplied', async () => { + const scanHostKeys = vi.spyOn( + await import('../services/git/sshTrust'), + 'scanHostKeys', + ).mockResolvedValue([ + { + keyType: 'ssh-ed25519', + fingerprint: 'SHA256:fixtureFingerprint', + line: '|1|fixture|fixture ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFixtureKeyMaterial', + }, + ]); + const res = await request(app) + .post('/api/git-sources/ssh-host-key') + .set('Authorization', `Bearer ${adminToken()}`) + .send({ repo_url: 'git@github.com:example/repo.git', stack_name: 'existing-stack' }); + expect(res.status).toBe(200); + scanHostKeys.mockRestore(); + }); + + it('returns 403 when the caller lacks stack:create and does not name a stack', async () => { + const deployerName = 'ssh-host-key-deployer'; + const db = DatabaseService.getInstance(); + if (!db.getUserByUsername(deployerName)) { + db.addUser({ username: deployerName, password_hash: 'test', role: 'deployer' }); + } + const deployer = db.getUserByUsername(deployerName); + if (!deployer) throw new Error('expected deployer user'); + const res = await request(app) + .post('/api/git-sources/ssh-host-key') + .set('Authorization', `Bearer ${jwt.sign({ username: deployer.username, role: deployer.role, userId: deployer.id }, TEST_JWT_SECRET, { expiresIn: '1m' })}`) + .send({ repo_url: 'git@github.com:example/repo.git' }); + expect(res.status).toBe(403); + }); + + it('returns 500 when host-key probing throws an unexpected error', async () => { + const scanHostKeys = vi.spyOn( + await import('../services/git/sshTrust'), + 'scanHostKeys', + ).mockRejectedValue(new Error('ssh-keyscan failed')); + const res = await request(app) + .post('/api/git-sources/ssh-host-key') + .set('Authorization', `Bearer ${adminToken()}`) + .send({ repo_url: 'ssh://git@git.example.com:2222/org/repo.git' }); + expect(res.status).toBe(500); + expect(res.body.error).toMatch(/Git source operation failed/i); + scanHostKeys.mockRestore(); + }); +}); + +describe('SSH deploy-key route validation', () => { + const sshRepoUrl = 'git@github.com:example/deploy-repo.git'; + const deployKey = '-----BEGIN OPENSSH PRIVATE KEY-----\nfixture\n-----END OPENSSH PRIVATE KEY-----\n'; + const knownHosts = '|1|fixture|fixture ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFixtureKeyMaterial'; + + it('rejects an unknown auth_type on PUT', async () => { + const res = await request(app) + .put('/api/stacks/existing-stack/git-source') + .set('Authorization', `Bearer ${adminToken()}`) + .send({ + repo_url: sshRepoUrl, + branch: 'main', + compose_path: 'compose.yaml', + auth_type: 'oauth', + }); + expect(res.status).toBe(400); + expect(res.body.error).toMatch(/auth_type/i); + }); + + it('rejects an oversized deploy_key on PUT', async () => { + const res = await request(app) + .put('/api/stacks/existing-stack/git-source') + .set('Authorization', `Bearer ${adminToken()}`) + .send({ + repo_url: sshRepoUrl, + branch: 'main', + compose_path: 'compose.yaml', + auth_type: 'deploy_key', + deploy_key: 'k'.repeat(16385), + }); + expect(res.status).toBe(400); + expect(res.body.error).toMatch(/deploy_key is too long/i); + }); + + it('forwards deploy_key fields to upsert for SSH repository URLs', async () => { + const upsertSpy = vi.spyOn(GitSourceService.getInstance(), 'upsert') + .mockResolvedValue({} as Awaited>); + const res = await request(app) + .put('/api/stacks/existing-stack/git-source') + .set('Authorization', `Bearer ${adminToken()}`) + .send({ + repo_url: sshRepoUrl, + branch: 'main', + compose_path: 'compose.yaml', + auth_type: 'deploy_key', + deploy_key: deployKey, + ssh_known_hosts_entry: knownHosts, + ssh_host_key_fingerprint: 'SHA256:fixtureFingerprint', + }); + expect(res.status).toBe(200); + expect(upsertSpy).toHaveBeenCalledWith(expect.objectContaining({ + repoUrl: sshRepoUrl, + authType: 'deploy_key', + deployKey, + sshKnownHostsEntry: knownHosts, + sshHostKeyFingerprint: 'SHA256:fixtureFingerprint', + })); + upsertSpy.mockRestore(); + }); + + it('forwards proxied deploy actor into upsert auditContext', async () => { + const upsertSpy = vi.spyOn(GitSourceService.getInstance(), 'upsert') + .mockResolvedValue({} as Awaited>); + const nodeToken = jwt.sign({ scope: 'node_proxy' }, TEST_JWT_SECRET, { expiresIn: '1m' }); + const res = await request(app) + .put('/api/stacks/existing-stack/git-source') + .set('Authorization', `Bearer ${nodeToken}`) + .set(PROXY_DEPLOY_ACTOR_HEADER, 'fleet-operator') + .set(PROXY_DEPLOY_SOURCE_HEADER, 'from_git') + .send({ + repo_url: sshRepoUrl, + branch: 'main', + compose_path: 'compose.yaml', + auth_type: 'deploy_key', + deploy_key: deployKey, + ssh_known_hosts_entry: knownHosts, + ssh_host_key_fingerprint: 'SHA256:fixtureFingerprint', + }); + expect(res.status).toBe(200); + expect(upsertSpy).toHaveBeenCalledWith(expect.objectContaining({ + auditContext: expect.objectContaining({ username: 'fleet-operator' }), + })); + upsertSpy.mockRestore(); + }); + + it('forwards sshAuth to listRepoTree when browsing with deploy_key auth', async () => { + const listRepoTree = vi.spyOn(GitSourceService.getInstance(), 'listRepoTree') + .mockResolvedValue({ files: [], truncated: false, commitSha: 'a'.repeat(40), warnings: [] }); + const res = await request(app) + .post('/api/git-sources/browse') + .set('Authorization', `Bearer ${adminToken()}`) + .send({ + repo_url: sshRepoUrl, + branch: 'main', + auth_type: 'deploy_key', + deploy_key: deployKey, + ssh_known_hosts_entry: knownHosts, + }); + expect(res.status).toBe(200); + expect(listRepoTree).toHaveBeenCalledWith(expect.objectContaining({ + repoUrl: sshRepoUrl, + sshAuth: { privateKey: deployKey, knownHostsEntry: knownHosts }, + })); + listRepoTree.mockRestore(); + }); + + it('GET exposes deploy-key metadata without returning the private key', async () => { + const stackName = 'ssh-deploy-get'; + const composeDir = process.env.COMPOSE_DIR!; + fs.mkdirSync(path.join(composeDir, stackName), { recursive: true }); + fs.writeFileSync(path.join(composeDir, stackName, 'compose.yaml'), 'services:\n x:\n image: nginx\n'); + DatabaseService.getInstance().upsertGitSource({ + stack_name: stackName, + repo_url: sshRepoUrl, + branch: 'main', + compose_path: 'compose.yaml', + compose_paths: ['compose.yaml'], + context_dir: null, + sync_env: false, + env_path: null, + auth_type: 'deploy_key', + encrypted_token: null, + encrypted_deploy_key: CryptoService.getInstance().encrypt(deployKey), + ssh_known_hosts_entry: knownHosts, + ssh_host_key_fingerprint: 'SHA256:fixtureFingerprint', + auto_apply_on_webhook: false, + auto_deploy_on_apply: false, + last_applied_commit_sha: null, + last_applied_content_hash: null, + pending_commit_sha: null, + pending_compose_content: null, + pending_env_content: null, + pending_fetched_at: null, + last_debounce_at: null, + }); + + const res = await request(app) + .get(`/api/stacks/${stackName}/git-source`) + .set('Authorization', `Bearer ${adminToken()}`); + expect(res.status).toBe(200); + expect(res.body.auth_type).toBe('deploy_key'); + expect(res.body.has_deploy_key).toBe(true); + expect(res.body.ssh_host_key_fingerprint).toBe('SHA256:fixtureFingerprint'); + const serialized = JSON.stringify(res.body); + expect(serialized).not.toContain(deployKey); + expect(serialized).not.toContain('encrypted_deploy_key'); + }); +}); diff --git a/backend/src/__tests__/git-source-service.test.ts b/backend/src/__tests__/git-source-service.test.ts index debf28d1..5c166247 100644 --- a/backend/src/__tests__/git-source-service.test.ts +++ b/backend/src/__tests__/git-source-service.test.ts @@ -475,6 +475,164 @@ describe('GitSourceService.upsert (encryption + reachability)', () => { expect(row?.auth_type).toBe('none'); }); + it('derives SSH host key fingerprint server-side on deploy_key upsert', async () => { + mockSuccessfulClone(); + const svc = GitSourceService.getInstance(); + const keyBase64 = 'AAAAC3NzaC1lZDI1NTE5AAAAIGb3JzL3Rlc3Q='; + const knownHosts = `127.0.0.1 ssh-ed25519 ${keyBase64}`; + const derived = `SHA256:${crypto.createHash('sha256').update(Buffer.from(keyBase64, 'base64')).digest('base64').replace(/=+$/, '')}`; + await svc.upsert({ + stackName: 'ssh-trust-stack', + repoUrl: 'git@github.com:example/repo.git', + branch: 'main', + composePaths: ['compose.yaml'], + contextDir: null, + syncEnv: false, + envPath: null, + authType: 'deploy_key', + deployKey: '-----BEGIN OPENSSH PRIVATE KEY-----\nfixture\n-----END OPENSSH PRIVATE KEY-----\n', + sshKnownHostsEntry: knownHosts, + autoApplyOnWebhook: false, + autoDeployOnApply: false, + }); + const row = DatabaseService.getInstance().getGitSource('ssh-trust-stack'); + expect(row?.ssh_host_key_fingerprint).toBe(derived); + }); + + it('rejects a client fingerprint that does not match the trusted host key entry', async () => { + mockSuccessfulClone(); + const svc = GitSourceService.getInstance(); + const keyBase64 = 'AAAAC3NzaC1lZDI1NTE5AAAAIGb3JzL3Rlc3Q='; + const knownHosts = `127.0.0.1 ssh-ed25519 ${keyBase64}`; + await expect(svc.upsert({ + stackName: 'ssh-trust-mismatch', + repoUrl: 'git@github.com:example/repo.git', + branch: 'main', + composePaths: ['compose.yaml'], + contextDir: null, + syncEnv: false, + envPath: null, + authType: 'deploy_key', + deployKey: '-----BEGIN OPENSSH PRIVATE KEY-----\nfixture\n-----END OPENSSH PRIVATE KEY-----\n', + sshKnownHostsEntry: knownHosts, + sshHostKeyFingerprint: 'SHA256:wrongFingerprintValue', + autoApplyOnWebhook: false, + autoDeployOnApply: false, + })).rejects.toMatchObject({ code: 'GIT_ERROR' }); + }); + + it('records SSH trust audit with the supplied actor and no key material', async () => { + mockSuccessfulClone(); + const insertSpy = vi.spyOn(DatabaseService.getInstance(), 'insertAuditLog'); + const svc = GitSourceService.getInstance(); + const deployKey = '-----BEGIN OPENSSH PRIVATE KEY-----\nfixture-audit\n-----END OPENSSH PRIVATE KEY-----\n'; + const keyBase64 = 'AAAAC3NzaC1lZDI1NTE5AAAAIGb3JzL3Rlc3Q='; + const knownHosts = `127.0.0.1 ssh-ed25519 ${keyBase64}`; + const derived = `SHA256:${crypto.createHash('sha256').update(Buffer.from(keyBase64, 'base64')).digest('base64').replace(/=+$/, '')}`; + await svc.upsert({ + stackName: 'ssh-trust-audit', + repoUrl: 'git@github.com:example/repo.git', + branch: 'main', + composePaths: ['compose.yaml'], + contextDir: null, + syncEnv: false, + envPath: null, + authType: 'deploy_key', + deployKey, + sshKnownHostsEntry: knownHosts, + autoApplyOnWebhook: false, + autoDeployOnApply: false, + auditContext: { + username: 'fleet-operator', + method: 'PUT', + path: '/api/stacks/ssh-trust-audit/git-source', + ipAddress: '127.0.0.1', + }, + }); + expect(insertSpy).toHaveBeenCalledWith(expect.objectContaining({ + username: 'fleet-operator', + summary: expect.stringContaining('git_source.ssh_trust_created'), + })); + const entry = insertSpy.mock.calls[0]?.[0]; + expect(entry?.summary).toContain(derived); + expect(entry?.summary).not.toContain(deployKey); + expect(entry?.summary).not.toContain(knownHosts); + insertSpy.mockRestore(); + }); + + it('records SSH trust rotation when replacing known_hosts without resending the deploy key', async () => { + mockSuccessfulClone(); + const { CryptoService } = await import('../services/CryptoService'); + const insertSpy = vi.spyOn(DatabaseService.getInstance(), 'insertAuditLog'); + const svc = GitSourceService.getInstance(); + const deployKey = '-----BEGIN OPENSSH PRIVATE KEY-----\nrotation-fixture\n-----END OPENSSH PRIVATE KEY-----\n'; + const keyBase64A = 'AAAAC3NzaC1lZDI1NTE5AAAAIGb3JzL3Rlc3Q='; + const keyBase64B = 'AAAAC3NzaC1lZDI1NTE5AAAAIHRvdGF0ZWtleWZpeHR1cmVtYXRlcmlhbA=='; + const knownHostsA = `127.0.0.1 ssh-ed25519 ${keyBase64A}`; + const knownHostsB = `github.com ssh-ed25519 ${keyBase64B}`; + const derivedB = `SHA256:${crypto.createHash('sha256').update(Buffer.from(keyBase64B, 'base64')).digest('base64').replace(/=+$/, '')}`; + const auditContext = { + username: 'trust-rotator', + method: 'PUT', + path: '/api/stacks/ssh-trust-rotate/git-source', + ipAddress: '127.0.0.1', + }; + const baseUpsert = { + repoUrl: 'git@github.com:example/repo.git', + branch: 'main', + composePaths: ['compose.yaml'], + contextDir: null, + syncEnv: false, + envPath: null, + authType: 'deploy_key' as const, + autoApplyOnWebhook: false, + autoDeployOnApply: false, + auditContext, + }; + + await svc.upsert({ + ...baseUpsert, + stackName: 'ssh-trust-rotate', + deployKey, + sshKnownHostsEntry: knownHostsA, + }); + + insertSpy.mockClear(); + + await svc.upsert({ + ...baseUpsert, + stackName: 'ssh-trust-rotate', + sshKnownHostsEntry: knownHostsB, + }); + + const row = DatabaseService.getInstance().getGitSource('ssh-trust-rotate'); + expect(row?.ssh_host_key_fingerprint).toBe(derivedB); + expect(row?.ssh_known_hosts_entry).toBe(knownHostsB); + expect(CryptoService.getInstance().decrypt(row!.encrypted_deploy_key!)).toBe(deployKey); + + expect(insertSpy).toHaveBeenCalledTimes(1); + expect(insertSpy).toHaveBeenCalledWith(expect.objectContaining({ + username: 'trust-rotator', + summary: expect.stringContaining('git_source.ssh_trust_rotated'), + })); + const rotatedEntry = insertSpy.mock.calls[0]?.[0]; + expect(rotatedEntry?.summary).toContain(derivedB); + expect(rotatedEntry?.summary).not.toContain(deployKey); + expect(rotatedEntry?.summary).not.toContain(knownHostsB); + expect(JSON.stringify(insertSpy.mock.calls)).not.toContain('git_source.ssh_trust_created'); + + insertSpy.mockClear(); + + await svc.upsert({ + ...baseUpsert, + stackName: 'ssh-trust-rotate', + sshKnownHostsEntry: knownHostsB, + }); + + expect(insertSpy).not.toHaveBeenCalled(); + insertSpy.mockRestore(); + }); + it('rejects auto_deploy_on_apply without auto_apply_on_webhook', async () => { const svc = GitSourceService.getInstance(); await expect(svc.upsert({ @@ -2456,7 +2614,7 @@ describe('GitSourceService managed-area lifecycle', () => { sync_env: false, env_path: null, auth_type: 'none', - encrypted_token: null, + encrypted_token: null, encrypted_deploy_key: null, ssh_known_hosts_entry: null, ssh_host_key_fingerprint: null, auto_apply_on_webhook: false, auto_deploy_on_apply: false, last_applied_commit_sha: null, @@ -2511,7 +2669,7 @@ describe('GitSourceService managed-area lifecycle', () => { sync_env: false, env_path: null, auth_type: 'none', - encrypted_token: null, + encrypted_token: null, encrypted_deploy_key: null, ssh_known_hosts_entry: null, ssh_host_key_fingerprint: null, auto_apply_on_webhook: false, auto_deploy_on_apply: false, last_applied_commit_sha: null, @@ -2651,7 +2809,7 @@ describe('GitSourceService managed-area lifecycle', () => { sync_env: false, env_path: null, auth_type: 'none', - encrypted_token: null, + encrypted_token: null, encrypted_deploy_key: null, ssh_known_hosts_entry: null, ssh_host_key_fingerprint: null, auto_apply_on_webhook: false, auto_deploy_on_apply: false, last_applied_commit_sha: null, @@ -2682,7 +2840,7 @@ describe('GitSourceService managed-area lifecycle', () => { sync_env: false, env_path: null, auth_type: 'none', - encrypted_token: null, + encrypted_token: null, encrypted_deploy_key: null, ssh_known_hosts_entry: null, ssh_host_key_fingerprint: null, auto_apply_on_webhook: false, auto_deploy_on_apply: false, last_applied_commit_sha: null, @@ -2715,7 +2873,7 @@ describe('GitSourceService legacy pending apply (migration path)', () => { sync_env: false, env_path: null, auth_type: 'none', - encrypted_token: null, + encrypted_token: null, encrypted_deploy_key: null, ssh_known_hosts_entry: null, ssh_host_key_fingerprint: null, auto_apply_on_webhook: false, auto_deploy_on_apply: false, last_applied_commit_sha: null, @@ -2993,7 +3151,7 @@ describe('GitSourceService classified plan fingerprint', () => { sync_env: false, env_path: null, auth_type: 'none', - encrypted_token: null, + encrypted_token: null, encrypted_deploy_key: null, ssh_known_hosts_entry: null, ssh_host_key_fingerprint: null, auto_apply_on_webhook: false, auto_deploy_on_apply: false, last_applied_commit_sha: null, diff --git a/backend/src/__tests__/git-transport-ssh.integration.test.ts b/backend/src/__tests__/git-transport-ssh.integration.test.ts new file mode 100644 index 00000000..8e0f0ad9 --- /dev/null +++ b/backend/src/__tests__/git-transport-ssh.integration.test.ts @@ -0,0 +1,348 @@ +/** + * End-to-end SSH deploy-key transport with strict known_hosts verification. + * + * Spins up a local openssh-server with a forced `git-upload-pack` command and + * drives the real `nativeGitTransport` through GIT_SSH_COMMAND (no mocks). + */ +import { spawn, spawnSync } from 'child_process'; +import { promises as fs, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'fs'; +import net from 'net'; +import os from 'os'; +import path from 'path'; +import { afterAll, afterEach, beforeAll, describe, expect, it } from 'vitest'; +import { classifyGitFailure, isTransportFailure } from '../services/git/errors'; +import { nativeGitTransport } from '../services/git/nativeGitTransport'; +import { scanHostKeys } from '../services/git/sshTrust'; + +function gitAvailable(): boolean { + return spawnSync('git', ['--version'], { stdio: 'ignore' }).status === 0; +} + +function sshdAvailable(): boolean { + return spawnSync('/usr/sbin/sshd', ['-V'], { stdio: 'ignore' }).status === 0; +} + +const FILE_CONTENT = 'hello from the ssh fixture repo\n'; + +function runGit(cwd: string, args: string[]): string { + const r = spawnSync('git', args, { cwd, encoding: 'utf8' }); + if (r.status !== 0) throw new Error(`git ${args.join(' ')} failed: ${r.stderr}`); + return r.stdout.trim(); +} + +function generateKeyPair(dir: string, name: string): { privatePath: string; publicPath: string; privatePem: string; publicLine: string } { + const privatePath = path.join(dir, name); + const publicPath = `${privatePath}.pub`; + const gen = spawnSync('ssh-keygen', ['-t', 'ed25519', '-N', '', '-f', privatePath, '-q'], { encoding: 'utf8' }); + if (gen.status !== 0) throw new Error(`ssh-keygen failed: ${gen.stderr}`); + const privatePem = readFileSync(privatePath, 'utf8'); + const publicLine = readFileSync(publicPath, 'utf8').trim(); + return { privatePath, publicPath, privatePem, publicLine }; +} + +function buildBareRepo(): { bareDir: string; mainSha: string; scratchDirs: string[] } { + const srcDir = mkdtempSync(path.join(os.tmpdir(), 'sencho-ssh-src-')); + writeFileSync(path.join(srcDir, 'hello.txt'), FILE_CONTENT); + runGit(srcDir, ['init', '-b', 'main']); + runGit(srcDir, ['config', 'user.email', 'integration-test@sencho.test']); + runGit(srcDir, ['config', 'user.name', 'Sencho SSH Integration Test']); + runGit(srcDir, ['add', '-A']); + runGit(srcDir, ['-c', 'commit.gpgsign=false', 'commit', '-m', 'fixture']); + const mainSha = runGit(srcDir, ['rev-parse', 'HEAD']); + + const bareRoot = mkdtempSync(path.join(os.tmpdir(), 'sencho-ssh-bare-')); + const bareDir = path.join(bareRoot, 'repo.git'); + const clone = spawnSync('git', ['clone', '--bare', '--quiet', srcDir, bareDir], { encoding: 'utf8' }); + if (clone.status !== 0) throw new Error(`git clone --bare failed: ${clone.stderr}`); + return { bareDir, mainSha, scratchDirs: [srcDir, bareRoot] }; +} + +async function waitForPort(host: string, port: number, timeoutMs = 10_000): Promise { + const start = Date.now(); + while (Date.now() - start < timeoutMs) { + try { + await new Promise((resolve, reject) => { + const socket = net.connect({ host, port }, () => { + socket.end(); + resolve(); + }); + socket.on('error', reject); + }); + return; + } catch { + await new Promise((r) => setTimeout(r, 50)); + } + } + throw new Error(`port ${port} did not open within ${timeoutMs}ms`); +} + +interface SshGitFixture { + port: number; + bareDir: string; + mainSha: string; + repoUrlScp: string; + repoUrlSsh: string; + deployPrivateKey: string; + knownHostsEntry: string; + wrongPrivateKey: string; + close: () => void; + scratchDirs: string[]; +} + +const DEFAULT_SSH_PORT = 22; + +async function loopbackPortHasListeners(port: number): Promise { + const ss = spawnSync('ss', ['-ltn', `sport = :${port}`], { encoding: 'utf8' }); + if (ss.status === 0) { + const lines = ss.stdout.trim().split(/\r?\n/).slice(1); + if (lines.some((line) => line.includes('LISTEN'))) return true; + } + const lsof = spawnSync('lsof', ['-tiTCP:' + String(port), '-sTCP:LISTEN'], { encoding: 'utf8' }); + return lsof.status === 0 && lsof.stdout.trim().length > 0; +} + +function keyMaterialFromPublicLine(publicLine: string): string | null { + const parts = publicLine.trim().split(/\s+/); + return parts.length >= 2 ? parts[1] : null; +} + +function assertFixtureHostKey(port: number, hostKeyPublicLine: string, scanned: Awaited>): void { + const expectedMaterial = keyMaterialFromPublicLine(hostKeyPublicLine); + if (!expectedMaterial) { + throw new Error('fixture host key is malformed'); + } + const matched = scanned.some((key) => key.line.includes(expectedMaterial)); + if (!matched) { + throw new Error(`Port ${port} is not served by the test sshd fixture; another SSH listener may be bound on loopback.`); + } +} + +async function startSshGitServer(bareDir: string, port: number): Promise> { + const sshRoot = mkdtempSync(path.join(os.tmpdir(), 'sencho-ssh-sshd-')); + const deploy = generateKeyPair(sshRoot, 'deploy'); + const wrong = generateKeyPair(sshRoot, 'wrong'); + const hostKey = generateKeyPair(sshRoot, 'host'); + + const authorizedKeysPath = path.join(sshRoot, 'authorized_keys'); + const forced = `command="git-upload-pack '${bareDir}'",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ${deploy.publicLine}`; + writeFileSync(authorizedKeysPath, `${forced}\n`, { mode: 0o600 }); + + const configPath = path.join(sshRoot, 'sshd_config'); + const pidPath = path.join(sshRoot, 'sshd.pid'); + writeFileSync( + configPath, + [ + `Port ${port}`, + 'ListenAddress 127.0.0.1', + `HostKey ${hostKey.privatePath}`, + `AuthorizedKeysFile ${authorizedKeysPath}`, + `PidFile ${pidPath}`, + 'UsePAM no', + 'PasswordAuthentication no', + 'PubkeyAuthentication yes', + 'X11Forwarding no', + 'StrictModes no', + 'LogLevel ERROR', + ].join('\n'), + { mode: 0o600 }, + ); + + const child = spawn('/usr/sbin/sshd', ['-D', '-f', configPath, '-e'], { + stdio: ['ignore', 'pipe', 'pipe'], + }); + let stderr = ''; + child.stderr?.on('data', (chunk: Buffer) => { stderr += chunk.toString('utf8'); }); + + try { + await waitForPort('127.0.0.1', port); + } catch (e) { + child.kill('SIGKILL'); + try { + rmSync(sshRoot, { recursive: true, force: true }); + } catch { + // best effort + } + throw new Error(`sshd did not come up on port ${port}: ${stderr.trim() || '(no stderr)'}`, { cause: e }); + } + + const scanned = await scanHostKeys('127.0.0.1', port); + assertFixtureHostKey(port, hostKey.publicLine, scanned); + const knownHostsEntry = scanned.map((k) => k.line).join('\n'); + + return { + port, + bareDir, + deployPrivateKey: deploy.privatePem, + knownHostsEntry, + wrongPrivateKey: wrong.privatePem, + close: () => { + child.kill('SIGTERM'); + }, + scratchDirs: [sshRoot], + }; +} + +describe.skipIf(!gitAvailable() || !sshdAvailable())('SSH deploy-key native git transport (real git, real sshd, strict host keys)', () => { + let fixture: SshGitFixture; + const workspaces: string[] = []; + let scratchDirs: string[] = []; + + beforeAll(async () => { + const repo = buildBareRepo(); + scratchDirs = repo.scratchDirs; + const nonstandardPort = 22222; + const sshUser = os.userInfo().username; + const sshd = await startSshGitServer(repo.bareDir, nonstandardPort); + fixture = { + ...sshd, + mainSha: repo.mainSha, + repoUrlScp: `${sshUser}@127.0.0.1:${nonstandardPort}:${repo.bareDir}`, + repoUrlSsh: `ssh://${sshUser}@127.0.0.1:${nonstandardPort}${repo.bareDir}`, + scratchDirs: [...scratchDirs, ...sshd.scratchDirs], + }; + }); + + afterAll(async () => { + fixture?.close?.(); + if (fixture?.scratchDirs) { + await Promise.all(fixture.scratchDirs.map((d) => fs.rm(d, { recursive: true, force: true }))); + } + }); + + afterEach(async () => { + await Promise.all(workspaces.splice(0).map((w) => fs.rm(w, { recursive: true, force: true }))); + }); + + async function makeWorkspace(): Promise { + const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'sencho-ssh-ws-')); + workspaces.push(dir); + return dir; + } + + it('resolves and fetches over SSH with a deploy key and trusted host key', async () => { + const workspaceRoot = await makeWorkspace(); + const sshAuth = { privateKey: fixture.deployPrivateKey, knownHostsEntry: fixture.knownHostsEntry }; + const resolved = await nativeGitTransport.resolveRef({ + repoUrl: fixture.repoUrlSsh, + ref: 'main', + sshAuth, + timeoutMs: 20_000, + workspaceRoot, + }); + expect(resolved.commitSha).toBe(fixture.mainSha); + + const fetchWorkspace = await makeWorkspace(); + const fetched = await nativeGitTransport.fetchAtCommit({ + repoUrl: fixture.repoUrlSsh, + ref: 'main', + sshAuth, + refKind: 'branch', + commitSha: resolved.commitSha, + timeoutMs: 20_000, + workspaceRoot: fetchWorkspace, + maxBytes: 10 * 1024 * 1024, + }); + expect(fetched.commitSha).toBe(fixture.mainSha); + const content = await fs.readFile(path.join(fetched.dir, 'hello.txt'), 'utf8'); + expect(content).toBe(FILE_CONTENT); + }); + + it('resolves over ssh:// with a nonstandard port', async () => { + const workspaceRoot = await makeWorkspace(); + const sshAuth = { privateKey: fixture.deployPrivateKey, knownHostsEntry: fixture.knownHostsEntry }; + const resolved = await nativeGitTransport.resolveRef({ + repoUrl: fixture.repoUrlSsh, + ref: 'main', + sshAuth, + timeoutMs: 20_000, + workspaceRoot, + }); + expect(resolved.commitSha).toBe(fixture.mainSha); + }); + + it('classifies a wrong deploy key as AUTH_FAILED', async () => { + const workspaceRoot = await makeWorkspace(); + const failure = await nativeGitTransport + .resolveRef({ + repoUrl: fixture.repoUrlSsh, + ref: 'main', + sshAuth: { privateKey: fixture.wrongPrivateKey, knownHostsEntry: fixture.knownHostsEntry }, + timeoutMs: 20_000, + workspaceRoot, + }) + .then(() => null, (e: unknown) => e); + + expect(isTransportFailure(failure)).toBe(true); + if (!isTransportFailure(failure)) throw new Error('unreachable'); + expect(classifyGitFailure(failure).code).toBe('AUTH_FAILED'); + }); + + it('classifies a mismatched known_hosts entry as SSH_HOST_KEY_FAILED', async () => { + const workspaceRoot = await makeWorkspace(); + const bogusLine = '|1|abcdef1234567890abcdef1234567890|abcdef1234567890abcdef1234567890 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIInvalidKeyMaterialForTestOnly'; + const failure = await nativeGitTransport + .resolveRef({ + repoUrl: fixture.repoUrlSsh, + ref: 'main', + sshAuth: { privateKey: fixture.deployPrivateKey, knownHostsEntry: bogusLine }, + timeoutMs: 20_000, + workspaceRoot, + }) + .then(() => null, (e: unknown) => e); + + expect(isTransportFailure(failure)).toBe(true); + if (!isTransportFailure(failure)) throw new Error('unreachable'); + expect(classifyGitFailure(failure).code).toBe('SSH_HOST_KEY_FAILED'); + }); +}); + +describe.skipIf(!gitAvailable() || !sshdAvailable())('SSH deploy-key transport on the default SSH port', () => { + let fixture: SshGitFixture; + const workspaces: string[] = []; + + beforeAll(async () => { + if (await loopbackPortHasListeners(DEFAULT_SSH_PORT)) { + throw new Error(`Port ${DEFAULT_SSH_PORT} is already in use; the default-port SSH integration requires loopback port ${DEFAULT_SSH_PORT} to be free.`); + } + const repo = buildBareRepo(); + const sshUser = os.userInfo().username; + const sshd = await startSshGitServer(repo.bareDir, DEFAULT_SSH_PORT); + fixture = { + ...sshd, + mainSha: repo.mainSha, + repoUrlScp: `${sshUser}@127.0.0.1:${repo.bareDir}`, + repoUrlSsh: `ssh://${sshUser}@127.0.0.1${repo.bareDir}`, + scratchDirs: [...repo.scratchDirs, ...sshd.scratchDirs], + }; + }); + + afterAll(async () => { + fixture?.close?.(); + if (fixture?.scratchDirs) { + await Promise.all(fixture.scratchDirs.map((d) => fs.rm(d, { recursive: true, force: true }))); + } + }); + + afterEach(async () => { + await Promise.all(workspaces.splice(0).map((w) => fs.rm(w, { recursive: true, force: true }))); + }); + + async function makeWorkspace(): Promise { + const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'sencho-ssh-ws-')); + workspaces.push(dir); + return dir; + } + + it('resolves over scp-style URL on the default SSH port', async () => { + const workspaceRoot = await makeWorkspace(); + const sshAuth = { privateKey: fixture.deployPrivateKey, knownHostsEntry: fixture.knownHostsEntry }; + const resolved = await nativeGitTransport.resolveRef({ + repoUrl: fixture.repoUrlScp, + ref: 'main', + sshAuth, + timeoutMs: 20_000, + workspaceRoot, + }); + expect(resolved.commitSha).toBe(fixture.mainSha); + }); +}); diff --git a/backend/src/__tests__/gitops-create-recovery.test.ts b/backend/src/__tests__/gitops-create-recovery.test.ts index 88f7c902..07199d4e 100644 --- a/backend/src/__tests__/gitops-create-recovery.test.ts +++ b/backend/src/__tests__/gitops-create-recovery.test.ts @@ -13,8 +13,9 @@ import { setupTestDb, cleanupTestDb } from './helpers/setupTestDb'; import { DatabaseService } from '../services/DatabaseService'; import { GitOpsStore } from '../services/gitops/store'; import { GitOpsTransitions, type EventEnvelope } from '../services/gitops/transitions'; -import { assertCreatesSettled, resolveInterruptedCreates } from '../services/gitops/createRecovery'; +import { CryptoService } from '../services/CryptoService'; import { candidateRelPathForSha, CREATE_STAGING_MARKER_FILENAME } from '../services/gitops/createStagingMarker'; +import { assertCreatesSettled, resolveInterruptedCreates } from '../services/gitops/createRecovery'; import { stackManagedRoot } from '../services/gitops/directApplication'; import type { GitOpsApplicationRow, @@ -123,6 +124,33 @@ describe('gitops interrupted create recovery', () => { expect(store.getCreateCheckpoint('app-finish')).toBeUndefined(); }); + it('restores deploy-key credentials when finishing a manifest_committed create', async () => { + const store = GitOpsStore.getInstance(); + const db = DatabaseService.getInstance(); + const deployKey = '-----BEGIN OPENSSH PRIVATE KEY-----\ntest-key\n-----END OPENSSH PRIVATE KEY-----\n'; + const knownHosts = '127.0.0.1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGitRecoveryDeployKeyTestOnly'; + const fingerprint = 'SHA256:gitops-recovery-deploy-key-test'; + const encryptedDeployKey = CryptoService.getInstance().encrypt(deployKey); + seedCreate('app-ssh-finish', 'ssh-finish-web', 'manifest_committed', { + authType: 'deploy_key', + encryptedDeployKey, + sshKnownHostsEntry: knownHosts, + sshHostKeyFingerprint: fingerprint, + }); + fs.mkdirSync(path.join(process.env.COMPOSE_DIR!, 'ssh-finish-web'), { recursive: true }); + + const settled = await resolveInterruptedCreates(); + + expect(settled[0].outcome).toBe('completed'); + const source = db.getGitSource('ssh-finish-web'); + expect(source?.auth_type).toBe('deploy_key'); + expect(source?.encrypted_deploy_key).toBe(encryptedDeployKey); + expect(CryptoService.getInstance().decrypt(source!.encrypted_deploy_key!)).toBe(deployKey); + expect(source?.ssh_known_hosts_entry).toBe(knownHosts); + expect(source?.ssh_host_key_fingerprint).toBe(fingerprint); + expect(store.getCreateCheckpoint('app-ssh-finish')).toBeUndefined(); + }); + it('clears the checkpoint of a create that already reached its boundary', async () => { const store = GitOpsStore.getInstance(); seedCreate('app-done', 'done-web', 'pointers_committed'); @@ -153,6 +181,9 @@ describe('gitops interrupted create recovery', () => { env_path: null, auth_type: 'none', encrypted_token: null, + encrypted_deploy_key: null, + ssh_known_hosts_entry: null, + ssh_host_key_fingerprint: null, auto_apply_on_webhook: false, auto_deploy_on_apply: false, last_applied_commit_sha: SHA, @@ -315,7 +346,13 @@ function seedCreate( applicationId: string, stackName: string, phase: GitOpsCreateCheckpointRow['phase'], - options: { createdManagedRoot?: number } = {}, + options: { + createdManagedRoot?: number; + authType?: string; + encryptedDeployKey?: string | null; + sshKnownHostsEntry?: string | null; + sshHostKeyFingerprint?: string | null; + } = {}, ): void { const store = GitOpsStore.getInstance(); const generationId = `gen-${applicationId}`; @@ -337,8 +374,11 @@ function seedCreate( context_dir: null, sync_env: 0, env_path: null, - auth_type: 'none', + auth_type: options.authType ?? 'none', encrypted_token: null, + encrypted_deploy_key: options.encryptedDeployKey ?? null, + ssh_known_hosts_entry: options.sshKnownHostsEntry ?? null, + ssh_host_key_fingerprint: options.sshHostKeyFingerprint ?? null, auto_apply_on_webhook: 0, auto_deploy_on_apply: 0, commit_sha: SHA, diff --git a/backend/src/__tests__/gitops-create.test.ts b/backend/src/__tests__/gitops-create.test.ts index 9c405f36..9214f212 100644 --- a/backend/src/__tests__/gitops-create.test.ts +++ b/backend/src/__tests__/gitops-create.test.ts @@ -652,6 +652,9 @@ function checkpoint(applicationId: string, stackName: string): GitOpsCreateCheck env_path: null, auth_type: 'none', encrypted_token: null, + encrypted_deploy_key: null, + ssh_known_hosts_entry: null, + ssh_host_key_fingerprint: null, auto_apply_on_webhook: 0, auto_deploy_on_apply: 0, commit_sha: SHA, diff --git a/backend/src/__tests__/gitops-direct-producers.test.ts b/backend/src/__tests__/gitops-direct-producers.test.ts index efb11120..13b3191a 100644 --- a/backend/src/__tests__/gitops-direct-producers.test.ts +++ b/backend/src/__tests__/gitops-direct-producers.test.ts @@ -666,7 +666,7 @@ describe('Direct Git producers drive the revision state', () => { sync_env: false, env_path: null, auth_type: 'none', - encrypted_token: null, + encrypted_token: null, encrypted_deploy_key: null, ssh_known_hosts_entry: null, ssh_host_key_fingerprint: null, auto_apply_on_webhook: false, auto_deploy_on_apply: false, last_applied_commit_sha: 'eeeeeee5', diff --git a/backend/src/__tests__/gitops-managed-sweep.test.ts b/backend/src/__tests__/gitops-managed-sweep.test.ts index 51807103..93b839d9 100644 --- a/backend/src/__tests__/gitops-managed-sweep.test.ts +++ b/backend/src/__tests__/gitops-managed-sweep.test.ts @@ -112,6 +112,9 @@ function checkpoint(applicationId: string, stackName: string): GitOpsCreateCheck env_path: null, auth_type: 'none', encrypted_token: null, + encrypted_deploy_key: null, + ssh_known_hosts_entry: null, + ssh_host_key_fingerprint: null, auto_apply_on_webhook: 0, auto_deploy_on_apply: 0, commit_sha: SHA, diff --git a/backend/src/__tests__/gitops-migrate.test.ts b/backend/src/__tests__/gitops-migrate.test.ts index 6505a105..212bea3d 100644 --- a/backend/src/__tests__/gitops-migrate.test.ts +++ b/backend/src/__tests__/gitops-migrate.test.ts @@ -357,7 +357,7 @@ function seedStack( sync_env: false, env_path: null, auth_type: 'none', - encrypted_token: null, + encrypted_token: null, encrypted_deploy_key: null, ssh_known_hosts_entry: null, ssh_host_key_fingerprint: null, auto_apply_on_webhook: false, auto_deploy_on_apply: false, last_applied_commit_sha: options.lastApplied, diff --git a/backend/src/__tests__/proxy-scoped-alerts-autoheal-evidence.test.ts b/backend/src/__tests__/proxy-scoped-alerts-autoheal-evidence.test.ts index 717a41c4..68564fb4 100644 --- a/backend/src/__tests__/proxy-scoped-alerts-autoheal-evidence.test.ts +++ b/backend/src/__tests__/proxy-scoped-alerts-autoheal-evidence.test.ts @@ -369,6 +369,41 @@ describe('remote proxy node-wide image refresh elevation gate', () => { }); }); +describe('remote proxy ssh-host-key scoped-evidence gate', () => { + it('forwards scoped stack:edit evidence for scoped deployer on POST /git-sources/ssh-host-key', async () => { + grantScopedStackEdit(deployerId, grantedNodeId, 'web'); + + const res = await request(app) + .post('/api/git-sources/ssh-host-key') + .set('Authorization', `Bearer ${deployerBearer}`) + .set('x-node-id', String(grantedNodeId)) + .send({ repo_url: 'git@github.com:example/repo.git', stack_name: 'web' }); + + expect(res.status).toBe(200); + const hop = grantedHops.find((h) => h.url?.includes('/api/git-sources/ssh-host-key')); + expect(hop).toBeDefined(); + expect(hop!.stackNameHeader).toBe('web'); + expect(hop!.stackActionsHeader).toContain('stack:edit'); + + clearAssignments(deployerId); + }); + + it('denies scoped deployer probing host keys for an unrelated stack', async () => { + grantScopedStackEdit(deployerId, grantedNodeId, 'web'); + + const res = await request(app) + .post('/api/git-sources/ssh-host-key') + .set('Authorization', `Bearer ${deployerBearer}`) + .set('x-node-id', String(grantedNodeId)) + .send({ repo_url: 'git@github.com:example/repo.git', stack_name: 'other-stack' }); + + expect(res.status).toBe(403); + expect(res.body.code).toBe('PERMISSION_DENIED'); + + clearAssignments(deployerId); + }); +}); + describe('classifyStackApiPath per-stack image refresh', () => { it('classifies POST /image-updates/refresh/web as named-stack with stack:deploy', () => { const result = classifyStackApiPath('POST', '/image-updates/refresh/web'); diff --git a/backend/src/__tests__/recovery-captured-invocation.test.ts b/backend/src/__tests__/recovery-captured-invocation.test.ts index b62d86a6..d6f2f10f 100644 --- a/backend/src/__tests__/recovery-captured-invocation.test.ts +++ b/backend/src/__tests__/recovery-captured-invocation.test.ts @@ -47,7 +47,7 @@ describe('captured invocation on recovery Compose args', () => { sync_env: false, env_path: null, auth_type: 'none', - encrypted_token: null, + encrypted_token: null, encrypted_deploy_key: null, ssh_known_hosts_entry: null, ssh_host_key_fingerprint: null, auto_apply_on_webhook: false, auto_deploy_on_apply: false, last_applied_commit_sha: 'abc', diff --git a/backend/src/__tests__/ssh-trust.test.ts b/backend/src/__tests__/ssh-trust.test.ts new file mode 100644 index 00000000..593051d4 --- /dev/null +++ b/backend/src/__tests__/ssh-trust.test.ts @@ -0,0 +1,104 @@ +import { createHash } from 'crypto'; +import { describe, expect, it } from 'vitest'; +import { + buildSshCommand, + canonicalizeDeployKeyPem, + canonicalizeKnownHostsEntry, + fingerprintFromKnownHostsLine, + parseRepoTransportUrl, + parseSshScpUrl, + parseSshUrl, +} from '../services/git/sshTrust'; +import { classifyGitFailure } from '../services/git/errors'; + +describe('sshTrust URL parsing', () => { + it('parses scp-style URLs', () => { + const parsed = parseSshScpUrl('git@github.com:org/repo.git'); + expect(parsed?.host).toBe('github.com'); + expect(parsed?.port).toBe(22); + expect(parsed?.href).toBe('git@github.com:org/repo.git'); + }); + + it('parses scp-style URLs with nonstandard port via ssh://', () => { + const parsed = parseSshUrl('ssh://git@git.example.com:2222/org/repo.git'); + expect(parsed?.port).toBe(2222); + expect(parsed?.href).toBe('ssh://git@git.example.com:2222/org/repo.git'); + }); + + it('parses ssh:// URLs', () => { + const parsed = parseSshUrl('ssh://git@host.example:2222/org/repo.git'); + expect(parsed?.host).toBe('host.example'); + expect(parsed?.port).toBe(2222); + }); + + it('classifies transport kind from mixed inputs', () => { + expect(parseRepoTransportUrl('https://github.com/org/repo.git')?.kind).toBe('https'); + expect(parseRepoTransportUrl('git@host:org/repo.git')?.kind).toBe('ssh'); + }); +}); + +describe('ssh host key fingerprint', () => { + it('computes SHA256 fingerprint from the key material, not the key type', () => { + const keyBase64 = 'AAAAC3NzaC1lZDI1NTE5AAAAIGb3JzL3Rlc3Q='; + const line = `|1|abc|abc ssh-ed25519 ${keyBase64}`; + const fp = fingerprintFromKnownHostsLine(line); + const expected = `SHA256:${createHash('sha256').update(Buffer.from(keyBase64, 'base64')).digest('base64').replace(/=+$/, '')}`; + expect(fp).toBe(expected); + }); +}); + +describe('ssh credential canonicalization', () => { + it('rebuilds known_hosts lines from parsed key material only', () => { + const keyBase64 = 'AAAAC3NzaC1lZDI1NTE5AAAAIGb3JzL3Rlc3Q='; + const raw = `git.example.com ssh-ed25519 ${keyBase64} trailing-garbage`; + const canonical = canonicalizeKnownHostsEntry(raw); + expect(canonical).toBe(`git.example.com ssh-ed25519 ${keyBase64}\n`); + expect(canonical).not.toContain('trailing-garbage'); + }); + + it('rejects invalid known_hosts lines', () => { + expect(() => canonicalizeKnownHostsEntry('not-a-host-key')).toThrow(/invalid|empty/i); + }); + + it('rebuilds deploy key PEM from validated envelope and body', () => { + const pem = '-----BEGIN OPENSSH PRIVATE KEY-----\nYWJj\n-----END OPENSSH PRIVATE KEY-----\n'; + expect(canonicalizeDeployKeyPem(pem)).toBe(pem); + }); + + it('rejects malformed deploy keys', () => { + expect(() => canonicalizeDeployKeyPem('not a pem')).toThrow(/invalid/i); + }); +}); + +describe('ssh command builder', () => { + it('enforces strict host key checking', () => { + const cmd = buildSshCommand('/tmp/key', '/tmp/known_hosts'); + expect(cmd).toContain('StrictHostKeyChecking=yes'); + expect(cmd).toContain('UserKnownHostsFile=/tmp/known_hosts'); + expect(cmd).toContain('IdentitiesOnly=yes'); + }); +}); + +describe('SSH stderr classification', () => { + it('maps host key verification failure to SSH_HOST_KEY_FAILED', () => { + const result = classifyGitFailure({ + transportFailure: true, + reason: 'exit', + host: 'git.example.com', + hasToken: true, + stderr: 'Host key verification failed.', + }); + expect(result.code).toBe('SSH_HOST_KEY_FAILED'); + }); + + it('maps publickey denial with credential to AUTH_FAILED', () => { + const result = classifyGitFailure({ + transportFailure: true, + reason: 'exit', + host: 'git.example.com', + hasToken: true, + stderr: 'git@git.example.com: Permission denied (publickey).', + }); + expect(result.code).toBe('AUTH_FAILED'); + }); +}); diff --git a/backend/src/__tests__/webhooks-git-source.test.ts b/backend/src/__tests__/webhooks-git-source.test.ts index bede3302..d000dc82 100644 --- a/backend/src/__tests__/webhooks-git-source.test.ts +++ b/backend/src/__tests__/webhooks-git-source.test.ts @@ -24,7 +24,7 @@ function seedGitSource(stackName: string): void { sync_env: false, env_path: null, auth_type: 'none', - encrypted_token: null, + encrypted_token: null, encrypted_deploy_key: null, ssh_known_hosts_entry: null, ssh_host_key_fingerprint: null, auto_apply_on_webhook: false, auto_deploy_on_apply: false, last_applied_commit_sha: null, diff --git a/backend/src/helpers/auditActor.ts b/backend/src/helpers/auditActor.ts new file mode 100644 index 00000000..5691ff96 --- /dev/null +++ b/backend/src/helpers/auditActor.ts @@ -0,0 +1,10 @@ +import type { Request } from 'express'; + +/** Prefer trusted proxy provenance over the machine identity username. */ +export function auditActorUsername(req: Pick): string { + const actor = req.deployContext?.actor; + if (typeof actor === 'string' && actor.trim().length > 0) { + return actor.trim(); + } + return req.user?.username ?? 'unknown'; +} diff --git a/backend/src/proxy/remoteNodeProxy.ts b/backend/src/proxy/remoteNodeProxy.ts index 4f14cfba..9890fcf7 100644 --- a/backend/src/proxy/remoteNodeProxy.ts +++ b/backend/src/proxy/remoteNodeProxy.ts @@ -597,10 +597,7 @@ export function createRemoteProxyMiddleware(): RequestHandler { // the stack_name field from the buffered JSON. Non-stack-scoped creates // (no stack_name in body) pass through without evidence. if (isAlertCreateRoute(req) && req.user?.role !== 'admin' && req.user?.role !== 'node-admin') { - const globalGrantsEdit = - req.user?.role != null - && (ROLE_PERMISSIONS[req.user.role]?.includes('stack:edit') ?? false); - if (!globalGrantsEdit) { + if (!userHasGlobalStackEdit(req)) { const stackName = req.rawBody ? parseBodyStackName(req.rawBody) : null; if (stackName === undefined) { // Body is non-empty but not valid JSON; client error, not auth. @@ -609,21 +606,12 @@ export function createRemoteProxyMiddleware(): RequestHandler { return; } if (stackName) { - const evidenceSupported = await remoteAdvertisesCapability( - req.nodeId, - SCOPED_STACK_AUTH_EVIDENCE_CAPABILITY, - ); - if (!evidenceSupported) { - res.status(403).json({ - error: `Remote node "${node.name}" does not support scoped stack authorization. Upgrade it before scoped users can act on it.`, - }); - return; - } + if (!await remoteSupportsScopedStackEdit(req, res, node)) return; if (!checkPermission(req, 'stack:edit', 'stack', stackName)) { res.status(403).json({ error: 'Permission denied.', code: 'PERMISSION_DENIED' }); return; } - req.proxyScopedStackEvidence = { stackName, actions: ['stack:edit'] }; + attachScopedStackEditEvidence(req, stackName); } } } @@ -632,61 +620,66 @@ export function createRemoteProxyMiddleware(): RequestHandler { // auto-heal has no pre-existing body buffering, so this gate handles // its own encoding rejection and buffering. if (isAutoHealCreateRoute(req) && req.user?.role !== 'admin' && req.user?.role !== 'node-admin') { - const globalGrantsEdit = - req.user?.role != null - && (ROLE_PERMISSIONS[req.user.role]?.includes('stack:edit') ?? false); - if (!globalGrantsEdit) { - if (hasNonIdentityContentEncoding(req)) { - await drainRequestBody(req); - console.error('[remoteNodeProxy] auto-heal body rejected: compressed encoding'); - res.status(415).json({ - error: 'Compressed request bodies are not supported for remote auto-heal creates', - code: 'encoding_unsupported', - }); - return; - } - try { - req.rawBody = await bufferRequestBody(req, AUTO_HEAL_PROXY_BODY_LIMIT); - } catch (err) { - const status = Number((err as { status?: number }).status); - if (status === 413) { - console.error('[remoteNodeProxy] auto-heal body rejected as too large:', err); - res.status(413).json({ error: 'Auto-heal payload too large', code: 'entity_too_large' }); - return; - } - if (status === 400) { - console.error('[remoteNodeProxy] auto-heal body incomplete:', err); - res.status(400).json({ error: 'Incomplete request body' }); - return; - } - throw err; - } - const stackName = parseBodyStackName(req.rawBody); + if (!userHasGlobalStackEdit(req)) { + const rawBody = await bufferProxyJsonBody(req, res, PROXY_JSON_BODY_LIMIT, { + logPrefix: '[remoteNodeProxy] auto-heal', + encodingError: 'Compressed request bodies are not supported for remote auto-heal creates', + tooLargeError: 'Auto-heal payload too large', + }); + if (!rawBody) return; + req.rawBody = rawBody; + const stackName = parseBodyStackName(rawBody); if (stackName === undefined) { console.error('[remoteNodeProxy] auto-heal body is not valid JSON'); res.status(400).json({ error: 'Request body is not valid JSON' }); return; } if (stackName) { - const evidenceSupported = await remoteAdvertisesCapability( - req.nodeId, - SCOPED_STACK_AUTH_EVIDENCE_CAPABILITY, - ); - if (!evidenceSupported) { - res.status(403).json({ - error: `Remote node "${node.name}" does not support scoped stack authorization. Upgrade it before scoped users can act on it.`, - }); - return; - } + if (!await remoteSupportsScopedStackEdit(req, res, node)) return; if (!checkPermission(req, 'stack:edit', 'stack', stackName)) { res.status(403).json({ error: 'Permission denied.', code: 'PERMISSION_DENIED' }); return; } - req.proxyScopedStackEvidence = { stackName, actions: ['stack:edit'] }; + attachScopedStackEditEvidence(req, stackName); } } } + // POST /git-sources/ssh-host-key scoped-evidence gate: stack_name lives in + // the JSON body, so classifyStackApiPath cannot authorize the edit flow. + if (isSshHostKeyProbeRoute(req)) { + const rawBody = await bufferProxyJsonBody(req, res, PROXY_JSON_BODY_LIMIT, { + logPrefix: '[remoteNodeProxy] ssh-host-key', + encodingError: 'Compressed request bodies are not supported for remote SSH host key probes', + tooLargeError: 'SSH host key probe payload too large', + }); + if (!rawBody) return; + req.rawBody = rawBody; + const stackName = parseBodyStackName(rawBody); + if (stackName === undefined) { + console.error('[remoteNodeProxy] ssh-host-key body is not valid JSON'); + res.status(400).json({ error: 'Request body is not valid JSON' }); + return; + } + if (stackName) { + if (!checkPermission(req, 'stack:edit', 'stack', stackName)) { + res.status(403).json({ error: 'Permission denied.', code: 'PERMISSION_DENIED' }); + return; + } + if ( + req.user?.role !== 'admin' + && req.user?.role !== 'node-admin' + && !userHasGlobalStackEdit(req) + ) { + if (!await remoteSupportsScopedStackEdit(req, res, node)) return; + attachScopedStackEditEvidence(req, stackName); + } + } else if (!checkPermission(req, 'stack:create')) { + res.status(403).json({ error: 'Permission denied.', code: 'PERMISSION_DENIED' }); + return; + } + } + // Node-wide image refresh elevation gate: when a non-admin, non-node-admin // user triggers a manual refresh on a remote node, check the hub-side // scoped node:manage grant and elevate PROXY_ROLE_HEADER so the remote @@ -812,17 +805,22 @@ function isAlertCreateRoute(req: Request): boolean { return req.method === 'POST' && /^\/alerts\/?$/.test(req.path); } -/** Same default as express.json(); remote alert creates must not exceed it. */ -const ALERT_PROXY_BODY_LIMIT = 100 * 1024; +/** Max request body size for buffered JSON proxy gates (same as express.json()). */ +const PROXY_JSON_BODY_LIMIT = 100 * 1024; -/** Same limit for auto-heal policy creates. */ -const AUTO_HEAL_PROXY_BODY_LIMIT = 100 * 1024; +/** Same default as express.json(); remote alert creates must not exceed it. */ +const ALERT_PROXY_BODY_LIMIT = PROXY_JSON_BODY_LIMIT; /** POST /auto-heal/policies (path is post-/api strip). */ function isAutoHealCreateRoute(req: Request): boolean { return req.method === 'POST' && /^\/auto-heal\/policies\/?$/.test(req.path); } +/** POST /git-sources/ssh-host-key (path is post-/api strip). */ +function isSshHostKeyProbeRoute(req: Request): boolean { + return req.method === 'POST' && /^\/git-sources\/ssh-host-key\/?$/.test(req.path); +} + /** POST /image-updates/refresh with no stack-name segment (node-wide, not per-stack). */ function isImageRefreshNodeWide(req: Request): boolean { return req.method === 'POST' && /^\/image-updates\/refresh\/?$/.test(req.path); @@ -849,6 +847,62 @@ function parseBodyStackName(rawBody: Buffer): string | null | undefined { /** Max time to wait for leftover body bytes after a size/encoding reject. */ const DRAIN_TIMEOUT_MS = 5_000; +function userHasGlobalStackEdit(req: Request): boolean { + return req.user?.role != null + && (ROLE_PERMISSIONS[req.user.role]?.includes('stack:edit') ?? false); +} + +async function remoteSupportsScopedStackEdit( + req: Request, + res: Response, + node: { name: string }, +): Promise { + const evidenceSupported = await remoteAdvertisesCapability( + req.nodeId, + SCOPED_STACK_AUTH_EVIDENCE_CAPABILITY, + ); + if (!evidenceSupported) { + res.status(403).json({ + error: `Remote node "${node.name}" does not support scoped stack authorization. Upgrade it before scoped users can act on it.`, + }); + return false; + } + return true; +} + +function attachScopedStackEditEvidence(req: Request, stackName: string): void { + req.proxyScopedStackEvidence = { stackName, actions: ['stack:edit'] }; +} + +async function bufferProxyJsonBody( + req: Request, + res: Response, + limit: number, + labels: { logPrefix: string; encodingError: string; tooLargeError: string }, +): Promise { + if (hasNonIdentityContentEncoding(req)) { + await drainRequestBody(req); + res.status(415).json({ error: labels.encodingError, code: 'encoding_unsupported' }); + return null; + } + try { + return await bufferRequestBody(req, limit); + } catch (err) { + const status = Number((err as { status?: number }).status); + if (status === 413) { + console.error(`${labels.logPrefix} body rejected as too large:`, err); + res.status(413).json({ error: labels.tooLargeError, code: 'entity_too_large' }); + return null; + } + if (status === 400) { + console.error(`${labels.logPrefix} body incomplete:`, err); + res.status(400).json({ error: 'Incomplete request body' }); + return null; + } + throw err; + } +} + /** Error with HTTP status for the alert-body gate catch mapper. */ function alertBodyError(message: string, status: number): Error { return Object.assign(new Error(message), { status, expose: true }); diff --git a/backend/src/routes/gitSources.ts b/backend/src/routes/gitSources.ts index 852039a7..5d83dba1 100644 --- a/backend/src/routes/gitSources.ts +++ b/backend/src/routes/gitSources.ts @@ -17,6 +17,7 @@ import { sendGitSourceError, webhookPullStatus } from '../utils/gitSourceHttp'; import { sanitizeForLog } from '../utils/safeLog'; import { repoUrlRejectionMessage } from '../services/gitops/repoIdentity'; import { REF_MAX_LEN } from '../services/git/nativeGitTransport'; +import { auditActorUsername } from '../helpers/auditActor'; // Reasonable upper bounds so a caller cannot flood the service with huge // payloads. Generous compared to anything a real Git provider emits. @@ -32,8 +33,16 @@ const MAX_TOKEN_LENGTH = 8192; * is reused when the request omits a token, so the edit-mode flow does not force * re-entering a stored PAT. */ -async function handleBrowse(req: Request, res: Response, storedToken: string | null): Promise { - const { repo_url, branch, auth_type, token } = req.body ?? {}; +const MAX_DEPLOY_KEY_LENGTH = 16384; + +async function handleBrowse( + req: Request, + res: Response, + storedToken: string | null, + storedDeployKey: string | null, + storedKnownHosts: string | null, +): Promise { + const { repo_url, branch, auth_type, token, deploy_key, ssh_known_hosts_entry } = req.body ?? {}; if (typeof repo_url !== 'string' || !repo_url.trim()) { res.status(400).json({ error: 'repo_url is required' }); return; @@ -51,22 +60,43 @@ async function handleBrowse(req: Request, res: Response, storedToken: string | n res.status(400).json({ error: 'The branch, tag, or commit SHA is too long.' }); return; } - if (auth_type !== undefined && auth_type !== 'none' && auth_type !== 'token') { - res.status(400).json({ error: 'auth_type must be "none" or "token"' }); + if (auth_type !== undefined && auth_type !== 'none' && auth_type !== 'token' && auth_type !== 'deploy_key') { + res.status(400).json({ error: 'auth_type must be "none", "token", or "deploy_key"' }); return; } if (typeof token === 'string' && token.length > MAX_TOKEN_LENGTH) { res.status(400).json({ error: 'token is too long' }); return; } + if (typeof deploy_key === 'string' && deploy_key.length > MAX_DEPLOY_KEY_LENGTH) { + res.status(400).json({ error: 'deploy_key is too long' }); + return; + } const explicitToken = typeof token === 'string' && token.trim() ? token : null; - const effectiveToken = auth_type === 'none' ? null : (explicitToken ?? storedToken); + const effectiveToken = auth_type === 'token' ? (explicitToken ?? storedToken) : null; + const explicitDeployKey = typeof deploy_key === 'string' && deploy_key.trim() ? deploy_key : null; + const effectiveDeployKey = auth_type === 'deploy_key' ? (explicitDeployKey ?? storedDeployKey) : null; + const effectiveKnownHosts = auth_type === 'deploy_key' + ? (typeof ssh_known_hosts_entry === 'string' && ssh_known_hosts_entry.trim() + ? ssh_known_hosts_entry.trim() + : storedKnownHosts) + : null; + const listParams: { + repoUrl: string; + branch: string; + token?: string | null; + sshAuth?: { privateKey: string; knownHostsEntry: string }; + } = { + repoUrl: repo_url.trim(), + branch: branch.trim(), + }; + if (auth_type === 'token') { + listParams.token = effectiveToken; + } else if (auth_type === 'deploy_key' && effectiveDeployKey && effectiveKnownHosts) { + listParams.sshAuth = { privateKey: effectiveDeployKey, knownHostsEntry: effectiveKnownHosts }; + } try { - const result = await GitSourceService.getInstance().listRepoTree({ - repoUrl: repo_url.trim(), - branch: branch.trim(), - token: effectiveToken, - }); + const result = await GitSourceService.getInstance().listRepoTree(listParams); res.json(result); } catch (error) { sendGitSourceError(res, error); @@ -76,6 +106,44 @@ async function handleBrowse(req: Request, res: Response, storedToken: string | n /** Router for listing git-source configuration: `GET /api/git-sources`. */ export const gitSourcesRouter = Router(); +gitSourcesRouter.post('/ssh-host-key', async (req: Request, res: Response): Promise => { + const { repo_url, stack_name } = req.body ?? {}; + if (typeof stack_name === 'string' && stack_name.trim()) { + if (!isValidStackName(stack_name.trim())) { + res.status(400).json({ error: 'Invalid stack name' }); + return; + } + if (!requirePermission(req, res, 'stack:edit', 'stack', stack_name.trim())) return; + } else if (!requirePermission(req, res, 'stack:create')) { + return; + } + if (typeof repo_url !== 'string' || !repo_url.trim()) { + res.status(400).json({ error: 'repo_url is required' }); + return; + } + const repoUrlError = repoUrlRejectionMessage(repo_url); + if (repoUrlError) { + res.status(400).json({ error: repoUrlError }); + return; + } + try { + const { parseSshUrl, scanHostKeys } = await import('../services/git/sshTrust'); + const parsed = parseSshUrl(repo_url.trim()); + if (!parsed) { + res.status(400).json({ error: 'Host key probe requires an SSH repository URL' }); + return; + } + const keys = await scanHostKeys(parsed.host, parsed.port); + res.json({ + host: parsed.host, + port: parsed.port, + keys, + }); + } catch (error) { + sendGitSourceError(res, error); + } +}); + gitSourcesRouter.get('/', async (req: Request, res: Response): Promise => { try { const all = GitSourceService.getInstance().list(); @@ -126,7 +194,7 @@ gitSourcesRouter.get('/history', async (req: Request, res: Response): Promise => { if (!requirePermission(req, res, 'stack:create')) return; - await handleBrowse(req, res, null); + await handleBrowse(req, res, null, null, null); }); /** @@ -220,6 +288,9 @@ stackGitSourceRouter.put('/:stackName/git-source', async (req: Request, res: Res env_path, auth_type, token, + deploy_key, + ssh_known_hosts_entry, + ssh_host_key_fingerprint, auto_apply_on_webhook, auto_deploy_on_apply, } = req.body ?? {}; @@ -237,8 +308,8 @@ stackGitSourceRouter.put('/:stackName/git-source', async (req: Request, res: Res res.status(400).json({ error: selection.error }); return; } - if (auth_type !== 'none' && auth_type !== 'token') { - res.status(400).json({ error: 'auth_type must be "none" or "token"' }); + if (auth_type !== 'none' && auth_type !== 'token' && auth_type !== 'deploy_key') { + res.status(400).json({ error: 'auth_type must be "none", "token", or "deploy_key"' }); return; } if (auto_apply_on_webhook !== undefined && typeof auto_apply_on_webhook !== 'boolean') { @@ -270,6 +341,10 @@ stackGitSourceRouter.put('/:stackName/git-source', async (req: Request, res: Res res.status(400).json({ error: 'token is too long' }); return; } + if (typeof deploy_key === 'string' && deploy_key.length > MAX_DEPLOY_KEY_LENGTH) { + res.status(400).json({ error: 'deploy_key is too long' }); + return; + } const autoApplyOnWebhook = auto_apply_on_webhook === true; const autoDeployOnApply = auto_deploy_on_apply === true; if (autoDeployOnApply && !requirePermission(req, res, 'stack:deploy', 'stack', stackName)) return; @@ -298,8 +373,17 @@ stackGitSourceRouter.put('/:stackName/git-source', async (req: Request, res: Res envPath: resolvedEnvPath, authType: auth_type, token: typeof token === 'string' ? token : undefined, + deployKey: typeof deploy_key === 'string' ? deploy_key : undefined, + sshKnownHostsEntry: typeof ssh_known_hosts_entry === 'string' ? ssh_known_hosts_entry : undefined, + sshHostKeyFingerprint: typeof ssh_host_key_fingerprint === 'string' ? ssh_host_key_fingerprint : undefined, autoApplyOnWebhook, autoDeployOnApply, + auditContext: { + username: auditActorUsername(req), + method: req.method, + path: req.originalUrl, + ipAddress: req.ip || 'unknown', + }, }); // The cached /stacks/statuses payload carries the source label; drop it @@ -488,5 +572,7 @@ stackGitSourceRouter.post('/:stackName/git-source/browse', async (req: Request, if (!requirePermission(req, res, 'stack:edit', 'stack', stackName)) return; const src = DatabaseService.getInstance().getGitSource(stackName); const storedToken = src?.encrypted_token ? CryptoService.getInstance().decrypt(src.encrypted_token) : null; - await handleBrowse(req, res, storedToken); + const storedDeployKey = src?.encrypted_deploy_key ? CryptoService.getInstance().decrypt(src.encrypted_deploy_key) : null; + const storedKnownHosts = src?.ssh_known_hosts_entry ?? null; + await handleBrowse(req, res, storedToken, storedDeployKey, storedKnownHosts); }); diff --git a/backend/src/routes/stacks.ts b/backend/src/routes/stacks.ts index 8c4f425a..0479b9ca 100644 --- a/backend/src/routes/stacks.ts +++ b/backend/src/routes/stacks.ts @@ -62,6 +62,7 @@ import { buildPolicyGateOptions, runPolicyGate, triggerPostDeployScan, describeP import { parseComposePreview, type ComposePreview } from '../helpers/composePreview'; import { filterContainersByComposeService } from '../helpers/composeServiceMatch'; import { invalidateNodeCaches } from '../helpers/cacheInvalidation'; +import { auditActorUsername } from '../helpers/auditActor'; import { invalidateFleetUpdateCache } from '../helpers/fleetUpdateCache'; import { ImageUpdateService, @@ -1084,6 +1085,9 @@ stacksRouter.post('/from-git', async (req: Request, res: Response) => { env_path, auth_type, token, + deploy_key, + ssh_known_hosts_entry, + ssh_host_key_fingerprint, auto_apply_on_webhook, auto_deploy_on_apply, deploy_now, @@ -1113,7 +1117,7 @@ stacksRouter.post('/from-git', async (req: Request, res: Response) => { if (auto_deploy_on_apply !== undefined && typeof auto_deploy_on_apply !== 'boolean') { return res.status(400).json({ error: 'auto_deploy_on_apply must be a boolean' }); } - const resolvedAuthType = auth_type === 'token' ? 'token' : 'none'; + const resolvedAuthType = auth_type === 'token' ? 'token' : auth_type === 'deploy_key' ? 'deploy_key' : 'none'; const repoUrlError = repoUrlRejectionMessage(repo_url); if (repoUrlError) { return res.status(400).json({ error: repoUrlError }); @@ -1124,6 +1128,9 @@ stacksRouter.post('/from-git', async (req: Request, res: Response) => { if (typeof env_path === 'string' && env_path.length > 1024) { return res.status(400).json({ error: 'env_path is too long' }); } + if (typeof deploy_key === 'string' && deploy_key.length > 16384) { + return res.status(400).json({ error: 'deploy_key is too long' }); + } if (typeof token === 'string' && token.length > 8192) { return res.status(400).json({ error: 'token is too long' }); } @@ -1161,8 +1168,21 @@ stacksRouter.post('/from-git', async (req: Request, res: Response) => { envPath: resolvedEnvPath, authType: resolvedAuthType, token: resolvedAuthType === 'token' && typeof token === 'string' && token !== '' ? token : null, + deployKey: resolvedAuthType === 'deploy_key' && typeof deploy_key === 'string' && deploy_key !== '' ? deploy_key : null, + sshKnownHostsEntry: resolvedAuthType === 'deploy_key' && typeof ssh_known_hosts_entry === 'string' + ? ssh_known_hosts_entry + : null, + sshHostKeyFingerprint: resolvedAuthType === 'deploy_key' && typeof ssh_host_key_fingerprint === 'string' + ? ssh_host_key_fingerprint + : null, autoApplyOnWebhook, autoDeployOnApply, + auditContext: { + username: auditActorUsername(req), + method: req.method, + path: req.originalUrl, + ipAddress: req.ip || 'unknown', + }, }); invalidateNodeCaches(req.nodeId); diff --git a/backend/src/services/DatabaseService.ts b/backend/src/services/DatabaseService.ts index b6414990..ca858cc6 100644 --- a/backend/src/services/DatabaseService.ts +++ b/backend/src/services/DatabaseService.ts @@ -429,7 +429,7 @@ export interface Webhook { updated_at: number; } -export type GitSourceAuthType = 'none' | 'token'; +export type GitSourceAuthType = 'none' | 'token' | 'deploy_key'; /** * The ordered set of local compose files actually materialized on disk for a @@ -457,6 +457,9 @@ export interface StackGitSource { env_path: string | null; auth_type: GitSourceAuthType; encrypted_token: string | null; + encrypted_deploy_key: string | null; + ssh_known_hosts_entry: string | null; + ssh_host_key_fingerprint: string | null; auto_apply_on_webhook: boolean; auto_deploy_on_apply: boolean; last_applied_commit_sha: string | null; @@ -1169,9 +1172,11 @@ export class DatabaseService { this.migrateFleetSyncStickyError(); this.migrateStackDossierHashes(); this.migrateGitSourceMultiFile(); + this.migrateGitSourceSshDeployKey(); this.migrateGitSourceManifest(); this.migrateGitSourceChangePlan(); this.migrateGitOpsRecoveryColumns(); + this.migrateGitOpsCreateCheckpointSshDeployKey(); this.migrateNodeUpdateSkips(); this.migrateStackAlertServiceScope(); @@ -2574,6 +2579,12 @@ stmt.run('gitops_schema_version', '1'); this.tryAddColumn('stack_dossiers', 'last_drift_check_at', 'INTEGER'); } + private migrateGitSourceSshDeployKey(): void { + this.tryAddColumn('stack_git_sources', 'encrypted_deploy_key', 'TEXT'); + this.tryAddColumn('stack_git_sources', 'ssh_known_hosts_entry', 'TEXT'); + this.tryAddColumn('stack_git_sources', 'ssh_host_key_fingerprint', 'TEXT'); + } + private migrateGitSourceManifest(): void { // Cache columns for the managed-project manifest (the manifest FILE in // /git-managed/// is the source of truth). @@ -2596,6 +2607,12 @@ stmt.run('gitops_schema_version', '1'); this.tryAddColumn('stack_update_recovery_generations', 'gitops_source_acceptance_ref', 'TEXT'); } + private migrateGitOpsCreateCheckpointSshDeployKey(): void { + this.tryAddColumn('gitops_create_checkpoints', 'encrypted_deploy_key', 'TEXT'); + this.tryAddColumn('gitops_create_checkpoints', 'ssh_known_hosts_entry', 'TEXT'); + this.tryAddColumn('gitops_create_checkpoints', 'ssh_host_key_fingerprint', 'TEXT'); + } + private migrateGitSourceMultiFile(): void { this.tryAddColumn('stack_git_sources', 'compose_paths', 'TEXT'); this.tryAddColumn('stack_git_sources', 'context_dir', 'TEXT'); @@ -6275,6 +6292,9 @@ stmt.run('gitops_schema_version', '1'); env_path: (row.env_path as string | null) ?? null, auth_type: row.auth_type as GitSourceAuthType, encrypted_token: (row.encrypted_token as string | null) ?? null, + encrypted_deploy_key: (row.encrypted_deploy_key as string | null) ?? null, + ssh_known_hosts_entry: (row.ssh_known_hosts_entry as string | null) ?? null, + ssh_host_key_fingerprint: (row.ssh_host_key_fingerprint as string | null) ?? null, auto_apply_on_webhook: Number(row.auto_apply_on_webhook) === 1, auto_deploy_on_apply: Number(row.auto_deploy_on_apply) === 1, last_applied_commit_sha: (row.last_applied_commit_sha as string | null) ?? null, @@ -6315,14 +6335,16 @@ stmt.run('gitops_schema_version', '1'); `UPDATE stack_git_sources SET repo_url = ?, branch = ?, compose_path = ?, compose_paths = ?, context_dir = ?, sync_env = ?, env_path = ?, - auth_type = ?, encrypted_token = ?, + auth_type = ?, encrypted_token = ?, encrypted_deploy_key = ?, + ssh_known_hosts_entry = ?, ssh_host_key_fingerprint = ?, auto_apply_on_webhook = ?, auto_deploy_on_apply = ?, updated_at = ? WHERE stack_name = ?` ).run( source.repo_url, source.branch, source.compose_path, composePathsJson, source.context_dir, source.sync_env ? 1 : 0, source.env_path, - source.auth_type, source.encrypted_token, + source.auth_type, source.encrypted_token, source.encrypted_deploy_key, + source.ssh_known_hosts_entry, source.ssh_host_key_fingerprint, source.auto_apply_on_webhook ? 1 : 0, source.auto_deploy_on_apply ? 1 : 0, now, source.stack_name ); @@ -6331,13 +6353,15 @@ stmt.run('gitops_schema_version', '1'); const result = this.db.prepare( `INSERT INTO stack_git_sources (stack_name, repo_url, branch, compose_path, compose_paths, context_dir, sync_env, env_path, - auth_type, encrypted_token, auto_apply_on_webhook, auto_deploy_on_apply, + auth_type, encrypted_token, encrypted_deploy_key, ssh_known_hosts_entry, ssh_host_key_fingerprint, + auto_apply_on_webhook, auto_deploy_on_apply, created_at, updated_at) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` ).run( source.stack_name, source.repo_url, source.branch, source.compose_path, composePathsJson, source.context_dir, source.sync_env ? 1 : 0, source.env_path, - source.auth_type, source.encrypted_token, + source.auth_type, source.encrypted_token, source.encrypted_deploy_key, + source.ssh_known_hosts_entry, source.ssh_host_key_fingerprint, source.auto_apply_on_webhook ? 1 : 0, source.auto_deploy_on_apply ? 1 : 0, now, now ); diff --git a/backend/src/services/GitSourceService.ts b/backend/src/services/GitSourceService.ts index a9734ecd..5363719e 100644 --- a/backend/src/services/GitSourceService.ts +++ b/backend/src/services/GitSourceService.ts @@ -29,8 +29,9 @@ import type { GitChangePlan, PublicGitChangePlan, GitChangePlanCounts, PublicGit import { GIT_CHANGE_PLAN_SCHEMA_VERSION } from '../types/gitChangePlan'; import type { NotificationCategory } from './NotificationService'; import { classifyGitFailure, isTransportFailure } from './git/errors'; -import type { RefKind } from './git/types'; +import type { RefKind, SshDeployKeyAuth } from './git/types'; import { nativeGitTransport, verifyFastForward } from './git/nativeGitTransport'; +import { fingerprintFromKnownHostsLine } from './git/sshTrust'; import { GitOpsStore } from './gitops/store'; import { GitOpsTransitions, GitOpsTransitionError } from './gitops/transitions'; import { @@ -62,6 +63,7 @@ export type GitSourceErrorCode = | 'REF_NOT_FOUND' | 'REF_DELETED' | 'UNSUPPORTED_REF' + | 'SSH_HOST_KEY_FAILED' | 'FILE_NOT_FOUND' | 'NETWORK_TIMEOUT' | 'GIT_ERROR' @@ -107,6 +109,7 @@ export interface FetchParams { composePaths: string[]; envPath?: string | null; token?: string | null; + sshAuth?: SshDeployKeyAuth | null; timeoutMs?: number; /** * Runs inside the clone lifecycle (before the temp dir is removed) so the @@ -165,8 +168,17 @@ export interface UpsertInput { envPath: string | null; authType: GitSourceAuthType; token?: string | null; // undefined = keep existing, '' = clear, non-empty = replace + deployKey?: string | null; + sshKnownHostsEntry?: string | null; + sshHostKeyFingerprint?: string | null; autoApplyOnWebhook: boolean; autoDeployOnApply: boolean; + auditContext?: { + username: string; + method: string; + path: string; + ipAddress: string; + }; } export interface CreateStackFromGitInput { @@ -179,8 +191,17 @@ export interface CreateStackFromGitInput { envPath: string | null; authType: GitSourceAuthType; token: string | null; + deployKey?: string | null; + sshKnownHostsEntry?: string | null; + sshHostKeyFingerprint?: string | null; autoApplyOnWebhook: boolean; autoDeployOnApply: boolean; + auditContext?: { + username: string; + method: string; + path: string; + ipAddress: string; + }; } export interface CreateStackFromGitResult { @@ -224,6 +245,8 @@ export interface PublicGitSource { env_path: string | null; auth_type: GitSourceAuthType; has_token: boolean; + has_deploy_key: boolean; + ssh_host_key_fingerprint: string | null; auto_apply_on_webhook: boolean; auto_deploy_on_apply: boolean; last_applied_commit_sha: string | null; @@ -542,6 +565,8 @@ export class GitSourceService { env_path: src.env_path, auth_type: src.auth_type, has_token: !!src.encrypted_token, + has_deploy_key: !!src.encrypted_deploy_key, + ssh_host_key_fingerprint: src.ssh_host_key_fingerprint ?? null, auto_apply_on_webhook: src.auto_apply_on_webhook, auto_deploy_on_apply: src.auto_deploy_on_apply, last_applied_commit_sha: src.last_applied_commit_sha, @@ -567,21 +592,126 @@ export class GitSourceService { // ─── CRUD ──────────────────────────────────────────────────────────────── + private resolveSshTrustFromKnownHostsEntry( + knownHostsEntry: string, + clientFingerprint?: string | null, + ): { sshKnownHostsEntry: string; sshHostKeyFingerprint: string } { + const sshKnownHostsEntry = knownHostsEntry.trim(); + const derived = fingerprintFromKnownHostsLine(sshKnownHostsEntry); + if (!derived) { + throw new GitSourceError('GIT_ERROR', 'SSH known_hosts entry is invalid or incomplete.'); + } + const trimmedClient = clientFingerprint?.trim(); + if (trimmedClient && trimmedClient !== derived) { + throw new GitSourceError('GIT_ERROR', 'SSH host key fingerprint does not match the trusted key entry.'); + } + return { sshKnownHostsEntry, sshHostKeyFingerprint: derived }; + } + + private recordSshTrustAudit(args: { + stackName: string; + username: string; + method: string; + path: string; + ipAddress: string; + fingerprint: string; + action: 'created' | 'rotated'; + }): void { + try { + DatabaseService.getInstance().insertAuditLog({ + timestamp: Date.now(), + username: args.username, + method: args.method, + path: args.path, + status_code: 200, + node_id: null, + ip_address: args.ipAddress, + summary: `git_source.ssh_trust_${args.action}: stack=${args.stackName} fingerprint=${args.fingerprint}`, + }); + } catch (err) { + console.warn('[GitSource] SSH trust audit write failed:', sanitizeForLog(String(err))); + } + } + + private maybeRecordSshTrustAudit( + auditContext: UpsertInput['auditContext'], + stackName: string, + fingerprint: string, + action: 'created' | 'rotated', + ): void { + if (!auditContext) return; + this.recordSshTrustAudit({ ...auditContext, stackName, fingerprint, action }); + } + + private resolveTransportAuth(src: Pick): { + token?: string | null; + sshAuth?: SshDeployKeyAuth | null; + } { + if (src.auth_type === 'token') { + return { token: src.encrypted_token ? this.crypto.decrypt(src.encrypted_token) : null }; + } + if (src.auth_type === 'deploy_key') { + if (!src.encrypted_deploy_key || !src.ssh_known_hosts_entry) { + return { sshAuth: null }; + } + return { + sshAuth: { + privateKey: this.crypto.decrypt(src.encrypted_deploy_key), + knownHostsEntry: src.ssh_known_hosts_entry, + }, + }; + } + return { token: null }; + } + public async upsert(input: UpsertInput): Promise { const db = DatabaseService.getInstance(); const existing = db.getGitSource(input.stackName); - // Determine the stored token. - let encryptedToken: string | null; + // Determine stored credentials per auth type. + let encryptedToken: string | null = null; + let encryptedDeployKey: string | null = null; + let sshKnownHostsEntry: string | null = null; + let sshHostKeyFingerprint: string | null = null; + if (input.authType === 'none') { - encryptedToken = null; - } else if (input.token === undefined) { - // Keep existing - encryptedToken = existing?.encrypted_token ?? null; - } else if (input.token === null || input.token === '') { - encryptedToken = null; - } else { - encryptedToken = this.crypto.encrypt(input.token); + // all null + } else if (input.authType === 'token') { + if (input.token === undefined) { + encryptedToken = existing?.encrypted_token ?? null; + } else if (input.token === null || input.token === '') { + encryptedToken = null; + } else { + encryptedToken = this.crypto.encrypt(input.token); + } + } else if (input.authType === 'deploy_key') { + if (input.deployKey === undefined) { + encryptedDeployKey = existing?.encrypted_deploy_key ?? null; + } else if (input.deployKey === null || input.deployKey === '') { + encryptedDeployKey = null; + } else { + encryptedDeployKey = this.crypto.encrypt(input.deployKey); + } + if (input.sshKnownHostsEntry === undefined) { + sshKnownHostsEntry = existing?.ssh_known_hosts_entry ?? null; + sshHostKeyFingerprint = existing?.ssh_host_key_fingerprint ?? null; + } else if (input.sshKnownHostsEntry === null || input.sshKnownHostsEntry.trim() === '') { + sshKnownHostsEntry = null; + sshHostKeyFingerprint = null; + } else { + const trust = this.resolveSshTrustFromKnownHostsEntry( + input.sshKnownHostsEntry, + input.sshHostKeyFingerprint, + ); + sshKnownHostsEntry = trust.sshKnownHostsEntry; + sshHostKeyFingerprint = trust.sshHostKeyFingerprint; + } + if (!encryptedDeployKey || !sshKnownHostsEntry) { + throw new GitSourceError( + 'GIT_ERROR', + 'Deploy key authentication requires a private key and a trusted SSH host key.', + ); + } } // Apply-matrix sanity: auto_deploy requires auto_apply. @@ -609,13 +739,22 @@ export class GitSourceService { // Dry-run reachability check before persisting. Fetches every configured // file so a bad path in the ordered list is caught at save time. - const token = encryptedToken ? this.crypto.decrypt(encryptedToken) : null; + const fetchAuth = input.authType === 'token' + ? { token: encryptedToken ? this.crypto.decrypt(encryptedToken) : null } + : input.authType === 'deploy_key' + ? { + sshAuth: { + privateKey: this.crypto.decrypt(encryptedDeployKey!), + knownHostsEntry: sshKnownHostsEntry!, + }, + } + : { token: null }; await this.fetchFromGit({ repoUrl: input.repoUrl, branch: input.branch, composePaths: input.composePaths, envPath: input.syncEnv ? input.envPath : null, - token, + ...fetchAuth, }); const resolvedEnvPath = input.syncEnv ? input.envPath : null; @@ -657,6 +796,9 @@ export class GitSourceService { env_path: resolvedEnvPath, auth_type: input.authType, encrypted_token: encryptedToken, + encrypted_deploy_key: encryptedDeployKey, + ssh_known_hosts_entry: sshKnownHostsEntry, + ssh_host_key_fingerprint: sshHostKeyFingerprint, auto_apply_on_webhook: input.autoApplyOnWebhook, auto_deploy_on_apply: input.autoDeployOnApply, last_applied_commit_sha: existing?.last_applied_commit_sha ?? null, @@ -714,6 +856,23 @@ export class GitSourceService { } })(); + if ( + input.authType === 'deploy_key' + && input.sshKnownHostsEntry !== undefined + && sshKnownHostsEntry + && sshHostKeyFingerprint + ) { + const priorKnownHosts = existing?.ssh_known_hosts_entry ?? null; + if (priorKnownHosts !== sshKnownHostsEntry) { + this.maybeRecordSshTrustAudit( + input.auditContext, + input.stackName, + sshHostKeyFingerprint, + priorKnownHosts ? 'rotated' : 'created', + ); + } + } + return this.get(input.stackName)!; } @@ -959,13 +1118,14 @@ export class GitSourceService { repoUrl: string; branch: string; token?: string | null; + sshAuth?: SshDeployKeyAuth | null; timeoutMs?: number; hasPriorHistory?: boolean; priorIdentity?: { commitSha: string; kind: RefKind }; }, fn: (dir: string, commitSha: string, warnings: string[], resolvedRefKind: RefKind) => Promise, ): Promise { - const { repoUrl, branch, token } = params; + const { repoUrl, branch, token, sshAuth } = params; const timeoutMs = params.timeoutMs ?? DEFAULT_FETCH_TIMEOUT_MS; const root = await createTempDir(); const hasPriorHistory = params.hasPriorHistory === true || params.priorIdentity != null; @@ -975,6 +1135,7 @@ export class GitSourceService { repoUrl, ref: branch, token, + sshAuth, timeoutMs, workspaceRoot: root, }); @@ -989,6 +1150,7 @@ export class GitSourceService { ancestorSha: prior.commitSha, descendantSha: resolved.commitSha, token, + sshAuth, timeoutMs, workspaceRoot: root, maxBytes: maxCloneBytes(), @@ -1003,6 +1165,7 @@ export class GitSourceService { ref: branch, refKind: resolved.kind, token, + sshAuth, timeoutMs, commitSha: resolved.commitSha, workspaceRoot: root, @@ -1047,7 +1210,7 @@ export class GitSourceService { } public async fetchFromGit(params: FetchParams): Promise { - const { repoUrl, branch, composePaths, envPath, token } = params; + const { repoUrl, branch, composePaths, envPath, token, sshAuth } = params; // Reject any compose/env target that resolves inside the `.git` // metadata directory BEFORE we spin up a clone. This blocks a @@ -1069,6 +1232,7 @@ export class GitSourceService { repoUrl, branch, token, + sshAuth, timeoutMs: params.timeoutMs, hasPriorHistory: params.hasPriorHistory, priorIdentity: params.priorIdentity, @@ -1138,7 +1302,7 @@ export class GitSourceService { * same clone size/timeout guards as fetch, plus a file-count cap. */ public async listRepoTree( - params: { repoUrl: string; branch: string; token?: string | null; timeoutMs?: number }, + params: { repoUrl: string; branch: string; token?: string | null; sshAuth?: SshDeployKeyAuth | null; timeoutMs?: number }, ): Promise<{ files: string[]; truncated: boolean; commitSha: string; warnings: string[] }> { return this.withClonedRepo(params, async (dir, commitSha, warnings) => { const { files, truncated } = await this.walkRepoFiles(dir); @@ -1811,7 +1975,7 @@ export class GitSourceService { console.log(`[GitSource:diag] pull start stack=${stackName} branch=${src.branch} host=${repoHost(src.repo_url)}`); } - const token = src.encrypted_token ? this.crypto.decrypt(src.encrypted_token) : null; + const transportAuth = this.resolveTransportAuth(src); const manifestSvc = GitProjectManifestService.getInstance(); // Object holder: property access is not narrowed by control-flow // analysis, so the closure assignment below stays visible. @@ -1824,7 +1988,8 @@ export class GitSourceService { branch: src.branch, composePaths: src.compose_paths, envPath: src.sync_env ? src.env_path : null, - token, + token: transportAuth.token, + sshAuth: transportAuth.sshAuth, hasPriorHistory: priorIdentity != null, priorIdentity, onClone: async (cloneDir, commitSha, envContent) => { @@ -2613,19 +2778,47 @@ export class GitSourceService { }); const staged: { candidateRelPath: string | null } = { candidateRelPath: null }; + const createDeployKeyTrust = input.authType === 'deploy_key' + ? (() => { + if (!input.deployKey?.trim() || !input.sshKnownHostsEntry?.trim()) { + throw new GitSourceError( + 'GIT_ERROR', + 'Deploy key authentication requires a private key and a trusted SSH host key.', + ); + } + return { + encryptedDeployKey: this.crypto.encrypt(input.deployKey.trim()), + ...this.resolveSshTrustFromKnownHostsEntry( + input.sshKnownHostsEntry, + input.sshHostKeyFingerprint, + ), + }; + })() + : null; + // 1. Fetch from git BEFORE touching disk or DB. If the fetch // fails there is nothing to clean up. The onClone hook stages // the complete-project candidate inside the clone lifecycle. const manifestSvc = GitProjectManifestService.getInstance(); const materialization: { value: MaterializationResult | null } = { value: null }; let fetched: FetchResult; + const createFetchAuth = input.authType === 'token' + ? { token: input.token } + : createDeployKeyTrust + ? { + sshAuth: { + privateKey: input.deployKey!.trim(), + knownHostsEntry: createDeployKeyTrust.sshKnownHostsEntry, + }, + } + : { token: null }; try { fetched = await this.fetchFromGit({ repoUrl: input.repoUrl, branch: input.branch, composePaths: input.composePaths, envPath: input.syncEnv ? input.envPath : null, - token: input.token, + ...createFetchAuth, onClone: async (cloneDir, commitSha, envContent) => { // The candidate path is recorded before the build that // creates it, so a crash mid-build still names exactly one @@ -2829,6 +3022,9 @@ export class GitSourceService { encryptedToken: input.authType === 'token' && input.token ? this.crypto.encrypt(input.token) : null, + encryptedDeployKey: createDeployKeyTrust?.encryptedDeployKey ?? null, + sshKnownHostsEntry: createDeployKeyTrust?.sshKnownHostsEntry ?? null, + sshHostKeyFingerprint: createDeployKeyTrust?.sshHostKeyFingerprint ?? null, autoApplyOnWebhook: input.autoApplyOnWebhook, autoDeployOnApply: input.autoDeployOnApply, commitSha: fetched.commitSha, @@ -2900,6 +3096,9 @@ export class GitSourceService { env_path: input.syncEnv ? input.envPath : null, auth_type: input.authType, encrypted_token: encryptedToken, + encrypted_deploy_key: createDeployKeyTrust?.encryptedDeployKey ?? null, + ssh_known_hosts_entry: createDeployKeyTrust?.sshKnownHostsEntry ?? null, + ssh_host_key_fingerprint: createDeployKeyTrust?.sshHostKeyFingerprint ?? null, auto_apply_on_webhook: input.autoApplyOnWebhook, auto_deploy_on_apply: input.autoDeployOnApply, last_applied_commit_sha: fetched.commitSha, @@ -2983,6 +3182,14 @@ export class GitSourceService { if (diag) { console.log(`[GitSource:diag] createStackFromGit ok stack=${input.stackName} sha=${fetched.commitSha.slice(0, 7)} envWritten=${envWritten} warnings=${fetched.warnings.length}`); } + if (createDeployKeyTrust?.sshHostKeyFingerprint) { + this.maybeRecordSshTrustAudit( + input.auditContext, + input.stackName, + createDeployKeyTrust.sshHostKeyFingerprint, + 'created', + ); + } return { source, commitSha: fetched.commitSha, envWritten, warnings: fetched.warnings }; } catch (e) { // Past the success boundary the stack is live and owned by the diff --git a/backend/src/services/git/errors.ts b/backend/src/services/git/errors.ts index 9b223197..0ffeb618 100644 --- a/backend/src/services/git/errors.ts +++ b/backend/src/services/git/errors.ts @@ -18,6 +18,7 @@ export type TransportFacingCode = | 'REPO_NOT_FOUND' | 'AUTH_FAILED' + | 'SSH_HOST_KEY_FAILED' | 'REF_NOT_FOUND' | 'UNSUPPORTED_REF' | 'NETWORK_TIMEOUT' @@ -104,7 +105,7 @@ export function classifyGitFailure( // stderr guessing. switch (failure.reason) { case 'invalid-url': - return { code: 'GIT_ERROR', message: 'Unsupported repository URL. Use an https:// URL without embedded credentials.' }; + return { code: 'GIT_ERROR', message: 'Unsupported repository URL. Use https:// or SSH (git@host:org/repo.git or ssh://) without embedded credentials.' }; case 'invalid-ref': return { code: 'GIT_ERROR', message: 'Unsupported ref name. Use a branch name, a tag name, or a full commit SHA as the remote reports it.' }; case 'git-missing': @@ -141,6 +142,20 @@ export function classifyGitFailure( message: PRIVATE_REPO_HINT, }; } + if (/host key verification failed|remotely changed the ssh host key|no matching host key found|offending key for ip|host key mismatch/.test(raw)) { + return { + code: 'SSH_HOST_KEY_FAILED', + message: 'SSH host key verification failed. The server key changed or is not trusted. Review the fingerprint and update host trust if you intend to accept the new key.', + }; + } + if (/permission denied \(publickey|publickey denied|no supported authentication methods/.test(raw)) { + return failure.hasToken + ? { code: 'AUTH_FAILED', message: 'Repository authentication failed. Check your deploy key or token.' } + : { + code: 'REPO_NOT_FOUND', + message: PRIVATE_REPO_HINT, + }; + } if (/authentication failed|\b40[13]\b/.test(raw)) { return failure.hasToken ? { code: 'AUTH_FAILED', message: 'Repository authentication failed. Check your token.' } diff --git a/backend/src/services/git/nativeGitTransport.ts b/backend/src/services/git/nativeGitTransport.ts index 77900d71..9b740a32 100644 --- a/backend/src/services/git/nativeGitTransport.ts +++ b/backend/src/services/git/nativeGitTransport.ts @@ -11,6 +11,12 @@ import { } from './credentialHelper'; import { isTransportFailure, type TransportFailure } from './errors'; import type { FetchRequest, FetchResult, GitTransport, ResolveRequest, ResolveResult } from './types'; +import { + buildSshCommand, + parseRepoTransportUrl, + type ParsedRepoUrl, +} from './sshTrust'; +import { writeDeployKey, writeKnownHosts } from './sshCredentialFiles'; /** * Native git transport: every Git operation is an `execFile`-style spawn of @@ -261,7 +267,12 @@ async function prepareWorkspace(root: string): Promise { return { metaDir, hooksDir, homeDir }; } -function buildEnv(homeDir: string, token?: string | null, helperPath?: string | null): NodeJS.ProcessEnv { +function buildEnv( + homeDir: string, + token?: string | null, + helperPath?: string | null, + sshCommand?: string | null, +): NodeJS.ProcessEnv { const env: NodeJS.ProcessEnv = { ...process.env, GIT_CONFIG_NOSYSTEM: '1', @@ -290,6 +301,9 @@ function buildEnv(homeDir: string, token?: string | null, helperPath?: string | // parses it. See credentialHelper.ts. env[GIT_HELPER_PATH_ENV_VAR] = helperPath; } + if (sshCommand) { + env.GIT_SSH_COMMAND = sshCommand; + } return env; } @@ -395,12 +409,16 @@ async function resolveCaArgs(layout: WorkspaceLayout): Promise { * Config shared by every invocation. With no helper, credential.helper is * explicitly cleared so nothing from the environment can answer prompts. */ -async function commonArgs(layout: WorkspaceLayout, helperPath: string | null): Promise { +async function commonArgs(layout: WorkspaceLayout, helperPath: string | null, ssh: boolean): Promise { const args = [ '-c', 'protocol.allow=never', - '-c', 'protocol.https.allow=always', - '-c', `core.hooksPath=${layout.hooksDir.split(path.sep).join('/')}`, ]; + if (ssh) { + args.push('-c', 'protocol.ssh.allow=always'); + } else { + args.push('-c', 'protocol.https.allow=always'); + } + args.push('-c', `core.hooksPath=${layout.hooksDir.split(path.sep).join('/')}`); if (process.platform === 'win32') { // With every config channel neutralized above, git falls back to its // build-default TLS backend, which on Git for Windows can be @@ -438,13 +456,18 @@ async function commonArgs(layout: WorkspaceLayout, helperPath: string | null): P async function prepareInvocation( workspaceRoot: string, token?: string | null, + sshAuth?: ResolveRequest['sshAuth'], ): Promise<{ layout: WorkspaceLayout; env: NodeJS.ProcessEnv; baseArgs: string[] }> { const layout = await prepareWorkspace(workspaceRoot); + let sshCommand: string | null = null; + if (sshAuth) { + const keyPath = await writeDeployKey(layout.metaDir, sshAuth.privateKey); + const knownPath = await writeKnownHosts(layout.metaDir, sshAuth.knownHostsEntry); + sshCommand = buildSshCommand(keyPath, knownPath); + } const helperPath = token ? await writeCredentialHelper(layout.metaDir) : null; - const env = buildEnv(layout.homeDir, token, helperPath); - // The same helperPath drives the env export and the config arg, so the two - // cannot describe different worlds. - const baseArgs = await commonArgs(layout, helperPath); + const env = buildEnv(layout.homeDir, token, helperPath, sshCommand); + const baseArgs = await commonArgs(layout, helperPath, Boolean(sshAuth)); return { layout, env, baseArgs }; } @@ -454,17 +477,19 @@ function invalidUrl(host: string, hasToken: boolean): TransportFailure { return { transportFailure: true as const, reason: 'invalid-url', host, hasToken }; } -function assertValidRepoUrl(repoUrl: string, hasToken: boolean): URL { - let url: URL; - try { - url = new URL(repoUrl); - } catch { +function assertValidRepoUrl(repoUrl: string, hasToken: boolean): ParsedRepoUrl { + const parsed = parseRepoTransportUrl(repoUrl); + if (!parsed) { throw invalidUrl('unknown', hasToken); } - if (url.protocol !== 'https:' || !url.hostname || url.username || url.password) { - throw invalidUrl(url.host || 'unknown', hasToken); + return parsed; +} + +function repoHostLabel(repo: ParsedRepoUrl): string { + if (repo.kind === 'ssh' && repo.port && repo.port !== 22) { + return `${repo.host}:${repo.port}`; } - return url; + return repo.host; } /** @@ -604,29 +629,28 @@ interface ResolvedRemoteRefs { * tag's raw line already points at the commit. */ async function lsRemoteRefs( - url: URL, + repo: ParsedRepoUrl, ref: string, env: NodeJS.ProcessEnv, baseArgs: string[], timeoutMs: number, hasToken: boolean, ): Promise { + const host = repoHostLabel(repo); let res: RunResult; try { res = await runGit( - [...baseArgs, 'ls-remote', url.href, `refs/heads/${ref}`, `refs/tags/${ref}`, `refs/tags/${ref}^{}`], + [...baseArgs, 'ls-remote', repo.href, `refs/heads/${ref}`, `refs/tags/${ref}`, `refs/tags/${ref}^{}`], { env, timeoutMs: Math.min(timeoutMs, LS_REMOTE_MAX_MS) }, ); } catch (e) { - // A resolution-phase timeout must classify like any other network - // timeout, not leak the internal flagged error to callers. if (isTimeoutError(e)) { - throw { transportFailure: true as const, reason: 'timeout', host: url.host, hasToken } satisfies TransportFailure; + throw { transportFailure: true as const, reason: 'timeout', host, hasToken } satisfies TransportFailure; } throw e; } if (res.exitCode !== 0) { - throw { transportFailure: true as const, reason: 'exit', stderr: res.stderr, exitCode: res.exitCode, argv: baseArgs, host: url.host, hasToken } satisfies TransportFailure; + throw { transportFailure: true as const, reason: 'exit', stderr: res.stderr, exitCode: res.exitCode, argv: baseArgs, host, hasToken } satisfies TransportFailure; } const found: ResolvedRemoteRefs = { branchSha: null, tagSha: null }; for (const line of res.stdout.split(/\r?\n/)) { @@ -667,6 +691,7 @@ export async function verifyFastForward(req: { ancestorSha: string; descendantSha: string; token?: string | null; + sshAuth?: ResolveRequest['sshAuth']; timeoutMs?: number; workspaceRoot: string; maxBytes: number; @@ -675,18 +700,19 @@ export async function verifyFastForward(req: { const descendant = req.descendantSha.toLowerCase(); if (ancestor === descendant) return true; - const hasToken = Boolean(req.token); + const hasToken = Boolean(req.token) || Boolean(req.sshAuth); await ensureBinaryReady(hasToken); - const url = assertValidRepoUrl(req.repoUrl, hasToken); + const repo = assertValidRepoUrl(req.repoUrl, hasToken); + const host = repoHostLabel(repo); const timeoutMs = req.timeoutMs ?? DEFAULT_TIMEOUT_MS; const deadline = Date.now() + timeoutMs; const remainingMs = (): number => Math.max(1, deadline - Date.now()); const assertTimeBudget = (): void => { if (Date.now() >= deadline) { - throw { transportFailure: true as const, reason: 'timeout', host: url.host, hasToken } satisfies TransportFailure; + throw { transportFailure: true as const, reason: 'timeout', host, hasToken } satisfies TransportFailure; } }; - const { env, baseArgs } = await prepareInvocation(req.workspaceRoot, req.token); + const { env, baseArgs } = await prepareInvocation(req.workspaceRoot, req.token, req.sshAuth); const repoDir = path.join(req.workspaceRoot, 'ff-check'); await fs.mkdir(repoDir, { recursive: true }); @@ -700,7 +726,7 @@ export async function verifyFastForward(req: { const throwIfSizeExceeded = (): void => { if (sizeExceeded) { - throw { transportFailure: true as const, reason: 'size', maxBytes: req.maxBytes, host: url.host, hasToken } satisfies TransportFailure; + throw { transportFailure: true as const, reason: 'size', maxBytes: req.maxBytes, host: repoHostLabel(repo), hasToken } satisfies TransportFailure; } }; @@ -718,13 +744,13 @@ export async function verifyFastForward(req: { } catch (e) { throwIfSizeExceeded(); if (isTimeoutError(e)) { - throw { transportFailure: true as const, reason: 'timeout', host: url.host, hasToken } satisfies TransportFailure; + throw { transportFailure: true as const, reason: 'timeout', host: repoHostLabel(repo), hasToken } satisfies TransportFailure; } - throw { transportFailure: true as const, reason: 'exit', stderr: e instanceof Error ? e.message : String(e), argv: args, host: url.host, hasToken } satisfies TransportFailure; + throw { transportFailure: true as const, reason: 'exit', stderr: e instanceof Error ? e.message : String(e), argv: args, host: repoHostLabel(repo), hasToken } satisfies TransportFailure; } throwIfSizeExceeded(); if (res.exitCode !== 0) { - throw { transportFailure: true as const, reason: 'exit', stderr: res.stderr, exitCode: res.exitCode, argv: args, host: url.host, hasToken } satisfies TransportFailure; + throw { transportFailure: true as const, reason: 'exit', stderr: res.stderr, exitCode: res.exitCode, argv: args, host: repoHostLabel(repo), hasToken } satisfies TransportFailure; } return res; }; @@ -736,7 +762,7 @@ export async function verifyFastForward(req: { stderr: res.stderr, exitCode: res.exitCode, argv, - host: url.host, + host: repoHostLabel(repo), hasToken, } satisfies TransportFailure; }; @@ -754,14 +780,14 @@ export async function verifyFastForward(req: { } catch (e) { throwIfSizeExceeded(); if (isTimeoutError(e)) { - throw { transportFailure: true as const, reason: 'timeout', host: url.host, hasToken } satisfies TransportFailure; + throw { transportFailure: true as const, reason: 'timeout', host: repoHostLabel(repo), hasToken } satisfies TransportFailure; } throw { transportFailure: true as const, reason: 'exit', stderr: e instanceof Error ? e.message : String(e), argv: args, - host: url.host, + host: repoHostLabel(repo), hasToken, } satisfies TransportFailure; } @@ -777,7 +803,7 @@ export async function verifyFastForward(req: { }; await materialize([...baseArgs, 'init']); - await materialize([...baseArgs, 'fetch', '--depth=1', url.href, descendant]); + await materialize([...baseArgs, 'fetch', '--depth=1', repo.href, descendant]); const countReachable = async (): Promise => { const argv = [...baseArgs, 'rev-list', '--count', descendant]; @@ -793,7 +819,7 @@ export async function verifyFastForward(req: { stderr: `unexpected rev-list output: ${listed.stdout}`, exitCode: listed.exitCode, argv, - host: url.host, + host: repoHostLabel(repo), hasToken, } satisfies TransportFailure; } @@ -815,7 +841,7 @@ export async function verifyFastForward(req: { stderr: `unexpected shallow-repository output: ${shallow.stdout}`, exitCode: shallow.exitCode, argv, - host: url.host, + host: repoHostLabel(repo), hasToken, } satisfies TransportFailure; }; @@ -838,7 +864,7 @@ export async function verifyFastForward(req: { return -1; }); if (sizeExceeded || finalSize < 0 || finalSize > req.maxBytes) { - throw { transportFailure: true as const, reason: 'size', maxBytes: req.maxBytes, host: url.host, hasToken } satisfies TransportFailure; + throw { transportFailure: true as const, reason: 'size', maxBytes: req.maxBytes, host: repoHostLabel(repo), hasToken } satisfies TransportFailure; } }; @@ -861,11 +887,11 @@ export async function verifyFastForward(req: { } if (fetchRounds >= MAX_FF_FETCH_ROUNDS) { - throw { transportFailure: true as const, reason: 'timeout', host: url.host, hasToken } satisfies TransportFailure; + throw { transportFailure: true as const, reason: 'timeout', host: repoHostLabel(repo), hasToken } satisfies TransportFailure; } const previousCount = reachableCount; - await materialize([...baseArgs, 'fetch', `--deepen=${deepenStep}`, url.href, descendant]); + await materialize([...baseArgs, 'fetch', `--deepen=${deepenStep}`, repo.href, descendant]); fetchRounds += 1; reachableCount = await countReachable(); @@ -874,14 +900,14 @@ export async function verifyFastForward(req: { await assertWithinSizeBudget(); return false; } - throw { transportFailure: true as const, reason: 'timeout', host: url.host, hasToken } satisfies TransportFailure; + throw { transportFailure: true as const, reason: 'timeout', host: repoHostLabel(repo), hasToken } satisfies TransportFailure; } deepenStep = Math.min(deepenStep * 2, MAX_FF_DEEPEN_STEP); } } finally { watchdog.stop(); - await awaitKillConfirmed(breachKill, `size-breach kill for ${url.host}`); + await awaitKillConfirmed(breachKill, `size-breach kill for ${repoHostLabel(repo)}`); await fs.rm(repoDir, { recursive: true, force: true }).catch((e: unknown) => { console.warn(`[GitSource:transport] failed to remove fast-forward scratch repo ${repoDir}: ${e instanceof Error ? e.message : String(e)}`); }); @@ -890,9 +916,9 @@ export async function verifyFastForward(req: { export const nativeGitTransport: GitTransport = { async resolveRef(req: ResolveRequest): Promise { - const hasToken = Boolean(req.token); + const hasToken = Boolean(req.token) || Boolean(req.sshAuth); await ensureBinaryReady(hasToken); - const url = assertValidRepoUrl(req.repoUrl, hasToken); + const repo = assertValidRepoUrl(req.repoUrl, hasToken); if (SHA_PATTERN.test(req.ref)) { // A full SHA is self-resolving: the immutable identity IS the @@ -902,24 +928,24 @@ export const nativeGitTransport: GitTransport = { return { commitSha: req.ref.toLowerCase(), kind: 'sha' }; } - assertValidRef(req.ref, url.host, hasToken); - const { env, baseArgs } = await prepareInvocation(req.workspaceRoot, req.token); + assertValidRef(req.ref, repoHostLabel(repo), hasToken); + const { env, baseArgs } = await prepareInvocation(req.workspaceRoot, req.token, req.sshAuth); const found = await lsRemoteRefs( - url, req.ref, env, baseArgs, + repo, req.ref, env, baseArgs, req.timeoutMs ?? DEFAULT_TIMEOUT_MS, hasToken, ); if (found.branchSha) return { commitSha: found.branchSha, kind: 'branch' }; if (found.tagSha) return { commitSha: found.tagSha, kind: 'tag' }; - throw { transportFailure: true as const, reason: 'ref-not-found', host: url.host, hasToken } satisfies TransportFailure; + throw { transportFailure: true as const, reason: 'ref-not-found', host: repoHostLabel(repo), hasToken } satisfies TransportFailure; }, async fetchAtCommit(req: FetchRequest): Promise { - const hasToken = Boolean(req.token); + const hasToken = Boolean(req.token) || Boolean(req.sshAuth); await ensureBinaryReady(hasToken); - const url = assertValidRepoUrl(req.repoUrl, hasToken); - assertValidRef(req.ref, url.host, hasToken); + const repo = assertValidRepoUrl(req.repoUrl, hasToken); + assertValidRef(req.ref, repoHostLabel(repo), hasToken); - const { layout, env, baseArgs } = await prepareInvocation(req.workspaceRoot, req.token); + const { layout, env, baseArgs } = await prepareInvocation(req.workspaceRoot, req.token, req.sshAuth); const checkout = path.join(req.workspaceRoot, 'repo'); const timeoutMs = req.timeoutMs ?? DEFAULT_TIMEOUT_MS; @@ -952,22 +978,22 @@ export const nativeGitTransport: GitTransport = { } catch (e) { // A size breach wins over the timeout wording. if (sizeExceeded) { - throw { transportFailure: true as const, reason: 'size', maxBytes: req.maxBytes, host: url.host, hasToken } satisfies TransportFailure; + throw { transportFailure: true as const, reason: 'size', maxBytes: req.maxBytes, host: repoHostLabel(repo), hasToken } satisfies TransportFailure; } if (isTimeoutError(e)) { - throw { transportFailure: true as const, reason: 'timeout', host: url.host, hasToken } satisfies TransportFailure; + throw { transportFailure: true as const, reason: 'timeout', host: repoHostLabel(repo), hasToken } satisfies TransportFailure; } - throw { transportFailure: true as const, reason: 'exit', stderr: e instanceof Error ? e.message : String(e), argv: args, host: url.host, hasToken } satisfies TransportFailure; + throw { transportFailure: true as const, reason: 'exit', stderr: e instanceof Error ? e.message : String(e), argv: args, host: repoHostLabel(repo), hasToken } satisfies TransportFailure; } // A watchdog-triggered SIGKILL settles runGit's promise via the // child's normal 'close' event (code null -> exitCode -1), not // a rejection, so this is the common path for an in-flight // breach and must check sizeExceeded before the generic mapping. if (sizeExceeded) { - throw { transportFailure: true as const, reason: 'size', maxBytes: req.maxBytes, host: url.host, hasToken } satisfies TransportFailure; + throw { transportFailure: true as const, reason: 'size', maxBytes: req.maxBytes, host: repoHostLabel(repo), hasToken } satisfies TransportFailure; } if (res.exitCode !== 0) { - throw { transportFailure: true as const, reason: 'exit', stderr: res.stderr, exitCode: res.exitCode, argv: args, host: url.host, hasToken } satisfies TransportFailure; + throw { transportFailure: true as const, reason: 'exit', stderr: res.stderr, exitCode: res.exitCode, argv: args, host: repoHostLabel(repo), hasToken } satisfies TransportFailure; } return res; }; @@ -979,7 +1005,7 @@ export const nativeGitTransport: GitTransport = { // SHA (GitHub does by default); a refusal surfaces as a // non-zero `git fetch` here and classifies as UNSUPPORTED_REF. await materialize([...baseArgs, 'init', checkout]); - await materialize([...baseArgs, '-C', checkout, 'fetch', '--depth=1', url.href, req.ref]); + await materialize([...baseArgs, '-C', checkout, 'fetch', '--depth=1', repo.href, req.ref]); await materialize([...baseArgs, '-C', checkout, 'checkout', '--detach', req.ref]); } else { // A bare name works for both branches and tags: `--branch` @@ -992,7 +1018,7 @@ export const nativeGitTransport: GitTransport = { await materialize([ ...baseArgs, 'clone', '--depth=1', '--single-branch', '--no-tags', '--no-recurse-submodules', - '--branch', branchArg, url.href, checkout, + '--branch', branchArg, repo.href, checkout, ]); } @@ -1005,20 +1031,20 @@ export const nativeGitTransport: GitTransport = { }); actual = head.stdout.trim().toLowerCase(); if (!SHA_PATTERN.test(actual)) { - throw { transportFailure: true as const, reason: 'exit', stderr: `unexpected rev-parse output: ${head.stdout}`, exitCode: head.exitCode, host: url.host, hasToken } satisfies TransportFailure; + throw { transportFailure: true as const, reason: 'exit', stderr: `unexpected rev-parse output: ${head.stdout}`, exitCode: head.exitCode, host: repoHostLabel(repo), hasToken } satisfies TransportFailure; } } catch (e) { if (isTransportFailure(e)) throw e; if (isTimeoutError(e)) { - throw { transportFailure: true as const, reason: 'timeout', host: url.host, hasToken } satisfies TransportFailure; + throw { transportFailure: true as const, reason: 'timeout', host: repoHostLabel(repo), hasToken } satisfies TransportFailure; } - throw { transportFailure: true as const, reason: 'exit', stderr: e instanceof Error ? e.message : String(e), host: url.host, hasToken } satisfies TransportFailure; + throw { transportFailure: true as const, reason: 'exit', stderr: e instanceof Error ? e.message : String(e), host: repoHostLabel(repo), hasToken } satisfies TransportFailure; } if (actual !== req.commitSha.toLowerCase()) { // The branch tip moved between resolution and fetch. Refuse // rather than materialize content nobody reviewed. - throw { transportFailure: true as const, reason: 'tip-changed', host: url.host, hasToken } satisfies TransportFailure; + throw { transportFailure: true as const, reason: 'tip-changed', host: repoHostLabel(repo), hasToken } satisfies TransportFailure; } // Deterministic final measure: a breach landing between the last @@ -1031,13 +1057,13 @@ export const nativeGitTransport: GitTransport = { return -1; }); if (sizeExceeded || finalSize < 0 || finalSize > req.maxBytes) { - throw { transportFailure: true as const, reason: 'size', maxBytes: req.maxBytes, host: url.host, hasToken } satisfies TransportFailure; + throw { transportFailure: true as const, reason: 'size', maxBytes: req.maxBytes, host: repoHostLabel(repo), hasToken } satisfies TransportFailure; } return { commitSha: actual, dir: checkout }; } finally { watchdog.stop(); - await awaitKillConfirmed(breachKill, `size-breach kill for ${url.host}`); + await awaitKillConfirmed(breachKill, `size-breach kill for ${repoHostLabel(repo)}`); } }, }; diff --git a/backend/src/services/git/sshCredentialFiles.ts b/backend/src/services/git/sshCredentialFiles.ts new file mode 100644 index 00000000..99464160 --- /dev/null +++ b/backend/src/services/git/sshCredentialFiles.ts @@ -0,0 +1,19 @@ +import { promises as fs } from 'fs'; +import path from 'path'; +import { canonicalizeDeployKeyPem, canonicalizeKnownHostsEntry } from './sshTrust'; + +/** Materialize a validated deploy key PEM for one git/ssh invocation (mode 0600). */ +export async function writeDeployKey(metaDir: string, pem: string): Promise { + const keyPath = path.join(metaDir, 'deploy-key'); + const canonical = canonicalizeDeployKeyPem(pem); + await fs.writeFile(keyPath, canonical, { mode: 0o600 }); + return keyPath.split(path.sep).join('/'); +} + +/** Materialize a validated known_hosts entry for one git/ssh invocation (mode 0600). */ +export async function writeKnownHosts(metaDir: string, entry: string): Promise { + const knownHostsPath = path.join(metaDir, 'known_hosts'); + const canonical = canonicalizeKnownHostsEntry(entry); + await fs.writeFile(knownHostsPath, canonical, { mode: 0o600 }); + return knownHostsPath.split(path.sep).join('/'); +} diff --git a/backend/src/services/git/sshTrust.ts b/backend/src/services/git/sshTrust.ts new file mode 100644 index 00000000..4a60863e --- /dev/null +++ b/backend/src/services/git/sshTrust.ts @@ -0,0 +1,272 @@ +import { createHash } from 'crypto'; +import { spawn } from 'child_process'; +import path from 'path'; + +/** Parsed SSH repository target for transport and host-key trust. */ +export interface ParsedSshRepoUrl { + /** URL string passed to git (scp-style or ssh://). */ + href: string; + host: string; + port: number; + pathname: string; +} + +const DEFAULT_SSH_PORT = 22; +const SCP_URL_PATTERN = /^([^@\s/]+)@([^:\s]+):(.+)$/; +const KNOWN_HOSTS_SCAN_TIMEOUT_MS = 15_000; + +function normalizePathname(pathname: string): string { + const trimmed = pathname.trim(); + if (!trimmed.startsWith('/')) return `/${trimmed}`; + return trimmed; +} + +/** + * Parse scp-style `git@host:org/repo.git` URLs. Git accepts these directly; + * ssh:// is used when a nonstandard port is required. + */ +export function parseSshScpUrl(raw: string): ParsedSshRepoUrl | null { + const trimmed = raw.trim(); + const match = SCP_URL_PATTERN.exec(trimmed); + if (!match) return null; + const user = match[1]; + const hostPart = match[2]; + const repoPath = match[3].trim(); + if (!user || !hostPart || !repoPath || repoPath.includes('..')) return null; + const colon = hostPart.lastIndexOf(':'); + let host = hostPart; + let port = DEFAULT_SSH_PORT; + if (colon > 0 && colon < hostPart.length - 1) { + const portText = hostPart.slice(colon + 1); + const parsedPort = Number.parseInt(portText, 10); + if (!Number.isFinite(parsedPort) || parsedPort < 1 || parsedPort > 65535) return null; + host = hostPart.slice(0, colon); + port = parsedPort; + } + if (!host) return null; + const pathname = normalizePathname(repoPath); + const href = port === DEFAULT_SSH_PORT + ? `${user}@${host}:${repoPath}` + : `ssh://${user}@${host}:${port}${pathname}`; + return { href, host, port, pathname }; +} + +export function parseSshUrl(raw: string): ParsedSshRepoUrl | null { + const trimmed = raw.trim(); + let url: URL; + try { + url = new URL(trimmed); + } catch { + return parseSshScpUrl(trimmed); + } + if (url.protocol !== 'ssh:') return null; + if (!url.hostname || url.username === '' || url.password !== '') return null; + if (url.search !== '' || url.hash !== '') return null; + const port = url.port ? Number.parseInt(url.port, 10) : DEFAULT_SSH_PORT; + if (!Number.isFinite(port) || port < 1 || port > 65535) return null; + const pathname = normalizePathname(url.pathname); + if (pathname === '/' || pathname.includes('..')) return null; + const user = url.username; + const href = port === DEFAULT_SSH_PORT + ? `${user}@${url.hostname}:${pathname.slice(1)}` + : `ssh://${user}@${url.hostname}:${port}${pathname}`; + return { href, host: url.hostname, port, pathname }; +} + +export type RepoTransportKind = 'https' | 'ssh'; + +export interface ParsedRepoUrl { + kind: RepoTransportKind; + href: string; + host: string; + port?: number; + pathname: string; +} + +export function parseRepoTransportUrl(raw: string): ParsedRepoUrl | null { + const trimmed = raw.trim(); + if (!trimmed) return null; + let https: URL; + try { + https = new URL(trimmed); + } catch { + https = null as unknown as URL; + } + if (https && https.protocol === 'https:' && https.hostname && !https.username && !https.password + && https.search === '' && https.hash === '') { + return { + kind: 'https', + href: https.href, + host: https.host, + pathname: https.pathname, + }; + } + const ssh = parseSshUrl(trimmed); + if (!ssh) return null; + return { + kind: 'ssh', + href: ssh.href, + host: ssh.host, + port: ssh.port, + pathname: ssh.pathname, + }; +} + +/** SHA256 fingerprint in OpenSSH display form (`SHA256:...`). */ +export function fingerprintFromKnownHostsLine(line: string): string | null { + const material = keyMaterialFromKnownHostsLine(line); + if (!material) return null; + try { + const digest = createHash('sha256').update(Buffer.from(material.keyBase64, 'base64')).digest('base64'); + return `SHA256:${digest.replace(/=+$/, '')}`; + } catch { + return null; + } +} + +function isSshKeyType(token: string): boolean { + return token.startsWith('ssh-') || token.startsWith('ecdsa-') || token.startsWith('sk-'); +} + +function keyMaterialFromKnownHostsLine(line: string): { keyType: string; keyBase64: string } | null { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith('#')) return null; + const parts = trimmed.split(/\s+/); + if (parts.length < 3) return null; + for (let i = 0; i < parts.length - 1; i += 1) { + if (isSshKeyType(parts[i])) { + return { keyType: parts[i], keyBase64: parts[i + 1] }; + } + } + return null; +} + +const DEPLOY_KEY_PEM_HEADER = /^-----BEGIN (?:OPENSSH )?PRIVATE KEY-----$/; +const DEPLOY_KEY_PEM_FOOTER = /^-----END (?:OPENSSH )?PRIVATE KEY-----$/; + +/** Rebuild a deploy key PEM from validated envelope and base64 body lines only. */ +export function canonicalizeDeployKeyPem(raw: string): string { + const lines = raw.replace(/\r\n/g, '\n').trim().split('\n').map((l) => l.trim()).filter((l) => l.length > 0); + if (lines.length < 3) { + throw new Error('deploy key is invalid'); + } + const header = lines[0]; + const footer = lines[lines.length - 1]; + if (!DEPLOY_KEY_PEM_HEADER.test(header) || !DEPLOY_KEY_PEM_FOOTER.test(footer)) { + throw new Error('deploy key is invalid'); + } + const bodyLines = lines.slice(1, -1); + for (const bodyLine of bodyLines) { + if (!/^[A-Za-z0-9+/=]+$/.test(bodyLine)) { + throw new Error('deploy key is invalid'); + } + } + return `${header}\n${bodyLines.join('\n')}\n${footer}\n`; +} + +function canonicalizeKnownHostsLine(line: string): string { + const material = keyMaterialFromKnownHostsLine(line); + if (!material) { + throw new Error('known_hosts entry is invalid'); + } + try { + Buffer.from(material.keyBase64, 'base64'); + } catch { + throw new Error('known_hosts entry is invalid'); + } + const parts = line.trim().split(/\s+/); + let keyTypeIdx = -1; + for (let i = 0; i < parts.length - 1; i += 1) { + if (isSshKeyType(parts[i])) { + keyTypeIdx = i; + break; + } + } + if (keyTypeIdx < 1) { + throw new Error('known_hosts entry is invalid'); + } + const hostPart = parts.slice(0, keyTypeIdx).join(' '); + return `${hostPart} ${material.keyType} ${material.keyBase64}`; +} + +/** Rebuild known_hosts content from parsed host markers and key material only. */ +export function canonicalizeKnownHostsEntry(raw: string): string { + const lines = raw.trim().split(/\r?\n/) + .map((l) => l.trim()) + .filter((l) => l && !l.startsWith('#')); + if (lines.length === 0) { + throw new Error('known_hosts entry is empty'); + } + return `${lines.map(canonicalizeKnownHostsLine).join('\n')}\n`; +} + +export interface ScannedHostKey { + keyType: string; + fingerprint: string; + line: string; +} + +function runSshKeyscan(host: string, port: number): Promise<{ stdout: string; stderr: string; exitCode: number }> { + return new Promise((resolve, reject) => { + const args = port === DEFAULT_SSH_PORT + ? ['-H', host] + : ['-p', String(port), '-H', host]; + const child = spawn('ssh-keyscan', args, { windowsHide: true }); + let stdout = ''; + let stderr = ''; + child.stdout?.on('data', (chunk: Buffer) => { stdout += chunk.toString('utf8'); }); + child.stderr?.on('data', (chunk: Buffer) => { stderr += chunk.toString('utf8'); }); + const timer = setTimeout(() => { + child.kill('SIGKILL'); + }, KNOWN_HOSTS_SCAN_TIMEOUT_MS); + child.on('error', (err) => { + clearTimeout(timer); + reject(err); + }); + child.on('close', (code) => { + clearTimeout(timer); + resolve({ stdout, stderr, exitCode: code ?? -1 }); + }); + }); +} + +/** Fetch host keys from the server without trusting them (probe step only). */ +export async function scanHostKeys(host: string, port: number): Promise { + const result = await runSshKeyscan(host, port); + if (result.exitCode !== 0 && !result.stdout.trim()) { + throw new Error(result.stderr.trim() || 'ssh-keyscan failed'); + } + const keys: ScannedHostKey[] = []; + for (const line of result.stdout.split(/\r?\n/)) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith('#')) continue; + const fingerprint = fingerprintFromKnownHostsLine(trimmed); + if (!fingerprint) continue; + const material = keyMaterialFromKnownHostsLine(trimmed); + const keyType = material?.keyType ?? 'unknown'; + keys.push({ keyType, fingerprint, line: trimmed }); + } + if (keys.length === 0) { + throw new Error('No host keys returned from ssh-keyscan'); + } + return keys; +} + +/** + * Build GIT_SSH_COMMAND / core.sshCommand value enforcing strict host-key + * checking against our per-fetch known_hosts file and a single deploy key. + */ +export function buildSshCommand(keyPath: string, knownHostsPath: string): string { + const key = keyPath.split(path.sep).join('/'); + const known = knownHostsPath.split(path.sep).join('/'); + return [ + 'ssh', + '-o', 'BatchMode=yes', + '-o', 'StrictHostKeyChecking=yes', + '-o', 'UserKnownHostsFile=' + known, + '-o', 'IdentitiesOnly=yes', + '-o', 'IdentityAgent=none', + '-F', '/dev/null', + '-i', key, + ].join(' '); +} diff --git a/backend/src/services/git/types.ts b/backend/src/services/git/types.ts index c5568a5b..132a8103 100644 --- a/backend/src/services/git/types.ts +++ b/backend/src/services/git/types.ts @@ -18,11 +18,18 @@ export type RefKind = 'branch' | 'tag' | 'sha'; +/** Deploy-key authentication material for SSH transports. */ +export interface SshDeployKeyAuth { + privateKey: string; + knownHostsEntry: string; +} + export interface ResolveRequest { repoUrl: string; /** Configured ref: a branch name, a tag name, or a full 40/64-hex commit SHA. */ ref: string; token?: string | null; + sshAuth?: SshDeployKeyAuth | null; /** * Total fetch budget in milliseconds. Note: the resolution round trip * (ls-remote) is internally capped at 10s regardless of this value, so diff --git a/backend/src/services/gitops/createRecovery.ts b/backend/src/services/gitops/createRecovery.ts index 33c01717..3972a80f 100644 --- a/backend/src/services/gitops/createRecovery.ts +++ b/backend/src/services/gitops/createRecovery.ts @@ -64,13 +64,6 @@ function envelopeFor(checkpoint: GitOpsCreateCheckpointRow) { }; } -/** - * Three states, because the two callers need opposite fail-safe directions. - * - * Teardown must not treat "cannot tell" as absent, or it would skip a directory - * that is really there. Completion must not treat it as present, or it would - * mark a create live on the strength of a failed stat. - */ /** * Clear a settled create's staging marker, reporting rather than throwing. * @@ -94,6 +87,13 @@ async function clearSettledMarker(stackName: string, managedRoot: string): Promi } } +/** + * Three states, because the two callers need opposite fail-safe directions. + * + * Teardown must not treat "cannot tell" as absent, or it would skip a directory + * that is really there. Completion must not treat it as present, or it would + * mark a create live on the strength of a failed stat. + */ async function stackDirState(stackName: string): Promise<'present' | 'absent' | 'unknown'> { try { const base = FileSystemService.getInstance().getBaseDir(); @@ -262,8 +262,11 @@ async function resolveOne(checkpoint: GitOpsCreateCheckpointRow): Promise MAX_REPO_URL_LENGTH) { + return { ok: false, reason: trimmed.length > MAX_REPO_URL_LENGTH ? 'too_long' : 'invalid' }; + } + const https = parseHttpsRepoUrl(trimmed); + if (https.ok) return { ok: true, kind: 'https', url: https.url }; + const ssh = parseSshUrl(trimmed); + if (ssh) return { ok: true, kind: 'ssh', ssh }; + if (!https.ok && https.reason !== 'not_https') { + return { ok: false, reason: https.reason }; + } + return { ok: false, reason: 'not_supported' }; +} + +export function serializeRepoIdentityFromStorable(parsed: ParseStorableRepoUrlResult & { ok: true }): RepoIdentity { + if (parsed.kind === 'https') { + return serializeRepoIdentity(parsed.url); + } + const host = parsed.ssh.port === 22 ? parsed.ssh.host : `${parsed.ssh.host}:${parsed.ssh.port}`; + return { host, pathname: parsed.ssh.pathname }; +} + +export function secretFreeRepoUrlFromStorable(parsed: ParseStorableRepoUrlResult & { ok: true }): string { + if (parsed.kind === 'https') { + return secretFreeRepoUrl(serializeRepoIdentity(parsed.url)); + } + const ssh = parsed.ssh; + const portSuffix = ssh.port === 22 ? '' : `:${ssh.port}`; + return `ssh://git@${ssh.host}${portSuffix}${ssh.pathname}`; +} + export function repoUrlRejectionMessage(raw: string): string | null { - const parsed = parseHttpsRepoUrl(raw); + const parsed = parseStorableRepoUrl(raw); if (parsed.ok) return null; switch (parsed.reason) { case 'too_long': return 'repo_url is too long'; - case 'not_https': - return 'Only HTTPS repository URLs are supported'; + case 'not_supported': + return 'Use an https:// URL or an SSH URL (git@host:org/repo.git or ssh://)'; case 'userinfo': return 'Repository URL must not include userinfo'; case 'query': diff --git a/backend/src/services/gitops/schema.ts b/backend/src/services/gitops/schema.ts index 99efa3f3..4acdcf32 100644 --- a/backend/src/services/gitops/schema.ts +++ b/backend/src/services/gitops/schema.ts @@ -31,6 +31,9 @@ CREATE TABLE IF NOT EXISTS gitops_create_checkpoints ( env_path TEXT NULL, auth_type TEXT NOT NULL, encrypted_token TEXT NULL, + encrypted_deploy_key TEXT NULL, + ssh_known_hosts_entry TEXT NULL, + ssh_host_key_fingerprint TEXT NULL, auto_apply_on_webhook INTEGER NOT NULL DEFAULT 0, auto_deploy_on_apply INTEGER NOT NULL DEFAULT 0, commit_sha TEXT NULL, diff --git a/backend/src/services/gitops/store.ts b/backend/src/services/gitops/store.ts index 01727531..0ea3d621 100644 --- a/backend/src/services/gitops/store.ts +++ b/backend/src/services/gitops/store.ts @@ -265,13 +265,15 @@ export class GitOpsStore { `INSERT INTO gitops_create_checkpoints ( application_id, stack_name, phase, generation_id, operation_id, repo_url, branch, compose_path, compose_paths_json, context_dir, sync_env, env_path, auth_type, - encrypted_token, auto_apply_on_webhook, auto_deploy_on_apply, commit_sha, + encrypted_token, encrypted_deploy_key, ssh_known_hosts_entry, ssh_host_key_fingerprint, + auto_apply_on_webhook, auto_deploy_on_apply, commit_sha, applied_spec_json, created_managed_root, created_at, updated_at - ) VALUES (${Array(21).fill('?').join(', ')})`, + ) VALUES (${Array(24).fill('?').join(', ')})`, ).run( row.application_id, row.stack_name, row.phase, row.generation_id, row.operation_id, row.repo_url, row.branch, row.compose_path, row.compose_paths_json, row.context_dir, - row.sync_env, row.env_path, row.auth_type, row.encrypted_token, row.auto_apply_on_webhook, + row.sync_env, row.env_path, row.auth_type, row.encrypted_token, row.encrypted_deploy_key, + row.ssh_known_hosts_entry, row.ssh_host_key_fingerprint, row.auto_apply_on_webhook, row.auto_deploy_on_apply, row.commit_sha, row.applied_spec_json, row.created_managed_root, row.created_at, row.updated_at, ); diff --git a/backend/src/services/gitops/types.ts b/backend/src/services/gitops/types.ts index 72702f7c..052d6a0e 100644 --- a/backend/src/services/gitops/types.ts +++ b/backend/src/services/gitops/types.ts @@ -120,6 +120,9 @@ export type GitOpsCreateCheckpointRow = { env_path: string | null; auth_type: string; encrypted_token: string | null; + encrypted_deploy_key: string | null; + ssh_known_hosts_entry: string | null; + ssh_host_key_fingerprint: string | null; auto_apply_on_webhook: number; auto_deploy_on_apply: number; commit_sha: string | null; diff --git a/backend/src/utils/gitSourceHttp.ts b/backend/src/utils/gitSourceHttp.ts index 0ac5a907..b7d6fe8f 100644 --- a/backend/src/utils/gitSourceHttp.ts +++ b/backend/src/utils/gitSourceHttp.ts @@ -26,6 +26,7 @@ export function gitSourceStatus(code: GitSourceErrorCode): number { case 'FILE_NOT_FOUND': return 404; case 'UNSUPPORTED_REF': + case 'SSH_HOST_KEY_FAILED': return 400; case 'STALE_PLAN': case 'PLAN_BLOCKED': diff --git a/docs/features/git-sources.mdx b/docs/features/git-sources.mdx index e805ccaa..eca271d4 100644 --- a/docs/features/git-sources.mdx +++ b/docs/features/git-sources.mdx @@ -55,7 +55,7 @@ These are the states you will see most often. The last two matter most. Sencho reports an interrupted operation as unknown rather than guessing, so a stack whose pull was cut short by a restart says so instead of quietly reading as up to date. - Changing the repository, the ref, the compose files, the project directory, or the `.env` sync clears any staged commit, because the plan was built against the settings you just replaced. Pull again to rebuild it. The state moves to **Reconcile required** if a commit had already been accepted, and to **Never reconciled** if none ever was. Changing only the token or the apply behavior leaves a staged commit alone, since neither changes what would be materialized. + Changing the repository, the ref, the compose files, the project directory, or the `.env` sync clears any staged commit, because the plan was built against the settings you just replaced. Pull again to rebuild it. The state moves to **Reconcile required** if a commit had already been accepted, and to **Never reconciled** if none ever was. Changing only the token, deploy key, host-key trust, or the apply behavior leaves a staged commit alone, since neither changes what would be materialized. ### When part of the state could not be proven @@ -69,7 +69,7 @@ These are qualifications, not failures. The state above them is real, and the li Skip the "empty stack then link later" detour and point at a repo from the start. Click **Create Stack** in the sidebar, switch to the **From Git** tab, and fill in the same fields you would on the Git Source panel. - New stack dialog with the From Git tab selected, showing stack name, repository URL, branch, compose path, sibling .env toggle, authentication toggle, apply behavior radio group, a Deploy after create checkbox, and an HTTPS REPOS ONLY footer hint + New stack dialog with the From Git tab selected, showing stack name, repository URL, branch, compose path, sibling .env toggle, authentication options, apply behavior radio group, and a Deploy after create checkbox Sencho fetches the compose files, validates the merged result with `docker compose config`, writes them to a fresh stack directory, and links the Git source in one step. The last-applied commit SHA is seeded from the fetch so the first manual pull starts from a clean classified plan. @@ -89,12 +89,12 @@ Tick **Deploy after create** to run `docker compose up -d` immediately after the | Field | Description | |-------|-------------| -| **Repository URL** | `https://github.com/your-org/your-repo.git` (HTTPS only) | +| **Repository URL** | HTTPS (`https://github.com/your-org/your-repo.git`) or SSH (`git@github.com:your-org/your-repo.git`, or `ssh://git@host:port/path` when the server uses a nonstandard port) | | **Ref** | Branch, tag, or full commit SHA to track (e.g. `main`, `v1.0`, or a 40-character SHA) | | **Compose files** | One or more paths within the repo, merged in the listed order (e.g. `deploy/base.yaml` then `deploy/prod.yaml`). The first file is the primary. Reorder by dragging (or the up/down arrows on a phone) and remove with the **×** button. | | **Project directory** | Optional path within the repo passed to `docker compose --project-directory`, so relative build contexts, bind mounts, and `env_file` references resolve from that base. Leave blank to use the stack root. | | **Also sync sibling `.env` file** | When enabled, also pulls the `.env` from the same directory as the primary compose file. The form shows the resolved path inline (e.g. `deploy/.env` for a primary at `deploy/compose.yaml`). | -| **Authentication** | **Public (no auth)** for public repos, **Personal Access Token** for private repos | +| **Authentication** | **Public (no auth)** for public repos, **Personal Access Token** for private HTTPS repos, or **SSH deploy key** for private SSH repos | | **Apply behavior** | See the three modes below | Saving runs a reachability check against the repository. If the URL is wrong, the token is invalid, the ref does not exist, or a file is missing, Sencho surfaces the error inline and nothing is persisted. @@ -180,7 +180,9 @@ See the [Webhooks](/features/webhooks) page for the full signing protocol. ## Private repositories -For private repositories, use a Personal Access Token scoped to read access on the target repo: +### HTTPS with a personal access token + +For private repositories over HTTPS, use a Personal Access Token scoped to read access on the target repo: - **GitHub**: a fine-grained PAT with **Contents: Read** permission on the repo, or a classic PAT with the `repo` scope. - **GitLab**: a project or group access token with the `read_repository` scope. @@ -190,6 +192,21 @@ Paste the token into the **Token** field and save. Sencho stores it encrypted at The encryption boundary covers the pending update payload too: every pull caches the fetched compose and env content in the database so the change plan can reopen without a refetch, and that cached content is encrypted at rest in the same way as the token, since compose files routinely embed secrets via env interpolation. +### SSH with a deploy key + +For private repositories over SSH, paste a read-only deploy key and confirm the server's host key before saving. + +1. Generate an ed25519 key pair on a trusted machine (`ssh-keygen -t ed25519 -f deploy-key -N ""`). +2. Add the public key to the Git host as a deploy key with read access (GitHub: **Settings → Deploy keys** on the repository). +3. In Sencho, set **Authentication** to **SSH deploy key**, paste the private key, then click **Fetch host key fingerprint**. Sencho probes the host with `ssh-keyscan`, shows the SHA256 fingerprint, and stores the matching `known_hosts` line. +4. Save. Sencho stores the private key encrypted at rest and never returns it in API responses or UI. + +Sencho verifies the host key on every fetch (`StrictHostKeyChecking=yes` against the stored line). If the server key changes, pulls fail with a host-key error until you review the new fingerprint and update trust deliberately. + +Use an `ssh://` URL when the Git server listens on a nonstandard port (for example `ssh://git@git.example.com:2222/org/repo.git`). The familiar `git@host:org/repo.git` form assumes port 22. + +Switching authentication back to **Public (no auth)** or to a token clears the stored deploy key and host-key trust. + ## Local edits vs Git Sencho classifies every managed path against the last applied generation and the live disk. @@ -214,7 +231,7 @@ Pulls, applies, and create-from-git operations on the same stack are serialized - You supplied a token and the Git host rejected it outright. The token is missing, expired, or lacks read access. Generate a new token and replace the value in the **Token** field. Sencho returns this as a 400 form error rather than a 401, so an upstream auth failure does not sign you out of the dashboard. + The Git host rejected the credentials you supplied. For HTTPS, the token may be missing, expired, or lack read access: generate a new token and replace the value in the **Token** field. For SSH, the deploy key may be wrong or not registered on the host: paste the matching private key or add the public key on the Git host. Sencho returns this as a 400 form error rather than a 401, so an upstream auth failure does not sign you out of the dashboard. @@ -281,14 +298,18 @@ Pulls, applies, and create-from-git operations on the same stack are serialized Git Sources materializes the complete project, including recursive `include:` and `extends.file` dependencies, service env files, file-backed configs and secrets, and build contexts. If a referenced file is still missing, the pull refused it and the refusal message names the path and the reason (out-of-bound path, Git LFS pointer, submodule, symlink, or a size cap). Fix the declaration in the repository and pull again. - - Git Sources fetch over HTTPS only. SSH clone URLs (`git@host:org/repo.git`) and custom protocols are rejected with a client-side validation error. Paste the `https://...` URL and use a Personal Access Token for authentication on private repositories. + + The server's SSH host key no longer matches the fingerprint you accepted. This can mean a MITM risk or an intentional key rotation on the host. Click **Fetch host key fingerprint** again, compare the SHA256 value out of band with your operator, and save only if you intend to trust the new key. + + + + Git Sources accept `https://` URLs and SSH URLs (`git@host:org/repo.git` or `ssh://git@host:port/path`). Other schemes are rejected at save time. ## Known limitations -- **HTTPS only.** SSH URLs and SSH keys are not supported. Use a Personal Access Token for private repos. +- **HTTPS and SSH.** HTTPS uses tokens; SSH uses deploy keys with strict host-key verification. Custom URL schemes are not supported. - **No Git LFS.** Compose and env files stored via LFS are rejected. Commit plain files instead. - **No submodules.** Submodule contents are not fetched. Inputs and build contexts that reference submodule contents are refused with an actionable message; a warning is shown when `.gitmodules` is present. - **Refs, not arbitrary commits.** Sources follow a branch head, a tag, or a pinned commit SHA. Each pull resolves the configured ref to the exact commit it currently points at and pins that SHA, so apply always materializes the reviewed revision. A commit SHA not advertised by the Git host is refused. diff --git a/docs/features/stack-management.mdx b/docs/features/stack-management.mdx index 4727ccf3..2cc05ad5 100644 --- a/docs/features/stack-management.mdx +++ b/docs/features/stack-management.mdx @@ -59,11 +59,11 @@ The **From Git** tab clones a public or private repository and treats its compos Fill in: - **Stack Name**: same naming rules as the Empty tab. -- **Repository URL**: HTTPS only. SSH URLs are not supported. +- **Repository URL**: HTTPS (`https://github.com/org/repo.git`) or SSH (`git@github.com:org/repo.git`, or `ssh://git@host:port/path` for nonstandard ports). - **Branch**: defaults to `main`. - **Compose files**: one or more paths inside the repository, merged in the listed order. Defaults to `compose.yaml`. Browse the repository tree to pick them, or type a path. An optional **Project directory** sets the base for relative paths. - **Also sync sibling .env file**: when checked, a `.env` next to the primary compose file is pulled along with it. -- **Authentication**: pick **Public (no auth)** or **Personal Access Token** for private repos. +- **Authentication**: pick **Public (no auth)** for public repos, **Personal Access Token** for private HTTPS repos, or **SSH deploy key** for private SSH repos (with host-key fingerprint verification). - **Apply behavior**: controls what happens on future webhook pulls: - **Review only**: diffs surface in the sidebar; you apply manually. - **Auto-write files**: pulls write to disk; you redeploy manually. diff --git a/docs/images/git-sources/create-from-git-tab.png b/docs/images/git-sources/create-from-git-tab.png index 7db408a8141cbc808ddd3c189baff11eacdebc40..e73af9b05193d615d377f60ee366de94e056b3bb 100644 GIT binary patch literal 73993 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 z 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

pZmrgg6Dn&u+l)DN#!)5qMk`S|ez8K+!QV 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ⅇ=*ysF6OC8>hHU7Q-*8xq$OF*s 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℞$;P(KvXpI4KT4pTbmUCpRc!N%eyeMva+(Vx!^xu;>Em~7a=1fQ@|b# zuhD?jjOD8hnNGN&%RMo|aM3EnBtwsZhIC4V%#1*LmFvEGLbXTaxTvP>@)T&}9Hz;q zM)HzWIJD4^LF~_SAGbF!K>)wR2wsqOyW|1p0;gemYU<=WiQ8AAz89w;9(UWD^I7UddkmK?RNlo(8-#k0 zEf8b@9=(?G^6w6N2gCXD3D9nBZf*{tPqqEzkj40?gX*dr9F;JD=~Y|AY1~8bv`u2* zd|GAcYAu5{TOi3F>NnMa*G{SHu3ZzSS$_(;Cg5}~$yTErC9Y6<;N;{4Ns`YrHBDPs z6qS`l!4)bYantU=E|tp_Vu2Aw%BS{#m4NAP~$?PR5;U52zPSH#zg$3K>56o?CvUeK3n##(pHKg{?7 zVF*=MmkfqLyB=&7V9NuFp9Fw`4<|cvYEa~;zoeuD)N5=ym7T)2^UaqsBrl||8h0Cj z&)0%v_eLld7!+L3fMK$%`7c<3bg0KZSp&%Gh$QG_h-5X_kl z_G4PlhQC0MgB#pEK!EF`*!TJZJ^D8SQD4|{HehE#@_}|qVF`L#|3JB=0DPd34_SNk zH24;(k&WsH#ALn1dH58}B_h#35Z#~TiwSX|rSC+W{>EG%zHOm!OobT`)E(B-n?R?h z@>t?y<(Pwd1 z55ZlT2z=)|_O~xwC!t!aX-^i>5e>9@ds_qKqsBcjjiI4fwnhYZR|mzbF=nN<)LPu# zMEd(A6F6vEZVQ|_YF|p45C)IbpJfJi^F|W;G_IsR=*-cB5YU=_^9o8_i$WlS7Exph zYlchuui zKQS=|X&)BwEV_3^d4Vtc9;~??nyRdLst9K0pI6TtiG84#&~mwB2TQ{r2)gTV#Z!|I z;g*{)XL*+-i}>E7^*LxcZF+w+BtG9VON13p(2;NG?$99Q zuq5qy4ujsYjsYmalnov8VdBhsST5<2?)j)UD-Ll4A zArbD3r0wl(Sl_;!Ouce9BbE#VKsfTA@CoE$zU!^F97SX!LGSXy{5#y0d^tISmH8$Q zZrvvWMxf8h^$m!HHDcMn)udCO+6#4VV>k~@WaJ|_#1Sr-<0^0jGzGZ|y_C2?pt=Q5 zgLH#r_z+~l88XvEVJir@xIJK=ZeU*yG<6);`coN=;2oO8RUuoNK`q zoND#}wTN-4hD<`7g4vsuuYAkgyadEqqEX$tNb;>T7VwN}aGx^ z$1`lCv^bU}F7NuP5#NLyUi$T0dkGH1#&QlP6B~SLonZ4Poh6nGO;gI?!ZX)`<<&}!tnN%ys*4fz^*n-|q(B|xXyIN1a*SAsjeOWH#HVD|0 zhBV|i#8tF{sL;vvGfdQ-x#g*)?ZY$}mP(4Jc6qxuuVborCptpC~ydBqVh_1Y5Rbh9cw)Jh0D$$vjC zAdr%N{Wqne?aO0sKvqJQ@a0f46~HrV~<02-HWx7WVgdF*rT}XJQu`l`Y5?rf$HEc z5_Vh(z5KQccx+sD_Ff_tdpWGiYFZ+fWfxzIg;H?S`@>&^NYZ6=UWu{3_f46tFosQb z`i1N64B3G`X$nV4*3paCW8J0`cC#WIj08K0387kAC3hD5{WAO1G&P~$NX$#&kx13^ zxvzhOA~Rpg;AiFZzoroNB=oWw5-xCwHknW0zN2RdAX;f3XEmmNgAFhZDob99IB($A1oLi!6t1^h zmsHq`hCU4LYt59*%$-TGMicgl#zb(G=;T8AC* z(jFFXvnFCcWuI(6Iqv@W`gV^?)&}2awV2in*K6%LZI0^fiNU5#jT_s>_0 z%+0RLsd6JJ*un)F=uM3)mZ=H4wmo<`i1cJu+8j7<=KYSn$whM|!@S9@Jdw%q<--Yo zPoxV(EMbi7>JOads<5lQ`o<7K3=fVRO&9e0W{-I2$5BkZWD!u#U}a}iiF&~peQt>4 zDH&`q6vF)3|3()(Z#S%j6$+xB$NQ91lFp&UD)Ym1yq_~M zP%a{fmWiC|ZKnB3Zd@C0eRAB!W;0IWcyPi*{5M!)vce=phrgc+rM|v?Lc03qH=?X1 ztc2Q)y9{G?7A5tc*des0`n8vsLa^d#B(F;j8hNgYoff4@q#4hL4CL2m%~v`yGPwhH zkuN9RG4jG(x{L8$kMxLz`dNo>S}m|@zkR~X@On)tgh}Qz=IDd=YHqeg37Nm$bhKa{@YP$f4M5Iri&(5 zLjrP3B116?wZ`SAa?!eNkw3gf4qVM)tZ_td$=`WisiDMpiG%WIkoQ@1(vm-BL$*IE z&&_cTv5JY$w(K z{y0Cwanawe;+yG_v2wmiImOS&C5k7EWv(c4_&Us^DEO8?`?0z>5AydF)+-pOna8!f z6nJY=R%_<*vfm)8l^XocN%dmSkgU5*Fv&v@G!GFkSXB-(<+Z*%zJH-KH90LFW{1pC#6Zz2=O!PdWv*#0%WtVlQ_Xt?n>f<~xm4tcALDW_NSr z7GkJIJd5rq5}Kr6k{XAv#ECWOmhn4je0QuLv^c=&9sZ82iH6h{<;O3P zh4vPuw}M*zL~Ln!N&|%XXb;-c{Lwe3H*IeGvBIg(-;vF8j&ZqxZXUz%N9s=sf7*R< zZdLII^@=RgzwsBeb3Yy1*p;`tp%mhmuw|R;Iv;&?n^}nev%o2~=skE=opAGfscsJQ zBvYD|{H4u@Z%eb`vBrzajdsal87@OBub(ot>(*S+a|d&YbTxDyQWWGoTa0+Q=i0jR zrzv~F@R82XQJeAKYecDbBqoss?8Alp-AzHJCX`LwFQ*p1yo_J?vYKSvdmNj!u(6<$ z;}n@Vm=Luz%=&N>^K~Ud10Lge*sV;uBCOYzwU6V2alTWQnY<`av0GiKd)*Vec1ki} zXe)Taj*r7qL3TpPY8&&gNHW(u+Uo@#cXiUuNmd+g+yM_7#$6JVqU&lRF>Q33*Cn;v zAIkBvZRn)^QOl{iAEy;;sgX2x<@#LRJFg74`(%Sce9v*_iB_+^sO(Mda2CVQI=>Dl zPo_~>Z|xFNdFgUFwYJbr&BX}f>ObHyim|SFry-qg>%}rohHddyR!V*2#_i73`{6-v z&8C4RN}uM+805go%CkI|$1{(lSu-zJ?YPOJwMLrBG~sSClrDaE0{2&=yXwYCOVEuJ zO?U3FapO+32qV|9cn1~B=w7zV+VZR-&MR5PX8I*f4XNs|$}xYmJ9Z8fHvUS{pI&_D z)@ZaaPbSy4mmGM)4J3UAu;Jlz@*8k|g=>_^nMr2Q|; zajjoZf^JBxdyenMQ?vvg(5pzABl%5~*7mCQh7ccguvX5kzlq9hcRg*PQ>G`y_{BNg zu3sKZkN2C#l?RU8x{s>{cI#wQr8QB~1ENAtQz+1lhc}YyU%n^oW~b{So_%_|xI+x2 zC?78kkx!iadj#JM2?-ZYd z*%uL4h#^^kB~?D>BhrhnCRzLm-IMD{+}|EhPr~_|a6q=5jw& zpB56u&S(mYX@S} zh|nOXuJC7Ff4;Mb%qcVziBl&f{^8m$(iRvDD;uJ~UE*__WMhw zi`?}wKcfQxc-zV705PHB-MJMv@wkft{(w@D_sGZ}{!%esz-&EYfe8?i*loQp4 zMXyaSU|&C!QK_e@DDgr&yYUIG@0vIIA$dl`Z~9KaFKu^kKq@ern|1Mu*ge;8v!trV zaNt#Q+s{f^r%Nkt_?bv)&ki$5@$epK4keNP{qFvyxcv9ASV7CDh?b2Fl&8FcI^@hS zk7mZl$0JguPO$GmNzlLGvss50BLgB)L_IC*zWFx)AiQpvPonpKf@ddhZomm#diKuz z9dXdEd!kAkXIp12Xj4&3{|)zF6#PeGDlk7+bldXLeS9yeS)^AfvkBVb_K1J-)=2EW zc{*Gmb#--nQW#5dX)uv!Duz;&{tI4aTsz`|9|Db62sHG+UG0B=p5kBn8V>3Z!v)g= z01FTu>+cssCGNYw&;||{Xyj~%`W$NG`1r)cAK-tGwv_es^t{meY&+`-onJ6=N!B7f z_pmnP=H|jt>d(gT8wEHG_m$*;x)U)EgOOfh4NgM>S{u`{)T?KGm}ECA~Ec^YP5g3}j+Zzc~3=2}MQDwu4E>RpE>?lz)Yvw zLM<}mKQXhuAyDi+tXl{`G<$({=YXUhPzVx0=fK^IxYA=!M9F1QD!8Vjj2y=jJO(K2n26u>-#HJK+hkzqF(d((b!#faDWc7n-Df_{* zQV_o~v<-pVNDXIhrSmJU=C!5?~h#l4B~`5z&|repjixtr(|~kX%JA9HC#dH zkz!LH(ohwZNs0RlLxOBDMEf~ICfM2$8R|5o_c}aac3cc1iKY;Yuj!S&aE0kjz!lb9 z@P#r9_Uj9`jjxm2@B=1yhTd!)zcf^Bhsp*=>8)|(4|I2gvG!(ZZ8-wduC zdtU+s&C~-uOzwaFSM+OtAuvY>5eEiQgt|i{O<*U+8$>jBKTNrT|l%gxY?p$ay4 zf_r|#qjy2@5gxU#Tsbxhh94?fD`VA*YWsc13CHCH=mu#1Rs0chF*qQQ4)SHME%M}v{6fzcYrIY^6{#z=BuI^8 zK{`je*cJ(x+%`1pxby{NvH*EofxTdI0Gd%Rv;!Tdd|F8XSAEL8U41YWbfk9dEVDV6 zR#!V8EOkNl^*t2Lt-2u(rnf2rox?v0Y z!Nx=dty-g~*U397q=Sh@8tYITzzVp2Y$%doCqp9iQyt2U>Dn@_O5aP*Vm5Ym$Q`J4 zXt%H5xV>pTi)UsH_8TLqmGBqrUVkz1Wt=&IiLl|ATP5PhMks(eX5SH(l3vqTBAACm z4N>2TtIPArJ|WLzi%0}u*;$K=e|$qHP1K7oUaAk)q=S(C{)xAJgM*Y{J_9pZu(=tv zGz95%LG-o(Wax)Oj^0kqv~4=qOLS}kb!nCG)2;P+P}jjic!fZ%68al&~Uz>=I=ZNFY5q=_OK;@t@Il zua3w40|R+>N#*~61t37g!6%A5{SGfNyK+%SWWL8FE-e{%Mv_0_ojn15(25F+g~vWNl3iHU^{&XM+R0_=RT><~n!U2gU0e6PkMF$!5I31cTBqKdb@ zJw_>qHjiYVReV$l-SbE4L()PX!>LNQ0FKDK@f&bav~#H9w6t%AS^xth>InT`F|gLg zbKf9l78WqfW{c9lV=?3H=wcRMW$CRCy;RCZPnfXGVY!>gzjKgy_^%gfRU4T9REEjQ zeRO!(l*GW-0QKLYI>28kK6{#Hp$p4SdcE~j^#?@Oq!sMv?S)kevz0F~0M}5ATbDF8 zGh-k!GdK5&@SJ;@s%pkl37Bs_Fc17pOsNPG3kW)EWk<(DfXtnf28?zKm|Bw|OujT5IGv5%|gc84;90-i!7QfN~-K=(}hm#(6 zpRN)f)-VM&eG)fYxQKGK|j$c99WL0mq%T z9A;H3QJHgG6lU?vzXw0_H_XiF6&G}@FmexYYIAWv3iq0Ht$RW=S%@8}6E7?kjpA#qnYPat1)jq9#z3q9||H(J}q<37eB zcr(nIM6=&@a~wS{hPuNrsK~uzh3&7bbFZBz0@KpgzgxF%Epw!p*6wMQQ6b#5L2c?;VqCF;~22dc<oqf$ zrC&t;5G8|2AY)!)QXS!A&hiBBdb6Bc@=y7;GtOwtT&!_z+N|j6gXXf?Gwm7W*4Q<7n9%YTl3!QX1_M>6Aus#YZu(ZpOk3(TYAgf#`_NttsTQ%na1=6)|NG8*p2-!Ya_{<@|W z%|60^_|B^7n-Z73KAWVR%E*U#N(XcE*Q0ROWuIH^i?#X1)VrBS_(F21SEt3-$9a%a zdN+hy?sH@!d7T`S?pIMYYAf=a(e%bT9Di!~H;^Y;o}jq~stUNGn3%?xbnm)L(1{&+ zAD&$#+-zJ1P%AiCT8Zza&4JfSFWv*m@F4!3W*r8{anS^n=Q*f$li?}-+NJx1Tll_| zYbp9c53@N{&0>1@Jj5&7#+S*y+lZh!N%SlAkeYl@tlo^`w4;0eBOK!lG|Z62^Z z=P?_~muxY?FI@7%Z{B+QIMq$DB`Ax7U4)zEvE6pt65hw(LrIwojS_r4dUQO5`mw>d zBAr7>l`PF)X#mbM6pzH=elVZM?iwM(8b|hF)ZpoXAiZmA$cz#i-(c0tJKf0BuUS%j zRz`P!Vp=1)VoBMzcC~8&oP}f7bwbSwz;{O`8wJUM8Y>}Pj7#wCse<8HLT)E_L+NgN z;r5nbe>{G_h=1@bw8brlGE}=99&6^*pX&dHv-vYLLlImCf&XvRT=lWD-d`j2?dvm*+&?GYUmz{92i6g4Uc7Ohw)tj~AA)l^R%8!G- z#)_7puCoG}K@4(&<&XSV)F4fGYcfv5MD;*WKaV;4EC@4Pq}uou_T$hg$$ucNuV01I zaB6Bf{dwC$F{#8dCNR$Rx77`MzA(k2oS;?>o(NF6U~-Q4T}QdHNQASlE!Q#N+sqhGlUD%Y)2bJ!`SlgZ_4=sgWLbXc)oZ1rXJ1-8$QFR zq!TJW^Kr(m&QR*3@tcGz{)(X*n|rFK+V{J=WJi^dXSoO7J*(i2EZn?PN}5N@7^hUK zg^xx%js7(qNwz08(=L1e1|qpGm97gtEqlOF@aNj}fx-_T@TNp2>N|*@wg}Tozxyy~ zUZ#0RtlInO&bR0KG~1o1yx@GzF}WMG?3>+g{A!IMmp-4cKBdQB`TquQ4ZJQdJV0x@LB2U|Gq=k2 zD~In_bzQd0M2j%KLnPm8eSVI&i&f+fbF481>CEddoRls#j5?}q6I33|5kPRTHBP^* zd5cFb%SZA2ccQNn1F9{G5WiilsyiOO+C)ae*IEa*)ilv}Cs?^Tv(}cjZ`hLIiBHe% zug4U*XZSoI8J>!A5;!n-S|Tlb8yX03_uAT2Kwdv(?xSrlqouenq+`jcr0b1D-ze7U z+;NFo#XGV)WSj!u-=urm5#X5}Ed=haom4>@hW8}wiW!o|s<)O#wbFehUS2tb4zWq| z#!s9(|H!&57Yf>?Cd47ujSz3?y3CjgLgu(fZN=QMUiN>IApM&y1w9#nLZNQ1fL>AK zhIU>tF@f|4PvTq$gaQG{K#83*_+MekE*bLzw!Sjq5GdeqyHu)`)|KQ ze=wvE6!3Zs#1}*1WI>^9=>^1wAe2_nKM1)cD~OLyMBhdp?EmF-DFV*GR$$S0bTnlw z%g;B3%w+Q{k2O`lzZzc=?-D)X-?$S2ql!S-0z~G20sHaD=%|TETWW3ZcZeT>A;fpT z4Fv%as`v&>m9N zvF-^SL!-_MXlPDA-G8XI@h?f&DF7n~5JU3;e3ft*?b&aoc-CrLzY2cX21Gxx>Hk;R zRYpbGwp#?G1%^gKVkBf}5s;7$gAk-dQW}&Nk*=Xb1f&H8LBc^oViXx-Kg*S_{n&a4839Jn7kKz^{QD%A9+)?A0u{U>!wl))=st@1zp^bEK%LF!AvO{!t$}h{i2KBX-OLn; zwLW=+#YT0Ml0lKmB2=vo8S6OfQ8iK)$bMgde zfIu^Mvrk9LVL*A`z0PwM7rj+D4n{LrC}iNVORD7QeNYjB_*=v^^dBcE8pgwc#URtU zeCN)c0AbM7d`2EUh#T4RPy%|miZXGAspCv{4YW2s$+cU0eP_c z7|>g4WTagq7$9dtfd@T%_Uy9}^1T_DAcsXHZMGLlGp}Gl=8JGz1^Yznde<8|p%kgW z7qa>ZVhG`0a0GHQ(+LwiA}+#0ttfvugSG`Q5PJC}X)j$(3mhc#35jfyc3_of_LsIL zjMjeKQuC&`0-Wp|ZxMYr!$q{o{Z25l{Z-q4k=kj2khSoN(H?n{t{etVby%k&1)~lK z<`bE%E!3(yzmC_BkHm4h9)Ih;2xgndJNQd{)sRT@%@#w*rL_Sqm3oMUs=dKWu=oU_ zk0Tshbc!2crqVz78R|hIasKzc)_pEz_V`%eG{DjMzT9W|Nk%kdAXpI~!)t9!`#uaC z7lI4_r;w73N&6H-^#EbmsazFq%%NeaBt7{=;D}uO&xzWQSy6{8RQf=9=xGx2Gr>Al z=MZvl1oXNk!`oo7>hurnn_-!Wje;z^ImX>k9@VC@QyO+uX6UOTw`_M5%u zN(L3}Qg$HQniCf3cjLI2BCAU~ZFC{OE3CcVwPvtllEvJ45IOCCaJ!f!Nv4Q=QOonm zhI0GdPY=bCLf_0io4&)2U#2fD6#4{uvdI=)G;WLkf>2&oE3nYut#H;=TixBfh`i>{ zZrL$NFPsHG^Z&s6GyRxw$hxI7D*e{0LPS({w0l;Wp~@nB$rsS~?gDMQYpwQ&-S z!?vK^KhK=uN{9UpghF6Ja(TN_ia6#%Eb59I)D6y2T6f%S6H&La;`aZT;A@-a6~;%!RwIr*%lS0+_h1P@HIs3e zUdVF`W!;G8?)3;x}ygbK0cV%{XNOnr? z)+7mkXGLLeVltOF5`XFZ^sxH8u+Cu0+nN$|^3)#_PFc_Qt+z4VNcLrwfKX?qpZ1nl z`KzAX|M?oS8OYV3w=Jw1b9^JQpzq8b^{c^unH@rAB{@m6O$|K1XT7H4uci&)=H zV59#;a8I|bbN*8$xLps;7r}yni2R}e%glhu)$7%KEQMezFW4qa08fLM{SSh}bR=^w z?k5o=3A1Qk4);l+Z*UF8IHYnWBoU|u$v&~Y@oS%8!7`@+d6@sMWA^XC&p$&4{~2QX z=RZB0DumY@E*0+Ycn|~J<=_9N1v}+qbPVvl?+JZ4;^^&mxYU2yll({7|9{}ve|SaZ zfTBhf!L2?9rlw(+l@S%~L#UQEHUX|eOO+I?`h*QBIl5T=QANm0F)9`5v$XHOuy{BVT8$}7g$XMXkGC%uL(i)Fw}Q9aK{{~+wofQGRJ!$>ySJ9(s)EbToD zObT)8H5$Acr|jT3Pc9onZZlnhCnH1Qzrtl$p}QuW35rEm`aKrAD#4oPW?2dUAMz5O zWPK*6;s>&&(UE`?jb~WOGawtaI5RaP!|%)eC6J%u%G0rnbNZ_9LLhHP+;8>??%t>Z z%;>^20W=4GjGm2;j|VrLcNIppl+Vs&!fof|SXfxRuU`myt>HE`%=O26>2tt~%U<#e za}(th~JZm!I%u zz=Hz~d^1?WeunMtnd0`OJ+xz*p&^m~OGPPkZ=_JDd+DOQd=pT|gr+OJI(e7XqoI=t zF0939FP1g~LP9;DfpZSW-)D|Iz$9I73SThlHy_g{)$!?@q7~@O-6_J42*;ZhE^L5 zfl3}H-5iAT6f!;5*4&$~ky*Tc0k(&qKnx8)6+JqFz3M_i!Ts>w;3~i0ru!!Bc^VF1hYEMlQ~`xe}c{N31@{9kikP+(H)< zV|yPcRcAbBKxtmZiTwm#Xy$CflDJx}qpfE^eEtdabn`|T#Z01l&AvhGm=T>|qFh*$ zG6?lGF6~V6JTUVR$XZZI6e|+ZNsd#6jxj8~uPzxAQSig1IWyuFrgB1_a;@Csab<};^rO{ zBq(T)?sn|iju$h_4uS>L;iKP@91nbBMmi*y9&JWwE?^BvP6hw!5zG_M97Q=ecYA#{ zS|kV{ATFNQpXRU~GkE^a9-$2lQMjqrZeCsNa#@2=%;=ukSVx?z%hV7f(uxmmr(q~4 z*~E6Lm|6W<8NrteynSlMXRpP)7DoA-*o$*RTp*W(=Hk>3@n{pncn!T5@}9{Y_57E9 zd%kZ9oZICw7r}a8R*d^Ci?BjsU8Wq^Bm9eRa*l{)MYufni*rM0&Tbkxk~S4kPe>M0 zk>MQLS})L_p0itM-pXs8G-!v`BEobptTa%B$WU8uDbL3&GZ+RQ*i6K{uQyf`1pTlP zdFwvWCxn*uv}g26Ek{s`y_-DTZ#`DXq;9#Y*UPzrovXCT;xZ)>gUAii#4Cs^@!1a+ zvz^Ma13jC{(67t#%sNA1!@DSx2sPuTZV)7Ht#CK@qZ1xazjF8xkU-MK9eN`u55aBn zChE*?)I+tttKF?ftF3nA^eF(2-oh}65c+%b5T_A7KCjfNKW~=+!hVk$^ zue{bApvcFvEL)EpV&siR)n}Z=?7UuH3dn?rSnC?mEvkI`M3e!&BVOk8K|<#fUMrW_ z*Mpj_D)yCylalF5EEmtW{T1bN`Q0uk5Sm~L2x}tY?9A5I4zokjSMk5ut6Pr(^-BU+ zmkOBwUWj+W26P^<2eEn8jniGb4a}tdCyW-2iN|S;)jY1sW<5RYEf)7x(jjQujH=Tg zN7La5G{>X4_x62rp$Wf*1>Ws0nb~!enpb&d=Oj;sJQhTkaq&f6(xCb*GQ!R$z1^v3 z=+mlrs~rHoK{PeF z6wHf@)<+B0o=tLH7i+)S1^3C=hj55-IZ_KIilnju=LGx$YDu{NAuT!BiY%DWUAPA` zDnJH!xiX->?oeQ)@n6DAcwR%9j~LIhue{$>P@?NG>CAaLNL)OPPR>ePIz~oCbi*xM z#e^(qJMENZ`V0sJnA#ZCI4BgAApwzsVe=q&=76ldoAe+RK)R_bqgaSj^j`D1R0&k~2}j3(qYcNx4g z_82!U<#r&j^W%VxOw0)`2t8)Kgl}*rL2=RM&4*A0WKl3*Q4&-14?}fzT5yO!($D1} z1dC^oQ0jRcLpO(rS8SY6OMwd9`1=JSEX`w$FI#Za+m8+^L&GahZkQyors*nj`Kmnn%oQ z&LV9)V)?ARd(M)kdZar{)w!TdP(hb3nMb5%yOyJMq-yN?#cA1dIwX`%)f!4`)#?%Q z$qSFR1Rqd4tpei!5>h|uEGiM+y>(-exCx1VwB{09fsuS8@!<38tm0`E;pUFzIMilO zUDeY`n+19NGU@Ypw+NA*2O<_INvsQP_ti%!2SLVV=!(8Cb93{)IcR)%bdkM{o%)3w zOmE0;5ifQAgDV)R-5;%m!mbpS)06e7(GntV9bIpYlG8dr@!Xn3`F1y;MLAfTPLiOE z?@ZTVr+%PTAnM5yJXn9itmX!qvvWd&h=@EzS3}jfE&`X0zuOin=6CFk3A8;KH{EgK zjl*NT5?d@yI)-YMcsOEi@>ZgIBlLqwFvy_k@kd|oaNXVZjJsilYG8E%mp z3Co^mF}LDdV|DR86}Jtl{wf=qsd~L^t;6>g@qzqyyH}*QS4jM2%SHoK-S^o}2Jx}~P&gCHR+bqYP-74K?3wW}RuY4CH>$S$U)bwG<-OmSe$CMgueS`1-0 zChxI6fW3o^EA9n|VV-KuouTp*lgUgiazXC$Jb7ljh0>cV_P(Jz?Pov+964_nS7{Am zvG*I+4_;iJc69Z6QPH!YTb7TZGILKN}9VO7C%#8`gOdkBVU@XL#Jzg zi`x)Rc(~Ck$%3zYoRRSxPE(szjLTzf+%rpiuR8;#)Rad_((0WK4feEZTK#C(&&__b zGYU)T?cUv(0StcVn$3{GniRpz5=I4l$(Ic z-(9Xj#Fp3vDp`-KY?z&w=xN0CGMrh0*v({Jbx{mWN0M3atL`1p#qIJ;|H(_g6_AzF z!%`D)z!Bhl;f-B%+r>yK!0U%Vf_ssDNTiH@w{{4eUKduv)vnt&!&HmwNJ(bDh$&Zq zO_FH>_PsUqF8Xw}*mgRGA(b1Ospo^pZIE~> zujLg|5m7K%&tawCp=@^KTt8N?KtVx=>nD@~9KYpGndw$Dj_)@@7Sjd}j_N^QX^pq%8$r=#l6;?@Il~3D6 z@N3!R2-s5yH*N!p9>+X(>_Is@Z?%3%eZKT zDr|jr8i|CILkgtH%KHRy1Bn_#Ool8&j||R)mYCDHTgL8vX^pFB8@fGQOCOYVOte?9YKWg zI~GJuBaCB9mU6Zp?X41GAIWLhz9NaE@?t59STo}&E|k842r-s2K+*@S83qW zW2baG-4UfTYOxE4T#w6G7|Lt|x8v#gHjH=f+3+nde-r`!6aLQDX-}DTN1=1&tP+*ul%3~Guvr}q4M>K+3Fw1BSnfwUG+O?8S zuM8Q%NT*6jNC;?dK|=gJM5p*dco;~9TmTs9Md;}3XA$@W78v%TW#DZMyb#lXghrv)g3~L&g>OEW&8Lt?AKtXmOye{B;8Z4A8!W zYKcUE&@V>$o7?=Mf>H;mmj7tq*4NNMAOYO z=eHLU2l6v4jI{qv8AYgASWLN)Cq9K1+C~cQ?+lF-5z+3vR?lTB8yndKE1~lGyL&bd z42*UI{YxgFR=onnxEO@7v4$aBSklS9SK8G~OiTy%mwLU{lTreUY!{P+tAR8tUJN@| z^6VMUbqcm&zqLup&BliZ-kP+0iREGsC4oqjArGob7i&0nh&!euB04_SIU?>SA|fIq c9L*#|Iyg;n%L_9J@EamsO+AfjHJgb40+(^UJ^%m! diff --git a/docs/images/git-sources/panel.png b/docs/images/git-sources/panel.png index 37efdc1ec3e8a08cafe271e873b28811d2eb28b3..02cbd8ce5d71aff6cf3d0de55eaf9afbe1f4eab3 100644 GIT binary patch literal 80060 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 IhUJrg0YPFCfdBvi literal 58700 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 i~VWwib!U z9ZyMlQDUINwgj`)Uw@R$70!A(^|jy(tZ|2*4WYNfV*-OfUabJFL69=-V21h>sUfct z+;$0ijIT?DP@sAgyBK|lXd-%-73La=(f6Ei2^_2#CeAJ+tUZf@!Oh+#eo8Z61=E@uPQ+M~OF=N?P^w$wa z5*L%A_k^lR*Js`WqvC*96UF;2uExA_4G(_SI5x5((bo`0h76PyRS|od(ZvKMNm*sG ztWY&dsjN?&=5#5MZw>U_*ig|u@AL}zh-kMM@FiOboI?DQguCg$7Z2nAww3Yf zMOf&kae&JxYNLl_vE!+VJ`*i11I0v`RR_u)f8qPxzv_Ru0NlPILMOTz z7mT|+I`%u?NHjGy7UlCb9xY3gVXVC`u-ErFk*Xb(eYN0m<%2UFNR56sZpC)2_1dtfu4oA7u};1icZl9 zje!+LuMLsZj4?k8`1Td=@(B|-0h*G_bx*^bVS~~Gd?B!jZYi%> znCR0Lb`S`=kQoG5kf=DrmP(klocO%wqzfYM7CpCf%3usD2gZesl<;wkM1XUIs%QuN?unQ?mwR?3r%mnBun!R==4KrW_L~jVE@QSD} zoIl5UAPi21{b0E;65CBKg-4VHoJ;Wc!*KQLQQNU{I2OFN<|4z5!4_3bhfT%6{rA9C z?aYPvZ);7uqaEhp39QX-Hq14LXB)SPE>nG9a;6x!?ly`J3!a3JzldSlXC`7P6Ta29 z?VK^luc9ZS`M^;Wj!xWJJ`5qOBUak-Tz@Jk?Hm=yaSxdOayy$42EO~jTwFS*`7EW@ zs#C=<-LS1Uj@-I6aI@V>kZ=uHBYLu%j!KZFnFeJy&M@n(EJA7Na$ZG&B z4)?hJ;2UlzOm|bE_N+-NtjknScVp423Q%XyOw)5h;UzKUSvp!|NIiUw#|7;{@f7&> z>F}KElL1E)T`9_-_-J-0(Ns8o_-iStQh`vX=Z>ijlRuVRmw(x{@<`cF4HSP$w&UI5 zs9^D(oDZ|5*UdKd?9=5lD|E?>=T-L)gUlv6jxZG;9&ktdH_GW*v^eylp#qq3&ORHb zO|>+17a1L~mG7^VFn=cfn`V@;CL_{rmYM%~&B3d9e)gmu*zaaBP@^=(C^p@TnYA(L3r11qW9-hkN1E4 zGnQX8{c;Nmf2yq1DT`%HdWu4nJk~;=>q*j6%dSxv1Q{X1)x1C^>6JB}**b)Dv2=9D z&LPK*DvRB3y6xn89~nMaP#C%+8q)A~el%rM#*e!`FwgVd@_}zQ2+r?tУrP@z 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 MgNOawiy_H>0nKmtTL1t6 diff --git a/docs/images/stack-management/create-stack-git.png b/docs/images/stack-management/create-stack-git.png index 2af02d170bc932215a768107a2314194b4cdd25a..ced6718f07814cd624ccc17b93ba1d22ac03853c 100644 GIT binary patch literal 73930 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 z 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

pZmrgg6Dn&u+l)DN#!)5qMk`S|ez8K+!QV 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 literal 102476 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 diff --git a/e2e/git-sources.spec.ts b/e2e/git-sources.spec.ts index d3712c8e..420534f8 100644 --- a/e2e/git-sources.spec.ts +++ b/e2e/git-sources.spec.ts @@ -9,6 +9,7 @@ import { test, expect, Page } from '@playwright/test'; import { loginAs } from './helpers'; import { gitAvailable, buildFixtureRepo, serveRepos, fullProjectFiles, multiFileFiles, refusalFiles } from './gitServer.helper'; +import { sshGitFixtureAvailable, startSshGitFixture, type SshGitE2eFixture } from './sshGit.helper'; const TEST_STACK = 'e2e-git-source-stack'; @@ -64,14 +65,14 @@ test.describe('Git Sources', () => { await expect(page.locator('[data-stacks-loaded="true"]')).toBeAttached({ timeout: 15_000 }); }); - test('rejects non-HTTPS repository URLs client-side', async ({ page }) => { + test('rejects unsupported repository URL schemes client-side', async ({ page }) => { await openGitSourcePanel(page); - await page.locator('#git-source-repo').fill('git@github.com:org/repo.git'); + await page.locator('#git-source-repo').fill('http://github.com/org/repo.git'); await page.locator('#git-source-branch').fill('main'); await page.getByRole('dialog').getByRole('button', { name: /^Save$/ }).click(); - await expect(page.getByText(/Only HTTPS repository URLs are supported/i)).toBeVisible({ timeout: 5_000 }); + await expect(page.getByText(/Use an https:\/\/ URL or an SSH URL/i)).toBeVisible({ timeout: 5_000 }); }); test('surfaces reachability error on save with unreachable repo', async ({ page }) => { @@ -241,15 +242,15 @@ test.describe('Create stack from Git', () => { await expect(page.getByRole('dialog').getByRole('tab', { name: /From Git/i })).toBeVisible(); }); - test('From Git tab rejects non-HTTPS URLs client-side', async ({ page }) => { + test('From Git tab rejects unsupported URL schemes client-side', async ({ page }) => { await openCreateStackDialog(page); await page.getByRole('dialog').getByRole('tab', { name: /From Git/i }).click(); await page.locator('#create-git-stack-name').fill(CREATE_FROM_GIT_STACK); - await page.locator('#git-source-repo').fill('git@github.com:org/repo.git'); + await page.locator('#git-source-repo').fill('http://github.com/org/repo.git'); await page.locator('#git-source-branch').fill('main'); await page.getByRole('dialog').getByRole('button', { name: /Create from Git/i }).click(); - await expect(page.getByText(/Only HTTPS repository URLs are supported/i)).toBeVisible({ timeout: 5_000 }); + await expect(page.getByText(/Use an https:\/\/ URL or an SSH URL/i)).toBeVisible({ timeout: 5_000 }); }); test('backend rejects .git/config compose_path on from-git', async ({ page }) => { @@ -646,3 +647,53 @@ test.describe('Git Sources complete-project materialization (local git server)', await expect(applyBtn).toBeVisible(); }); }); + +test.describe('Git Sources SSH deploy key (real backend)', () => { + test.skip(!sshGitFixtureAvailable(), 'requires git and openssh-server'); + + let fixture: SshGitE2eFixture; + + test.beforeAll(async ({ browser }) => { + fixture = await startSshGitFixture(22224); + const page = await browser.newPage(); + await loginAs(page); + await deleteTestStackViaApi(page); + await createTestStackViaApi(page); + await page.close(); + }); + + test.afterAll(async ({ browser }) => { + fixture?.close(); + const page = await browser.newPage(); + await loginAs(page); + await deleteTestStackViaApi(page); + await page.close(); + }); + + test.beforeEach(async ({ page }) => { + await loginAs(page); + await expect(page.getByRole('button', { name: 'Create Stack' })).toBeVisible({ timeout: 15_000 }); + await expect(page.locator('[data-stacks-loaded="true"]')).toBeAttached({ timeout: 15_000 }); + }); + + test('probes host key, saves deploy key, and redacts credentials on GET', async ({ page }) => { + await openGitSourcePanel(page); + await page.locator('#git-source-repo').fill(fixture.repoUrlSsh); + await page.locator('#git-source-branch').fill('main'); + await page.getByRole('button', { name: 'Deploy key (SSH)' }).click(); + await page.getByRole('button', { name: 'Fetch host key fingerprint' }).click(); + await expect(page.getByText(fixture.firstFingerprint, { exact: true })).toBeVisible({ timeout: 15_000 }); + await page.locator('textarea').fill(fixture.deployPrivateKey); + await page.getByRole('dialog').getByRole('button', { name: /^Save$/ }).click(); + await expect(page.getByText('Git source saved.')).toBeVisible({ timeout: 30_000 }); + + const getBody = await page.evaluate(async (name) => { + const res = await fetch(`/api/stacks/${name}/git-source`, { credentials: 'include' }); + return res.json(); + }, TEST_STACK); + expect(getBody.auth_type).toBe('deploy_key'); + expect(getBody.has_deploy_key).toBe(true); + expect(getBody.ssh_host_key_fingerprint).toBe(fixture.firstFingerprint); + expect(JSON.stringify(getBody)).not.toContain('BEGIN OPENSSH'); + }); +}); diff --git a/e2e/screenshots.spec.ts b/e2e/screenshots.spec.ts index be50606a..b16cb4d8 100644 --- a/e2e/screenshots.spec.ts +++ b/e2e/screenshots.spec.ts @@ -156,6 +156,46 @@ async function openStubbedChangePlan(page: Page, stackName: string) { await expect(page.getByTestId('git-plan-op').first()).toBeVisible({ timeout: 10_000 }); } +test.describe('git source authentication docs screenshots', () => { + test.use({ viewport: { width: 1920, height: 1080 } }); + + test('git source panel with deploy key controls', async ({ page }) => { + await loginAs(page); + const stackName = 'docs-git-panel'; + await createStack(page, stackName); + await page.goto('/'); + await page.getByText(stackName).first().click(); + await page.getByRole('button', { name: /Git Source/i }).click(); + await expect(page.getByRole('dialog').getByRole('heading', { name: /git source/i })).toBeVisible(); + await page.locator('#git-source-repo').fill('git@github.com:example/demo.git'); + await page.getByRole('button', { name: 'Deploy key (SSH)' }).click(); + await expect(page.getByRole('button', { name: 'Fetch host key fingerprint' })).toBeVisible(); + const dialog = page.getByRole('dialog'); + await dialog.screenshot({ + path: path.join(DOCS_IMAGES, 'git-sources', 'panel.png'), + }); + await page.evaluate(async (name) => { + await fetch(`/api/stacks/${name}`, { method: 'DELETE', credentials: 'include' }).catch(() => {}); + }, stackName); + }); + + test('create stack from git tab with deploy key options', async ({ page }) => { + await loginAs(page); + await page.getByRole('button', { name: 'Create Stack' }).click(); + const dialog = page.getByRole('dialog'); + await dialog.getByRole('tab', { name: 'From Git' }).click(); + await expect(dialog.getByText('HTTPS OR SSH REPOS')).toBeVisible(); + await dialog.getByRole('button', { name: 'Deploy key (SSH)' }).click(); + await expect(dialog.getByRole('button', { name: 'Fetch host key fingerprint' })).toBeVisible(); + await dialog.screenshot({ + path: path.join(DOCS_IMAGES, 'git-sources', 'create-from-git-tab.png'), + }); + await dialog.screenshot({ + path: path.join(DOCS_IMAGES, 'stack-management', 'create-stack-git.png'), + }); + }); +}); + test.describe('classified change-plan docs screenshots', () => { test.use({ viewport: { width: 1920, height: 1080 } }); diff --git a/e2e/sshGit.helper.ts b/e2e/sshGit.helper.ts new file mode 100644 index 00000000..405841f9 --- /dev/null +++ b/e2e/sshGit.helper.ts @@ -0,0 +1,185 @@ +/** + * Local SSH git server for E2E specs. + * + * Spins up openssh-server with a forced git-upload-pack command and a bare + * repository containing compose.yaml so Git Source dry-run validation passes. + */ +import { createHash } from 'crypto'; +import { spawn, spawnSync } from 'child_process'; +import { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'fs'; +import net from 'net'; +import os from 'os'; +import path from 'path'; + +export function sshGitFixtureAvailable(): boolean { + return spawnSync('git', ['--version'], { stdio: 'ignore' }).status === 0 + && spawnSync('/usr/sbin/sshd', ['-V'], { stdio: 'ignore' }).status === 0; +} + +const COMPOSE_FIXTURE = `services: + web: + image: nginx +`; + +function runGit(cwd: string, args: string[]): string { + const r = spawnSync('git', args, { cwd, encoding: 'utf8' }); + if (r.status !== 0) throw new Error(`git ${args.join(' ')} failed: ${r.stderr}`); + return r.stdout.trim(); +} + +function generateKeyPair(dir: string, name: string): { privatePem: string; publicLine: string; privatePath: string } { + const privatePath = path.join(dir, name); + const gen = spawnSync('ssh-keygen', ['-t', 'ed25519', '-N', '', '-f', privatePath, '-q'], { encoding: 'utf8' }); + if (gen.status !== 0) throw new Error(`ssh-keygen failed: ${gen.stderr}`); + return { + privatePath, + privatePem: readFileSync(privatePath, 'utf8'), + publicLine: readFileSync(`${privatePath}.pub`, 'utf8').trim(), + }; +} + +function buildBareRepo(): { bareDir: string; scratchDirs: string[] } { + const srcDir = mkdtempSync(path.join(os.tmpdir(), 'sencho-e2e-ssh-src-')); + writeFileSync(path.join(srcDir, 'compose.yaml'), COMPOSE_FIXTURE); + runGit(srcDir, ['init', '-b', 'main']); + runGit(srcDir, ['config', 'user.email', 'e2e@sencho.test']); + runGit(srcDir, ['config', 'user.name', 'Sencho E2E SSH']); + runGit(srcDir, ['add', '-A']); + runGit(srcDir, ['-c', 'commit.gpgsign=false', 'commit', '-m', 'fixture']); + const bareRoot = mkdtempSync(path.join(os.tmpdir(), 'sencho-e2e-ssh-bare-')); + const bareDir = path.join(bareRoot, 'repo.git'); + const clone = spawnSync('git', ['clone', '--bare', '--quiet', srcDir, bareDir], { encoding: 'utf8' }); + if (clone.status !== 0) throw new Error(`git clone --bare failed: ${clone.stderr}`); + return { bareDir, scratchDirs: [srcDir, bareRoot] }; +} + +async function waitForPort(host: string, port: number, timeoutMs = 10_000): Promise { + const start = Date.now(); + while (Date.now() - start < timeoutMs) { + try { + await new Promise((resolve, reject) => { + const socket = net.connect({ host, port }, () => { + socket.end(); + resolve(); + }); + socket.on('error', reject); + }); + return; + } catch { + await new Promise((r) => setTimeout(r, 50)); + } + } + throw new Error(`port ${port} did not open within ${timeoutMs}ms`); +} + +function fingerprintFromKnownHostsLine(line: string): string | null { + const trimmed = line.trim(); + if (!trimmed) return null; + const parts = trimmed.split(/\s+/); + let keyBase64: string | null = null; + for (let i = 0; i < parts.length - 1; i += 1) { + if (parts[i].startsWith('ssh-') || parts[i].startsWith('ecdsa-') || parts[i].startsWith('sk-')) { + keyBase64 = parts[i + 1]; + break; + } + } + if (!keyBase64) return null; + const digest = createHash('sha256').update(Buffer.from(keyBase64, 'base64')).digest('base64').replace(/=+$/, ''); + return `SHA256:${digest}`; +} + +function runSshKeyscan(host: string, port: number): { knownHostsEntry: string; firstFingerprint: string } { + const args = port === 22 ? ['-H', host] : ['-p', String(port), '-H', host]; + const result = spawnSync('ssh-keyscan', args, { encoding: 'utf8' }); + if (result.status !== 0 && !result.stdout.trim()) { + throw new Error(result.stderr.trim() || 'ssh-keyscan failed'); + } + const lines = result.stdout.trim().split(/\r?\n/).filter((l) => l.trim() && !l.trim().startsWith('#')); + if (lines.length === 0) throw new Error('ssh-keyscan returned no host keys'); + const firstFingerprint = fingerprintFromKnownHostsLine(lines[0]); + if (!firstFingerprint) throw new Error('ssh-keyscan line could not be fingerprinted'); + return { knownHostsEntry: lines.join('\n'), firstFingerprint }; +} + +export interface SshGitE2eFixture { + port: number; + repoUrlSsh: string; + deployPrivateKey: string; + knownHostsEntry: string; + firstFingerprint: string; + close: () => void; +} + +export async function startSshGitFixture(port = 22224): Promise { + const repo = buildBareRepo(); + const sshRoot = mkdtempSync(path.join(os.tmpdir(), 'sencho-e2e-ssh-sshd-')); + const scratchDirs = [...repo.scratchDirs, sshRoot]; + const cleanupScratch = (): void => { + for (const dir of scratchDirs) { + try { + rmSync(dir, { recursive: true, force: true }); + } catch { + // best effort + } + } + }; + + const deploy = generateKeyPair(sshRoot, 'deploy'); + const hostKey = generateKeyPair(sshRoot, 'host'); + const authorizedKeysPath = path.join(sshRoot, 'authorized_keys'); + const forced = `command="git-upload-pack '${repo.bareDir}'",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ${deploy.publicLine}`; + writeFileSync(authorizedKeysPath, `${forced}\n`, { mode: 0o600 }); + + const configPath = path.join(sshRoot, 'sshd_config'); + const pidPath = path.join(sshRoot, 'sshd.pid'); + writeFileSync( + configPath, + [ + `Port ${port}`, + 'ListenAddress 127.0.0.1', + `HostKey ${hostKey.privatePath}`, + `AuthorizedKeysFile ${authorizedKeysPath}`, + `PidFile ${pidPath}`, + 'UsePAM no', + 'PasswordAuthentication no', + 'PubkeyAuthentication yes', + 'X11Forwarding no', + 'StrictModes no', + 'LogLevel ERROR', + ].join('\n'), + { mode: 0o600 }, + ); + + const child = spawn('/usr/sbin/sshd', ['-D', '-f', configPath, '-e'], { + stdio: ['ignore', 'pipe', 'pipe'], + }); + let stderr = ''; + child.stderr?.on('data', (chunk: Buffer) => { stderr += chunk.toString('utf8'); }); + + try { + await waitForPort('127.0.0.1', port); + } catch (e) { + child.kill('SIGKILL'); + cleanupScratch(); + throw new Error(`sshd did not come up on port ${port}: ${stderr.trim() || '(no stderr)'}`, { cause: e }); + } + + const { knownHostsEntry, firstFingerprint } = runSshKeyscan('127.0.0.1', port); + const sshUser = os.userInfo().username; + const repoUrlSsh = `ssh://${sshUser}@127.0.0.1:${port}${repo.bareDir}`; + + let closed = false; + return { + port, + repoUrlSsh, + deployPrivateKey: deploy.privatePem, + knownHostsEntry, + firstFingerprint, + close: () => { + if (closed) return; + closed = true; + child.kill('SIGTERM'); + cleanupScratch(); + }, + }; +} diff --git a/frontend/src/components/EditorLayout/CreateStackDialog.tsx b/frontend/src/components/EditorLayout/CreateStackDialog.tsx index 8d36357f..cc721c9a 100644 --- a/frontend/src/components/EditorLayout/CreateStackDialog.tsx +++ b/frontend/src/components/EditorLayout/CreateStackDialog.tsx @@ -9,6 +9,7 @@ import { Checkbox } from '../ui/checkbox'; import { GitSourceFields, type ApplyMode } from '../stack/GitSourceFields'; import type { GitBrowseResult } from '../stack/GitComposeFilePicker'; import { apiFetch } from '@/lib/api'; +import { isSupportedGitRepoUrl, UNSUPPORTED_GIT_REPO_URL_MESSAGE } from '@/lib/gitRepoUrl'; import { toast } from '@/components/ui/toast-store'; import { useNodes } from '@/context/NodeContext'; import { cn } from '@/lib/utils'; @@ -69,11 +70,15 @@ export function CreateStackDialog({ open, onOpenChange, onStackCreated, onStacks const [gitComposePaths, setGitComposePaths] = useState(['compose.yaml']); const [gitContextDir, setGitContextDir] = useState(''); const [gitSyncEnv, setGitSyncEnv] = useState(false); - const [gitAuthType, setGitAuthType] = useState<'none' | 'token'>('none'); + const [gitAuthType, setGitAuthType] = useState<'none' | 'token' | 'deploy_key'>('none'); const [gitToken, setGitToken] = useState(''); + const [gitDeployKey, setGitDeployKey] = useState(''); + const [gitSshKnownHostsEntry, setGitSshKnownHostsEntry] = useState(''); + const [gitSshHostKeyFingerprint, setGitSshHostKeyFingerprint] = useState(''); const [gitApplyMode, setGitApplyMode] = useState('review'); const [gitDeployNow, setGitDeployNow] = useState(false); const [creatingFromGit, setCreatingFromGit] = useState(false); + const [gitSubmitError, setGitSubmitError] = useState(null); const resetCreateFromGitForm = () => { setNewStackName(''); @@ -84,8 +89,12 @@ export function CreateStackDialog({ open, onOpenChange, onStackCreated, onStacks setGitSyncEnv(false); setGitAuthType('none'); setGitToken(''); + setGitDeployKey(''); + setGitSshKnownHostsEntry(''); + setGitSshHostKeyFingerprint(''); setGitApplyMode('review'); setGitDeployNow(false); + setGitSubmitError(null); }; const browseGitRepo = async (): Promise => { @@ -100,6 +109,10 @@ export function CreateStackDialog({ open, onOpenChange, onStackCreated, onStacks auth_type: gitAuthType, }; if (gitAuthType === 'token' && gitToken !== '') body.token = gitToken; + if (gitAuthType === 'deploy_key') { + if (gitDeployKey !== '') body.deploy_key = gitDeployKey; + if (gitSshKnownHostsEntry !== '') body.ssh_known_hosts_entry = gitSshKnownHostsEntry; + } const res = await apiFetch('/git-sources/browse', { method: 'POST', body: JSON.stringify(body), @@ -171,16 +184,18 @@ export function CreateStackDialog({ open, onOpenChange, onStackCreated, onStacks const handleCreateStackFromGit = async () => { const stackName = newStackName.trim(); + setGitSubmitError(null); if (!stackName) { - toast.error('Stack name is required.'); + setGitSubmitError('Stack name is required.'); return; } if (!gitRepoUrl.trim() || !gitBranch.trim() || gitComposePaths.length === 0) { - toast.error('Repository URL, branch, and at least one compose file are required.'); + setGitSubmitError('Repository URL, branch, and at least one compose file are required.'); return; } - if (!/^https:\/\//i.test(gitRepoUrl.trim())) { - toast.error('Only HTTPS repository URLs are supported.'); + const trimmedUrl = gitRepoUrl.trim(); + if (!isSupportedGitRepoUrl(trimmedUrl)) { + setGitSubmitError(UNSUPPORTED_GIT_REPO_URL_MESSAGE); return; } const sourceNodeId = activeNode?.id; @@ -204,6 +219,11 @@ export function CreateStackDialog({ open, onOpenChange, onStackCreated, onStacks if (gitAuthType === 'token' && gitToken !== '') { body.token = gitToken; } + if (gitAuthType === 'deploy_key') { + body.deploy_key = gitDeployKey; + body.ssh_known_hosts_entry = gitSshKnownHostsEntry; + body.ssh_host_key_fingerprint = gitSshHostKeyFingerprint; + } const response = await apiFetch('/stacks/from-git', { method: 'POST', body: JSON.stringify(body), @@ -238,7 +258,7 @@ export function CreateStackDialog({ open, onOpenChange, onStackCreated, onStacks await onStackCreated(stackName, sourceNodeId); } catch (error) { console.error('Failed to create stack from Git:', error); - toast.error((error as Error)?.message || 'Failed to create stack from Git.'); + setGitSubmitError((error as Error)?.message || 'Failed to create stack from Git.'); } finally { toast.dismiss(loadingId); setCreatingFromGit(false); @@ -448,7 +468,12 @@ export function CreateStackDialog({ open, onOpenChange, onStackCreated, onStacks syncEnv={gitSyncEnv} authType={gitAuthType} token={gitToken} + deployKey={gitDeployKey} + sshKnownHostsEntry={gitSshKnownHostsEntry} + sshHostKeyFingerprint={gitSshHostKeyFingerprint} hasStoredToken={false} + hasStoredDeployKey={false} + storedHostKeyFingerprint={null} applyMode={gitApplyMode} onRepoUrlChange={setGitRepoUrl} onBranchChange={setGitBranch} @@ -457,6 +482,9 @@ export function CreateStackDialog({ open, onOpenChange, onStackCreated, onStacks onSyncEnvChange={setGitSyncEnv} onAuthTypeChange={setGitAuthType} onTokenChange={setGitToken} + onDeployKeyChange={setGitDeployKey} + onSshKnownHostsEntryChange={setGitSshKnownHostsEntry} + onSshHostKeyFingerprintChange={setGitSshHostKeyFingerprint} onApplyModeChange={setGitApplyMode} onBrowse={browseGitRepo} /> @@ -472,9 +500,19 @@ export function CreateStackDialog({ open, onOpenChange, onStackCreated, onStacks Deploy after create + + {gitSubmitError && ( +

+ )} onOpenChange(false)} disabled={creatingFromGit}> Cancel diff --git a/frontend/src/components/stack/GitSourceFields.tsx b/frontend/src/components/stack/GitSourceFields.tsx index 32534bed..91c20a9c 100644 --- a/frontend/src/components/stack/GitSourceFields.tsx +++ b/frontend/src/components/stack/GitSourceFields.tsx @@ -1,9 +1,19 @@ +import { useEffect, useState } from 'react'; +import { AlertTriangle } from 'lucide-react'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Checkbox } from '@/components/ui/checkbox'; +import { Button } from '@/components/ui/button'; import { cn } from '@/lib/utils'; +import { apiFetch } from '@/lib/api'; +import { toast } from '@/components/ui/toast-store'; import { GitComposeFilePicker, type GitBrowseResult } from './GitComposeFilePicker'; +interface HostKeyRotationWarning { + previous: string; + current: string; +} + export type ApplyMode = 'review' | 'auto-write' | 'auto-deploy'; /** @@ -26,15 +36,22 @@ export interface GitSourceFieldsState { composePaths: string[]; contextDir: string; syncEnv: boolean; - authType: 'none' | 'token'; + authType: 'none' | 'token' | 'deploy_key'; token: string; + deployKey: string; + sshKnownHostsEntry: string; + sshHostKeyFingerprint: string; /** When editing an existing source, the server tells us whether a token is already stored. */ hasStoredToken: boolean; + hasStoredDeployKey: boolean; + storedHostKeyFingerprint: string | null; applyMode: ApplyMode; } export interface GitSourceFieldsProps extends GitSourceFieldsState { disabled?: boolean; + /** When probing host keys from the edit panel, scopes the request to stack:edit. */ + stackName?: string; /** 'edit' for the per-stack panel, 'create' for the new-stack dialog. Changes apply-mode copy. */ variant: 'edit' | 'create'; onRepoUrlChange: (value: string) => void; @@ -42,8 +59,11 @@ export interface GitSourceFieldsProps extends GitSourceFieldsState { onComposePathsChange: (value: string[]) => void; onContextDirChange: (value: string) => void; onSyncEnvChange: (value: boolean) => void; - onAuthTypeChange: (value: 'none' | 'token') => void; + onAuthTypeChange: (value: 'none' | 'token' | 'deploy_key') => void; onTokenChange: (value: string) => void; + onDeployKeyChange: (value: string) => void; + onSshKnownHostsEntryChange: (value: string) => void; + onSshHostKeyFingerprintChange: (value: string) => void; onApplyModeChange: (value: ApplyMode) => void; /** Runs the correct browse endpoint (create vs edit); returns the repo file list or null on failure. */ onBrowse: () => Promise; @@ -70,7 +90,11 @@ export function GitSourceFields({ syncEnv, authType, token, + deployKey, + sshHostKeyFingerprint, hasStoredToken, + hasStoredDeployKey, + storedHostKeyFingerprint, applyMode, disabled = false, variant, @@ -81,12 +105,62 @@ export function GitSourceFields({ onSyncEnvChange, onAuthTypeChange, onTokenChange, + onDeployKeyChange, + onSshKnownHostsEntryChange, + onSshHostKeyFingerprintChange, onApplyModeChange, onBrowse, + stackName, }: GitSourceFieldsProps) { const copy = APPLY_MODE_COPY[variant]; const primaryComposePath = composePaths[0] ?? ''; const canBrowse = !!repoUrl?.trim() && !!branch?.trim(); + const [hostKeyRotation, setHostKeyRotation] = useState(null); + + useEffect(() => { + setHostKeyRotation(null); + }, [repoUrl]); + + const probeHostKey = async () => { + if (!repoUrl.trim()) { + toast.error('Enter a repository URL first.'); + return; + } + try { + const res = await apiFetch('/git-sources/ssh-host-key', { + method: 'POST', + body: JSON.stringify({ + repo_url: repoUrl.trim(), + ...(stackName ? { stack_name: stackName } : {}), + }), + }); + if (!res.ok) { + const err = await res.json().catch(() => ({})); + toast.error(err?.error || 'Failed to fetch host key.'); + return; + } + const data = await res.json() as { keys?: Array<{ fingerprint: string; line: string }> }; + const first = data.keys?.[0]; + if (!first) { + toast.error('No host keys returned.'); + return; + } + const previousFingerprint = (storedHostKeyFingerprint ?? sshHostKeyFingerprint).trim(); + if (previousFingerprint && previousFingerprint !== first.fingerprint) { + setHostKeyRotation({ previous: previousFingerprint, current: first.fingerprint }); + toast.warning('Host key fingerprint changed. Review the new fingerprint before saving.'); + } else { + setHostKeyRotation(null); + if (!previousFingerprint) { + toast.success(`Trusted host key fingerprint: ${first.fingerprint}`); + } + } + onSshHostKeyFingerprintChange(first.fingerprint); + onSshKnownHostsEntryChange(first.line); + } catch (e) { + toast.error((e as Error)?.message || 'Network error.'); + } + }; const radioOption = (mode: ApplyMode) => ( + {authType === 'token' && (
@@ -220,6 +307,59 @@ export function GitSourceFields({

)} + {authType === 'deploy_key' && ( +
+ {hostKeyRotation && ( +
+
+ +
+

Host key fingerprint changed

+

+ The server presented a different key than the one you trusted. Confirm this is an expected rotation before saving. +

+

+ Previously trusted: + {hostKeyRotation.previous} +

+

+ New fingerprint: + {hostKeyRotation.current} +

+
+
+
+ )} +
+ + {(sshHostKeyFingerprint || storedHostKeyFingerprint) && ( + + {sshHostKeyFingerprint || storedHostKeyFingerprint} + + )} +
+