mirror of
https://github.com/Dvorinka/Containr.git
synced 2026-10-28 07:41:27 +00:00
feat(git): GitHub App manifest self-provisioning + app-level webhook (#44)
* feat(branding): white-label — public /branding, admin write, shell theming app_settings branding.* keys (product name, logo/favicon URLs, accent color, docs/support links). Public GET /branding so login and shell theme pre-auth; admin writes via PUT /settings. useBranding() applies document.title, accent CSS var and favicon; BrandWordmark replaces hardcoded wordmarks; admin Platform settings gain a Branding form. MCP containr_branding_get + settings_update. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> * feat(invites): team invite links — admin create/revoke, public accept Admins mint single-use invite links (sha256-hashed token at rest, optional email binding, configurable TTL). Public endpoints let the accept page validate the link and register — working even while public signup is disabled. - migration + sqlc queries/model for user_invites - POST /admin/invites (returns one-time token+url), GET list, DELETE revoke - GET /auth/invites/:token public validation, POST /auth/accept-invite - CLI containr invites list|create|revoke; MCP invites tools - /auth/accept-invite page (expired/used/invalid states, bound-email lock) - Admin page Team invites section: create, copy link, revoke - OpenAPI + generated types + CLI guide Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> * feat(admin): impersonate user — 15-min token, audit-logged POST /admin/users/:id/impersonate mints a short-lived bearer token (impersonated_by claim) for support/debugging. Admin accounts cannot be impersonated; every mint is audit-logged with actor + target. - CLI: containr admin impersonate <user-id> (works via CONTAINR_TOKEN) - MCP: containr_admin_impersonate - Admin UI: per-user Impersonate action → token modal with usage hint - OpenAPI + generated types Verified live: token resolves to target, admin target 403, audit row. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> * feat(git): GitHub App manifest self-provisioning + app-level webhook Admins create the instance GitHub App in-browser instead of hand- setting GITHUB_APP_* env vars: - POST /admin/git/github-app/manifest builds the manifest + URL; the frontend auto-submits it to github.com - /git/github-app/callback page exchanges the code via POST /admin/git/github-app/convert; credentials persist in app_settings (precedence over env) - GET /admin/git/github-app reports configured/source - POST /api/git/github-app/webhook — single app-level push receiver, HMAC-verified, dispatches via extracted dispatchPushToServices - install-url + installation-token paths resolve settings→env - CLI: containr admin github-app status|manifest|convert; MCP tools - Git providers UI shows "Set up GitHub App" for admins when unconfigured Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> --------- Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
1 parent
50e39fe140
commit
00e69b3733
16 files changed
+1184
-28
No files matched your search
@@ -1791,6 +1791,45 @@ paths:
|
||||
message:
|
||||
type: string
|
||||
|
||||
/admin/users/{id}/impersonate:
|
||||
post:
|
||||
tags:
|
||||
- Admin
|
||||
summary: Impersonate a user
|
||||
description: >-
|
||||
Mint a 15-minute bearer token acting as the target user. Admin-only;
|
||||
admin accounts cannot be impersonated and every mint is audit-logged.
|
||||
The token carries an `impersonated_by` claim.
|
||||
security:
|
||||
- bearerAuth: []
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
schema:
|
||||
type: string
|
||||
responses:
|
||||
'200':
|
||||
description: Impersonation token
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
token:
|
||||
type: string
|
||||
expires_at:
|
||||
type: string
|
||||
format: date-time
|
||||
user:
|
||||
type: object
|
||||
properties:
|
||||
id: {type: string}
|
||||
email: {type: string}
|
||||
name: {type: string}
|
||||
'403':
|
||||
description: Target is an admin account
|
||||
|
||||
/admin/projects/{id}:
|
||||
patch:
|
||||
tags:
|
||||
@@ -3730,6 +3769,93 @@ paths:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Error'
|
||||
|
||||
/admin/git/github-app:
|
||||
get:
|
||||
tags:
|
||||
- Admin
|
||||
summary: GitHub App provisioning status
|
||||
description: Shows whether the instance GitHub App is configured, and whether credentials come from app_settings or environment variables.
|
||||
security:
|
||||
- bearerAuth: []
|
||||
responses:
|
||||
'200':
|
||||
description: Provisioning status
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
configured: {type: boolean}
|
||||
source: {type: string, enum: [settings, env, none]}
|
||||
app_id: {type: string}
|
||||
slug: {type: string}
|
||||
name: {type: string}
|
||||
|
||||
/admin/git/github-app/manifest:
|
||||
post:
|
||||
tags:
|
||||
- Admin
|
||||
summary: Build GitHub App manifest
|
||||
description: >-
|
||||
Returns a GitHub App manifest for self-provisioning. The client POSTs
|
||||
`manifest` verbatim as a form field to `url`; GitHub then redirects to
|
||||
the instance's /git/github-app/callback with a code.
|
||||
security:
|
||||
- bearerAuth: []
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
required: [base_url]
|
||||
properties:
|
||||
base_url: {type: string, description: Public https base URL of this instance}
|
||||
name: {type: string}
|
||||
organization: {type: string, description: Create the app under this GitHub organization}
|
||||
responses:
|
||||
'200':
|
||||
description: Manifest + submission URL
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
url: {type: string}
|
||||
manifest: {type: string, description: JSON string — POST as form field `manifest`}
|
||||
state: {type: string}
|
||||
|
||||
/admin/git/github-app/convert:
|
||||
post:
|
||||
tags:
|
||||
- Admin
|
||||
summary: Exchange manifest callback code
|
||||
description: Exchanges the `code` from the manifest redirect for the app credentials and stores them in app_settings (overriding env vars).
|
||||
security:
|
||||
- bearerAuth: []
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
required: [code]
|
||||
properties:
|
||||
code: {type: string}
|
||||
responses:
|
||||
'200':
|
||||
description: App provisioned
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
app_id: {type: integer}
|
||||
slug: {type: string}
|
||||
name: {type: string}
|
||||
'502':
|
||||
description: GitHub conversion failed
|
||||
|
||||
/git/providers/{providerId}:
|
||||
delete:
|
||||
tags:
|
||||
@@ -5325,6 +5451,45 @@ paths:
|
||||
schema:
|
||||
$ref: '#/components/schemas/Error'
|
||||
|
||||
/api/git/github-app/webhook:
|
||||
servers:
|
||||
- url: http://localhost:8080
|
||||
post:
|
||||
tags:
|
||||
- Git
|
||||
summary: GitHub App webhook receiver
|
||||
description: >-
|
||||
Single app-level webhook all installed repositories deliver to
|
||||
(configured via the manifest's hook_attributes). Verified with
|
||||
X-Hub-Signature-256 against the provisioned webhook secret. Push
|
||||
events enqueue deployments for services tracking the repo+branch.
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
responses:
|
||||
'202':
|
||||
description: Event accepted
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
received:
|
||||
type: boolean
|
||||
branch:
|
||||
type: string
|
||||
deployments:
|
||||
type: integer
|
||||
ignored:
|
||||
type: string
|
||||
'401':
|
||||
description: Invalid signature
|
||||
'503':
|
||||
description: GitHub App webhook secret not configured
|
||||
|
||||
/api/agents/{id}/commands/{commandId}/result:
|
||||
servers:
|
||||
- url: http://localhost:8080
|
||||
|
||||
@@ -88,6 +88,9 @@ banners list|create|update|delete announcement banners (admin);
|
||||
active banners print on `auth status`
|
||||
invites list|create|revoke team invite links (admin); create
|
||||
prints the one-time acceptance URL
|
||||
admin impersonate <id> mint a 15-min token acting as a user
|
||||
admin github-app status|manifest|convert
|
||||
self-provision the instance GitHub App
|
||||
up deploy the current directory
|
||||
```
|
||||
|
||||
|
||||
Reference in new issue
Block a user