package main import ( "context" "log" "net/http" "time" "gitlab.com/wpetit/goweb/template/html" "forge.cadoles.com/wpetit/hydra-passwordless/internal/config" "forge.cadoles.com/wpetit/hydra-passwordless/internal/hydra" "forge.cadoles.com/wpetit/hydra-passwordless/internal/mail" "forge.cadoles.com/wpetit/hydra-passwordless/oidc" "github.com/gorilla/sessions" "github.com/pkg/errors" "gitlab.com/wpetit/goweb/service" "gitlab.com/wpetit/goweb/service/build" "gitlab.com/wpetit/goweb/service/session" "gitlab.com/wpetit/goweb/service/template" "gitlab.com/wpetit/goweb/session/gorilla" ) func getServiceContainer(conf *config.Config) (*service.Container, error) { // Initialize and configure service container ctn := service.NewContainer() ctn.Provide(build.ServiceName, build.ServiceProvider(ProjectVersion, GitRef, BuildDate)) // Generate random cookie authentication key if none is set if conf.HTTP.CookieAuthenticationKey == "" { log.Println("could not find cookie authentication key. generating one...") cookieAuthenticationKey, err := gorilla.GenerateRandomBytes(64) if err != nil { return nil, errors.Wrap(err, "could not generate cookie authentication key") } conf.HTTP.CookieAuthenticationKey = string(cookieAuthenticationKey) } // Generate random cookie encryption key if none is set if conf.HTTP.CookieEncryptionKey == "" { log.Println("could not find cookie encryption key. generating one...") cookieEncryptionKey, err := gorilla.GenerateRandomBytes(32) if err != nil { return nil, errors.Wrap(err, "could not generate cookie encryption key") } conf.HTTP.CookieEncryptionKey = string(cookieEncryptionKey) } // Create and initialize HTTP session service provider cookieStore := sessions.NewCookieStore( []byte(conf.HTTP.CookieAuthenticationKey), []byte(conf.HTTP.CookieEncryptionKey), ) // Define default cookie options cookieStore.Options = &sessions.Options{ Path: "/", HttpOnly: true, MaxAge: conf.HTTP.CookieMaxAge, SameSite: http.SameSiteStrictMode, } ctn.Provide( session.ServiceName, gorilla.ServiceProvider("hydra-passwordless", cookieStore), ) // Create and expose template service provider // Create and expose template service provider ctn.Provide(template.ServiceName, html.ServiceProvider( conf.HTTP.TemplateDir, )) // Create and expose config service provider ctn.Provide(config.ServiceName, config.ServiceProvider(conf)) if conf.TestApp.Enabled { ctx := context.Background() provider, err := oidc.NewProvider(ctx, conf.TestApp.IssuerURL) if err != nil { return nil, errors.Wrap(err, "could not create oidc provider") } ctn.Provide(oidc.ServiceName, oidc.ServiceProvider( oidc.WithCredentials(conf.TestApp.ClientID, conf.TestApp.ClientSecret), oidc.WithProvider(provider), )) } ctn.Provide(hydra.ServiceName, hydra.ServiceProvider(conf.Hydra.BaseURL, 30*time.Second)) ctn.Provide(mail.ServiceName, mail.ServiceProvider( mail.WithServer(conf.SMTP.Host, conf.SMTP.Port), mail.WithCredentials(conf.SMTP.User, conf.SMTP.Password), mail.WithTLS(conf.SMTP.UseStartTLS, conf.SMTP.InsecureSkipVerify), )) return ctn, nil }