Files
DDI/server/internal/httpapi/routes.go
T

103 lines
5.9 KiB
Go

// SPDX-License-Identifier: LicenseRef-DDI-Proprietary
package httpapi
import (
"net/http"
"git.beugsiud.de/beug.k/DDI/server/internal/auth"
)
// Routes returns the route table. It is the single place that assigns
// permissions; TestEveryRouteIsProtected and the OpenAPI contract test check it.
func (a *API) Routes() []Route {
const (
get, post, put, del = http.MethodGet, http.MethodPost, http.MethodPut, http.MethodDelete
)
perm := func(method, path string, p auth.Permission, write bool, h handlerFunc) Route {
return Route{Method: method, Path: path, Access: permission, Perm: p, Write: write, Handler: h}
}
return []Route{
// System and authentication.
{Method: get, Path: "/api/v1/system/info", Access: public, Handler: a.systemInfo},
{Method: post, Path: "/api/v1/auth/login", Access: public, Handler: a.login},
{Method: get, Path: "/api/v1/auth/oidc/start", Access: public, Handler: a.oidcStart},
{Method: get, Path: "/api/v1/auth/oidc/callback", Access: public, Handler: a.oidcCallback},
{Method: get, Path: "/api/v1/auth/session", Access: session, MFAPending: true, PasswordChange: true, Handler: a.getSession},
{Method: post, Path: "/api/v1/auth/logout", Access: session, MFAPending: true, PasswordChange: true, Handler: a.logout},
{Method: post, Path: "/api/v1/auth/totp/verify", Access: session, MFAPending: true, Handler: a.totpVerify},
{Method: post, Path: "/api/v1/auth/password", Access: session, PasswordChange: true, Handler: a.changePassword},
{Method: post, Path: "/api/v1/auth/totp/setup", Access: session, Handler: a.totpSetup},
{Method: post, Path: "/api/v1/auth/totp/enable", Access: session, Handler: a.totpEnable},
{Method: post, Path: "/api/v1/auth/totp/disable", Access: session, Handler: a.totpDisable},
// Users.
perm(get, "/api/v1/users", auth.PermUsersAdmin, false, a.listUsers),
perm(post, "/api/v1/users", auth.PermUsersAdmin, true, a.createUser),
perm(get, "/api/v1/users/{id}", auth.PermUsersAdmin, false, a.getUser),
perm(put, "/api/v1/users/{id}", auth.PermUsersAdmin, true, a.updateUser),
perm(del, "/api/v1/users/{id}", auth.PermUsersAdmin, true, a.deleteUser),
perm(post, "/api/v1/users/{id}/reset-password", auth.PermUsersAdmin, true, a.resetPassword),
// Audit log.
perm(get, "/api/v1/audit", auth.PermAuditRead, false, a.listAudit),
perm(get, "/api/v1/audit/export", auth.PermAuditRead, false, a.exportAudit),
// License (never write-locked: it is the way out of read-only mode).
perm(get, "/api/v1/license", auth.PermLicenseRead, false, a.getLicense),
perm(put, "/api/v1/license", auth.PermLicenseAdmin, false, a.setLicense),
perm(del, "/api/v1/license", auth.PermLicenseAdmin, false, a.removeLicense),
perm(post, "/api/v1/license/file", auth.PermLicenseAdmin, false, a.importLicenseFile),
perm(post, "/api/v1/license/refresh", auth.PermLicenseAdmin, false, a.refreshLicense),
// Settings.
perm(get, "/api/v1/settings/oidc", auth.PermSettingsAdm, false, a.getOIDCSettings),
perm(put, "/api/v1/settings/oidc", auth.PermSettingsAdm, true, a.setOIDCSettings),
perm(get, "/api/v1/settings/generator", auth.PermSettingsAdm, false, a.getGeneratorSettings),
perm(put, "/api/v1/settings/generator", auth.PermSettingsAdm, true, a.setGeneratorSettings),
// Generated configuration (read-only preview until agents arrive).
perm(get, "/api/v1/config/preview", auth.PermIPAMRead, false, a.previewConfig),
// Agents and enrollment (ADR 0021).
perm(get, "/api/v1/agents", auth.PermIPAMRead, false, a.listAgents),
perm(get, "/api/v1/agents/{id}", auth.PermIPAMRead, false, a.getAgent),
perm(del, "/api/v1/agents/{id}", auth.PermSettingsAdm, true, a.deleteAgent),
perm(post, "/api/v1/agents/{id}/revoke", auth.PermSettingsAdm, true, a.revokeAgent),
perm(get, "/api/v1/enrollment-tokens", auth.PermSettingsAdm, false, a.listEnrollmentTokens),
perm(post, "/api/v1/enrollment-tokens", auth.PermSettingsAdm, true, a.createEnrollmentToken),
perm(del, "/api/v1/enrollment-tokens/{id}", auth.PermSettingsAdm, true, a.deleteEnrollmentToken),
// Revisions, deployments and leases.
perm(get, "/api/v1/revisions", auth.PermIPAMRead, false, a.listRevisions),
perm(post, "/api/v1/revisions", auth.PermDeploy, true, a.createRevision),
perm(get, "/api/v1/revisions/{number}", auth.PermIPAMRead, false, a.getRevision),
perm(get, "/api/v1/deployments", auth.PermIPAMRead, false, a.listDeployments),
perm(get, "/api/v1/leases", auth.PermIPAMRead, false, a.listLeases),
// Networks.
perm(get, "/api/v1/networks", auth.PermIPAMRead, false, a.listNetworks),
perm(post, "/api/v1/networks", auth.PermIPAMWrite, true, a.createNetwork),
perm(get, "/api/v1/networks/{id}", auth.PermIPAMRead, false, a.getNetwork),
perm(put, "/api/v1/networks/{id}", auth.PermIPAMWrite, true, a.updateNetwork),
perm(del, "/api/v1/networks/{id}", auth.PermIPAMWrite, true, a.deleteNetwork),
perm(get, "/api/v1/networks/{id}/map", auth.PermIPAMRead, false, a.networkMap),
// Addresses.
perm(get, "/api/v1/addresses", auth.PermIPAMRead, false, a.listAddresses),
perm(post, "/api/v1/addresses", auth.PermIPAMWrite, true, a.createAddress),
perm(get, "/api/v1/addresses/export", auth.PermIPAMRead, false, a.exportAddresses),
perm(post, "/api/v1/addresses/import", auth.PermIPAMWrite, true, a.importAddresses),
perm(post, "/api/v1/addresses/preview", auth.PermIPAMRead, false, a.previewAddress),
perm(post, "/api/v1/addresses/bulk", auth.PermIPAMWrite, true, a.bulkAddresses),
perm(get, "/api/v1/addresses/{id}", auth.PermIPAMRead, false, a.getAddress),
perm(put, "/api/v1/addresses/{id}", auth.PermIPAMWrite, true, a.updateAddress),
perm(del, "/api/v1/addresses/{id}", auth.PermIPAMWrite, true, a.deleteAddress),
// Saved filters are personal and allowed in read-only mode.
perm(get, "/api/v1/saved-filters", auth.PermIPAMRead, false, a.listSavedFilters),
perm(post, "/api/v1/saved-filters", auth.PermIPAMRead, false, a.createSavedFilter),
perm(del, "/api/v1/saved-filters/{id}", auth.PermIPAMRead, false, a.deleteSavedFilter),
}
}