- cmd/kek-api: startet internal/kek.Handler.TenantKEKHandler (API-10), tenantResolverAdapter bildet tenant.Registry.GetBySlug auf kek.TenantResolver ab (nur Signatur-Anpassung) - reines Wiring, kein Diff an internal/kek|moduleregistry|tenant (verifiziert) - real deployed auf 131, end-zu-ende bewiesen: echtes Modul registriert+provisioniert, echter Tenant-KEK erzeugt, curl gegen laufenden Dienst liefert exakt denselben KEK zurueck (byte-fuer-byte verglichen), falsches Credential -> 403 - reale Grant-Luecke gefunden und behoben (nexarch_core auf tenant_keks), verifiziert Pruefungen siehe docs/API-12-PRUEFPROTOKOLL.md
83 lines
2.4 KiB
Go
83 lines
2.4 KiB
Go
// kek-api ist der Aufrufpunkt fuer API-12: startet den bereits fertigen
|
|
// API-10-Handler (internal/kek) als eigenstaendigen HTTP-Dienst.
|
|
// REINES WIRING — keine Aenderung an internal/kek/, internal/moduleregistry/
|
|
// oder internal/tenant/.
|
|
package main
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
|
|
"gitea.perlbach24.de/scripte/nexarch/internal/flag"
|
|
"gitea.perlbach24.de/scripte/nexarch/internal/kek"
|
|
"gitea.perlbach24.de/scripte/nexarch/internal/moduleregistry"
|
|
"gitea.perlbach24.de/scripte/nexarch/internal/tenant"
|
|
)
|
|
|
|
// tenantResolverAdapter erfüllt kek.TenantResolver über den bestehenden
|
|
// tenant.Registry.GetBySlug-Zugriff — kein neuer Tenant-Code, nur
|
|
// Signatur-Anpassung.
|
|
type tenantResolverAdapter struct{ registry *tenant.Registry }
|
|
|
|
func (a tenantResolverAdapter) ResolveTenantID(ctx context.Context, tenantSlug string) (string, error) {
|
|
t, err := a.registry.GetBySlug(ctx, tenantSlug)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return t.ID, nil
|
|
}
|
|
|
|
func requireEnv(name string) string {
|
|
v := os.Getenv(name)
|
|
if v == "" {
|
|
log.Fatalf("%s muss gesetzt sein", name)
|
|
}
|
|
return v
|
|
}
|
|
|
|
func main() {
|
|
registryDSN := requireEnv("NEXARCH_KEK_REGISTRY_DSN")
|
|
masterKeyEnvVar := os.Getenv("NEXARCH_KEK_MASTER_KEY_ENV")
|
|
if masterKeyEnvVar == "" {
|
|
masterKeyEnvVar = "NEXARCH_KEK_MASTER_KEY"
|
|
}
|
|
addr := os.Getenv("NEXARCH_KEK_API_LISTEN_ADDR")
|
|
if addr == "" {
|
|
addr = "127.0.0.1:8102"
|
|
}
|
|
|
|
masterKey, err := kek.LoadMasterKeyFromEnv(masterKeyEnvVar)
|
|
if err != nil {
|
|
log.Fatalf("master-key laden: %v", err)
|
|
}
|
|
|
|
ctx := context.Background()
|
|
pool, err := pgxpool.New(ctx, registryDSN)
|
|
if err != nil {
|
|
log.Fatalf("datenbankverbindung: %v", err)
|
|
}
|
|
defer pool.Close()
|
|
|
|
flagStore := flag.NewStore(pool)
|
|
flagService := flag.NewService(flagStore, 30*time.Second)
|
|
registry := moduleregistry.NewRegistry(pool, flagService)
|
|
tenantRegistry := tenant.NewRegistry(pool)
|
|
store := kek.NewStore(pool)
|
|
|
|
handler := kek.NewHandler(store, masterKey, registry, registry, tenantResolverAdapter{registry: tenantRegistry})
|
|
|
|
mux := http.NewServeMux()
|
|
mux.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) })
|
|
mux.HandleFunc("/internal/kek/tenant", handler.TenantKEKHandler)
|
|
|
|
log.Printf("kek-api: listening on %s", addr)
|
|
if err := http.ListenAndServe(addr, mux); err != nil {
|
|
log.Fatalf("http server: %v", err)
|
|
}
|
|
}
|