2212 Commits
Author SHA1 Message Date
Andras Bacsai 813c4472a7 Merge remote-tracking branch 'origin/main' into next 2026-11-09 11:11:03 +01:00
Andras Bacsai b31c06a7eb fix(team): build invite links from instance URL, not request host
When no instance domain is set, invitation links were built from the
request host, which a client can spoof through a forwarded Host header.
Links now always use base_url(). The fallback test now forces a spoofed
root URL and checks that the link ignores it.
2026-11-09 11:06:52 +01:00
Andras BacsaiandClaude Opus 5.5 a44193b6e4 fix(mcp): return only service fields from get_service
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 11:04:47 +01:00
Andras BacsaiandClaude Opus 5.5 5ff94dbd7a fix(api): limit nested server data to team-wide tokens
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 11:03:22 +01:00
Andras Bacsai 132dd0e34c test(api): cover member access to the cloud provider token list
A team member with a read token gets 403 on GET /api/v1/cloud-tokens
and an error from the MCP cloud_provider list_tokens action.
2026-11-09 10:59:00 +01:00
Andras Bacsai f4cbf63e76 fix(api): validate the docker tag of deploy requests
Use the same tag format check as the preview API.
2026-11-09 10:58:08 +01:00
Andras BacsaiandClaude Opus 5.5 769bddb326 fix(api): require write permission to choose a preview commit
- Treat a commit value on the preview endpoint as a preview change
- Update the API docs, the MCP tool description, and the change file
- Add a test case

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 10:50:51 +01:00
Andras Bacsai 2466ccb8fd fix(service): check images before stopping a service on restart
Closes #12485
2026-11-09 10:18:55 +01:00
Andras Bacsai adec9911cf Merge remote-tracking branch 'origin/main' into next 2026-11-09 10:16:31 +01:00
Andras BacsaiandClaude Opus 5.5 acacbf9747 fix(compose): report an empty Compose file as empty, not as not found
Closes #12477

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 10:15:38 +01:00
Andras BacsaiandClaude Opus 5.5 65dba32385 feat(server-security): scan host OS packages for vulnerabilities (#12482)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 10:12:56 +01:00
Andras BacsaiandClaude Opus 5.5 a70e856882 test: remove tests that do not test behavior and strengthen weak ones
- Remove tests that only check markup, CSS, static text, wire:key strings,
  framework behavior, copied app logic, or expect(true)
- Replace source-grep and Reflection checks of security fixes with tests
  that run the real code (shell quoting, locked properties, 403 checks,
  webhook fork trust, log redaction, Sentinel token cleanup)
- Assert response bodies and unchanged data on API error paths
- Run the Traefik version job through handle() instead of private methods
- Update stale tests for scheduled task props, the default Postgres image,
  and the disabled transfer link of unvalidated servers

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 08:47:56 +01:00
Andras BacsaiandClaude Opus 5.5 de75bbe004 fix(upload): return 404 for a database the team cannot open
The backup upload returned a hard-coded 500 when the database uuid was
unknown or belonged to another team. It now returns 404 with the same
JSON error shape that the import form reads.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 08:47:56 +01:00
Andras Bacsai 61b10664c4 refactor(security): remove published APP_KEY request blocking middleware
Drop the RejectPublishedAppKey middleware and its registration in the
HTTP kernel, so requests are no longer refused with a 503 when APP_KEY
or APP_PREVIOUS_KEYS matches a key shipped in the repository.

Rename PublishedAppKeyTest to DecryptWithoutClassesTest and keep only
the checks that Sentinel tokens and team channel payloads are decrypted
without unserializing objects.
2026-11-08 18:24:02 +01:00
Andras Bacsai c75e7078b7 fix(access): restrict preview changes, rollbacks, and repo URL updates
- Require the write permission and update policy to open a preview or
  change its pull request URL, git type, or docker tag via the API;
  deploy-only tokens can only redeploy an existing preview
- Reject rollbacks to commits that are neither a listed rollback image
  nor a successful production deployment (GetRollbackImages::allows)
- Validate git_repository with ValidGitRepositoryUrl when it changes on
  application update
- Add RejectPublishedAppKey global middleware
- Show a "still starting" message when the root setup window is pending
- Document the new 403 responses and constraints in the OpenAPI spec
- Add tests for the new checks
2026-11-08 17:26:34 +01:00
Andras Bacsai 3c588d482d fix(access): apply API token limits in more permission checks
- Use the limits of the API token in more permission checks.
- Show a clearer message when a token limit blocks a change.
- Describe API tokens with limits in SECURITY.md.
2026-11-08 15:53:02 +01:00
Andras BacsaiandClaude Opus 5.5 1d21a27812 refactor(image-scan): remove the instance switch and the vulnerability DB URL
Scanning is now controlled per server and per app. Each server downloads
the Grype database from its default source.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 15:49:05 +01:00
Andras Bacsai 3b64cbc379 fix(access): clearer credential message and backup S3 defaults
- Show a clear message when team-wide write access is needed to use
  team credentials.
- Reset the S3 selection on the backup page when a change is not allowed.
- Do not save database backups to S3 when the API request does not
  send save_s3, as the API documentation says.
2026-11-07 22:04:44 +01:00
Andras Bacsai 8011d0d6ab fix(access): check server and credential access for scoped members (#12488) 2026-11-07 18:59:17 +01:00
Andras Bacsai f7ea962145 fix(server): enable disabled self-hosted servers again on validation
On self-hosted, a validation that connects now clears force_disabled. The unreachable cleanup skips the localhost server, and the server page explains why a server is disabled. Cloud and transferred servers stay disabled.

Closes #12475
2026-11-06 18:57:06 +01:00
Andras BacsaiandClaude Opus 5.5 17a9fa624e feat(ui): move maintenance mode to its own page with a confirmed toggle
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 15:20:41 +01:00
Andras BacsaiandClaude Opus 5.5 53e21abe97 fix(services): do not warn about the port when a domain has no port
An empty port routes to the required port, so it needs no confirmation.
The edit dialog shows the effective port, the warning buttons name the
ports, and domain conflicts ignore the container port.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 15:17:35 +01:00
033f0c84da v4.7 (#12478)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: peaklabs-dev <122374094+peaklabs-dev@users.noreply.github.com>
Co-authored-by: Aditya Tripathi <aditya@climactic.co>
2026-11-06 14:25:02 +01:00
Andras Bacsai d5ac1ba27e fix(storage): require a saved SFTP host key, saved only by an admin validation
- Restores, downloads, and the import check refuse an SFTP storage without a saved host key.
- Only Validate, Save, Create, and the API validate endpoint save a new key; backup and
  revalidation jobs do not.
- An endpoint change or a host key reset marks the storage unusable.
- Save the key only when the endpoint did not change during the connection test.
2026-11-06 13:44:03 +01:00
Andras Bacsai 136e76abc2 fix(github): sync GitHub Deployments after bulk status changes, off the deploy queue
- Queue a status sync for deployments that Init, fail_undispatchable_deployment, and
  superseded cancels change with a query update, so GitHub does not show them as
  in progress forever.
- Run SyncGithubDeploymentJob on the default queue with 10 s GitHub request timeouts
  and a 100 s job timeout, so a slow GitHub cannot delay deployments.
2026-11-06 13:44:03 +01:00
Andras Bacsai 01df5fff95 fix(image-scan): let the deploy gate wait for a running background scan
The gate treated a busy server scan lock as a scan error after 120 s, so a gated
deploy with Block failed while another scan ran. It now waits in steps, bounded by the
deployment job timeout, and still honors a cancel. The lock TTL now covers the sum
of the scan step timeouts.
2026-11-06 13:44:03 +01:00
Andras Bacsai 06ff1e1e31 fix(email): keep saved provider on failed switch, fall back to SMTP sender for Resend
- Restore the saved SMTP/Resend flags when a provider switch fails validation, so a
  later event toggle cannot save a half-configured Resend (team and instance pages).
- Resend uses smtp_from_* when resend_from_* is blank, as before the Resend sender fields.
- Require the Resend sender only when Resend is enabled.
- Replace wire:confirm in the SMTP server picker with x-modal-confirmation.
2026-11-06 13:44:03 +01:00
Andras Bacsai 7c348d6239 Merge remote-tracking branch 'origin/main' into next
# Conflicts:
#	app/Livewire/Project/Resource/Create.php
2026-11-06 12:45:11 +01:00
Andras Bacsai e540a1a978 Merge remote-tracking branch 'origin/main' into next 2026-11-06 12:43:10 +01:00
Andras BacsaiandClaude Opus 5.5 91d233be59 feat(ui): add list view to the new resource page
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 12:18:37 +01:00
Andras BacsaiandClaude Opus 5.5 106a6d7ac0 fix(env): resolve and redact server-scoped shared variables in compose
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 12:16:39 +01:00
Andras Bacsai 7bab8f76ad Merge remote-tracking branch 'origin/main' into next 2026-11-06 12:08:06 +01:00
Andras Bacsai c8c639e3d6 fix(realtime): keep Reverb handshake under its size limit with large cookie headers
Raise the Reverb max request size and store the remembered list view
cookies unencrypted, so the WebSocket handshake no longer fails with 413
and live updates (like proxy restart logs) reach the browser.
2026-11-06 11:01:06 +01:00
Andras BacsaiandClaude Opus 5.5 3115980c77 fix(ui): copy service backup path and show S3 badge only for runs stored in S3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 10:38:49 +01:00
Aditya TripathiandAndras Bacsai 3c33f61d7b feat(image-scan): container image vulnerability scanning with a security status per resource (#12377)
Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com>
2026-11-06 10:31:27 +01:00
Andras Bacsai 0db8f60bdd feat(storage): add SFTP, FTPS, and WebDAV backup destinations (#12417) 2026-11-06 10:28:30 +01:00
cdc45e5736 fix: merge fixes-next into next (security hardening and fixes) (#12460)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: peaklabs-dev <122374094+peaklabs-dev@users.noreply.github.com>
2026-11-06 10:18:19 +01:00
Andras BacsaiandClaude Opus 5.5 3379fa448a fix(audit): keep personal data and credentials out of audit events
Anonymize the audit events of a deleted user, store only the ID and
name of other users, and drop the metadata copy of actor_email.
Store URLs without query strings, registries without user info, and
the exception class instead of raw SSH errors.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 09:31:44 +01:00
Andras Bacsai 13298591d8 fix(api): throttle API clients that keep failing and notify the token's team
- Return 429 after 30 failed (401/403/404) requests per minute for one
  token or IP, also for unknown API routes (API_FAILED_REQUEST_RATE_LIMIT)
- Notify the team once a day when a token reaches the limit
- Deduplicate ability_denied and scope_denied audit events for 5 minutes
2026-11-05 23:38:37 +01:00
Andras BacsaiandClaude Opus 5.5 9a6cc8316e fix(horizon): route Sentinel push jobs to a dedicated cloud sentinel queue
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 22:49:56 +01:00
Andras Bacsai a58588faa0 feat(gitea): support Forgejo and Codeberg in the Gitea App source 2026-11-05 13:20:03 +01:00
Andras BacsaiandClaude Opus 5.5 f7867923b7 feat(email): add named SMTP servers, provider templates, Resend sender (#12471)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 11:38:17 +01:00
Andras BacsaiandClaude Opus 5.5 bf4b6ad921 feat(github): sync deployment status to GitHub Deployments (#12451)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 11:37:10 +01:00
Andras Bacsai cc996a1d9f fix(api): accept gitea_app_uuid when creating and updating applications
Add gitea_app_uuid to the allowed fields for application create and
update endpoints, with string validation on update, so Gitea App
sources can be set through the API.

Add a test checking that a closed GitLab merge request on the manual
webhook closes the matching preview and loads only applications of
that repository.
2026-11-05 11:32:50 +01:00
Andras BacsaiandClaude Opus 5.5 6ab538d0f1 fix(deploy): keep short-lived containers out of build --add-host
BuildKit keys every RUN step on the --add-host names, so a container
that joins or leaves the network between two builds rebuilt all layers.
Leave out database backup and S3 import helpers, Sentinel, and the
proxy error page container.

Closes #12452

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 11:31:49 +01:00
Andras BacsaiandClaude Opus 5.5 05e52fc41d fix(compose): keep dotted service names literal and validate service names
Updating the image of a service named like "api.test" wrote a nested
"test" key into the "api" service, because data_get/data_set split the
name on dots. Use array key paths instead. Also refuse service names that
Docker cannot use as a container name prefix, with a clear error on save.

Closes #12456

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 11:31:47 +01:00
Andras BacsaiandClaude Opus 5.5 32541a32ce fix(api): validate resource names and descriptions like the UI
The API and MCP saved names and descriptions that the UI rejects, so the
resource could not be saved in the UI after that. Applications, services,
databases, servers, and private keys now use the UI name and description
rules on create and update, with the UI error messages.

Closes #12466

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 11:29:05 +01:00
Andras BacsaiandClaude Opus 5.5 3bc82eb71d feat(api): add Gitea App endpoints for sources and applications
Add GET /gitea-apps, POST /applications/private-gitea-app, and
gitea_app_uuid in PATCH /applications/{uuid}, with OpenAPI docs and MCP tool support.

Closes #12459

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 11:27:24 +01:00
Andras BacsaiandClaude Opus 5.5 59481c7bb6 fix(api-tokens): keep token search in sync after create, edit, and revoke
Closes #12465

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 10:29:24 +01:00
Andras Bacsai 455b22f26c fix(deploy): explain SSH exit 255 and handle non-map compose services
- Add a hint to failed command messages when the exit code is 255,
  which explains that the SSH connection to the server closed before
  the command finished.
- Return no services from applicationParser and serviceParser when the
  compose `services` key is empty or is not a map, so parsing does not
  fail.
- Move Server::getIp() out of the sshEndpointInUse() docblock, where it
  was misplaced and broke the class.
- Add tests for the SSH hint, for services keys that are not maps, and
  for saved compose variable values that must survive a redeploy
  (#6995).
2026-11-05 09:49:35 +01:00