package main import ( "log" "net/http" "time" "gitlab.com/wpetit/goweb/cqrs" "gitlab.com/wpetit/goweb/template/html" "forge.cadoles.com/wpetit/hydra-passwordless/internal/command" "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/internal/query" "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) } // Generate random token signing key if none is set if conf.HTTP.TokenSigningKey == "" { log.Println("could not find token signing key. generating one...") tokenSigningKey, err := gorilla.GenerateRandomBytes(64) if err != nil { return nil, errors.Wrap(err, "could not generate token signing key") } conf.HTTP.TokenSigningKey = string(tokenSigningKey) } // Generate random token encryption key if none is set if conf.HTTP.TokenEncryptionKey == "" { log.Println("could not find token encryption key. generating one...") tokenEncryptionKey, err := gorilla.GenerateRandomBytes(32) if err != nil { return nil, errors.Wrap(err, "could not generate token encryption key") } conf.HTTP.TokenEncryptionKey = string(tokenEncryptionKey) } // 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)) 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), )) ctn.Provide(cqrs.ServiceName, cqrs.ServiceProvider()) bus, err := cqrs.From(ctn) if err != nil { return nil, err } bus.RegisterCommand( cqrs.MatchCommandRequest(&command.SendConfirmationEmailRequest{}), cqrs.CommandHandlerFunc(command.HandleSendConfirmationEmailRequest), ) bus.RegisterQuery( cqrs.MatchQueryRequest(&query.VerifyUserRequest{}), cqrs.QueryHandlerFunc(query.HandleVerifyUserRequest), ) return ctn, nil }