diff --git a/.goreleaser.yaml b/.goreleaser.yaml index cefcffde72..2f69f14aee 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -10,6 +10,7 @@ before: - docker build -f build/grpc/Dockerfile -t zitadel-base:local . - docker build -f build/zitadel/Dockerfile . -t zitadel-go-test --target go-codecov -o .artifacts/codecov - docker build -f build/zitadel/Dockerfile . -t zitadel-go-base --target go-copy -o .artifacts/grpc/go-client + - sh -c "cp -r .artifacts/grpc/go-client/* ." - docker build -f build/console/Dockerfile . -t zitadel-npm-base --target npm-copy -o .artifacts/grpc/js-client - docker build -f build/console/Dockerfile . -t zitadel-npm-base --target angular-export -o .artifacts/console builds: diff --git a/build/zitadel/Dockerfile b/build/zitadel/Dockerfile index ece0567580..cc8c972ac7 100644 --- a/build/zitadel/Dockerfile +++ b/build/zitadel/Dockerfile @@ -29,15 +29,15 @@ RUN rm -r cockroach-v21.2.5.linux-amd64 ## generates static files ####################### FROM go-dep AS go-static -COPY internal/ui/login/static internal/ui/login/static -COPY internal/ui/login/statik internal/ui/login/statik +COPY internal/api/ui/login/static internal/api/ui/login/static +COPY internal/api/ui/login/statik internal/api/ui/login/statik COPY internal/notification/static internal/notification/static COPY internal/notification/statik internal/notification/statik COPY internal/static internal/static COPY internal/statik internal/statik -RUN go generate internal/ui/login/statik/generate.go \ - && go generate internal/ui/login/static/generate.go \ +RUN go generate internal/api/ui/login/statik/generate.go \ + && go generate internal/api/ui/login/static/generate.go \ && go generate internal/notification/statik/generate.go \ && go generate internal/statik/generate.go @@ -71,7 +71,7 @@ COPY . . ## copy for local dev ####################### FROM scratch as go-copy -COPY --from=go-stub /go/src/github.com/caos/zitadel/internal/ui/login/statik/statik.go internal/ui/login/statik/statik.go +COPY --from=go-stub /go/src/github.com/caos/zitadel/internal/api/ui/login/statik/statik.go internal/api/ui/login/statik/statik.go COPY --from=go-stub /go/src/github.com/caos/zitadel/internal/notification/statik/statik.go internal/notification/statik/statik.go COPY --from=go-stub /go/src/github.com/caos/zitadel/internal/statik/statik.go internal/statik/statik.go COPY --from=go-stub /go/src/github.com/caos/zitadel/openapi/statik/statik.go openapi/statik/statik.go diff --git a/cmd/admin/start/start.go b/cmd/admin/start/start.go index a0bf8ba286..7623ec6d4a 100644 --- a/cmd/admin/start/start.go +++ b/cmd/admin/start/start.go @@ -1,23 +1,306 @@ package start import ( + "context" + "database/sql" _ "embed" + "errors" + "fmt" + "net" + "net/http" + "os" + "os/signal" + "syscall" + "time" "github.com/caos/logging" + "github.com/gorilla/mux" + "github.com/mitchellh/mapstructure" "github.com/spf13/cobra" + "github.com/spf13/viper" + "golang.org/x/net/http2" + "golang.org/x/net/http2/h2c" + + admin_es "github.com/caos/zitadel/internal/admin/repository/eventsourcing" + "github.com/caos/zitadel/internal/api" + "github.com/caos/zitadel/internal/api/assets" + internal_authz "github.com/caos/zitadel/internal/api/authz" + "github.com/caos/zitadel/internal/api/grpc/admin" + "github.com/caos/zitadel/internal/api/grpc/auth" + "github.com/caos/zitadel/internal/api/grpc/management" + http_util "github.com/caos/zitadel/internal/api/http" + "github.com/caos/zitadel/internal/api/http/middleware" + "github.com/caos/zitadel/internal/api/oidc" + "github.com/caos/zitadel/internal/api/ui/console" + "github.com/caos/zitadel/internal/api/ui/login" + auth_es "github.com/caos/zitadel/internal/auth/repository/eventsourcing" + "github.com/caos/zitadel/internal/authz" + authz_repo "github.com/caos/zitadel/internal/authz/repository" + "github.com/caos/zitadel/internal/command" + "github.com/caos/zitadel/internal/config/systemdefaults" + "github.com/caos/zitadel/internal/crypto" + "github.com/caos/zitadel/internal/database" + "github.com/caos/zitadel/internal/domain" + "github.com/caos/zitadel/internal/eventstore" + "github.com/caos/zitadel/internal/id" + "github.com/caos/zitadel/internal/notification" + "github.com/caos/zitadel/internal/query" + "github.com/caos/zitadel/internal/query/projection" + "github.com/caos/zitadel/internal/static" + static_config "github.com/caos/zitadel/internal/static/config" + "github.com/caos/zitadel/internal/webauthn" + "github.com/caos/zitadel/openapi" ) func New() *cobra.Command { - return &cobra.Command{ + start := &cobra.Command{ Use: "start", Short: "starts ZITADEL instance", Long: `starts ZITADEL. Requirements: - cockroachdb`, RunE: func(cmd *cobra.Command, args []string) error { - logging.Info("hello world") - logging.WithFields("field", 1).Info("hello world") - return nil + config := new(startConfig) + err := viper.Unmarshal(config, viper.DecodeHook(mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(":"), + ))) + if err != nil { + return err + } + err = config.Log.SetLogger() + if err != nil { + return err + } + return startZitadel(config) }, } + bindUint16Flag(start, "port", "port to run ZITADEL on") + bindStringFlag(start, "externalDomain", "domain ZITADEL will be exposed on") + bindStringFlag(start, "externalPort", "port ZITADEL will be exposed on") + bindBoolFlag(start, "externalSecure", "if ZITADEL will be served on HTTPS") + + return start +} + +func bindStringFlag(cmd *cobra.Command, name, description string) { + cmd.PersistentFlags().String(name, viper.GetString(name), description) + viper.BindPFlag(name, cmd.PersistentFlags().Lookup(name)) +} + +func bindUint16Flag(cmd *cobra.Command, name, description string) { + cmd.PersistentFlags().Uint16(name, uint16(viper.GetUint(name)), description) + viper.BindPFlag(name, cmd.PersistentFlags().Lookup(name)) +} + +func bindBoolFlag(cmd *cobra.Command, name, description string) { + cmd.PersistentFlags().Bool(name, viper.GetBool(name), description) + viper.BindPFlag(name, cmd.PersistentFlags().Lookup(name)) +} + +type startConfig struct { + Log *logging.Config + Port uint16 + ExternalPort uint16 + ExternalDomain string + ExternalSecure bool + Database database.Config + Projections projectionConfig + AuthZ authz.Config + Auth auth_es.Config + Admin admin_es.Config + UserAgentCookie *middleware.UserAgentCookieConfig + OIDC oidc.Config + Login login.Config + Console console.Config + Notification notification.Config + AssetStorage static_config.AssetStorageConfig + InternalAuthZ internal_authz.Config + SystemDefaults systemdefaults.SystemDefaults +} + +type projectionConfig struct { + projection.Config + KeyConfig *crypto.KeyConfig +} + +func startZitadel(config *startConfig) error { + ctx := context.Background() + keyChan := make(chan interface{}) + + dbClient, err := database.Connect(config.Database) + if err != nil { + return fmt.Errorf("cannot start client for projection: %w", err) + } + var storage static.Storage + //TODO: enable when storage is implemented again + //if *assetsEnabled { + //storage, err = config.AssetStorage.Config.NewStorage() + //logging.Log("MAIN-Bfhe2").OnError(err).Fatal("Unable to start asset storage") + //} + eventstoreClient, err := eventstore.Start(dbClient) + if err != nil { + return fmt.Errorf("cannot start eventstore for queries: %w", err) + } + queries, err := query.StartQueries(ctx, eventstoreClient, dbClient, config.Projections.Config, config.SystemDefaults, config.Projections.KeyConfig, keyChan, config.InternalAuthZ.RolePermissionMappings) + if err != nil { + return fmt.Errorf("cannot start queries: %w", err) + } + + authZRepo, err := authz.Start(config.AuthZ, config.SystemDefaults, queries, dbClient, config.OIDC.KeyConfig) + if err != nil { + return fmt.Errorf("error starting authz repo: %w", err) + } + webAuthNConfig := webauthn.Config{ + ID: config.ExternalDomain, + Origin: http_util.BuildHTTP(config.ExternalDomain, config.ExternalPort, config.ExternalSecure), + DisplayName: "ZITADEL", + } + commands, err := command.StartCommands(eventstoreClient, config.SystemDefaults, config.InternalAuthZ, storage, authZRepo, config.OIDC.KeyConfig, webAuthNConfig) + if err != nil { + return fmt.Errorf("cannot start commands: %w", err) + } + + notification.Start(config.Notification, config.SystemDefaults, commands, queries, dbClient, assets.HandlerPrefix) + + router := mux.NewRouter() + err = startAPIs(ctx, router, commands, queries, eventstoreClient, dbClient, keyChan, config, storage, authZRepo) + if err != nil { + return err + } + return listen(ctx, router, config.Port) +} + +func startAPIs(ctx context.Context, router *mux.Router, commands *command.Commands, queries *query.Queries, eventstore *eventstore.Eventstore, dbClient *sql.DB, keyChan chan interface{}, config *startConfig, store static.Storage, authZRepo authz_repo.Repository) error { + repo := struct { + authz_repo.Repository + *query.Queries + }{ + authZRepo, + queries, + } + verifier := internal_authz.Start(repo) + + apis := api.New(config.Port, router, &repo, config.InternalAuthZ, config.SystemDefaults, config.ExternalSecure) + + authRepo, err := auth_es.Start(config.Auth, config.SystemDefaults, commands, queries, dbClient, config.OIDC.KeyConfig, assets.HandlerPrefix) + if err != nil { + return fmt.Errorf("error starting auth repo: %w", err) + } + adminRepo, err := admin_es.Start(config.Admin, store, dbClient, login.HandlerPrefix) + if err != nil { + return fmt.Errorf("error starting admin repo: %w", err) + } + if err := apis.RegisterServer(ctx, admin.CreateServer(commands, queries, adminRepo, config.SystemDefaults.Domain, assets.HandlerPrefix)); err != nil { + return err + } + if err := apis.RegisterServer(ctx, management.CreateServer(commands, queries, config.SystemDefaults, assets.HandlerPrefix)); err != nil { + return err + } + if err := apis.RegisterServer(ctx, auth.CreateServer(commands, queries, authRepo, config.SystemDefaults, assets.HandlerPrefix)); err != nil { + return err + } + + apis.RegisterHandler(assets.HandlerPrefix, assets.NewHandler(commands, verifier, config.InternalAuthZ, id.SonyFlakeGenerator, store, queries)) + + userAgentInterceptor, err := middleware.NewUserAgentHandler(config.UserAgentCookie, config.ExternalDomain, id.SonyFlakeGenerator, config.ExternalSecure) + if err != nil { + return err + } + + issuer := oidc.Issuer(config.ExternalDomain, config.ExternalPort, config.ExternalSecure) + oidcProvider, err := oidc.NewProvider(ctx, config.OIDC, issuer, login.DefaultLoggedOutPath, commands, queries, authRepo, config.SystemDefaults.KeyConfig, eventstore, dbClient, keyChan, userAgentInterceptor) + if err != nil { + return fmt.Errorf("unable to start oidc provider: %w", err) + } + apis.RegisterHandler(oidc.HandlerPrefix, oidcProvider.HttpHandler()) + + openAPIHandler, err := openapi.Start() + if err != nil { + return fmt.Errorf("unable to start openapi handler: %w", err) + } + apis.RegisterHandler(openapi.HandlerPrefix, openAPIHandler) + + consoleID, err := consoleClientID(ctx, queries) + if err != nil { + return fmt.Errorf("unable to get client_id for console: %w", err) + } + c, err := console.Start(config.Console, config.ExternalDomain, http_util.BuildHTTP(config.ExternalDomain, config.ExternalPort, config.ExternalSecure), issuer, consoleID) + if err != nil { + return fmt.Errorf("unable to start console: %w", err) + } + apis.RegisterHandler(console.HandlerPrefix, c) + + l, err := login.CreateLogin(config.Login, commands, queries, authRepo, store, config.SystemDefaults, console.HandlerPrefix, config.ExternalDomain, oidc.AuthCallback, config.ExternalSecure, userAgentInterceptor) + if err != nil { + return fmt.Errorf("unable to start login: %w", err) + } + apis.RegisterHandler(login.HandlerPrefix, l.Handler()) + + return nil +} + +func listen(ctx context.Context, router *mux.Router, port uint16) error { + http2Server := &http2.Server{} + http1Server := &http.Server{Handler: h2c.NewHandler(router, http2Server)} + lis, err := net.Listen("tcp", fmt.Sprintf(":%d", port)) + if err != nil { + return fmt.Errorf("tcp listener on %d failed: %w", port, err) + } + + errCh := make(chan error) + + go func() { + logging.Infof("server is listening on %s", lis.Addr().String()) + errCh <- http1Server.Serve(lis) + }() + + shutdown := make(chan os.Signal, 1) + signal.Notify(shutdown, os.Interrupt, syscall.SIGTERM) + + select { + case err := <-errCh: + return fmt.Errorf("error starting server: %w", err) + case <-shutdown: + ctx, cancel := context.WithTimeout(ctx, 5*time.Second) + defer cancel() + return shutdownServer(ctx, http1Server) + case <-ctx.Done(): + return shutdownServer(ctx, http1Server) + } +} + +func shutdownServer(ctx context.Context, server *http.Server) error { + err := server.Shutdown(ctx) + if err != nil { + return fmt.Errorf("could not shutdown gracefully: %w", err) + } + logging.New().Info("server shutdown gracefully") + return nil +} + +//TODO:!!??!! +func consoleClientID(ctx context.Context, queries *query.Queries) (string, error) { + iam, err := queries.IAMByID(ctx, domain.IAMID) + if err != nil { + return "", err + } + projectID, err := query.NewAppProjectIDSearchQuery(iam.IAMProjectID) + if err != nil { + return "", err + } + name, err := query.NewAppNameSearchQuery(query.TextContainsIgnoreCase, "console") //TODO:!!??!! + if err != nil { + return "", err + } + apps, err := queries.SearchApps(ctx, &query.AppSearchQueries{ + Queries: []query.SearchQuery{projectID, name}, + }) + if err != nil { + return "", err + } + if len(apps.Apps) != 1 || apps.Apps[0].OIDCConfig == nil { + return "", errors.New("invalid app") + } + return apps.Apps[0].OIDCConfig.ClientID, nil } diff --git a/cmd/defaults.yaml b/cmd/defaults.yaml index b62e31457e..3f5a56b4f9 100644 --- a/cmd/defaults.yaml +++ b/cmd/defaults.yaml @@ -3,18 +3,278 @@ Log: Formatter: Format: text -database: - host: localhost - port: 26257 - user: zitadel - database: zitadel - password: - maxOpenConns: 3 - ssl: - mode: disable - rootCert: - cert: - key: - options: - # MaxConnLifetime: 30m - # MaxConnIdleTime: 30m +Port: 8080 +ExternalPort: 8080 +ExternalDomain: localhost +ExternalSecure: true + +Database: + Host: localhost + Port: 26257 + User: zitadel + Database: zitadel + Password: "" + MaxOpenConns: 20 + MaxConnLifetime: 30m + MaxConnIdleTime: 30m + Options: "" + SSL: + Mode: diabled + RootCert: "" + Cert: "" + Key: "" + +Projections: + Config: + RequeueEvery: 10s + RetryFailedAfter: 1s + MaxFailureCount: 5 + BulkLimit: 200 + MaxIterators: 1 + Customizations: + projects: + BulkLimit: 2000 + KeyConfig: + # We don't need an EncryptionKey but DecryptionKeys (and load them via env) + DecryptionKeyIDs: + Path: "" + +AuthZ: + Repository: + Spooler: + ConcurrentWorkers: 1 + BulkLimit: 10000 + FailureCountUntilSkip: 5 + +Auth: + SearchLimit: 1000 + Spooler: + ConcurrentWorkers: 1 + BulkLimit: 10000 + FailureCountUntilSkip: 5 + +Admin: + SearchLimit: 1000 + Spooler: + ConcurrentWorkers: 1 + BulkLimit: 10000 + FailureCountUntilSkip: 5 + +UserAgentCookie: + Name: zitadel.useragent + Key: + EncryptionKeyID: + MaxAge: 8760h #365*24h (1 year) + +OIDC: + CodeMethodS256: true + AuthMethodPost: true + AuthMethodPrivateKeyJWT: true + GrantTypeRefreshToken: true + RequestObjectSupported: true + SigningKeyAlgorithm: RS256 + DefaultAccessTokenLifetime: 12h + DefaultIdTokenLifetime: 12h + DefaultRefreshTokenIdleExpiration: 720h #30d + DefaultRefreshTokenExpiration: 2160h #90d + Cache: + MaxAge: 12h + SharedMaxAge: 168h #7d + KeyConfig: + EncryptionKeyID: "" + DecryptionKeyIDs: + Path: "" + CustomEndpoints: + +Login: + LanguageCookieName: zitadel.login.lang + CSRF: + CookieName: zitadel.login.csrf + Development: true + Key: + EncryptionKeyID: + Cache: + MaxAge: 12h + SharedMaxAge: 168h #7d + +Console: + ConsoleOverwriteDir: "" + ShortCache: + MaxAge: 5m + SharedMaxAge: 15m + LongCache: + MaxAge: 12h + SharedMaxAge: 168h + +Notification: + Repository: + Spooler: + ConcurrentWorkers: 1 + BulkLimit: 10000 + FailureCountUntilSkip: 5 + Handlers: + +#TODO: configure as soon as possible +#AssetStorage: +# Type: $ZITADEL_ASSET_STORAGE_TYPE +# Config: +# Endpoint: $ZITADEL_ASSET_STORAGE_ENDPOINT +# AccessKeyID: $ZITADEL_ASSET_STORAGE_ACCESS_KEY_ID +# SecretAccessKey: $ZITADEL_ASSET_STORAGE_SECRET_ACCESS_KEY +# SSL: $ZITADEL_ASSET_STORAGE_SSL +# Location: $ZITADEL_ASSET_STORAGE_LOCATION +# BucketPrefix: $ZITADEL_ASSET_STORAGE_BUCKET_PREFIX +# MultiDelete: $ZITADEL_ASSET_STORAGE_MULTI_DELETE + +#TODO: remove as soon as possible +SystemDefaults: + # DefaultLanguage: 'en' + Domain: $ZITADEL_DEFAULT_DOMAIN + ZitadelDocs: + Issuer: $ZITADEL_ISSUER + DiscoveryEndpoint: '$ZITADEL_ISSUER/.well-known/openid-configuration' + UserVerificationKey: + EncryptionKeyID: $ZITADEL_USER_VERIFICATION_KEY + IDPConfigVerificationKey: + EncryptionKeyID: $ZITADEL_IDP_CONFIG_VERIFICATION_KEY + SecretGenerators: + PasswordSaltCost: 14 + ClientSecretGenerator: + Length: 64 + IncludeLowerLetters: true + IncludeUpperLetters: true + IncludeDigits: true + IncludeSymbols: false + InitializeUserCode: + Length: 6 + Expiry: '72h' + IncludeLowerLetters: false + IncludeUpperLetters: true + IncludeDigits: true + IncludeSymbols: false + EmailVerificationCode: + Length: 6 + Expiry: '1h' + IncludeLowerLetters: false + IncludeUpperLetters: true + IncludeDigits: true + IncludeSymbols: false + PhoneVerificationCode: + Length: 6 + Expiry: '1h' + IncludeLowerLetters: false + IncludeUpperLetters: true + IncludeDigits: true + IncludeSymbols: false + PasswordVerificationCode: + Length: 6 + Expiry: '1h' + IncludeLowerLetters: false + IncludeUpperLetters: true + IncludeDigits: true + IncludeSymbols: false + PasswordlessInitCode: + Length: 12 + Expiry: '1h' + IncludeLowerLetters: true + IncludeUpperLetters: true + IncludeDigits: true + IncludeSymbols: false + MachineKeySize: 2048 + ApplicationKeySize: 2048 + Multifactors: + OTP: + Issuer: 'ZITADEL' + VerificationKey: + EncryptionKeyID: $ZITADEL_OTP_VERIFICATION_KEY + VerificationLifetimes: + PasswordCheck: 240h #10d + ExternalLoginCheck: 240h #10d + MFAInitSkip: 720h #30d + SecondFactorCheck: 18h + MultiFactorCheck: 12h + IamID: 'IAM' + DomainVerification: + VerificationKey: + EncryptionKeyID: $ZITADEL_DOMAIN_VERIFICATION_KEY + VerificationGenerator: + Length: 32 + IncludeLowerLetters: true + IncludeUpperLetters: true + IncludeDigits: true + IncludeSymbols: false + Notifications: + # DebugMode: $DEBUG_MODE + Endpoints: + InitCode: '$ZITADEL_ACCOUNTS/user/init?userID={{.UserID}}&code={{.Code}}&passwordset={{.PasswordSet}}' + PasswordReset: '$ZITADEL_ACCOUNTS/password/init?userID={{.UserID}}&code={{.Code}}' + VerifyEmail: '$ZITADEL_ACCOUNTS/mail/verification?userID={{.UserID}}&code={{.Code}}' + DomainClaimed: '$ZITADEL_ACCOUNTS/login' + PasswordlessRegistration: '$ZITADEL_ACCOUNTS/login/passwordless/init' + Providers: + Email: + SMTP: + Host: $SMTP_HOST + User: $SMTP_USER + Password: $SMTP_PASSWORD + From: $EMAIL_SENDER_ADDRESS + FromName: $EMAIL_SENDER_NAME + # Tls: $SMTP_TLS + Twilio: + SID: $TWILIO_SERVICE_SID + Token: $TWILIO_TOKEN + From: $TWILIO_SENDER_NAME + FileSystem: + # Enabled: $FS_NOTIFICATIONS_ENABLED + Path: $FS_NOTIFICATIONS_PATH + # Compact: $FS_NOTIFICATIONS_COMPACT + Log: + # Enabled: $LOG_NOTIFICATIONS_ENABLED + # Compact: $LOG_NOTIFICATIONS_COMPACT + Chat: + # Enabled: $CHAT_ENABLED + Url: $CHAT_URL + # Compact: $CHAT_COMPACT + SplitCount: 4000 + TemplateData: + InitCode: + Title: 'InitCode.Title' + PreHeader: 'InitCode.PreHeader' + Subject: 'InitCode.Subject' + Greeting: 'InitCode.Greeting' + Text: 'InitCode.Text' + ButtonText: 'InitCode.ButtonText' + PasswordReset: + Title: 'PasswordReset.Title' + PreHeader: 'PasswordReset.PreHeader' + Subject: 'PasswordReset.Subject' + Greeting: 'PasswordReset.Greeting' + Text: 'PasswordReset.Text' + ButtonText: 'PasswordReset.ButtonText' + VerifyEmail: + Title: 'VerifyEmail.Title' + PreHeader: 'VerifyEmail.PreHeader' + Subject: 'VerifyEmail.Subject' + Greeting: 'VerifyEmail.Greeting' + Text: 'VerifyEmail.Text' + ButtonText: 'VerifyEmail.ButtonText' + VerifyPhone: + Title: 'VerifyPhone.Title' + PreHeader: 'VerifyPhone.PreHeader' + Subject: 'VerifyPhone.Subject' + Greeting: 'VerifyPhone.Greeting' + Text: 'VerifyPhone.Text' + ButtonText: 'VerifyPhone.ButtonText' + DomainClaimed: + Title: 'DomainClaimed.Title' + PreHeader: 'DomainClaimed.PreHeader' + Subject: 'DomainClaimed.Subject' + Greeting: 'DomainClaimed.Greeting' + Text: 'DomainClaimed.Text' + ButtonText: 'DomainClaimed.ButtonText' + KeyConfig: + Size: 2048 + PrivateKeyLifetime: 6h + PublicKeyLifetime: 30h + SigningKeyRotationCheck: 10s + SigningKeyGracefulPeriod: 10m diff --git a/cmd/zitadel.go b/cmd/zitadel.go index 465a9e24e0..627fae25e5 100644 --- a/cmd/zitadel.go +++ b/cmd/zitadel.go @@ -4,11 +4,13 @@ import ( "bytes" _ "embed" "io" + "strings" "github.com/caos/logging" - "github.com/caos/zitadel/cmd/admin" "github.com/spf13/cobra" "github.com/spf13/viper" + + "github.com/caos/zitadel/cmd/admin" ) var ( @@ -29,9 +31,11 @@ func New(out io.Writer, in io.Reader, args []string) *cobra.Command { } viper.AutomaticEnv() + viper.SetEnvPrefix("ZITADEL") + viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) viper.SetConfigType("yaml") err := viper.ReadConfig(bytes.NewBuffer(defaultConfig)) - logging.New().OnError(err).Fatal("unable to read default config") + logging.OnError(err).Fatal("unable to read default config") cobra.OnInitialize(initConfig) cmd.PersistentFlags().StringArrayVar(&configFiles, "config", nil, "path to config file to overwrite system defaults") diff --git a/go.mod b/go.mod index fe96d2fb7b..9615d7a70f 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b github.com/allegro/bigcache v1.2.1 github.com/boombuler/barcode v1.0.1 - github.com/caos/logging v0.3.0 + github.com/caos/logging v0.3.1 github.com/caos/oidc v1.0.1 github.com/cockroachdb/cockroach-go/v2 v2.2.4 github.com/dop251/goja v0.0.0-20211129110639-4739a1d10a51 @@ -30,12 +30,14 @@ require ( github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.1 + github.com/improbable-eng/grpc-web v0.15.0 github.com/jinzhu/gorm v1.9.16 github.com/k3a/html2text v1.0.8 github.com/kevinburke/twilio-go v0.0.0-20210327194925-1623146bcf73 github.com/lib/pq v1.10.4 github.com/lucasb-eyer/go-colorful v1.2.0 github.com/minio/minio-go/v7 v7.0.20 + github.com/mitchellh/mapstructure v1.4.3 github.com/muesli/gamut v0.2.0 github.com/nicksnyder/go-i18n/v2 v2.1.2 github.com/pkg/errors v0.9.1 @@ -60,6 +62,7 @@ require ( go.opentelemetry.io/otel/sdk/metric v0.25.0 go.opentelemetry.io/otel/trace v1.2.0 golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871 + golang.org/x/net v0.0.0-20220121210141-e204ce36a2ba golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/text v0.3.7 @@ -84,6 +87,7 @@ require ( github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4 // indirect github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91 // indirect github.com/dustin/go-humanize v1.0.0 // indirect github.com/envoyproxy/go-control-plane v0.10.1 // indirect @@ -103,6 +107,7 @@ require ( github.com/google/uuid v1.3.0 // indirect github.com/googleapis/gax-go/v2 v2.1.1 // indirect github.com/gorilla/handlers v1.5.1 // indirect + github.com/gorilla/websocket v1.4.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/huandu/xstrings v1.3.2 // indirect github.com/imdario/mergo v0.3.12 // indirect @@ -122,7 +127,6 @@ require ( github.com/minio/sha256-simd v0.1.1 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/mapstructure v1.4.3 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -151,7 +155,6 @@ require ( go.opentelemetry.io/proto/otlp v0.10.0 // indirect golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 // indirect golang.org/x/mod v0.5.1 // indirect - golang.org/x/net v0.0.0-20220121210141-e204ce36a2ba // indirect golang.org/x/sys v0.0.0-20220209214540-3681064d5158 // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect google.golang.org/api v0.63.0 // indirect @@ -159,6 +162,7 @@ require ( gopkg.in/ini.v1 v1.66.4 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect + nhooyr.io/websocket v1.8.7 // indirect ) replace github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.7.4 diff --git a/go.sum b/go.sum index 7eed40d7d1..a3b0b63b54 100644 --- a/go.sum +++ b/go.sum @@ -67,6 +67,7 @@ github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3 github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.0.0 h1:38fNtfhHY6bs22b/D6+hDzO6JR0rDzpGPD36dY2uPL4= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.0.0/go.mod h1:jE23wM1jvwSKgdGcoOkj5j9n1VWtncW36pL2bK1JU+0= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= @@ -78,8 +79,12 @@ github.com/Masterminds/squirrel v1.5.2/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA4 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/VictoriaMetrics/fastcache v1.8.0 h1:ybZqS7kRy8YVzYsI09GLzQhs7iqS6cOEH2avtknD1SU= github.com/VictoriaMetrics/fastcache v1.8.0/go.mod h1:n7Sl+ioh/HlWeYHLSIBIE8TcZFHg/+xgvomWSS5xuEE= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= @@ -95,12 +100,18 @@ github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKS github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/benbjohnson/clock v1.2.0 h1:9Re3G2TWxkE06LdMWMpcY6KV81GLXMGiYpPYUPkFAws= github.com/benbjohnson/clock v1.2.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -115,8 +126,13 @@ github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl github.com/caos/logging v0.0.2/go.mod h1:9LKiDE2ChuGv6CHYif/kiugrfEXu9AwDiFWSreX7Wp0= github.com/caos/logging v0.3.0 h1:PMKd47Aqr98FjAPcAE8v3SCe8eqTEclytruND/zc7QU= github.com/caos/logging v0.3.0/go.mod h1:B8QNS0WDmR2Keac52Fw+XN4ZJkzLDGrcRIPB2Ux4uRo= +github.com/caos/logging v0.3.1 h1:892AMeHs09D0e3ZcGB+QDRsZ5+2xtPAsAhOy8eKfztc= +github.com/caos/logging v0.3.1/go.mod h1:B8QNS0WDmR2Keac52Fw+XN4ZJkzLDGrcRIPB2Ux4uRo= github.com/caos/oidc v1.0.1 h1:8UHAPynCObwaqortppDtJFktjqLDLYSLidkNy0Num4o= github.com/caos/oidc v1.0.1/go.mod h1:4l0PPwdc6BbrdCFhNrRTUddsG292uHGa7gE2DSEIqoU= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo= github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= @@ -133,6 +149,7 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/cfssl v0.0.0-20190726000631-633726f6bcb7 h1:Puu1hUwfps3+1CUzYdAZXijuvLuRMirgiXdf3zsM2Ig= github.com/cloudflare/cfssl v0.0.0-20190726000631-633726f6bcb7/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA= @@ -151,15 +168,20 @@ github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWH github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/cockroach-go/v2 v2.2.4 h1:VuiBJKut2Imgrzl+TNk+U5+GxLOh3hnIFxU0EzjTCnI= github.com/cockroachdb/cockroach-go/v2 v2.2.4/go.mod h1:u3MiKYGupPPjkn3ozknpMUpxPaNLTFWAya419/zv6eI= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -170,6 +192,8 @@ github.com/deckarep/golang-set v1.7.1 h1:SCQV0S6gTtp6itiFrTqI+pfmJ4LN85S1YzhDf9r github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd h1:83Wprp6ROGeiHFAP8WJdI2RoxALQYgdllERc3N5N2DM= github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= @@ -183,9 +207,15 @@ github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d h1:W1n4DvpzZGOI github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d/go.mod h1:DngW8aVqWbuLRMHItjPUyqdj+HWPvnQe8V8y1nDpIbM= github.com/duo-labs/webauthn v0.0.0-20211216225436-9a12cd078b8a h1:mKoV2b/J8sVVvc6jCl7SxdOrED5cHKdQaHUxjoO5W74= github.com/duo-labs/webauthn v0.0.0-20211216225436-9a12cd078b8a/go.mod h1:EYSpSkwoEcryMmQGfhol2IiB3IMN9IIIaNd/wcAQMGQ= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -210,6 +240,8 @@ github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= @@ -220,7 +252,9 @@ github.com/getsentry/sentry-go v0.11.0 h1:qro8uttJGvNAMr5CLcFI9CHR0aDzXl0Vs3Pmw/ github.com/getsentry/sentry-go v0.11.0/go.mod h1:KBQIxiZAetw62Cj8Ri964vAEWVdgfaUCn30Q3bCvANo= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.7.4 h1:QmUZXrvJ9qZ3GfWvQ+2wnW/1ePrTEJqPKMYEU3lD/DM= github.com/gin-gonic/gin v1.7.4/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= github.com/gin-gonic/gin v1.7.4/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= @@ -231,6 +265,7 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= @@ -238,19 +273,26 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= @@ -258,7 +300,10 @@ github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14j github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.1.0 h1:XUgk2Ex5veyVFVeLm0xhusUTQybEbexJXrvPNOKkSY0= github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= @@ -269,6 +314,7 @@ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGw github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -302,6 +348,7 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -347,6 +394,7 @@ github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210715191844-86eeefc3e471/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= @@ -361,25 +409,37 @@ github.com/googleinterns/cloud-operations-api-mock v0.0.0-20200709193332-a1e58c2 github.com/googleinterns/cloud-operations-api-mock v0.0.0-20200709193332-a1e58c29bdd3/go.mod h1:h/KNeRx7oYU4SpA4SoY7W2/NxDKEEVuwA6j9A27L4OI= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/csrf v1.7.1 h1:Ir3o2c1/Uzj6FBxMlAUB6SivgVMy1ONXwYgXn+/aHPE= github.com/gorilla/csrf v1.7.1/go.mod h1:+a/4tCmqhG6/w4oafeAZ9pEa3/NZOWYVbD9fV0FwIQA= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/schema v1.2.0 h1:YufUaxZYCKGFuAq3c96BOhjgd5nmXiOY9NGzF247Tsc= github.com/gorilla/schema v1.2.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.1 h1:p5m7GOEGXyoq6QWl4/RRMsQ6tWbTpbQmAnkxXgWSprY= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.1/go.mod h1:8ZeZajTed/blCOHBbj8Fss8bPHiFKcmJJzuIbUtFCAo= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= @@ -393,35 +453,44 @@ github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iP github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= +github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= +github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= @@ -475,9 +544,13 @@ github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkr github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.1 h1:g39TucaRWyV3dwDO++eEc6qf8TVIQ/Da48WmqjZ3i7E= github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmoiron/sqlx v1.3.1/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -503,10 +576,13 @@ github.com/kevinburke/rest v0.0.0-20210506044642-5611499aa33c h1:hnbwWED5rIu+UaM github.com/kevinburke/rest v0.0.0-20210506044642-5611499aa33c/go.mod h1:pD+iEcdAGVXld5foVN4e24zb/6fnb60tgZPZ3P/3T/I= github.com/kevinburke/twilio-go v0.0.0-20210327194925-1623146bcf73 h1:PSsFm2SRpq9LnaRHLz4u9ZZ3liWjgXM6OMxXE4/qlgY= github.com/kevinburke/twilio-go v0.0.0-20210327194925-1623146bcf73/go.mod h1:Fm9alkN1/LPVY1eqD/psyMwPWE4VWl4P01/nTYZKzBk= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.14.2 h1:S0OHlFk/Gbon/yauFJ4FfJJF5V0fc5HbBTJazi28pRw= github.com/klauspost/compress v1.14.2/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= @@ -534,6 +610,7 @@ github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= +github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -544,11 +621,14 @@ github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk= github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= @@ -560,6 +640,7 @@ github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -567,7 +648,9 @@ github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2y github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= @@ -587,12 +670,16 @@ github.com/minio/minio-go/v7 v7.0.20 h1:0+Xt1SkCKDgcx5cmo3UxXcJ37u5Gy+/2i/+eQYqm github.com/minio/minio-go/v7 v7.0.20/go.mod h1:ei5JjmxwHaMrgsMrn4U/+Nmg+d8MKS1U2DAn1ou4+Do= github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= @@ -615,29 +702,53 @@ github.com/muesli/gamut v0.2.0/go.mod h1:kz1+UJqI1thNtocJlowyqG2o0FNsN0W534VoMVs github.com/muesli/kmeans v0.2.1 h1:ja5AnwfyDCVBCANrAfXr2pOh292FQnSeu1lySACDJU0= github.com/muesli/kmeans v0.2.1/go.mod h1:eNyybq0tX9/iBEP6EMU4Y7dpmGK0uEhODdZpnG1a/iQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nicksnyder/go-i18n/v2 v2.1.2 h1:QHYxcUJnGHBaq7XbvgunmZ2Pn0focXFqTD61CkH146c= github.com/nicksnyder/go-i18n/v2 v2.1.2/go.mod h1:d++QJC9ZVf7pa48qrsRWhMJ5pSHIPmS3OLqK1niyLxs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -647,31 +758,43 @@ github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSg github.com/pquerna/otp v1.3.0 h1:oJV/SkzR33anKXwQU3Of42rL4wbrffP4uvUf1SvS5Xs= github.com/pquerna/otp v1.3.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.0 h1:P2KMzcFwrPoSjkF1WLRPsp3UMLyql8L4v9hQpVeK5so= github.com/rs/cors v1.8.0/go.mod h1:EBwu+T5AvHOcXwvZIkQFjUN6s8Czyqw12GL/Y0tUyRM= github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc= @@ -679,11 +802,13 @@ github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= github.com/sagikazarmark/crypt v0.4.0/go.mod h1:ALv2SRj7GxYV4HO9elxH9nS6M9gW+xDNxqmyJ6RfDFM= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= @@ -697,12 +822,15 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/sony/sonyflake v1.0.0 h1:MpU6Ro7tfXwgn2l5eluf9xQvQJDROTBImNCfRXn/YeM= github.com/sony/sonyflake v1.0.0/go.mod h1:Jv3cfhf/UFtolOTTRd3q4Nl6ENqM+KfyZ5PseKfZGF4= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -714,12 +842,14 @@ github.com/spf13/afero v1.8.1/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfA github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.3.0 h1:R7cSvGu+Vv+qX0gW5R/85dx2kmmJT5z5NM8ifdYjdn0= github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= @@ -727,6 +857,9 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk= github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -739,14 +872,19 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ttacon/builder v0.0.0-20170518171403-c099f663e1c2 h1:5u+EJUQiosu3JFX0XS0qTf5FznsMOzTjGqavBGuCbo0= github.com/ttacon/builder v0.0.0-20170518171403-c099f663e1c2/go.mod h1:4kyMkleCiLkgY6z8gK5BkI01ChBtxR0ro3I1ZDcGM3w= github.com/ttacon/libphonenumber v1.2.1 h1:fzOfY5zUADkCkbIafAed11gL1sW+bJ26p6zWLBMElR4= github.com/ttacon/libphonenumber v1.2.1/go.mod h1:E0TpmdVMq5dyVlQ7oenAkhsLu86OkUl+yR4OAxyEg/M= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= @@ -759,6 +897,7 @@ github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcY github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20200730060457-89a2a8a1fb0b h1:tnWgqoOBmInkt5pbLjagwNVjjT4RdJhFHzL1ebCSRh8= github.com/xrash/smetrics v0.0.0-20200730060457-89a2a8a1fb0b/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= @@ -773,9 +912,13 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -825,14 +968,17 @@ go.opentelemetry.io/proto/otlp v0.10.0 h1:n7brgtEbDvXEgGyKKo8SobKT1e9FewlDtXzkVP go.opentelemetry.io/proto/otlp v0.10.0/go.mod h1:zG20xCK0szZ1xdokeSOwEcmlXu+x9kkdRe6N1DhKcfU= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -868,6 +1014,7 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 h1:QelT11PB4FXiDEXucrfNckHoFxwt8USGY1ajP1ZF5lM= @@ -904,8 +1051,10 @@ golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -927,6 +1076,7 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= @@ -947,6 +1097,7 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210716203947-853a461950ff/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -987,7 +1138,9 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1010,6 +1163,7 @@ golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191206220618-eeba5f6aabab/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1022,6 +1176,7 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1054,6 +1209,7 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1081,9 +1237,12 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1114,6 +1273,7 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1156,6 +1316,7 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1191,6 +1352,7 @@ google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFd google.golang.org/api v0.63.0 h1:n2bqqK895ygnBpdPDYetfy23K7fJ22wsrZKCyfuRkkA= google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= @@ -1203,6 +1365,7 @@ google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= @@ -1236,6 +1399,7 @@ google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -1269,10 +1433,15 @@ google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ6 google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa h1:I0YcKz0I7OAhddo7ya8kMnvprhcWM045PmkBdMO9zN0= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -1282,6 +1451,7 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= @@ -1321,8 +1491,10 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -1330,9 +1502,12 @@ gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1350,6 +1525,7 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C gorm.io/driver/postgres v1.0.8/go.mod h1:4eOzrI1MUfm6ObJU/UcmbXyiHSs8jSwH95G5P5dxcAg= gorm.io/gorm v1.20.12/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= gorm.io/gorm v1.21.4/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1358,8 +1534,13 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/internal/admin/repository/eventsourcing/handler/handler.go b/internal/admin/repository/eventsourcing/handler/handler.go index 28751489bd..2dbf4591fb 100644 --- a/internal/admin/repository/eventsourcing/handler/handler.go +++ b/internal/admin/repository/eventsourcing/handler/handler.go @@ -4,9 +4,6 @@ import ( "time" "github.com/caos/zitadel/internal/admin/repository/eventsourcing/view" - "github.com/caos/zitadel/internal/command" - "github.com/caos/zitadel/internal/config/systemdefaults" - "github.com/caos/zitadel/internal/config/types" v1 "github.com/caos/zitadel/internal/eventstore/v1" "github.com/caos/zitadel/internal/eventstore/v1/query" "github.com/caos/zitadel/internal/static" @@ -15,7 +12,7 @@ import ( type Configs map[string]*Config type Config struct { - MinimumCycleDuration types.Duration + MinimumCycleDuration time.Duration } type handler struct { @@ -31,13 +28,13 @@ func (h *handler) Eventstore() v1.Eventstore { return h.es } -func Register(configs Configs, bulkLimit, errorCount uint64, view *view.View, es v1.Eventstore, defaults systemdefaults.SystemDefaults, command *command.Commands, static static.Storage, localDevMode bool) []query.Handler { +func Register(configs Configs, bulkLimit, errorCount uint64, view *view.View, es v1.Eventstore, static static.Storage, loginPrefix string) []query.Handler { handlers := []query.Handler{} if static != nil { handlers = append(handlers, newStyling( handler{view, bulkLimit, configs.cycleDuration("Styling"), errorCount, es}, static, - localDevMode)) + loginPrefix)) } return handlers } @@ -47,7 +44,7 @@ func (configs Configs) cycleDuration(viewModel string) time.Duration { if !ok { return 3 * time.Minute } - return c.MinimumCycleDuration.Duration + return c.MinimumCycleDuration } func (h *handler) MinimumCycleDuration() time.Duration { diff --git a/internal/admin/repository/eventsourcing/handler/styling.go b/internal/admin/repository/eventsourcing/handler/styling.go index eae24492cb..54112c0f2c 100644 --- a/internal/admin/repository/eventsourcing/handler/styling.go +++ b/internal/admin/repository/eventsourcing/handler/styling.go @@ -33,16 +33,12 @@ type Styling struct { resourceUrl string } -func newStyling(handler handler, static static.Storage, localDevMode bool) *Styling { +func newStyling(handler handler, static static.Storage, loginPrefix string) *Styling { h := &Styling{ handler: handler, static: static, } - prefix := "" - if localDevMode { - prefix = "/login" - } - h.resourceUrl = prefix + "/resources/dynamic" //TODO: ? + h.resourceUrl = loginPrefix + "/resources/dynamic" //TODO: ? h.subscribe() diff --git a/internal/admin/repository/eventsourcing/repository.go b/internal/admin/repository/eventsourcing/repository.go index 0828d9cc08..6ccfa2b5b2 100644 --- a/internal/admin/repository/eventsourcing/repository.go +++ b/internal/admin/repository/eventsourcing/repository.go @@ -2,13 +2,11 @@ package eventsourcing import ( "context" + "database/sql" "github.com/caos/zitadel/internal/admin/repository/eventsourcing/eventstore" "github.com/caos/zitadel/internal/admin/repository/eventsourcing/spooler" admin_view "github.com/caos/zitadel/internal/admin/repository/eventsourcing/view" - "github.com/caos/zitadel/internal/command" - sd "github.com/caos/zitadel/internal/config/systemdefaults" - "github.com/caos/zitadel/internal/config/types" v1 "github.com/caos/zitadel/internal/eventstore/v1" es_spol "github.com/caos/zitadel/internal/eventstore/v1/spooler" "github.com/caos/zitadel/internal/static" @@ -16,11 +14,7 @@ import ( type Config struct { SearchLimit uint64 - Eventstore v1.Config - View types.SQL Spooler spooler.SpoolerConfig - Domain string - APIDomain string } type EsRepository struct { @@ -28,21 +22,17 @@ type EsRepository struct { eventstore.AdministratorRepo } -func Start(ctx context.Context, conf Config, systemDefaults sd.SystemDefaults, command *command.Commands, static static.Storage, localDevMode bool) (*EsRepository, error) { - es, err := v1.Start(conf.Eventstore) +func Start(conf Config, static static.Storage, dbClient *sql.DB, loginPrefix string) (*EsRepository, error) { + es, err := v1.Start(dbClient) if err != nil { return nil, err } - sqlClient, err := conf.View.Start() - if err != nil { - return nil, err - } - view, err := admin_view.StartView(sqlClient) + view, err := admin_view.StartView(dbClient) if err != nil { return nil, err } - spool := spooler.StartSpooler(conf.Spooler, es, view, sqlClient, systemDefaults, command, static, localDevMode) + spool := spooler.StartSpooler(conf.Spooler, es, view, dbClient, static, loginPrefix) return &EsRepository{ spooler: spool, diff --git a/internal/admin/repository/eventsourcing/spooler/spooler.go b/internal/admin/repository/eventsourcing/spooler/spooler.go index ed85c505d5..3440271dc9 100644 --- a/internal/admin/repository/eventsourcing/spooler/spooler.go +++ b/internal/admin/repository/eventsourcing/spooler/spooler.go @@ -3,9 +3,7 @@ package spooler import ( "database/sql" - "github.com/caos/zitadel/internal/command" - "github.com/caos/zitadel/internal/config/systemdefaults" - "github.com/caos/zitadel/internal/eventstore/v1" + v1 "github.com/caos/zitadel/internal/eventstore/v1" "github.com/caos/zitadel/internal/static" "github.com/caos/zitadel/internal/admin/repository/eventsourcing/handler" @@ -20,12 +18,12 @@ type SpoolerConfig struct { Handlers handler.Configs } -func StartSpooler(c SpoolerConfig, es v1.Eventstore, view *view.View, sql *sql.DB, defaults systemdefaults.SystemDefaults, command *command.Commands, static static.Storage, localDevMode bool) *spooler.Spooler { +func StartSpooler(c SpoolerConfig, es v1.Eventstore, view *view.View, sql *sql.DB, static static.Storage, loginPrefix string) *spooler.Spooler { spoolerConfig := spooler.Config{ Eventstore: es, Locker: &locker{dbClient: sql}, ConcurrentWorkers: c.ConcurrentWorkers, - ViewHandlers: handler.Register(c.Handlers, c.BulkLimit, c.FailureCountUntilSkip, view, es, defaults, command, static, localDevMode), + ViewHandlers: handler.Register(c.Handlers, c.BulkLimit, c.FailureCountUntilSkip, view, es, static, loginPrefix), } spool := spoolerConfig.New() spool.Start() diff --git a/internal/api/api.go b/internal/api/api.go index 3d5de426d8..98e2e6c1a4 100644 --- a/internal/api/api.go +++ b/internal/api/api.go @@ -3,100 +3,101 @@ package api import ( "context" "net/http" + "strings" "github.com/caos/logging" sentryhttp "github.com/getsentry/sentry-go/http" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/metric" + "github.com/gorilla/mux" + "github.com/improbable-eng/grpc-web/go/grpcweb" "google.golang.org/grpc" - admin_es "github.com/caos/zitadel/internal/admin/repository/eventsourcing" - "github.com/caos/zitadel/internal/api/authz" - grpc_util "github.com/caos/zitadel/internal/api/grpc" + internal_authz "github.com/caos/zitadel/internal/api/authz" "github.com/caos/zitadel/internal/api/grpc/server" http_util "github.com/caos/zitadel/internal/api/http" - "github.com/caos/zitadel/internal/api/oidc" - auth_es "github.com/caos/zitadel/internal/auth/repository/eventsourcing" - authz_repo "github.com/caos/zitadel/internal/authz/repository" + "github.com/caos/zitadel/internal/authz/repository" "github.com/caos/zitadel/internal/config/systemdefaults" "github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/errors" "github.com/caos/zitadel/internal/query" - "github.com/caos/zitadel/internal/telemetry/metrics" - "github.com/caos/zitadel/internal/telemetry/metrics/otel" "github.com/caos/zitadel/internal/telemetry/tracing" - view_model "github.com/caos/zitadel/internal/view/model" ) -type Config struct { - GRPC grpc_util.Config - OIDC oidc.OPHandlerConfig - Domain string -} - type API struct { + port uint16 grpcServer *grpc.Server - gatewayHandler *server.GatewayHandler - verifier *authz.TokenVerifier - serverPort string + verifier *internal_authz.TokenVerifier health health - auth auth - admin admin + router *mux.Router + externalSecure bool } type health interface { Health(ctx context.Context) error IAMByID(ctx context.Context, id string) (*query.IAM, error) - VerifierClientID(ctx context.Context, appName string) (string, string, error) } -type auth interface { - ActiveUserSessionCount() int64 -} - -type admin interface { - GetViews() ([]*view_model.View, error) - GetSpoolerDiv(database, viewName string) int64 -} - -func Create(config Config, authZ authz.Config, q *query.Queries, authZRepo authz_repo.Repository, authRepo *auth_es.EsRepository, adminRepo *admin_es.EsRepository, sd systemdefaults.SystemDefaults) *API { +func New( + port uint16, + router *mux.Router, + repo *struct { + repository.Repository + *query.Queries + }, + authZ internal_authz.Config, + sd systemdefaults.SystemDefaults, + externalSecure bool, +) *API { + verifier := internal_authz.Start(repo) api := &API{ - serverPort: config.GRPC.ServerPort, + port: port, + verifier: verifier, + health: repo, + router: router, + externalSecure: externalSecure, } - - repo := struct { - authz_repo.Repository - query.Queries - }{ - authZRepo, - *q, - } - - api.verifier = authz.Start(&repo) - api.health = &repo - api.auth = authRepo - api.admin = adminRepo api.grpcServer = server.CreateServer(api.verifier, authZ, sd.DefaultLanguage) - api.gatewayHandler = server.CreateGatewayHandler(config.GRPC) - api.RegisterHandler("", api.healthHandler()) + api.routeGRPC() + + api.RegisterHandler("/debug", api.healthHandler()) return api } -func (a *API) RegisterServer(ctx context.Context, server server.Server) { - server.RegisterServer(a.grpcServer) - a.gatewayHandler.RegisterGateway(ctx, server) - a.verifier.RegisterServer(server.AppName(), server.MethodPrefix(), server.AuthMethods()) +func (a *API) RegisterServer(ctx context.Context, grpcServer server.Server) error { + grpcServer.RegisterServer(a.grpcServer) + handler, prefix, err := server.CreateGateway(ctx, grpcServer, a.port) + if err != nil { + return err + } + a.RegisterHandler(prefix, handler) + a.verifier.RegisterServer(grpcServer.AppName(), grpcServer.MethodPrefix(), grpcServer.AuthMethods()) + return nil } func (a *API) RegisterHandler(prefix string, handler http.Handler) { + prefix = strings.TrimSuffix(prefix, "/") sentryHandler := sentryhttp.New(sentryhttp.Options{}) - a.gatewayHandler.RegisterHandler(prefix, sentryHandler.Handle(handler)) + subRouter := a.router.PathPrefix(prefix).Subrouter() + subRouter.PathPrefix("/").Handler(http.StripPrefix(prefix, sentryHandler.Handle(handler))) } -func (a *API) Start(ctx context.Context) { - server.Serve(ctx, a.grpcServer, a.serverPort) - a.gatewayHandler.Serve(ctx) +func (a *API) routeGRPC() { + http2Route := a.router.Methods(http.MethodPost). + MatcherFunc(func(r *http.Request, _ *mux.RouteMatch) bool { + return r.ProtoMajor == 2 + }). + Subrouter() + http2Route.Headers("Content-Type", "application/grpc").Handler(a.grpcServer) + + if !a.externalSecure { + a.routeGRPCWeb(a.router) + return + } + a.routeGRPCWeb(http2Route) +} + +func (a *API) routeGRPCWeb(router *mux.Router) { + router.NewRoute().HeadersRegexp("Content-Type", "application/grpc-web.*").Handler(grpcweb.WrapServer(a.grpcServer)) } func (a *API) healthHandler() http.Handler { @@ -125,99 +126,46 @@ func (a *API) healthHandler() http.Handler { handler.HandleFunc("/healthz", handleHealth) handler.HandleFunc("/ready", handleReadiness(checks)) handler.HandleFunc("/validate", handleValidate(checks)) - handler.HandleFunc("/clientID", a.handleClientID) - handler.Handle("/metrics", a.handleMetrics()) return handler } func handleHealth(w http.ResponseWriter, r *http.Request) { _, err := w.Write([]byte("ok")) - logging.Log("API-Hfss2").OnError(err).WithField("traceID", tracing.TraceIDFromCtx(r.Context())).Error("error writing ok for health") + logging.WithFields("traceID", tracing.TraceIDFromCtx(r.Context())).OnError(err).Error("error writing ok for health") } func handleReadiness(checks []ValidationFunction) func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) { - errors := validate(r.Context(), checks) - if len(errors) == 0 { + errs := validate(r.Context(), checks) + if len(errs) == 0 { http_util.MarshalJSON(w, "ok", nil, http.StatusOK) return } - http_util.MarshalJSON(w, nil, errors[0], http.StatusPreconditionFailed) + http_util.MarshalJSON(w, nil, errs[0], http.StatusPreconditionFailed) } } func handleValidate(checks []ValidationFunction) func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) { - errors := validate(r.Context(), checks) - if len(errors) == 0 { + errs := validate(r.Context(), checks) + if len(errs) == 0 { http_util.MarshalJSON(w, "ok", nil, http.StatusOK) return } - http_util.MarshalJSON(w, errors, nil, http.StatusOK) + http_util.MarshalJSON(w, errs, nil, http.StatusOK) } } -func (a *API) handleClientID(w http.ResponseWriter, r *http.Request) { - id, _, err := a.health.VerifierClientID(r.Context(), "Zitadel Console") - if err != nil { - http_util.MarshalJSON(w, nil, err, http.StatusPreconditionFailed) - return - } - http_util.MarshalJSON(w, id, nil, http.StatusOK) -} - -func (a *API) handleMetrics() http.Handler { - a.registerActiveSessionCounters() - a.registerSpoolerDivCounters() - return metrics.GetExporter() -} - -func (a *API) registerActiveSessionCounters() { - metrics.RegisterValueObserver( - metrics.ActiveSessionCounter, - metrics.ActiveSessionCounterDescription, - func(ctx context.Context, result metric.Int64ObserverResult) { - result.Observe( - a.auth.ActiveUserSessionCount(), - ) - }, - ) -} - -func (a *API) registerSpoolerDivCounters() { - views, err := a.admin.GetViews() - if err != nil { - logging.Log("API-3M8sd").WithError(err).Error("could not read views for metrics") - return - } - metrics.RegisterValueObserver( - metrics.SpoolerDivCounter, - metrics.SpoolerDivCounterDescription, - func(ctx context.Context, result metric.Int64ObserverResult) { - for _, view := range views { - labels := map[string]attribute.Value{ - metrics.Database: attribute.StringValue(view.Database), - metrics.ViewName: attribute.StringValue(view.ViewName), - } - result.Observe( - a.admin.GetSpoolerDiv(view.Database, view.ViewName), - otel.MapToKeyValue(labels)..., - ) - } - }, - ) -} - type ValidationFunction func(ctx context.Context) error func validate(ctx context.Context, validations []ValidationFunction) []error { - errors := make([]error, 0) + errs := make([]error, 0) for _, validation := range validations { if err := validation(ctx); err != nil { - logging.Log("API-vf823").WithError(err).WithField("traceID", tracing.TraceIDFromCtx(ctx)).Error("validation failed") - errors = append(errors, err) + logging.WithFields("traceID", tracing.TraceIDFromCtx(ctx)).WithError(err).Error("validation failed") + errs = append(errs, err) } } - return errors + return errs } diff --git a/internal/api/assets/asset.go b/internal/api/assets/asset.go index 4aabc81d2d..6ca3298c22 100644 --- a/internal/api/assets/asset.go +++ b/internal/api/assets/asset.go @@ -21,6 +21,10 @@ import ( "github.com/caos/zitadel/internal/static" ) +const ( + HandlerPrefix = "/assets/v1" +) + type Handler struct { errorHandler ErrorHandler storage static.Storage @@ -66,14 +70,7 @@ func DefaultErrorHandler(w http.ResponseWriter, r *http.Request, err error, code http.Error(w, err.Error(), code) } -func NewHandler( - commands *command.Commands, - verifier *authz.TokenVerifier, - authConfig authz.Config, - idGenerator id.Generator, - storage static.Storage, - queries *query.Queries, -) http.Handler { +func NewHandler(commands *command.Commands, verifier *authz.TokenVerifier, authConfig authz.Config, idGenerator id.Generator, storage static.Storage, queries *query.Queries) http.Handler { h := &Handler{ commands: commands, errorHandler: DefaultErrorHandler, diff --git a/internal/api/assets/generator/asset_generator.go b/internal/api/assets/generator/asset_generator.go index 486fe2a364..9889e36baa 100644 --- a/internal/api/assets/generator/asset_generator.go +++ b/internal/api/assets/generator/asset_generator.go @@ -12,20 +12,21 @@ import ( ) var ( - directory = flag.String("directory", "./", "working directory: asset.yaml must be in this directory, files will be generated into parent directory") - assets = flag.String("assets", "../../../../docs/docs/apis/assets/assets.md", "path where the assets.md will be generated") + directory = flag.String("directory", "./", "working directory: asset.yaml must be in this directory, files will be generated into parent directory") + assetsDocs = flag.String("assets", "../../../../docs/docs/apis/assets/assets.md", "path where the assets.md will be generated") + assetPrefix = flag.String("handler-prefix", "/assets/v1", "prefix of the handler paths") ) func main() { flag.Parse() configFile := *directory + "asset.yaml" authz, err := os.OpenFile(*directory+"../authz.go", os.O_TRUNC|os.O_WRONLY|os.O_CREATE, 0755) - logging.Log("ASSETS-Gn31f").OnError(err).Fatal("cannot open authz file") + logging.OnError(err).Fatal("cannot open authz file") router, err := os.OpenFile(*directory+"../router.go", os.O_TRUNC|os.O_WRONLY|os.O_CREATE, 0755) - logging.Log("ASSETS-ABen3").OnError(err).Fatal("cannot open router file") - docs, err := os.OpenFile(*assets, os.O_TRUNC|os.O_WRONLY|os.O_CREATE, 0755) - logging.Log("ASSETS-Dfvsd").OnError(err).Fatal("cannot open docs file") - GenerateAssetHandler(configFile, authz, router, docs) + logging.OnError(err).Fatal("cannot open router file") + docs, err := os.OpenFile(*assetsDocs, os.O_TRUNC|os.O_WRONLY|os.O_CREATE, 0755) + logging.OnError(err).Fatal("cannot open docs file") + GenerateAssetHandler(configFile, *assetPrefix, authz, router, docs) } type Method struct { @@ -97,7 +98,7 @@ type Service struct { Methods map[string]Method } -func GenerateAssetHandler(configFilePath string, authz, router, docs io.Writer) { +func GenerateAssetHandler(configFilePath, handlerPrefix string, authz, router, docs io.Writer) { conf := new(struct { Services Services }) @@ -117,7 +118,7 @@ func GenerateAssetHandler(configFilePath string, authz, router, docs io.Writer) }{ GoPkgName: "assets", Name: "AssetsService", - Prefix: "/assets/v1", + Prefix: handlerPrefix, Services: conf.Services, } err = tmplAuthz.Execute(authz, data) diff --git a/internal/api/grpc/server/gateway.go b/internal/api/grpc/server/gateway.go index f66f8e527d..2cc518e078 100644 --- a/internal/api/grpc/server/gateway.go +++ b/internal/api/grpc/server/gateway.go @@ -2,52 +2,51 @@ package server import ( "context" + "fmt" "net/http" "strings" - "github.com/caos/logging" - grpc_util "github.com/caos/zitadel/internal/api/grpc" - client_middleware "github.com/caos/zitadel/internal/api/grpc/client/middleware" - http_util "github.com/caos/zitadel/internal/api/http" - http_mw "github.com/caos/zitadel/internal/api/http/middleware" - "github.com/caos/zitadel/internal/telemetry/tracing" "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" "google.golang.org/protobuf/encoding/protojson" + + client_middleware "github.com/caos/zitadel/internal/api/grpc/client/middleware" + http_mw "github.com/caos/zitadel/internal/api/http/middleware" ) const ( - defaultGatewayPort = "8080" - mimeWildcard = "*/*" + mimeWildcard = "*/*" ) var ( - DefaultJSONMarshaler = &runtime.JSONPb{ + customHeaders = []string{ + "x-zitadel-", + } + jsonMarshaler = &runtime.JSONPb{ UnmarshalOptions: protojson.UnmarshalOptions{ DiscardUnknown: true, }, } - DefaultServeMuxOptions = func(customHeaders ...string) []runtime.ServeMuxOption { - return []runtime.ServeMuxOption{ - runtime.WithMarshalerOption(DefaultJSONMarshaler.ContentType(nil), DefaultJSONMarshaler), - runtime.WithMarshalerOption(mimeWildcard, DefaultJSONMarshaler), - runtime.WithMarshalerOption(runtime.MIMEWildcard, DefaultJSONMarshaler), - runtime.WithIncomingHeaderMatcher(DefaultHeaderMatcher(customHeaders...)), - runtime.WithOutgoingHeaderMatcher(runtime.DefaultHeaderMatcher), - } + serveMuxOptions = []runtime.ServeMuxOption{ + runtime.WithMarshalerOption(jsonMarshaler.ContentType(nil), jsonMarshaler), + runtime.WithMarshalerOption(mimeWildcard, jsonMarshaler), + runtime.WithMarshalerOption(runtime.MIMEWildcard, jsonMarshaler), + runtime.WithIncomingHeaderMatcher(headerMatcher), + runtime.WithOutgoingHeaderMatcher(runtime.DefaultHeaderMatcher), } - DefaultHeaderMatcher = func(customHeaders ...string) runtime.HeaderMatcherFunc { - return func(header string) (string, bool) { + headerMatcher = runtime.HeaderMatcherFunc( + func(header string) (string, bool) { for _, customHeader := range customHeaders { if strings.HasPrefix(strings.ToLower(header), customHeader) { return header, true } } return runtime.DefaultHeaderMatcher(header) - } - } + }, + ) ) type Gateway interface { @@ -57,92 +56,21 @@ type Gateway interface { type GatewayFunc func(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) error -//optional extending interfaces of Gateway below - -type gatewayCustomServeMuxOptions interface { - GatewayServeMuxOptions() []runtime.ServeMuxOption -} - -type grpcGatewayCustomInterceptor interface { - GatewayHTTPInterceptor(http.Handler) http.Handler -} - -type gatewayCustomCallOptions interface { - GatewayCallOptions() []grpc.DialOption -} - -type GatewayHandler struct { - mux *http.ServeMux - serverPort string - gatewayPort string - customHeaders []string -} - -func CreateGatewayHandler(config grpc_util.Config) *GatewayHandler { - return &GatewayHandler{ - mux: http.NewServeMux(), - serverPort: config.ServerPort, - gatewayPort: config.GatewayPort, - customHeaders: config.CustomHeaders, - } -} - -//RegisterGateway registers a handler (Gateway interface) on defined port -//Gateway interface may be extended with optional implementation of interfaces (gatewayCustomServeMuxOptions, ...) -func (g *GatewayHandler) RegisterGateway(ctx context.Context, gateway Gateway) { - handler := createGateway(ctx, gateway, g.serverPort, g.customHeaders...) - prefix := gateway.GatewayPathPrefix() - g.RegisterHandler(prefix, handler) -} - -func (g *GatewayHandler) RegisterHandler(prefix string, handler http.Handler) { - http_util.RegisterHandler(g.mux, prefix, handler) -} - -func (g *GatewayHandler) Serve(ctx context.Context) { - http_util.Serve(ctx, g.mux, g.gatewayPort, "api") -} - -func createGateway(ctx context.Context, g Gateway, port string, customHeaders ...string) http.Handler { - mux := createMux(g, customHeaders...) - opts := createDialOptions(g) - err := g.RegisterGateway()(ctx, mux, "localhost"+http_util.Endpoint(port), opts) - logging.Log("SERVE-7B7G0E").OnError(err).WithField("traceID", tracing.TraceIDFromCtx(ctx)).Panic("failed to register grpc gateway") - return addInterceptors(mux, g) -} - -func createMux(g Gateway, customHeaders ...string) *runtime.ServeMux { - muxOptions := DefaultServeMuxOptions(customHeaders...) - if customOpts, ok := g.(gatewayCustomServeMuxOptions); ok { - muxOptions = customOpts.GatewayServeMuxOptions() - } - return runtime.NewServeMux(muxOptions...) -} - -func createDialOptions(g Gateway) []grpc.DialOption { +func CreateGateway(ctx context.Context, g Gateway, port uint16) (http.Handler, string, error) { + runtimeMux := runtime.NewServeMux(serveMuxOptions...) opts := []grpc.DialOption{ - grpc.WithInsecure(), + grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithUnaryInterceptor(client_middleware.DefaultTracingClient()), } - - if customOpts, ok := g.(gatewayCustomCallOptions); ok { - opts = append(opts, customOpts.GatewayCallOptions()...) + err := g.RegisterGateway()(ctx, runtimeMux, fmt.Sprintf("localhost:%d", port), opts) + if err != nil { + return nil, "", fmt.Errorf("failed to register grpc gateway: %w", err) } - return opts + return addInterceptors(runtimeMux), g.GatewayPathPrefix(), nil } -func addInterceptors(handler http.Handler, g Gateway) http.Handler { +func addInterceptors(handler http.Handler) http.Handler { handler = http_mw.DefaultMetricsHandler(handler) handler = http_mw.DefaultTelemetryHandler(handler) - if interceptor, ok := g.(grpcGatewayCustomInterceptor); ok { - handler = interceptor.GatewayHTTPInterceptor(handler) - } return http_mw.CORSInterceptor(handler) } - -func gatewayPort(port string) string { - if port == "" { - return defaultGatewayPort - } - return port -} diff --git a/internal/api/grpc/server/server.go b/internal/api/grpc/server/server.go index 7e841efb25..419b47f6bc 100644 --- a/internal/api/grpc/server/server.go +++ b/internal/api/grpc/server/server.go @@ -1,23 +1,15 @@ package server import ( - "context" grpc_api "github.com/caos/zitadel/internal/api/grpc" "github.com/caos/zitadel/internal/telemetry/metrics" - "github.com/caos/logging" grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" "golang.org/x/text/language" "google.golang.org/grpc" "github.com/caos/zitadel/internal/api/authz" "github.com/caos/zitadel/internal/api/grpc/server/middleware" - "github.com/caos/zitadel/internal/api/http" - "github.com/caos/zitadel/internal/telemetry/tracing" -) - -const ( - defaultGrpcPort = "80" ) type Server interface { @@ -46,24 +38,3 @@ func CreateServer(verifier *authz.TokenVerifier, authConfig authz.Config, lang l ), ) } - -func Serve(ctx context.Context, server *grpc.Server, port string) { - go func() { - <-ctx.Done() - server.GracefulStop() - }() - - go func() { - listener := http.CreateListener(port) - err := server.Serve(listener) - logging.Log("SERVE-Ga3e94").OnError(err).WithField("traceID", tracing.TraceIDFromCtx(ctx)).Panic("grpc server serve failed") - }() - logging.LogWithFields("SERVE-bZ44QM", "port", port).WithField("traceID", tracing.TraceIDFromCtx(ctx)).Info("grpc server is listening") -} - -func grpcPort(port string) string { - if port == "" { - return defaultGrpcPort - } - return port -} diff --git a/internal/api/http/listener.go b/internal/api/http/listener.go deleted file mode 100644 index 731fadd283..0000000000 --- a/internal/api/http/listener.go +++ /dev/null @@ -1,21 +0,0 @@ -package http - -import ( - "net" - "strings" - - "github.com/caos/logging" -) - -func CreateListener(endpoint string) net.Listener { - l, err := net.Listen("tcp", Endpoint(endpoint)) - logging.Log("SERVE-6vasef").OnError(err).Fatal("creating listener failed") - return l -} - -func Endpoint(endpoint string) string { - if strings.Contains(endpoint, ":") { - return endpoint - } - return ":" + endpoint -} diff --git a/internal/api/http/middleware/cache_interceptor.go b/internal/api/http/middleware/cache_interceptor.go index b9b0528f01..a948e12c50 100644 --- a/internal/api/http/middleware/cache_interceptor.go +++ b/internal/api/http/middleware/cache_interceptor.go @@ -8,7 +8,6 @@ import ( "time" http_utils "github.com/caos/zitadel/internal/api/http" - "github.com/caos/zitadel/internal/config/types" ) type Cache struct { @@ -38,8 +37,8 @@ const ( ) type CacheConfig struct { - MaxAge types.Duration - SharedMaxAge types.Duration + MaxAge time.Duration + SharedMaxAge time.Duration } var ( diff --git a/internal/api/http/middleware/user_agent_cookie.go b/internal/api/http/middleware/user_agent_cookie.go index 385f8ab49e..8df99fcc4c 100644 --- a/internal/api/http/middleware/user_agent_cookie.go +++ b/internal/api/http/middleware/user_agent_cookie.go @@ -3,9 +3,9 @@ package middleware import ( "context" "net/http" + "time" http_utils "github.com/caos/zitadel/internal/api/http" - "github.com/caos/zitadel/internal/config/types" "github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/errors" "github.com/caos/zitadel/internal/id" @@ -35,12 +35,11 @@ type userAgentHandler struct { type UserAgentCookieConfig struct { Name string - Domain string Key *crypto.KeyConfig - MaxAge types.Duration + MaxAge time.Duration } -func NewUserAgentHandler(config *UserAgentCookieConfig, idGenerator id.Generator, localDevMode bool) (func(http.Handler) http.Handler, error) { +func NewUserAgentHandler(config *UserAgentCookieConfig, domain string, idGenerator id.Generator, externalSecure bool) (func(http.Handler) http.Handler, error) { key, err := crypto.LoadKey(config.Key, config.Key.EncryptionKeyID) if err != nil { return nil, err @@ -48,10 +47,10 @@ func NewUserAgentHandler(config *UserAgentCookieConfig, idGenerator id.Generator cookieKey := []byte(key) opts := []http_utils.CookieHandlerOpt{ http_utils.WithEncryption(cookieKey, cookieKey), - http_utils.WithDomain(config.Domain), + http_utils.WithDomain(domain), http_utils.WithMaxAge(int(config.MaxAge.Seconds())), } - if localDevMode { + if !externalSecure { opts = append(opts, http_utils.WithUnsecure()) } return func(handler http.Handler) http.Handler { diff --git a/internal/api/http/origin.go b/internal/api/http/origin.go index 62c6967bd0..d0a5168f73 100644 --- a/internal/api/http/origin.go +++ b/internal/api/http/origin.go @@ -30,3 +30,11 @@ func IsOrigin(rawOrigin string) bool { } return parsedUrl.Scheme != "" && parsedUrl.Host != "" && parsedUrl.Path == "" && len(parsedUrl.Query()) == 0 && parsedUrl.Fragment == "" } + +func BuildHTTP(hostname string, externalPort uint16, secure bool) string { + schema := "https" + if !secure { + schema = "http" + } + return fmt.Sprintf("%s://%s:%d", schema, hostname, externalPort) +} diff --git a/internal/api/http/server.go b/internal/api/http/server.go deleted file mode 100644 index 489fcc7ec9..0000000000 --- a/internal/api/http/server.go +++ /dev/null @@ -1,33 +0,0 @@ -package http - -import ( - "context" - "net/http" - - "github.com/caos/logging" - "github.com/caos/zitadel/internal/telemetry/tracing" -) - -func Serve(ctx context.Context, handler http.Handler, port, servername string) { - server := &http.Server{ - Handler: handler, - } - - listener := CreateListener(port) - - go func() { - <-ctx.Done() - err := server.Shutdown(ctx) - logging.LogWithFields("HTTP-m7kBlq", "name", servername).WithField("traceID", tracing.TraceIDFromCtx(ctx)).OnError(err).Warnf("error during graceful shutdown of http server (%s)", servername) - }() - - go func() { - err := server.Serve(listener) - logging.LogWithFields("HTTP-tBHR60", "name", servername).OnError(err).WithField("traceID", tracing.TraceIDFromCtx(ctx)).Panicf("http serve (%s) failed", servername) - }() - logging.LogWithFields("HTTP-KHh0Cb", "name", servername, "port", port).WithField("traceID", tracing.TraceIDFromCtx(ctx)).Infof("http server (%s) is listening", servername) -} - -func RegisterHandler(mux *http.ServeMux, prefix string, handler http.Handler) { - mux.Handle(prefix+"/", http.StripPrefix(prefix, handler)) -} diff --git a/internal/api/oidc/op.go b/internal/api/oidc/op.go index 4c4f45c33f..702bcff461 100644 --- a/internal/api/oidc/op.go +++ b/internal/api/oidc/op.go @@ -2,44 +2,50 @@ package oidc import ( "context" + "database/sql" + "fmt" + "net/http" "time" - "github.com/caos/logging" "github.com/caos/oidc/pkg/op" "github.com/rakyll/statik/fs" "golang.org/x/text/language" + "github.com/caos/zitadel/internal/api/assets" http_utils "github.com/caos/zitadel/internal/api/http" "github.com/caos/zitadel/internal/api/http/middleware" + "github.com/caos/zitadel/internal/api/ui/login" "github.com/caos/zitadel/internal/auth/repository" "github.com/caos/zitadel/internal/command" "github.com/caos/zitadel/internal/config/systemdefaults" - "github.com/caos/zitadel/internal/config/types" "github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore/handler/crdb" "github.com/caos/zitadel/internal/i18n" - "github.com/caos/zitadel/internal/id" "github.com/caos/zitadel/internal/query" "github.com/caos/zitadel/internal/telemetry/metrics" - "github.com/caos/zitadel/internal/telemetry/tracing" ) -type OPHandlerConfig struct { - OPConfig *op.Config - StorageConfig StorageConfig - UserAgentCookieConfig *middleware.UserAgentCookieConfig - Cache *middleware.CacheConfig - Endpoints *EndpointConfig -} +const ( + HandlerPrefix = "/oauth/v2" + AuthCallback = HandlerPrefix + "/authorize/callback?id=" +) -type StorageConfig struct { - DefaultLoginURL string +type Config struct { + CodeMethodS256 bool + AuthMethodPost bool + AuthMethodPrivateKeyJWT bool + GrantTypeRefreshToken bool + RequestObjectSupported bool SigningKeyAlgorithm string - DefaultAccessTokenLifetime types.Duration - DefaultIdTokenLifetime types.Duration - DefaultRefreshTokenIdleExpiration types.Duration - DefaultRefreshTokenExpiration types.Duration + DefaultAccessTokenLifetime time.Duration + DefaultIdTokenLifetime time.Duration + DefaultRefreshTokenIdleExpiration time.Duration + DefaultRefreshTokenExpiration time.Duration + UserAgentCookieConfig *middleware.UserAgentCookieConfig + Cache *middleware.CacheConfig + KeyConfig *crypto.KeyConfig + CustomEndpoints *EndpointConfig } type EndpointConfig struct { @@ -77,55 +83,116 @@ type OPStorage struct { assetAPIPrefix string } -func NewProvider(ctx context.Context, config OPHandlerConfig, command *command.Commands, query *query.Queries, repo repository.Repository, keyConfig systemdefaults.KeyConfig, localDevMode bool, es *eventstore.Eventstore, projections types.SQL, keyChan <-chan interface{}, assetAPIPrefix string) op.OpenIDProvider { - cookieHandler, err := middleware.NewUserAgentHandler(config.UserAgentCookieConfig, id.SonyFlakeGenerator, localDevMode) - logging.Log("OIDC-sd4fd").OnError(err).WithField("traceID", tracing.TraceIDFromCtx(ctx)).Panic("cannot user agent handler") - tokenKey, err := crypto.LoadKey(keyConfig.EncryptionConfig, keyConfig.EncryptionConfig.EncryptionKeyID) - logging.Log("OIDC-ADvbv").OnError(err).Panic("cannot load OP crypto key") - cryptoKey := []byte(tokenKey) - if len(cryptoKey) != 32 { - logging.Log("OIDC-Dsfds").Panic("OP crypto key must be exactly 32 bytes") +func NewProvider(ctx context.Context, config Config, issuer, defaultLogoutRedirectURI string, command *command.Commands, query *query.Queries, repo repository.Repository, keyConfig systemdefaults.KeyConfig, es *eventstore.Eventstore, projections *sql.DB, keyChan <-chan interface{}, userAgentCookie func(http.Handler) http.Handler) (op.OpenIDProvider, error) { + opConfig, err := createOPConfig(config, issuer, defaultLogoutRedirectURI) + if err != nil { + return nil, fmt.Errorf("cannot create op config: %w", err) + } + storage, err := newStorage(config, command, query, repo, keyConfig, config.KeyConfig, es, projections, keyChan) + if err != nil { + return nil, fmt.Errorf("cannot create storage: %w", err) + } + options, err := createOptions(config, userAgentCookie) + if err != nil { + return nil, fmt.Errorf("cannot create options: %w", err) } - copy(config.OPConfig.CryptoKey[:], cryptoKey) - config.OPConfig.CodeMethodS256 = true - config.OPConfig.AuthMethodPost = true - config.OPConfig.AuthMethodPrivateKeyJWT = true - config.OPConfig.GrantTypeRefreshToken = true - supportedLanguages, err := getSupportedLanguages() - logging.Log("OIDC-GBd3t").OnError(err).Panic("cannot get supported languages") - config.OPConfig.SupportedUILocales = supportedLanguages - metricTypes := []metrics.MetricType{metrics.MetricTypeRequestCount, metrics.MetricTypeStatusCode, metrics.MetricTypeTotalCount} - storage, err := newStorage(config.StorageConfig, command, query, repo, keyConfig, es, projections, keyChan, assetAPIPrefix) - logging.Log("OIDC-Jdg2k").OnError(err).WithField("traceID", tracing.TraceIDFromCtx(ctx)).Panic("cannot create storage") provider, err := op.NewOpenIDProvider( ctx, - config.OPConfig, + opConfig, storage, - op.WithHttpInterceptors( - middleware.MetricsHandler(metricTypes), - middleware.TelemetryHandler(), - middleware.NoCacheInterceptor, - cookieHandler, - http_utils.CopyHeadersToContext, - ), - op.WithCustomAuthEndpoint(op.NewEndpointWithURL(config.Endpoints.Auth.Path, config.Endpoints.Auth.URL)), - op.WithCustomTokenEndpoint(op.NewEndpointWithURL(config.Endpoints.Token.Path, config.Endpoints.Token.URL)), - op.WithCustomIntrospectionEndpoint(op.NewEndpointWithURL(config.Endpoints.Introspection.Path, config.Endpoints.Introspection.URL)), - op.WithCustomUserinfoEndpoint(op.NewEndpointWithURL(config.Endpoints.Userinfo.Path, config.Endpoints.Userinfo.URL)), - op.WithCustomRevocationEndpoint(op.NewEndpointWithURL(config.Endpoints.Revocation.Path, config.Endpoints.Revocation.URL)), - op.WithCustomEndSessionEndpoint(op.NewEndpointWithURL(config.Endpoints.EndSession.Path, config.Endpoints.EndSession.URL)), - op.WithCustomKeysEndpoint(op.NewEndpointWithURL(config.Endpoints.Keys.Path, config.Endpoints.Keys.URL)), + options..., ) - logging.Log("OIDC-asf13").OnError(err).WithField("traceID", tracing.TraceIDFromCtx(ctx)).Panic("cannot create provider") - return provider + if err != nil { + return nil, fmt.Errorf("cannot create provider: %w", err) + } + return provider, nil } -func newStorage(config StorageConfig, command *command.Commands, query *query.Queries, repo repository.Repository, keyConfig systemdefaults.KeyConfig, es *eventstore.Eventstore, projections types.SQL, keyChan <-chan interface{}, assetAPIPrefix string) (*OPStorage, error) { - encAlg, err := crypto.NewAESCrypto(keyConfig.EncryptionConfig) +func Issuer(domain string, port uint16, externalSecure bool) string { + return http_utils.BuildHTTP(domain, port, externalSecure) + HandlerPrefix +} + +func createOPConfig(config Config, issuer, defaultLogoutRedirectURI string) (*op.Config, error) { + supportedLanguages, err := getSupportedLanguages() if err != nil { return nil, err } - sqlClient, err := projections.Start() + opConfig := &op.Config{ + Issuer: issuer, + DefaultLogoutRedirectURI: defaultLogoutRedirectURI, + CodeMethodS256: config.CodeMethodS256, + AuthMethodPost: config.AuthMethodPost, + AuthMethodPrivateKeyJWT: config.AuthMethodPrivateKeyJWT, + GrantTypeRefreshToken: config.GrantTypeRefreshToken, + RequestObjectSupported: config.RequestObjectSupported, + SupportedUILocales: supportedLanguages, + } + if err := cryptoKey(opConfig, config.KeyConfig); err != nil { + return nil, err + } + return opConfig, nil +} + +func cryptoKey(config *op.Config, keyConfig *crypto.KeyConfig) error { + tokenKey, err := crypto.LoadKey(keyConfig, keyConfig.EncryptionKeyID) + if err != nil { + return fmt.Errorf("cannot load OP crypto key: %w", err) + } + cryptoKey := []byte(tokenKey) + if len(cryptoKey) != 32 { + return fmt.Errorf("OP crypto key must be exactly 32 bytes") + } + copy(config.CryptoKey[:], cryptoKey) + return nil +} + +func createOptions(config Config, userAgentCookie func(http.Handler) http.Handler) ([]op.Option, error) { + metricTypes := []metrics.MetricType{metrics.MetricTypeRequestCount, metrics.MetricTypeStatusCode, metrics.MetricTypeTotalCount} + interceptor := op.WithHttpInterceptors( + middleware.MetricsHandler(metricTypes), + middleware.TelemetryHandler(), + middleware.NoCacheInterceptor, + userAgentCookie, + http_utils.CopyHeadersToContext, + ) + endpoints := customEndpoints(config.CustomEndpoints) + if len(endpoints) == 0 { + return []op.Option{interceptor}, nil + } + return append(endpoints, interceptor), nil +} + +func customEndpoints(endpointConfig *EndpointConfig) []op.Option { + if endpointConfig == nil { + return nil + } + options := []op.Option{} + if endpointConfig.Auth != nil { + options = append(options, op.WithCustomAuthEndpoint(op.NewEndpointWithURL(endpointConfig.Auth.Path, endpointConfig.Auth.URL))) + } + if endpointConfig.Token != nil { + options = append(options, op.WithCustomTokenEndpoint(op.NewEndpointWithURL(endpointConfig.Token.Path, endpointConfig.Token.URL))) + } + if endpointConfig.Introspection != nil { + options = append(options, op.WithCustomIntrospectionEndpoint(op.NewEndpointWithURL(endpointConfig.Introspection.Path, endpointConfig.Introspection.URL))) + } + if endpointConfig.Userinfo != nil { + options = append(options, op.WithCustomUserinfoEndpoint(op.NewEndpointWithURL(endpointConfig.Userinfo.Path, endpointConfig.Userinfo.URL))) + } + if endpointConfig.Revocation != nil { + options = append(options, op.WithCustomRevocationEndpoint(op.NewEndpointWithURL(endpointConfig.Revocation.Path, endpointConfig.Revocation.URL))) + } + if endpointConfig.EndSession != nil { + options = append(options, op.WithCustomEndSessionEndpoint(op.NewEndpointWithURL(endpointConfig.EndSession.Path, endpointConfig.EndSession.URL))) + } + if endpointConfig.Keys != nil { + options = append(options, op.WithCustomKeysEndpoint(op.NewEndpointWithURL(endpointConfig.Keys.Path, endpointConfig.Keys.URL))) + } + return options +} + +func newStorage(config Config, command *command.Commands, query *query.Queries, repo repository.Repository, keyConfig systemdefaults.KeyConfig, c *crypto.KeyConfig, es *eventstore.Eventstore, projections *sql.DB, keyChan <-chan interface{}) (*OPStorage, error) { + encAlg, err := crypto.NewAESCrypto(c) if err != nil { return nil, err } @@ -134,18 +201,18 @@ func newStorage(config StorageConfig, command *command.Commands, query *query.Qu command: command, query: query, eventstore: es, - defaultLoginURL: config.DefaultLoginURL, + defaultLoginURL: fmt.Sprintf("%s%s?%s=", login.HandlerPrefix, login.EndpointLogin, login.QueryAuthRequestID), signingKeyAlgorithm: config.SigningKeyAlgorithm, - defaultAccessTokenLifetime: config.DefaultAccessTokenLifetime.Duration, - defaultIdTokenLifetime: config.DefaultIdTokenLifetime.Duration, - defaultRefreshTokenIdleExpiration: config.DefaultRefreshTokenIdleExpiration.Duration, - defaultRefreshTokenExpiration: config.DefaultRefreshTokenExpiration.Duration, + defaultAccessTokenLifetime: config.DefaultAccessTokenLifetime, + defaultIdTokenLifetime: config.DefaultIdTokenLifetime, + defaultRefreshTokenIdleExpiration: config.DefaultRefreshTokenIdleExpiration, + defaultRefreshTokenExpiration: config.DefaultRefreshTokenExpiration, encAlg: encAlg, - signingKeyGracefulPeriod: keyConfig.SigningKeyGracefulPeriod.Duration, - signingKeyRotationCheck: keyConfig.SigningKeyRotationCheck.Duration, - locker: crdb.NewLocker(sqlClient, locksTable, signingKey), + signingKeyGracefulPeriod: keyConfig.SigningKeyGracefulPeriod, + signingKeyRotationCheck: keyConfig.SigningKeyRotationCheck, + locker: crdb.NewLocker(projections, locksTable, signingKey), keyChan: keyChan, - assetAPIPrefix: assetAPIPrefix, + assetAPIPrefix: assets.HandlerPrefix, }, nil } diff --git a/internal/ui/console/console.go b/internal/api/ui/console/console.go similarity index 53% rename from internal/ui/console/console.go rename to internal/api/ui/console/console.go index 67a1367714..543c5f8049 100644 --- a/internal/ui/console/console.go +++ b/internal/api/ui/console/console.go @@ -1,21 +1,23 @@ package console import ( + "encoding/json" + "fmt" "net/http" "os" "path" "strings" "time" + "github.com/caos/logging" + "github.com/caos/zitadel/internal/api/http/middleware" ) type Config struct { - Port string ConsoleOverwriteDir string ShortCache middleware.CacheConfig LongCache middleware.CacheConfig - CSPDomain string } type spaHandler struct { @@ -25,7 +27,7 @@ type spaHandler struct { const ( envRequestPath = "/assets/environment.json" consoleDefaultDir = "./console/" - handlerPrefix = "/console" + HandlerPrefix = "/ui/console" ) var ( @@ -49,23 +51,33 @@ func (i *spaHandler) Open(name string) (http.File, error) { return i.fileSystem.Open("/index.html") } -func Start(config Config) (http.Handler, string, error) { +func Start(config Config, domain, url, issuer, clientID string) (http.Handler, error) { + environmentJSON, err := createEnvironmentJSON(url, issuer, clientID) + if err != nil { + return nil, fmt.Errorf("unable to marshal env for console: %w", err) + } + consoleDir := consoleDefaultDir if config.ConsoleOverwriteDir != "" { consoleDir = config.ConsoleOverwriteDir } consoleHTTPDir := http.Dir(consoleDir) - cache := AssetsCacheInterceptorIgnoreManifest( - config.ShortCache.MaxAge.Duration, - config.ShortCache.SharedMaxAge.Duration, - config.LongCache.MaxAge.Duration, - config.LongCache.SharedMaxAge.Duration, + + cache := assetsCacheInterceptorIgnoreManifest( + config.ShortCache.MaxAge, + config.ShortCache.SharedMaxAge, + config.LongCache.MaxAge, + config.LongCache.SharedMaxAge, ) - security := middleware.SecurityHeaders(csp(config.CSPDomain), nil) + security := middleware.SecurityHeaders(csp(domain), nil) + handler := &http.ServeMux{} handler.Handle("/", cache(security(http.FileServer(&spaHandler{consoleHTTPDir})))) - handler.Handle(envRequestPath, cache(security(http.StripPrefix("/assets", http.FileServer(consoleHTTPDir))))) - return handler, handlerPrefix, nil + handler.Handle(envRequestPath, cache(security(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + _, err := w.Write(environmentJSON) + logging.OnError(err).Error("error serving environment.json") + })))) + return handler, nil } func csp(zitadelDomain string) *middleware.CSP { @@ -80,7 +92,28 @@ func csp(zitadelDomain string) *middleware.CSP { return &csp } -func AssetsCacheInterceptorIgnoreManifest(shortMaxAge, shortSharedMaxAge, longMaxAge, longSharedMaxAge time.Duration) func(http.Handler) http.Handler { +func createEnvironmentJSON(url, issuer, clientID string) ([]byte, error) { + environment := struct { + AuthServiceUrl string `json:"authServiceUrl,omitempty"` + MgmtServiceUrl string `json:"mgmtServiceUrl,omitempty"` + AdminServiceUrl string `json:"adminServiceUrl,omitempty"` + SubscriptionServiceUrl string `json:"subscriptionServiceUrl,omitempty"` + AssetServiceUrl string `json:"assetServiceUrl,omitempty"` + Issuer string `json:"issuer,omitempty"` + ClientID string `json:"clientid,omitempty"` + }{ + AuthServiceUrl: url, + MgmtServiceUrl: url, + AdminServiceUrl: url, + SubscriptionServiceUrl: url, + AssetServiceUrl: url, + Issuer: issuer, + ClientID: clientID, + } + return json.Marshal(environment) +} + +func assetsCacheInterceptorIgnoreManifest(shortMaxAge, shortSharedMaxAge, longMaxAge, longSharedMaxAge time.Duration) func(http.Handler) http.Handler { return func(handler http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { for _, file := range shortCacheFiles { diff --git a/internal/ui/login/handler/auth_request.go b/internal/api/ui/login/auth_request.go similarity index 88% rename from internal/ui/login/handler/auth_request.go rename to internal/api/ui/login/auth_request.go index dd2f0a89c4..d7a2984077 100644 --- a/internal/ui/login/handler/auth_request.go +++ b/internal/api/ui/login/auth_request.go @@ -1,4 +1,4 @@ -package handler +package login import ( "net/http" @@ -9,12 +9,12 @@ import ( ) const ( - queryAuthRequestID = "authRequestID" + QueryAuthRequestID = "authRequestID" queryUserAgentID = "userAgentID" ) func (l *Login) getAuthRequest(r *http.Request) (*domain.AuthRequest, error) { - authRequestID := r.FormValue(queryAuthRequestID) + authRequestID := r.FormValue(QueryAuthRequestID) if authRequestID == "" { return nil, nil } diff --git a/internal/ui/login/handler/change_password_handler.go b/internal/api/ui/login/change_password_handler.go similarity index 99% rename from internal/ui/login/handler/change_password_handler.go rename to internal/api/ui/login/change_password_handler.go index 66992f56bf..5a60a3ab78 100644 --- a/internal/ui/login/handler/change_password_handler.go +++ b/internal/api/ui/login/change_password_handler.go @@ -1,9 +1,10 @@ -package handler +package login import ( - "github.com/caos/zitadel/internal/domain" "net/http" + "github.com/caos/zitadel/internal/domain" + http_mw "github.com/caos/zitadel/internal/api/http/middleware" ) diff --git a/internal/ui/login/handler/custom_action.go b/internal/api/ui/login/custom_action.go similarity index 99% rename from internal/ui/login/handler/custom_action.go rename to internal/api/ui/login/custom_action.go index 3ff99b3b69..b4b8b75c3f 100644 --- a/internal/ui/login/handler/custom_action.go +++ b/internal/api/ui/login/custom_action.go @@ -1,4 +1,4 @@ -package handler +package login import ( "context" diff --git a/internal/ui/login/handler/external_login_handler.go b/internal/api/ui/login/external_login_handler.go similarity index 99% rename from internal/ui/login/handler/external_login_handler.go rename to internal/api/ui/login/external_login_handler.go index f9338eebad..4e9b52171d 100644 --- a/internal/ui/login/handler/external_login_handler.go +++ b/internal/api/ui/login/external_login_handler.go @@ -1,4 +1,4 @@ -package handler +package login import ( "encoding/base64" @@ -115,7 +115,7 @@ func (l *Login) handleJWTAuthorize(w http.ResponseWriter, r *http.Request, authR return } q := redirect.Query() - q.Set(queryAuthRequestID, authReq.ID) + q.Set(QueryAuthRequestID, authReq.ID) userAgentID, ok := http_mw.UserAgentIDFromCtx(r.Context()) if !ok { l.renderLogin(w, r, authReq, caos_errors.ThrowPreconditionFailed(nil, "LOGIN-dsgg3", "Errors.AuthRequest.UserAgentNotFound")) diff --git a/internal/ui/login/handler/external_register_handler.go b/internal/api/ui/login/external_register_handler.go similarity index 99% rename from internal/ui/login/handler/external_register_handler.go rename to internal/api/ui/login/external_register_handler.go index bd8f90f840..668692a6bc 100644 --- a/internal/ui/login/handler/external_register_handler.go +++ b/internal/api/ui/login/external_register_handler.go @@ -1,4 +1,4 @@ -package handler +package login import ( "net/http" diff --git a/internal/ui/login/handler/health_handler.go b/internal/api/ui/login/health_handler.go similarity index 95% rename from internal/ui/login/handler/health_handler.go rename to internal/api/ui/login/health_handler.go index 42ce77174f..2a632aedfe 100644 --- a/internal/ui/login/handler/health_handler.go +++ b/internal/api/ui/login/health_handler.go @@ -1,4 +1,4 @@ -package handler +package login import ( "net/http" diff --git a/internal/ui/login/handler/init_password_handler.go b/internal/api/ui/login/init_password_handler.go similarity index 99% rename from internal/ui/login/handler/init_password_handler.go rename to internal/api/ui/login/init_password_handler.go index ab0f90445a..fcec051e70 100644 --- a/internal/ui/login/handler/init_password_handler.go +++ b/internal/api/ui/login/init_password_handler.go @@ -1,4 +1,4 @@ -package handler +package login import ( "net/http" diff --git a/internal/ui/login/handler/init_user_handler.go b/internal/api/ui/login/init_user_handler.go similarity index 99% rename from internal/ui/login/handler/init_user_handler.go rename to internal/api/ui/login/init_user_handler.go index a06654e71c..c3dd7fb91d 100644 --- a/internal/ui/login/handler/init_user_handler.go +++ b/internal/api/ui/login/init_user_handler.go @@ -1,10 +1,11 @@ -package handler +package login import ( - "github.com/caos/zitadel/internal/domain" "net/http" "strconv" + "github.com/caos/zitadel/internal/domain" + caos_errs "github.com/caos/zitadel/internal/errors" ) diff --git a/internal/ui/login/handler/jwt_handler.go b/internal/api/ui/login/jwt_handler.go similarity index 99% rename from internal/ui/login/handler/jwt_handler.go rename to internal/api/ui/login/jwt_handler.go index 3e7ef78551..da8b69afae 100644 --- a/internal/ui/login/handler/jwt_handler.go +++ b/internal/api/ui/login/jwt_handler.go @@ -1,4 +1,4 @@ -package handler +package login import ( "context" @@ -180,7 +180,7 @@ func (l *Login) redirectToJWTCallback(authReq *domain.AuthRequest) (string, erro return "", err } q := redirect.Query() - q.Set(queryAuthRequestID, authReq.ID) + q.Set(QueryAuthRequestID, authReq.ID) nonce, err := l.IDPConfigAesCrypto.Encrypt([]byte(authReq.AgentID)) if err != nil { return "", err diff --git a/internal/ui/login/handler/link_users_handler.go b/internal/api/ui/login/link_users_handler.go similarity index 98% rename from internal/ui/login/handler/link_users_handler.go rename to internal/api/ui/login/link_users_handler.go index 6aff126534..9d56126360 100644 --- a/internal/ui/login/handler/link_users_handler.go +++ b/internal/api/ui/login/link_users_handler.go @@ -1,9 +1,10 @@ -package handler +package login import ( + "net/http" + http_mw "github.com/caos/zitadel/internal/api/http/middleware" "github.com/caos/zitadel/internal/domain" - "net/http" ) const ( diff --git a/internal/api/ui/login/login.go b/internal/api/ui/login/login.go new file mode 100644 index 0000000000..e184d1077c --- /dev/null +++ b/internal/api/ui/login/login.go @@ -0,0 +1,152 @@ +package login + +import ( + "context" + "fmt" + "net/http" + + "github.com/gorilla/csrf" + "github.com/gorilla/mux" + "github.com/rakyll/statik/fs" + + "github.com/caos/zitadel/internal/api/authz" + http_utils "github.com/caos/zitadel/internal/api/http" + "github.com/caos/zitadel/internal/api/http/middleware" + _ "github.com/caos/zitadel/internal/api/ui/login/statik" + auth_repository "github.com/caos/zitadel/internal/auth/repository" + "github.com/caos/zitadel/internal/auth/repository/eventsourcing" + "github.com/caos/zitadel/internal/command" + "github.com/caos/zitadel/internal/config/systemdefaults" + "github.com/caos/zitadel/internal/crypto" + "github.com/caos/zitadel/internal/domain" + "github.com/caos/zitadel/internal/form" + "github.com/caos/zitadel/internal/query" + "github.com/caos/zitadel/internal/static" +) + +type Login struct { + endpoint string + router http.Handler + renderer *Renderer + parser *form.Parser + command *command.Commands + query *query.Queries + staticStorage static.Storage + //staticCache cache.Cache //TODO: enable when storage is implemented again + authRepo auth_repository.Repository + baseURL string + zitadelURL string + oidcAuthCallbackURL string + IDPConfigAesCrypto crypto.EncryptionAlgorithm + iamDomain string +} + +type Config struct { + LanguageCookieName string + CSRF CSRF + Cache middleware.CacheConfig + //StaticCache cache_config.CacheConfig //TODO: enable when storage is implemented again +} + +type CSRF struct { + CookieName string + Key *crypto.KeyConfig +} + +const ( + login = "LOGIN" + HandlerPrefix = "/ui/login" + DefaultLoggedOutPath = HandlerPrefix + EndpointLogoutDone +) + +func CreateLogin(config Config, command *command.Commands, query *query.Queries, authRepo *eventsourcing.EsRepository, staticStorage static.Storage, systemDefaults systemdefaults.SystemDefaults, zitadelURL, domain, oidcAuthCallbackURL string, externalSecure bool, userAgentCookie mux.MiddlewareFunc) (*Login, error) { + aesCrypto, err := crypto.NewAESCrypto(systemDefaults.IDPConfigVerificationKey) + if err != nil { + return nil, fmt.Errorf("error create new aes crypto: %w", err) + } + login := &Login{ + oidcAuthCallbackURL: oidcAuthCallbackURL, + baseURL: HandlerPrefix, + zitadelURL: zitadelURL, + command: command, + query: query, + staticStorage: staticStorage, + authRepo: authRepo, + IDPConfigAesCrypto: aesCrypto, + iamDomain: domain, + } + //TODO: enable when storage is implemented again + //login.staticCache, err = config.StaticCache.Config.NewCache() + //if err != nil { + // return nil, fmt.Errorf("unable to create storage cache: %w", err) + //} + + statikFS, err := fs.NewWithNamespace("login") + if err != nil { + return nil, fmt.Errorf("unable to create filesystem: %w", err) + } + + csrfInterceptor, err := createCSRFInterceptor(config.CSRF, externalSecure, login.csrfErrorHandler()) + if err != nil { + return nil, fmt.Errorf("unable to create csrfInterceptor: %w", err) + } + cacheInterceptor, err := middleware.DefaultCacheInterceptor(EndpointResources, config.Cache.MaxAge, config.Cache.SharedMaxAge) + if err != nil { + return nil, fmt.Errorf("unable to create cacheInterceptor: %w", err) + } + security := middleware.SecurityHeaders(csp(), login.cspErrorHandler) + login.router = CreateRouter(login, statikFS, csrfInterceptor, cacheInterceptor, security, userAgentCookie, middleware.TelemetryHandler(EndpointResources)) + login.renderer = CreateRenderer(HandlerPrefix, statikFS, staticStorage, config.LanguageCookieName, systemDefaults.DefaultLanguage) + login.parser = form.NewParser() + return login, nil +} + +func csp() *middleware.CSP { + csp := middleware.DefaultSCP + csp.ObjectSrc = middleware.CSPSourceOptsSelf() + csp.StyleSrc = csp.StyleSrc.AddNonce() + csp.ScriptSrc = csp.ScriptSrc.AddNonce() + return &csp +} + +func createCSRFInterceptor(config CSRF, externalSecure bool, errorHandler http.Handler) (func(http.Handler) http.Handler, error) { + csrfKey, err := crypto.LoadKey(config.Key, config.Key.EncryptionKeyID) + if err != nil { + return nil, err + } + path := "/" + return csrf.Protect([]byte(csrfKey), + csrf.Secure(externalSecure), + csrf.CookieName(http_utils.SetCookiePrefix(config.CookieName, "", path, externalSecure)), + csrf.Path(path), + csrf.ErrorHandler(errorHandler), + ), nil +} + +func (l *Login) Handler() http.Handler { + return l.router +} + +func (l *Login) getClaimedUserIDsOfOrgDomain(ctx context.Context, orgName string) ([]string, error) { + loginName, err := query.NewUserPreferredLoginNameSearchQuery("@"+domain.NewIAMDomainName(orgName, l.iamDomain), query.TextEndsWithIgnoreCase) + if err != nil { + return nil, err + } + users, err := l.query.SearchUsers(ctx, &query.UserSearchQueries{Queries: []query.SearchQuery{loginName}}) + if err != nil { + return nil, err + } + userIDs := make([]string, len(users.Users)) + for i, user := range users.Users { + userIDs[i] = user.ID + } + return userIDs, nil +} + +func setContext(ctx context.Context, resourceOwner string) context.Context { + data := authz.CtxData{ + UserID: login, + OrgID: resourceOwner, + } + return authz.SetCtxData(ctx, data) +} diff --git a/internal/ui/login/handler/login_handler.go b/internal/api/ui/login/login_handler.go similarity index 99% rename from internal/ui/login/handler/login_handler.go rename to internal/api/ui/login/login_handler.go index bfc36d22e9..489e795989 100644 --- a/internal/ui/login/handler/login_handler.go +++ b/internal/api/ui/login/login_handler.go @@ -1,4 +1,4 @@ -package handler +package login import ( "net/http" diff --git a/internal/ui/login/handler/login_success_handler.go b/internal/api/ui/login/login_success_handler.go similarity index 98% rename from internal/ui/login/handler/login_success_handler.go rename to internal/api/ui/login/login_success_handler.go index d7aec74c82..d282c47f73 100644 --- a/internal/ui/login/handler/login_success_handler.go +++ b/internal/api/ui/login/login_success_handler.go @@ -1,4 +1,4 @@ -package handler +package login import ( "net/http" diff --git a/internal/ui/login/handler/logout_handler.go b/internal/api/ui/login/logout_handler.go similarity index 96% rename from internal/ui/login/handler/logout_handler.go rename to internal/api/ui/login/logout_handler.go index 2723c1f45c..26a9005f5f 100644 --- a/internal/ui/login/handler/logout_handler.go +++ b/internal/api/ui/login/logout_handler.go @@ -1,4 +1,4 @@ -package handler +package login import ( "net/http" diff --git a/internal/ui/login/handler/mail_verify_handler.go b/internal/api/ui/login/mail_verify_handler.go similarity index 99% rename from internal/ui/login/handler/mail_verify_handler.go rename to internal/api/ui/login/mail_verify_handler.go index 1b5b79c352..6cd4cde2c4 100644 --- a/internal/ui/login/handler/mail_verify_handler.go +++ b/internal/api/ui/login/mail_verify_handler.go @@ -1,8 +1,9 @@ -package handler +package login import ( - "github.com/caos/zitadel/internal/domain" "net/http" + + "github.com/caos/zitadel/internal/domain" ) const ( diff --git a/internal/ui/login/handler/mfa_init_done_handler.go b/internal/api/ui/login/mfa_init_done_handler.go similarity index 97% rename from internal/ui/login/handler/mfa_init_done_handler.go rename to internal/api/ui/login/mfa_init_done_handler.go index 62196dffb0..021e6fd44a 100644 --- a/internal/ui/login/handler/mfa_init_done_handler.go +++ b/internal/api/ui/login/mfa_init_done_handler.go @@ -1,8 +1,9 @@ -package handler +package login import ( - "github.com/caos/zitadel/internal/domain" "net/http" + + "github.com/caos/zitadel/internal/domain" ) const ( diff --git a/internal/ui/login/handler/mfa_init_u2f.go b/internal/api/ui/login/mfa_init_u2f.go similarity index 99% rename from internal/ui/login/handler/mfa_init_u2f.go rename to internal/api/ui/login/mfa_init_u2f.go index a945581cec..3a2b7ff047 100644 --- a/internal/ui/login/handler/mfa_init_u2f.go +++ b/internal/api/ui/login/mfa_init_u2f.go @@ -1,4 +1,4 @@ -package handler +package login import ( "encoding/base64" diff --git a/internal/ui/login/handler/mfa_init_verify_handler.go b/internal/api/ui/login/mfa_init_verify_handler.go similarity index 99% rename from internal/ui/login/handler/mfa_init_verify_handler.go rename to internal/api/ui/login/mfa_init_verify_handler.go index 91ae23ccef..75c2172536 100644 --- a/internal/ui/login/handler/mfa_init_verify_handler.go +++ b/internal/api/ui/login/mfa_init_verify_handler.go @@ -1,10 +1,11 @@ -package handler +package login import ( "bytes" - "github.com/caos/zitadel/internal/domain" "net/http" + "github.com/caos/zitadel/internal/domain" + svg "github.com/ajstarks/svgo" "github.com/boombuler/barcode/qr" diff --git a/internal/ui/login/handler/mfa_prompt_handler.go b/internal/api/ui/login/mfa_prompt_handler.go similarity index 99% rename from internal/ui/login/handler/mfa_prompt_handler.go rename to internal/api/ui/login/mfa_prompt_handler.go index a2e21859ee..0c50c1f979 100644 --- a/internal/ui/login/handler/mfa_prompt_handler.go +++ b/internal/api/ui/login/mfa_prompt_handler.go @@ -1,9 +1,10 @@ -package handler +package login import ( - "github.com/caos/zitadel/internal/domain" "net/http" + "github.com/caos/zitadel/internal/domain" + caos_errs "github.com/caos/zitadel/internal/errors" ) diff --git a/internal/ui/login/handler/mfa_verify_handler.go b/internal/api/ui/login/mfa_verify_handler.go similarity index 99% rename from internal/ui/login/handler/mfa_verify_handler.go rename to internal/api/ui/login/mfa_verify_handler.go index 23bdbba246..f4c2d52e59 100644 --- a/internal/ui/login/handler/mfa_verify_handler.go +++ b/internal/api/ui/login/mfa_verify_handler.go @@ -1,9 +1,10 @@ -package handler +package login import ( + "net/http" + http_mw "github.com/caos/zitadel/internal/api/http/middleware" "github.com/caos/zitadel/internal/domain" - "net/http" ) const ( diff --git a/internal/ui/login/handler/mfa_verify_u2f_handler.go b/internal/api/ui/login/mfa_verify_u2f_handler.go similarity index 99% rename from internal/ui/login/handler/mfa_verify_u2f_handler.go rename to internal/api/ui/login/mfa_verify_u2f_handler.go index 24bbec9b48..6b85213471 100644 --- a/internal/ui/login/handler/mfa_verify_u2f_handler.go +++ b/internal/api/ui/login/mfa_verify_u2f_handler.go @@ -1,10 +1,11 @@ -package handler +package login import ( "encoding/base64" - "github.com/caos/zitadel/internal/domain" "net/http" + "github.com/caos/zitadel/internal/domain" + http_mw "github.com/caos/zitadel/internal/api/http/middleware" ) diff --git a/internal/ui/login/handler/password_complexity_policy_handler.go b/internal/api/ui/login/password_complexity_policy_handler.go similarity index 99% rename from internal/ui/login/handler/password_complexity_policy_handler.go rename to internal/api/ui/login/password_complexity_policy_handler.go index f948a0471a..74eb66047c 100644 --- a/internal/ui/login/handler/password_complexity_policy_handler.go +++ b/internal/api/ui/login/password_complexity_policy_handler.go @@ -1,4 +1,4 @@ -package handler +package login import ( "net/http" diff --git a/internal/ui/login/handler/password_handler.go b/internal/api/ui/login/password_handler.go similarity index 98% rename from internal/ui/login/handler/password_handler.go rename to internal/api/ui/login/password_handler.go index 294454d843..ca724b747b 100644 --- a/internal/ui/login/handler/password_handler.go +++ b/internal/api/ui/login/password_handler.go @@ -1,9 +1,10 @@ -package handler +package login import ( - "github.com/caos/zitadel/internal/domain" "net/http" + "github.com/caos/zitadel/internal/domain" + http_mw "github.com/caos/zitadel/internal/api/http/middleware" ) diff --git a/internal/ui/login/handler/password_reset_handler.go b/internal/api/ui/login/password_reset_handler.go similarity index 98% rename from internal/ui/login/handler/password_reset_handler.go rename to internal/api/ui/login/password_reset_handler.go index 90bac81e75..2741841c7e 100644 --- a/internal/ui/login/handler/password_reset_handler.go +++ b/internal/api/ui/login/password_reset_handler.go @@ -1,4 +1,4 @@ -package handler +package login import ( "github.com/caos/zitadel/internal/domain" diff --git a/internal/ui/login/handler/passwordless_login_handler.go b/internal/api/ui/login/passwordless_login_handler.go similarity index 99% rename from internal/ui/login/handler/passwordless_login_handler.go rename to internal/api/ui/login/passwordless_login_handler.go index 851a2c1480..76a8fc7c23 100644 --- a/internal/ui/login/handler/passwordless_login_handler.go +++ b/internal/api/ui/login/passwordless_login_handler.go @@ -1,10 +1,11 @@ -package handler +package login import ( "encoding/base64" - "github.com/caos/zitadel/internal/domain" "net/http" + "github.com/caos/zitadel/internal/domain" + http_mw "github.com/caos/zitadel/internal/api/http/middleware" ) diff --git a/internal/ui/login/handler/passwordless_prompt_handler.go b/internal/api/ui/login/passwordless_prompt_handler.go similarity index 98% rename from internal/ui/login/handler/passwordless_prompt_handler.go rename to internal/api/ui/login/passwordless_prompt_handler.go index 679f8f47aa..e36d6deec7 100644 --- a/internal/ui/login/handler/passwordless_prompt_handler.go +++ b/internal/api/ui/login/passwordless_prompt_handler.go @@ -1,4 +1,4 @@ -package handler +package login import ( "net/http" diff --git a/internal/ui/login/handler/passwordless_registration_handler.go b/internal/api/ui/login/passwordless_registration_handler.go similarity index 99% rename from internal/ui/login/handler/passwordless_registration_handler.go rename to internal/api/ui/login/passwordless_registration_handler.go index 2d66604109..8a3e2c6963 100644 --- a/internal/ui/login/handler/passwordless_registration_handler.go +++ b/internal/api/ui/login/passwordless_registration_handler.go @@ -1,4 +1,4 @@ -package handler +package login import ( "encoding/base64" diff --git a/internal/ui/login/handler/policy_handler.go b/internal/api/ui/login/policy_handler.go similarity index 97% rename from internal/ui/login/handler/policy_handler.go rename to internal/api/ui/login/policy_handler.go index 846dd1d320..817183df5e 100644 --- a/internal/ui/login/handler/policy_handler.go +++ b/internal/api/ui/login/policy_handler.go @@ -1,4 +1,4 @@ -package handler +package login import ( "net/http" diff --git a/internal/ui/login/handler/register_handler.go b/internal/api/ui/login/register_handler.go similarity index 99% rename from internal/ui/login/handler/register_handler.go rename to internal/api/ui/login/register_handler.go index 580fffc570..754e72714d 100644 --- a/internal/ui/login/handler/register_handler.go +++ b/internal/api/ui/login/register_handler.go @@ -1,4 +1,4 @@ -package handler +package login import ( "net/http" diff --git a/internal/ui/login/handler/register_option_handler.go b/internal/api/ui/login/register_option_handler.go similarity index 98% rename from internal/ui/login/handler/register_option_handler.go rename to internal/api/ui/login/register_option_handler.go index 126514d0b4..fae999e73a 100644 --- a/internal/ui/login/handler/register_option_handler.go +++ b/internal/api/ui/login/register_option_handler.go @@ -1,8 +1,9 @@ -package handler +package login import ( - "github.com/caos/zitadel/internal/domain" "net/http" + + "github.com/caos/zitadel/internal/domain" ) const ( diff --git a/internal/ui/login/handler/register_org_handler.go b/internal/api/ui/login/register_org_handler.go similarity index 99% rename from internal/ui/login/handler/register_org_handler.go rename to internal/api/ui/login/register_org_handler.go index ea609fa9bb..2970aa39f4 100644 --- a/internal/ui/login/handler/register_org_handler.go +++ b/internal/api/ui/login/register_org_handler.go @@ -1,4 +1,4 @@ -package handler +package login import ( "net/http" diff --git a/internal/ui/login/handler/renderer.go b/internal/api/ui/login/renderer.go similarity index 98% rename from internal/ui/login/handler/renderer.go rename to internal/api/ui/login/renderer.go index 2e7d01d1e4..c79c4d2e8f 100644 --- a/internal/ui/login/handler/renderer.go +++ b/internal/api/ui/login/renderer.go @@ -1,4 +1,4 @@ -package handler +package login import ( "errors" @@ -110,19 +110,19 @@ func CreateRenderer(pathPrefix string, staticDir http.FileSystem, staticStorage return path.Join(r.pathPrefix, EndpointLogin) }, "externalIDPAuthURL": func(authReqID, idpConfigID string) string { - return path.Join(r.pathPrefix, fmt.Sprintf("%s?%s=%s&%s=%s", EndpointExternalLogin, queryAuthRequestID, authReqID, queryIDPConfigID, idpConfigID)) + return path.Join(r.pathPrefix, fmt.Sprintf("%s?%s=%s&%s=%s", EndpointExternalLogin, QueryAuthRequestID, authReqID, queryIDPConfigID, idpConfigID)) }, "externalIDPRegisterURL": func(authReqID, idpConfigID string) string { - return path.Join(r.pathPrefix, fmt.Sprintf("%s?%s=%s&%s=%s", EndpointExternalRegister, queryAuthRequestID, authReqID, queryIDPConfigID, idpConfigID)) + return path.Join(r.pathPrefix, fmt.Sprintf("%s?%s=%s&%s=%s", EndpointExternalRegister, QueryAuthRequestID, authReqID, queryIDPConfigID, idpConfigID)) }, "registerUrl": func(id string) string { - return path.Join(r.pathPrefix, fmt.Sprintf("%s?%s=%s", EndpointRegister, queryAuthRequestID, id)) + return path.Join(r.pathPrefix, fmt.Sprintf("%s?%s=%s", EndpointRegister, QueryAuthRequestID, id)) }, "loginNameUrl": func() string { return path.Join(r.pathPrefix, EndpointLoginName) }, "loginNameChangeUrl": func(id string) string { - return path.Join(r.pathPrefix, fmt.Sprintf("%s?%s=%s", EndpointLoginName, queryAuthRequestID, id)) + return path.Join(r.pathPrefix, fmt.Sprintf("%s?%s=%s", EndpointLoginName, QueryAuthRequestID, id)) }, "userSelectionUrl": func() string { return path.Join(r.pathPrefix, EndpointUserSelection) @@ -137,7 +137,7 @@ func CreateRenderer(pathPrefix string, staticDir http.FileSystem, staticStorage return path.Join(r.pathPrefix, EndpointPasswordlessPrompt) }, "passwordResetUrl": func(id string) string { - return path.Join(r.pathPrefix, fmt.Sprintf("%s?%s=%s", EndpointPasswordReset, queryAuthRequestID, id)) + return path.Join(r.pathPrefix, fmt.Sprintf("%s?%s=%s", EndpointPasswordReset, QueryAuthRequestID, id)) }, "passwordUrl": func() string { return path.Join(r.pathPrefix, EndpointPassword) @@ -149,7 +149,7 @@ func CreateRenderer(pathPrefix string, staticDir http.FileSystem, staticStorage return path.Join(r.pathPrefix, EndpointMFAPrompt) }, "mfaPromptChangeUrl": func(id string, provider domain.MFAType) string { - return path.Join(r.pathPrefix, fmt.Sprintf("%s?%s=%s;%s=%v", EndpointMFAPrompt, queryAuthRequestID, id, "provider", provider)) + return path.Join(r.pathPrefix, fmt.Sprintf("%s?%s=%s;%s=%v", EndpointMFAPrompt, QueryAuthRequestID, id, "provider", provider)) }, "mfaInitVerifyUrl": func() string { return path.Join(r.pathPrefix, EndpointMFAInitVerify) @@ -490,7 +490,7 @@ func getRequestID(authReq *domain.AuthRequest, r *http.Request) string { if authReq != nil { return authReq.ID } - return r.FormValue(queryAuthRequestID) + return r.FormValue(QueryAuthRequestID) } func (l *Login) csrfErrorHandler() http.Handler { diff --git a/internal/api/ui/login/resources_handler.go b/internal/api/ui/login/resources_handler.go new file mode 100644 index 0000000000..dbb6aad26c --- /dev/null +++ b/internal/api/ui/login/resources_handler.go @@ -0,0 +1,97 @@ +package login + +import ( + "context" + "net/http" + + "github.com/caos/zitadel/internal/domain" +) + +type dynamicResourceData struct { + OrgID string `schema:"orgId"` + DefaultPolicy bool `schema:"default-policy"` + FileName string `schema:"filename"` +} + +func (l *Login) handleResources(staticDir http.FileSystem) http.Handler { + return http.FileServer(staticDir) +} + +func (l *Login) handleDynamicResources(w http.ResponseWriter, r *http.Request) { + data := new(dynamicResourceData) + err := l.getParseData(r, data) + if err != nil { + return + } + + bucketName := domain.IAMID + if data.OrgID != "" && !data.DefaultPolicy { + bucketName = data.OrgID + } + + etag := r.Header.Get("If-None-Match") + asset, info, err := l.getStatic(r.Context(), bucketName, data.FileName) + if info != nil && info.ETag == etag { + w.WriteHeader(304) + return + } + if err != nil { + return + } + //TODO: enable again when assets are implemented again + _ = asset + //w.Header().Set("content-length", strconv.FormatInt(info.Size, 10)) + //w.Header().Set("content-type", info.ContentType) + //w.Header().Set("ETag", info.ETag) + //w.Write(asset) +} + +func (l *Login) getStatic(ctx context.Context, bucketName, fileName string) ([]byte, *domain.AssetInfo, error) { + s := new(staticAsset) + //TODO: enable again when assets are implemented again + //key := bucketName + "-" + fileName + //err := l.staticCache.Get(key, s) + //if err == nil && s.Info != nil && (s.Info.Expiration.After(time.Now().Add(-1 * time.Minute))) { //TODO: config? + // return s.Data, s.Info, nil + //} + + //info, err := l.staticStorage.GetObjectInfo(ctx, bucketName, fileName) + //if err != nil { + // if caos_errs.IsNotFound(err) { + // return nil, nil, err + // } + // return s.Data, s.Info, err + //} + //if s.Info != nil && s.Info.ETag == info.ETag { + // if info.Expiration.After(s.Info.Expiration) { + // s.Info = info + // //l.cacheStatic(bucketName, fileName, s) + // } + // return s.Data, s.Info, nil + //} + // + //reader, _, err := l.staticStorage.GetObject(ctx, bucketName, fileName) + //if err != nil { + // return s.Data, s.Info, err + //} + //s.Data, err = ioutil.ReadAll(reader) + //if err != nil { + // return nil, nil, err + //} + //s.Info = info + //l.cacheStatic(bucketName, fileName, s) + return s.Data, s.Info, nil +} + +//TODO: enable again when assets are implemented again +// +//func (l *Login) cacheStatic(bucketName, fileName string, s *staticAsset) { +// key := bucketName + "-" + fileName +// err := l.staticCache.Set(key, &s) +// logging.Log("HANDLER-dfht2").OnError(err).Warnf("caching of asset %s: %s failed", bucketName, fileName) +//} + +type staticAsset struct { + Data []byte + Info *domain.AssetInfo +} diff --git a/internal/ui/login/handler/router.go b/internal/api/ui/login/router.go similarity index 99% rename from internal/ui/login/handler/router.go rename to internal/api/ui/login/router.go index ab441a759d..76b8a23172 100644 --- a/internal/ui/login/handler/router.go +++ b/internal/api/ui/login/router.go @@ -1,4 +1,4 @@ -package handler +package login import ( "net/http" diff --git a/internal/ui/login/handler/select_user_handler.go b/internal/api/ui/login/select_user_handler.go similarity index 98% rename from internal/ui/login/handler/select_user_handler.go rename to internal/api/ui/login/select_user_handler.go index 049ce278c4..aad30927e8 100644 --- a/internal/ui/login/handler/select_user_handler.go +++ b/internal/api/ui/login/select_user_handler.go @@ -1,9 +1,10 @@ -package handler +package login import ( - "github.com/caos/zitadel/internal/domain" "net/http" + "github.com/caos/zitadel/internal/domain" + http_mw "github.com/caos/zitadel/internal/api/http/middleware" ) diff --git a/internal/ui/login/static/i18n/de.yaml b/internal/api/ui/login/static/i18n/de.yaml similarity index 100% rename from internal/ui/login/static/i18n/de.yaml rename to internal/api/ui/login/static/i18n/de.yaml diff --git a/internal/ui/login/static/i18n/en.yaml b/internal/api/ui/login/static/i18n/en.yaml similarity index 100% rename from internal/ui/login/static/i18n/en.yaml rename to internal/api/ui/login/static/i18n/en.yaml diff --git a/internal/ui/login/static/i18n/it.yaml b/internal/api/ui/login/static/i18n/it.yaml similarity index 100% rename from internal/ui/login/static/i18n/it.yaml rename to internal/api/ui/login/static/i18n/it.yaml diff --git a/internal/ui/login/static/resources/fonts/PT_Sans/PTSans-Bold.ttf b/internal/api/ui/login/static/resources/fonts/PT_Sans/PTSans-Bold.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/PT_Sans/PTSans-Bold.ttf rename to internal/api/ui/login/static/resources/fonts/PT_Sans/PTSans-Bold.ttf diff --git a/internal/ui/login/static/resources/fonts/PT_Sans/PTSans-BoldItalic.ttf b/internal/api/ui/login/static/resources/fonts/PT_Sans/PTSans-BoldItalic.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/PT_Sans/PTSans-BoldItalic.ttf rename to internal/api/ui/login/static/resources/fonts/PT_Sans/PTSans-BoldItalic.ttf diff --git a/internal/ui/login/static/resources/fonts/PT_Sans/PTSans-Italic.ttf b/internal/api/ui/login/static/resources/fonts/PT_Sans/PTSans-Italic.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/PT_Sans/PTSans-Italic.ttf rename to internal/api/ui/login/static/resources/fonts/PT_Sans/PTSans-Italic.ttf diff --git a/internal/ui/login/static/resources/fonts/PT_Sans/PTSans-Regular.ttf b/internal/api/ui/login/static/resources/fonts/PT_Sans/PTSans-Regular.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/PT_Sans/PTSans-Regular.ttf rename to internal/api/ui/login/static/resources/fonts/PT_Sans/PTSans-Regular.ttf diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-Black.ttf b/internal/api/ui/login/static/resources/fonts/Raleway/Raleway-Black.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Raleway/Raleway-Black.ttf rename to internal/api/ui/login/static/resources/fonts/Raleway/Raleway-Black.ttf diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-BlackItalic.ttf b/internal/api/ui/login/static/resources/fonts/Raleway/Raleway-BlackItalic.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Raleway/Raleway-BlackItalic.ttf rename to internal/api/ui/login/static/resources/fonts/Raleway/Raleway-BlackItalic.ttf diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-Bold.ttf b/internal/api/ui/login/static/resources/fonts/Raleway/Raleway-Bold.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Raleway/Raleway-Bold.ttf rename to internal/api/ui/login/static/resources/fonts/Raleway/Raleway-Bold.ttf diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-BoldItalic.ttf b/internal/api/ui/login/static/resources/fonts/Raleway/Raleway-BoldItalic.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Raleway/Raleway-BoldItalic.ttf rename to internal/api/ui/login/static/resources/fonts/Raleway/Raleway-BoldItalic.ttf diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-ExtraBold.ttf b/internal/api/ui/login/static/resources/fonts/Raleway/Raleway-ExtraBold.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Raleway/Raleway-ExtraBold.ttf rename to internal/api/ui/login/static/resources/fonts/Raleway/Raleway-ExtraBold.ttf diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-ExtraBoldItalic.ttf b/internal/api/ui/login/static/resources/fonts/Raleway/Raleway-ExtraBoldItalic.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Raleway/Raleway-ExtraBoldItalic.ttf rename to internal/api/ui/login/static/resources/fonts/Raleway/Raleway-ExtraBoldItalic.ttf diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-ExtraLight.ttf b/internal/api/ui/login/static/resources/fonts/Raleway/Raleway-ExtraLight.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Raleway/Raleway-ExtraLight.ttf rename to internal/api/ui/login/static/resources/fonts/Raleway/Raleway-ExtraLight.ttf diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-ExtraLightItalic.ttf b/internal/api/ui/login/static/resources/fonts/Raleway/Raleway-ExtraLightItalic.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Raleway/Raleway-ExtraLightItalic.ttf rename to internal/api/ui/login/static/resources/fonts/Raleway/Raleway-ExtraLightItalic.ttf diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-Italic.ttf b/internal/api/ui/login/static/resources/fonts/Raleway/Raleway-Italic.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Raleway/Raleway-Italic.ttf rename to internal/api/ui/login/static/resources/fonts/Raleway/Raleway-Italic.ttf diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-Light.ttf b/internal/api/ui/login/static/resources/fonts/Raleway/Raleway-Light.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Raleway/Raleway-Light.ttf rename to internal/api/ui/login/static/resources/fonts/Raleway/Raleway-Light.ttf diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-LightItalic.ttf b/internal/api/ui/login/static/resources/fonts/Raleway/Raleway-LightItalic.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Raleway/Raleway-LightItalic.ttf rename to internal/api/ui/login/static/resources/fonts/Raleway/Raleway-LightItalic.ttf diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-Medium.ttf b/internal/api/ui/login/static/resources/fonts/Raleway/Raleway-Medium.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Raleway/Raleway-Medium.ttf rename to internal/api/ui/login/static/resources/fonts/Raleway/Raleway-Medium.ttf diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-MediumItalic.ttf b/internal/api/ui/login/static/resources/fonts/Raleway/Raleway-MediumItalic.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Raleway/Raleway-MediumItalic.ttf rename to internal/api/ui/login/static/resources/fonts/Raleway/Raleway-MediumItalic.ttf diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-Regular.ttf b/internal/api/ui/login/static/resources/fonts/Raleway/Raleway-Regular.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Raleway/Raleway-Regular.ttf rename to internal/api/ui/login/static/resources/fonts/Raleway/Raleway-Regular.ttf diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-SemiBold.ttf b/internal/api/ui/login/static/resources/fonts/Raleway/Raleway-SemiBold.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Raleway/Raleway-SemiBold.ttf rename to internal/api/ui/login/static/resources/fonts/Raleway/Raleway-SemiBold.ttf diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-SemiBoldItalic.ttf b/internal/api/ui/login/static/resources/fonts/Raleway/Raleway-SemiBoldItalic.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Raleway/Raleway-SemiBoldItalic.ttf rename to internal/api/ui/login/static/resources/fonts/Raleway/Raleway-SemiBoldItalic.ttf diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-Thin.ttf b/internal/api/ui/login/static/resources/fonts/Raleway/Raleway-Thin.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Raleway/Raleway-Thin.ttf rename to internal/api/ui/login/static/resources/fonts/Raleway/Raleway-Thin.ttf diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-ThinItalic.ttf b/internal/api/ui/login/static/resources/fonts/Raleway/Raleway-ThinItalic.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Raleway/Raleway-ThinItalic.ttf rename to internal/api/ui/login/static/resources/fonts/Raleway/Raleway-ThinItalic.ttf diff --git a/internal/ui/login/static/resources/fonts/Roboto/Roboto-Black.ttf b/internal/api/ui/login/static/resources/fonts/Roboto/Roboto-Black.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Roboto/Roboto-Black.ttf rename to internal/api/ui/login/static/resources/fonts/Roboto/Roboto-Black.ttf diff --git a/internal/ui/login/static/resources/fonts/Roboto/Roboto-BlackItalic.ttf b/internal/api/ui/login/static/resources/fonts/Roboto/Roboto-BlackItalic.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Roboto/Roboto-BlackItalic.ttf rename to internal/api/ui/login/static/resources/fonts/Roboto/Roboto-BlackItalic.ttf diff --git a/internal/ui/login/static/resources/fonts/Roboto/Roboto-Bold.ttf b/internal/api/ui/login/static/resources/fonts/Roboto/Roboto-Bold.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Roboto/Roboto-Bold.ttf rename to internal/api/ui/login/static/resources/fonts/Roboto/Roboto-Bold.ttf diff --git a/internal/ui/login/static/resources/fonts/Roboto/Roboto-BoldItalic.ttf b/internal/api/ui/login/static/resources/fonts/Roboto/Roboto-BoldItalic.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Roboto/Roboto-BoldItalic.ttf rename to internal/api/ui/login/static/resources/fonts/Roboto/Roboto-BoldItalic.ttf diff --git a/internal/ui/login/static/resources/fonts/Roboto/Roboto-Italic.ttf b/internal/api/ui/login/static/resources/fonts/Roboto/Roboto-Italic.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Roboto/Roboto-Italic.ttf rename to internal/api/ui/login/static/resources/fonts/Roboto/Roboto-Italic.ttf diff --git a/internal/ui/login/static/resources/fonts/Roboto/Roboto-Light.ttf b/internal/api/ui/login/static/resources/fonts/Roboto/Roboto-Light.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Roboto/Roboto-Light.ttf rename to internal/api/ui/login/static/resources/fonts/Roboto/Roboto-Light.ttf diff --git a/internal/ui/login/static/resources/fonts/Roboto/Roboto-LightItalic.ttf b/internal/api/ui/login/static/resources/fonts/Roboto/Roboto-LightItalic.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Roboto/Roboto-LightItalic.ttf rename to internal/api/ui/login/static/resources/fonts/Roboto/Roboto-LightItalic.ttf diff --git a/internal/ui/login/static/resources/fonts/Roboto/Roboto-Medium.ttf b/internal/api/ui/login/static/resources/fonts/Roboto/Roboto-Medium.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Roboto/Roboto-Medium.ttf rename to internal/api/ui/login/static/resources/fonts/Roboto/Roboto-Medium.ttf diff --git a/internal/ui/login/static/resources/fonts/Roboto/Roboto-MediumItalic.ttf b/internal/api/ui/login/static/resources/fonts/Roboto/Roboto-MediumItalic.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Roboto/Roboto-MediumItalic.ttf rename to internal/api/ui/login/static/resources/fonts/Roboto/Roboto-MediumItalic.ttf diff --git a/internal/ui/login/static/resources/fonts/Roboto/Roboto-Regular.ttf b/internal/api/ui/login/static/resources/fonts/Roboto/Roboto-Regular.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Roboto/Roboto-Regular.ttf rename to internal/api/ui/login/static/resources/fonts/Roboto/Roboto-Regular.ttf diff --git a/internal/ui/login/static/resources/fonts/Roboto/Roboto-Thin.ttf b/internal/api/ui/login/static/resources/fonts/Roboto/Roboto-Thin.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Roboto/Roboto-Thin.ttf rename to internal/api/ui/login/static/resources/fonts/Roboto/Roboto-Thin.ttf diff --git a/internal/ui/login/static/resources/fonts/Roboto/Roboto-ThinItalic.ttf b/internal/api/ui/login/static/resources/fonts/Roboto/Roboto-ThinItalic.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/Roboto/Roboto-ThinItalic.ttf rename to internal/api/ui/login/static/resources/fonts/Roboto/Roboto-ThinItalic.ttf diff --git a/internal/ui/login/static/resources/fonts/ailerons/ailerons.otf b/internal/api/ui/login/static/resources/fonts/ailerons/ailerons.otf similarity index 100% rename from internal/ui/login/static/resources/fonts/ailerons/ailerons.otf rename to internal/api/ui/login/static/resources/fonts/ailerons/ailerons.otf diff --git a/internal/ui/login/static/resources/fonts/lato/Lato-Black.ttf b/internal/api/ui/login/static/resources/fonts/lato/Lato-Black.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/lato/Lato-Black.ttf rename to internal/api/ui/login/static/resources/fonts/lato/Lato-Black.ttf diff --git a/internal/ui/login/static/resources/fonts/lato/Lato-BlackItalic.ttf b/internal/api/ui/login/static/resources/fonts/lato/Lato-BlackItalic.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/lato/Lato-BlackItalic.ttf rename to internal/api/ui/login/static/resources/fonts/lato/Lato-BlackItalic.ttf diff --git a/internal/ui/login/static/resources/fonts/lato/Lato-Bold.ttf b/internal/api/ui/login/static/resources/fonts/lato/Lato-Bold.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/lato/Lato-Bold.ttf rename to internal/api/ui/login/static/resources/fonts/lato/Lato-Bold.ttf diff --git a/internal/ui/login/static/resources/fonts/lato/Lato-BoldItalic.ttf b/internal/api/ui/login/static/resources/fonts/lato/Lato-BoldItalic.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/lato/Lato-BoldItalic.ttf rename to internal/api/ui/login/static/resources/fonts/lato/Lato-BoldItalic.ttf diff --git a/internal/ui/login/static/resources/fonts/lato/Lato-Italic.ttf b/internal/api/ui/login/static/resources/fonts/lato/Lato-Italic.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/lato/Lato-Italic.ttf rename to internal/api/ui/login/static/resources/fonts/lato/Lato-Italic.ttf diff --git a/internal/ui/login/static/resources/fonts/lato/Lato-Light.ttf b/internal/api/ui/login/static/resources/fonts/lato/Lato-Light.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/lato/Lato-Light.ttf rename to internal/api/ui/login/static/resources/fonts/lato/Lato-Light.ttf diff --git a/internal/ui/login/static/resources/fonts/lato/Lato-LightItalic.ttf b/internal/api/ui/login/static/resources/fonts/lato/Lato-LightItalic.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/lato/Lato-LightItalic.ttf rename to internal/api/ui/login/static/resources/fonts/lato/Lato-LightItalic.ttf diff --git a/internal/ui/login/static/resources/fonts/lato/Lato-Regular.ttf b/internal/api/ui/login/static/resources/fonts/lato/Lato-Regular.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/lato/Lato-Regular.ttf rename to internal/api/ui/login/static/resources/fonts/lato/Lato-Regular.ttf diff --git a/internal/ui/login/static/resources/fonts/lato/Lato-Thin.ttf b/internal/api/ui/login/static/resources/fonts/lato/Lato-Thin.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/lato/Lato-Thin.ttf rename to internal/api/ui/login/static/resources/fonts/lato/Lato-Thin.ttf diff --git a/internal/ui/login/static/resources/fonts/lato/Lato-ThinItalic.ttf b/internal/api/ui/login/static/resources/fonts/lato/Lato-ThinItalic.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/lato/Lato-ThinItalic.ttf rename to internal/api/ui/login/static/resources/fonts/lato/Lato-ThinItalic.ttf diff --git a/internal/ui/login/static/resources/fonts/lato/OFL.txt b/internal/api/ui/login/static/resources/fonts/lato/OFL.txt similarity index 100% rename from internal/ui/login/static/resources/fonts/lato/OFL.txt rename to internal/api/ui/login/static/resources/fonts/lato/OFL.txt diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/css/lgn-icon-font.css b/internal/api/ui/login/static/resources/fonts/lgn-icons/css/lgn-icon-font.css similarity index 100% rename from internal/ui/login/static/resources/fonts/lgn-icons/css/lgn-icon-font.css rename to internal/api/ui/login/static/resources/fonts/lgn-icons/css/lgn-icon-font.css diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.eot b/internal/api/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.eot similarity index 100% rename from internal/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.eot rename to internal/api/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.eot diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.svg b/internal/api/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.svg similarity index 100% rename from internal/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.svg rename to internal/api/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.svg diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.ttf b/internal/api/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.ttf similarity index 100% rename from internal/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.ttf rename to internal/api/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.ttf diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.woff b/internal/api/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.woff similarity index 100% rename from internal/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.woff rename to internal/api/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.woff diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/svg/angle-left-solid.svg b/internal/api/ui/login/static/resources/fonts/lgn-icons/svg/angle-left-solid.svg similarity index 100% rename from internal/ui/login/static/resources/fonts/lgn-icons/svg/angle-left-solid.svg rename to internal/api/ui/login/static/resources/fonts/lgn-icons/svg/angle-left-solid.svg diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/svg/angle-right-solid.svg b/internal/api/ui/login/static/resources/fonts/lgn-icons/svg/angle-right-solid.svg similarity index 100% rename from internal/ui/login/static/resources/fonts/lgn-icons/svg/angle-right-solid.svg rename to internal/api/ui/login/static/resources/fonts/lgn-icons/svg/angle-right-solid.svg diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/svg/arrow-left-solid.svg b/internal/api/ui/login/static/resources/fonts/lgn-icons/svg/arrow-left-solid.svg similarity index 100% rename from internal/ui/login/static/resources/fonts/lgn-icons/svg/arrow-left-solid.svg rename to internal/api/ui/login/static/resources/fonts/lgn-icons/svg/arrow-left-solid.svg diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/svg/arrow-right-solid.svg b/internal/api/ui/login/static/resources/fonts/lgn-icons/svg/arrow-right-solid.svg similarity index 100% rename from internal/ui/login/static/resources/fonts/lgn-icons/svg/arrow-right-solid.svg rename to internal/api/ui/login/static/resources/fonts/lgn-icons/svg/arrow-right-solid.svg diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/svg/check-solid.svg b/internal/api/ui/login/static/resources/fonts/lgn-icons/svg/check-solid.svg similarity index 100% rename from internal/ui/login/static/resources/fonts/lgn-icons/svg/check-solid.svg rename to internal/api/ui/login/static/resources/fonts/lgn-icons/svg/check-solid.svg diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/svg/clipboard-check-solid.svg b/internal/api/ui/login/static/resources/fonts/lgn-icons/svg/clipboard-check-solid.svg similarity index 100% rename from internal/ui/login/static/resources/fonts/lgn-icons/svg/clipboard-check-solid.svg rename to internal/api/ui/login/static/resources/fonts/lgn-icons/svg/clipboard-check-solid.svg diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/svg/clipboard-solid.svg b/internal/api/ui/login/static/resources/fonts/lgn-icons/svg/clipboard-solid.svg similarity index 100% rename from internal/ui/login/static/resources/fonts/lgn-icons/svg/clipboard-solid.svg rename to internal/api/ui/login/static/resources/fonts/lgn-icons/svg/clipboard-solid.svg diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/svg/exclamation-circle-solid.svg b/internal/api/ui/login/static/resources/fonts/lgn-icons/svg/exclamation-circle-solid.svg similarity index 100% rename from internal/ui/login/static/resources/fonts/lgn-icons/svg/exclamation-circle-solid.svg rename to internal/api/ui/login/static/resources/fonts/lgn-icons/svg/exclamation-circle-solid.svg diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/svg/times-solid.svg b/internal/api/ui/login/static/resources/fonts/lgn-icons/svg/times-solid.svg similarity index 100% rename from internal/ui/login/static/resources/fonts/lgn-icons/svg/times-solid.svg rename to internal/api/ui/login/static/resources/fonts/lgn-icons/svg/times-solid.svg diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/svg/user-plus-solid.svg b/internal/api/ui/login/static/resources/fonts/lgn-icons/svg/user-plus-solid.svg similarity index 100% rename from internal/ui/login/static/resources/fonts/lgn-icons/svg/user-plus-solid.svg rename to internal/api/ui/login/static/resources/fonts/lgn-icons/svg/user-plus-solid.svg diff --git a/internal/ui/login/static/resources/generate.go b/internal/api/ui/login/static/resources/generate.go similarity index 100% rename from internal/ui/login/static/resources/generate.go rename to internal/api/ui/login/static/resources/generate.go diff --git a/internal/ui/login/static/resources/images/idp/google.png b/internal/api/ui/login/static/resources/images/idp/google.png similarity index 100% rename from internal/ui/login/static/resources/images/idp/google.png rename to internal/api/ui/login/static/resources/images/idp/google.png diff --git a/internal/ui/login/static/resources/scripts/avatar.js b/internal/api/ui/login/static/resources/scripts/avatar.js similarity index 100% rename from internal/ui/login/static/resources/scripts/avatar.js rename to internal/api/ui/login/static/resources/scripts/avatar.js diff --git a/internal/ui/login/static/resources/scripts/base64.js b/internal/api/ui/login/static/resources/scripts/base64.js similarity index 100% rename from internal/ui/login/static/resources/scripts/base64.js rename to internal/api/ui/login/static/resources/scripts/base64.js diff --git a/internal/ui/login/static/resources/scripts/change_password_check.js b/internal/api/ui/login/static/resources/scripts/change_password_check.js similarity index 100% rename from internal/ui/login/static/resources/scripts/change_password_check.js rename to internal/api/ui/login/static/resources/scripts/change_password_check.js diff --git a/internal/ui/login/static/resources/scripts/copy_to_clipboard.js b/internal/api/ui/login/static/resources/scripts/copy_to_clipboard.js similarity index 100% rename from internal/ui/login/static/resources/scripts/copy_to_clipboard.js rename to internal/api/ui/login/static/resources/scripts/copy_to_clipboard.js diff --git a/internal/ui/login/static/resources/scripts/default_form_validation.js b/internal/api/ui/login/static/resources/scripts/default_form_validation.js similarity index 100% rename from internal/ui/login/static/resources/scripts/default_form_validation.js rename to internal/api/ui/login/static/resources/scripts/default_form_validation.js diff --git a/internal/ui/login/static/resources/scripts/external_not_found_check.js b/internal/api/ui/login/static/resources/scripts/external_not_found_check.js similarity index 100% rename from internal/ui/login/static/resources/scripts/external_not_found_check.js rename to internal/api/ui/login/static/resources/scripts/external_not_found_check.js diff --git a/internal/ui/login/static/resources/scripts/form_submit.js b/internal/api/ui/login/static/resources/scripts/form_submit.js similarity index 100% rename from internal/ui/login/static/resources/scripts/form_submit.js rename to internal/api/ui/login/static/resources/scripts/form_submit.js diff --git a/internal/ui/login/static/resources/scripts/init_password_check.js b/internal/api/ui/login/static/resources/scripts/init_password_check.js similarity index 100% rename from internal/ui/login/static/resources/scripts/init_password_check.js rename to internal/api/ui/login/static/resources/scripts/init_password_check.js diff --git a/internal/ui/login/static/resources/scripts/input_suffix_offset.js b/internal/api/ui/login/static/resources/scripts/input_suffix_offset.js similarity index 100% rename from internal/ui/login/static/resources/scripts/input_suffix_offset.js rename to internal/api/ui/login/static/resources/scripts/input_suffix_offset.js diff --git a/internal/ui/login/static/resources/scripts/login_success.js b/internal/api/ui/login/static/resources/scripts/login_success.js similarity index 100% rename from internal/ui/login/static/resources/scripts/login_success.js rename to internal/api/ui/login/static/resources/scripts/login_success.js diff --git a/internal/ui/login/static/resources/scripts/loginname_suffix.js b/internal/api/ui/login/static/resources/scripts/loginname_suffix.js similarity index 100% rename from internal/ui/login/static/resources/scripts/loginname_suffix.js rename to internal/api/ui/login/static/resources/scripts/loginname_suffix.js diff --git a/internal/ui/login/static/resources/scripts/password_policy_check.js b/internal/api/ui/login/static/resources/scripts/password_policy_check.js similarity index 100% rename from internal/ui/login/static/resources/scripts/password_policy_check.js rename to internal/api/ui/login/static/resources/scripts/password_policy_check.js diff --git a/internal/ui/login/static/resources/scripts/register_check.js b/internal/api/ui/login/static/resources/scripts/register_check.js similarity index 100% rename from internal/ui/login/static/resources/scripts/register_check.js rename to internal/api/ui/login/static/resources/scripts/register_check.js diff --git a/internal/ui/login/static/resources/scripts/theme.js b/internal/api/ui/login/static/resources/scripts/theme.js similarity index 100% rename from internal/ui/login/static/resources/scripts/theme.js rename to internal/api/ui/login/static/resources/scripts/theme.js diff --git a/internal/ui/login/static/resources/scripts/webauthn.js b/internal/api/ui/login/static/resources/scripts/webauthn.js similarity index 100% rename from internal/ui/login/static/resources/scripts/webauthn.js rename to internal/api/ui/login/static/resources/scripts/webauthn.js diff --git a/internal/ui/login/static/resources/scripts/webauthn_login.js b/internal/api/ui/login/static/resources/scripts/webauthn_login.js similarity index 100% rename from internal/ui/login/static/resources/scripts/webauthn_login.js rename to internal/api/ui/login/static/resources/scripts/webauthn_login.js diff --git a/internal/ui/login/static/resources/scripts/webauthn_register.js b/internal/api/ui/login/static/resources/scripts/webauthn_register.js similarity index 100% rename from internal/ui/login/static/resources/scripts/webauthn_register.js rename to internal/api/ui/login/static/resources/scripts/webauthn_register.js diff --git a/internal/api/ui/login/static/resources/themes/scss/bundle.scss b/internal/api/ui/login/static/resources/themes/scss/bundle.scss new file mode 100644 index 0000000000..b010cc520f --- /dev/null +++ b/internal/api/ui/login/static/resources/themes/scss/bundle.scss @@ -0,0 +1,12 @@ +// themes and colors +@import 'styles/theming/all'; +@import 'styles/color/all_color'; +@import 'styles/typography/typography'; + +// layouts +@import 'styles/container/container'; +@import 'styles/register/register'; +@import 'styles/header/header'; + +// animations +@import 'styles/animations'; diff --git a/internal/ui/login/static/resources/themes/scss/main.scss b/internal/api/ui/login/static/resources/themes/scss/main.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/main.scss rename to internal/api/ui/login/static/resources/themes/scss/main.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/a/a.scss b/internal/api/ui/login/static/resources/themes/scss/styles/a/a.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/a/a.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/a/a.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/a/a_theme.scss b/internal/api/ui/login/static/resources/themes/scss/styles/a/a_theme.scss similarity index 91% rename from internal/ui/login/static/resources/themes/scss/styles/a/a_theme.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/a/a_theme.scss index db3d40ea03..bf65343731 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/a/a_theme.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/a/a_theme.scss @@ -1,4 +1,4 @@ -@import './a.scss'; +@import 'a'; @mixin lgn-a-theme() { @@ -15,4 +15,4 @@ color: var(--zitadel-color-primary-400); } } -} \ No newline at end of file +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/account_selection/account_selection.scss b/internal/api/ui/login/static/resources/themes/scss/styles/account_selection/account_selection.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/account_selection/account_selection.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/account_selection/account_selection.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/account_selection/account_selection_theme.scss b/internal/api/ui/login/static/resources/themes/scss/styles/account_selection/account_selection_theme.scss similarity index 96% rename from internal/ui/login/static/resources/themes/scss/styles/account_selection/account_selection_theme.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/account_selection/account_selection_theme.scss index 778ce883a5..9e88d6444e 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/account_selection/account_selection_theme.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/account_selection/account_selection_theme.scss @@ -1,4 +1,4 @@ -@import './account_selection.scss'; +@import 'account_selection'; @mixin lgn-account-selection-theme() { @@ -48,4 +48,4 @@ } } } -} \ No newline at end of file +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/animations.scss b/internal/api/ui/login/static/resources/themes/scss/styles/animations.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/animations.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/animations.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/avatar/avatar.scss b/internal/api/ui/login/static/resources/themes/scss/styles/avatar/avatar.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/avatar/avatar.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/avatar/avatar.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/avatar/avatar_theme.scss b/internal/api/ui/login/static/resources/themes/scss/styles/avatar/avatar_theme.scss similarity index 94% rename from internal/ui/login/static/resources/themes/scss/styles/avatar/avatar_theme.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/avatar/avatar_theme.scss index f837199f97..d2a78cfdd3 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/avatar/avatar_theme.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/avatar/avatar_theme.scss @@ -1,5 +1,5 @@ -@import './avatar.scss'; -@import "../elevation/elevation.scss"; +@import 'avatar'; +@import "../elevation/elevation"; @mixin lgn-avatar-theme() { @include lgn-avatar-color(); @@ -42,4 +42,4 @@ @mixin lgn-avatar-elevation($zValue, $opacity: $lgn-elevation-opacity) { @include lgn-elevation($zValue, rgb(0, 0, 0), $opacity); - } \ No newline at end of file + } diff --git a/internal/ui/login/static/resources/themes/scss/styles/button/button.scss b/internal/api/ui/login/static/resources/themes/scss/styles/button/button.scss similarity index 96% rename from internal/ui/login/static/resources/themes/scss/styles/button/button.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/button/button.scss index c3659aeaac..035f551506 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/button/button.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/button/button.scss @@ -1,4 +1,4 @@ -@import './button_base.scss'; +@import 'button_base'; .lgn-button, .lgn-stroked-button, .lgn-icon-button { @include lgn-button-base; diff --git a/internal/ui/login/static/resources/themes/scss/styles/button/button_base.scss b/internal/api/ui/login/static/resources/themes/scss/styles/button/button_base.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/button/button_base.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/button/button_base.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/button/button_theme.scss b/internal/api/ui/login/static/resources/themes/scss/styles/button/button_theme.scss similarity index 97% rename from internal/ui/login/static/resources/themes/scss/styles/button/button_theme.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/button/button_theme.scss index 19616745a9..60912089a7 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/button/button_theme.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/button/button_theme.scss @@ -1,6 +1,6 @@ -@import "../theming/theming.scss"; -@import "./button.scss"; -@import "../elevation/elevation.scss"; +@import "../theming/theming"; +@import "button"; +@import "../elevation/elevation"; @mixin lgn-button-theme() { @include lgn-button-color(); diff --git a/internal/ui/login/static/resources/themes/scss/styles/checkbox/checkbox.scss b/internal/api/ui/login/static/resources/themes/scss/styles/checkbox/checkbox.scss similarity index 60% rename from internal/ui/login/static/resources/themes/scss/styles/checkbox/checkbox.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/checkbox/checkbox.scss index 6be01feef1..6eea84a8bf 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/checkbox/checkbox.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/checkbox/checkbox.scss @@ -1,4 +1,4 @@ -@import './checkbox_base.scss'; +@import 'checkbox_base'; .lgn-checkbox { @include lgn-checkbox-base; diff --git a/internal/ui/login/static/resources/themes/scss/styles/checkbox/checkbox_base.scss b/internal/api/ui/login/static/resources/themes/scss/styles/checkbox/checkbox_base.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/checkbox/checkbox_base.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/checkbox/checkbox_base.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/checkbox/checkbox_theme.scss b/internal/api/ui/login/static/resources/themes/scss/styles/checkbox/checkbox_theme.scss similarity index 93% rename from internal/ui/login/static/resources/themes/scss/styles/checkbox/checkbox_theme.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/checkbox/checkbox_theme.scss index 09337ef371..7079cbe64a 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/checkbox/checkbox_theme.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/checkbox/checkbox_theme.scss @@ -1,5 +1,5 @@ -@import '../theming/theming.scss'; -@import './checkbox.scss'; +@import '../theming/theming'; +@import 'checkbox'; @mixin lgn-checkbox-theme() { @include lgn-checkbox-color(); @@ -42,4 +42,4 @@ border-color: #fff; } } -} \ No newline at end of file +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/color/all_color.scss b/internal/api/ui/login/static/resources/themes/scss/styles/color/all_color.scss similarity index 89% rename from internal/ui/login/static/resources/themes/scss/styles/color/all_color.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/color/all_color.scss index eb5ef8a3c5..55298d3f42 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/color/all_color.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/color/all_color.scss @@ -1,5 +1,5 @@ -@import '../theming/all.scss'; -@import '../theming/theming.scss'; +@import '../theming/all'; +@import '../theming/theming'; // Includes all of the color styles. @mixin zitadel-lgn-color($config-or-theme) { @@ -16,4 +16,4 @@ @include zitadel-lgn-theme(( color: $config, )); -} \ No newline at end of file +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/container/container.scss b/internal/api/ui/login/static/resources/themes/scss/styles/container/container.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/container/container.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/container/container.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/container/container_theme.scss b/internal/api/ui/login/static/resources/themes/scss/styles/container/container_theme.scss similarity index 91% rename from internal/ui/login/static/resources/themes/scss/styles/container/container_theme.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/container/container_theme.scss index d84ebefa0e..c11fc4201b 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/container/container_theme.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/container/container_theme.scss @@ -1,4 +1,4 @@ -@import './container.scss'; +@import 'container'; @mixin lgn-container-theme() { @include lgn-container-color(); @@ -17,4 +17,4 @@ border-color: var(--zitadel-color-divider); } } -} \ No newline at end of file +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/core/core.scss b/internal/api/ui/login/static/resources/themes/scss/styles/core/core.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/core/core.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/core/core.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/elevation/elevation.scss b/internal/api/ui/login/static/resources/themes/scss/styles/elevation/elevation.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/elevation/elevation.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/elevation/elevation.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/error/error.scss b/internal/api/ui/login/static/resources/themes/scss/styles/error/error.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/error/error.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/error/error.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/error/error_theme.scss b/internal/api/ui/login/static/resources/themes/scss/styles/error/error_theme.scss similarity index 86% rename from internal/ui/login/static/resources/themes/scss/styles/error/error_theme.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/error/error_theme.scss index 9f3ed11879..a9e8a1c739 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/error/error_theme.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/error/error_theme.scss @@ -1,4 +1,4 @@ -@import './error.scss'; +@import 'error'; @mixin lgn-error-theme() { @include lgn-error-color(); @@ -9,4 +9,4 @@ .lgn-error { color: var(--zitadel-color-warn); } -} \ No newline at end of file +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/footer/footer.scss b/internal/api/ui/login/static/resources/themes/scss/styles/footer/footer.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/footer/footer.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/footer/footer.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/footer/footer_theme.scss b/internal/api/ui/login/static/resources/themes/scss/styles/footer/footer_theme.scss similarity index 95% rename from internal/ui/login/static/resources/themes/scss/styles/footer/footer_theme.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/footer/footer_theme.scss index 52738789b0..de240f8922 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/footer/footer_theme.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/footer/footer_theme.scss @@ -1,4 +1,4 @@ -@import './footer.scss'; +@import 'footer'; @mixin lgn-footer-theme() { // @include lgn-private-check-duplicate-theme-styles($theme, 'mat-button') { @@ -23,4 +23,4 @@ background-size: contain; } } -} \ No newline at end of file +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/header/header.scss b/internal/api/ui/login/static/resources/themes/scss/styles/header/header.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/header/header.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/header/header.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/header/header_theme.scss b/internal/api/ui/login/static/resources/themes/scss/styles/header/header_theme.scss similarity index 88% rename from internal/ui/login/static/resources/themes/scss/styles/header/header_theme.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/header/header_theme.scss index 61906d2bb8..b8900ac789 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/header/header_theme.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/header/header_theme.scss @@ -1,4 +1,4 @@ -@import './header.scss'; +@import 'header'; @mixin lgn-header-theme() { @include lgn-header-color(); diff --git a/internal/api/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider.scss b/internal/api/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider.scss new file mode 100644 index 0000000000..9f005da08b --- /dev/null +++ b/internal/api/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider.scss @@ -0,0 +1,5 @@ +@import 'identity_provider_base'; + +.lgn-idp { + @include lgn-idp-base; +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider_base.scss b/internal/api/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider_base.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider_base.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider_base.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider_theme.scss b/internal/api/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider_theme.scss similarity index 93% rename from internal/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider_theme.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider_theme.scss index 11fe742690..7cf8e36c4d 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider_theme.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider_theme.scss @@ -1,4 +1,4 @@ -@import './identity_provider.scss'; +@import 'identity_provider'; @mixin lgn-idp-theme() { @include lgn-idp-color(); @@ -24,4 +24,4 @@ @mixin lgn-idp-elevation($zValue, $opacity: $lgn-elevation-opacity) { @include lgn-elevation($zValue, rgb(0, 0, 0), $opacity); -} \ No newline at end of file +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/input/input.scss b/internal/api/ui/login/static/resources/themes/scss/styles/input/input.scss similarity index 92% rename from internal/ui/login/static/resources/themes/scss/styles/input/input.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/input/input.scss index dcdd6ba741..0ab443ea79 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/input/input.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/input/input.scss @@ -1,4 +1,4 @@ -@import './input_base.scss'; +@import 'input_base'; input:not([type=radio]):not([type=checkbox]), .lgn-input { @@ -20,4 +20,4 @@ select, .lgn-select { height: inherit; vertical-align: middle; } -} \ No newline at end of file +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/input/input_base.scss b/internal/api/ui/login/static/resources/themes/scss/styles/input/input_base.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/input/input_base.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/input/input_base.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/input/input_theme.scss b/internal/api/ui/login/static/resources/themes/scss/styles/input/input_theme.scss similarity index 93% rename from internal/ui/login/static/resources/themes/scss/styles/input/input_theme.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/input/input_theme.scss index 76631b8bd8..6f2df88c96 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/input/input_theme.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/input/input_theme.scss @@ -1,5 +1,5 @@ -@import '../theming/theming.scss'; -@import './input.scss'; +@import '../theming/theming'; +@import 'input'; @mixin lgn-input-theme() { @include lgn-input-color(); diff --git a/internal/ui/login/static/resources/themes/scss/styles/label/label.scss b/internal/api/ui/login/static/resources/themes/scss/styles/label/label.scss similarity index 59% rename from internal/ui/login/static/resources/themes/scss/styles/label/label.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/label/label.scss index 84fea51e03..2c533dff6b 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/label/label.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/label/label.scss @@ -1,4 +1,4 @@ -@import './label_base.scss'; +@import 'label_base'; .lgn-label { @include lgn-label-base; diff --git a/internal/ui/login/static/resources/themes/scss/styles/label/label_base.scss b/internal/api/ui/login/static/resources/themes/scss/styles/label/label_base.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/label/label_base.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/label/label_base.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/label/label_theme.scss b/internal/api/ui/login/static/resources/themes/scss/styles/label/label_theme.scss similarity index 80% rename from internal/ui/login/static/resources/themes/scss/styles/label/label_theme.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/label/label_theme.scss index 153c085735..cbb3f0641d 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/label/label_theme.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/label/label_theme.scss @@ -1,5 +1,5 @@ -@import '../theming/theming.scss'; -@import './label.scss'; +@import '../theming/theming'; +@import 'label'; @mixin lgn-label-theme() { // @include lgn-private-check-duplicate-theme-styles($theme, 'lgn-label') { @@ -12,4 +12,4 @@ .lgn-label { color: var(--zitadel-color-label); } -} \ No newline at end of file +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/list/list.scss b/internal/api/ui/login/static/resources/themes/scss/styles/list/list.scss similarity index 61% rename from internal/ui/login/static/resources/themes/scss/styles/list/list.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/list/list.scss index b1c82737df..7680755104 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/list/list.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/list/list.scss @@ -1,4 +1,4 @@ -@import './list_base.scss'; +@import 'list_base'; .lgn-list, ul { @include lgn-list-base; diff --git a/internal/ui/login/static/resources/themes/scss/styles/list/list_base.scss b/internal/api/ui/login/static/resources/themes/scss/styles/list/list_base.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/list/list_base.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/list/list_base.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/list/list_theme.scss b/internal/api/ui/login/static/resources/themes/scss/styles/list/list_theme.scss similarity index 86% rename from internal/ui/login/static/resources/themes/scss/styles/list/list_theme.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/list/list_theme.scss index 699902bf3f..07062cdd6e 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/list/list_theme.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/list/list_theme.scss @@ -1,5 +1,5 @@ -@import '../theming/theming.scss'; -@import './list.scss'; +@import '../theming/theming'; +@import 'list'; @mixin lgn-list-theme() { @include lgn-list-color(); @@ -21,4 +21,4 @@ } } } -} \ No newline at end of file +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar.scss b/internal/api/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar.scss similarity index 60% rename from internal/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar.scss index 20f32bc962..f0c3edfd9e 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar.scss @@ -1,6 +1,5 @@ -@import './progress_bar_base.scss'; +@import 'progress_bar_base'; .lgn-progress-bar { @include lgn-progress-bar-base; } - \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar_base.scss b/internal/api/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar_base.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar_base.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar_base.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar_theme.scss b/internal/api/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar_theme.scss similarity index 74% rename from internal/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar_theme.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar_theme.scss index 3ce5dcb5e3..df0580004d 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar_theme.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar_theme.scss @@ -1,5 +1,5 @@ -@import '../theming/theming.scss'; -@import './progress_bar.scss'; +@import '../theming/theming'; +@import 'progress_bar'; @mixin lgn-progress-bar-theme() { @include lgn-progress-bar-color(); @@ -9,4 +9,4 @@ .lgn-progress-bar { border-color: var(--zitadel-color-input-border); } -} \ No newline at end of file +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/qrcode/qrcode.scss b/internal/api/ui/login/static/resources/themes/scss/styles/qrcode/qrcode.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/qrcode/qrcode.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/qrcode/qrcode.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/qrcode/qrcode_theme.scss b/internal/api/ui/login/static/resources/themes/scss/styles/qrcode/qrcode_theme.scss similarity index 93% rename from internal/ui/login/static/resources/themes/scss/styles/qrcode/qrcode_theme.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/qrcode/qrcode_theme.scss index 742a69fd9d..365bcb7e6a 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/qrcode/qrcode_theme.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/qrcode/qrcode_theme.scss @@ -1,4 +1,4 @@ -@import './qrcode.scss'; +@import 'qrcode'; @mixin lgn-qrcode-theme() { @include lgn-qrcode-color(); @@ -19,4 +19,4 @@ fill: var(--zitadel-color-qr-background); } } -} \ No newline at end of file +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/radio/radio.scss b/internal/api/ui/login/static/resources/themes/scss/styles/radio/radio.scss similarity index 59% rename from internal/ui/login/static/resources/themes/scss/styles/radio/radio.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/radio/radio.scss index 13ad2452e6..1445694e07 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/radio/radio.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/radio/radio.scss @@ -1,4 +1,4 @@ -@import './radio_base.scss'; +@import 'radio_base'; .lgn-radio { @include lgn-radio-base; diff --git a/internal/ui/login/static/resources/themes/scss/styles/radio/radio_base.scss b/internal/api/ui/login/static/resources/themes/scss/styles/radio/radio_base.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/radio/radio_base.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/radio/radio_base.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/radio/radio_theme.scss b/internal/api/ui/login/static/resources/themes/scss/styles/radio/radio_theme.scss similarity index 94% rename from internal/ui/login/static/resources/themes/scss/styles/radio/radio_theme.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/radio/radio_theme.scss index 3f1da3f759..8cbf32a477 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/radio/radio_theme.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/radio/radio_theme.scss @@ -1,5 +1,5 @@ -@import '../theming/theming.scss'; -@import './radio.scss'; +@import '../theming/theming'; +@import 'radio'; @mixin lgn-radio-theme() { @include lgn-radio-color(); @@ -48,4 +48,4 @@ } } } -} \ No newline at end of file +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/register/register.scss b/internal/api/ui/login/static/resources/themes/scss/styles/register/register.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/register/register.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/register/register.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/select/select.scss b/internal/api/ui/login/static/resources/themes/scss/styles/select/select.scss similarity index 63% rename from internal/ui/login/static/resources/themes/scss/styles/select/select.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/select/select.scss index d187c3ce8b..70c9cbd995 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/select/select.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/select/select.scss @@ -1,4 +1,4 @@ -@import './select_base.scss'; +@import 'select_base'; .lgn-select, select { @include lgn-select-base; diff --git a/internal/ui/login/static/resources/themes/scss/styles/select/select_base.scss b/internal/api/ui/login/static/resources/themes/scss/styles/select/select_base.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/select/select_base.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/select/select_base.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/select/select_theme.scss b/internal/api/ui/login/static/resources/themes/scss/styles/select/select_theme.scss similarity index 74% rename from internal/ui/login/static/resources/themes/scss/styles/select/select_theme.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/select/select_theme.scss index 4f659f993f..abeac509af 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/select/select_theme.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/select/select_theme.scss @@ -1,5 +1,5 @@ -@import '../theming/theming.scss'; -@import './select.scss'; +@import '../theming/theming'; +@import 'select'; @mixin lgn-select-theme() { @include lgn-select-color(); @@ -9,4 +9,4 @@ .lgn-select, select { background-image: var(--zitadel-icon-select); } -} \ No newline at end of file +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/success_label/success_label.scss b/internal/api/ui/login/static/resources/themes/scss/styles/success_label/success_label.scss similarity index 74% rename from internal/ui/login/static/resources/themes/scss/styles/success_label/success_label.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/success_label/success_label.scss index dcd3d9f155..f437d6a135 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/success_label/success_label.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/success_label/success_label.scss @@ -1,8 +1,8 @@ -@import './success_label_base.scss'; +@import 'success_label_base'; .lgn-success-label { color: #0e6245; background: #cbf4c9; border-radius: .5rem; padding: .5rem; -} \ No newline at end of file +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/success_label/success_label_base.scss b/internal/api/ui/login/static/resources/themes/scss/styles/success_label/success_label_base.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/success_label/success_label_base.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/success_label/success_label_base.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/success_label/success_label_theme.scss b/internal/api/ui/login/static/resources/themes/scss/styles/success_label/success_label_theme.scss similarity index 79% rename from internal/ui/login/static/resources/themes/scss/styles/success_label/success_label_theme.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/success_label/success_label_theme.scss index fd17552c6b..ef43e13872 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/success_label/success_label_theme.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/success_label/success_label_theme.scss @@ -1,5 +1,5 @@ -@import '../theming/theming.scss'; -@import './success_label.scss'; +@import '../theming/theming'; +@import 'success_label'; @mixin lgn-success-label-theme() { @include lgn-success-label-color(); @@ -13,4 +13,4 @@ } -} \ No newline at end of file +} diff --git a/internal/api/ui/login/static/resources/themes/scss/styles/theming/all.scss b/internal/api/ui/login/static/resources/themes/scss/styles/theming/all.scss new file mode 100644 index 0000000000..669b1da118 --- /dev/null +++ b/internal/api/ui/login/static/resources/themes/scss/styles/theming/all.scss @@ -0,0 +1,41 @@ +@import '../core/core'; +@import '../footer/footer_theme'; +@import '../header/header_theme'; +@import '../button/button_theme'; +@import '../input/input_theme'; +@import '../label/label_theme'; +@import '../radio/radio_theme'; +@import '../a/a_theme'; +@import '../identity_provider/identity_provider_theme'; +@import '../error/error_theme'; +@import '../qrcode/qrcode_theme'; +@import '../container/container_theme'; +@import '../account_selection/account_selection_theme'; +@import '../avatar/avatar_theme'; +@import '../checkbox/checkbox_theme'; +@import '../select/select_theme'; +@import '../list/list_theme'; +@import '../typography/typography'; +@import '../success_label/success_label_theme'; +@import 'theming'; + +@mixin zitadel-lgn-theme() { + @include lgn-core-theme(); + @include lgn-header-theme(); + @include lgn-button-theme(); + @include lgn-input-theme(); + @include lgn-radio-theme(); + @include lgn-checkbox-theme(); + @include lgn-label-theme(); + @include lgn-footer-theme(); + @include lgn-a-theme(); + @include lgn-error-theme(); + @include lgn-qrcode-theme(); + @include lgn-container-theme(); + @include lgn-account-selection-theme(); + @include lgn-avatar-theme(); + @include lgn-select-theme(); + @include lgn-list-theme(); + @include lgn-idp-theme(); + @include lgn-success-label-theme(); +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/theming/palette.scss b/internal/api/ui/login/static/resources/themes/scss/styles/theming/palette.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/theming/palette.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/theming/palette.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/theming/theming.scss b/internal/api/ui/login/static/resources/themes/scss/styles/theming/theming.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/theming/theming.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/theming/theming.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/typography/faces/ailerons_font_faces.scss b/internal/api/ui/login/static/resources/themes/scss/styles/typography/faces/ailerons_font_faces.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/typography/faces/ailerons_font_faces.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/typography/faces/ailerons_font_faces.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/typography/faces/lato_font_faces.scss b/internal/api/ui/login/static/resources/themes/scss/styles/typography/faces/lato_font_faces.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/typography/faces/lato_font_faces.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/typography/faces/lato_font_faces.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/typography/faces/pt_sans_font_faces.scss b/internal/api/ui/login/static/resources/themes/scss/styles/typography/faces/pt_sans_font_faces.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/typography/faces/pt_sans_font_faces.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/typography/faces/pt_sans_font_faces.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/typography/faces/raleway_font_faces.scss b/internal/api/ui/login/static/resources/themes/scss/styles/typography/faces/raleway_font_faces.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/typography/faces/raleway_font_faces.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/typography/faces/raleway_font_faces.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/typography/faces/roboto_font_faces.scss b/internal/api/ui/login/static/resources/themes/scss/styles/typography/faces/roboto_font_faces.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/typography/faces/roboto_font_faces.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/typography/faces/roboto_font_faces.scss diff --git a/internal/ui/login/static/resources/themes/scss/styles/typography/typography.scss b/internal/api/ui/login/static/resources/themes/scss/styles/typography/typography.scss similarity index 97% rename from internal/ui/login/static/resources/themes/scss/styles/typography/typography.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/typography/typography.scss index 90a6e88478..526ea3095b 100644 --- a/internal/ui/login/static/resources/themes/scss/styles/typography/typography.scss +++ b/internal/api/ui/login/static/resources/themes/scss/styles/typography/typography.scss @@ -1,8 +1,8 @@ -@import './faces/ailerons_font_faces.scss'; -@import './faces/lato_font_faces.scss'; -@import './faces/roboto_font_faces.scss'; -@import './faces/raleway_font_faces.scss'; -@import './faces/pt_sans_font_faces.scss'; +@import 'faces/ailerons_font_faces'; +@import 'faces/lato_font_faces'; +@import 'faces/roboto_font_faces'; +@import 'faces/raleway_font_faces'; +@import 'faces/pt_sans_font_faces'; @mixin zitadel-lgn-typography($config-or-theme: null) { $config: if(lgn-private-is-theme-object($config-or-theme), @@ -223,4 +223,4 @@ @include lgn-typography-level-to-styles($config, display-1); margin: 0 0 64px; } - } \ No newline at end of file + } diff --git a/internal/ui/login/static/resources/themes/scss/styles/vars.scss b/internal/api/ui/login/static/resources/themes/scss/styles/vars.scss similarity index 100% rename from internal/ui/login/static/resources/themes/scss/styles/vars.scss rename to internal/api/ui/login/static/resources/themes/scss/styles/vars.scss diff --git a/internal/ui/login/static/resources/themes/scss/zitadel-alternative.scss b/internal/api/ui/login/static/resources/themes/scss/zitadel-alternative.scss similarity index 98% rename from internal/ui/login/static/resources/themes/scss/zitadel-alternative.scss rename to internal/api/ui/login/static/resources/themes/scss/zitadel-alternative.scss index 945d940b58..71d2aed33a 100644 --- a/internal/ui/login/static/resources/themes/scss/zitadel-alternative.scss +++ b/internal/api/ui/login/static/resources/themes/scss/zitadel-alternative.scss @@ -1,5 +1,5 @@ -@import 'main.scss'; -@import 'bundle.scss'; +@import 'main'; +@import 'bundle'; // Include non-theme styles for core. -> mainly background of the login diff --git a/internal/ui/login/static/resources/themes/scss/zitadel.scss b/internal/api/ui/login/static/resources/themes/scss/zitadel.scss similarity index 94% rename from internal/ui/login/static/resources/themes/scss/zitadel.scss rename to internal/api/ui/login/static/resources/themes/scss/zitadel.scss index 66de516e15..ec4dadc47b 100644 --- a/internal/ui/login/static/resources/themes/scss/zitadel.scss +++ b/internal/api/ui/login/static/resources/themes/scss/zitadel.scss @@ -1,6 +1,6 @@ @import 'styles/vars'; -@import 'main.scss'; -@import 'bundle.scss'; +@import 'main'; +@import 'bundle'; // Include non-theme styles for core. -> mainly background of the login @include lgn-core(); @@ -25,4 +25,4 @@ $dark-theme: lgn-dark-theme($dark-primary, $dark-accent, $dark-warn); //.lgn-light-theme { // @include zitadel-lgn-theme($light-theme); -//} \ No newline at end of file +//} diff --git a/internal/ui/login/static/resources/themes/zitadel/css/variables.css b/internal/api/ui/login/static/resources/themes/zitadel/css/variables.css similarity index 100% rename from internal/ui/login/static/resources/themes/zitadel/css/variables.css rename to internal/api/ui/login/static/resources/themes/zitadel/css/variables.css diff --git a/internal/ui/login/static/resources/themes/zitadel/css/zitadel.css b/internal/api/ui/login/static/resources/themes/zitadel/css/zitadel.css similarity index 100% rename from internal/ui/login/static/resources/themes/zitadel/css/zitadel.css rename to internal/api/ui/login/static/resources/themes/zitadel/css/zitadel.css diff --git a/internal/ui/login/static/resources/themes/zitadel/css/zitadel.css.map b/internal/api/ui/login/static/resources/themes/zitadel/css/zitadel.css.map similarity index 100% rename from internal/ui/login/static/resources/themes/zitadel/css/zitadel.css.map rename to internal/api/ui/login/static/resources/themes/zitadel/css/zitadel.css.map diff --git a/internal/ui/login/static/resources/themes/zitadel/favicon.ico b/internal/api/ui/login/static/resources/themes/zitadel/favicon.ico similarity index 100% rename from internal/ui/login/static/resources/themes/zitadel/favicon.ico rename to internal/api/ui/login/static/resources/themes/zitadel/favicon.ico diff --git a/internal/ui/login/static/resources/themes/zitadel/flavor-spikes01-narrow.png b/internal/api/ui/login/static/resources/themes/zitadel/flavor-spikes01-narrow.png similarity index 100% rename from internal/ui/login/static/resources/themes/zitadel/flavor-spikes01-narrow.png rename to internal/api/ui/login/static/resources/themes/zitadel/flavor-spikes01-narrow.png diff --git a/internal/ui/login/static/resources/themes/zitadel/flavor-spikes01-wide.png b/internal/api/ui/login/static/resources/themes/zitadel/flavor-spikes01-wide.png similarity index 100% rename from internal/ui/login/static/resources/themes/zitadel/flavor-spikes01-wide.png rename to internal/api/ui/login/static/resources/themes/zitadel/flavor-spikes01-wide.png diff --git a/internal/ui/login/static/resources/themes/zitadel/gradientdeco-full.svg b/internal/api/ui/login/static/resources/themes/zitadel/gradientdeco-full.svg similarity index 100% rename from internal/ui/login/static/resources/themes/zitadel/gradientdeco-full.svg rename to internal/api/ui/login/static/resources/themes/zitadel/gradientdeco-full.svg diff --git a/internal/ui/login/static/resources/themes/zitadel/logo-dark.svg b/internal/api/ui/login/static/resources/themes/zitadel/logo-dark.svg similarity index 100% rename from internal/ui/login/static/resources/themes/zitadel/logo-dark.svg rename to internal/api/ui/login/static/resources/themes/zitadel/logo-dark.svg diff --git a/internal/ui/login/static/resources/themes/zitadel/logo-light.svg b/internal/api/ui/login/static/resources/themes/zitadel/logo-light.svg similarity index 100% rename from internal/ui/login/static/resources/themes/zitadel/logo-light.svg rename to internal/api/ui/login/static/resources/themes/zitadel/logo-light.svg diff --git a/internal/ui/login/static/resources/themes/zitadel/select_arrow_dark.svg b/internal/api/ui/login/static/resources/themes/zitadel/select_arrow_dark.svg similarity index 100% rename from internal/ui/login/static/resources/themes/zitadel/select_arrow_dark.svg rename to internal/api/ui/login/static/resources/themes/zitadel/select_arrow_dark.svg diff --git a/internal/ui/login/static/resources/themes/zitadel/select_arrow_light.svg b/internal/api/ui/login/static/resources/themes/zitadel/select_arrow_light.svg similarity index 100% rename from internal/ui/login/static/resources/themes/zitadel/select_arrow_light.svg rename to internal/api/ui/login/static/resources/themes/zitadel/select_arrow_light.svg diff --git a/internal/ui/login/static/templates/change_password.html b/internal/api/ui/login/static/templates/change_password.html similarity index 100% rename from internal/ui/login/static/templates/change_password.html rename to internal/api/ui/login/static/templates/change_password.html diff --git a/internal/ui/login/static/templates/change_password_done.html b/internal/api/ui/login/static/templates/change_password_done.html similarity index 100% rename from internal/ui/login/static/templates/change_password_done.html rename to internal/api/ui/login/static/templates/change_password_done.html diff --git a/internal/ui/login/static/templates/change_username.html b/internal/api/ui/login/static/templates/change_username.html similarity index 100% rename from internal/ui/login/static/templates/change_username.html rename to internal/api/ui/login/static/templates/change_username.html diff --git a/internal/ui/login/static/templates/change_username_done.html b/internal/api/ui/login/static/templates/change_username_done.html similarity index 100% rename from internal/ui/login/static/templates/change_username_done.html rename to internal/api/ui/login/static/templates/change_username_done.html diff --git a/internal/ui/login/static/templates/error-message.html b/internal/api/ui/login/static/templates/error-message.html similarity index 100% rename from internal/ui/login/static/templates/error-message.html rename to internal/api/ui/login/static/templates/error-message.html diff --git a/internal/ui/login/static/templates/error.html b/internal/api/ui/login/static/templates/error.html similarity index 100% rename from internal/ui/login/static/templates/error.html rename to internal/api/ui/login/static/templates/error.html diff --git a/internal/ui/login/static/templates/external_not_found_option.html b/internal/api/ui/login/static/templates/external_not_found_option.html similarity index 100% rename from internal/ui/login/static/templates/external_not_found_option.html rename to internal/api/ui/login/static/templates/external_not_found_option.html diff --git a/internal/ui/login/static/templates/external_register_overview.html b/internal/api/ui/login/static/templates/external_register_overview.html similarity index 100% rename from internal/ui/login/static/templates/external_register_overview.html rename to internal/api/ui/login/static/templates/external_register_overview.html diff --git a/internal/ui/login/static/templates/footer.html b/internal/api/ui/login/static/templates/footer.html similarity index 100% rename from internal/ui/login/static/templates/footer.html rename to internal/api/ui/login/static/templates/footer.html diff --git a/internal/ui/login/static/templates/header.html b/internal/api/ui/login/static/templates/header.html similarity index 100% rename from internal/ui/login/static/templates/header.html rename to internal/api/ui/login/static/templates/header.html diff --git a/internal/ui/login/static/templates/init_password.html b/internal/api/ui/login/static/templates/init_password.html similarity index 100% rename from internal/ui/login/static/templates/init_password.html rename to internal/api/ui/login/static/templates/init_password.html diff --git a/internal/ui/login/static/templates/init_password_done.html b/internal/api/ui/login/static/templates/init_password_done.html similarity index 100% rename from internal/ui/login/static/templates/init_password_done.html rename to internal/api/ui/login/static/templates/init_password_done.html diff --git a/internal/ui/login/static/templates/init_user.html b/internal/api/ui/login/static/templates/init_user.html similarity index 100% rename from internal/ui/login/static/templates/init_user.html rename to internal/api/ui/login/static/templates/init_user.html diff --git a/internal/ui/login/static/templates/init_user_done.html b/internal/api/ui/login/static/templates/init_user_done.html similarity index 100% rename from internal/ui/login/static/templates/init_user_done.html rename to internal/api/ui/login/static/templates/init_user_done.html diff --git a/internal/ui/login/static/templates/link_users_done.html b/internal/api/ui/login/static/templates/link_users_done.html similarity index 100% rename from internal/ui/login/static/templates/link_users_done.html rename to internal/api/ui/login/static/templates/link_users_done.html diff --git a/internal/ui/login/static/templates/login.html b/internal/api/ui/login/static/templates/login.html similarity index 100% rename from internal/ui/login/static/templates/login.html rename to internal/api/ui/login/static/templates/login.html diff --git a/internal/ui/login/static/templates/login_success.html b/internal/api/ui/login/static/templates/login_success.html similarity index 100% rename from internal/ui/login/static/templates/login_success.html rename to internal/api/ui/login/static/templates/login_success.html diff --git a/internal/ui/login/static/templates/logout_done.html b/internal/api/ui/login/static/templates/logout_done.html similarity index 100% rename from internal/ui/login/static/templates/logout_done.html rename to internal/api/ui/login/static/templates/logout_done.html diff --git a/internal/ui/login/static/templates/mail_verification.html b/internal/api/ui/login/static/templates/mail_verification.html similarity index 100% rename from internal/ui/login/static/templates/mail_verification.html rename to internal/api/ui/login/static/templates/mail_verification.html diff --git a/internal/ui/login/static/templates/mail_verified.html b/internal/api/ui/login/static/templates/mail_verified.html similarity index 100% rename from internal/ui/login/static/templates/mail_verified.html rename to internal/api/ui/login/static/templates/mail_verified.html diff --git a/internal/ui/login/static/templates/main.html b/internal/api/ui/login/static/templates/main.html similarity index 100% rename from internal/ui/login/static/templates/main.html rename to internal/api/ui/login/static/templates/main.html diff --git a/internal/ui/login/static/templates/mfa_init_done.html b/internal/api/ui/login/static/templates/mfa_init_done.html similarity index 100% rename from internal/ui/login/static/templates/mfa_init_done.html rename to internal/api/ui/login/static/templates/mfa_init_done.html diff --git a/internal/ui/login/static/templates/mfa_init_otp.html b/internal/api/ui/login/static/templates/mfa_init_otp.html similarity index 100% rename from internal/ui/login/static/templates/mfa_init_otp.html rename to internal/api/ui/login/static/templates/mfa_init_otp.html diff --git a/internal/ui/login/static/templates/mfa_init_u2f.html b/internal/api/ui/login/static/templates/mfa_init_u2f.html similarity index 100% rename from internal/ui/login/static/templates/mfa_init_u2f.html rename to internal/api/ui/login/static/templates/mfa_init_u2f.html diff --git a/internal/ui/login/static/templates/mfa_prompt.html b/internal/api/ui/login/static/templates/mfa_prompt.html similarity index 100% rename from internal/ui/login/static/templates/mfa_prompt.html rename to internal/api/ui/login/static/templates/mfa_prompt.html diff --git a/internal/ui/login/static/templates/mfa_verification_u2f.html b/internal/api/ui/login/static/templates/mfa_verification_u2f.html similarity index 100% rename from internal/ui/login/static/templates/mfa_verification_u2f.html rename to internal/api/ui/login/static/templates/mfa_verification_u2f.html diff --git a/internal/ui/login/static/templates/mfa_verify_otp.html b/internal/api/ui/login/static/templates/mfa_verify_otp.html similarity index 100% rename from internal/ui/login/static/templates/mfa_verify_otp.html rename to internal/api/ui/login/static/templates/mfa_verify_otp.html diff --git a/internal/ui/login/static/templates/password.html b/internal/api/ui/login/static/templates/password.html similarity index 100% rename from internal/ui/login/static/templates/password.html rename to internal/api/ui/login/static/templates/password.html diff --git a/internal/ui/login/static/templates/password_reset_done.html b/internal/api/ui/login/static/templates/password_reset_done.html similarity index 100% rename from internal/ui/login/static/templates/password_reset_done.html rename to internal/api/ui/login/static/templates/password_reset_done.html diff --git a/internal/ui/login/static/templates/passwordless.html b/internal/api/ui/login/static/templates/passwordless.html similarity index 100% rename from internal/ui/login/static/templates/passwordless.html rename to internal/api/ui/login/static/templates/passwordless.html diff --git a/internal/ui/login/static/templates/passwordless_prompt.html b/internal/api/ui/login/static/templates/passwordless_prompt.html similarity index 100% rename from internal/ui/login/static/templates/passwordless_prompt.html rename to internal/api/ui/login/static/templates/passwordless_prompt.html diff --git a/internal/ui/login/static/templates/passwordless_registration.html b/internal/api/ui/login/static/templates/passwordless_registration.html similarity index 100% rename from internal/ui/login/static/templates/passwordless_registration.html rename to internal/api/ui/login/static/templates/passwordless_registration.html diff --git a/internal/ui/login/static/templates/passwordless_registration_done.html b/internal/api/ui/login/static/templates/passwordless_registration_done.html similarity index 100% rename from internal/ui/login/static/templates/passwordless_registration_done.html rename to internal/api/ui/login/static/templates/passwordless_registration_done.html diff --git a/internal/ui/login/static/templates/register.html b/internal/api/ui/login/static/templates/register.html similarity index 100% rename from internal/ui/login/static/templates/register.html rename to internal/api/ui/login/static/templates/register.html diff --git a/internal/ui/login/static/templates/register_option.html b/internal/api/ui/login/static/templates/register_option.html similarity index 100% rename from internal/ui/login/static/templates/register_option.html rename to internal/api/ui/login/static/templates/register_option.html diff --git a/internal/ui/login/static/templates/register_org.html b/internal/api/ui/login/static/templates/register_org.html similarity index 100% rename from internal/ui/login/static/templates/register_org.html rename to internal/api/ui/login/static/templates/register_org.html diff --git a/internal/ui/login/static/templates/select_user.html b/internal/api/ui/login/static/templates/select_user.html similarity index 100% rename from internal/ui/login/static/templates/select_user.html rename to internal/api/ui/login/static/templates/select_user.html diff --git a/internal/ui/login/static/templates/user_profile.html b/internal/api/ui/login/static/templates/user_profile.html similarity index 100% rename from internal/ui/login/static/templates/user_profile.html rename to internal/api/ui/login/static/templates/user_profile.html diff --git a/internal/ui/login/statik/generate.go b/internal/api/ui/login/statik/generate.go similarity index 100% rename from internal/ui/login/statik/generate.go rename to internal/api/ui/login/statik/generate.go diff --git a/internal/ui/login/handler/username_change_handler.go b/internal/api/ui/login/username_change_handler.go similarity index 98% rename from internal/ui/login/handler/username_change_handler.go rename to internal/api/ui/login/username_change_handler.go index 2a63ad8599..dee6000ed5 100644 --- a/internal/ui/login/handler/username_change_handler.go +++ b/internal/api/ui/login/username_change_handler.go @@ -1,8 +1,9 @@ -package handler +package login import ( - "github.com/caos/zitadel/internal/domain" "net/http" + + "github.com/caos/zitadel/internal/domain" ) const ( diff --git a/internal/ui/login/handler/webauthn.go b/internal/api/ui/login/webauthn.go similarity index 92% rename from internal/ui/login/handler/webauthn.go rename to internal/api/ui/login/webauthn.go index fb35ba1c75..93b936bcf2 100644 --- a/internal/ui/login/handler/webauthn.go +++ b/internal/api/ui/login/webauthn.go @@ -1,4 +1,4 @@ -package handler +package login type webAuthNData struct { userData diff --git a/internal/auth/repository/eventsourcing/handler/handler.go b/internal/auth/repository/eventsourcing/handler/handler.go index 4faa8bc369..0afab0affe 100644 --- a/internal/auth/repository/eventsourcing/handler/handler.go +++ b/internal/auth/repository/eventsourcing/handler/handler.go @@ -5,7 +5,6 @@ import ( "github.com/caos/zitadel/internal/auth/repository/eventsourcing/view" sd "github.com/caos/zitadel/internal/config/systemdefaults" - "github.com/caos/zitadel/internal/config/types" v1 "github.com/caos/zitadel/internal/eventstore/v1" "github.com/caos/zitadel/internal/eventstore/v1/query" query2 "github.com/caos/zitadel/internal/query" @@ -14,7 +13,7 @@ import ( type Configs map[string]*Config type Config struct { - MinimumCycleDuration types.Duration + MinimumCycleDuration time.Duration } type handler struct { @@ -57,7 +56,7 @@ func (configs Configs) cycleDuration(viewModel string) time.Duration { if !ok { return 3 * time.Minute } - return c.MinimumCycleDuration.Duration + return c.MinimumCycleDuration } func (h *handler) MinimumCycleDuration() time.Duration { diff --git a/internal/auth/repository/eventsourcing/repository.go b/internal/auth/repository/eventsourcing/repository.go index bcccbcb2a2..003d0fca03 100644 --- a/internal/auth/repository/eventsourcing/repository.go +++ b/internal/auth/repository/eventsourcing/repository.go @@ -2,6 +2,7 @@ package eventsourcing import ( "context" + "database/sql" "github.com/caos/zitadel/internal/auth/repository/eventsourcing/eventstore" "github.com/caos/zitadel/internal/auth/repository/eventsourcing/spooler" @@ -9,7 +10,6 @@ import ( "github.com/caos/zitadel/internal/auth_request/repository/cache" "github.com/caos/zitadel/internal/command" sd "github.com/caos/zitadel/internal/config/systemdefaults" - "github.com/caos/zitadel/internal/config/types" "github.com/caos/zitadel/internal/crypto" v1 "github.com/caos/zitadel/internal/eventstore/v1" es_spol "github.com/caos/zitadel/internal/eventstore/v1/spooler" @@ -19,11 +19,6 @@ import ( type Config struct { SearchLimit uint64 - Domain string - APIDomain string - Eventstore v1.Config - AuthRequest cache.Config - View types.SQL Spooler spooler.SpoolerConfig } @@ -38,36 +33,26 @@ type EsRepository struct { eventstore.OrgRepository } -func Start(conf Config, systemDefaults sd.SystemDefaults, command *command.Commands, queries *query.Queries) (*EsRepository, error) { - es, err := v1.Start(conf.Eventstore) +func Start(conf Config, systemDefaults sd.SystemDefaults, command *command.Commands, queries *query.Queries, dbClient *sql.DB, keyConfig *crypto.KeyConfig, assetsPrefix string) (*EsRepository, error) { + es, err := v1.Start(dbClient) if err != nil { return nil, err } - sqlClient, err := conf.View.Start() - if err != nil { - return nil, err - } - - keyAlgorithm, err := crypto.NewAESCrypto(systemDefaults.KeyConfig.EncryptionConfig) + keyAlgorithm, err := crypto.NewAESCrypto(keyConfig) if err != nil { return nil, err } idGenerator := id.SonyFlakeGenerator - assetsAPI := conf.APIDomain + "/assets/v1/" - - view, err := auth_view.StartView(sqlClient, keyAlgorithm, queries, idGenerator, assetsAPI) + view, err := auth_view.StartView(dbClient, keyAlgorithm, queries, idGenerator, assetsPrefix) if err != nil { return nil, err } - authReq, err := cache.Start(conf.AuthRequest) - if err != nil { - return nil, err - } + authReq := cache.Start(dbClient) - spool := spooler.StartSpooler(conf.Spooler, es, view, sqlClient, systemDefaults, queries) + spool := spooler.StartSpooler(conf.Spooler, es, view, dbClient, systemDefaults, queries) userRepo := eventstore.UserRepo{ SearchLimit: conf.SearchLimit, @@ -75,7 +60,7 @@ func Start(conf Config, systemDefaults sd.SystemDefaults, command *command.Comma View: view, Query: queries, SystemDefaults: systemDefaults, - PrefixAvatarURL: assetsAPI, + PrefixAvatarURL: assetsPrefix, } //TODO: remove as soon as possible queryView := queryViewWrapper{ @@ -106,11 +91,11 @@ func Start(conf Config, systemDefaults sd.SystemDefaults, command *command.Comma ProjectProvider: queryView, ApplicationProvider: queries, IdGenerator: idGenerator, - PasswordCheckLifeTime: systemDefaults.VerificationLifetimes.PasswordCheck.Duration, - ExternalLoginCheckLifeTime: systemDefaults.VerificationLifetimes.PasswordCheck.Duration, - MFAInitSkippedLifeTime: systemDefaults.VerificationLifetimes.MFAInitSkip.Duration, - SecondFactorCheckLifeTime: systemDefaults.VerificationLifetimes.SecondFactorCheck.Duration, - MultiFactorCheckLifeTime: systemDefaults.VerificationLifetimes.MultiFactorCheck.Duration, + PasswordCheckLifeTime: systemDefaults.VerificationLifetimes.PasswordCheck, + ExternalLoginCheckLifeTime: systemDefaults.VerificationLifetimes.PasswordCheck, + MFAInitSkippedLifeTime: systemDefaults.VerificationLifetimes.MFAInitSkip, + SecondFactorCheckLifeTime: systemDefaults.VerificationLifetimes.SecondFactorCheck, + MultiFactorCheckLifeTime: systemDefaults.VerificationLifetimes.MultiFactorCheck, IAMID: systemDefaults.IamID, }, eventstore.TokenRepo{ diff --git a/internal/auth_request/repository/cache/cache.go b/internal/auth_request/repository/cache/cache.go index ce48a0c370..e32df8983b 100644 --- a/internal/auth_request/repository/cache/cache.go +++ b/internal/auth_request/repository/cache/cache.go @@ -8,27 +8,18 @@ import ( "fmt" "time" - "github.com/caos/zitadel/internal/config/types" "github.com/caos/zitadel/internal/domain" caos_errs "github.com/caos/zitadel/internal/errors" ) -type Config struct { - Connection types.SQL -} - type AuthRequestCache struct { client *sql.DB } -func Start(conf Config) (*AuthRequestCache, error) { - client, err := conf.Connection.Start() - if err != nil { - return nil, caos_errs.ThrowPreconditionFailed(err, "SQL-9qBtr", "unable to open database connection") - } +func Start(dbClient *sql.DB) *AuthRequestCache { return &AuthRequestCache{ - client: client, - }, nil + client: dbClient, + } } func (c *AuthRequestCache) Health(ctx context.Context) error { diff --git a/internal/authz/authz.go b/internal/authz/authz.go index 867c6fc67d..e77e674d51 100644 --- a/internal/authz/authz.go +++ b/internal/authz/authz.go @@ -1,9 +1,12 @@ package authz import ( + "database/sql" + "github.com/caos/zitadel/internal/authz/repository" "github.com/caos/zitadel/internal/authz/repository/eventsourcing" sd "github.com/caos/zitadel/internal/config/systemdefaults" + "github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/query" ) @@ -11,6 +14,6 @@ type Config struct { Repository eventsourcing.Config } -func Start(config Config, systemDefaults sd.SystemDefaults, queries *query.Queries) (repository.Repository, error) { - return eventsourcing.Start(config.Repository, systemDefaults, queries) +func Start(config Config, systemDefaults sd.SystemDefaults, queries *query.Queries, dbClient *sql.DB, keyConfig *crypto.KeyConfig) (repository.Repository, error) { + return eventsourcing.Start(config.Repository, systemDefaults, queries, dbClient, keyConfig) } diff --git a/internal/authz/repository/eventsourcing/handler/handler.go b/internal/authz/repository/eventsourcing/handler/handler.go index 47ab4c66a1..c90af02098 100644 --- a/internal/authz/repository/eventsourcing/handler/handler.go +++ b/internal/authz/repository/eventsourcing/handler/handler.go @@ -5,7 +5,6 @@ import ( "github.com/caos/zitadel/internal/authz/repository/eventsourcing/view" sd "github.com/caos/zitadel/internal/config/systemdefaults" - "github.com/caos/zitadel/internal/config/types" v1 "github.com/caos/zitadel/internal/eventstore/v1" "github.com/caos/zitadel/internal/eventstore/v1/query" ) @@ -13,7 +12,7 @@ import ( type Configs map[string]*Config type Config struct { - MinimumCycleDuration types.Duration + MinimumCycleDuration time.Duration } type handler struct { @@ -44,7 +43,7 @@ func (configs Configs) cycleDuration(viewModel string) time.Duration { if !ok { return 3 * time.Minute } - return c.MinimumCycleDuration.Duration + return c.MinimumCycleDuration } func (h *handler) MinimumCycleDuration() time.Duration { diff --git a/internal/authz/repository/eventsourcing/repository.go b/internal/authz/repository/eventsourcing/repository.go index 005e54761a..6df3e066b3 100644 --- a/internal/authz/repository/eventsourcing/repository.go +++ b/internal/authz/repository/eventsourcing/repository.go @@ -2,13 +2,13 @@ package eventsourcing import ( "context" + "database/sql" "github.com/caos/zitadel/internal/authz/repository" "github.com/caos/zitadel/internal/authz/repository/eventsourcing/eventstore" "github.com/caos/zitadel/internal/authz/repository/eventsourcing/spooler" authz_view "github.com/caos/zitadel/internal/authz/repository/eventsourcing/view" sd "github.com/caos/zitadel/internal/config/systemdefaults" - "github.com/caos/zitadel/internal/config/types" "github.com/caos/zitadel/internal/crypto" v1 "github.com/caos/zitadel/internal/eventstore/v1" es_spol "github.com/caos/zitadel/internal/eventstore/v1/spooler" @@ -17,9 +17,7 @@ import ( ) type Config struct { - Eventstore v1.Config - View types.SQL - Spooler spooler.SpoolerConfig + Spooler spooler.SpoolerConfig } type EsRepository struct { @@ -28,26 +26,21 @@ type EsRepository struct { eventstore.TokenVerifierRepo } -func Start(conf Config, systemDefaults sd.SystemDefaults, queries *query.Queries) (repository.Repository, error) { - es, err := v1.Start(conf.Eventstore) - if err != nil { - return nil, err - } - - sqlClient, err := conf.View.Start() +func Start(conf Config, systemDefaults sd.SystemDefaults, queries *query.Queries, dbClient *sql.DB, keyConfig *crypto.KeyConfig) (repository.Repository, error) { + es, err := v1.Start(dbClient) if err != nil { return nil, err } idGenerator := id.SonyFlakeGenerator - view, err := authz_view.StartView(sqlClient, idGenerator, queries) + view, err := authz_view.StartView(dbClient, idGenerator, queries) if err != nil { return nil, err } - spool := spooler.StartSpooler(conf.Spooler, es, view, sqlClient, systemDefaults) + spool := spooler.StartSpooler(conf.Spooler, es, view, dbClient, systemDefaults) - keyAlgorithm, err := crypto.NewAESCrypto(systemDefaults.KeyConfig.EncryptionConfig) + keyAlgorithm, err := crypto.NewAESCrypto(keyConfig) if err != nil { return nil, err } diff --git a/internal/cache/config/config.go b/internal/cache/config/config.go index 6527d6107e..2209364a13 100644 --- a/internal/cache/config/config.go +++ b/internal/cache/config/config.go @@ -2,6 +2,7 @@ package config import ( "encoding/json" + "github.com/caos/zitadel/internal/cache" "github.com/caos/zitadel/internal/cache/bigcache" "github.com/caos/zitadel/internal/cache/fastcache" diff --git a/internal/command/command.go b/internal/command/command.go index f1f02cd4d3..30ccd80621 100644 --- a/internal/command/command.go +++ b/internal/command/command.go @@ -8,7 +8,6 @@ import ( "github.com/caos/zitadel/internal/api/http" authz_repo "github.com/caos/zitadel/internal/authz/repository" sd "github.com/caos/zitadel/internal/config/systemdefaults" - "github.com/caos/zitadel/internal/config/types" "github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/eventstore" @@ -61,17 +60,7 @@ type orgFeatureChecker interface { CheckOrgFeatures(ctx context.Context, orgID string, requiredFeatures ...string) error } -type Config struct { - Eventstore types.SQLUser -} - -func StartCommands( - es *eventstore.Eventstore, - defaults sd.SystemDefaults, - authZConfig authz.Config, - staticStore static.Storage, - authZRepo authz_repo.Repository, -) (repo *Commands, err error) { +func StartCommands(es *eventstore.Eventstore, defaults sd.SystemDefaults, authZConfig authz.Config, staticStore static.Storage, authZRepo authz_repo.Repository, keyConfig *crypto.KeyConfig, webAuthN webauthn_helper.Config) (repo *Commands, err error) { repo = &Commands{ eventstore: es, static: staticStore, @@ -79,8 +68,8 @@ func StartCommands( iamDomain: defaults.Domain, zitadelRoles: authZConfig.RolePermissionMappings, keySize: defaults.KeyConfig.Size, - privateKeyLifetime: defaults.KeyConfig.PrivateKeyLifetime.Duration, - publicKeyLifetime: defaults.KeyConfig.PublicKeyLifetime.Duration, + privateKeyLifetime: defaults.KeyConfig.PrivateKeyLifetime, + publicKeyLifetime: defaults.KeyConfig.PublicKeyLifetime, } iam_repo.RegisterEventMappers(repo.eventstore) org.RegisterEventMappers(repo.eventstore) @@ -127,13 +116,13 @@ func StartCommands( } repo.domainVerificationGenerator = crypto.NewEncryptionGenerator(defaults.DomainVerification.VerificationGenerator, repo.domainVerificationAlg) repo.domainVerificationValidator = http.ValidateDomain - web, err := webauthn_helper.StartServer(defaults.WebAuthN) + web, err := webauthn_helper.StartServer(webAuthN) if err != nil { return nil, err } repo.webauthn = web - keyAlgorithm, err := crypto.NewAESCrypto(defaults.KeyConfig.EncryptionConfig) + keyAlgorithm, err := crypto.NewAESCrypto(keyConfig) if err != nil { return nil, err } diff --git a/internal/command/setup_step12.go b/internal/command/setup_step12.go index 29cca2e4e0..1f2ae1dabb 100644 --- a/internal/command/setup_step12.go +++ b/internal/command/setup_step12.go @@ -2,8 +2,8 @@ package command import ( "context" + "time" - "github.com/caos/zitadel/internal/config/types" "github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/eventstore" ) @@ -11,7 +11,7 @@ import ( type Step12 struct { TierName string TierDescription string - AuditLogRetention types.Duration + AuditLogRetention time.Duration LoginPolicyFactors bool LoginPolicyIDP bool LoginPolicyPasswordless bool @@ -37,7 +37,7 @@ func (c *Commands) SetupStep12(ctx context.Context, step *Step12) error { TierName: step.TierName, TierDescription: step.TierDescription, State: domain.FeaturesStateActive, - AuditLogRetention: step.AuditLogRetention.Duration, + AuditLogRetention: step.AuditLogRetention, LoginPolicyFactors: step.LoginPolicyFactors, LoginPolicyIDP: step.LoginPolicyIDP, LoginPolicyPasswordless: step.LoginPolicyPasswordless, diff --git a/internal/config/array_flag.go b/internal/config/array_flag.go deleted file mode 100644 index e459786068..0000000000 --- a/internal/config/array_flag.go +++ /dev/null @@ -1,37 +0,0 @@ -package config - -import ( - "flag" - "strings" -) - -var _ flag.Value = (*ArrayFlags)(nil) - -//ArrayFlags implements the flag/Value interface -//allowing to set multiple string flags with the same name -type ArrayFlags struct { - defaultValues []string - values []string -} - -func NewArrayFlags(defaults ...string) *ArrayFlags { - return &ArrayFlags{ - defaultValues: defaults, - } -} - -func (i *ArrayFlags) Values() []string { - if len(i.values) == 0 { - return i.defaultValues - } - return i.values -} - -func (i *ArrayFlags) String() string { - return strings.Join(i.Values(), ";") -} - -func (i *ArrayFlags) Set(value string) error { - i.values = append(i.values, value) - return nil -} diff --git a/internal/config/systemdefaults/system_defaults.go b/internal/config/systemdefaults/system_defaults.go index 2828ef679a..5125a64ca5 100644 --- a/internal/config/systemdefaults/system_defaults.go +++ b/internal/config/systemdefaults/system_defaults.go @@ -1,13 +1,14 @@ package systemdefaults import ( - "github.com/caos/zitadel/internal/notification/channels/log" + "time" + "golang.org/x/text/language" - "github.com/caos/zitadel/internal/config/types" "github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/notification/channels/chat" "github.com/caos/zitadel/internal/notification/channels/fs" + "github.com/caos/zitadel/internal/notification/channels/log" "github.com/caos/zitadel/internal/notification/channels/smtp" "github.com/caos/zitadel/internal/notification/channels/twilio" "github.com/caos/zitadel/internal/notification/templates" @@ -25,7 +26,6 @@ type SystemDefaults struct { DomainVerification DomainVerification IamID string Notifications Notifications - WebAuthN WebAuthN KeyConfig KeyConfig } @@ -56,11 +56,11 @@ type OTPConfig struct { } type VerificationLifetimes struct { - PasswordCheck types.Duration - ExternalLoginCheck types.Duration - MFAInitSkip types.Duration - SecondFactorCheck types.Duration - MultiFactorCheck types.Duration + PasswordCheck time.Duration + ExternalLoginCheck time.Duration + MFAInitSkip time.Duration + SecondFactorCheck time.Duration + MultiFactorCheck time.Duration } type DomainVerification struct { @@ -99,18 +99,10 @@ type TemplateData struct { DomainClaimed templates.TemplateData } -type WebAuthN struct { - ID string - OriginLogin string - OriginConsole string - DisplayName string -} - type KeyConfig struct { Size int - PrivateKeyLifetime types.Duration - PublicKeyLifetime types.Duration - EncryptionConfig *crypto.KeyConfig - SigningKeyRotationCheck types.Duration - SigningKeyGracefulPeriod types.Duration + PrivateKeyLifetime time.Duration + PublicKeyLifetime time.Duration + SigningKeyRotationCheck time.Duration + SigningKeyGracefulPeriod time.Duration } diff --git a/internal/config/types/duration.go b/internal/config/types/duration.go deleted file mode 100644 index 2873c6848c..0000000000 --- a/internal/config/types/duration.go +++ /dev/null @@ -1,14 +0,0 @@ -package types - -import ( - "time" -) - -type Duration struct { - time.Duration -} - -func (d *Duration) UnmarshalText(data []byte) (err error) { - d.Duration, err = time.ParseDuration(string(data)) - return err -} diff --git a/internal/config/types/duration_test.go b/internal/config/types/duration_test.go deleted file mode 100644 index 8058d07a4d..0000000000 --- a/internal/config/types/duration_test.go +++ /dev/null @@ -1,46 +0,0 @@ -package types - -import ( - "testing" - "time" -) - -func TestDuration_UnmarshalText(t *testing.T) { - type args struct { - data []byte - } - tests := []struct { - name string - args args - wantErr bool - want time.Duration - }{ - { - "ok", - args{ - data: []byte("10s"), - }, - false, - time.Duration(10 * time.Second), - }, - { - "error", - args{ - data: []byte("10"), - }, - true, - time.Duration(0), - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - d := &Duration{} - if err := d.UnmarshalText(tt.args.data); (err != nil) != tt.wantErr { - t.Errorf("UnmarshalText() error = %v, wantErr %v", err, tt.wantErr) - } - if d.Duration != tt.want { - t.Errorf("UnmarshalText() got = %v, want %v", d.Duration, tt.want) - } - }) - } -} diff --git a/internal/config/types/sql.go b/internal/config/types/sql.go deleted file mode 100644 index 7cbc6ad41c..0000000000 --- a/internal/config/types/sql.go +++ /dev/null @@ -1,145 +0,0 @@ -package types - -import ( - "database/sql" - "strings" - - "github.com/caos/logging" - "github.com/caos/zitadel/internal/errors" -) - -const ( - sslDisabledMode = "disable" -) - -type SQL struct { - Host string - Port string - User string - Password string - Database string - Schema string - SSL *ssl - MaxOpenConns uint32 - MaxConnLifetime Duration - MaxConnIdleTime Duration - - //Additional options to be appended as options= - //The value will be taken as is. So be sure to separate multiple options by a space - Options string -} - -type SQLBase struct { - Host string - Port string - Database string - Schema string - SSL sslBase - - //Additional options to be appended as options= - //The value will be taken as is. So be sure to separate multiple options by a space - Options string -} - -type SQLUser struct { - User string - Password string - SSL sslUser -} - -type ssl struct { - sslBase - sslUser -} - -type sslBase struct { - // type of connection security - Mode string - // RootCert Path to the CA certificate - RootCert string -} - -type sslUser struct { - // Cert Path to the client certificate - Cert string - // Key Path to the client private key - Key string -} - -func (s *SQL) connectionString() string { - fields := []string{ - "host=" + s.Host, - "port=" + s.Port, - "user=" + s.User, - "dbname=" + s.Database, - "application_name=zitadel", - "sslmode=" + s.SSL.Mode, - } - if s.Options != "" { - fields = append(fields, "options="+s.Options) - } - if s.Password != "" { - fields = append(fields, "password="+s.Password) - } - s.checkSSL() - if s.SSL.Mode != sslDisabledMode { - fields = append(fields, "sslrootcert="+s.SSL.RootCert) - if s.SSL.Cert != "" { - fields = append(fields, "sslcert="+s.SSL.Cert) - } - if s.SSL.Cert != "" { - fields = append(fields, "sslkey="+s.SSL.Key) - } - } - - return strings.Join(fields, " ") -} - -func (s *SQL) Start() (*sql.DB, error) { - client, err := sql.Open("postgres", s.connectionString()) - if err != nil { - return nil, errors.ThrowPreconditionFailed(err, "TYPES-9qBtr", "unable to open database connection") - } - // as we open many sql clients we set the max - // open cons deep. now 3(maxconn) * 8(clients) = max 24 conns per pod - client.SetMaxOpenConns(int(s.MaxOpenConns)) - client.SetConnMaxLifetime(s.MaxConnLifetime.Duration) - client.SetConnMaxIdleTime(s.MaxConnIdleTime.Duration) - - return client, nil -} - -func (s *SQL) checkSSL() { - if s.SSL == nil || s.SSL.Mode == sslDisabledMode || s.SSL.Mode == "" { - s.SSL = &ssl{sslBase: sslBase{Mode: sslDisabledMode}} - return - } - if s.SSL.RootCert == "" { - logging.LogWithFields("TYPES-LFdzP", - "cert set", s.SSL.Cert != "", - "key set", s.SSL.Key != "", - "rootCert set", s.SSL.RootCert != "", - ).Fatal("fields for secure connection missing") - } -} - -func (u SQLUser) Start(base SQLBase) (*sql.DB, error) { - return (&SQL{ - Host: base.Host, - Port: base.Port, - User: u.User, - Password: u.Password, - Database: base.Database, - Options: base.Options, - SSL: &ssl{ - sslBase: sslBase{ - Mode: base.SSL.Mode, - RootCert: base.SSL.RootCert, - }, - sslUser: sslUser{ - Cert: u.SSL.Cert, - Key: u.SSL.Key, - }, - }, - }).Start() -} diff --git a/internal/crypto/code.go b/internal/crypto/code.go index fa3fed92e0..b4ffe22422 100644 --- a/internal/crypto/code.go +++ b/internal/crypto/code.go @@ -4,7 +4,6 @@ import ( "crypto/rand" "time" - "github.com/caos/zitadel/internal/config/types" "github.com/caos/zitadel/internal/errors" ) @@ -17,7 +16,7 @@ var ( type GeneratorConfig struct { Length uint - Expiry types.Duration + Expiry time.Duration IncludeLowerLetters bool IncludeUpperLetters bool IncludeDigits bool @@ -97,7 +96,7 @@ func newGenerator(config GeneratorConfig) generator { } return generator{ length: config.Length, - expiry: config.Expiry.Duration, + expiry: config.Expiry, runes: runes, } } diff --git a/internal/database/config.go b/internal/database/config.go index 7a177da872..284da731d0 100644 --- a/internal/database/config.go +++ b/internal/database/config.go @@ -2,9 +2,9 @@ package database import ( "strings" + "time" "github.com/caos/logging" - "github.com/caos/zitadel/internal/config/types" ) const ( @@ -19,8 +19,8 @@ type Config struct { Database string SSL SSL MaxOpenConns uint32 - MaxConnLifetime types.Duration - MaxConnIdleTime types.Duration + MaxConnLifetime time.Duration + MaxConnIdleTime time.Duration //Additional options to be appended as options= //The value will be taken as is. Multiple options are space separated. diff --git a/internal/database/database.go b/internal/database/database.go index 5f3d321f3b..41dbff8106 100644 --- a/internal/database/database.go +++ b/internal/database/database.go @@ -11,8 +11,8 @@ func Connect(config Config) (*sql.DB, error) { } client.SetMaxOpenConns(int(config.MaxOpenConns)) - client.SetConnMaxLifetime(config.MaxConnLifetime.Duration) - client.SetConnMaxIdleTime(config.MaxConnIdleTime.Duration) + client.SetConnMaxLifetime(config.MaxConnLifetime) + client.SetConnMaxIdleTime(config.MaxConnIdleTime) return client, nil } diff --git a/internal/domain/human_profile.go b/internal/domain/human_profile.go index 6ac7563806..b94130c944 100644 --- a/internal/domain/human_profile.go +++ b/internal/domain/human_profile.go @@ -27,5 +27,5 @@ func AvatarURL(prefix, resourceOwner, key string) string { if prefix == "" || resourceOwner == "" || key == "" { return "" } - return prefix + resourceOwner + "/" + key + return prefix + "/" + resourceOwner + "/" + key } diff --git a/internal/eventstore/config.go b/internal/eventstore/config.go index 90bf87c82d..9b71c9049e 100644 --- a/internal/eventstore/config.go +++ b/internal/eventstore/config.go @@ -1,24 +1,11 @@ package eventstore import ( - "github.com/caos/zitadel/internal/config/types" - "github.com/caos/zitadel/internal/eventstore/repository/sql" + "database/sql" + + z_sql "github.com/caos/zitadel/internal/eventstore/repository/sql" ) -func Start(sqlConfig types.SQL) (*Eventstore, error) { - sqlClient, err := sqlConfig.Start() - if err != nil { - return nil, err - } - - return NewEventstore(sql.NewCRDB(sqlClient)), nil -} - -func StartWithUser(baseConfig types.SQLBase, userConfig types.SQLUser) (*Eventstore, error) { - sqlClient, err := userConfig.Start(baseConfig) - if err != nil { - return nil, err - } - - return NewEventstore(sql.NewCRDB(sqlClient)), nil +func Start(sqlClient *sql.DB) (*Eventstore, error) { + return NewEventstore(z_sql.NewCRDB(sqlClient)), nil } diff --git a/internal/eventstore/v1/config.go b/internal/eventstore/v1/config.go deleted file mode 100644 index feface665d..0000000000 --- a/internal/eventstore/v1/config.go +++ /dev/null @@ -1,23 +0,0 @@ -package v1 - -import ( - "github.com/caos/zitadel/internal/cache/config" - "github.com/caos/zitadel/internal/eventstore/v1/internal/repository/sql" -) - -type Config struct { - Repository sql.Config - ServiceName string - Cache *config.CacheConfig -} - -func Start(conf Config) (Eventstore, error) { - repo, _, err := sql.Start(conf.Repository) - if err != nil { - return nil, err - } - - return &eventstore{ - repo: repo, - }, nil -} diff --git a/internal/eventstore/v1/eventstore.go b/internal/eventstore/v1/eventstore.go index 2bf4139cc8..0a1fefa249 100644 --- a/internal/eventstore/v1/eventstore.go +++ b/internal/eventstore/v1/eventstore.go @@ -2,8 +2,10 @@ package v1 import ( "context" + "database/sql" "github.com/caos/zitadel/internal/eventstore/v1/internal/repository" + z_sql "github.com/caos/zitadel/internal/eventstore/v1/internal/repository/sql" "github.com/caos/zitadel/internal/eventstore/v1/models" ) @@ -20,6 +22,12 @@ type eventstore struct { repo repository.Repository } +func Start(db *sql.DB) (Eventstore, error) { + return &eventstore{ + repo: z_sql.Start(db), + }, nil +} + func (es *eventstore) FilterEvents(ctx context.Context, searchQuery *models.SearchQuery) ([]*models.Event, error) { if err := searchQuery.Validate(); err != nil { return nil, err diff --git a/internal/eventstore/v1/internal/repository/sql/config.go b/internal/eventstore/v1/internal/repository/sql/config.go index 9c1187b900..8011ee9ac0 100644 --- a/internal/eventstore/v1/internal/repository/sql/config.go +++ b/internal/eventstore/v1/internal/repository/sql/config.go @@ -4,22 +4,10 @@ import ( "database/sql" _ "github.com/lib/pq" - - "github.com/caos/zitadel/internal/config/types" - "github.com/caos/zitadel/internal/errors" ) -type Config struct { - SQL types.SQL -} - -func Start(conf Config) (*SQL, *sql.DB, error) { - client, err := conf.SQL.Start() - if err != nil { - return nil, nil, errors.ThrowPreconditionFailed(err, "SQL-9qBtr", "unable to open database connection") - } - +func Start(client *sql.DB) *SQL { return &SQL{ client: client, - }, client, nil + } } diff --git a/internal/notification/notification.go b/internal/notification/notification.go index cd78b36fee..fe1e747401 100644 --- a/internal/notification/notification.go +++ b/internal/notification/notification.go @@ -1,31 +1,26 @@ package notification import ( - "context" + "database/sql" "github.com/caos/logging" + "github.com/rakyll/statik/fs" + "github.com/caos/zitadel/internal/command" sd "github.com/caos/zitadel/internal/config/systemdefaults" "github.com/caos/zitadel/internal/notification/repository/eventsourcing" - "github.com/caos/zitadel/internal/query" - "github.com/rakyll/statik/fs" - _ "github.com/caos/zitadel/internal/notification/statik" + "github.com/caos/zitadel/internal/query" ) type Config struct { - APIDomain string Repository eventsourcing.Config } -func Start(ctx context.Context, config Config, systemDefaults sd.SystemDefaults, command *command.Commands, queries *query.Queries, hasStatics bool) { +func Start(config Config, systemDefaults sd.SystemDefaults, command *command.Commands, queries *query.Queries, dbClient *sql.DB, assetsPrefix string) { statikFS, err := fs.NewWithNamespace("notification") - logging.Log("CONFI-7usEW").OnError(err).Panic("unable to start listener") + logging.OnError(err).Panic("unable to start listener") - apiDomain := config.APIDomain - if !hasStatics { - apiDomain = "" - } - _, err = eventsourcing.Start(config.Repository, statikFS, systemDefaults, command, queries, apiDomain) - logging.Log("MAIN-9uBxp").OnError(err).Panic("unable to start app") + _, err = eventsourcing.Start(config.Repository, statikFS, systemDefaults, command, queries, dbClient, assetsPrefix) + logging.OnError(err).Panic("unable to start app") } diff --git a/internal/notification/repository/eventsourcing/handler/handler.go b/internal/notification/repository/eventsourcing/handler/handler.go index e30041fa16..0d6eba58e8 100644 --- a/internal/notification/repository/eventsourcing/handler/handler.go +++ b/internal/notification/repository/eventsourcing/handler/handler.go @@ -5,21 +5,20 @@ import ( "time" "github.com/caos/logging" - "github.com/caos/zitadel/internal/query" "github.com/caos/zitadel/internal/command" sd "github.com/caos/zitadel/internal/config/systemdefaults" - "github.com/caos/zitadel/internal/config/types" "github.com/caos/zitadel/internal/crypto" v1 "github.com/caos/zitadel/internal/eventstore/v1" queryv1 "github.com/caos/zitadel/internal/eventstore/v1/query" "github.com/caos/zitadel/internal/notification/repository/eventsourcing/view" + "github.com/caos/zitadel/internal/query" ) type Configs map[string]*Config type Config struct { - MinimumCycleDuration types.Duration + MinimumCycleDuration time.Duration } type handler struct { @@ -35,11 +34,10 @@ func (h *handler) Eventstore() v1.Eventstore { return h.es } -func Register(configs Configs, bulkLimit, errorCount uint64, view *view.View, es v1.Eventstore, command *command.Commands, queries *query.Queries, systemDefaults sd.SystemDefaults, dir http.FileSystem, apiDomain string) []queryv1.Handler { +func Register(configs Configs, bulkLimit, errorCount uint64, view *view.View, es v1.Eventstore, command *command.Commands, queries *query.Queries, systemDefaults sd.SystemDefaults, dir http.FileSystem, assetsPrefix string) []queryv1.Handler { aesCrypto, err := crypto.NewAESCrypto(systemDefaults.UserVerificationKey) - if err != nil { - logging.Log("HANDL-s90ew").WithError(err).Debug("error create new aes crypto") - } + logging.OnError(err).Fatal("error create new aes crypto") + return []queryv1.Handler{ newNotifyUser( handler{view, bulkLimit, configs.cycleDuration("User"), errorCount, es}, @@ -53,7 +51,7 @@ func Register(configs Configs, bulkLimit, errorCount uint64, view *view.View, es systemDefaults, aesCrypto, dir, - apiDomain, + assetsPrefix, ), } } @@ -63,7 +61,7 @@ func (configs Configs) cycleDuration(viewModel string) time.Duration { if !ok { return 1 * time.Minute } - return c.MinimumCycleDuration.Duration + return c.MinimumCycleDuration } func (h *handler) MinimumCycleDuration() time.Duration { diff --git a/internal/notification/repository/eventsourcing/handler/notification.go b/internal/notification/repository/eventsourcing/handler/notification.go index 5bd850840c..be4d9f24a9 100644 --- a/internal/notification/repository/eventsourcing/handler/notification.go +++ b/internal/notification/repository/eventsourcing/handler/notification.go @@ -7,6 +7,7 @@ import ( "time" "github.com/caos/logging" + "github.com/caos/zitadel/internal/api/authz" "github.com/caos/zitadel/internal/command" sd "github.com/caos/zitadel/internal/config/systemdefaults" @@ -38,7 +39,7 @@ type Notification struct { AesCrypto crypto.EncryptionAlgorithm statikDir http.FileSystem subscription *v1.Subscription - apiDomain string + assetsPrefix string queries *query.Queries } @@ -49,7 +50,7 @@ func newNotification( defaults sd.SystemDefaults, aesCrypto crypto.EncryptionAlgorithm, statikDir http.FileSystem, - apiDomain string, + assetsPrefix string, ) *Notification { h := &Notification{ handler: handler, @@ -57,7 +58,7 @@ func newNotification( systemDefaults: defaults, statikDir: statikDir, AesCrypto: aesCrypto, - apiDomain: apiDomain, + assetsPrefix: assetsPrefix, queries: query, } @@ -160,7 +161,7 @@ func (n *Notification) handleInitUserCode(event *models.Event) (err error) { return err } - err = types.SendUserInitCode(string(template.Template), translator, user, initCode, n.systemDefaults, n.AesCrypto, colors, n.apiDomain) + err = types.SendUserInitCode(string(template.Template), translator, user, initCode, n.systemDefaults, n.AesCrypto, colors, n.assetsPrefix) if err != nil { return err } @@ -198,7 +199,7 @@ func (n *Notification) handlePasswordCode(event *models.Event) (err error) { if err != nil { return err } - err = types.SendPasswordCode(string(template.Template), translator, user, pwCode, n.systemDefaults, n.AesCrypto, colors, n.apiDomain) + err = types.SendPasswordCode(string(template.Template), translator, user, pwCode, n.systemDefaults, n.AesCrypto, colors, n.assetsPrefix) if err != nil { return err } @@ -237,7 +238,7 @@ func (n *Notification) handleEmailVerificationCode(event *models.Event) (err err return err } - err = types.SendEmailVerificationCode(string(template.Template), translator, user, emailCode, n.systemDefaults, n.AesCrypto, colors, n.apiDomain) + err = types.SendEmailVerificationCode(string(template.Template), translator, user, emailCode, n.systemDefaults, n.AesCrypto, colors, n.assetsPrefix) if err != nil { return err } @@ -302,7 +303,7 @@ func (n *Notification) handleDomainClaimed(event *models.Event) (err error) { if err != nil { return err } - err = types.SendDomainClaimed(string(template.Template), translator, user, data["userName"], n.systemDefaults, colors, n.apiDomain) + err = types.SendDomainClaimed(string(template.Template), translator, user, data["userName"], n.systemDefaults, colors, n.assetsPrefix) if err != nil { return err } @@ -348,7 +349,7 @@ func (n *Notification) handlePasswordlessRegistrationLink(event *models.Event) ( if err != nil { return err } - err = types.SendPasswordlessRegistrationLink(string(template.Template), translator, user, addedEvent, n.systemDefaults, n.AesCrypto, colors, n.apiDomain) + err = types.SendPasswordlessRegistrationLink(string(template.Template), translator, user, addedEvent, n.systemDefaults, n.AesCrypto, colors, n.assetsPrefix) if err != nil { return err } diff --git a/internal/notification/repository/eventsourcing/repository.go b/internal/notification/repository/eventsourcing/repository.go index fad83d42af..142c688779 100644 --- a/internal/notification/repository/eventsourcing/repository.go +++ b/internal/notification/repository/eventsourcing/repository.go @@ -1,49 +1,38 @@ package eventsourcing import ( + "database/sql" "net/http" "github.com/caos/zitadel/internal/command" - "github.com/caos/zitadel/internal/eventstore/v1" - "github.com/caos/zitadel/internal/query" - - "golang.org/x/text/language" - sd "github.com/caos/zitadel/internal/config/systemdefaults" - "github.com/caos/zitadel/internal/config/types" + v1 "github.com/caos/zitadel/internal/eventstore/v1" es_spol "github.com/caos/zitadel/internal/eventstore/v1/spooler" "github.com/caos/zitadel/internal/notification/repository/eventsourcing/spooler" noti_view "github.com/caos/zitadel/internal/notification/repository/eventsourcing/view" + "github.com/caos/zitadel/internal/query" ) type Config struct { - DefaultLanguage language.Tag - Eventstore v1.Config - View types.SQL - Spooler spooler.SpoolerConfig - Domain string + Spooler spooler.SpoolerConfig } type EsRepository struct { spooler *es_spol.Spooler } -func Start(conf Config, dir http.FileSystem, systemDefaults sd.SystemDefaults, command *command.Commands, queries *query.Queries, apiDomain string) (*EsRepository, error) { - es, err := v1.Start(conf.Eventstore) +func Start(conf Config, dir http.FileSystem, systemDefaults sd.SystemDefaults, command *command.Commands, queries *query.Queries, dbClient *sql.DB, assetsPrefix string) (*EsRepository, error) { + es, err := v1.Start(dbClient) if err != nil { return nil, err } - sqlClient, err := conf.View.Start() - if err != nil { - return nil, err - } - view, err := noti_view.StartView(sqlClient) + view, err := noti_view.StartView(dbClient) if err != nil { return nil, err } - spool := spooler.StartSpooler(conf.Spooler, es, view, sqlClient, command, queries, systemDefaults, dir, apiDomain) + spool := spooler.StartSpooler(conf.Spooler, es, view, dbClient, command, queries, systemDefaults, dir, assetsPrefix) return &EsRepository{ spool, diff --git a/internal/notification/repository/eventsourcing/spooler/spooler.go b/internal/notification/repository/eventsourcing/spooler/spooler.go index f35c5bc89c..5954d59c4e 100644 --- a/internal/notification/repository/eventsourcing/spooler/spooler.go +++ b/internal/notification/repository/eventsourcing/spooler/spooler.go @@ -5,13 +5,12 @@ import ( "net/http" "github.com/caos/zitadel/internal/command" - "github.com/caos/zitadel/internal/eventstore/v1" - "github.com/caos/zitadel/internal/query" - sd "github.com/caos/zitadel/internal/config/systemdefaults" + v1 "github.com/caos/zitadel/internal/eventstore/v1" "github.com/caos/zitadel/internal/eventstore/v1/spooler" "github.com/caos/zitadel/internal/notification/repository/eventsourcing/handler" "github.com/caos/zitadel/internal/notification/repository/eventsourcing/view" + "github.com/caos/zitadel/internal/query" ) type SpoolerConfig struct { @@ -21,12 +20,12 @@ type SpoolerConfig struct { Handlers handler.Configs } -func StartSpooler(c SpoolerConfig, es v1.Eventstore, view *view.View, sql *sql.DB, command *command.Commands, queries *query.Queries, systemDefaults sd.SystemDefaults, dir http.FileSystem, apiDomain string) *spooler.Spooler { +func StartSpooler(c SpoolerConfig, es v1.Eventstore, view *view.View, sql *sql.DB, command *command.Commands, queries *query.Queries, systemDefaults sd.SystemDefaults, dir http.FileSystem, assetsPrefix string) *spooler.Spooler { spoolerConfig := spooler.Config{ Eventstore: es, Locker: &locker{dbClient: sql}, ConcurrentWorkers: c.ConcurrentWorkers, - ViewHandlers: handler.Register(c.Handlers, c.BulkLimit, c.FailureCountUntilSkip, view, es, command, queries, systemDefaults, dir, apiDomain), + ViewHandlers: handler.Register(c.Handlers, c.BulkLimit, c.FailureCountUntilSkip, view, es, command, queries, systemDefaults, dir, assetsPrefix), } spool := spoolerConfig.New() spool.Start() diff --git a/internal/notification/types/domain_claimed.go b/internal/notification/types/domain_claimed.go index 00b083075e..430ad831fb 100644 --- a/internal/notification/types/domain_claimed.go +++ b/internal/notification/types/domain_claimed.go @@ -16,7 +16,7 @@ type DomainClaimedData struct { URL string } -func SendDomainClaimed(mailhtml string, translator *i18n.Translator, user *view_model.NotifyUser, username string, systemDefaults systemdefaults.SystemDefaults, colors *query.LabelPolicy, apiDomain string) error { +func SendDomainClaimed(mailhtml string, translator *i18n.Translator, user *view_model.NotifyUser, username string, systemDefaults systemdefaults.SystemDefaults, colors *query.LabelPolicy, assetsPrefix string) error { url, err := templates.ParseTemplateText(systemDefaults.Notifications.Endpoints.DomainClaimed, &UrlData{UserID: user.ID}) if err != nil { return err @@ -26,7 +26,7 @@ func SendDomainClaimed(mailhtml string, translator *i18n.Translator, user *view_ args["Domain"] = strings.Split(user.LastEmail, "@")[1] domainClaimedData := &DomainClaimedData{ - TemplateData: GetTemplateData(translator, args, apiDomain, url, domain.DomainClaimedMessageType, user.PreferredLanguage, colors), + TemplateData: GetTemplateData(translator, args, assetsPrefix, url, domain.DomainClaimedMessageType, user.PreferredLanguage, colors), URL: url, } template, err := templates.GetParsedTemplate(mailhtml, domainClaimedData) diff --git a/internal/notification/types/email_verification_code.go b/internal/notification/types/email_verification_code.go index 597f24597a..e667483ec6 100644 --- a/internal/notification/types/email_verification_code.go +++ b/internal/notification/types/email_verification_code.go @@ -16,7 +16,7 @@ type EmailVerificationCodeData struct { URL string } -func SendEmailVerificationCode(mailhtml string, translator *i18n.Translator, user *view_model.NotifyUser, code *es_model.EmailCode, systemDefaults systemdefaults.SystemDefaults, alg crypto.EncryptionAlgorithm, colors *query.LabelPolicy, apiDomain string) error { +func SendEmailVerificationCode(mailhtml string, translator *i18n.Translator, user *view_model.NotifyUser, code *es_model.EmailCode, systemDefaults systemdefaults.SystemDefaults, alg crypto.EncryptionAlgorithm, colors *query.LabelPolicy, assetsPrefix string) error { codeString, err := crypto.DecryptString(code.Code, alg) if err != nil { return err @@ -30,7 +30,7 @@ func SendEmailVerificationCode(mailhtml string, translator *i18n.Translator, use args["Code"] = codeString emailCodeData := &EmailVerificationCodeData{ - TemplateData: GetTemplateData(translator, args, apiDomain, url, domain.VerifyEmailMessageType, user.PreferredLanguage, colors), + TemplateData: GetTemplateData(translator, args, assetsPrefix, url, domain.VerifyEmailMessageType, user.PreferredLanguage, colors), URL: url, } diff --git a/internal/notification/types/init_code.go b/internal/notification/types/init_code.go index a91cb956bf..c55bfa8e94 100644 --- a/internal/notification/types/init_code.go +++ b/internal/notification/types/init_code.go @@ -22,7 +22,7 @@ type UrlData struct { PasswordSet bool } -func SendUserInitCode(mailhtml string, translator *i18n.Translator, user *view_model.NotifyUser, code *es_model.InitUserCode, systemDefaults systemdefaults.SystemDefaults, alg crypto.EncryptionAlgorithm, colors *query.LabelPolicy, apiDomain string) error { +func SendUserInitCode(mailhtml string, translator *i18n.Translator, user *view_model.NotifyUser, code *es_model.InitUserCode, systemDefaults systemdefaults.SystemDefaults, alg crypto.EncryptionAlgorithm, colors *query.LabelPolicy, assetsPrefix string) error { codeString, err := crypto.DecryptString(code.Code, alg) if err != nil { return err @@ -35,7 +35,7 @@ func SendUserInitCode(mailhtml string, translator *i18n.Translator, user *view_m args["Code"] = codeString initCodeData := &InitCodeEmailData{ - TemplateData: GetTemplateData(translator, args, apiDomain, url, domain.InitCodeMessageType, user.PreferredLanguage, colors), + TemplateData: GetTemplateData(translator, args, assetsPrefix, url, domain.InitCodeMessageType, user.PreferredLanguage, colors), URL: url, } template, err := templates.GetParsedTemplate(mailhtml, initCodeData) diff --git a/internal/notification/types/password_code.go b/internal/notification/types/password_code.go index 2a052b9c95..7eceb6ae43 100644 --- a/internal/notification/types/password_code.go +++ b/internal/notification/types/password_code.go @@ -18,7 +18,7 @@ type PasswordCodeData struct { URL string } -func SendPasswordCode(mailhtml string, translator *i18n.Translator, user *view_model.NotifyUser, code *es_model.PasswordCode, systemDefaults systemdefaults.SystemDefaults, alg crypto.EncryptionAlgorithm, colors *query.LabelPolicy, apiDomain string) error { +func SendPasswordCode(mailhtml string, translator *i18n.Translator, user *view_model.NotifyUser, code *es_model.PasswordCode, systemDefaults systemdefaults.SystemDefaults, alg crypto.EncryptionAlgorithm, colors *query.LabelPolicy, assetsPrefix string) error { codeString, err := crypto.DecryptString(code.Code, alg) if err != nil { return err @@ -31,7 +31,7 @@ func SendPasswordCode(mailhtml string, translator *i18n.Translator, user *view_m args["Code"] = codeString passwordResetData := &PasswordCodeData{ - TemplateData: GetTemplateData(translator, args, apiDomain, url, domain.PasswordResetMessageType, user.PreferredLanguage, colors), + TemplateData: GetTemplateData(translator, args, assetsPrefix, url, domain.PasswordResetMessageType, user.PreferredLanguage, colors), FirstName: user.FirstName, LastName: user.LastName, URL: url, diff --git a/internal/notification/types/passwordless_registration_link.go b/internal/notification/types/passwordless_registration_link.go index b95eea1841..5801459ae7 100644 --- a/internal/notification/types/passwordless_registration_link.go +++ b/internal/notification/types/passwordless_registration_link.go @@ -16,7 +16,7 @@ type PasswordlessRegistrationLinkData struct { URL string } -func SendPasswordlessRegistrationLink(mailhtml string, translator *i18n.Translator, user *view_model.NotifyUser, code *user.HumanPasswordlessInitCodeRequestedEvent, systemDefaults systemdefaults.SystemDefaults, alg crypto.EncryptionAlgorithm, colors *query.LabelPolicy, apiDomain string) error { +func SendPasswordlessRegistrationLink(mailhtml string, translator *i18n.Translator, user *view_model.NotifyUser, code *user.HumanPasswordlessInitCodeRequestedEvent, systemDefaults systemdefaults.SystemDefaults, alg crypto.EncryptionAlgorithm, colors *query.LabelPolicy, assetsPrefix string) error { codeString, err := crypto.DecryptString(code.Code, alg) if err != nil { return err @@ -25,7 +25,7 @@ func SendPasswordlessRegistrationLink(mailhtml string, translator *i18n.Translat var args = mapNotifyUserToArgs(user) emailCodeData := &PasswordlessRegistrationLinkData{ - TemplateData: GetTemplateData(translator, args, apiDomain, url, domain.PasswordlessRegistrationMessageType, user.PreferredLanguage, colors), + TemplateData: GetTemplateData(translator, args, assetsPrefix, url, domain.PasswordlessRegistrationMessageType, user.PreferredLanguage, colors), URL: url, } diff --git a/internal/notification/types/templateData.go b/internal/notification/types/templateData.go index a8f0e0a99b..b5ca855ce2 100644 --- a/internal/notification/types/templateData.go +++ b/internal/notification/types/templateData.go @@ -9,7 +9,7 @@ import ( "github.com/caos/zitadel/internal/query" ) -func GetTemplateData(translator *i18n.Translator, translateArgs map[string]interface{}, apiDomain, href, msgType, lang string, policy *query.LabelPolicy) templates.TemplateData { +func GetTemplateData(translator *i18n.Translator, translateArgs map[string]interface{}, assetsPrefix, href, msgType, lang string, policy *query.LabelPolicy) templates.TemplateData { templateData := templates.TemplateData{ Href: href, PrimaryColor: templates.DefaultPrimaryColor, @@ -30,17 +30,17 @@ func GetTemplateData(translator *i18n.Translator, translateArgs map[string]inter if policy.Light.FontColor != "" { templateData.FontColor = policy.Light.FontColor } - if apiDomain == "" { + if assetsPrefix == "" { return templateData } templateData.LogoURL = "" if policy.Light.LogoURL != "" { - templateData.LogoURL = fmt.Sprintf("%s/assets/v1/%s/%s", apiDomain, policy.ID, policy.Light.LogoURL) + templateData.LogoURL = fmt.Sprintf("%s/%s/%s", assetsPrefix, policy.ID, policy.Light.LogoURL) } if policy.FontURL != "" { split := strings.Split(policy.FontURL, "/") templateData.FontFamily = split[len(split)-1] + "," + templates.DefaultFontFamily - templateData.FontURL = fmt.Sprintf("%s/assets/v1/%s/%s", apiDomain, policy.ID, policy.FontURL) + templateData.FontURL = fmt.Sprintf("%s/%s/%s", assetsPrefix, policy.ID, policy.FontURL) } return templateData } diff --git a/internal/query/languages.go b/internal/query/languages.go index 1ead8dc31b..89441be1b5 100644 --- a/internal/query/languages.go +++ b/internal/query/languages.go @@ -4,8 +4,9 @@ import ( "context" "github.com/caos/logging" - "github.com/caos/zitadel/internal/i18n" "golang.org/x/text/language" + + "github.com/caos/zitadel/internal/i18n" ) func (q *Queries) Languages(ctx context.Context) ([]language.Tag, error) { diff --git a/internal/query/projection/config.go b/internal/query/projection/config.go index 44e16597fa..eb3fae3ae9 100644 --- a/internal/query/projection/config.go +++ b/internal/query/projection/config.go @@ -1,20 +1,21 @@ package projection -import "github.com/caos/zitadel/internal/config/types" +import ( + "time" +) type Config struct { - RequeueEvery types.Duration - RetryFailedAfter types.Duration + RequeueEvery time.Duration + RetryFailedAfter time.Duration MaxFailureCount uint BulkLimit uint64 - CRDB types.SQL Customizations map[string]CustomConfig MaxIterators int } type CustomConfig struct { - RequeueEvery *types.Duration - RetryFailedAfter *types.Duration + RequeueEvery *time.Duration + RetryFailedAfter *time.Duration MaxFailureCount *uint BulkLimit *uint64 } diff --git a/internal/query/projection/key.go b/internal/query/projection/key.go index 190f96dba6..871ab84f89 100644 --- a/internal/query/projection/key.go +++ b/internal/query/projection/key.go @@ -6,7 +6,6 @@ import ( "github.com/caos/logging" - "github.com/caos/zitadel/internal/config/systemdefaults" "github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/errors" "github.com/caos/zitadel/internal/eventstore" @@ -27,13 +26,13 @@ const ( KeyPublicTable = KeyProjectionTable + "_" + publicKeyTableSuffix ) -func NewKeyProjection(ctx context.Context, config crdb.StatementHandlerConfig, keyConfig systemdefaults.KeyConfig, keyChan chan<- interface{}) (_ *KeyProjection, err error) { +func NewKeyProjection(ctx context.Context, config crdb.StatementHandlerConfig, keyConfig *crypto.KeyConfig, keyChan chan<- interface{}) (_ *KeyProjection, err error) { p := &KeyProjection{} config.ProjectionName = KeyProjectionTable config.Reducers = p.reducers() p.StatementHandler = crdb.NewStatementHandler(ctx, config) p.keyChan = keyChan - p.encryptionAlgorithm, err = crypto.NewAESCrypto(keyConfig.EncryptionConfig) + p.encryptionAlgorithm, err = crypto.NewAESCrypto(keyConfig) if err != nil { return nil, err } diff --git a/internal/query/projection/projection.go b/internal/query/projection/projection.go index 60e6e0c556..41d5f5462d 100644 --- a/internal/query/projection/projection.go +++ b/internal/query/projection/projection.go @@ -5,7 +5,7 @@ import ( "database/sql" "time" - "github.com/caos/zitadel/internal/config/systemdefaults" + "github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore/handler" "github.com/caos/zitadel/internal/eventstore/handler/crdb" @@ -17,14 +17,14 @@ const ( FailedEventsTable = "projections.failed_events" ) -func Start(ctx context.Context, sqlClient *sql.DB, es *eventstore.Eventstore, config Config, defaults systemdefaults.SystemDefaults, keyChan chan<- interface{}) error { +func Start(ctx context.Context, sqlClient *sql.DB, es *eventstore.Eventstore, config Config, keyConfig *crypto.KeyConfig, keyChan chan<- interface{}) error { projectionConfig := crdb.StatementHandlerConfig{ ProjectionHandlerConfig: handler.ProjectionHandlerConfig{ HandlerConfig: handler.HandlerConfig{ Eventstore: es, }, - RequeueEvery: config.RequeueEvery.Duration, - RetryFailedAfter: config.RetryFailedAfter.Duration, + RequeueEvery: config.RequeueEvery, + RetryFailedAfter: config.RetryFailedAfter, }, Client: sqlClient, SequenceTable: CurrentSeqTable, @@ -69,7 +69,7 @@ func Start(ctx context.Context, sqlClient *sql.DB, es *eventstore.Eventstore, co NewUserMetadataProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["user_metadata"])) NewUserAuthMethodProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["user_auth_method"])) NewIAMProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["iam"])) - _, err := NewKeyProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["keys"]), defaults.KeyConfig, keyChan) + _, err := NewKeyProjection(ctx, applyCustomConfig(projectionConfig, config.Customizations["keys"]), keyConfig, keyChan) return err } @@ -82,10 +82,10 @@ func applyCustomConfig(config crdb.StatementHandlerConfig, customConfig CustomCo config.MaxFailureCount = *customConfig.MaxFailureCount } if customConfig.RequeueEvery != nil { - config.RequeueEvery = customConfig.RequeueEvery.Duration + config.RequeueEvery = *customConfig.RequeueEvery } if customConfig.RetryFailedAfter != nil { - config.RetryFailedAfter = customConfig.RetryFailedAfter.Duration + config.RetryFailedAfter = *customConfig.RetryFailedAfter } return config diff --git a/internal/query/query.go b/internal/query/query.go index c8c1aa492d..fe4d562838 100644 --- a/internal/query/query.go +++ b/internal/query/query.go @@ -3,16 +3,16 @@ package query import ( "context" "database/sql" + "fmt" "net/http" "sync" - "github.com/caos/logging" "github.com/rakyll/statik/fs" "golang.org/x/text/language" "github.com/caos/zitadel/internal/api/authz" sd "github.com/caos/zitadel/internal/config/systemdefaults" - "github.com/caos/zitadel/internal/config/types" + "github.com/caos/zitadel/internal/crypto" "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/query/projection" "github.com/caos/zitadel/internal/repository/action" @@ -39,21 +39,16 @@ type Queries struct { zitadelRoles []authz.RoleMapping } -type Config struct { - Eventstore types.SQLUser -} - -func StartQueries(ctx context.Context, es *eventstore.Eventstore, projections projection.Config, defaults sd.SystemDefaults, keyChan chan<- interface{}, zitadelRoles []authz.RoleMapping) (repo *Queries, err error) { - sqlClient, err := projections.CRDB.Start() +func StartQueries(ctx context.Context, es *eventstore.Eventstore, sqlClient *sql.DB, projections projection.Config, defaults sd.SystemDefaults, keyConfig *crypto.KeyConfig, keyChan chan<- interface{}, zitadelRoles []authz.RoleMapping) (repo *Queries, err error) { + statikLoginFS, err := fs.NewWithNamespace("login") if err != nil { - return nil, err + return nil, fmt.Errorf("unable to start login statik dir") } - statikLoginFS, err := fs.NewWithNamespace("login") - logging.Log("CONFI-7usEW").OnError(err).Panic("unable to start login statik dir") - statikNotificationFS, err := fs.NewWithNamespace("notification") - logging.Log("CONFI-7usEW").OnError(err).Panic("unable to start notification statik dir") + if err != nil { + return nil, fmt.Errorf("unable to start notification statik dir") + } repo = &Queries{ iamID: defaults.IamID, @@ -74,7 +69,7 @@ func StartQueries(ctx context.Context, es *eventstore.Eventstore, projections pr keypair.RegisterEventMappers(repo.eventstore) usergrant.RegisterEventMappers(repo.eventstore) - err = projection.Start(ctx, sqlClient, es, projections, defaults, keyChan) + err = projection.Start(ctx, sqlClient, es, projections, keyConfig, keyChan) if err != nil { return nil, err } diff --git a/internal/ui/login/handler/login.go b/internal/ui/login/handler/login.go deleted file mode 100644 index af19eec708..0000000000 --- a/internal/ui/login/handler/login.go +++ /dev/null @@ -1,186 +0,0 @@ -package handler - -import ( - "context" - "net" - "net/http" - - "github.com/caos/logging" - "github.com/gorilla/csrf" - "github.com/rakyll/statik/fs" - "golang.org/x/text/language" - - "github.com/caos/zitadel/internal/api/authz" - http_utils "github.com/caos/zitadel/internal/api/http" - "github.com/caos/zitadel/internal/api/http/middleware" - auth_repository "github.com/caos/zitadel/internal/auth/repository" - "github.com/caos/zitadel/internal/auth/repository/eventsourcing" - "github.com/caos/zitadel/internal/cache" - cache_config "github.com/caos/zitadel/internal/cache/config" - "github.com/caos/zitadel/internal/command" - "github.com/caos/zitadel/internal/config/systemdefaults" - "github.com/caos/zitadel/internal/crypto" - "github.com/caos/zitadel/internal/domain" - "github.com/caos/zitadel/internal/form" - "github.com/caos/zitadel/internal/id" - "github.com/caos/zitadel/internal/query" - "github.com/caos/zitadel/internal/static" - _ "github.com/caos/zitadel/internal/ui/login/statik" -) - -type Login struct { - endpoint string - router http.Handler - renderer *Renderer - parser *form.Parser - command *command.Commands - query *query.Queries - staticStorage static.Storage - staticCache cache.Cache - authRepo auth_repository.Repository - baseURL string - zitadelURL string - oidcAuthCallbackURL string - IDPConfigAesCrypto crypto.EncryptionAlgorithm - iamDomain string -} - -type Config struct { - BaseURL string - OidcAuthCallbackURL string - ZitadelURL string - LanguageCookieName string - DefaultLanguage language.Tag - CSRF CSRF - UserAgentCookieConfig *middleware.UserAgentCookieConfig - Cache middleware.CacheConfig - StaticCache cache_config.CacheConfig -} - -type CSRF struct { - CookieName string - Key *crypto.KeyConfig - Development bool -} - -const ( - login = "LOGIN" - handlerPrefix = "/login" -) - -func CreateLogin(config Config, command *command.Commands, query *query.Queries, authRepo *eventsourcing.EsRepository, staticStorage static.Storage, systemDefaults systemdefaults.SystemDefaults, localDevMode bool) (*Login, string) { - aesCrypto, err := crypto.NewAESCrypto(systemDefaults.IDPConfigVerificationKey) - if err != nil { - logging.Log("HANDL-s90ew").WithError(err).Debug("error create new aes crypto") - } - login := &Login{ - oidcAuthCallbackURL: config.OidcAuthCallbackURL, - baseURL: config.BaseURL, - zitadelURL: config.ZitadelURL, - command: command, - query: query, - staticStorage: staticStorage, - authRepo: authRepo, - IDPConfigAesCrypto: aesCrypto, - iamDomain: systemDefaults.Domain, - } - prefix := "" - if localDevMode { - prefix = handlerPrefix - } - login.staticCache, err = config.StaticCache.Config.NewCache() - logging.Log("CONFI-dgg31").OnError(err).Panic("unable to create storage cache") - - statikFS, err := fs.NewWithNamespace("login") - logging.Log("CONFI-Ga21f").OnError(err).Panic("unable to create filesystem") - - csrf, err := csrfInterceptor(config.CSRF, login.csrfErrorHandler()) - logging.Log("CONFI-dHR2a").OnError(err).Panic("unable to create csrfInterceptor") - cache, err := middleware.DefaultCacheInterceptor(EndpointResources, config.Cache.MaxAge.Duration, config.Cache.SharedMaxAge.Duration) - logging.Log("CONFI-BHq2a").OnError(err).Panic("unable to create cacheInterceptor") - security := middleware.SecurityHeaders(csp(), login.cspErrorHandler) - userAgentCookie, err := middleware.NewUserAgentHandler(config.UserAgentCookieConfig, id.SonyFlakeGenerator, localDevMode) - logging.Log("CONFI-Dvwf2").OnError(err).Panic("unable to create userAgentInterceptor") - login.router = CreateRouter(login, statikFS, csrf, cache, security, userAgentCookie, middleware.TelemetryHandler(EndpointResources)) - login.renderer = CreateRenderer(prefix, statikFS, staticStorage, config.LanguageCookieName, config.DefaultLanguage) - login.parser = form.NewParser() - return login, handlerPrefix -} - -func csp() *middleware.CSP { - csp := middleware.DefaultSCP - csp.ObjectSrc = middleware.CSPSourceOptsSelf() - csp.StyleSrc = csp.StyleSrc.AddNonce() - csp.ScriptSrc = csp.ScriptSrc.AddNonce() - return &csp -} - -func csrfInterceptor(config CSRF, errorHandler http.Handler) (func(http.Handler) http.Handler, error) { - csrfKey, err := crypto.LoadKey(config.Key, config.Key.EncryptionKeyID) - if err != nil { - return nil, err - } - path := "/" - return csrf.Protect([]byte(csrfKey), - csrf.Secure(!config.Development), - csrf.CookieName(http_utils.SetCookiePrefix(config.CookieName, "", path, !config.Development)), - csrf.Path(path), - csrf.ErrorHandler(errorHandler), - ), nil -} - -func (l *Login) Handler() http.Handler { - return l.router -} - -func (l *Login) Listen(ctx context.Context) { - if l.endpoint == "" { - l.endpoint = ":80" - } else { - l.endpoint = ":" + l.endpoint - } - - defer logging.LogWithFields("APP-xUZof", "port", l.endpoint).Info("html is listening") - httpListener, err := net.Listen("tcp", l.endpoint) - logging.Log("CONFI-W5q2O").OnError(err).Panic("unable to start listener") - - httpServer := &http.Server{ - Handler: l.router, - } - - go func() { - <-ctx.Done() - if err = httpServer.Shutdown(ctx); err != nil { - logging.Log("APP-mJKTv").WithError(err) - } - }() - - go func() { - err := httpServer.Serve(httpListener) - logging.Log("APP-oSklt").OnError(err).Panic("unable to start listener") - }() -} - -func (l *Login) getClaimedUserIDsOfOrgDomain(ctx context.Context, orgName string) ([]string, error) { - loginName, err := query.NewUserPreferredLoginNameSearchQuery("@"+domain.NewIAMDomainName(orgName, l.iamDomain), query.TextEndsWithIgnoreCase) - if err != nil { - return nil, err - } - users, err := l.query.SearchUsers(ctx, &query.UserSearchQueries{Queries: []query.SearchQuery{loginName}}) - if err != nil { - return nil, err - } - userIDs := make([]string, len(users.Users)) - for i, user := range users.Users { - userIDs[i] = user.ID - } - return userIDs, nil -} - -func setContext(ctx context.Context, resourceOwner string) context.Context { - data := authz.CtxData{ - UserID: login, - OrgID: resourceOwner, - } - return authz.SetCtxData(ctx, data) -} diff --git a/internal/ui/login/handler/resources_handler.go b/internal/ui/login/handler/resources_handler.go deleted file mode 100644 index 6444f6ce92..0000000000 --- a/internal/ui/login/handler/resources_handler.go +++ /dev/null @@ -1,99 +0,0 @@ -package handler - -import ( - "context" - "io/ioutil" - "net/http" - "strconv" - "time" - - "github.com/caos/logging" - - "github.com/caos/zitadel/internal/domain" - caos_errs "github.com/caos/zitadel/internal/errors" -) - -type dynamicResourceData struct { - OrgID string `schema:"orgId"` - DefaultPolicy bool `schema:"default-policy"` - FileName string `schema:"filename"` -} - -func (l *Login) handleResources(staticDir http.FileSystem) http.Handler { - return http.FileServer(staticDir) -} - -func (l *Login) handleDynamicResources(w http.ResponseWriter, r *http.Request) { - data := new(dynamicResourceData) - err := l.getParseData(r, data) - if err != nil { - return - } - - bucketName := domain.IAMID - if data.OrgID != "" && !data.DefaultPolicy { - bucketName = data.OrgID - } - - etag := r.Header.Get("If-None-Match") - asset, info, err := l.getStatic(r.Context(), bucketName, data.FileName) - if info != nil && info.ETag == etag { - w.WriteHeader(304) - return - } - if err != nil { - return - } - - w.Header().Set("content-length", strconv.FormatInt(info.Size, 10)) - w.Header().Set("content-type", info.ContentType) - w.Header().Set("ETag", info.ETag) - w.Write(asset) -} - -func (l *Login) getStatic(ctx context.Context, bucketName, fileName string) ([]byte, *domain.AssetInfo, error) { - s := new(staticAsset) - key := bucketName + "-" + fileName - err := l.staticCache.Get(key, s) - if err == nil && s.Info != nil && (s.Info.Expiration.After(time.Now().Add(-1 * time.Minute))) { //TODO: config? - return s.Data, s.Info, nil - } - - info, err := l.staticStorage.GetObjectInfo(ctx, bucketName, fileName) - if err != nil { - if caos_errs.IsNotFound(err) { - return nil, nil, err - } - return s.Data, s.Info, err - } - if s.Info != nil && s.Info.ETag == info.ETag { - if info.Expiration.After(s.Info.Expiration) { - s.Info = info - l.cacheStatic(bucketName, fileName, s) - } - return s.Data, s.Info, nil - } - - reader, _, err := l.staticStorage.GetObject(ctx, bucketName, fileName) - if err != nil { - return s.Data, s.Info, err - } - s.Data, err = ioutil.ReadAll(reader) - if err != nil { - return nil, nil, err - } - s.Info = info - l.cacheStatic(bucketName, fileName, s) - return s.Data, s.Info, nil -} - -func (l *Login) cacheStatic(bucketName, fileName string, s *staticAsset) { - key := bucketName + "-" + fileName - err := l.staticCache.Set(key, &s) - logging.Log("HANDLER-dfht2").OnError(err).Warnf("caching of asset %s: %s failed", bucketName, fileName) -} - -type staticAsset struct { - Data []byte - Info *domain.AssetInfo -} diff --git a/internal/ui/login/login.go b/internal/ui/login/login.go deleted file mode 100644 index 0b89920b1c..0000000000 --- a/internal/ui/login/login.go +++ /dev/null @@ -1,18 +0,0 @@ -package login - -import ( - "github.com/caos/zitadel/internal/auth/repository/eventsourcing" - "github.com/caos/zitadel/internal/command" - "github.com/caos/zitadel/internal/config/systemdefaults" - "github.com/caos/zitadel/internal/query" - "github.com/caos/zitadel/internal/static" - "github.com/caos/zitadel/internal/ui/login/handler" -) - -type Config struct { - Handler handler.Config -} - -func Start(config Config, command *command.Commands, query *query.Queries, authRepo *eventsourcing.EsRepository, staticStorage static.Storage, systemdefaults systemdefaults.SystemDefaults, localDevMode bool) (*handler.Login, string) { - return handler.CreateLogin(config.Handler, command, query, authRepo, staticStorage, systemdefaults, localDevMode) -} diff --git a/internal/ui/login/static/resources/themes/scss/bundle.scss b/internal/ui/login/static/resources/themes/scss/bundle.scss deleted file mode 100644 index 3222ef976e..0000000000 --- a/internal/ui/login/static/resources/themes/scss/bundle.scss +++ /dev/null @@ -1,12 +0,0 @@ -// themes and colors -@import './styles/theming/all.scss'; -@import './styles/color/all_color.scss'; -@import './styles/typography/typography.scss'; - -// layouts -@import './styles/container/container.scss'; -@import './styles/register/register.scss'; -@import './styles/header/header.scss'; - -// animations -@import './styles/animations.scss'; diff --git a/internal/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider.scss b/internal/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider.scss deleted file mode 100644 index f38c908605..0000000000 --- a/internal/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider.scss +++ /dev/null @@ -1,5 +0,0 @@ -@import './identity_provider_base.scss'; - -.lgn-idp { - @include lgn-idp-base; -} diff --git a/internal/ui/login/static/resources/themes/scss/styles/theming/all.scss b/internal/ui/login/static/resources/themes/scss/styles/theming/all.scss deleted file mode 100644 index 96e8c29b42..0000000000 --- a/internal/ui/login/static/resources/themes/scss/styles/theming/all.scss +++ /dev/null @@ -1,41 +0,0 @@ -@import '../core/core.scss'; -@import '../footer/footer_theme.scss'; -@import '../header/header_theme.scss'; -@import '../button/button_theme.scss'; -@import '../input/input_theme.scss'; -@import '../label/label_theme.scss'; -@import '../radio/radio_theme.scss'; -@import '../a/a_theme.scss'; -@import '../identity_provider/identity_provider_theme.scss'; -@import '../error/error_theme.scss'; -@import '../qrcode/qrcode_theme.scss'; -@import '../container/container_theme.scss'; -@import '../account_selection/account_selection_theme.scss'; -@import '../avatar/avatar_theme.scss'; -@import '../checkbox/checkbox_theme.scss'; -@import '../select/select_theme.scss'; -@import '../list/list_theme.scss'; -@import '../typography/typography.scss'; -@import '../success_label/success_label_theme.scss'; -@import './theming'; - -@mixin zitadel-lgn-theme() { - @include lgn-core-theme(); - @include lgn-header-theme(); - @include lgn-button-theme(); - @include lgn-input-theme(); - @include lgn-radio-theme(); - @include lgn-checkbox-theme(); - @include lgn-label-theme(); - @include lgn-footer-theme(); - @include lgn-a-theme(); - @include lgn-error-theme(); - @include lgn-qrcode-theme(); - @include lgn-container-theme(); - @include lgn-account-selection-theme(); - @include lgn-avatar-theme(); - @include lgn-select-theme(); - @include lgn-list-theme(); - @include lgn-idp-theme(); - @include lgn-success-label-theme(); -} \ No newline at end of file diff --git a/internal/ui/ui.go b/internal/ui/ui.go deleted file mode 100644 index 254a179bfe..0000000000 --- a/internal/ui/ui.go +++ /dev/null @@ -1,43 +0,0 @@ -package ui - -import ( - "context" - "net/http" - - sentryhttp "github.com/getsentry/sentry-go/http" - - http_util "github.com/caos/zitadel/internal/api/http" - "github.com/caos/zitadel/internal/ui/console" - "github.com/caos/zitadel/internal/ui/login" -) - -const ( - uiname = "ui" -) - -type Config struct { - Port string - Login login.Config - Console console.Config -} - -type UI struct { - port string - mux *http.ServeMux -} - -func Create(config Config) *UI { - return &UI{ - port: config.Port, - mux: http.NewServeMux(), - } -} - -func (u *UI) RegisterHandler(prefix string, handler http.Handler) { - sentryHandler := sentryhttp.New(sentryhttp.Options{}) - http_util.RegisterHandler(u.mux, prefix, sentryHandler.Handle(handler)) -} - -func (u *UI) Start(ctx context.Context) { - http_util.Serve(ctx, u.mux, u.port, uiname) -} diff --git a/internal/view/repository/config.go b/internal/view/repository/config.go deleted file mode 100644 index 312751838f..0000000000 --- a/internal/view/repository/config.go +++ /dev/null @@ -1,26 +0,0 @@ -package repository - -import ( - "database/sql" - - "github.com/caos/zitadel/internal/config/types" - "github.com/caos/zitadel/internal/errors" - "github.com/jinzhu/gorm" -) - -type ViewConfig struct { - SQL *types.SQL -} - -func Start(conf ViewConfig) (*sql.DB, *gorm.DB, error) { - sqlClient, err := conf.SQL.Start() - if err != nil { - return nil, nil, errors.ThrowPreconditionFailed(err, "SQL-9qBtr", "unable to open database connection") - } - - client, err := gorm.Open("postgres", sqlClient) - if err != nil { - return nil, nil, err - } - return sqlClient, client, nil -} diff --git a/internal/webauthn/webauthn.go b/internal/webauthn/webauthn.go index 7d8db3771c..0e627c74fb 100644 --- a/internal/webauthn/webauthn.go +++ b/internal/webauthn/webauthn.go @@ -3,40 +3,35 @@ package webauthn import ( "bytes" "encoding/json" - "github.com/caos/zitadel/internal/domain" "github.com/duo-labs/webauthn/protocol" "github.com/duo-labs/webauthn/webauthn" - "github.com/caos/zitadel/internal/config/systemdefaults" + "github.com/caos/zitadel/internal/domain" caos_errs "github.com/caos/zitadel/internal/errors" ) type WebAuthN struct { - webLogin *webauthn.WebAuthn - webConsole *webauthn.WebAuthn + webAuthN *webauthn.WebAuthn } -func StartServer(sd systemdefaults.WebAuthN) (*WebAuthN, error) { - webLogin, err := webauthn.New(&webauthn.Config{ - RPDisplayName: sd.DisplayName, - RPID: sd.ID, - RPOrigin: sd.OriginLogin, - }) - if err != nil { - return nil, err - } - webConsole, err := webauthn.New(&webauthn.Config{ - RPDisplayName: sd.DisplayName, - RPID: sd.ID, - RPOrigin: sd.OriginConsole, +type Config struct { + ID string + Origin string + DisplayName string +} + +func StartServer(config Config) (*WebAuthN, error) { + webAuthN, err := webauthn.New(&webauthn.Config{ + RPDisplayName: config.DisplayName, + RPID: config.ID, + RPOrigin: config.Origin, }) if err != nil { return nil, err } return &WebAuthN{ - webLogin: webLogin, - webConsole: webConsole, + webAuthN: webAuthN, }, err } @@ -78,7 +73,7 @@ func (w *WebAuthN) BeginRegistration(user *domain.Human, accountName string, aut CredentialID: cred.ID, } } - credentialOptions, sessionData, err := w.web(isLoginUI).BeginRegistration( + credentialOptions, sessionData, err := w.webAuthN.BeginRegistration( &webUser{ Human: user, accountName: accountName, @@ -115,7 +110,7 @@ func (w *WebAuthN) FinishRegistration(user *domain.Human, webAuthN *domain.WebAu return nil, caos_errs.ThrowInternal(err, "WEBAU-sEr8c", "Errors.User.WebAuthN.ErrorOnParseCredential") } sessionData := WebAuthNToSessionData(webAuthN) - credential, err := w.web(isLoginUI).CreateCredential( + credential, err := w.webAuthN.CreateCredential( &webUser{ Human: user, }, @@ -135,7 +130,7 @@ func (w *WebAuthN) FinishRegistration(user *domain.Human, webAuthN *domain.WebAu } func (w *WebAuthN) BeginLogin(user *domain.Human, userVerification domain.UserVerificationRequirement, isLoginUI bool, webAuthNs ...*domain.WebAuthNToken) (*domain.WebAuthNLogin, error) { - assertion, sessionData, err := w.web(isLoginUI).BeginLogin(&webUser{ + assertion, sessionData, err := w.webAuthN.BeginLogin(&webUser{ Human: user, credentials: WebAuthNsToCredentials(webAuthNs), }, webauthn.WithUserVerification(UserVerificationFromDomain(userVerification))) @@ -163,7 +158,7 @@ func (w *WebAuthN) FinishLogin(user *domain.Human, webAuthN *domain.WebAuthNLogi Human: user, credentials: WebAuthNsToCredentials(webAuthNs), } - credential, err := w.web(isLoginUI).ValidateLogin(webUser, WebAuthNLoginToSessionData(webAuthN), assertionData) + credential, err := w.webAuthN.ValidateLogin(webUser, WebAuthNLoginToSessionData(webAuthN), assertionData) if err != nil { return nil, 0, caos_errs.ThrowInternal(err, "WEBAU-3M9si", "Errors.User.WebAuthN.ValidateLoginFailed") } @@ -173,10 +168,3 @@ func (w *WebAuthN) FinishLogin(user *domain.Human, webAuthN *domain.WebAuthNLogi } return credential.ID, credential.Authenticator.SignCount, nil } - -func (w *WebAuthN) web(isLoginUI bool) *webauthn.WebAuthn { - if isLoginUI { - return w.webLogin - } - return w.webConsole -} diff --git a/openapi/handler.go b/openapi/handler.go index a245826ebe..c7b7124164 100644 --- a/openapi/handler.go +++ b/openapi/handler.go @@ -4,16 +4,21 @@ import ( "net/http" "github.com/rakyll/statik/fs" + "github.com/rs/cors" _ "github.com/caos/zitadel/openapi/statik" ) +const ( + HandlerPrefix = "/openapi/v2/swagger" +) + func Start() (http.Handler, error) { statikFS, err := fs.NewWithNamespace("swagger") if err != nil { return nil, err } handler := &http.ServeMux{} - handler.Handle("/", http.FileServer(statikFS)) + handler.Handle("/", cors.AllowAll().Handler(http.FileServer(statikFS))) return handler, nil }