mirror of
https://github.com/profullstack/agentbbs.git
synced 2026-08-13 22:37:28 +00:00
Free per-user homepages at <name>.<host> (wildcard subdomains)
- sites.AskHandler now approves <name>.AGENTBBS_HOST on-demand-TLS when <name>
is a registered member (so only real users mint subdomain certs).
- Caddyfile: *.${DOMAIN} block serving users/<name>/public_html with on_demand
TLS; unknown users 404. Needs a wildcard DNS record *.${DOMAIN} -> host.
- Test: TestAskUserSubdomain.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
74c292f341
commit
ae8b1c25f4
3 changed files with 73 additions and 0 deletions
|
|
@ -48,6 +48,7 @@ type Manager struct {
|
|||
st store.Store
|
||||
usersDir string // <data>/users
|
||||
domDir string // <data>/domains (the symlink farm Caddy serves)
|
||||
baseHost string // AGENTBBS_HOST, e.g. bbs.profullstack.com (for <name>.<host>)
|
||||
}
|
||||
|
||||
// NewManager prepares the symlink farm under dataDir/domains.
|
||||
|
|
@ -60,6 +61,7 @@ func NewManager(st store.Store, dataDir string) (*Manager, error) {
|
|||
st: st,
|
||||
usersDir: filepath.Join(dataDir, "users"),
|
||||
domDir: domDir,
|
||||
baseHost: strings.ToLower(strings.TrimSpace(os.Getenv("AGENTBBS_HOST"))),
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
|
@ -132,6 +134,20 @@ func (m *Manager) AskHandler() http.Handler {
|
|||
http.Error(w, "bad domain", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
// Free user-homepage subdomain: <name>.<baseHost> for any registered
|
||||
// member (e.g. alice.bbs.profullstack.com). Single label only.
|
||||
if m.baseHost != "" && strings.HasSuffix(d, "."+m.baseHost) {
|
||||
label := strings.TrimSuffix(d, "."+m.baseHost)
|
||||
if label != "" && !strings.Contains(label, ".") {
|
||||
if _, ok, err := m.st.UserByName(label); err != nil {
|
||||
http.Error(w, "lookup error", http.StatusInternalServerError)
|
||||
return
|
||||
} else if ok {
|
||||
w.WriteHeader(http.StatusOK)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
if _, ok, err := m.st.DomainUser(d); err != nil {
|
||||
http.Error(w, "lookup error", http.StatusInternalServerError)
|
||||
return
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue