2023-01-12 12:51:51 +01:00

82 lines
2.2 KiB
Go

// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
// Licensed under the GNU Affero General Public License (AGPL).
// See License.AGPL.txt in the project root for license information.
package server
import (
"fmt"
"path/filepath"
db "github.com/gitpod-io/gitpod/components/gitpod-db/go"
v1 "github.com/gitpod-io/gitpod/components/iam-api/go/v1"
"github.com/gitpod-io/gitpod/common-go/baseserver"
"github.com/gitpod-io/gitpod/iam/pkg/apiv1"
"github.com/gitpod-io/gitpod/iam/pkg/config"
"github.com/gitpod-io/gitpod/iam/pkg/oidc"
"github.com/go-chi/chi/v5"
"github.com/sirupsen/logrus"
)
func Start(logger *logrus.Entry, version string, cfg *config.ServiceConfig) error {
logger.WithField("config", cfg).Info("Starting IAM server.")
dbConn, err := db.Connect(db.ConnectionParamsFromEnv())
if err != nil {
return fmt.Errorf("failed to establish database connection: %w", err)
}
cipherSet, err := db.NewCipherSetFromKeysInFile(filepath.Join(cfg.DatabaseConfigPath, "encryptionKeys"))
if err != nil {
return fmt.Errorf("failed to read cipherset from file: %w", err)
}
srv, err := baseserver.New("iam",
baseserver.WithLogger(logger),
baseserver.WithConfig(cfg.Server),
baseserver.WithVersion(version),
)
if err != nil {
return fmt.Errorf("failed to initialize IAM server: %w", err)
}
oidcService := oidc.NewService(cfg.SessionServiceAddress)
oidcClientConfigService := apiv1.NewOIDCClientConfigService(dbConn, cipherSet)
err = register(srv, &dependencies{
oidcClientConfigSvc: oidcClientConfigService,
oidcService: oidcService,
})
if err != nil {
return fmt.Errorf("failed to register services for iam server: %w", err)
}
if listenErr := srv.ListenAndServe(); listenErr != nil {
return fmt.Errorf("failed to serve iam server: %w", listenErr)
}
return nil
}
type dependencies struct {
oidcClientConfigSvc v1.OIDCServiceServer
oidcService *oidc.Service
}
func register(srv *baseserver.Server, deps *dependencies) error {
// HTTP
rootHandler := chi.NewRouter()
rootHandler.Mount("/oidc", oidc.Router(deps.oidcService))
// All root requests are handled by our router
srv.HTTPMux().Handle("/", rootHandler)
// gRPC
v1.RegisterOIDCServiceServer(srv.GRPC(), deps.oidcClientConfigSvc)
return nil
}