package main import ( "errors" "log" "net/http" "cmbuyer/admin/internal/auth" "cmbuyer/admin/internal/config" "cmbuyer/admin/internal/deviceauth" "cmbuyer/admin/internal/server" evidencestorage "cmbuyer/admin/internal/storage/evidence" "cmbuyer/admin/internal/storage/sqlite" "cmbuyer/admin/internal/taskclaim" "cmbuyer/admin/internal/taskdetail" "cmbuyer/admin/internal/tasks" ) // Device Bearer credentials must not cross a plaintext LAN. The MVP is a same-computer // deployment, so widening this address requires a separately reviewed TLS boundary first. const listenAddress = "127.0.0.1:8080" func main() { if err := run(); err != nil { log.Fatal(err) } } func run() error { configuration, err := config.LoadFromEnv() if err != nil { return err } database, err := sqlite.Open(configuration.DatabaseSource) if err != nil { return err } defer database.Close() taskStore, err := tasks.NewSQLiteStore(database) if err != nil { return err } taskStore.SetStartPolicy(tasks.StartPolicy{AuthorizationTTL: configuration.AuthorizationTTL, MaxQuantity: configuration.MaxTaskQuantity, MaxTotalPrice: configuration.MaxTotalPrice}) detailStore, err := taskdetail.NewSQLiteStore(database) if err != nil { return err } evidenceStore, err := evidencestorage.NewStore(database, configuration.EvidenceDirectory) if err != nil { return err } deviceAuthenticator, err := deviceauth.NewSQLiteAuthenticator(database) if err != nil { return err } claimStore, err := taskclaim.NewStore(database, configuration.ClaimTokenSecret, configuration.ClaimLeaseTTL) if err != nil { return err } router, err := server.NewRouter(server.Options{ AdminUsername: configuration.AdminUsername, AdminPasswordBcrypt: configuration.AdminPasswordBcrypt, Sessions: auth.NewManager(configuration.SessionSecret, configuration.CookieSecure), Tasks: taskStore, TaskDetails: detailStore, Evidence: evidenceStore, DeviceAuthenticator: deviceAuthenticator, TaskClaims: claimStore, }) if err != nil { return err } err = http.ListenAndServe(listenAddress, router) if errors.Is(err, http.ErrServerClosed) { return nil } return err }