mirror of
https://github.com/profullstack/agentbbs.git
synced 2026-08-13 22:37:28 +00:00
feat(files): provision-user CLI + anonymous public HTTP serving
Lets external services (the TronBrowser extension store) host files on files.profullstack.com without the interactive `ssh join@` onboarding. - `agentbbs provision-user --name <h> --pubkey "<ssh key>"`: registers a member from an SSH *public* key (account = handle + key fingerprint). Reuses SanitizeUsername (same rules as join@) + EnsureUser; Files/SFTP access is free for members, so the account can immediately `scp … files@host:/public/extensions/<slug>/`. JSON output; refuses on key/ handle collision. New auth.FingerprintAuthorizedKey() parses an authorized_keys line to the same SHA256 fp as a live session key (tested). - setup.sh: the files.<host> Caddy site now serves the shared /public area as unauthenticated, read-only static files (handle_path /public/*), so .crx/.zip download links work for anyone — mapping 1:1 to the SFTP path. Non-/public paths still hit the auth'd web file manager. - docs/files.md updated. Note: not compiled here — repo go.mod requires go 1.26 and this sandbox has 1.22.2; changes pass gofmt parse/format checks. Reuses existing store/auth APIs. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
fb7722eacc
commit
e5e8e75553
6 changed files with 210 additions and 0 deletions
|
|
@ -88,6 +88,45 @@ content-blind.
|
|||
| `AGENTBBS_FILES_QUOTA_MB` | `1024` | default per-user workspace quota (MB) |
|
||||
| `AGENTBBS_DATA` | `./data` | storage lives under `<data>/files/{users,public}` |
|
||||
|
||||
## Provisioning members from a public key (for external services)
|
||||
|
||||
Normally members onboard interactively (`ssh join@`). External services that
|
||||
want to grant a user file storage without that flow — e.g. the TronBrowser
|
||||
extension store letting a publisher upload bundles — can register an account
|
||||
directly from an SSH **public** key (an account is just *handle + key
|
||||
fingerprint*):
|
||||
|
||||
```bash
|
||||
agentbbs provision-user --name acme --pubkey "ssh-ed25519 AAAA… acme@dev"
|
||||
# or: --pubkey-file ./id_ed25519.pub
|
||||
```
|
||||
|
||||
It normalizes the handle with the same rules as `join@` (`SanitizeUsername`),
|
||||
fingerprints the key, and `EnsureUser`s the member; Files/SFTP access is then
|
||||
available immediately (free for all members). Output is JSON (`{ok, name,
|
||||
fingerprint, store_id}`); it refuses if the key already belongs to another
|
||||
member or the handle is taken by a different key. The publisher can then:
|
||||
|
||||
```bash
|
||||
scp dist.crx files@files.profullstack.com:/public/extensions/acme/
|
||||
```
|
||||
|
||||
## Public files over HTTP (anonymous, read-only)
|
||||
|
||||
The web file manager at `files.<host>` requires a login even to download, which
|
||||
is wrong for *shared* artifacts (a `.crx` download link must work for anyone).
|
||||
So the `files.<host>` Caddy site (generated by `setup.sh`) serves the shared
|
||||
`/public` area as **unauthenticated, read-only** static files, mapping 1:1 to
|
||||
the SFTP path:
|
||||
|
||||
```
|
||||
scp x files@files.profullstack.com:/public/extensions/acme/x
|
||||
-> https://files.profullstack.com/public/extensions/acme/x
|
||||
```
|
||||
|
||||
Everything outside `/public/*` still falls through to the authenticated web
|
||||
manager (private `/me` browsing).
|
||||
|
||||
## Implementation
|
||||
|
||||
- `internal/files` — a fully virtual Go SFTP server (`github.com/pkg/sftp` +
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue