From cb03d3acaeac7239b81a7b729e6d28c77e4e2bc5 Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Mon, 13 Jan 2025 15:21:23 +0800 Subject: [PATCH 01/33] Support updating twilio secrets in app mutation --- pkg/lib/config/secret_update_instruction.go | 67 +++++++++++++++++++++ pkg/portal/graphql/app_mutation.go | 39 ++++++++++++ 2 files changed, 106 insertions(+) diff --git a/pkg/lib/config/secret_update_instruction.go b/pkg/lib/config/secret_update_instruction.go index 2e48ff2e7e..2e96bff99e 100644 --- a/pkg/lib/config/secret_update_instruction.go +++ b/pkg/lib/config/secret_update_instruction.go @@ -29,6 +29,7 @@ type SecretConfigUpdateInstruction struct { BotProtectionProviderCredentialsUpdateInstruction *BotProtectionProviderCredentialsUpdateInstruction `json:"botProtectionProviderSecret,omitempty"` SAMLIdpSigningSecretsUpdateInstruction *SAMLIdpSigningSecretsUpdateInstruction `json:"samlIdpSigningSecrets,omitempty"` SAMLSpSigningSecretsUpdateInstruction *SAMLSpSigningSecretsUpdateInstruction `json:"samlSpSigningSecrets,omitempty"` + SMSProviderSecretsUpdateInstruction *SMSProviderSecretsUpdateInstruction `json:"smsProviderSecrets,omitempty"` } func (i *SecretConfigUpdateInstruction) ApplyTo(ctx *SecretConfigUpdateInstructionContext, currentConfig *SecretConfig) (*SecretConfig, error) { @@ -766,6 +767,71 @@ func (i *SAMLSpSigningSecretsUpdateInstruction) set(currentConfig *SecretConfig) return out, nil } +type SMSProviderSecretsUpdateInstructionSetData struct { + TwilioCredentials *SMSProviderSecretsUpdateInstructionTwilioCredentials `json:"twilioCredentials,omitempty"` +} + +type SMSProviderSecretsUpdateInstructionTwilioCredentials struct { + AccountSID string `json:"accountSid,omitempty"` + AuthToken string `json:"authToken,omitempty"` + MessagingServiceSID string `json:"messageServiceSid,omitempty"` +} + +type SMSProviderSecretsUpdateInstruction struct { + Action SecretUpdateInstructionAction `json:"action,omitempty"` + SetData *SMSProviderSecretsUpdateInstructionSetData `json:"setData,omitempty"` +} + +func (i *SMSProviderSecretsUpdateInstruction) ApplyTo(ctx *SecretConfigUpdateInstructionContext, currentConfig *SecretConfig) (*SecretConfig, error) { + switch i.Action { + case SecretUpdateInstructionActionSet: + return i.set(currentConfig) + default: + return nil, fmt.Errorf("config: unexpected action for SMSProviderSecretsUpdateInstruction: %s", i.Action) + } +} + +func (i *SMSProviderSecretsUpdateInstruction) set(currentConfig *SecretConfig) (*SecretConfig, error) { + out := &SecretConfig{} + for _, item := range currentConfig.Secrets { + out.Secrets = append(out.Secrets, item) + } + + if i.SetData == nil { + return nil, fmt.Errorf("config: missing SetData for SMSProviderSecretsUpdateInstruction") + } + + upsert := func(credentialKey SecretKey, secrets any) error { + var data []byte + data, err := json.Marshal(secrets) + if err != nil { + return err + } + newSecretItem := SecretItem{ + Key: credentialKey, + RawData: json.RawMessage(data), + } + + idx, _, found := out.LookupDataWithIndex(credentialKey) + if found { + out.Secrets[idx] = newSecretItem + } else { + out.Secrets = append(out.Secrets, newSecretItem) + } + return nil + } + + if i.SetData.TwilioCredentials != nil { + twilioCredentials := TwilioCredentials{ + AccountSID: i.SetData.TwilioCredentials.AccountSID, + AuthToken: i.SetData.TwilioCredentials.AuthToken, + MessagingServiceSID: i.SetData.TwilioCredentials.MessagingServiceSID, + } + upsert(TwilioCredentialsKey, twilioCredentials) + } + return out, nil +} + var _ SecretConfigUpdateInstructionInterface = &SecretConfigUpdateInstruction{} var _ SecretConfigUpdateInstructionInterface = &OAuthSSOProviderCredentialsUpdateInstruction{} var _ SecretConfigUpdateInstructionInterface = &SMTPServerCredentialsUpdateInstruction{} @@ -774,3 +840,4 @@ var _ SecretConfigUpdateInstructionInterface = &AdminAPIAuthKeyUpdateInstruction var _ SecretConfigUpdateInstructionInterface = &BotProtectionProviderCredentialsUpdateInstruction{} var _ SecretConfigUpdateInstructionInterface = &SAMLIdpSigningSecretsUpdateInstruction{} var _ SecretConfigUpdateInstructionInterface = &SAMLSpSigningSecretsUpdateInstruction{} +var _ SecretConfigUpdateInstructionInterface = &SMSProviderSecretsUpdateInstruction{} diff --git a/pkg/portal/graphql/app_mutation.go b/pkg/portal/graphql/app_mutation.go index 0d0c00cd66..bde4d349df 100644 --- a/pkg/portal/graphql/app_mutation.go +++ b/pkg/portal/graphql/app_mutation.go @@ -133,6 +133,30 @@ var samlSpSigningSecretsSetDataInput = graphql.NewInputObject(graphql.InputObjec }, }) +var smsProviderSecretsSetDataInput = graphql.NewInputObject(graphql.InputObjectConfig{ + Name: "SMSProviderSecretsSetDataInput", + Fields: graphql.InputObjectConfigFieldMap{ + "twilioCredentials": &graphql.InputObjectFieldConfig{ + Type: smsProviderTwilioCredentials, + }, + }, +}) + +var smsProviderTwilioCredentials = graphql.NewInputObject(graphql.InputObjectConfig{ + Name: "SMSProviderTwilioCredentials", + Fields: graphql.InputObjectConfigFieldMap{ + "accountSid": &graphql.InputObjectFieldConfig{ + Type: graphql.NewNonNull(graphql.String), + }, + "authToken": &graphql.InputObjectFieldConfig{ + Type: graphql.NewNonNull(graphql.String), + }, + "messageServiceSid": &graphql.InputObjectFieldConfig{ + Type: graphql.NewNonNull(graphql.String), + }, + }, +}) + var smtpSecretUpdateInstructionsInput = graphql.NewInputObject(graphql.InputObjectConfig{ Name: "SmtpSecretUpdateInstructionsInput", Fields: graphql.InputObjectConfigFieldMap{ @@ -196,6 +220,18 @@ var samlSpSigningSecretsUpdateInstructionsInput = graphql.NewInputObject(graphql }, }) +var smsProviderSecretsUpdateInstructionsInput = graphql.NewInputObject(graphql.InputObjectConfig{ + Name: "SMSProviderSecretsUpdateInstructionsInput", + Fields: graphql.InputObjectConfigFieldMap{ + "action": &graphql.InputObjectFieldConfig{ + Type: graphql.NewNonNull(graphql.String), + }, + "setData": &graphql.InputObjectFieldConfig{ + Type: smsProviderSecretsSetDataInput, + }, + }, +}) + var adminAPIAuthKeyUpdateInstructionInput = graphql.NewInputObject(graphql.InputObjectConfig{ Name: "AdminAPIAuthKeyUpdateInstructionInput", Fields: graphql.InputObjectConfigFieldMap{ @@ -256,6 +292,9 @@ var secretConfigUpdateInstructionsInput = graphql.NewInputObject(graphql.InputOb "samlSpSigningSecrets": &graphql.InputObjectFieldConfig{ Type: samlSpSigningSecretsUpdateInstructionsInput, }, + "smsProviderSecrets": &graphql.InputObjectFieldConfig{ + Type: smsProviderSecretsUpdateInstructionsInput, + }, }, }) From a903b2e46995d36b8816df60d7b649fde21dde74 Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Mon, 13 Jan 2025 15:51:55 +0800 Subject: [PATCH 02/33] Support querying twilio credentials in app query --- pkg/portal/graphql/app.go | 45 +++++++++++++++++++++++++----- pkg/portal/graphql/app_mutation.go | 8 +++--- pkg/portal/model/app.go | 24 ++++++++++++++++ 3 files changed, 66 insertions(+), 11 deletions(-) diff --git a/pkg/portal/graphql/app.go b/pkg/portal/graphql/app.go index af701efb78..70f5b61db1 100644 --- a/pkg/portal/graphql/app.go +++ b/pkg/portal/graphql/app.go @@ -171,6 +171,32 @@ var samlSpSigningSecret = graphql.NewObject(graphql.ObjectConfig{ }, }) +var smsProviderTwilioCredentials = graphql.NewObject(graphql.ObjectConfig{ + Name: "SMSProviderSecrets", + Description: "SMS Provider secrets", + Fields: graphql.Fields{ + "accountSid": &graphql.Field{ + Type: graphql.NewNonNull(graphql.String), + }, + "authToken": &graphql.Field{ + Type: graphql.NewNonNull(graphql.String), + }, + "messageServiceSid": &graphql.Field{ + Type: graphql.NewNonNull(graphql.String), + }, + }, +}) + +var smsProviderSecret = graphql.NewObject(graphql.ObjectConfig{ + Name: "SMSProviderSecrets", + Description: "SMS Provider secrets", + Fields: graphql.Fields{ + "twilioCredentials": &graphql.Field{ + Type: smsProviderTwilioCredentials, + }, + }, +}) + type AppSecretKey string const ( @@ -182,6 +208,7 @@ const ( AppSecretKeyBotProtectionProviderSecret AppSecretKey = "botProtectionProviderSecret" AppSecretKeySAMLIdpSigningSecrets AppSecretKey = "samlIdpSigningSecrets" // nolint:gosec AppSecretKeySAMLSpSigningSecrets AppSecretKey = "samlSpSigningSecrets" // nolint:gosec + AppSecretKeySMSProviderSecrets AppSecretKey = "smsProviderSecrets" // nolint:gosec ) var secretConfig = graphql.NewObject(graphql.ObjectConfig{ @@ -212,6 +239,9 @@ var secretConfig = graphql.NewObject(graphql.ObjectConfig{ string(AppSecretKeySAMLSpSigningSecrets): &graphql.Field{ Type: graphql.NewList(graphql.NewNonNull(samlSpSigningSecret)), }, + string(AppSecretKeySMSProviderSecrets): &graphql.Field{ + Type: graphql.NewList(graphql.NewNonNull(smsProviderSecret)), + }, }, }) @@ -245,13 +275,14 @@ var appSecretKey = graphql.NewEnum(graphql.EnumConfig{ }, }) -var secretKeyToConfigKeyMap map[AppSecretKey]config.SecretKey = map[AppSecretKey]config.SecretKey{ - AppSecretKeyOauthSSOProviderClientSecrets: config.OAuthSSOProviderCredentialsKey, - AppSecretKeyWebhookSecret: config.WebhookKeyMaterialsKey, - AppSecretKeyAdminAPISecrets: config.AdminAPIAuthKeyKey, - AppSecretKeySmtpSecret: config.SMTPServerCredentialsKey, - AppSecretKeyOauthClientSecrets: config.OAuthClientCredentialsKey, - AppSecretKeyBotProtectionProviderSecret: config.BotProtectionProviderCredentialsKey, +var secretKeyToConfigKeyMap map[AppSecretKey][]config.SecretKey = map[AppSecretKey][]config.SecretKey{ + AppSecretKeyOauthSSOProviderClientSecrets: {config.OAuthSSOProviderCredentialsKey}, + AppSecretKeyWebhookSecret: {config.WebhookKeyMaterialsKey}, + AppSecretKeyAdminAPISecrets: {config.AdminAPIAuthKeyKey}, + AppSecretKeySmtpSecret: {config.SMTPServerCredentialsKey}, + AppSecretKeyOauthClientSecrets: {config.OAuthClientCredentialsKey}, + AppSecretKeyBotProtectionProviderSecret: {config.BotProtectionProviderCredentialsKey}, + AppSecretKeySMSProviderSecrets: {config.TwilioCredentialsKey, config.CustomSMSProviderConfigKey}, } const typeApp = "App" diff --git a/pkg/portal/graphql/app_mutation.go b/pkg/portal/graphql/app_mutation.go index bde4d349df..0ff1a3e02e 100644 --- a/pkg/portal/graphql/app_mutation.go +++ b/pkg/portal/graphql/app_mutation.go @@ -137,13 +137,13 @@ var smsProviderSecretsSetDataInput = graphql.NewInputObject(graphql.InputObjectC Name: "SMSProviderSecretsSetDataInput", Fields: graphql.InputObjectConfigFieldMap{ "twilioCredentials": &graphql.InputObjectFieldConfig{ - Type: smsProviderTwilioCredentials, + Type: smsProviderTwilioCredentialsInput, }, }, }) -var smsProviderTwilioCredentials = graphql.NewInputObject(graphql.InputObjectConfig{ - Name: "SMSProviderTwilioCredentials", +var smsProviderTwilioCredentialsInput = graphql.NewInputObject(graphql.InputObjectConfig{ + Name: "SMSProviderTwilioCredentialsInput", Fields: graphql.InputObjectConfigFieldMap{ "accountSid": &graphql.InputObjectFieldConfig{ Type: graphql.NewNonNull(graphql.String), @@ -747,7 +747,7 @@ var _ = registerMutationField( appSecretKey := s.(AppSecretKey) appSecretKeys = append(appSecretKeys, string(appSecretKey)) configSecretKey := secretKeyToConfigKeyMap[appSecretKey] - secrets = append(secrets, configSecretKey) + secrets = append(secrets, configSecretKey...) } resolvedNodeID := relay.FromGlobalID(appNodeID) diff --git a/pkg/portal/model/app.go b/pkg/portal/model/app.go index 6a6a422091..4b1a8acef9 100644 --- a/pkg/portal/model/app.go +++ b/pkg/portal/model/app.go @@ -84,6 +84,16 @@ type SAMLSpSigningSecrets struct { Certificates []SAMLSpSigningCertificate `json:"certificates,omitempty"` } +type SMSProviderTwilioCredentials struct { + AccountSID string `json:"accountSid,omitempty"` + AuthToken string `json:"authToken,omitempty"` + MessageServiceSID string `json:"messageServiceSid,omitempty"` +} + +type SMSProviderSecrets struct { + TwilioCredentials *SMSProviderTwilioCredentials `json:"twilioCredentials,omitempty"` +} + type SecretConfig struct { OAuthSSOProviderClientSecrets []OAuthSSOProviderClientSecret `json:"oauthSSOProviderClientSecrets,omitempty"` WebhookSecret *WebhookSecret `json:"webhookSecret,omitempty"` @@ -93,6 +103,7 @@ type SecretConfig struct { BotProtectionProviderSecret *BotProtectionProviderSecret `json:"botProtectionProviderSecret,omitempty"` SAMLIdpSigningSecrets *SAMLIdpSigningSecrets `json:"samlIdpSigningSecrets,omitempty"` SAMLSpSigningSecrets []SAMLSpSigningSecrets `json:"samlSpSigningSecrets,omitempty"` + SMSProviderSecrets *SMSProviderSecrets `json:"smsProviderSecrets,omitempty"` } //nolint:gocognit @@ -248,6 +259,19 @@ func NewSecretConfig(secretConfig *config.SecretConfig, unmaskedSecrets []config out.SAMLSpSigningSecrets = toPortalSAMLSpSigningSecrets(samlSpSigningSecrets) } + smsProviderSecrets := &SMSProviderSecrets{} + if twilioCredentials, ok := secretConfig.LookupData(config.TwilioCredentialsKey).(*config.TwilioCredentials); ok { + smsProviderSecrets.TwilioCredentials = &SMSProviderTwilioCredentials{ + AccountSID: twilioCredentials.AccountSID, + MessageServiceSID: twilioCredentials.MessagingServiceSID, + } + if _, exist := unmaskedSecretsSet[config.TwilioCredentialsKey]; exist { + smsProviderSecrets.TwilioCredentials.AuthToken = twilioCredentials.AuthToken + } + + } + out.SMSProviderSecrets = smsProviderSecrets + return out, nil } From dff817c3c9c3a91d18783a02aae978055b9635c4 Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Mon, 13 Jan 2025 16:00:41 +0800 Subject: [PATCH 03/33] Make it easier for portal to distinguish masked secrets and empty secrets --- pkg/portal/graphql/app_mutation.go | 2 +- pkg/portal/model/app.go | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/portal/graphql/app_mutation.go b/pkg/portal/graphql/app_mutation.go index 0ff1a3e02e..99cd4b3312 100644 --- a/pkg/portal/graphql/app_mutation.go +++ b/pkg/portal/graphql/app_mutation.go @@ -149,7 +149,7 @@ var smsProviderTwilioCredentialsInput = graphql.NewInputObject(graphql.InputObje Type: graphql.NewNonNull(graphql.String), }, "authToken": &graphql.InputObjectFieldConfig{ - Type: graphql.NewNonNull(graphql.String), + Type: graphql.String, }, "messageServiceSid": &graphql.InputObjectFieldConfig{ Type: graphql.NewNonNull(graphql.String), diff --git a/pkg/portal/model/app.go b/pkg/portal/model/app.go index 4b1a8acef9..9f727c2bc1 100644 --- a/pkg/portal/model/app.go +++ b/pkg/portal/model/app.go @@ -85,9 +85,9 @@ type SAMLSpSigningSecrets struct { } type SMSProviderTwilioCredentials struct { - AccountSID string `json:"accountSid,omitempty"` - AuthToken string `json:"authToken,omitempty"` - MessageServiceSID string `json:"messageServiceSid,omitempty"` + AccountSID string `json:"accountSid,omitempty"` + AuthToken *string `json:"authToken,omitempty"` + MessageServiceSID string `json:"messageServiceSid,omitempty"` } type SMSProviderSecrets struct { @@ -266,7 +266,7 @@ func NewSecretConfig(secretConfig *config.SecretConfig, unmaskedSecrets []config MessageServiceSID: twilioCredentials.MessagingServiceSID, } if _, exist := unmaskedSecretsSet[config.TwilioCredentialsKey]; exist { - smsProviderSecrets.TwilioCredentials.AuthToken = twilioCredentials.AuthToken + smsProviderSecrets.TwilioCredentials.AuthToken = &twilioCredentials.AuthToken } } From 85c90ee7d752e1789785d1f01385bb4dbbe3eb0f Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Mon, 13 Jan 2025 16:24:05 +0800 Subject: [PATCH 04/33] Support updating custom sms provider secrets in app mutation --- pkg/lib/config/secret_update_instruction.go | 14 ++++++++++++++ pkg/portal/graphql/app_mutation.go | 15 +++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/pkg/lib/config/secret_update_instruction.go b/pkg/lib/config/secret_update_instruction.go index 2e96bff99e..7213fff0b7 100644 --- a/pkg/lib/config/secret_update_instruction.go +++ b/pkg/lib/config/secret_update_instruction.go @@ -769,6 +769,7 @@ func (i *SAMLSpSigningSecretsUpdateInstruction) set(currentConfig *SecretConfig) type SMSProviderSecretsUpdateInstructionSetData struct { TwilioCredentials *SMSProviderSecretsUpdateInstructionTwilioCredentials `json:"twilioCredentials,omitempty"` + CustomSMSProvider *SMSProviderSecretsUpdateInstructionCustomSMSProvider `json:"customSmsProvider,omitempty"` } type SMSProviderSecretsUpdateInstructionTwilioCredentials struct { @@ -777,6 +778,11 @@ type SMSProviderSecretsUpdateInstructionTwilioCredentials struct { MessagingServiceSID string `json:"messageServiceSid,omitempty"` } +type SMSProviderSecretsUpdateInstructionCustomSMSProvider struct { + URL string `json:"url,omitempty"` + Timeout *DurationSeconds `json:"timeout,omitempty"` +} + type SMSProviderSecretsUpdateInstruction struct { Action SecretUpdateInstructionAction `json:"action,omitempty"` SetData *SMSProviderSecretsUpdateInstructionSetData `json:"setData,omitempty"` @@ -829,6 +835,14 @@ func (i *SMSProviderSecretsUpdateInstruction) set(currentConfig *SecretConfig) ( } upsert(TwilioCredentialsKey, twilioCredentials) } + + if i.SetData.CustomSMSProvider != nil { + customSMSProviderConfig := CustomSMSProviderConfig{ + URL: i.SetData.CustomSMSProvider.URL, + Timeout: i.SetData.CustomSMSProvider.Timeout, + } + upsert(CustomSMSProviderConfigKey, customSMSProviderConfig) + } return out, nil } diff --git a/pkg/portal/graphql/app_mutation.go b/pkg/portal/graphql/app_mutation.go index 99cd4b3312..b98a1b0706 100644 --- a/pkg/portal/graphql/app_mutation.go +++ b/pkg/portal/graphql/app_mutation.go @@ -139,6 +139,9 @@ var smsProviderSecretsSetDataInput = graphql.NewInputObject(graphql.InputObjectC "twilioCredentials": &graphql.InputObjectFieldConfig{ Type: smsProviderTwilioCredentialsInput, }, + "customSmsProvider": &graphql.InputObjectFieldConfig{ + Type: customSmsProviderSecretsInput, + }, }, }) @@ -157,6 +160,18 @@ var smsProviderTwilioCredentialsInput = graphql.NewInputObject(graphql.InputObje }, }) +var customSmsProviderSecretsInput = graphql.NewInputObject(graphql.InputObjectConfig{ + Name: "CustomSmsProviderSecretsInput", + Fields: graphql.InputObjectConfigFieldMap{ + "url": &graphql.InputObjectFieldConfig{ + Type: graphql.NewNonNull(graphql.String), + }, + "timeout": &graphql.InputObjectFieldConfig{ + Type: graphql.NewNonNull(graphql.Int), + }, + }, +}) + var smtpSecretUpdateInstructionsInput = graphql.NewInputObject(graphql.InputObjectConfig{ Name: "SmtpSecretUpdateInstructionsInput", Fields: graphql.InputObjectConfigFieldMap{ From 0e1b7ce520f5fba29bafdf955392447e2ac792bc Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Mon, 13 Jan 2025 16:33:44 +0800 Subject: [PATCH 05/33] Support querying custom sms provider secrets in app query --- pkg/portal/graphql/app.go | 20 ++++++++++++++++++-- pkg/portal/model/app.go | 14 +++++++++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/pkg/portal/graphql/app.go b/pkg/portal/graphql/app.go index 70f5b61db1..bbf85b775c 100644 --- a/pkg/portal/graphql/app.go +++ b/pkg/portal/graphql/app.go @@ -172,8 +172,8 @@ var samlSpSigningSecret = graphql.NewObject(graphql.ObjectConfig{ }) var smsProviderTwilioCredentials = graphql.NewObject(graphql.ObjectConfig{ - Name: "SMSProviderSecrets", - Description: "SMS Provider secrets", + Name: "SMSProviderTwilioCredentials", + Description: "Twilio credentials", Fields: graphql.Fields{ "accountSid": &graphql.Field{ Type: graphql.NewNonNull(graphql.String), @@ -187,6 +187,19 @@ var smsProviderTwilioCredentials = graphql.NewObject(graphql.ObjectConfig{ }, }) +var smsProviderCustomSmsProviderSecrets = graphql.NewObject(graphql.ObjectConfig{ + Name: "SMSProviderCustomSmsProviderSecrets", + Description: "Custom SMS Provider configs", + Fields: graphql.Fields{ + "url": &graphql.Field{ + Type: graphql.NewNonNull(graphql.String), + }, + "timeout": &graphql.Field{ + Type: graphql.Int, + }, + }, +}) + var smsProviderSecret = graphql.NewObject(graphql.ObjectConfig{ Name: "SMSProviderSecrets", Description: "SMS Provider secrets", @@ -194,6 +207,9 @@ var smsProviderSecret = graphql.NewObject(graphql.ObjectConfig{ "twilioCredentials": &graphql.Field{ Type: smsProviderTwilioCredentials, }, + "customSmsProvider": &graphql.Field{ + Type: smsProviderCustomSmsProviderSecrets, + }, }, }) diff --git a/pkg/portal/model/app.go b/pkg/portal/model/app.go index 9f727c2bc1..7ef2ba5714 100644 --- a/pkg/portal/model/app.go +++ b/pkg/portal/model/app.go @@ -90,8 +90,14 @@ type SMSProviderTwilioCredentials struct { MessageServiceSID string `json:"messageServiceSid,omitempty"` } +type SMSProviderCustomSMSProviderConfigs struct { + URL string `json:"url,omitempty"` + Timeout *int `json:"timeout,omitempty"` +} + type SMSProviderSecrets struct { - TwilioCredentials *SMSProviderTwilioCredentials `json:"twilioCredentials,omitempty"` + TwilioCredentials *SMSProviderTwilioCredentials `json:"twilioCredentials,omitempty"` + CustomSMSProvider *SMSProviderCustomSMSProviderConfigs `json:"customSmsProvider,omitempty"` } type SecretConfig struct { @@ -270,6 +276,12 @@ func NewSecretConfig(secretConfig *config.SecretConfig, unmaskedSecrets []config } } + if customSMSProviderConfig, ok := secretConfig.LookupData(config.CustomSMSProviderConfigKey).(*config.CustomSMSProviderConfig); ok { + smsProviderSecrets.CustomSMSProvider = &SMSProviderCustomSMSProviderConfigs{ + URL: customSMSProviderConfig.URL, + Timeout: (*int)(customSMSProviderConfig.Timeout), + } + } out.SMSProviderSecrets = smsProviderSecrets return out, nil From 36677241407fbb230b1413c03b4dd2b22d0ac3ba Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Mon, 13 Jan 2025 17:32:35 +0800 Subject: [PATCH 06/33] Regenerate graphql schema and types --- .../graphql/portal/globalTypes.generated.ts | 45 +++++++++++ portal/src/graphql/portal/schema.graphql | 75 +++++++++++++++++++ 2 files changed, 120 insertions(+) diff --git a/portal/src/graphql/portal/globalTypes.generated.ts b/portal/src/graphql/portal/globalTypes.generated.ts index 2825bf63df..c1068d3bf0 100644 --- a/portal/src/graphql/portal/globalTypes.generated.ts +++ b/portal/src/graphql/portal/globalTypes.generated.ts @@ -247,6 +247,11 @@ export type CreateDomainPayload = { domain: Domain; }; +export type CustomSmsProviderSecretsInput = { + timeout: Scalars['Int']['input']; + url: Scalars['String']['input']; +}; + export type DataPoint = { __typename?: 'DataPoint'; data: Scalars['Float']['output']; @@ -667,6 +672,44 @@ export type SamlSpSigningSecretsUpdateInstructionsInput = { setData?: InputMaybe; }; +/** Custom SMS Provider configs */ +export type SmsProviderCustomSmsProviderSecrets = { + __typename?: 'SMSProviderCustomSmsProviderSecrets'; + timeout?: Maybe; + url: Scalars['String']['output']; +}; + +/** SMS Provider secrets */ +export type SmsProviderSecrets = { + __typename?: 'SMSProviderSecrets'; + customSmsProvider?: Maybe; + twilioCredentials?: Maybe; +}; + +export type SmsProviderSecretsSetDataInput = { + customSmsProvider?: InputMaybe; + twilioCredentials?: InputMaybe; +}; + +export type SmsProviderSecretsUpdateInstructionsInput = { + action: Scalars['String']['input']; + setData?: InputMaybe; +}; + +/** Twilio credentials */ +export type SmsProviderTwilioCredentials = { + __typename?: 'SMSProviderTwilioCredentials'; + accountSid: Scalars['String']['output']; + authToken: Scalars['String']['output']; + messageServiceSid: Scalars['String']['output']; +}; + +export type SmsProviderTwilioCredentialsInput = { + accountSid: Scalars['String']['input']; + authToken?: InputMaybe; + messageServiceSid: Scalars['String']['input']; +}; + /** SMTP secret */ export type SmtpSecret = { __typename?: 'SMTPSecret'; @@ -697,6 +740,7 @@ export type SecretConfig = { oauthSSOProviderClientSecrets?: Maybe>; samlIdpSigningSecrets?: Maybe; samlSpSigningSecrets?: Maybe>; + smsProviderSecrets?: Maybe>; smtpSecret?: Maybe; webhookSecret?: Maybe; }; @@ -708,6 +752,7 @@ export type SecretConfigUpdateInstructionsInput = { oauthSSOProviderClientSecrets?: InputMaybe; samlIdpSigningSecrets?: InputMaybe; samlSpSigningSecrets?: InputMaybe; + smsProviderSecrets?: InputMaybe; smtpSecret?: InputMaybe; }; diff --git a/portal/src/graphql/portal/schema.graphql b/portal/src/graphql/portal/schema.graphql index 5d8e3bcc93..d34f98421f 100644 --- a/portal/src/graphql/portal/schema.graphql +++ b/portal/src/graphql/portal/schema.graphql @@ -329,6 +329,15 @@ type CreateDomainPayload { domain: Domain! } +"""""" +input CustomSmsProviderSecretsInput { + """""" + timeout: Int! + + """""" + url: String! +} + """""" type DataPoint { """""" @@ -764,6 +773,66 @@ input SAMLSpSigningSecretsUpdateInstructionsInput { setData: SAMLSpSigningSecretsSetDataInput } +"""Custom SMS Provider configs""" +type SMSProviderCustomSmsProviderSecrets { + """""" + timeout: Int + + """""" + url: String! +} + +"""SMS Provider secrets""" +type SMSProviderSecrets { + """""" + customSmsProvider: SMSProviderCustomSmsProviderSecrets + + """""" + twilioCredentials: SMSProviderTwilioCredentials +} + +"""""" +input SMSProviderSecretsSetDataInput { + """""" + customSmsProvider: CustomSmsProviderSecretsInput + + """""" + twilioCredentials: SMSProviderTwilioCredentialsInput +} + +"""""" +input SMSProviderSecretsUpdateInstructionsInput { + """""" + action: String! + + """""" + setData: SMSProviderSecretsSetDataInput +} + +"""Twilio credentials""" +type SMSProviderTwilioCredentials { + """""" + accountSid: String! + + """""" + authToken: String! + + """""" + messageServiceSid: String! +} + +"""""" +input SMSProviderTwilioCredentialsInput { + """""" + accountSid: String! + + """""" + authToken: String + + """""" + messageServiceSid: String! +} + """SMTP secret""" type SMTPSecret { """""" @@ -820,6 +889,9 @@ type SecretConfig { """""" samlSpSigningSecrets: [SAMLSpSigningSecrets!] + """""" + smsProviderSecrets: [SMSProviderSecrets!] + """""" smtpSecret: SMTPSecret @@ -847,6 +919,9 @@ input SecretConfigUpdateInstructionsInput { """""" samlSpSigningSecrets: SAMLSpSigningSecretsUpdateInstructionsInput + """""" + smsProviderSecrets: SMSProviderSecretsUpdateInstructionsInput + """""" smtpSecret: SmtpSecretUpdateInstructionsInput } From 4ff949d274bfeba8f45bd9f0b74972de570eface Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Mon, 13 Jan 2025 17:54:19 +0800 Subject: [PATCH 07/33] Fix error not checked --- pkg/lib/config/secret_update_instruction.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pkg/lib/config/secret_update_instruction.go b/pkg/lib/config/secret_update_instruction.go index 7213fff0b7..8a0606eab9 100644 --- a/pkg/lib/config/secret_update_instruction.go +++ b/pkg/lib/config/secret_update_instruction.go @@ -833,7 +833,10 @@ func (i *SMSProviderSecretsUpdateInstruction) set(currentConfig *SecretConfig) ( AuthToken: i.SetData.TwilioCredentials.AuthToken, MessagingServiceSID: i.SetData.TwilioCredentials.MessagingServiceSID, } - upsert(TwilioCredentialsKey, twilioCredentials) + err := upsert(TwilioCredentialsKey, twilioCredentials) + if err != nil { + return nil, err + } } if i.SetData.CustomSMSProvider != nil { @@ -841,7 +844,10 @@ func (i *SMSProviderSecretsUpdateInstruction) set(currentConfig *SecretConfig) ( URL: i.SetData.CustomSMSProvider.URL, Timeout: i.SetData.CustomSMSProvider.Timeout, } - upsert(CustomSMSProviderConfigKey, customSMSProviderConfig) + err := upsert(CustomSMSProviderConfigKey, customSMSProviderConfig) + if err != nil { + return nil, err + } } return out, nil } From b44a5a973a09a4a830316ed8a37bdd915c4cde53 Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Tue, 14 Jan 2025 16:27:01 +0800 Subject: [PATCH 08/33] Setup SMSProviderConfigurationScreen --- pkg/portal/graphql/app.go | 7 +- portal/src/AppRoot.tsx | 11 + .../portal/HookConfigurationScreen.tsx | 25 +- .../LocalizationConfigurationScreen.tsx | 4 +- .../portal/SMSProviderConfigurationScreen.tsx | 353 ++++++++++++++++++ .../graphql/portal/globalTypes.generated.ts | 1 + portal/src/graphql/portal/schema.graphql | 3 + portal/src/types.ts | 63 ++++ 8 files changed, 447 insertions(+), 20 deletions(-) create mode 100644 portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx diff --git a/pkg/portal/graphql/app.go b/pkg/portal/graphql/app.go index bbf85b775c..bcf84f5d13 100644 --- a/pkg/portal/graphql/app.go +++ b/pkg/portal/graphql/app.go @@ -179,7 +179,7 @@ var smsProviderTwilioCredentials = graphql.NewObject(graphql.ObjectConfig{ Type: graphql.NewNonNull(graphql.String), }, "authToken": &graphql.Field{ - Type: graphql.NewNonNull(graphql.String), + Type: graphql.String, }, "messageServiceSid": &graphql.Field{ Type: graphql.NewNonNull(graphql.String), @@ -256,7 +256,7 @@ var secretConfig = graphql.NewObject(graphql.ObjectConfig{ Type: graphql.NewList(graphql.NewNonNull(samlSpSigningSecret)), }, string(AppSecretKeySMSProviderSecrets): &graphql.Field{ - Type: graphql.NewList(graphql.NewNonNull(smsProviderSecret)), + Type: graphql.NewNonNull(smsProviderSecret), }, }, }) @@ -288,6 +288,9 @@ var appSecretKey = graphql.NewEnum(graphql.EnumConfig{ "SAML_SP_SIGNING_SECRETS": &graphql.EnumValueConfig{ Value: AppSecretKeySAMLSpSigningSecrets, }, + "SMS_PROVIDER_SECRETS": &graphql.EnumValueConfig{ + Value: AppSecretKeySMSProviderSecrets, + }, }, }) diff --git a/portal/src/AppRoot.tsx b/portal/src/AppRoot.tsx index b8a34b7f98..00fe34c24f 100644 --- a/portal/src/AppRoot.tsx +++ b/portal/src/AppRoot.tsx @@ -133,6 +133,9 @@ const SubscriptionScreen = lazy( const SMTPConfigurationScreen = lazy( async () => import("./graphql/portal/SMTPConfigurationScreen") ); +const SMSProviderConfigurationScreen = lazy( + async () => import("./graphql/portal/SMSProviderConfigurationScreen") +); const StandardAttributesConfigurationScreen = lazy( async () => import("./graphql/portal/StandardAttributesConfigurationScreen") ); @@ -779,6 +782,14 @@ const AppRoot: React.VFC = function AppRoot() { } /> + }> + + + } + /> { `; } -type HookKind = "webhook" | "denohook"; - type EventKind = "blocking" | "nonblocking"; interface BlockingEventHandler { @@ -139,19 +139,12 @@ interface ConfigFormState { secret: string | null; } -function getKind(url: string): HookKind { - if (url.startsWith("authgeardeno:")) { - return "denohook"; - } - return "webhook"; -} - function checkDirty(diff: ResourcesDiffResult | null, url: string): boolean { if (diff == null) { return false; } - const kind = getKind(url); + const kind = getHookKind(url); if (kind !== "denohook") { return false; } @@ -272,12 +265,12 @@ function makeSpecifier(url: string): ResourceSpecifier { function makeSpecifiersFromState(state: ConfigFormState): ResourceSpecifier[] { const specifiers = []; for (const h of state.blocking_handlers) { - if (getKind(h.url) === "denohook") { + if (getHookKind(h.url) === "denohook") { specifiers.push(makeSpecifier(h.url)); } } for (const h of state.non_blocking_handlers) { - if (getKind(h.url) === "denohook") { + if (getHookKind(h.url) === "denohook") { specifiers.push(makeSpecifier(h.url)); } } @@ -287,7 +280,7 @@ function makeSpecifiersFromState(state: ConfigFormState): ResourceSpecifier[] { function addMissingResources(state: FormState) { for (let i = 0; i < state.blocking_handlers.length; ++i) { const h = state.blocking_handlers[i]; - if (getKind(h.url) === "denohook") { + if (getHookKind(h.url) === "denohook") { const path = getPathFromURL(h.url); const specifier = makeSpecifier(h.url); const r = state.resources.find((r) => r.path === path); @@ -302,7 +295,7 @@ function addMissingResources(state: FormState) { } for (let i = 0; i < state.non_blocking_handlers.length; ++i) { const h = state.non_blocking_handlers[i]; - if (getKind(h.url) === "denohook") { + if (getHookKind(h.url) === "denohook") { const path = getPathFromURL(h.url); const specifier = makeSpecifier(h.url); const r = state.resources.find((r) => r.path === path); @@ -1117,7 +1110,7 @@ const HookConfigurationScreenContent: React.VFC).isRevealSecrets != null + ); +} + +enum SMSProviderType { + Twilio = "twilio", + Webhook = "webhook", + Deno = "deno", +} + +interface FormState { + enabled: boolean; + providerType: SMSProviderType; + + // twilio + twilioSID: string; + twilioAuthToken: string | null; + twilioMessagingServiceSID: string; + + // webhook + webhookURL: string; + webhookTimeout: number; + + // deno + denoHookURL: string; + denoHookTimeout: number; +} + +function constructFormState( + config: PortalAPIAppConfig, + secrets: PortalAPISecretConfig +): FormState { + let enabled: boolean; + let providerType: SMSProviderType; + + // This implementation only handles the new sms_gateway config and ignores the old sms_provider config + const isSMSGatewayIsTwilio = + config.messaging?.sms_gateway != null && + config.messaging.sms_gateway.provider === "twilio"; + const hasCustomTwilioCredentials = + secrets.smsProviderSecrets?.twilioCredentials != null; + + const isSMSGatewayIsCustom = + config.messaging?.sms_gateway != null && + config.messaging.sms_gateway.provider === "custom"; + const hasCustomProviderSecrets = + secrets.smsProviderSecrets?.customSmsProvider != null; + + if (isSMSGatewayIsTwilio && hasCustomTwilioCredentials) { + enabled = true; + providerType = SMSProviderType.Twilio; + } else if (isSMSGatewayIsCustom && hasCustomProviderSecrets) { + enabled = true; + if ( + getHookKind(secrets.smsProviderSecrets!.customSmsProvider!.url) === + "denohook" + ) { + } + providerType = + getHookKind(secrets.smsProviderSecrets!.customSmsProvider!.url) === + "denohook" + ? SMSProviderType.Deno + : SMSProviderType.Webhook; + } else { + enabled = false; + providerType = SMSProviderType.Twilio; + } + + const twilioSID = + secrets.smsProviderSecrets?.twilioCredentials?.accountSid ?? ""; + const twilioAuthToken = + secrets.smsProviderSecrets?.twilioCredentials?.authToken ?? null; + const twilioMessagingServiceSID = + secrets.smsProviderSecrets?.twilioCredentials?.messageServiceSid ?? ""; + + let webhookURL = ""; + let webhookTimeout = 30; + + let denoHookURL = ""; + let denoHookTimeout = 30; + + if (secrets.smsProviderSecrets?.customSmsProvider != null) { + if ( + getHookKind(secrets.smsProviderSecrets.customSmsProvider.url) === + "denohook" + ) { + denoHookURL = secrets.smsProviderSecrets.customSmsProvider.url; + } else { + webhookURL = secrets.smsProviderSecrets.customSmsProvider.url; + } + if (secrets.smsProviderSecrets.customSmsProvider.timeout != null) { + denoHookTimeout = secrets.smsProviderSecrets.customSmsProvider.timeout; + webhookTimeout = secrets.smsProviderSecrets.customSmsProvider.timeout; + } + } + return { + enabled, + providerType, + + twilioSID, + twilioAuthToken, + twilioMessagingServiceSID, + + webhookURL, + webhookTimeout, + + denoHookURL, + denoHookTimeout, + }; +} + +function constructConfig( + config: PortalAPIAppConfig, + secrets: PortalAPISecretConfig, + _initialState: FormState, + currentState: FormState, + _effectiveConfig: PortalAPIAppConfig +): [PortalAPIAppConfig, PortalAPISecretConfig] { + const newConfig = produce(config, (config) => { + config.messaging ??= {}; + if (!currentState.enabled) { + config.messaging.sms_gateway = undefined; + config.messaging.sms_provider = undefined; + } else { + config.messaging.sms_provider = undefined; + + let newProvider: SMSProvider; + switch (currentState.providerType) { + case SMSProviderType.Twilio: + newProvider = "twilio"; + break; + case SMSProviderType.Deno: + newProvider = "custom"; + break; + case SMSProviderType.Webhook: + newProvider = "custom"; + break; + } + + config.messaging.sms_gateway = { + provider: newProvider, + use_config_from: "authgear.secrets.yaml", + }; + } + }); + + const newSecrets = produce(secrets, (secrets) => { + if (!currentState.enabled) { + secrets.smsProviderSecrets = null; + } else { + switch (currentState.providerType) { + case SMSProviderType.Twilio: + secrets.smsProviderSecrets = { + twilioCredentials: { + accountSid: currentState.twilioSID, + authToken: currentState.twilioAuthToken, + messageServiceSid: currentState.twilioMessagingServiceSID, + }, + }; + break; + case SMSProviderType.Webhook: + secrets.smsProviderSecrets = { + customSmsProvider: { + url: currentState.webhookURL, + timeout: currentState.webhookTimeout, + }, + }; + break; + case SMSProviderType.Deno: + secrets.smsProviderSecrets = { + customSmsProvider: { + url: currentState.denoHookURL, + timeout: currentState.denoHookTimeout, + }, + }; + break; + } + } + }); + return [newConfig, newSecrets]; +} + +function constructSecretUpdateInstruction( + _config: PortalAPIAppConfig, + secrets: PortalAPISecretConfig, + currentState: FormState +): PortalAPISecretConfigUpdateInstruction | undefined { + if (!currentState.enabled || !secrets.smsProviderSecrets) { + return undefined; + } + + switch (currentState.providerType) { + case SMSProviderType.Twilio: + if (secrets.smsProviderSecrets.twilioCredentials == null) { + console.error("unexpected null twilioCredentials"); + return undefined; + } + if (secrets.smsProviderSecrets.twilioCredentials.authToken == null) { + console.error("unexpected masked twilioCredentials"); + return undefined; + } + return { + smsProviderSecrets: { + action: "set", + setData: { + twilioCredentials: { + accountSid: + secrets.smsProviderSecrets.twilioCredentials.accountSid, + authToken: secrets.smsProviderSecrets.twilioCredentials.authToken, + messageServiceSid: + secrets.smsProviderSecrets.twilioCredentials.messageServiceSid, + }, + }, + }, + }; + case SMSProviderType.Webhook: + if (secrets.smsProviderSecrets.customSmsProvider == null) { + console.error("unexpected null customSmsProvider"); + return undefined; + } + return { + smsProviderSecrets: { + action: "set", + setData: { + customSmsProvider: { + url: secrets.smsProviderSecrets.customSmsProvider.url, + timeout: secrets.smsProviderSecrets.customSmsProvider.timeout, + }, + }, + }, + }; + case SMSProviderType.Deno: + if (secrets.smsProviderSecrets.customSmsProvider == null) { + console.error("unexpected null customSmsProvider"); + return undefined; + } + return { + smsProviderSecrets: { + action: "set", + setData: { + customSmsProvider: { + url: secrets.smsProviderSecrets.customSmsProvider.url, + timeout: secrets.smsProviderSecrets.customSmsProvider.timeout, + }, + }, + }, + }; + } +} + +const SMSProviderConfigurationScreen: React.VFC = + function SMSProviderConfigurationScreen() { + const { appID } = useParams() as { appID: string }; + const location = useLocation(); + const [shouldRefreshToken] = useState(() => { + const { state } = location; + if (isLocationState(state) && state.isRevealSecrets) { + return true; + } + return false; + }); + useLocationEffect(() => { + // Pop the location state if exist + }); + const { token, loading, error, retry } = useAppSecretVisitToken( + appID, + SECRETS, + shouldRefreshToken + ); + + if (error) { + return ; + } + + if (loading || token === undefined) { + return ; + } + + return ( + + ); + }; + +export default SMSProviderConfigurationScreen; + +function SMSProviderConfigurationScreen1({ + appID, + secretToken, +}: { + appID: string; + secretToken: string | null; +}) { + const form = useAppSecretConfigForm({ + appID, + secretVisitToken: secretToken, + constructFormState, + constructConfig, + constructSecretUpdateInstruction, + }); + const featureConfig = useAppFeatureConfigQuery(appID); + + if (form.isLoading || featureConfig.loading) { + return ; + } + + if (form.loadError ?? featureConfig.error) { + return ( + { + form.reload(); + featureConfig.refetch().finally(() => {}); + }} + /> + ); + } + + return ( + + {/* FIXME */} + {/* */} + + ); +} diff --git a/portal/src/graphql/portal/globalTypes.generated.ts b/portal/src/graphql/portal/globalTypes.generated.ts index c1068d3bf0..0ad7943d4c 100644 --- a/portal/src/graphql/portal/globalTypes.generated.ts +++ b/portal/src/graphql/portal/globalTypes.generated.ts @@ -138,6 +138,7 @@ export enum AppSecretKey { OauthSsoProviderClientSecrets = 'OAUTH_SSO_PROVIDER_CLIENT_SECRETS', SamlIdpSigningSecrets = 'SAML_IDP_SIGNING_SECRETS', SamlSpSigningSecrets = 'SAML_SP_SIGNING_SECRETS', + SmsProviderSecrets = 'SMS_PROVIDER_SECRETS', SmtpSecret = 'SMTP_SECRET', WebhookSecret = 'WEBHOOK_SECRET' } diff --git a/portal/src/graphql/portal/schema.graphql b/portal/src/graphql/portal/schema.graphql index d34f98421f..2ef14c5b66 100644 --- a/portal/src/graphql/portal/schema.graphql +++ b/portal/src/graphql/portal/schema.graphql @@ -169,6 +169,9 @@ enum AppSecretKey { """""" SAML_SP_SIGNING_SECRETS + """""" + SMS_PROVIDER_SECRETS + """""" SMTP_SECRET diff --git a/portal/src/types.ts b/portal/src/types.ts index caf4380fea..972ce0dcba 100644 --- a/portal/src/types.ts +++ b/portal/src/types.ts @@ -410,8 +410,24 @@ export interface VerificationRateLimitsSMSConfig { trigger_per_user?: RateLimitConfig; } +export type SMSProvider = "nexmo" | "twilio" | "custom"; + +export type SMSGatewayConfigUseConfigFrom = + | "environment_variable" + | "authgear.secrets.yaml"; + +export interface SMSGatewayConfig { + use_config_from: SMSGatewayConfigUseConfigFrom; + provider?: SMSProvider; +} + export interface MessagingConfig { rate_limits?: MessagingRateLimitsConfig; + sms_provider?: SMSProvider; // deprecated + sms_gateway?: SMSGatewayConfig; +} + +export interface MessagingFeatureConfig { template_customization_disabled?: boolean; } @@ -686,6 +702,22 @@ export interface SAMLIdpSigningSecrets { certificates: SAMLIdpSigningCertificate[]; } +export interface SMSProviderSecrets { + twilioCredentials?: SMSProviderTwilioCredentials | null; + customSmsProvider?: SMSProviderCustomSmsProviderSecrets | null; +} + +export interface SMSProviderTwilioCredentials { + accountSid: string; + authToken?: string | null; + messageServiceSid: string; +} + +export interface SMSProviderCustomSmsProviderSecrets { + url: string; + timeout?: number | null; // In seconds +} + export interface PortalAPISecretConfig { oauthSSOProviderClientSecrets?: OAuthSSOProviderClientSecret[] | null; webhookSecret?: WebhookSecret | null; @@ -695,6 +727,7 @@ export interface PortalAPISecretConfig { botProtectionProviderSecret?: BotProtectionProviderSecret | null; samlIdpSigningSecrets?: SAMLIdpSigningSecrets | null; samlSpSigningSecrets?: SAMLSpSigningSecrets[] | null; + smsProviderSecrets?: SMSProviderSecrets | null; } export interface OAuthSSOProviderClientSecretUpdateInstructionDataItem @@ -778,6 +811,27 @@ export interface SAMLIdpSigningSecretsUpdateInstruction { deleteData?: SAMLIdpSigningSecretsDeleteDataInput | null; } +export interface SMSProviderTwilioCredentialsInput { + accountSid: string; + authToken?: string | null; + messageServiceSid: string; +} + +export interface CustomSmsProviderSecretsInput { + url: string; + timeout?: number | null; +} + +export interface SMSProviderSecretsSetDataInput { + twilioCredentials?: SMSProviderTwilioCredentialsInput; + customSmsProvider?: CustomSmsProviderSecretsInput; +} + +export interface SMSProviderSecretsUpdateInstructions { + action: string; + setData?: SMSProviderSecretsSetDataInput; +} + export interface PortalAPISecretConfigUpdateInstruction { oauthSSOProviderClientSecrets?: OAuthSSOProviderClientSecretUpdateInstruction | null; smtpSecret?: SMTPSecretUpdateInstruction | null; @@ -786,6 +840,7 @@ export interface PortalAPISecretConfigUpdateInstruction { botProtectionProviderSecret?: BotProtectionProviderSecretUpdateInstruction | null; samlIdpSigningSecrets?: SAMLIdpSigningSecretsUpdateInstruction | null; samlSpSigningSecrets?: SAMLSpSigningSecretsUpdateInstruction | null; + smsProviderSecrets?: SMSProviderSecretsUpdateInstructions | null; } export interface PortalAPIApp { @@ -1090,3 +1145,11 @@ export enum SAMLBinding { export enum SAMLSigningSignatureMethod { RSASHA256 = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256", } + +export type HookKind = "webhook" | "denohook"; +export function getHookKind(url: string): HookKind { + if (url.startsWith("authgeardeno:")) { + return "denohook"; + } + return "webhook"; +} From 05de1caa7dc2a803a3c353c5b1db054bb827a844 Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Tue, 14 Jan 2025 16:30:49 +0800 Subject: [PATCH 09/33] Mark sms_provider as deprecated --- cmd/authgear/background/wire_gen.go | 2 +- pkg/admin/wire_gen.go | 2 +- pkg/auth/wire_gen.go | 342 +++++++++++----------- pkg/lib/config/messaging.go | 12 +- pkg/lib/infra/sms/client_resolver_test.go | 2 +- pkg/redisqueue/wire_gen.go | 2 +- pkg/resolver/wire_gen.go | 2 +- 7 files changed, 182 insertions(+), 182 deletions(-) diff --git a/cmd/authgear/background/wire_gen.go b/cmd/authgear/background/wire_gen.go index 2ca10386f3..3691be22af 100644 --- a/cmd/authgear/background/wire_gen.go +++ b/cmd/authgear/background/wire_gen.go @@ -693,7 +693,7 @@ func newUserService(p *deps.BackgroundProvider, appID string, appContext *config GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) diff --git a/pkg/admin/wire_gen.go b/pkg/admin/wire_gen.go index 582d685199..5c2936e16c 100644 --- a/pkg/admin/wire_gen.go +++ b/pkg/admin/wire_gen.go @@ -731,7 +731,7 @@ func newGraphQLHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) diff --git a/pkg/auth/wire_gen.go b/pkg/auth/wire_gen.go index 0490ec5c92..4597959ba0 100644 --- a/pkg/auth/wire_gen.go +++ b/pkg/auth/wire_gen.go @@ -825,7 +825,7 @@ func newOAuthAuthorizeHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -1728,7 +1728,7 @@ func newOAuthConsentHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -2615,7 +2615,7 @@ func newOAuthTokenHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -5662,7 +5662,7 @@ func newOAuthAppSessionTokenHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -6651,7 +6651,7 @@ func newAPIAnonymousUserSignupHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -7639,7 +7639,7 @@ func newAPIAnonymousUserPromotionCodeHandler(p *deps.RequestProvider) http.Handl GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -8759,7 +8759,7 @@ func newWebAppLoginHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -9770,7 +9770,7 @@ func newWebAppSignupHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -10780,7 +10780,7 @@ func newWebAppPromoteHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -11790,7 +11790,7 @@ func newWebAppSelectAccountHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -12792,7 +12792,7 @@ func newWebAppAuthflowV2VerifyBotProtectionHandler(p *deps.RequestProvider) http GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -13892,7 +13892,7 @@ func newWebAppAuthflowV2SelectAccountHandler(p *deps.RequestProvider) http.Handl GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -14894,7 +14894,7 @@ func newWebAppSSOCallbackHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -16108,7 +16108,7 @@ func newWebAppAuthflowV2SSOCallbackHandler(p *deps.RequestProvider) http.Handler GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -17326,7 +17326,7 @@ func newWechatAuthHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -18321,7 +18321,7 @@ func newWechatCallbackHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -19321,7 +19321,7 @@ func newWebAppEnterLoginIDHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -20323,7 +20323,7 @@ func newWebAppEnterPasswordHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -21322,7 +21322,7 @@ func newWebConfirmTerminateOtherSessionsHandler(p *deps.RequestProvider) http.Ha GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -22318,7 +22318,7 @@ func newWebAppUsePasskeyHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -23317,7 +23317,7 @@ func newWebAppCreatePasswordHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -24317,7 +24317,7 @@ func newWebAppCreatePasskeyHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -25316,7 +25316,7 @@ func newWebAppPromptCreatePasskeyHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -26315,7 +26315,7 @@ func newWebAppSetupTOTPHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -27316,7 +27316,7 @@ func newWebAppEnterTOTPHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -28315,7 +28315,7 @@ func newWebAppSetupOOBOTPHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -29314,7 +29314,7 @@ func newWebAppEnterOOBOTPHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -30317,7 +30317,7 @@ func newWebAppSetupWhatsappOTPHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -31316,7 +31316,7 @@ func newWebAppWhatsappOTPHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -32319,7 +32319,7 @@ func newWebAppSetupLoginLinkOTPHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -33318,7 +33318,7 @@ func newWebAppLoginLinkOTPHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -34325,7 +34325,7 @@ func newWebAppVerifyLoginLinkOTPHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -35344,7 +35344,7 @@ func newWebAppAuthflowV2VerifyLoginLinkOTPHandler(p *deps.RequestProvider) http. GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -36353,7 +36353,7 @@ func newWebAppEnterRecoveryCodeHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -37352,7 +37352,7 @@ func newWebAppSetupRecoveryCodeHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -38347,7 +38347,7 @@ func newWebAppVerifyIdentityHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -39346,7 +39346,7 @@ func newWebAppVerifyIdentitySuccessHandler(p *deps.RequestProvider) http.Handler GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -40341,7 +40341,7 @@ func newWebAppForgotPasswordHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -41346,7 +41346,7 @@ func newWebAppForgotPasswordSuccessHandler(p *deps.RequestProvider) http.Handler GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -42341,7 +42341,7 @@ func newWebAppResetPasswordHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -43338,7 +43338,7 @@ func newWebAppResetPasswordSuccessHandler(p *deps.RequestProvider) http.Handler GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -44333,7 +44333,7 @@ func newWebAppSettingsHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -45363,7 +45363,7 @@ func newWebAppAuthflowV2SettingsHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -46388,7 +46388,7 @@ func newWebAppSettingsProfileHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -47394,7 +47394,7 @@ func newWebAppSettingsProfileEditHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -48412,7 +48412,7 @@ func newWebAppAuthflowV2SettingsProfileEditHandler(p *deps.RequestProvider) http GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -49432,7 +49432,7 @@ func newWebAppSettingsIdentityHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -50435,7 +50435,7 @@ func newWebAppSettingsBiometricHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -51431,7 +51431,7 @@ func newWebAppAuthflowV2SettingsBiometricHandler(p *deps.RequestProvider) http.H GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -52467,7 +52467,7 @@ func newWebAppSettingsMFAHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -53474,7 +53474,7 @@ func newWebAppAuthflowV2SettingsMFAHandler(p *deps.RequestProvider) http.Handler GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -54482,7 +54482,7 @@ func newWebAppAuthflowV2SettingsMFAViewRecoveryCodeHandler(p *deps.RequestProvid GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -55506,7 +55506,7 @@ func newWebAppAuthflowV2SettingsMFACreatePasswordHandler(p *deps.RequestProvider GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -56540,7 +56540,7 @@ func newWebAppAuthflowV2SettingsMFAPasswordHandler(p *deps.RequestProvider) http GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -57574,7 +57574,7 @@ func newWebAppAuthflowV2SettingsMFAChangePasswordHandler(p *deps.RequestProvider GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -58597,7 +58597,7 @@ func newWebAppSettingsTOTPHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -59593,7 +59593,7 @@ func newWebAppAuthflowV2SettingsTOTPHandler(p *deps.RequestProvider) http.Handle GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -60639,7 +60639,7 @@ func newWebAppAuthflowV2SettingsMFACreateTOTPHandler(p *deps.RequestProvider) ht GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -61673,7 +61673,7 @@ func newWebAppAuthflowV2SettingsMFAEnterTOTPHandler(p *deps.RequestProvider) htt GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -62708,7 +62708,7 @@ func newWebAppAuthflowV2SettingsOOBOTPHandler(p *deps.RequestProvider) http.Hand GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -63755,7 +63755,7 @@ func newWebAppAuthflowV2SettingsMFACreateOOBOTPHandler(p *deps.RequestProvider) GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -64789,7 +64789,7 @@ func newWebAppAuthflowV2SettingsMFAEnterOOBOTPHandler(p *deps.RequestProvider) h GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -65815,7 +65815,7 @@ func newWebAppSettingsPasskeyHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -66811,7 +66811,7 @@ func newWebAppAuthflowV2SettingsChangePasskeyHandler(p *deps.RequestProvider) ht GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -67866,7 +67866,7 @@ func newWebAppSettingsOOBOTPHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -68862,7 +68862,7 @@ func newWebAppSettingsRecoveryCodeHandler(p *deps.RequestProvider) http.Handler GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -69859,7 +69859,7 @@ func newWebAppSettingsSessionsHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -70880,7 +70880,7 @@ func newWebAppAuthflowV2SettingsSessionsHandler(p *deps.RequestProvider) http.Ha GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -71913,7 +71913,7 @@ func newWebAppForceChangePasswordHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -72914,7 +72914,7 @@ func newWebAppSettingsChangePasswordHandler(p *deps.RequestProvider) http.Handle GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -73910,7 +73910,7 @@ func newWebAppAuthflowV2SettingsChangePasswordHandler(p *deps.RequestProvider) h GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -74933,7 +74933,7 @@ func newWebAppForceChangeSecondaryPasswordHandler(p *deps.RequestProvider) http. GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -75934,7 +75934,7 @@ func newWebAppSettingsChangeSecondaryPasswordHandler(p *deps.RequestProvider) ht GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -76930,7 +76930,7 @@ func newWebAppSettingsDeleteAccountHandler(p *deps.RequestProvider) http.Handler GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -77937,7 +77937,7 @@ func newWebAppAuthflowV2SettingsDeleteAccountHandler(p *deps.RequestProvider) ht GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -78955,7 +78955,7 @@ func newWebAppSettingsDeleteAccountSuccessHandler(p *deps.RequestProvider) http. GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -79954,7 +79954,7 @@ func newWebAppAuthflowV2SettingsDeleteAccountSuccessHandler(p *deps.RequestProvi GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -80953,7 +80953,7 @@ func newWebAppAuthflowV2SettingsAdvancedSettingsHandler(p *deps.RequestProvider) GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -81948,7 +81948,7 @@ func newWebAppAccountStatusHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -82943,7 +82943,7 @@ func newWebAppLogoutHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -84003,7 +84003,7 @@ func newWebAppReturnHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -84998,7 +84998,7 @@ func newWebAppErrorHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -85985,7 +85985,7 @@ func newWebAppAuthflowV2ErrorHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -87077,7 +87077,7 @@ func newWebAppCSRFErrorInstructionHandler(p *deps.RequestProvider) http.Handler GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -88177,7 +88177,7 @@ func newWebAppNotFoundHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -89172,7 +89172,7 @@ func newWebAppAuthflowV2NotFoundHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -90185,7 +90185,7 @@ func newWebAppPasskeyCreationOptionsHandler(p *deps.RequestProvider) http.Handle GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -91130,7 +91130,7 @@ func newWebAppPasskeyRequestOptionsHandler(p *deps.RequestProvider) http.Handler GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -92074,7 +92074,7 @@ func newWebAppConnectWeb3AccountHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -93079,7 +93079,7 @@ func newWebAppFeatureDisabledHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -94074,7 +94074,7 @@ func newWebAppTesterHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -95209,7 +95209,7 @@ func newAPIWorkflowNewHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -96151,7 +96151,7 @@ func newAPIWorkflowGetHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -97055,7 +97055,7 @@ func newAPIWorkflowInputHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -97995,7 +97995,7 @@ func newAPIWorkflowV2Handler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -98939,7 +98939,7 @@ func newAPIAuthenticationFlowV1CreateHandler(p *deps.RequestProvider) http.Handl GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -99957,7 +99957,7 @@ func newAPIAuthenticationFlowV1InputHandler(p *deps.RequestProvider) http.Handle GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -100941,7 +100941,7 @@ func newAPIAuthenticationFlowV1GetHandler(p *deps.RequestProvider) http.Handler GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -101979,7 +101979,7 @@ func newAPIAccountManagementV1IdentificationHandler(p *deps.RequestProvider) htt GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -102812,7 +102812,7 @@ func newAPIAccountManagementV1IdentificationOAuthHandler(p *deps.RequestProvider GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -103643,7 +103643,7 @@ func newWebAppAuthflowV2LoginHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -104760,7 +104760,7 @@ func newWebAppAuthflowV2SignupHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -105869,7 +105869,7 @@ func newWebAppAuthflowV2PromoteHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -106968,7 +106968,7 @@ func newWebAppAuthflowEnterPasswordHandler(p *deps.RequestProvider) http.Handler GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -108064,7 +108064,7 @@ func newWebAppAuthflowV2EnterPasswordHandler(p *deps.RequestProvider) http.Handl GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -109160,7 +109160,7 @@ func newWebAppAuthflowEnterOOBOTPHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -110258,7 +110258,7 @@ func newWebAppAuthflowV2EnterOOBOTPHandler(p *deps.RequestProvider) http.Handler GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -111358,7 +111358,7 @@ func newWebAppAuthflowCreatePasswordHandler(p *deps.RequestProvider) http.Handle GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -112454,7 +112454,7 @@ func newWebAppAuthflowV2CreatePasswordHandler(p *deps.RequestProvider) http.Hand GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -113552,7 +113552,7 @@ func newWebAppAuthflowEnterTOTPHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -114648,7 +114648,7 @@ func newWebAppAuthflowV2EnterTOTPHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -115744,7 +115744,7 @@ func newWebAppAuthflowSetupTOTPHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -116840,7 +116840,7 @@ func newWebAppAuthflowV2SetupTOTPHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -117932,7 +117932,7 @@ func newWebAppAuthflowViewRecoveryCodeHandler(p *deps.RequestProvider) http.Hand GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -119028,7 +119028,7 @@ func newWebAppAuthflowV2ViewRecoveryCodeHandler(p *deps.RequestProvider) http.Ha GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -120120,7 +120120,7 @@ func newWebAppAuthflowWhatsappOTPHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -121218,7 +121218,7 @@ func newWebAppAuthflowOOBOTPLinkHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -122316,7 +122316,7 @@ func newWebAppAuthflowV2OOBOTPLinkHandler(p *deps.RequestProvider) http.Handler GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -123413,7 +123413,7 @@ func newWebAppAuthflowChangePasswordHandler(p *deps.RequestProvider) http.Handle GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -124514,7 +124514,7 @@ func newWebAppAuthflowV2ChangePasswordHandler(p *deps.RequestProvider) http.Hand GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -125612,7 +125612,7 @@ func newWebAppAuthflowV2ChangePasswordSuccessHandler(p *deps.RequestProvider) ht GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -126704,7 +126704,7 @@ func newWebAppAuthflowUsePasskeyHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -127800,7 +127800,7 @@ func newWebAppAuthflowV2UsePasskeyHandler(p *deps.RequestProvider) http.Handler GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -128896,7 +128896,7 @@ func newWebAppAuthflowPromptCreatePasskeyHandler(p *deps.RequestProvider) http.H GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -129992,7 +129992,7 @@ func newWebAppAuthflowV2PromptCreatePasskeyHandler(p *deps.RequestProvider) http GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -131084,7 +131084,7 @@ func newWebAppAuthflowEnterRecoveryCodeHandler(p *deps.RequestProvider) http.Han GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -132180,7 +132180,7 @@ func newWebAppAuthflowV2EnterRecoveryCodeHandler(p *deps.RequestProvider) http.H GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -133272,7 +133272,7 @@ func newWebAppAuthflowSetupOOBOTPHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -134368,7 +134368,7 @@ func newWebAppAuthflowV2SetupOOBOTPHandler(p *deps.RequestProvider) http.Handler GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -135460,7 +135460,7 @@ func newWebAppAuthflowTerminateOtherSessionsHandler(p *deps.RequestProvider) htt GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -136556,7 +136556,7 @@ func newWebAppAuthflowV2TerminateOtherSessionsHandler(p *deps.RequestProvider) h GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -137648,7 +137648,7 @@ func newWebAppAuthflowWechatHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -138745,7 +138745,7 @@ func newWebAppAuthflowForgotPasswordHandler(p *deps.RequestProvider) http.Handle GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -139841,7 +139841,7 @@ func newWebAppAuthflowV2ForgotPasswordHandler(p *deps.RequestProvider) http.Hand GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -140939,7 +140939,7 @@ func newWebAppAuthflowForgotPasswordOTPHandler(p *deps.RequestProvider) http.Han GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -142037,7 +142037,7 @@ func newWebAppAuthflowV2ForgotPasswordOTPHandler(p *deps.RequestProvider) http.H GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -143131,7 +143131,7 @@ func newWebAppAuthflowForgotPasswordSuccessHandler(p *deps.RequestProvider) http GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -144227,7 +144227,7 @@ func newWebAppAuthflowV2ForgotPasswordLinkSentHandler(p *deps.RequestProvider) h GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -145328,7 +145328,7 @@ func newWebAppReauthHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -146313,7 +146313,7 @@ func newWebAppAuthflowV2ReauthHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -147371,7 +147371,7 @@ func newWebAppAuthflowResetPasswordHandler(p *deps.RequestProvider) http.Handler GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -148475,7 +148475,7 @@ func newWebAppAuthflowV2ResetPasswordHandler(p *deps.RequestProvider) http.Handl GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -149653,7 +149653,7 @@ func newWebAppAuthflowResetPasswordSuccessHandler(p *deps.RequestProvider) http. GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -150749,7 +150749,7 @@ func newWebAppAuthflowV2ResetPasswordSuccessHandler(p *deps.RequestProvider) htt GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -152177,7 +152177,7 @@ func newWebAppAuthflowFinishFlowHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -153273,7 +153273,7 @@ func newWebAppAuthflowV2FinishFlowHandler(p *deps.RequestProvider) http.Handler GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -154365,7 +154365,7 @@ func newWebAppAuthflowV2AccountLinkingHandler(p *deps.RequestProvider) http.Hand GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -155570,7 +155570,7 @@ func newWebAppAuthflowV2WechatHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -156663,7 +156663,7 @@ func newWebAppAuthflowV2LDAPLoginHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -158300,7 +158300,7 @@ func newSAMLLoginHandler(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -160161,7 +160161,7 @@ func newWebAppAuthflowV2SettingsProfile(p *deps.RequestProvider) http.Handler { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -161168,7 +161168,7 @@ func newWebAppAuthflowV2SettingsIdentityAddEmailHandler(p *deps.RequestProvider) GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -162190,7 +162190,7 @@ func newWebAppAuthflowV2SettingsIdentityEditEmailHandler(p *deps.RequestProvider GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -163214,7 +163214,7 @@ func newWebAppAuthflowV2SettingsIdentityListEmailHandler(p *deps.RequestProvider GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -164224,7 +164224,7 @@ func newWebAppAuthflowV2SettingsIdentityVerifyEmailHandler(p *deps.RequestProvid GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -165251,7 +165251,7 @@ func newWebAppAuthflowV2SettingsIdentityViewEmailHandler(p *deps.RequestProvider GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -166283,7 +166283,7 @@ func newWebAppAuthflowV2SettingsIdentityChangePrimaryEmailHandler(p *deps.Reques GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -167297,7 +167297,7 @@ func newWebAppAuthflowV2SettingsIdentityAddPhoneHandler(p *deps.RequestProvider) GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -168320,7 +168320,7 @@ func newWebAppAuthflowV2SettingsIdentityEditPhoneHandler(p *deps.RequestProvider GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -169345,7 +169345,7 @@ func newWebAppAuthflowV2SettingsIdentityListPhoneHandler(p *deps.RequestProvider GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -170355,7 +170355,7 @@ func newWebAppAuthflowV2SettingsIdentityViewPhoneHandler(p *deps.RequestProvider GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -171382,7 +171382,7 @@ func newWebAppAuthflowV2SettingsIdentityChangePrimaryPhoneHandler(p *deps.Reques GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -172396,7 +172396,7 @@ func newWebAppAuthflowV2SettingsIdentityVerifyPhoneHandler(p *deps.RequestProvid GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -173423,7 +173423,7 @@ func newWebAppAuthflowV2SettingsIdentityListUsernameHandler(p *deps.RequestProvi GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -174411,7 +174411,7 @@ func newWebAppAuthflowV2SettingsIdentityNewUsernameHandler(p *deps.RequestProvid GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -175434,7 +175434,7 @@ func newWebAppAuthflowV2SettingsIdentityViewUsernameHandler(p *deps.RequestProvi GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -176459,7 +176459,7 @@ func newWebAppAuthflowV2SettingsIdentityEditUsernameHandler(p *deps.RequestProvi GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -177493,7 +177493,7 @@ func newWebAppAuthflowV2SettingsIdentityListOAuthHandler(p *deps.RequestProvider GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -179138,7 +179138,7 @@ func newSessionMiddleware(p *deps.RequestProvider) httproute.Middleware { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -179923,7 +179923,7 @@ func newWebAppSessionMiddleware(p *deps.RequestProvider) httproute.Middleware { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) @@ -181406,7 +181406,7 @@ func newSettingsSubRoutesMiddleware(p *deps.RequestProvider) httproute.Middlewar GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) diff --git a/pkg/lib/config/messaging.go b/pkg/lib/config/messaging.go index fda01c04e3..3beaa0e206 100644 --- a/pkg/lib/config/messaging.go +++ b/pkg/lib/config/messaging.go @@ -16,12 +16,12 @@ var _ = Schema.Add("MessagingConfig", ` `) type MessagingConfig struct { - SMSProvider SMSProvider `json:"sms_provider,omitempty"` - SMSGateway *SMSGatewayConfig `json:"sms_gateway,omitempty" nullable:"true"` - Deprecated_SMS *SMSConfig `json:"sms,omitempty"` - Deprecated_Email *EmailConfig `json:"email,omitempty"` - Whatsapp *WhatsappConfig `json:"whatsapp,omitempty"` - RateLimits *MessagingRateLimitsConfig `json:"rate_limits,omitempty"` + Deprecated_SMSProvider SMSProvider `json:"sms_provider,omitempty"` + SMSGateway *SMSGatewayConfig `json:"sms_gateway,omitempty" nullable:"true"` + Deprecated_SMS *SMSConfig `json:"sms,omitempty"` + Deprecated_Email *EmailConfig `json:"email,omitempty"` + Whatsapp *WhatsappConfig `json:"whatsapp,omitempty"` + RateLimits *MessagingRateLimitsConfig `json:"rate_limits,omitempty"` } func (c *MessagingConfig) SetDefaults() { diff --git a/pkg/lib/infra/sms/client_resolver_test.go b/pkg/lib/infra/sms/client_resolver_test.go index a5061b923c..47cfc38924 100644 --- a/pkg/lib/infra/sms/client_resolver_test.go +++ b/pkg/lib/infra/sms/client_resolver_test.go @@ -136,7 +136,7 @@ func TestClientResolver(t *testing.T) { var authgearYAMLSMSProvider config.SMSProvider var authgearYAMLSMSGateway *config.SMSGatewayConfig if messagingConfig != nil { - authgearYAMLSMSProvider = messagingConfig.SMSProvider + authgearYAMLSMSProvider = messagingConfig.Deprecated_SMSProvider authgearYAMLSMSGateway = messagingConfig.SMSGateway } diff --git a/pkg/redisqueue/wire_gen.go b/pkg/redisqueue/wire_gen.go index e46d974936..104475fa60 100644 --- a/pkg/redisqueue/wire_gen.go +++ b/pkg/redisqueue/wire_gen.go @@ -592,7 +592,7 @@ func newUserImportService(ctx context.Context, p *deps.AppProvider) *userimport. GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) diff --git a/pkg/resolver/wire_gen.go b/pkg/resolver/wire_gen.go index 9aa4286856..6b77cf5025 100644 --- a/pkg/resolver/wire_gen.go +++ b/pkg/resolver/wire_gen.go @@ -726,7 +726,7 @@ func newSessionMiddleware(p *deps.RequestProvider) httproute.Middleware { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) From f2010c0891ec1d5fbaaec1b334a3cd93fa1a076f Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Tue, 14 Jan 2025 18:50:48 +0800 Subject: [PATCH 10/33] Add custom sms gateway in navigation bar --- portal/src/AppRoot.tsx | 2 +- portal/src/ScreenNav.tsx | 5 +++++ portal/src/locale-data/en.json | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/portal/src/AppRoot.tsx b/portal/src/AppRoot.tsx index 00fe34c24f..aab0c8df74 100644 --- a/portal/src/AppRoot.tsx +++ b/portal/src/AppRoot.tsx @@ -783,7 +783,7 @@ const AppRoot: React.VFC = function AppRoot() { } /> }> diff --git a/portal/src/ScreenNav.tsx b/portal/src/ScreenNav.tsx index 9f1efc2d4a..f82a33e4fb 100644 --- a/portal/src/ScreenNav.tsx +++ b/portal/src/ScreenNav.tsx @@ -344,6 +344,11 @@ const ScreenNav: React.VFC = function ScreenNav(props) { textKey: "ScreenNav.smtp", url: `/project/${appID}/advanced/smtp`, }, + { + type: "link" as const, + textKey: "ScreenNav.sms-gateway", + url: `/project/${appID}/advanced/sms-gateway`, + }, { type: "link" as const, textKey: "ScreenNav.endpoint-direct-access", diff --git a/portal/src/locale-data/en.json b/portal/src/locale-data/en.json index 7827abb2e9..df54d596d6 100644 --- a/portal/src/locale-data/en.json +++ b/portal/src/locale-data/en.json @@ -173,6 +173,7 @@ "ScreenNav.audit-log": "Audit Log", "ScreenNav.admin-api": "Admin API", "ScreenNav.smtp": "Custom Email Provider", + "ScreenNav.sms-gateway": "Custom SMS Gateway", "ScreenNav.account-deletion": "Account Deletion", "ScreenNav.account-anonymization": "Account Anonymization", "ScreenNav.session": "Cookie Lifetime", From 885b0f6fe2875c21fcc7902820832a0b27b04be3 Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Tue, 14 Jan 2025 18:59:25 +0800 Subject: [PATCH 11/33] Extract ui components from smtp screen --- .../components/common/ProviderCard.module.css | 21 ++++ portal/src/components/common/ProviderCard.tsx | 97 ++++++++++++++++ .../portal/SMTPConfigurationScreen.module.css | 16 --- .../portal/SMTPConfigurationScreen.tsx | 108 ++---------------- 4 files changed, 127 insertions(+), 115 deletions(-) create mode 100644 portal/src/components/common/ProviderCard.module.css create mode 100644 portal/src/components/common/ProviderCard.tsx diff --git a/portal/src/components/common/ProviderCard.module.css b/portal/src/components/common/ProviderCard.module.css new file mode 100644 index 0000000000..fc8db0a1a3 --- /dev/null +++ b/portal/src/components/common/ProviderCard.module.css @@ -0,0 +1,21 @@ +.providerCard { + flex: 1; + padding: 8px 16px; + display: flex; + flex-direction: row; + align-items: center; + border-width: 1px; + border-style: solid; + cursor: pointer; + column-gap: 16px; +} + +.providerCard > * { + cursor: inherit; +} + +.columnFull { + grid-column: 1 / span 8; + + @apply tablet:col-span-full; +} diff --git a/portal/src/components/common/ProviderCard.tsx b/portal/src/components/common/ProviderCard.tsx new file mode 100644 index 0000000000..d20bd6d8fd --- /dev/null +++ b/portal/src/components/common/ProviderCard.tsx @@ -0,0 +1,97 @@ +import React from "react"; +import cn from "classnames"; +import { + DefaultEffects, + FontIcon, + IButtonProps, + IIconProps, + Image, + Label, + Text, +} from "@fluentui/react"; +import { useSystemConfig } from "../../context/SystemConfigContext"; +import styles from "./ProviderCard.module.css"; + +interface ProviderCardProps { + className?: string; + iconProps?: IIconProps; + logoSrc?: any; + children?: React.ReactNode; + onClick?: IButtonProps["onClick"]; + isSelected?: boolean; + disabled?: boolean; +} + +const PROVIDER_CARD_ICON_STYLE = { + width: "32px", + height: "32px", + fontSize: "32px", +}; + +export function ProviderCard(props: ProviderCardProps): React.ReactElement { + const { + className, + disabled, + isSelected, + children, + onClick, + iconProps, + logoSrc, + } = props; + const { + themes: { + main: { + palette: { themePrimary }, + semanticColors: { disabledBackground: backgroundColor }, + }, + }, + } = useSystemConfig(); + return ( +
+ {iconProps != null ? ( + + ) : null} + {logoSrc != null ? : null} + +
+ ); +} + +interface ProviderDescriptionProps { + children?: React.ReactNode; +} + +export function ProviderCardDescription( + props: ProviderDescriptionProps +): React.ReactElement { + const { children } = props; + const { + themes: { + main: { + semanticColors: { bodySubtext: color }, + }, + }, + } = useSystemConfig(); + + return ( + + {children} + + ); +} diff --git a/portal/src/graphql/portal/SMTPConfigurationScreen.module.css b/portal/src/graphql/portal/SMTPConfigurationScreen.module.css index 1cebfd9cdf..6d167d4fa0 100644 --- a/portal/src/graphql/portal/SMTPConfigurationScreen.module.css +++ b/portal/src/graphql/portal/SMTPConfigurationScreen.module.css @@ -26,19 +26,3 @@ @apply tablet:col-span-full; } - -.providerCard { - flex: 1; - padding: 8px 16px; - display: flex; - flex-direction: row; - align-items: center; - border-width: 1px; - border-style: solid; - cursor: pointer; - column-gap: 16px; -} - -.providerCard > * { - cursor: inherit; -} diff --git a/portal/src/graphql/portal/SMTPConfigurationScreen.tsx b/portal/src/graphql/portal/SMTPConfigurationScreen.tsx index 9ce69fbfdc..5021a7a164 100644 --- a/portal/src/graphql/portal/SMTPConfigurationScreen.tsx +++ b/portal/src/graphql/portal/SMTPConfigurationScreen.tsx @@ -1,18 +1,7 @@ import React, { useCallback, useContext, useState, useMemo } from "react"; -import cn from "classnames"; import { useLocation, useParams, useNavigate } from "react-router-dom"; import { produce } from "immer"; -import { - Text, - FontIcon, - Image, - Label, - DefaultEffects, - Dialog, - DialogFooter, - IIconProps, - IButtonProps, -} from "@fluentui/react"; +import { Dialog, DialogFooter } from "@fluentui/react"; import { FormattedMessage, Context } from "@oursky/react-messageformat"; import { useTextFieldTooltip } from "../../useTextFieldTooltip"; import ShowError from "../../ShowError"; @@ -35,7 +24,6 @@ import { PortalAPISecretConfig, PortalAPISecretConfigUpdateInstruction, } from "../../types"; -import { useSystemConfig } from "../../context/SystemConfigContext"; import { useViewerQuery } from "./query/viewerQuery"; import { useSendTestEmailMutation, @@ -50,6 +38,10 @@ import { useLocationEffect } from "../../hook/useLocationEffect"; import { useAppSecretVisitToken } from "./mutations/generateAppSecretVisitTokenMutation"; import { useAppFeatureConfigQuery } from "./query/appFeatureConfigQuery"; import FeatureDisabledMessageBar from "./FeatureDisabledMessageBar"; +import { + ProviderCard, + ProviderCardDescription, +} from "../../components/common/ProviderCard"; interface LocationState { isEdit: boolean; @@ -160,92 +152,10 @@ function constructSecretUpdateInstruction( }; } -interface ProviderCardProps { - className?: string; - iconProps?: IIconProps; - logoSrc?: any; - children?: React.ReactNode; - onClick?: IButtonProps["onClick"]; - isSelected?: boolean; - disabled?: boolean; -} - -const PROVIDER_CARD_ICON_STYLE = { - width: "32px", - height: "32px", - fontSize: "32px", -}; - const CUSTOM_PROVIDER_ICON_PROPS = { iconName: "Mail", }; -function ProviderCard(props: ProviderCardProps) { - const { - className, - disabled, - isSelected, - children, - onClick, - iconProps, - logoSrc, - } = props; - const { - themes: { - main: { - palette: { themePrimary }, - semanticColors: { disabledBackground: backgroundColor }, - }, - }, - } = useSystemConfig(); - return ( -
- {iconProps != null ? ( - - ) : null} - {logoSrc != null ? : null} - -
- ); -} - -interface ProviderDescriptionProps { - children?: React.ReactNode; -} - -function ProviderDescription(props: ProviderDescriptionProps) { - const { children } = props; - const { - themes: { - main: { - semanticColors: { bodySubtext: color }, - }, - }, - } = useSystemConfig(); - - return ( - - {children} - - ); -} - interface SMTPConfigurationScreenContentProps { isCustomSMTPDisabled: boolean; sendTestEmailHandle: UseSendTestEmailMutationReturnType; @@ -544,9 +454,9 @@ const SMTPConfigurationScreenContent: React.VFC {providerType === "custom" ? ( <> - + - + - + - + Date: Tue, 14 Jan 2025 19:21:14 +0800 Subject: [PATCH 12/33] Query the new sms gateway secrets --- pkg/portal/graphql/app.go | 2 +- .../src/graphql/portal/globalTypes.generated.ts | 4 ++-- .../query/appAndSecretConfigQuery.generated.ts | 15 +++++++++++++-- .../portal/query/appAndSecretConfigQuery.graphql | 11 +++++++++++ portal/src/graphql/portal/schema.graphql | 4 ++-- 5 files changed, 29 insertions(+), 7 deletions(-) diff --git a/pkg/portal/graphql/app.go b/pkg/portal/graphql/app.go index bcf84f5d13..dd84fff9b8 100644 --- a/pkg/portal/graphql/app.go +++ b/pkg/portal/graphql/app.go @@ -256,7 +256,7 @@ var secretConfig = graphql.NewObject(graphql.ObjectConfig{ Type: graphql.NewList(graphql.NewNonNull(samlSpSigningSecret)), }, string(AppSecretKeySMSProviderSecrets): &graphql.Field{ - Type: graphql.NewNonNull(smsProviderSecret), + Type: smsProviderSecret, }, }, }) diff --git a/portal/src/graphql/portal/globalTypes.generated.ts b/portal/src/graphql/portal/globalTypes.generated.ts index 0ad7943d4c..a833ea17d1 100644 --- a/portal/src/graphql/portal/globalTypes.generated.ts +++ b/portal/src/graphql/portal/globalTypes.generated.ts @@ -701,7 +701,7 @@ export type SmsProviderSecretsUpdateInstructionsInput = { export type SmsProviderTwilioCredentials = { __typename?: 'SMSProviderTwilioCredentials'; accountSid: Scalars['String']['output']; - authToken: Scalars['String']['output']; + authToken?: Maybe; messageServiceSid: Scalars['String']['output']; }; @@ -741,7 +741,7 @@ export type SecretConfig = { oauthSSOProviderClientSecrets?: Maybe>; samlIdpSigningSecrets?: Maybe; samlSpSigningSecrets?: Maybe>; - smsProviderSecrets?: Maybe>; + smsProviderSecrets?: Maybe; smtpSecret?: Maybe; webhookSecret?: Maybe; }; diff --git a/portal/src/graphql/portal/query/appAndSecretConfigQuery.generated.ts b/portal/src/graphql/portal/query/appAndSecretConfigQuery.generated.ts index 0f44038cb1..d1e78ded76 100644 --- a/portal/src/graphql/portal/query/appAndSecretConfigQuery.generated.ts +++ b/portal/src/graphql/portal/query/appAndSecretConfigQuery.generated.ts @@ -3,7 +3,7 @@ import * as Types from '../globalTypes.generated'; import { gql } from '@apollo/client'; import * as Apollo from '@apollo/client'; const defaultOptions = {} as const; -export type AppAndSecretConfigFragment = { __typename?: 'App', id: string, effectiveAppConfig: any, rawAppConfig: any, rawAppConfigChecksum: any, secretConfigChecksum: any, samlIdpEntityID: string, secretConfig: { __typename?: 'SecretConfig', oauthSSOProviderClientSecrets?: Array<{ __typename?: 'OAuthSSOProviderClientSecret', alias: string, clientSecret?: string | null }> | null, webhookSecret?: { __typename?: 'WebhookSecret', secret?: string | null } | null, adminAPISecrets?: Array<{ __typename?: 'AdminAPISecret', keyID: string, createdAt?: any | null, publicKeyPEM: string, privateKeyPEM?: string | null }> | null, smtpSecret?: { __typename?: 'SMTPSecret', host: string, port: number, username: string, password?: string | null } | null, oauthClientSecrets?: Array<{ __typename?: 'oauthClientSecretItem', clientID: string, keys?: Array<{ __typename?: 'oauthClientSecretKey', keyID: string, createdAt?: any | null, key: string }> | null }> | null, botProtectionProviderSecret?: { __typename?: 'BotProtectionProviderSecret', type: string, secretKey?: string | null } | null, samlIdpSigningSecrets?: { __typename?: 'SAMLIdpSigningSecrets', certificates: Array<{ __typename?: 'SAMLIdpSigningCertificate', certificateFingerprint: string, certificatePEM: string, keyID: string }> } | null, samlSpSigningSecrets?: Array<{ __typename?: 'SAMLSpSigningSecrets', clientID: string, certificates: Array<{ __typename?: 'samlSpSigningCertificate', certificateFingerprint: string, certificatePEM: string }> }> | null }, viewer: { __typename?: 'Collaborator', id: string, role: Types.CollaboratorRole, createdAt: any, user: { __typename?: 'User', id: string, email?: string | null } } }; +export type AppAndSecretConfigFragment = { __typename?: 'App', id: string, effectiveAppConfig: any, rawAppConfig: any, rawAppConfigChecksum: any, secretConfigChecksum: any, samlIdpEntityID: string, secretConfig: { __typename?: 'SecretConfig', oauthSSOProviderClientSecrets?: Array<{ __typename?: 'OAuthSSOProviderClientSecret', alias: string, clientSecret?: string | null }> | null, webhookSecret?: { __typename?: 'WebhookSecret', secret?: string | null } | null, adminAPISecrets?: Array<{ __typename?: 'AdminAPISecret', keyID: string, createdAt?: any | null, publicKeyPEM: string, privateKeyPEM?: string | null }> | null, smtpSecret?: { __typename?: 'SMTPSecret', host: string, port: number, username: string, password?: string | null } | null, oauthClientSecrets?: Array<{ __typename?: 'oauthClientSecretItem', clientID: string, keys?: Array<{ __typename?: 'oauthClientSecretKey', keyID: string, createdAt?: any | null, key: string }> | null }> | null, botProtectionProviderSecret?: { __typename?: 'BotProtectionProviderSecret', type: string, secretKey?: string | null } | null, samlIdpSigningSecrets?: { __typename?: 'SAMLIdpSigningSecrets', certificates: Array<{ __typename?: 'SAMLIdpSigningCertificate', certificateFingerprint: string, certificatePEM: string, keyID: string }> } | null, samlSpSigningSecrets?: Array<{ __typename?: 'SAMLSpSigningSecrets', clientID: string, certificates: Array<{ __typename?: 'samlSpSigningCertificate', certificateFingerprint: string, certificatePEM: string }> }> | null, smsProviderSecrets?: { __typename?: 'SMSProviderSecrets', customSmsProvider?: { __typename?: 'SMSProviderCustomSmsProviderSecrets', timeout?: number | null, url: string } | null, twilioCredentials?: { __typename?: 'SMSProviderTwilioCredentials', accountSid: string, authToken?: string | null, messageServiceSid: string } | null } | null }, viewer: { __typename?: 'Collaborator', id: string, role: Types.CollaboratorRole, createdAt: any, user: { __typename?: 'User', id: string, email?: string | null } } }; export type AppAndSecretConfigQueryQueryVariables = Types.Exact<{ id: Types.Scalars['ID']['input']; @@ -11,7 +11,7 @@ export type AppAndSecretConfigQueryQueryVariables = Types.Exact<{ }>; -export type AppAndSecretConfigQueryQuery = { __typename?: 'Query', node?: { __typename: 'App', id: string, effectiveAppConfig: any, rawAppConfig: any, rawAppConfigChecksum: any, secretConfigChecksum: any, samlIdpEntityID: string, secretConfig: { __typename?: 'SecretConfig', oauthSSOProviderClientSecrets?: Array<{ __typename?: 'OAuthSSOProviderClientSecret', alias: string, clientSecret?: string | null }> | null, webhookSecret?: { __typename?: 'WebhookSecret', secret?: string | null } | null, adminAPISecrets?: Array<{ __typename?: 'AdminAPISecret', keyID: string, createdAt?: any | null, publicKeyPEM: string, privateKeyPEM?: string | null }> | null, smtpSecret?: { __typename?: 'SMTPSecret', host: string, port: number, username: string, password?: string | null } | null, oauthClientSecrets?: Array<{ __typename?: 'oauthClientSecretItem', clientID: string, keys?: Array<{ __typename?: 'oauthClientSecretKey', keyID: string, createdAt?: any | null, key: string }> | null }> | null, botProtectionProviderSecret?: { __typename?: 'BotProtectionProviderSecret', type: string, secretKey?: string | null } | null, samlIdpSigningSecrets?: { __typename?: 'SAMLIdpSigningSecrets', certificates: Array<{ __typename?: 'SAMLIdpSigningCertificate', certificateFingerprint: string, certificatePEM: string, keyID: string }> } | null, samlSpSigningSecrets?: Array<{ __typename?: 'SAMLSpSigningSecrets', clientID: string, certificates: Array<{ __typename?: 'samlSpSigningCertificate', certificateFingerprint: string, certificatePEM: string }> }> | null }, viewer: { __typename?: 'Collaborator', id: string, role: Types.CollaboratorRole, createdAt: any, user: { __typename?: 'User', id: string, email?: string | null } } } | { __typename: 'User' } | { __typename: 'Viewer' } | null }; +export type AppAndSecretConfigQueryQuery = { __typename?: 'Query', node?: { __typename: 'App', id: string, effectiveAppConfig: any, rawAppConfig: any, rawAppConfigChecksum: any, secretConfigChecksum: any, samlIdpEntityID: string, secretConfig: { __typename?: 'SecretConfig', oauthSSOProviderClientSecrets?: Array<{ __typename?: 'OAuthSSOProviderClientSecret', alias: string, clientSecret?: string | null }> | null, webhookSecret?: { __typename?: 'WebhookSecret', secret?: string | null } | null, adminAPISecrets?: Array<{ __typename?: 'AdminAPISecret', keyID: string, createdAt?: any | null, publicKeyPEM: string, privateKeyPEM?: string | null }> | null, smtpSecret?: { __typename?: 'SMTPSecret', host: string, port: number, username: string, password?: string | null } | null, oauthClientSecrets?: Array<{ __typename?: 'oauthClientSecretItem', clientID: string, keys?: Array<{ __typename?: 'oauthClientSecretKey', keyID: string, createdAt?: any | null, key: string }> | null }> | null, botProtectionProviderSecret?: { __typename?: 'BotProtectionProviderSecret', type: string, secretKey?: string | null } | null, samlIdpSigningSecrets?: { __typename?: 'SAMLIdpSigningSecrets', certificates: Array<{ __typename?: 'SAMLIdpSigningCertificate', certificateFingerprint: string, certificatePEM: string, keyID: string }> } | null, samlSpSigningSecrets?: Array<{ __typename?: 'SAMLSpSigningSecrets', clientID: string, certificates: Array<{ __typename?: 'samlSpSigningCertificate', certificateFingerprint: string, certificatePEM: string }> }> | null, smsProviderSecrets?: { __typename?: 'SMSProviderSecrets', customSmsProvider?: { __typename?: 'SMSProviderCustomSmsProviderSecrets', timeout?: number | null, url: string } | null, twilioCredentials?: { __typename?: 'SMSProviderTwilioCredentials', accountSid: string, authToken?: string | null, messageServiceSid: string } | null } | null }, viewer: { __typename?: 'Collaborator', id: string, role: Types.CollaboratorRole, createdAt: any, user: { __typename?: 'User', id: string, email?: string | null } } } | { __typename: 'User' } | { __typename: 'Viewer' } | null }; export const AppAndSecretConfigFragmentDoc = gql` fragment AppAndSecretConfig on App { @@ -65,6 +65,17 @@ export const AppAndSecretConfigFragmentDoc = gql` certificatePEM } } + smsProviderSecrets { + customSmsProvider { + timeout + url + } + twilioCredentials { + accountSid + authToken + messageServiceSid + } + } } secretConfigChecksum viewer { diff --git a/portal/src/graphql/portal/query/appAndSecretConfigQuery.graphql b/portal/src/graphql/portal/query/appAndSecretConfigQuery.graphql index ac1cff88a4..162e343827 100644 --- a/portal/src/graphql/portal/query/appAndSecretConfigQuery.graphql +++ b/portal/src/graphql/portal/query/appAndSecretConfigQuery.graphql @@ -49,6 +49,17 @@ fragment AppAndSecretConfig on App { certificatePEM } } + smsProviderSecrets { + customSmsProvider { + timeout + url + } + twilioCredentials { + accountSid + authToken + messageServiceSid + } + } } secretConfigChecksum viewer { diff --git a/portal/src/graphql/portal/schema.graphql b/portal/src/graphql/portal/schema.graphql index 2ef14c5b66..55d810f790 100644 --- a/portal/src/graphql/portal/schema.graphql +++ b/portal/src/graphql/portal/schema.graphql @@ -818,7 +818,7 @@ type SMSProviderTwilioCredentials { accountSid: String! """""" - authToken: String! + authToken: String """""" messageServiceSid: String! @@ -893,7 +893,7 @@ type SecretConfig { samlSpSigningSecrets: [SAMLSpSigningSecrets!] """""" - smsProviderSecrets: [SMSProviderSecrets!] + smsProviderSecrets: SMSProviderSecrets """""" smtpSecret: SMTPSecret From 524d0add8d54dc05ae97a79374f3bf44d3fa5ea4 Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Tue, 14 Jan 2025 20:08:52 +0800 Subject: [PATCH 13/33] Implement header of sms provider screen --- .../SMSProviderConfigurationScreen.module.css | 28 ++++++++ .../portal/SMSProviderConfigurationScreen.tsx | 69 +++++++++++++++++-- portal/src/locale-data/en.json | 4 ++ 3 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 portal/src/graphql/portal/SMSProviderConfigurationScreen.module.css diff --git a/portal/src/graphql/portal/SMSProviderConfigurationScreen.module.css b/portal/src/graphql/portal/SMSProviderConfigurationScreen.module.css new file mode 100644 index 0000000000..6d167d4fa0 --- /dev/null +++ b/portal/src/graphql/portal/SMSProviderConfigurationScreen.module.css @@ -0,0 +1,28 @@ +.widget { + grid-column: 1 / span 8; + + @apply tablet:col-span-full; +} + +.columnFull { + grid-column: 1 / span 8; + + @apply tablet:col-span-full; +} + +.columnLeft { + grid-column: 1 / span 4; + @apply tablet:col-span-full; +} + +.columnRight { + grid-column: 5 / span 4; + + @apply tablet:col-span-full; +} + +.columnSmall { + grid-column: 1 / span 2; + + @apply tablet:col-span-full; +} diff --git a/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx b/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx index d0f7ffff55..c69e49374b 100644 --- a/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx +++ b/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx @@ -1,11 +1,14 @@ import { useLocation, useParams } from "react-router-dom"; import { AppSecretKey } from "./globalTypes.generated"; -import React, { useState } from "react"; +import React, { useCallback, useContext, useState } from "react"; import { useLocationEffect } from "../../hook/useLocationEffect"; import { useAppSecretVisitToken } from "./mutations/generateAppSecretVisitTokenMutation"; import ShowError from "../../ShowError"; import ShowLoading from "../../ShowLoading"; -import { useAppSecretConfigForm } from "../../hook/useAppSecretConfigForm"; +import { + AppSecretConfigFormModel, + useAppSecretConfigForm, +} from "../../hook/useAppSecretConfigForm"; import { useAppFeatureConfigQuery } from "./query/appFeatureConfigQuery"; import FormContainer from "../../FormContainer"; import { @@ -16,6 +19,16 @@ import { getHookKind, } from "../../types"; import { produce } from "immer"; +import { + FormattedMessage, + Context as MessageContext, +} from "@oursky/react-messageformat"; +import ScreenContent from "../../ScreenContent"; +import ScreenTitle from "../../ScreenTitle"; +import styles from "./SMSProviderConfigurationScreen.module.css"; +import Widget from "../../Widget"; +import ScreenDescription from "../../ScreenDescription"; +import Toggle from "../../Toggle"; const SECRETS = [AppSecretKey.SmsProviderSecrets]; @@ -40,6 +53,7 @@ enum SMSProviderType { interface FormState { enabled: boolean; providerType: SMSProviderType; + isSecretMasked: boolean; // twilio twilioSID: string; @@ -125,6 +139,9 @@ function constructFormState( return { enabled, providerType, + isSecretMasked: + secrets.smsProviderSecrets?.twilioCredentials != null && + secrets.smsProviderSecrets.twilioCredentials.authToken == null, twilioSID, twilioAuthToken, @@ -346,8 +363,52 @@ function SMSProviderConfigurationScreen1({ return ( - {/* FIXME */} - {/* */} + ); } + +function SMSProviderConfigurationContent(props: { + form: AppSecretConfigFormModel; +}) { + const { form } = props; + const { state, setState } = form; + const { renderToString } = useContext(MessageContext); + + const onChangeEnabled = useCallback( + (_event, checked?: boolean) => { + if (checked != null) { + setState((state) => { + return { + ...state, + enabled: checked, + }; + }); + } + }, + [setState] + ); + + return ( + + + + + + + + + + + {state.enabled ? <> : null} + + + ); +} diff --git a/portal/src/locale-data/en.json b/portal/src/locale-data/en.json index df54d596d6..c34f48091f 100644 --- a/portal/src/locale-data/en.json +++ b/portal/src/locale-data/en.json @@ -1570,6 +1570,10 @@ "SMTPConfigurationScreen.sendgrid.description": "Sign up for a SengGrid account and generate a SendGrid API Key. Check {DocLink, react, href{https://docs.authgear.com/customize/custom-email-provider} children{our instructions}} if you need help.", "SMTPConfigurationScreen.custom.description": "Set your SMTP provider manually. Check {DocLink, react, href{https://docs.authgear.com/customize/custom-email-provider} children{our instructions}} if you need help.", + "SMSProviderConfigurationScreen.title": "Custom SMS Gateway", + "SMSProviderConfigurationScreen.description": "Use your own SMS gateway for sending messages.", + "SMSProviderConfigurationScreen.enable.label": "Enable Custom SMS Gateway", + "StandardAttributesConfigurationScreen.title": "Standard Attributes", "CustomAttributesConfigurationScreen.title": "Custom Attributes", From f54700cec78daf3878a0202c4bbdc371ccdb7849 Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Tue, 14 Jan 2025 20:31:21 +0800 Subject: [PATCH 14/33] Add sms provider section --- portal/src/components/common/ProviderCard.tsx | 2 +- .../SMSProviderConfigurationScreen.module.css | 17 +---- .../portal/SMSProviderConfigurationScreen.tsx | 66 ++++++++++++++++++- portal/src/images/deno_logo.svg | 3 + portal/src/images/twilio_logo.svg | 10 +++ portal/src/images/webhook_logo.svg | 9 +++ portal/src/locale-data/en.json | 4 ++ 7 files changed, 94 insertions(+), 17 deletions(-) create mode 100644 portal/src/images/deno_logo.svg create mode 100644 portal/src/images/twilio_logo.svg create mode 100644 portal/src/images/webhook_logo.svg diff --git a/portal/src/components/common/ProviderCard.tsx b/portal/src/components/common/ProviderCard.tsx index d20bd6d8fd..df17df5419 100644 --- a/portal/src/components/common/ProviderCard.tsx +++ b/portal/src/components/common/ProviderCard.tsx @@ -50,7 +50,7 @@ export function ProviderCard(props: ProviderCardProps): React.ReactElement {
- {state.enabled ? <> : null} + + {state.enabled ? ( + + + + ) : null} ); } + +function ProviderSection({ + form, +}: { + form: AppSecretConfigFormModel; +}) { + const onSelectTwilio = useCallback(() => { + form.setState((state) => { + return { ...state, providerType: SMSProviderType.Twilio }; + }); + }, [form]); + + const onSelectWebhook = useCallback(() => { + form.setState((state) => { + return { ...state, providerType: SMSProviderType.Webhook }; + }); + }, [form]); + const onSelectDeno = useCallback(() => { + form.setState((state) => { + return { ...state, providerType: SMSProviderType.Deno }; + }); + }, [form]); + + return ( +
+ + + +
+ + + + + + + + + +
+
+ ); +} diff --git a/portal/src/images/deno_logo.svg b/portal/src/images/deno_logo.svg new file mode 100644 index 0000000000..df8660216b --- /dev/null +++ b/portal/src/images/deno_logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/portal/src/images/twilio_logo.svg b/portal/src/images/twilio_logo.svg new file mode 100644 index 0000000000..da3bce52c2 --- /dev/null +++ b/portal/src/images/twilio_logo.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/portal/src/images/webhook_logo.svg b/portal/src/images/webhook_logo.svg new file mode 100644 index 0000000000..a74e347ddb --- /dev/null +++ b/portal/src/images/webhook_logo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/portal/src/locale-data/en.json b/portal/src/locale-data/en.json index c34f48091f..35a6d35994 100644 --- a/portal/src/locale-data/en.json +++ b/portal/src/locale-data/en.json @@ -1573,6 +1573,10 @@ "SMSProviderConfigurationScreen.title": "Custom SMS Gateway", "SMSProviderConfigurationScreen.description": "Use your own SMS gateway for sending messages.", "SMSProviderConfigurationScreen.enable.label": "Enable Custom SMS Gateway", + "SMSProviderConfigurationScreen.provider.title": "SMS Gateway Provider", + "SMSProviderConfigurationScreen.provider.twilio": "Twilio", + "SMSProviderConfigurationScreen.provider.webhook": "Webhook", + "SMSProviderConfigurationScreen.provider.deno": "Custom JS/TS", "StandardAttributesConfigurationScreen.title": "Standard Attributes", From 5b098e3f17ccab7b94140881a2d22560c841825b Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Wed, 15 Jan 2025 14:57:09 +0800 Subject: [PATCH 15/33] Implement twilio provider form --- .../portal/SMSProviderConfigurationScreen.tsx | 87 ++++++++++++++++++- portal/src/locale-data/en.json | 3 + 2 files changed, 87 insertions(+), 3 deletions(-) diff --git a/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx b/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx index 4fd19ef1ef..d6fe8f8702 100644 --- a/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx +++ b/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx @@ -1,6 +1,7 @@ +import cn from "classnames"; import { useLocation, useParams } from "react-router-dom"; import { AppSecretKey } from "./globalTypes.generated"; -import React, { useCallback, useContext, useState } from "react"; +import React, { useCallback, useContext, useMemo, useState } from "react"; import { useLocationEffect } from "../../hook/useLocationEffect"; import { useAppSecretVisitToken } from "./mutations/generateAppSecretVisitTokenMutation"; import ShowError from "../../ShowError"; @@ -34,6 +35,7 @@ import { ProviderCard } from "../../components/common/ProviderCard"; import logoTwilio from "../../images/twilio_logo.svg"; import logoWebhook from "../../images/webhook_logo.svg"; import logoDeno from "../../images/deno_logo.svg"; +import FormTextField from "../../FormTextField"; const SECRETS = [AppSecretKey.SmsProviderSecrets]; @@ -117,7 +119,9 @@ function constructFormState( const twilioSID = secrets.smsProviderSecrets?.twilioCredentials?.accountSid ?? ""; const twilioAuthToken = - secrets.smsProviderSecrets?.twilioCredentials?.authToken ?? null; + secrets.smsProviderSecrets?.twilioCredentials != null + ? secrets.smsProviderSecrets.twilioCredentials.authToken ?? null + : ""; const twilioMessagingServiceSID = secrets.smsProviderSecrets?.twilioCredentials?.messageServiceSid ?? ""; @@ -415,8 +419,9 @@ function SMSProviderConfigurationContent(props: { {state.enabled ? ( - + + ) : null} @@ -476,3 +481,79 @@ function ProviderSection({
); } + +function FormSection({ form }: { form: AppSecretConfigFormModel }) { + switch (form.state.providerType) { + case SMSProviderType.Twilio: + return ; + case SMSProviderType.Webhook: + return <>; + case SMSProviderType.Deno: + return <>; + } +} + +function TwilioForm({ form }: { form: AppSecretConfigFormModel }) { + const { renderToString } = useContext(MessageContext); + + const onChangeCallbacks = useMemo(() => { + const callbackFactory = ( + key: "twilioSID" | "twilioAuthToken" | "twilioMessagingServiceSID" + ) => { + return ( + event: React.FormEvent + ) => { + form.setState((prevState) => { + const value = event.currentTarget.value; + return { + ...prevState, + [key]: value, + }; + }); + }; + }; + return { + twilioSID: callbackFactory("twilioSID"), + twilioAuthToken: callbackFactory("twilioAuthToken"), + twilioMessagingServiceSID: callbackFactory("twilioMessagingServiceSID"), + }; + }, [form]); + + return ( +
+ + {" "} + +
+ ); +} diff --git a/portal/src/locale-data/en.json b/portal/src/locale-data/en.json index 35a6d35994..f0a7440754 100644 --- a/portal/src/locale-data/en.json +++ b/portal/src/locale-data/en.json @@ -1577,6 +1577,9 @@ "SMSProviderConfigurationScreen.provider.twilio": "Twilio", "SMSProviderConfigurationScreen.provider.webhook": "Webhook", "SMSProviderConfigurationScreen.provider.deno": "Custom JS/TS", + "SMSProviderConfigurationScreen.form.twilio.twilioSID": "Application SID", + "SMSProviderConfigurationScreen.form.twilio.twilioAuthToken": "AuthToken", + "SMSProviderConfigurationScreen.form.twilio.twilioMessagingServiceSID": "Messaging Service SID", "StandardAttributesConfigurationScreen.title": "Standard Attributes", From 8c4d16f8cbec1b3f09c02628d7c16c41dc46f007 Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Wed, 15 Jan 2025 15:05:24 +0800 Subject: [PATCH 16/33] Fix incorrect type of parameter in mutation --- pkg/portal/graphql/app_mutation.go | 2 +- portal/src/graphql/portal/globalTypes.generated.ts | 2 +- portal/src/graphql/portal/schema.graphql | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/portal/graphql/app_mutation.go b/pkg/portal/graphql/app_mutation.go index b98a1b0706..2eb6769a96 100644 --- a/pkg/portal/graphql/app_mutation.go +++ b/pkg/portal/graphql/app_mutation.go @@ -167,7 +167,7 @@ var customSmsProviderSecretsInput = graphql.NewInputObject(graphql.InputObjectCo Type: graphql.NewNonNull(graphql.String), }, "timeout": &graphql.InputObjectFieldConfig{ - Type: graphql.NewNonNull(graphql.Int), + Type: graphql.Int, }, }, }) diff --git a/portal/src/graphql/portal/globalTypes.generated.ts b/portal/src/graphql/portal/globalTypes.generated.ts index a833ea17d1..daeb4e6683 100644 --- a/portal/src/graphql/portal/globalTypes.generated.ts +++ b/portal/src/graphql/portal/globalTypes.generated.ts @@ -249,7 +249,7 @@ export type CreateDomainPayload = { }; export type CustomSmsProviderSecretsInput = { - timeout: Scalars['Int']['input']; + timeout?: InputMaybe; url: Scalars['String']['input']; }; diff --git a/portal/src/graphql/portal/schema.graphql b/portal/src/graphql/portal/schema.graphql index 55d810f790..16d4604f2e 100644 --- a/portal/src/graphql/portal/schema.graphql +++ b/portal/src/graphql/portal/schema.graphql @@ -335,7 +335,7 @@ type CreateDomainPayload { """""" input CustomSmsProviderSecretsInput { """""" - timeout: Int! + timeout: Int """""" url: String! From 3de8601ea6a0f4c1ac28c209bd65abba7b110462 Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Wed, 15 Jan 2025 15:07:14 +0800 Subject: [PATCH 17/33] Fix sms provider secret is not updated in mutation --- pkg/lib/config/secret_update_instruction.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pkg/lib/config/secret_update_instruction.go b/pkg/lib/config/secret_update_instruction.go index 8a0606eab9..17b04a7cae 100644 --- a/pkg/lib/config/secret_update_instruction.go +++ b/pkg/lib/config/secret_update_instruction.go @@ -85,6 +85,13 @@ func (i *SecretConfigUpdateInstruction) ApplyTo(ctx *SecretConfigUpdateInstructi } } + if i.SMSProviderSecretsUpdateInstruction != nil { + newConfig, err = i.SMSProviderSecretsUpdateInstruction.ApplyTo(ctx, newConfig) + if err != nil { + return nil, err + } + } + return newConfig, nil } From 3d5668d079f0b4e6a08b9b73fc67b2f7f1b7c5a0 Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Wed, 15 Jan 2025 15:12:03 +0800 Subject: [PATCH 18/33] Fix auth token field is not disabled during submit --- portal/src/FormTextField.tsx | 2 +- .../portal/SMSProviderConfigurationScreen.tsx | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/portal/src/FormTextField.tsx b/portal/src/FormTextField.tsx index 33db577494..faff65e9d3 100644 --- a/portal/src/FormTextField.tsx +++ b/portal/src/FormTextField.tsx @@ -33,7 +33,7 @@ const FormTextField: React.VFC = function FormTextField( ); }; diff --git a/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx b/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx index d6fe8f8702..48475839c9 100644 --- a/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx +++ b/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx @@ -529,6 +529,7 @@ function TwilioForm({ form }: { form: AppSecretConfigFormModel }) { value={form.state.twilioSID} required={true} onChange={onChangeCallbacks.twilioSID} + disabled={form.state.isSecretMasked} parentJSONPointer={/\/secrets\/\d+\/data/} fieldName="account_sid" /> @@ -537,13 +538,17 @@ function TwilioForm({ form }: { form: AppSecretConfigFormModel }) { label={renderToString( "SMSProviderConfigurationScreen.form.twilio.twilioAuthToken" )} - value={form.state.twilioAuthToken ?? ""} - disabled={form.state.twilioAuthToken == null} + value={ + form.state.isSecretMasked + ? "********" + : form.state.twilioAuthToken ?? "" + } + disabled={form.state.isSecretMasked} required={true} onChange={onChangeCallbacks.twilioAuthToken} parentJSONPointer={/\/secrets\/\d+\/data/} fieldName="auth_token" - />{" "} + /> }) { )} value={form.state.twilioMessagingServiceSID} onChange={onChangeCallbacks.twilioMessagingServiceSID} + disabled={form.state.isSecretMasked} parentJSONPointer={/\/secrets\/\d+\/data/} fieldName="message_service_sid" /> From 2c1230a24ee06d1ed395ac94aab8c13b3e1bb097 Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Wed, 15 Jan 2025 15:15:19 +0800 Subject: [PATCH 19/33] Add edit button to reveal secrets --- .../portal/SMSProviderConfigurationScreen.tsx | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx b/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx index 48475839c9..aeb2cd8608 100644 --- a/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx +++ b/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx @@ -1,5 +1,5 @@ import cn from "classnames"; -import { useLocation, useParams } from "react-router-dom"; +import { useLocation, useNavigate, useParams } from "react-router-dom"; import { AppSecretKey } from "./globalTypes.generated"; import React, { useCallback, useContext, useMemo, useState } from "react"; import { useLocationEffect } from "../../hook/useLocationEffect"; @@ -36,6 +36,8 @@ import logoTwilio from "../../images/twilio_logo.svg"; import logoWebhook from "../../images/webhook_logo.svg"; import logoDeno from "../../images/deno_logo.svg"; import FormTextField from "../../FormTextField"; +import PrimaryButton from "../../PrimaryButton"; +import { startReauthentication } from "./Authenticated"; const SECRETS = [AppSecretKey.SmsProviderSecrets]; @@ -519,6 +521,19 @@ function TwilioForm({ form }: { form: AppSecretConfigFormModel }) { }; }, [form]); + const navigate = useNavigate(); + + const onClickEdit = useCallback(() => { + const state: LocationState = { + isRevealSecrets: true, + }; + + startReauthentication(navigate, state).catch((e) => { + // Normally there should not be any error. + console.error(e); + }); + }, [navigate]); + return (
}) { parentJSONPointer={/\/secrets\/\d+\/data/} fieldName="message_service_sid" /> + {form.state.isSecretMasked ? ( + } + /> + ) : null}
); } From 9b8b32a4dec5c16993414cea02ca14ac73a6a880 Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Wed, 15 Jan 2025 16:15:14 +0800 Subject: [PATCH 20/33] Implement webhook sms provider form --- .../components/common/CodeField.module.css | 6 + portal/src/components/common/CodeField.tsx | 33 +++ .../portal/SMSProviderConfigurationScreen.tsx | 207 ++++++++++++++++-- portal/src/locale-data/en.json | 7 + 4 files changed, 230 insertions(+), 23 deletions(-) create mode 100644 portal/src/components/common/CodeField.module.css create mode 100644 portal/src/components/common/CodeField.tsx diff --git a/portal/src/components/common/CodeField.module.css b/portal/src/components/common/CodeField.module.css new file mode 100644 index 0000000000..3c0b4120f4 --- /dev/null +++ b/portal/src/components/common/CodeField.module.css @@ -0,0 +1,6 @@ +.code { + @apply block; + @apply px-2 py-2; + @apply bg-neutral-light; + @apply whitespace-pre; +} diff --git a/portal/src/components/common/CodeField.tsx b/portal/src/components/common/CodeField.tsx new file mode 100644 index 0000000000..617f456b9f --- /dev/null +++ b/portal/src/components/common/CodeField.tsx @@ -0,0 +1,33 @@ +import React from "react"; +import { Text } from "@fluentui/react"; +import styles from "./CodeField.module.css"; + +export interface CodeFieldProps { + label?: string; + description?: string; + children?: React.ReactNode; +} + +export function CodeField({ + label, + description, + children, +}: CodeFieldProps): React.ReactElement { + return ( +
+ {label != null ? ( + + {label} + + ) : null} + + {children} + + {description != null ? ( + + {description} + + ) : null} +
+ ); +} diff --git a/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx b/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx index aeb2cd8608..e0238fbb5f 100644 --- a/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx +++ b/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx @@ -38,8 +38,12 @@ import logoDeno from "../../images/deno_logo.svg"; import FormTextField from "../../FormTextField"; import PrimaryButton from "../../PrimaryButton"; import { startReauthentication } from "./Authenticated"; +import { CodeField } from "../../components/common/CodeField"; +import TextField from "../../TextField"; +import DefaultButton from "../../DefaultButton"; +import { useCopyFeedback } from "../../hook/useCopyFeedback"; -const SECRETS = [AppSecretKey.SmsProviderSecrets]; +const SECRETS = [AppSecretKey.SmsProviderSecrets, AppSecretKey.WebhookSecret]; interface LocationState { isRevealSecrets: boolean; @@ -63,6 +67,7 @@ interface FormState { enabled: boolean; providerType: SMSProviderType; isSecretMasked: boolean; + webhookSecretKey: string | null; // twilio twilioSID: string; @@ -153,6 +158,7 @@ function constructFormState( isSecretMasked: secrets.smsProviderSecrets?.twilioCredentials != null && secrets.smsProviderSecrets.twilioCredentials.authToken == null, + webhookSecretKey: secrets.webhookSecret?.secret ?? null, twilioSID, twilioAuthToken, @@ -374,17 +380,19 @@ function SMSProviderConfigurationScreen1({ return ( - + ); } function SMSProviderConfigurationContent(props: { + appID: string; form: AppSecretConfigFormModel; }) { - const { form } = props; + const { appID, form } = props; const { state, setState } = form; const { renderToString } = useContext(MessageContext); + const navigate = useNavigate(); const onChangeEnabled = useCallback( (_event, checked?: boolean) => { @@ -400,6 +408,17 @@ function SMSProviderConfigurationContent(props: { [setState] ); + const onRevealSecrets = useCallback(() => { + const state: LocationState = { + isRevealSecrets: true, + }; + + startReauthentication(navigate, state).catch((e) => { + // Normally there should not be any error. + console.error(e); + }); + }, [navigate]); + return ( @@ -423,7 +442,11 @@ function SMSProviderConfigurationContent(props: { {state.enabled ? ( - + ) : null} @@ -484,18 +507,38 @@ function ProviderSection({ ); } -function FormSection({ form }: { form: AppSecretConfigFormModel }) { +function FormSection({ + appID, + form, + onRevealSecrets, +}: { + appID: string; + form: AppSecretConfigFormModel; + onRevealSecrets: () => void; +}) { switch (form.state.providerType) { case SMSProviderType.Twilio: - return ; + return ; case SMSProviderType.Webhook: - return <>; + return ( + + ); case SMSProviderType.Deno: return <>; } } -function TwilioForm({ form }: { form: AppSecretConfigFormModel }) { +function TwilioForm({ + form, + onRevealSecrets, +}: { + form: AppSecretConfigFormModel; + onRevealSecrets: () => void; +}) { const { renderToString } = useContext(MessageContext); const onChangeCallbacks = useMemo(() => { @@ -510,7 +553,7 @@ function TwilioForm({ form }: { form: AppSecretConfigFormModel }) { return { ...prevState, [key]: value, - }; + } satisfies FormState; }); }; }; @@ -521,19 +564,6 @@ function TwilioForm({ form }: { form: AppSecretConfigFormModel }) { }; }, [form]); - const navigate = useNavigate(); - - const onClickEdit = useCallback(() => { - const state: LocationState = { - isRevealSecrets: true, - }; - - startReauthentication(navigate, state).catch((e) => { - // Normally there should not be any error. - console.error(e); - }); - }, [navigate]); - return (
}) { {form.state.isSecretMasked ? ( } /> ) : null}
); } + +function WebhookForm({ + appID, + form, + onRevealSecrets, +}: { + appID: string; + form: AppSecretConfigFormModel; + onRevealSecrets: () => void; +}) { + const { renderToString } = useContext(MessageContext); + + const onURLChange = useCallback( + (event: React.FormEvent) => { + form.setState((prevState) => { + const value = event.currentTarget.value; + return { + ...prevState, + webhookURL: value, + } satisfies FormState; + }); + }, + [form] + ); + + const onTimeoutChange = useCallback( + (event: React.FormEvent) => { + const value = parseInt(event.currentTarget.value, 10); + if (isNaN(value)) { + return; + } + form.setState((prevState) => { + return { + ...prevState, + webhookTimeout: value, + } satisfies FormState; + }); + }, + [form] + ); + + // eslint-disable-next-line no-useless-assignment + const { copyButtonProps, Feedback: CopyFeedbackComponent } = useCopyFeedback({ + textToCopy: form.state.webhookSecretKey ?? "", + }); + + const isWebhookSecretMasked = form.state.webhookSecretKey == null; + + return ( +
+ + + {`{ + "to": "+85298765432", + "body": "You OTP is 123456" +}`} + +
+
+ + + ) : ( + + ) + } + /> + +
+ + + +
+ +
+ ); +} diff --git a/portal/src/locale-data/en.json b/portal/src/locale-data/en.json index f0a7440754..dd6a974e91 100644 --- a/portal/src/locale-data/en.json +++ b/portal/src/locale-data/en.json @@ -1580,6 +1580,13 @@ "SMSProviderConfigurationScreen.form.twilio.twilioSID": "Application SID", "SMSProviderConfigurationScreen.form.twilio.twilioAuthToken": "AuthToken", "SMSProviderConfigurationScreen.form.twilio.twilioMessagingServiceSID": "Messaging Service SID", + "SMSProviderConfigurationScreen.form.webhook.url": "Webhook Endpoint", + "SMSProviderConfigurationScreen.form.webhook.payload": "JSON Payload Sample", + "SMSProviderConfigurationScreen.form.webhook.payload.description": "The JSON payload features two key fields: 'to' for the recipient and 'body' for the SMS content", + "SMSProviderConfigurationScreen.form.webhook.signatureKey": "Webhook Signature Secret Key", + "SMSProviderConfigurationScreen.form.webhook.signatureKey.description": "Each webhook event request includes a signature to confirm it comes from Authgear. This signature is a hex-encoded HMAC-SHA256 of the request body, provided in the HTTP header x-authgear-body-signature. For details on how to validate the signature, {ReactRouterLink, react, children{click here} to{{to}}}.", + "SMSProviderConfigurationScreen.form.webhook.timeout": "Timeout (Seconds) ", + "SMSProviderConfigurationScreen.form.webhook.timeout.description": "You can set it from 1 to 60 seconds. If the webhook doesn’t respond in time, the SMS is marked as undelivered.", "StandardAttributesConfigurationScreen.title": "Standard Attributes", From 87968aae48b42dba934deddf28649acd5991368e Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Wed, 15 Jan 2025 16:23:45 +0800 Subject: [PATCH 21/33] Fix weird ux in revealing secrets in sms provider screen --- .../portal/SMSProviderConfigurationScreen.tsx | 47 ++++++++++--------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx b/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx index e0238fbb5f..9bb1684046 100644 --- a/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx +++ b/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx @@ -66,7 +66,6 @@ enum SMSProviderType { interface FormState { enabled: boolean; providerType: SMSProviderType; - isSecretMasked: boolean; webhookSecretKey: string | null; // twilio @@ -123,14 +122,19 @@ function constructFormState( providerType = SMSProviderType.Twilio; } - const twilioSID = - secrets.smsProviderSecrets?.twilioCredentials?.accountSid ?? ""; - const twilioAuthToken = - secrets.smsProviderSecrets?.twilioCredentials != null - ? secrets.smsProviderSecrets.twilioCredentials.authToken ?? null - : ""; - const twilioMessagingServiceSID = - secrets.smsProviderSecrets?.twilioCredentials?.messageServiceSid ?? ""; + let twilioSID = ""; + let twilioAuthToken: string | null = ""; + let twilioMessagingServiceSID = ""; + + if (enabled && providerType === SMSProviderType.Twilio) { + twilioSID = secrets.smsProviderSecrets?.twilioCredentials?.accountSid ?? ""; + twilioAuthToken = + secrets.smsProviderSecrets?.twilioCredentials != null + ? secrets.smsProviderSecrets.twilioCredentials.authToken ?? null + : ""; + twilioMessagingServiceSID = + secrets.smsProviderSecrets?.twilioCredentials?.messageServiceSid ?? ""; + } let webhookURL = ""; let webhookTimeout = 30; @@ -138,7 +142,12 @@ function constructFormState( let denoHookURL = ""; let denoHookTimeout = 30; - if (secrets.smsProviderSecrets?.customSmsProvider != null) { + if ( + enabled && + (providerType === SMSProviderType.Webhook || + providerType === SMSProviderType.Deno) && + secrets.smsProviderSecrets?.customSmsProvider != null + ) { if ( getHookKind(secrets.smsProviderSecrets.customSmsProvider.url) === "denohook" @@ -155,9 +164,6 @@ function constructFormState( return { enabled, providerType, - isSecretMasked: - secrets.smsProviderSecrets?.twilioCredentials != null && - secrets.smsProviderSecrets.twilioCredentials.authToken == null, webhookSecretKey: secrets.webhookSecret?.secret ?? null, twilioSID, @@ -435,7 +441,6 @@ function SMSProviderConfigurationContent(props: { onChange={onChangeEnabled} label={renderToString("SMSProviderConfigurationScreen.enable.label")} inlineLabel={true} - disabled={form.state.isSecretMasked} /> @@ -564,6 +569,8 @@ function TwilioForm({ }; }, [form]); + const isTwilioSecretMasked = form.state.twilioAuthToken == null; + return (
@@ -584,11 +591,9 @@ function TwilioForm({ "SMSProviderConfigurationScreen.form.twilio.twilioAuthToken" )} value={ - form.state.isSecretMasked - ? "********" - : form.state.twilioAuthToken ?? "" + isTwilioSecretMasked ? "********" : form.state.twilioAuthToken ?? "" } - disabled={form.state.isSecretMasked} + disabled={isTwilioSecretMasked} required={true} onChange={onChangeCallbacks.twilioAuthToken} parentJSONPointer={/\/secrets\/\d+\/data/} @@ -601,11 +606,11 @@ function TwilioForm({ )} value={form.state.twilioMessagingServiceSID} onChange={onChangeCallbacks.twilioMessagingServiceSID} - disabled={form.state.isSecretMasked} + disabled={isTwilioSecretMasked} parentJSONPointer={/\/secrets\/\d+\/data/} fieldName="message_service_sid" /> - {form.state.isSecretMasked ? ( + {isTwilioSecretMasked ? ( Date: Wed, 15 Jan 2025 19:24:44 +0800 Subject: [PATCH 22/33] Implement deno hook form in sms provider --- .../portal/HookConfigurationScreen.tsx | 50 ++-- .../portal/SMSProviderConfigurationScreen.tsx | 228 +++++++++++++++++- portal/src/locale-data/en.json | 5 +- portal/src/util/deno.ts | 3 + portal/src/util/resource.ts | 18 ++ 5 files changed, 261 insertions(+), 43 deletions(-) create mode 100644 portal/src/util/deno.ts diff --git a/portal/src/graphql/portal/HookConfigurationScreen.tsx b/portal/src/graphql/portal/HookConfigurationScreen.tsx index 204b6b99f4..0c051a47e5 100644 --- a/portal/src/graphql/portal/HookConfigurationScreen.tsx +++ b/portal/src/graphql/portal/HookConfigurationScreen.tsx @@ -35,10 +35,11 @@ import { } from "../../hook/useAppSecretConfigForm"; import { useResourceForm } from "../../hook/useResourceForm"; import { - resourcePath, ResourceSpecifier, Resource, ResourcesDiffResult, + getDenoScriptPathFromURL, + makeDenoScriptSpecifier, } from "../../util/resource"; import { useCopyFeedback } from "../../hook/useCopyFeedback"; import FieldList, { ListItemProps } from "../../FieldList"; @@ -66,6 +67,7 @@ import { useSystemConfig } from "../../context/SystemConfigContext"; import { AppSecretKey } from "./globalTypes.generated"; import { useAppSecretVisitToken } from "./mutations/generateAppSecretVisitTokenMutation"; import HorizontalDivider from "../../HorizontalDivider"; +import { DENO_TYPES_URL } from "../../util/deno"; const CODE_EDITOR_OPTIONS = { minimap: { @@ -81,9 +83,7 @@ const BLOCKING_EVENT_NAME_TO_TYPE_NAME: Record = { "oidc.jwt.pre_create": "EventOIDCJWTPreCreate", }; -const authgear_deno_hook_version = "v1.4.0"; - -const DENOHOOK_NONBLOCKING_DEFAULT = `import { HookEvent } from "https://deno.land/x/authgear_deno_hook@${authgear_deno_hook_version}/mod.ts"; +const DENOHOOK_NONBLOCKING_DEFAULT = `import { HookEvent } from "${DENO_TYPES_URL}"; export default async function(e: HookEvent): Promise { // Write your hook with the help of the type definition. @@ -106,7 +106,7 @@ export default async function(e: HookEvent): Promise { function makeDefaultDenoHookBlockingScript(event: string): string { const typeName = BLOCKING_EVENT_NAME_TO_TYPE_NAME[event] ?? "HookEvent"; - return `import { ${typeName}, HookResponse } from "https://deno.land/x/authgear_deno_hook@${authgear_deno_hook_version}/mod.ts"; + return `import { ${typeName}, HookResponse } from "${DENO_TYPES_URL}"; export default async function(e: ${typeName}): Promise { // Write your hook with the help of the type definition. @@ -239,39 +239,21 @@ function constructConfig( return [newConfig, secrets]; } -function getPathFromURL(url: string): string { - const path = url.slice("authgeardeno:///".length); - return path; -} - function makeNewURL(eventKind: EventKind): string { const rand = genRandomHexadecimalString(); return `authgeardeno:///deno/${eventKind}.${rand}.ts`; } -function makeSpecifier(url: string): ResourceSpecifier { - const path = getPathFromURL(url); - return { - def: { - resourcePath: resourcePath([path]), - type: "text" as const, - extensions: [], - }, - locale: null, - extension: null, - }; -} - function makeSpecifiersFromState(state: ConfigFormState): ResourceSpecifier[] { const specifiers = []; for (const h of state.blocking_handlers) { if (getHookKind(h.url) === "denohook") { - specifiers.push(makeSpecifier(h.url)); + specifiers.push(makeDenoScriptSpecifier(h.url)); } } for (const h of state.non_blocking_handlers) { if (getHookKind(h.url) === "denohook") { - specifiers.push(makeSpecifier(h.url)); + specifiers.push(makeDenoScriptSpecifier(h.url)); } } return specifiers; @@ -281,8 +263,8 @@ function addMissingResources(state: FormState) { for (let i = 0; i < state.blocking_handlers.length; ++i) { const h = state.blocking_handlers[i]; if (getHookKind(h.url) === "denohook") { - const path = getPathFromURL(h.url); - const specifier = makeSpecifier(h.url); + const path = getDenoScriptPathFromURL(h.url); + const specifier = makeDenoScriptSpecifier(h.url); const r = state.resources.find((r) => r.path === path); if (r == null) { state.resources.push({ @@ -296,8 +278,8 @@ function addMissingResources(state: FormState) { for (let i = 0; i < state.non_blocking_handlers.length; ++i) { const h = state.non_blocking_handlers[i]; if (getHookKind(h.url) === "denohook") { - const path = getPathFromURL(h.url); - const specifier = makeSpecifier(h.url); + const path = getDenoScriptPathFromURL(h.url); + const specifier = makeDenoScriptSpecifier(h.url); const r = state.resources.find((r) => r.path === path); if (r == null) { state.resources.push({ @@ -779,7 +761,7 @@ const HookConfigurationScreenContent: React.VFC { @@ -252,7 +274,7 @@ function constructConfig( function constructSecretUpdateInstruction( _config: PortalAPIAppConfig, secrets: PortalAPISecretConfig, - currentState: FormState + currentState: ConfigFormState ): PortalAPISecretConfigUpdateInstruction | undefined { if (!currentState.enabled || !secrets.smsProviderSecrets) { return undefined; @@ -317,6 +339,37 @@ function constructSecretUpdateInstruction( } } +function makeSpecifiersFromState(state: ConfigFormState): ResourceSpecifier[] { + const specifiers = []; + if (state.denoHookURL) { + specifiers.push(makeDenoScriptSpecifier(state.denoHookURL)); + } + return specifiers; +} + +function makeNewDenoScriptURL(): string { + const rand = genRandomHexadecimalString(); + return `authgeardeno:///deno/sms.${rand}.ts`; +} + +const DEFAULT_SMS_SCRIPT_TEMPLATE = `// This custom script will be executed when a message is triggered +// Sample script: +import { CustomSMSGatewayPayload } from "${DENO_TYPES_URL}"; + +export default async function (e: CustomSMSGatewayPayload): Promise { + const response = await fetch("https://some.sms.gateway"); + if (!response.ok) { + throw new Error("Failed to send sms"); + } +} +`; + +const CODE_EDITOR_OPTIONS = { + minimap: { + enabled: false, + }, +}; + const SMSProviderConfigurationScreen: React.VFC = function SMSProviderConfigurationScreen() { const { appID } = useParams() as { appID: string }; @@ -359,7 +412,7 @@ function SMSProviderConfigurationScreen1({ appID: string; secretToken: string | null; }) { - const form = useAppSecretConfigForm({ + const configForm = useAppSecretConfigForm({ appID, secretVisitToken: secretToken, constructFormState, @@ -367,6 +420,52 @@ function SMSProviderConfigurationScreen1({ constructSecretUpdateInstruction, }); const featureConfig = useAppFeatureConfigQuery(appID); + const specifiers = useMemo(() => { + return makeSpecifiersFromState(configForm.state); + }, [configForm.state]); + const resources = useResourceForm( + appID, + specifiers, + (resources) => resources, + (resources) => resources + ); + + const state = useMemo(() => { + return { + ...configForm.state, + resources: resources.state, + diff: resources.diff, + }; + }, [configForm.state, resources.state, resources.diff]); + + const form: AppSecretConfigFormModel = { + isLoading: configForm.isLoading || resources.isLoading, + isUpdating: configForm.isUpdating || resources.isUpdating, + isDirty: configForm.isDirty || resources.isDirty, + loadError: configForm.loadError ?? resources.loadError, + updateError: configForm.updateError ?? resources.updateError, + state, + setState: (fn) => { + const newState = fn(state); + const { resources: newResources, ...configState } = newState; + configForm.setState(() => ({ + ...configState, + })); + resources.setState(() => newResources); + }, + reload: () => { + resources.reload(); + configForm.reload(); + }, + reset: () => { + resources.reset(); + configForm.reset(); + }, + save: async (ignoreConflict: boolean = false) => { + await resources.save(ignoreConflict); + await configForm.save(ignoreConflict); + }, + }; if (form.isLoading || featureConfig.loading) { return ; @@ -533,7 +632,7 @@ function FormSection({ /> ); case SMSProviderType.Deno: - return <>; + return ; } } @@ -751,3 +850,116 @@ function WebhookForm({
); } + +function DenoHookForm({ form }: { form: AppSecretConfigFormModel }) { + const { renderToString } = useContext(MessageContext); + const { state, setState } = form; + + const onTimeoutChange = useCallback( + (event: React.FormEvent) => { + const value = parseInt(event.currentTarget.value, 10); + if (isNaN(value)) { + return; + } + setState((prevState) => { + return { + ...prevState, + denoHookTimeout: value, + } satisfies FormState; + }); + }, + [setState] + ); + + const resourceIdx = useMemo(() => { + if (state.denoHookURL === "") { + return -1; + } + const path = getDenoScriptPathFromURL(state.denoHookURL); + for (const [idx, r] of state.resources.entries()) { + if (r.path === path && r.nullableValue != null) { + return idx; + } + } + return -1; + }, [state.denoHookURL, state.resources]); + + // Generate a new script resource if one does not exist + useEffect(() => { + if (state.providerType !== SMSProviderType.Deno || resourceIdx !== -1) { + return; + } + setState((prevState) => { + return produce(prevState, (prevState) => { + prevState.denoHookURL = makeNewDenoScriptURL(); + const path = getDenoScriptPathFromURL(prevState.denoHookURL); + const specifier = makeDenoScriptSpecifier(prevState.denoHookURL); + const r = prevState.resources.find((r) => r.path === path); + if (r == null) { + prevState.resources.push({ + path, + specifier, + nullableValue: DEFAULT_SMS_SCRIPT_TEMPLATE, + }); + } + }); + }); + }, [ + resourceIdx, + setState, + state.denoHookURL, + state.providerType, + state.resources, + ]); + + const onChangeCode = useCallback( + (newValue?: string) => { + if (newValue == null) { + return; + } + if (resourceIdx === -1) { + return; + } + setState((prevState) => + produce(prevState, (prevState) => { + prevState.resources[resourceIdx].nullableValue = newValue; + }) + ); + }, + [resourceIdx, setState] + ); + + return ( +
+
+ + + + +
+ +
+ ); +} diff --git a/portal/src/locale-data/en.json b/portal/src/locale-data/en.json index dd6a974e91..a59f65a92e 100644 --- a/portal/src/locale-data/en.json +++ b/portal/src/locale-data/en.json @@ -1585,8 +1585,11 @@ "SMSProviderConfigurationScreen.form.webhook.payload.description": "The JSON payload features two key fields: 'to' for the recipient and 'body' for the SMS content", "SMSProviderConfigurationScreen.form.webhook.signatureKey": "Webhook Signature Secret Key", "SMSProviderConfigurationScreen.form.webhook.signatureKey.description": "Each webhook event request includes a signature to confirm it comes from Authgear. This signature is a hex-encoded HMAC-SHA256 of the request body, provided in the HTTP header x-authgear-body-signature. For details on how to validate the signature, {ReactRouterLink, react, children{click here} to{{to}}}.", - "SMSProviderConfigurationScreen.form.webhook.timeout": "Timeout (Seconds) ", + "SMSProviderConfigurationScreen.form.webhook.timeout": "Timeout (Seconds)", "SMSProviderConfigurationScreen.form.webhook.timeout.description": "You can set it from 1 to 60 seconds. If the webhook doesn’t respond in time, the SMS is marked as undelivered.", + "SMSProviderConfigurationScreen.form.deno.script": "Custom script", + "SMSProviderConfigurationScreen.form.deno.timeout": "Timeout (Seconds)", + "SMSProviderConfigurationScreen.form.deno.timeout.description": "You can set it from 1 to 60 seconds. If the webhook doesn’t respond in time, the SMS is marked as undelivered.", "StandardAttributesConfigurationScreen.title": "Standard Attributes", diff --git a/portal/src/util/deno.ts b/portal/src/util/deno.ts new file mode 100644 index 0000000000..7418709daa --- /dev/null +++ b/portal/src/util/deno.ts @@ -0,0 +1,3 @@ +const authgear_deno_hook_version = "v1.4.0"; + +export const DENO_TYPES_URL = `https://deno.land/x/authgear_deno_hook@${authgear_deno_hook_version}/mod.ts`; diff --git a/portal/src/util/resource.ts b/portal/src/util/resource.ts index 809dabd077..761e3b65f6 100644 --- a/portal/src/util/resource.ts +++ b/portal/src/util/resource.ts @@ -227,3 +227,21 @@ export function diffResourceUpdates( result.deletedResources.length > 0; return result; } + +export function getDenoScriptPathFromURL(url: string): string { + const path = url.slice("authgeardeno:///".length); + return path; +} + +export function makeDenoScriptSpecifier(url: string): ResourceSpecifier { + const path = getDenoScriptPathFromURL(url); + return { + def: { + resourcePath: resourcePath([path]), + type: "text" as const, + extensions: [], + }, + locale: null, + extension: null, + }; +} From 2279e7f58e6afcdd3fd17bed983dd418dd3b5a84 Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Wed, 15 Jan 2025 19:42:51 +0800 Subject: [PATCH 23/33] Add descriptions for each providers --- .../portal/SMSProviderConfigurationScreen.tsx | 51 +++++++++++-------- portal/src/locale-data/en.json | 5 +- 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx b/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx index f46cf780da..5cb6b43346 100644 --- a/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx +++ b/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx @@ -485,16 +485,15 @@ function SMSProviderConfigurationScreen1({ return ( - + ); } function SMSProviderConfigurationContent(props: { - appID: string; form: AppSecretConfigFormModel; }) { - const { appID, form } = props; + const { form } = props; const { state, setState } = form; const { renderToString } = useContext(MessageContext); const navigate = useNavigate(); @@ -546,11 +545,7 @@ function SMSProviderConfigurationContent(props: { {state.enabled ? ( - + ) : null} @@ -607,16 +602,38 @@ function ProviderSection({ + + {form.state.providerType === SMSProviderType.Twilio ? ( + + ) : form.state.providerType === SMSProviderType.Webhook ? ( + + ) : ( + + )} + ); } function FormSection({ - appID, form, onRevealSecrets, }: { - appID: string; form: AppSecretConfigFormModel; onRevealSecrets: () => void; }) { @@ -624,13 +641,7 @@ function FormSection({ case SMSProviderType.Twilio: return ; case SMSProviderType.Webhook: - return ( - - ); + return ; case SMSProviderType.Deno: return ; } @@ -721,11 +732,9 @@ function TwilioForm({ } function WebhookForm({ - appID, form, onRevealSecrets, }: { - appID: string; form: AppSecretConfigFormModel; onRevealSecrets: () => void; }) { @@ -830,7 +839,9 @@ function WebhookForm({ diff --git a/portal/src/locale-data/en.json b/portal/src/locale-data/en.json index a59f65a92e..d96471f9d4 100644 --- a/portal/src/locale-data/en.json +++ b/portal/src/locale-data/en.json @@ -1575,8 +1575,11 @@ "SMSProviderConfigurationScreen.enable.label": "Enable Custom SMS Gateway", "SMSProviderConfigurationScreen.provider.title": "SMS Gateway Provider", "SMSProviderConfigurationScreen.provider.twilio": "Twilio", + "SMSProviderConfigurationScreen.provider.twilio.description": "Learn more about {ExternalLink, react, href{{href}} children{Twilio integration}}.", "SMSProviderConfigurationScreen.provider.webhook": "Webhook", + "SMSProviderConfigurationScreen.provider.webhook.description": "Learn more about {ExternalLink, react, href{{href}} children{Webhook integration}}.", "SMSProviderConfigurationScreen.provider.deno": "Custom JS/TS", + "SMSProviderConfigurationScreen.provider.deno.description": "Learn more about {ExternalLink, react, href{{href}} children{Custom JS/TS integration}}.", "SMSProviderConfigurationScreen.form.twilio.twilioSID": "Application SID", "SMSProviderConfigurationScreen.form.twilio.twilioAuthToken": "AuthToken", "SMSProviderConfigurationScreen.form.twilio.twilioMessagingServiceSID": "Messaging Service SID", @@ -1584,7 +1587,7 @@ "SMSProviderConfigurationScreen.form.webhook.payload": "JSON Payload Sample", "SMSProviderConfigurationScreen.form.webhook.payload.description": "The JSON payload features two key fields: 'to' for the recipient and 'body' for the SMS content", "SMSProviderConfigurationScreen.form.webhook.signatureKey": "Webhook Signature Secret Key", - "SMSProviderConfigurationScreen.form.webhook.signatureKey.description": "Each webhook event request includes a signature to confirm it comes from Authgear. This signature is a hex-encoded HMAC-SHA256 of the request body, provided in the HTTP header x-authgear-body-signature. For details on how to validate the signature, {ReactRouterLink, react, children{click here} to{{to}}}.", + "SMSProviderConfigurationScreen.form.webhook.signatureKey.description": "Each webhook event request includes a signature to confirm it comes from Authgear. This signature is a hex-encoded HMAC-SHA256 of the request body, provided in the HTTP header x-authgear-body-signature. For details on how to validate the signature, {ExternalLink, react, children{click here} href{{href}}}.", "SMSProviderConfigurationScreen.form.webhook.timeout": "Timeout (Seconds)", "SMSProviderConfigurationScreen.form.webhook.timeout.description": "You can set it from 1 to 60 seconds. If the webhook doesn’t respond in time, the SMS is marked as undelivered.", "SMSProviderConfigurationScreen.form.deno.script": "Custom script", From 80c632a57806b19763af050351870606bde3240a Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Wed, 15 Jan 2025 20:01:42 +0800 Subject: [PATCH 24/33] Fix type error in e2e --- e2e/cmd/e2e/pkg/wire_gen.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/cmd/e2e/pkg/wire_gen.go b/e2e/cmd/e2e/pkg/wire_gen.go index 2e414d7f01..014b570ef3 100644 --- a/e2e/cmd/e2e/pkg/wire_gen.go +++ b/e2e/cmd/e2e/pkg/wire_gen.go @@ -635,7 +635,7 @@ func newUserImport(p *deps.AppProvider) *userimport.UserImportService { GomailDialer: dialer, } smsLogger := sms.NewLogger(factory) - smsProvider := messagingConfig.SMSProvider + smsProvider := messagingConfig.Deprecated_SMSProvider smsGatewayConfig := messagingConfig.SMSGateway nexmoCredentials := deps.ProvideNexmoCredentials(secretConfig) twilioCredentials := deps.ProvideTwilioCredentials(secretConfig) From 8e8174e900061586b3f9480014d337c1dbea00fd Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Wed, 15 Jan 2025 20:25:45 +0800 Subject: [PATCH 25/33] Fix incorrect field name in deps --- pkg/lib/deps/deps_config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/lib/deps/deps_config.go b/pkg/lib/deps/deps_config.go index 6fc95deba9..824938a5ec 100644 --- a/pkg/lib/deps/deps_config.go +++ b/pkg/lib/deps/deps_config.go @@ -47,7 +47,7 @@ var ConfigDeps = wire.NewSet( "LDAP", ), wire.FieldsOf(new(*config.MessagingConfig), - "SMSProvider", + "Deprecated_SMSProvider", "SMSGateway", "Whatsapp", "RateLimits", From efd523b3e77a596eaec3b089770034a2601aa855 Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Thu, 16 Jan 2025 15:05:22 +0800 Subject: [PATCH 26/33] Rename messageServiceSid to messagingServiceSID --- pkg/lib/config/secret_update_instruction.go | 2 +- pkg/portal/graphql/app.go | 2 +- pkg/portal/graphql/app_mutation.go | 2 +- pkg/portal/model/app.go | 10 +++++----- .../graphql/portal/SMSProviderConfigurationScreen.tsx | 9 +++++---- portal/src/graphql/portal/globalTypes.generated.ts | 4 ++-- .../portal/query/appAndSecretConfigQuery.generated.ts | 6 +++--- .../portal/query/appAndSecretConfigQuery.graphql | 2 +- portal/src/graphql/portal/schema.graphql | 4 ++-- portal/src/types.ts | 4 ++-- 10 files changed, 23 insertions(+), 22 deletions(-) diff --git a/pkg/lib/config/secret_update_instruction.go b/pkg/lib/config/secret_update_instruction.go index 17b04a7cae..c721b9c2a5 100644 --- a/pkg/lib/config/secret_update_instruction.go +++ b/pkg/lib/config/secret_update_instruction.go @@ -782,7 +782,7 @@ type SMSProviderSecretsUpdateInstructionSetData struct { type SMSProviderSecretsUpdateInstructionTwilioCredentials struct { AccountSID string `json:"accountSid,omitempty"` AuthToken string `json:"authToken,omitempty"` - MessagingServiceSID string `json:"messageServiceSid,omitempty"` + MessagingServiceSID string `json:"messagingServiceSID,omitempty"` } type SMSProviderSecretsUpdateInstructionCustomSMSProvider struct { diff --git a/pkg/portal/graphql/app.go b/pkg/portal/graphql/app.go index dd84fff9b8..3943cbf652 100644 --- a/pkg/portal/graphql/app.go +++ b/pkg/portal/graphql/app.go @@ -181,7 +181,7 @@ var smsProviderTwilioCredentials = graphql.NewObject(graphql.ObjectConfig{ "authToken": &graphql.Field{ Type: graphql.String, }, - "messageServiceSid": &graphql.Field{ + "messagingServiceSID": &graphql.Field{ Type: graphql.NewNonNull(graphql.String), }, }, diff --git a/pkg/portal/graphql/app_mutation.go b/pkg/portal/graphql/app_mutation.go index 2eb6769a96..b938813b89 100644 --- a/pkg/portal/graphql/app_mutation.go +++ b/pkg/portal/graphql/app_mutation.go @@ -154,7 +154,7 @@ var smsProviderTwilioCredentialsInput = graphql.NewInputObject(graphql.InputObje "authToken": &graphql.InputObjectFieldConfig{ Type: graphql.String, }, - "messageServiceSid": &graphql.InputObjectFieldConfig{ + "messagingServiceSID": &graphql.InputObjectFieldConfig{ Type: graphql.NewNonNull(graphql.String), }, }, diff --git a/pkg/portal/model/app.go b/pkg/portal/model/app.go index 7ef2ba5714..fa5380bdac 100644 --- a/pkg/portal/model/app.go +++ b/pkg/portal/model/app.go @@ -85,9 +85,9 @@ type SAMLSpSigningSecrets struct { } type SMSProviderTwilioCredentials struct { - AccountSID string `json:"accountSid,omitempty"` - AuthToken *string `json:"authToken,omitempty"` - MessageServiceSID string `json:"messageServiceSid,omitempty"` + AccountSID string `json:"accountSid,omitempty"` + AuthToken *string `json:"authToken,omitempty"` + MessagingServiceSID string `json:"messagingServiceSID,omitempty"` } type SMSProviderCustomSMSProviderConfigs struct { @@ -268,8 +268,8 @@ func NewSecretConfig(secretConfig *config.SecretConfig, unmaskedSecrets []config smsProviderSecrets := &SMSProviderSecrets{} if twilioCredentials, ok := secretConfig.LookupData(config.TwilioCredentialsKey).(*config.TwilioCredentials); ok { smsProviderSecrets.TwilioCredentials = &SMSProviderTwilioCredentials{ - AccountSID: twilioCredentials.AccountSID, - MessageServiceSID: twilioCredentials.MessagingServiceSID, + AccountSID: twilioCredentials.AccountSID, + MessagingServiceSID: twilioCredentials.MessagingServiceSID, } if _, exist := unmaskedSecretsSet[config.TwilioCredentialsKey]; exist { smsProviderSecrets.TwilioCredentials.AuthToken = &twilioCredentials.AuthToken diff --git a/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx b/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx index 5cb6b43346..79196d185f 100644 --- a/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx +++ b/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx @@ -155,7 +155,7 @@ function constructFormState( ? secrets.smsProviderSecrets.twilioCredentials.authToken ?? null : ""; twilioMessagingServiceSID = - secrets.smsProviderSecrets?.twilioCredentials?.messageServiceSid ?? ""; + secrets.smsProviderSecrets?.twilioCredentials?.messagingServiceSID ?? ""; } let webhookURL = ""; @@ -245,7 +245,7 @@ function constructConfig( twilioCredentials: { accountSid: currentState.twilioSID, authToken: currentState.twilioAuthToken, - messageServiceSid: currentState.twilioMessagingServiceSID, + messagingServiceSID: currentState.twilioMessagingServiceSID, }, }; break; @@ -298,8 +298,9 @@ function constructSecretUpdateInstruction( accountSid: secrets.smsProviderSecrets.twilioCredentials.accountSid, authToken: secrets.smsProviderSecrets.twilioCredentials.authToken, - messageServiceSid: - secrets.smsProviderSecrets.twilioCredentials.messageServiceSid, + messagingServiceSID: + secrets.smsProviderSecrets.twilioCredentials + .messagingServiceSID, }, }, }, diff --git a/portal/src/graphql/portal/globalTypes.generated.ts b/portal/src/graphql/portal/globalTypes.generated.ts index daeb4e6683..36c2f071e6 100644 --- a/portal/src/graphql/portal/globalTypes.generated.ts +++ b/portal/src/graphql/portal/globalTypes.generated.ts @@ -702,13 +702,13 @@ export type SmsProviderTwilioCredentials = { __typename?: 'SMSProviderTwilioCredentials'; accountSid: Scalars['String']['output']; authToken?: Maybe; - messageServiceSid: Scalars['String']['output']; + messagingServiceSID: Scalars['String']['output']; }; export type SmsProviderTwilioCredentialsInput = { accountSid: Scalars['String']['input']; authToken?: InputMaybe; - messageServiceSid: Scalars['String']['input']; + messagingServiceSID: Scalars['String']['input']; }; /** SMTP secret */ diff --git a/portal/src/graphql/portal/query/appAndSecretConfigQuery.generated.ts b/portal/src/graphql/portal/query/appAndSecretConfigQuery.generated.ts index d1e78ded76..0734812138 100644 --- a/portal/src/graphql/portal/query/appAndSecretConfigQuery.generated.ts +++ b/portal/src/graphql/portal/query/appAndSecretConfigQuery.generated.ts @@ -3,7 +3,7 @@ import * as Types from '../globalTypes.generated'; import { gql } from '@apollo/client'; import * as Apollo from '@apollo/client'; const defaultOptions = {} as const; -export type AppAndSecretConfigFragment = { __typename?: 'App', id: string, effectiveAppConfig: any, rawAppConfig: any, rawAppConfigChecksum: any, secretConfigChecksum: any, samlIdpEntityID: string, secretConfig: { __typename?: 'SecretConfig', oauthSSOProviderClientSecrets?: Array<{ __typename?: 'OAuthSSOProviderClientSecret', alias: string, clientSecret?: string | null }> | null, webhookSecret?: { __typename?: 'WebhookSecret', secret?: string | null } | null, adminAPISecrets?: Array<{ __typename?: 'AdminAPISecret', keyID: string, createdAt?: any | null, publicKeyPEM: string, privateKeyPEM?: string | null }> | null, smtpSecret?: { __typename?: 'SMTPSecret', host: string, port: number, username: string, password?: string | null } | null, oauthClientSecrets?: Array<{ __typename?: 'oauthClientSecretItem', clientID: string, keys?: Array<{ __typename?: 'oauthClientSecretKey', keyID: string, createdAt?: any | null, key: string }> | null }> | null, botProtectionProviderSecret?: { __typename?: 'BotProtectionProviderSecret', type: string, secretKey?: string | null } | null, samlIdpSigningSecrets?: { __typename?: 'SAMLIdpSigningSecrets', certificates: Array<{ __typename?: 'SAMLIdpSigningCertificate', certificateFingerprint: string, certificatePEM: string, keyID: string }> } | null, samlSpSigningSecrets?: Array<{ __typename?: 'SAMLSpSigningSecrets', clientID: string, certificates: Array<{ __typename?: 'samlSpSigningCertificate', certificateFingerprint: string, certificatePEM: string }> }> | null, smsProviderSecrets?: { __typename?: 'SMSProviderSecrets', customSmsProvider?: { __typename?: 'SMSProviderCustomSmsProviderSecrets', timeout?: number | null, url: string } | null, twilioCredentials?: { __typename?: 'SMSProviderTwilioCredentials', accountSid: string, authToken?: string | null, messageServiceSid: string } | null } | null }, viewer: { __typename?: 'Collaborator', id: string, role: Types.CollaboratorRole, createdAt: any, user: { __typename?: 'User', id: string, email?: string | null } } }; +export type AppAndSecretConfigFragment = { __typename?: 'App', id: string, effectiveAppConfig: any, rawAppConfig: any, rawAppConfigChecksum: any, secretConfigChecksum: any, samlIdpEntityID: string, secretConfig: { __typename?: 'SecretConfig', oauthSSOProviderClientSecrets?: Array<{ __typename?: 'OAuthSSOProviderClientSecret', alias: string, clientSecret?: string | null }> | null, webhookSecret?: { __typename?: 'WebhookSecret', secret?: string | null } | null, adminAPISecrets?: Array<{ __typename?: 'AdminAPISecret', keyID: string, createdAt?: any | null, publicKeyPEM: string, privateKeyPEM?: string | null }> | null, smtpSecret?: { __typename?: 'SMTPSecret', host: string, port: number, username: string, password?: string | null } | null, oauthClientSecrets?: Array<{ __typename?: 'oauthClientSecretItem', clientID: string, keys?: Array<{ __typename?: 'oauthClientSecretKey', keyID: string, createdAt?: any | null, key: string }> | null }> | null, botProtectionProviderSecret?: { __typename?: 'BotProtectionProviderSecret', type: string, secretKey?: string | null } | null, samlIdpSigningSecrets?: { __typename?: 'SAMLIdpSigningSecrets', certificates: Array<{ __typename?: 'SAMLIdpSigningCertificate', certificateFingerprint: string, certificatePEM: string, keyID: string }> } | null, samlSpSigningSecrets?: Array<{ __typename?: 'SAMLSpSigningSecrets', clientID: string, certificates: Array<{ __typename?: 'samlSpSigningCertificate', certificateFingerprint: string, certificatePEM: string }> }> | null, smsProviderSecrets?: { __typename?: 'SMSProviderSecrets', customSmsProvider?: { __typename?: 'SMSProviderCustomSmsProviderSecrets', timeout?: number | null, url: string } | null, twilioCredentials?: { __typename?: 'SMSProviderTwilioCredentials', accountSid: string, authToken?: string | null, messagingServiceSID: string } | null } | null }, viewer: { __typename?: 'Collaborator', id: string, role: Types.CollaboratorRole, createdAt: any, user: { __typename?: 'User', id: string, email?: string | null } } }; export type AppAndSecretConfigQueryQueryVariables = Types.Exact<{ id: Types.Scalars['ID']['input']; @@ -11,7 +11,7 @@ export type AppAndSecretConfigQueryQueryVariables = Types.Exact<{ }>; -export type AppAndSecretConfigQueryQuery = { __typename?: 'Query', node?: { __typename: 'App', id: string, effectiveAppConfig: any, rawAppConfig: any, rawAppConfigChecksum: any, secretConfigChecksum: any, samlIdpEntityID: string, secretConfig: { __typename?: 'SecretConfig', oauthSSOProviderClientSecrets?: Array<{ __typename?: 'OAuthSSOProviderClientSecret', alias: string, clientSecret?: string | null }> | null, webhookSecret?: { __typename?: 'WebhookSecret', secret?: string | null } | null, adminAPISecrets?: Array<{ __typename?: 'AdminAPISecret', keyID: string, createdAt?: any | null, publicKeyPEM: string, privateKeyPEM?: string | null }> | null, smtpSecret?: { __typename?: 'SMTPSecret', host: string, port: number, username: string, password?: string | null } | null, oauthClientSecrets?: Array<{ __typename?: 'oauthClientSecretItem', clientID: string, keys?: Array<{ __typename?: 'oauthClientSecretKey', keyID: string, createdAt?: any | null, key: string }> | null }> | null, botProtectionProviderSecret?: { __typename?: 'BotProtectionProviderSecret', type: string, secretKey?: string | null } | null, samlIdpSigningSecrets?: { __typename?: 'SAMLIdpSigningSecrets', certificates: Array<{ __typename?: 'SAMLIdpSigningCertificate', certificateFingerprint: string, certificatePEM: string, keyID: string }> } | null, samlSpSigningSecrets?: Array<{ __typename?: 'SAMLSpSigningSecrets', clientID: string, certificates: Array<{ __typename?: 'samlSpSigningCertificate', certificateFingerprint: string, certificatePEM: string }> }> | null, smsProviderSecrets?: { __typename?: 'SMSProviderSecrets', customSmsProvider?: { __typename?: 'SMSProviderCustomSmsProviderSecrets', timeout?: number | null, url: string } | null, twilioCredentials?: { __typename?: 'SMSProviderTwilioCredentials', accountSid: string, authToken?: string | null, messageServiceSid: string } | null } | null }, viewer: { __typename?: 'Collaborator', id: string, role: Types.CollaboratorRole, createdAt: any, user: { __typename?: 'User', id: string, email?: string | null } } } | { __typename: 'User' } | { __typename: 'Viewer' } | null }; +export type AppAndSecretConfigQueryQuery = { __typename?: 'Query', node?: { __typename: 'App', id: string, effectiveAppConfig: any, rawAppConfig: any, rawAppConfigChecksum: any, secretConfigChecksum: any, samlIdpEntityID: string, secretConfig: { __typename?: 'SecretConfig', oauthSSOProviderClientSecrets?: Array<{ __typename?: 'OAuthSSOProviderClientSecret', alias: string, clientSecret?: string | null }> | null, webhookSecret?: { __typename?: 'WebhookSecret', secret?: string | null } | null, adminAPISecrets?: Array<{ __typename?: 'AdminAPISecret', keyID: string, createdAt?: any | null, publicKeyPEM: string, privateKeyPEM?: string | null }> | null, smtpSecret?: { __typename?: 'SMTPSecret', host: string, port: number, username: string, password?: string | null } | null, oauthClientSecrets?: Array<{ __typename?: 'oauthClientSecretItem', clientID: string, keys?: Array<{ __typename?: 'oauthClientSecretKey', keyID: string, createdAt?: any | null, key: string }> | null }> | null, botProtectionProviderSecret?: { __typename?: 'BotProtectionProviderSecret', type: string, secretKey?: string | null } | null, samlIdpSigningSecrets?: { __typename?: 'SAMLIdpSigningSecrets', certificates: Array<{ __typename?: 'SAMLIdpSigningCertificate', certificateFingerprint: string, certificatePEM: string, keyID: string }> } | null, samlSpSigningSecrets?: Array<{ __typename?: 'SAMLSpSigningSecrets', clientID: string, certificates: Array<{ __typename?: 'samlSpSigningCertificate', certificateFingerprint: string, certificatePEM: string }> }> | null, smsProviderSecrets?: { __typename?: 'SMSProviderSecrets', customSmsProvider?: { __typename?: 'SMSProviderCustomSmsProviderSecrets', timeout?: number | null, url: string } | null, twilioCredentials?: { __typename?: 'SMSProviderTwilioCredentials', accountSid: string, authToken?: string | null, messagingServiceSID: string } | null } | null }, viewer: { __typename?: 'Collaborator', id: string, role: Types.CollaboratorRole, createdAt: any, user: { __typename?: 'User', id: string, email?: string | null } } } | { __typename: 'User' } | { __typename: 'Viewer' } | null }; export const AppAndSecretConfigFragmentDoc = gql` fragment AppAndSecretConfig on App { @@ -73,7 +73,7 @@ export const AppAndSecretConfigFragmentDoc = gql` twilioCredentials { accountSid authToken - messageServiceSid + messagingServiceSID } } } diff --git a/portal/src/graphql/portal/query/appAndSecretConfigQuery.graphql b/portal/src/graphql/portal/query/appAndSecretConfigQuery.graphql index 162e343827..79bd2dd1b7 100644 --- a/portal/src/graphql/portal/query/appAndSecretConfigQuery.graphql +++ b/portal/src/graphql/portal/query/appAndSecretConfigQuery.graphql @@ -57,7 +57,7 @@ fragment AppAndSecretConfig on App { twilioCredentials { accountSid authToken - messageServiceSid + messagingServiceSID } } } diff --git a/portal/src/graphql/portal/schema.graphql b/portal/src/graphql/portal/schema.graphql index 16d4604f2e..125e0a6c14 100644 --- a/portal/src/graphql/portal/schema.graphql +++ b/portal/src/graphql/portal/schema.graphql @@ -821,7 +821,7 @@ type SMSProviderTwilioCredentials { authToken: String """""" - messageServiceSid: String! + messagingServiceSID: String! } """""" @@ -833,7 +833,7 @@ input SMSProviderTwilioCredentialsInput { authToken: String """""" - messageServiceSid: String! + messagingServiceSID: String! } """SMTP secret""" diff --git a/portal/src/types.ts b/portal/src/types.ts index 972ce0dcba..5e1d86c78b 100644 --- a/portal/src/types.ts +++ b/portal/src/types.ts @@ -710,7 +710,7 @@ export interface SMSProviderSecrets { export interface SMSProviderTwilioCredentials { accountSid: string; authToken?: string | null; - messageServiceSid: string; + messagingServiceSID: string; } export interface SMSProviderCustomSmsProviderSecrets { @@ -814,7 +814,7 @@ export interface SAMLIdpSigningSecretsUpdateInstruction { export interface SMSProviderTwilioCredentialsInput { accountSid: string; authToken?: string | null; - messageServiceSid: string; + messagingServiceSID: string; } export interface CustomSmsProviderSecretsInput { From eb1259febb7a9d75b85c25e2a56fe4fdc6d2a6eb Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Thu, 16 Jan 2025 15:07:05 +0800 Subject: [PATCH 27/33] Rename accountSid to accountSID --- pkg/lib/config/secret_update_instruction.go | 2 +- pkg/portal/graphql/app.go | 2 +- pkg/portal/graphql/app_mutation.go | 2 +- pkg/portal/model/app.go | 2 +- .../src/graphql/portal/SMSProviderConfigurationScreen.tsx | 8 ++++---- portal/src/graphql/portal/globalTypes.generated.ts | 4 ++-- .../portal/query/appAndSecretConfigQuery.generated.ts | 6 +++--- .../graphql/portal/query/appAndSecretConfigQuery.graphql | 2 +- portal/src/graphql/portal/schema.graphql | 4 ++-- portal/src/types.ts | 4 ++-- 10 files changed, 18 insertions(+), 18 deletions(-) diff --git a/pkg/lib/config/secret_update_instruction.go b/pkg/lib/config/secret_update_instruction.go index c721b9c2a5..bf460c0867 100644 --- a/pkg/lib/config/secret_update_instruction.go +++ b/pkg/lib/config/secret_update_instruction.go @@ -780,7 +780,7 @@ type SMSProviderSecretsUpdateInstructionSetData struct { } type SMSProviderSecretsUpdateInstructionTwilioCredentials struct { - AccountSID string `json:"accountSid,omitempty"` + AccountSID string `json:"accountSID,omitempty"` AuthToken string `json:"authToken,omitempty"` MessagingServiceSID string `json:"messagingServiceSID,omitempty"` } diff --git a/pkg/portal/graphql/app.go b/pkg/portal/graphql/app.go index 3943cbf652..844dd0362f 100644 --- a/pkg/portal/graphql/app.go +++ b/pkg/portal/graphql/app.go @@ -175,7 +175,7 @@ var smsProviderTwilioCredentials = graphql.NewObject(graphql.ObjectConfig{ Name: "SMSProviderTwilioCredentials", Description: "Twilio credentials", Fields: graphql.Fields{ - "accountSid": &graphql.Field{ + "accountSID": &graphql.Field{ Type: graphql.NewNonNull(graphql.String), }, "authToken": &graphql.Field{ diff --git a/pkg/portal/graphql/app_mutation.go b/pkg/portal/graphql/app_mutation.go index b938813b89..8ae7b1b735 100644 --- a/pkg/portal/graphql/app_mutation.go +++ b/pkg/portal/graphql/app_mutation.go @@ -148,7 +148,7 @@ var smsProviderSecretsSetDataInput = graphql.NewInputObject(graphql.InputObjectC var smsProviderTwilioCredentialsInput = graphql.NewInputObject(graphql.InputObjectConfig{ Name: "SMSProviderTwilioCredentialsInput", Fields: graphql.InputObjectConfigFieldMap{ - "accountSid": &graphql.InputObjectFieldConfig{ + "accountSID": &graphql.InputObjectFieldConfig{ Type: graphql.NewNonNull(graphql.String), }, "authToken": &graphql.InputObjectFieldConfig{ diff --git a/pkg/portal/model/app.go b/pkg/portal/model/app.go index fa5380bdac..d413a73c44 100644 --- a/pkg/portal/model/app.go +++ b/pkg/portal/model/app.go @@ -85,7 +85,7 @@ type SAMLSpSigningSecrets struct { } type SMSProviderTwilioCredentials struct { - AccountSID string `json:"accountSid,omitempty"` + AccountSID string `json:"accountSID,omitempty"` AuthToken *string `json:"authToken,omitempty"` MessagingServiceSID string `json:"messagingServiceSID,omitempty"` } diff --git a/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx b/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx index 79196d185f..a9409b967f 100644 --- a/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx +++ b/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx @@ -149,7 +149,7 @@ function constructFormState( let twilioMessagingServiceSID = ""; if (enabled && providerType === SMSProviderType.Twilio) { - twilioSID = secrets.smsProviderSecrets?.twilioCredentials?.accountSid ?? ""; + twilioSID = secrets.smsProviderSecrets?.twilioCredentials?.accountSID ?? ""; twilioAuthToken = secrets.smsProviderSecrets?.twilioCredentials != null ? secrets.smsProviderSecrets.twilioCredentials.authToken ?? null @@ -243,7 +243,7 @@ function constructConfig( case SMSProviderType.Twilio: secrets.smsProviderSecrets = { twilioCredentials: { - accountSid: currentState.twilioSID, + accountSID: currentState.twilioSID, authToken: currentState.twilioAuthToken, messagingServiceSID: currentState.twilioMessagingServiceSID, }, @@ -295,8 +295,8 @@ function constructSecretUpdateInstruction( action: "set", setData: { twilioCredentials: { - accountSid: - secrets.smsProviderSecrets.twilioCredentials.accountSid, + accountSID: + secrets.smsProviderSecrets.twilioCredentials.accountSID, authToken: secrets.smsProviderSecrets.twilioCredentials.authToken, messagingServiceSID: secrets.smsProviderSecrets.twilioCredentials diff --git a/portal/src/graphql/portal/globalTypes.generated.ts b/portal/src/graphql/portal/globalTypes.generated.ts index 36c2f071e6..d55e623aac 100644 --- a/portal/src/graphql/portal/globalTypes.generated.ts +++ b/portal/src/graphql/portal/globalTypes.generated.ts @@ -700,13 +700,13 @@ export type SmsProviderSecretsUpdateInstructionsInput = { /** Twilio credentials */ export type SmsProviderTwilioCredentials = { __typename?: 'SMSProviderTwilioCredentials'; - accountSid: Scalars['String']['output']; + accountSID: Scalars['String']['output']; authToken?: Maybe; messagingServiceSID: Scalars['String']['output']; }; export type SmsProviderTwilioCredentialsInput = { - accountSid: Scalars['String']['input']; + accountSID: Scalars['String']['input']; authToken?: InputMaybe; messagingServiceSID: Scalars['String']['input']; }; diff --git a/portal/src/graphql/portal/query/appAndSecretConfigQuery.generated.ts b/portal/src/graphql/portal/query/appAndSecretConfigQuery.generated.ts index 0734812138..83e85ed6d9 100644 --- a/portal/src/graphql/portal/query/appAndSecretConfigQuery.generated.ts +++ b/portal/src/graphql/portal/query/appAndSecretConfigQuery.generated.ts @@ -3,7 +3,7 @@ import * as Types from '../globalTypes.generated'; import { gql } from '@apollo/client'; import * as Apollo from '@apollo/client'; const defaultOptions = {} as const; -export type AppAndSecretConfigFragment = { __typename?: 'App', id: string, effectiveAppConfig: any, rawAppConfig: any, rawAppConfigChecksum: any, secretConfigChecksum: any, samlIdpEntityID: string, secretConfig: { __typename?: 'SecretConfig', oauthSSOProviderClientSecrets?: Array<{ __typename?: 'OAuthSSOProviderClientSecret', alias: string, clientSecret?: string | null }> | null, webhookSecret?: { __typename?: 'WebhookSecret', secret?: string | null } | null, adminAPISecrets?: Array<{ __typename?: 'AdminAPISecret', keyID: string, createdAt?: any | null, publicKeyPEM: string, privateKeyPEM?: string | null }> | null, smtpSecret?: { __typename?: 'SMTPSecret', host: string, port: number, username: string, password?: string | null } | null, oauthClientSecrets?: Array<{ __typename?: 'oauthClientSecretItem', clientID: string, keys?: Array<{ __typename?: 'oauthClientSecretKey', keyID: string, createdAt?: any | null, key: string }> | null }> | null, botProtectionProviderSecret?: { __typename?: 'BotProtectionProviderSecret', type: string, secretKey?: string | null } | null, samlIdpSigningSecrets?: { __typename?: 'SAMLIdpSigningSecrets', certificates: Array<{ __typename?: 'SAMLIdpSigningCertificate', certificateFingerprint: string, certificatePEM: string, keyID: string }> } | null, samlSpSigningSecrets?: Array<{ __typename?: 'SAMLSpSigningSecrets', clientID: string, certificates: Array<{ __typename?: 'samlSpSigningCertificate', certificateFingerprint: string, certificatePEM: string }> }> | null, smsProviderSecrets?: { __typename?: 'SMSProviderSecrets', customSmsProvider?: { __typename?: 'SMSProviderCustomSmsProviderSecrets', timeout?: number | null, url: string } | null, twilioCredentials?: { __typename?: 'SMSProviderTwilioCredentials', accountSid: string, authToken?: string | null, messagingServiceSID: string } | null } | null }, viewer: { __typename?: 'Collaborator', id: string, role: Types.CollaboratorRole, createdAt: any, user: { __typename?: 'User', id: string, email?: string | null } } }; +export type AppAndSecretConfigFragment = { __typename?: 'App', id: string, effectiveAppConfig: any, rawAppConfig: any, rawAppConfigChecksum: any, secretConfigChecksum: any, samlIdpEntityID: string, secretConfig: { __typename?: 'SecretConfig', oauthSSOProviderClientSecrets?: Array<{ __typename?: 'OAuthSSOProviderClientSecret', alias: string, clientSecret?: string | null }> | null, webhookSecret?: { __typename?: 'WebhookSecret', secret?: string | null } | null, adminAPISecrets?: Array<{ __typename?: 'AdminAPISecret', keyID: string, createdAt?: any | null, publicKeyPEM: string, privateKeyPEM?: string | null }> | null, smtpSecret?: { __typename?: 'SMTPSecret', host: string, port: number, username: string, password?: string | null } | null, oauthClientSecrets?: Array<{ __typename?: 'oauthClientSecretItem', clientID: string, keys?: Array<{ __typename?: 'oauthClientSecretKey', keyID: string, createdAt?: any | null, key: string }> | null }> | null, botProtectionProviderSecret?: { __typename?: 'BotProtectionProviderSecret', type: string, secretKey?: string | null } | null, samlIdpSigningSecrets?: { __typename?: 'SAMLIdpSigningSecrets', certificates: Array<{ __typename?: 'SAMLIdpSigningCertificate', certificateFingerprint: string, certificatePEM: string, keyID: string }> } | null, samlSpSigningSecrets?: Array<{ __typename?: 'SAMLSpSigningSecrets', clientID: string, certificates: Array<{ __typename?: 'samlSpSigningCertificate', certificateFingerprint: string, certificatePEM: string }> }> | null, smsProviderSecrets?: { __typename?: 'SMSProviderSecrets', customSmsProvider?: { __typename?: 'SMSProviderCustomSmsProviderSecrets', timeout?: number | null, url: string } | null, twilioCredentials?: { __typename?: 'SMSProviderTwilioCredentials', accountSID: string, authToken?: string | null, messagingServiceSID: string } | null } | null }, viewer: { __typename?: 'Collaborator', id: string, role: Types.CollaboratorRole, createdAt: any, user: { __typename?: 'User', id: string, email?: string | null } } }; export type AppAndSecretConfigQueryQueryVariables = Types.Exact<{ id: Types.Scalars['ID']['input']; @@ -11,7 +11,7 @@ export type AppAndSecretConfigQueryQueryVariables = Types.Exact<{ }>; -export type AppAndSecretConfigQueryQuery = { __typename?: 'Query', node?: { __typename: 'App', id: string, effectiveAppConfig: any, rawAppConfig: any, rawAppConfigChecksum: any, secretConfigChecksum: any, samlIdpEntityID: string, secretConfig: { __typename?: 'SecretConfig', oauthSSOProviderClientSecrets?: Array<{ __typename?: 'OAuthSSOProviderClientSecret', alias: string, clientSecret?: string | null }> | null, webhookSecret?: { __typename?: 'WebhookSecret', secret?: string | null } | null, adminAPISecrets?: Array<{ __typename?: 'AdminAPISecret', keyID: string, createdAt?: any | null, publicKeyPEM: string, privateKeyPEM?: string | null }> | null, smtpSecret?: { __typename?: 'SMTPSecret', host: string, port: number, username: string, password?: string | null } | null, oauthClientSecrets?: Array<{ __typename?: 'oauthClientSecretItem', clientID: string, keys?: Array<{ __typename?: 'oauthClientSecretKey', keyID: string, createdAt?: any | null, key: string }> | null }> | null, botProtectionProviderSecret?: { __typename?: 'BotProtectionProviderSecret', type: string, secretKey?: string | null } | null, samlIdpSigningSecrets?: { __typename?: 'SAMLIdpSigningSecrets', certificates: Array<{ __typename?: 'SAMLIdpSigningCertificate', certificateFingerprint: string, certificatePEM: string, keyID: string }> } | null, samlSpSigningSecrets?: Array<{ __typename?: 'SAMLSpSigningSecrets', clientID: string, certificates: Array<{ __typename?: 'samlSpSigningCertificate', certificateFingerprint: string, certificatePEM: string }> }> | null, smsProviderSecrets?: { __typename?: 'SMSProviderSecrets', customSmsProvider?: { __typename?: 'SMSProviderCustomSmsProviderSecrets', timeout?: number | null, url: string } | null, twilioCredentials?: { __typename?: 'SMSProviderTwilioCredentials', accountSid: string, authToken?: string | null, messagingServiceSID: string } | null } | null }, viewer: { __typename?: 'Collaborator', id: string, role: Types.CollaboratorRole, createdAt: any, user: { __typename?: 'User', id: string, email?: string | null } } } | { __typename: 'User' } | { __typename: 'Viewer' } | null }; +export type AppAndSecretConfigQueryQuery = { __typename?: 'Query', node?: { __typename: 'App', id: string, effectiveAppConfig: any, rawAppConfig: any, rawAppConfigChecksum: any, secretConfigChecksum: any, samlIdpEntityID: string, secretConfig: { __typename?: 'SecretConfig', oauthSSOProviderClientSecrets?: Array<{ __typename?: 'OAuthSSOProviderClientSecret', alias: string, clientSecret?: string | null }> | null, webhookSecret?: { __typename?: 'WebhookSecret', secret?: string | null } | null, adminAPISecrets?: Array<{ __typename?: 'AdminAPISecret', keyID: string, createdAt?: any | null, publicKeyPEM: string, privateKeyPEM?: string | null }> | null, smtpSecret?: { __typename?: 'SMTPSecret', host: string, port: number, username: string, password?: string | null } | null, oauthClientSecrets?: Array<{ __typename?: 'oauthClientSecretItem', clientID: string, keys?: Array<{ __typename?: 'oauthClientSecretKey', keyID: string, createdAt?: any | null, key: string }> | null }> | null, botProtectionProviderSecret?: { __typename?: 'BotProtectionProviderSecret', type: string, secretKey?: string | null } | null, samlIdpSigningSecrets?: { __typename?: 'SAMLIdpSigningSecrets', certificates: Array<{ __typename?: 'SAMLIdpSigningCertificate', certificateFingerprint: string, certificatePEM: string, keyID: string }> } | null, samlSpSigningSecrets?: Array<{ __typename?: 'SAMLSpSigningSecrets', clientID: string, certificates: Array<{ __typename?: 'samlSpSigningCertificate', certificateFingerprint: string, certificatePEM: string }> }> | null, smsProviderSecrets?: { __typename?: 'SMSProviderSecrets', customSmsProvider?: { __typename?: 'SMSProviderCustomSmsProviderSecrets', timeout?: number | null, url: string } | null, twilioCredentials?: { __typename?: 'SMSProviderTwilioCredentials', accountSID: string, authToken?: string | null, messagingServiceSID: string } | null } | null }, viewer: { __typename?: 'Collaborator', id: string, role: Types.CollaboratorRole, createdAt: any, user: { __typename?: 'User', id: string, email?: string | null } } } | { __typename: 'User' } | { __typename: 'Viewer' } | null }; export const AppAndSecretConfigFragmentDoc = gql` fragment AppAndSecretConfig on App { @@ -71,7 +71,7 @@ export const AppAndSecretConfigFragmentDoc = gql` url } twilioCredentials { - accountSid + accountSID authToken messagingServiceSID } diff --git a/portal/src/graphql/portal/query/appAndSecretConfigQuery.graphql b/portal/src/graphql/portal/query/appAndSecretConfigQuery.graphql index 79bd2dd1b7..cc82c50293 100644 --- a/portal/src/graphql/portal/query/appAndSecretConfigQuery.graphql +++ b/portal/src/graphql/portal/query/appAndSecretConfigQuery.graphql @@ -55,7 +55,7 @@ fragment AppAndSecretConfig on App { url } twilioCredentials { - accountSid + accountSID authToken messagingServiceSID } diff --git a/portal/src/graphql/portal/schema.graphql b/portal/src/graphql/portal/schema.graphql index 125e0a6c14..e333dea192 100644 --- a/portal/src/graphql/portal/schema.graphql +++ b/portal/src/graphql/portal/schema.graphql @@ -815,7 +815,7 @@ input SMSProviderSecretsUpdateInstructionsInput { """Twilio credentials""" type SMSProviderTwilioCredentials { """""" - accountSid: String! + accountSID: String! """""" authToken: String @@ -827,7 +827,7 @@ type SMSProviderTwilioCredentials { """""" input SMSProviderTwilioCredentialsInput { """""" - accountSid: String! + accountSID: String! """""" authToken: String diff --git a/portal/src/types.ts b/portal/src/types.ts index 5e1d86c78b..7494ac2f1b 100644 --- a/portal/src/types.ts +++ b/portal/src/types.ts @@ -708,7 +708,7 @@ export interface SMSProviderSecrets { } export interface SMSProviderTwilioCredentials { - accountSid: string; + accountSID: string; authToken?: string | null; messagingServiceSID: string; } @@ -812,7 +812,7 @@ export interface SAMLIdpSigningSecretsUpdateInstruction { } export interface SMSProviderTwilioCredentialsInput { - accountSid: string; + accountSID: string; authToken?: string | null; messagingServiceSID: string; } From 9a222eeb10ae16dc19a3413e4ac2b9a031d1d23b Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Thu, 16 Jan 2025 15:10:18 +0800 Subject: [PATCH 28/33] Rename customSmsProvider to customSMSProvider --- pkg/lib/config/secret_update_instruction.go | 2 +- pkg/portal/graphql/app.go | 2 +- pkg/portal/graphql/app_mutation.go | 2 +- pkg/portal/model/app.go | 2 +- .../portal/SMSProviderConfigurationScreen.tsx | 44 +++++++++---------- .../graphql/portal/globalTypes.generated.ts | 4 +- .../appAndSecretConfigQuery.generated.ts | 6 +-- .../query/appAndSecretConfigQuery.graphql | 2 +- portal/src/graphql/portal/schema.graphql | 4 +- portal/src/types.ts | 4 +- 10 files changed, 36 insertions(+), 36 deletions(-) diff --git a/pkg/lib/config/secret_update_instruction.go b/pkg/lib/config/secret_update_instruction.go index bf460c0867..4da6347e41 100644 --- a/pkg/lib/config/secret_update_instruction.go +++ b/pkg/lib/config/secret_update_instruction.go @@ -776,7 +776,7 @@ func (i *SAMLSpSigningSecretsUpdateInstruction) set(currentConfig *SecretConfig) type SMSProviderSecretsUpdateInstructionSetData struct { TwilioCredentials *SMSProviderSecretsUpdateInstructionTwilioCredentials `json:"twilioCredentials,omitempty"` - CustomSMSProvider *SMSProviderSecretsUpdateInstructionCustomSMSProvider `json:"customSmsProvider,omitempty"` + CustomSMSProvider *SMSProviderSecretsUpdateInstructionCustomSMSProvider `json:"customSMSProvider,omitempty"` } type SMSProviderSecretsUpdateInstructionTwilioCredentials struct { diff --git a/pkg/portal/graphql/app.go b/pkg/portal/graphql/app.go index 844dd0362f..d2ee0d8555 100644 --- a/pkg/portal/graphql/app.go +++ b/pkg/portal/graphql/app.go @@ -207,7 +207,7 @@ var smsProviderSecret = graphql.NewObject(graphql.ObjectConfig{ "twilioCredentials": &graphql.Field{ Type: smsProviderTwilioCredentials, }, - "customSmsProvider": &graphql.Field{ + "customSMSProvider": &graphql.Field{ Type: smsProviderCustomSmsProviderSecrets, }, }, diff --git a/pkg/portal/graphql/app_mutation.go b/pkg/portal/graphql/app_mutation.go index 8ae7b1b735..2e69a4654c 100644 --- a/pkg/portal/graphql/app_mutation.go +++ b/pkg/portal/graphql/app_mutation.go @@ -139,7 +139,7 @@ var smsProviderSecretsSetDataInput = graphql.NewInputObject(graphql.InputObjectC "twilioCredentials": &graphql.InputObjectFieldConfig{ Type: smsProviderTwilioCredentialsInput, }, - "customSmsProvider": &graphql.InputObjectFieldConfig{ + "customSMSProvider": &graphql.InputObjectFieldConfig{ Type: customSmsProviderSecretsInput, }, }, diff --git a/pkg/portal/model/app.go b/pkg/portal/model/app.go index d413a73c44..b65644d2db 100644 --- a/pkg/portal/model/app.go +++ b/pkg/portal/model/app.go @@ -97,7 +97,7 @@ type SMSProviderCustomSMSProviderConfigs struct { type SMSProviderSecrets struct { TwilioCredentials *SMSProviderTwilioCredentials `json:"twilioCredentials,omitempty"` - CustomSMSProvider *SMSProviderCustomSMSProviderConfigs `json:"customSmsProvider,omitempty"` + CustomSMSProvider *SMSProviderCustomSMSProviderConfigs `json:"customSMSProvider,omitempty"` } type SecretConfig struct { diff --git a/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx b/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx index a9409b967f..7df7b5e209 100644 --- a/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx +++ b/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx @@ -122,7 +122,7 @@ function constructFormState( config.messaging?.sms_gateway != null && config.messaging.sms_gateway.provider === "custom"; const hasCustomProviderSecrets = - secrets.smsProviderSecrets?.customSmsProvider != null; + secrets.smsProviderSecrets?.customSMSProvider != null; if (isSMSGatewayIsTwilio && hasCustomTwilioCredentials) { enabled = true; @@ -130,12 +130,12 @@ function constructFormState( } else if (isSMSGatewayIsCustom && hasCustomProviderSecrets) { enabled = true; if ( - getHookKind(secrets.smsProviderSecrets!.customSmsProvider!.url) === + getHookKind(secrets.smsProviderSecrets!.customSMSProvider!.url) === "denohook" ) { } providerType = - getHookKind(secrets.smsProviderSecrets!.customSmsProvider!.url) === + getHookKind(secrets.smsProviderSecrets!.customSMSProvider!.url) === "denohook" ? SMSProviderType.Deno : SMSProviderType.Webhook; @@ -168,19 +168,19 @@ function constructFormState( enabled && (providerType === SMSProviderType.Webhook || providerType === SMSProviderType.Deno) && - secrets.smsProviderSecrets?.customSmsProvider != null + secrets.smsProviderSecrets?.customSMSProvider != null ) { if ( - getHookKind(secrets.smsProviderSecrets.customSmsProvider.url) === + getHookKind(secrets.smsProviderSecrets.customSMSProvider.url) === "denohook" ) { - denoHookURL = secrets.smsProviderSecrets.customSmsProvider.url; + denoHookURL = secrets.smsProviderSecrets.customSMSProvider.url; } else { - webhookURL = secrets.smsProviderSecrets.customSmsProvider.url; + webhookURL = secrets.smsProviderSecrets.customSMSProvider.url; } - if (secrets.smsProviderSecrets.customSmsProvider.timeout != null) { - denoHookTimeout = secrets.smsProviderSecrets.customSmsProvider.timeout; - webhookTimeout = secrets.smsProviderSecrets.customSmsProvider.timeout; + if (secrets.smsProviderSecrets.customSMSProvider.timeout != null) { + denoHookTimeout = secrets.smsProviderSecrets.customSMSProvider.timeout; + webhookTimeout = secrets.smsProviderSecrets.customSMSProvider.timeout; } } return { @@ -251,7 +251,7 @@ function constructConfig( break; case SMSProviderType.Webhook: secrets.smsProviderSecrets = { - customSmsProvider: { + customSMSProvider: { url: currentState.webhookURL, timeout: currentState.webhookTimeout, }, @@ -259,7 +259,7 @@ function constructConfig( break; case SMSProviderType.Deno: secrets.smsProviderSecrets = { - customSmsProvider: { + customSMSProvider: { url: currentState.denoHookURL, timeout: currentState.denoHookTimeout, }, @@ -306,33 +306,33 @@ function constructSecretUpdateInstruction( }, }; case SMSProviderType.Webhook: - if (secrets.smsProviderSecrets.customSmsProvider == null) { - console.error("unexpected null customSmsProvider"); + if (secrets.smsProviderSecrets.customSMSProvider == null) { + console.error("unexpected null customSMSProvider"); return undefined; } return { smsProviderSecrets: { action: "set", setData: { - customSmsProvider: { - url: secrets.smsProviderSecrets.customSmsProvider.url, - timeout: secrets.smsProviderSecrets.customSmsProvider.timeout, + customSMSProvider: { + url: secrets.smsProviderSecrets.customSMSProvider.url, + timeout: secrets.smsProviderSecrets.customSMSProvider.timeout, }, }, }, }; case SMSProviderType.Deno: - if (secrets.smsProviderSecrets.customSmsProvider == null) { - console.error("unexpected null customSmsProvider"); + if (secrets.smsProviderSecrets.customSMSProvider == null) { + console.error("unexpected null customSMSProvider"); return undefined; } return { smsProviderSecrets: { action: "set", setData: { - customSmsProvider: { - url: secrets.smsProviderSecrets.customSmsProvider.url, - timeout: secrets.smsProviderSecrets.customSmsProvider.timeout, + customSMSProvider: { + url: secrets.smsProviderSecrets.customSMSProvider.url, + timeout: secrets.smsProviderSecrets.customSMSProvider.timeout, }, }, }, diff --git a/portal/src/graphql/portal/globalTypes.generated.ts b/portal/src/graphql/portal/globalTypes.generated.ts index d55e623aac..02197c3ba6 100644 --- a/portal/src/graphql/portal/globalTypes.generated.ts +++ b/portal/src/graphql/portal/globalTypes.generated.ts @@ -683,12 +683,12 @@ export type SmsProviderCustomSmsProviderSecrets = { /** SMS Provider secrets */ export type SmsProviderSecrets = { __typename?: 'SMSProviderSecrets'; - customSmsProvider?: Maybe; + customSMSProvider?: Maybe; twilioCredentials?: Maybe; }; export type SmsProviderSecretsSetDataInput = { - customSmsProvider?: InputMaybe; + customSMSProvider?: InputMaybe; twilioCredentials?: InputMaybe; }; diff --git a/portal/src/graphql/portal/query/appAndSecretConfigQuery.generated.ts b/portal/src/graphql/portal/query/appAndSecretConfigQuery.generated.ts index 83e85ed6d9..eccc743a50 100644 --- a/portal/src/graphql/portal/query/appAndSecretConfigQuery.generated.ts +++ b/portal/src/graphql/portal/query/appAndSecretConfigQuery.generated.ts @@ -3,7 +3,7 @@ import * as Types from '../globalTypes.generated'; import { gql } from '@apollo/client'; import * as Apollo from '@apollo/client'; const defaultOptions = {} as const; -export type AppAndSecretConfigFragment = { __typename?: 'App', id: string, effectiveAppConfig: any, rawAppConfig: any, rawAppConfigChecksum: any, secretConfigChecksum: any, samlIdpEntityID: string, secretConfig: { __typename?: 'SecretConfig', oauthSSOProviderClientSecrets?: Array<{ __typename?: 'OAuthSSOProviderClientSecret', alias: string, clientSecret?: string | null }> | null, webhookSecret?: { __typename?: 'WebhookSecret', secret?: string | null } | null, adminAPISecrets?: Array<{ __typename?: 'AdminAPISecret', keyID: string, createdAt?: any | null, publicKeyPEM: string, privateKeyPEM?: string | null }> | null, smtpSecret?: { __typename?: 'SMTPSecret', host: string, port: number, username: string, password?: string | null } | null, oauthClientSecrets?: Array<{ __typename?: 'oauthClientSecretItem', clientID: string, keys?: Array<{ __typename?: 'oauthClientSecretKey', keyID: string, createdAt?: any | null, key: string }> | null }> | null, botProtectionProviderSecret?: { __typename?: 'BotProtectionProviderSecret', type: string, secretKey?: string | null } | null, samlIdpSigningSecrets?: { __typename?: 'SAMLIdpSigningSecrets', certificates: Array<{ __typename?: 'SAMLIdpSigningCertificate', certificateFingerprint: string, certificatePEM: string, keyID: string }> } | null, samlSpSigningSecrets?: Array<{ __typename?: 'SAMLSpSigningSecrets', clientID: string, certificates: Array<{ __typename?: 'samlSpSigningCertificate', certificateFingerprint: string, certificatePEM: string }> }> | null, smsProviderSecrets?: { __typename?: 'SMSProviderSecrets', customSmsProvider?: { __typename?: 'SMSProviderCustomSmsProviderSecrets', timeout?: number | null, url: string } | null, twilioCredentials?: { __typename?: 'SMSProviderTwilioCredentials', accountSID: string, authToken?: string | null, messagingServiceSID: string } | null } | null }, viewer: { __typename?: 'Collaborator', id: string, role: Types.CollaboratorRole, createdAt: any, user: { __typename?: 'User', id: string, email?: string | null } } }; +export type AppAndSecretConfigFragment = { __typename?: 'App', id: string, effectiveAppConfig: any, rawAppConfig: any, rawAppConfigChecksum: any, secretConfigChecksum: any, samlIdpEntityID: string, secretConfig: { __typename?: 'SecretConfig', oauthSSOProviderClientSecrets?: Array<{ __typename?: 'OAuthSSOProviderClientSecret', alias: string, clientSecret?: string | null }> | null, webhookSecret?: { __typename?: 'WebhookSecret', secret?: string | null } | null, adminAPISecrets?: Array<{ __typename?: 'AdminAPISecret', keyID: string, createdAt?: any | null, publicKeyPEM: string, privateKeyPEM?: string | null }> | null, smtpSecret?: { __typename?: 'SMTPSecret', host: string, port: number, username: string, password?: string | null } | null, oauthClientSecrets?: Array<{ __typename?: 'oauthClientSecretItem', clientID: string, keys?: Array<{ __typename?: 'oauthClientSecretKey', keyID: string, createdAt?: any | null, key: string }> | null }> | null, botProtectionProviderSecret?: { __typename?: 'BotProtectionProviderSecret', type: string, secretKey?: string | null } | null, samlIdpSigningSecrets?: { __typename?: 'SAMLIdpSigningSecrets', certificates: Array<{ __typename?: 'SAMLIdpSigningCertificate', certificateFingerprint: string, certificatePEM: string, keyID: string }> } | null, samlSpSigningSecrets?: Array<{ __typename?: 'SAMLSpSigningSecrets', clientID: string, certificates: Array<{ __typename?: 'samlSpSigningCertificate', certificateFingerprint: string, certificatePEM: string }> }> | null, smsProviderSecrets?: { __typename?: 'SMSProviderSecrets', customSMSProvider?: { __typename?: 'SMSProviderCustomSmsProviderSecrets', timeout?: number | null, url: string } | null, twilioCredentials?: { __typename?: 'SMSProviderTwilioCredentials', accountSID: string, authToken?: string | null, messagingServiceSID: string } | null } | null }, viewer: { __typename?: 'Collaborator', id: string, role: Types.CollaboratorRole, createdAt: any, user: { __typename?: 'User', id: string, email?: string | null } } }; export type AppAndSecretConfigQueryQueryVariables = Types.Exact<{ id: Types.Scalars['ID']['input']; @@ -11,7 +11,7 @@ export type AppAndSecretConfigQueryQueryVariables = Types.Exact<{ }>; -export type AppAndSecretConfigQueryQuery = { __typename?: 'Query', node?: { __typename: 'App', id: string, effectiveAppConfig: any, rawAppConfig: any, rawAppConfigChecksum: any, secretConfigChecksum: any, samlIdpEntityID: string, secretConfig: { __typename?: 'SecretConfig', oauthSSOProviderClientSecrets?: Array<{ __typename?: 'OAuthSSOProviderClientSecret', alias: string, clientSecret?: string | null }> | null, webhookSecret?: { __typename?: 'WebhookSecret', secret?: string | null } | null, adminAPISecrets?: Array<{ __typename?: 'AdminAPISecret', keyID: string, createdAt?: any | null, publicKeyPEM: string, privateKeyPEM?: string | null }> | null, smtpSecret?: { __typename?: 'SMTPSecret', host: string, port: number, username: string, password?: string | null } | null, oauthClientSecrets?: Array<{ __typename?: 'oauthClientSecretItem', clientID: string, keys?: Array<{ __typename?: 'oauthClientSecretKey', keyID: string, createdAt?: any | null, key: string }> | null }> | null, botProtectionProviderSecret?: { __typename?: 'BotProtectionProviderSecret', type: string, secretKey?: string | null } | null, samlIdpSigningSecrets?: { __typename?: 'SAMLIdpSigningSecrets', certificates: Array<{ __typename?: 'SAMLIdpSigningCertificate', certificateFingerprint: string, certificatePEM: string, keyID: string }> } | null, samlSpSigningSecrets?: Array<{ __typename?: 'SAMLSpSigningSecrets', clientID: string, certificates: Array<{ __typename?: 'samlSpSigningCertificate', certificateFingerprint: string, certificatePEM: string }> }> | null, smsProviderSecrets?: { __typename?: 'SMSProviderSecrets', customSmsProvider?: { __typename?: 'SMSProviderCustomSmsProviderSecrets', timeout?: number | null, url: string } | null, twilioCredentials?: { __typename?: 'SMSProviderTwilioCredentials', accountSID: string, authToken?: string | null, messagingServiceSID: string } | null } | null }, viewer: { __typename?: 'Collaborator', id: string, role: Types.CollaboratorRole, createdAt: any, user: { __typename?: 'User', id: string, email?: string | null } } } | { __typename: 'User' } | { __typename: 'Viewer' } | null }; +export type AppAndSecretConfigQueryQuery = { __typename?: 'Query', node?: { __typename: 'App', id: string, effectiveAppConfig: any, rawAppConfig: any, rawAppConfigChecksum: any, secretConfigChecksum: any, samlIdpEntityID: string, secretConfig: { __typename?: 'SecretConfig', oauthSSOProviderClientSecrets?: Array<{ __typename?: 'OAuthSSOProviderClientSecret', alias: string, clientSecret?: string | null }> | null, webhookSecret?: { __typename?: 'WebhookSecret', secret?: string | null } | null, adminAPISecrets?: Array<{ __typename?: 'AdminAPISecret', keyID: string, createdAt?: any | null, publicKeyPEM: string, privateKeyPEM?: string | null }> | null, smtpSecret?: { __typename?: 'SMTPSecret', host: string, port: number, username: string, password?: string | null } | null, oauthClientSecrets?: Array<{ __typename?: 'oauthClientSecretItem', clientID: string, keys?: Array<{ __typename?: 'oauthClientSecretKey', keyID: string, createdAt?: any | null, key: string }> | null }> | null, botProtectionProviderSecret?: { __typename?: 'BotProtectionProviderSecret', type: string, secretKey?: string | null } | null, samlIdpSigningSecrets?: { __typename?: 'SAMLIdpSigningSecrets', certificates: Array<{ __typename?: 'SAMLIdpSigningCertificate', certificateFingerprint: string, certificatePEM: string, keyID: string }> } | null, samlSpSigningSecrets?: Array<{ __typename?: 'SAMLSpSigningSecrets', clientID: string, certificates: Array<{ __typename?: 'samlSpSigningCertificate', certificateFingerprint: string, certificatePEM: string }> }> | null, smsProviderSecrets?: { __typename?: 'SMSProviderSecrets', customSMSProvider?: { __typename?: 'SMSProviderCustomSmsProviderSecrets', timeout?: number | null, url: string } | null, twilioCredentials?: { __typename?: 'SMSProviderTwilioCredentials', accountSID: string, authToken?: string | null, messagingServiceSID: string } | null } | null }, viewer: { __typename?: 'Collaborator', id: string, role: Types.CollaboratorRole, createdAt: any, user: { __typename?: 'User', id: string, email?: string | null } } } | { __typename: 'User' } | { __typename: 'Viewer' } | null }; export const AppAndSecretConfigFragmentDoc = gql` fragment AppAndSecretConfig on App { @@ -66,7 +66,7 @@ export const AppAndSecretConfigFragmentDoc = gql` } } smsProviderSecrets { - customSmsProvider { + customSMSProvider { timeout url } diff --git a/portal/src/graphql/portal/query/appAndSecretConfigQuery.graphql b/portal/src/graphql/portal/query/appAndSecretConfigQuery.graphql index cc82c50293..ac864e7a33 100644 --- a/portal/src/graphql/portal/query/appAndSecretConfigQuery.graphql +++ b/portal/src/graphql/portal/query/appAndSecretConfigQuery.graphql @@ -50,7 +50,7 @@ fragment AppAndSecretConfig on App { } } smsProviderSecrets { - customSmsProvider { + customSMSProvider { timeout url } diff --git a/portal/src/graphql/portal/schema.graphql b/portal/src/graphql/portal/schema.graphql index e333dea192..8bea6e2869 100644 --- a/portal/src/graphql/portal/schema.graphql +++ b/portal/src/graphql/portal/schema.graphql @@ -788,7 +788,7 @@ type SMSProviderCustomSmsProviderSecrets { """SMS Provider secrets""" type SMSProviderSecrets { """""" - customSmsProvider: SMSProviderCustomSmsProviderSecrets + customSMSProvider: SMSProviderCustomSmsProviderSecrets """""" twilioCredentials: SMSProviderTwilioCredentials @@ -797,7 +797,7 @@ type SMSProviderSecrets { """""" input SMSProviderSecretsSetDataInput { """""" - customSmsProvider: CustomSmsProviderSecretsInput + customSMSProvider: CustomSmsProviderSecretsInput """""" twilioCredentials: SMSProviderTwilioCredentialsInput diff --git a/portal/src/types.ts b/portal/src/types.ts index 7494ac2f1b..201f7087d2 100644 --- a/portal/src/types.ts +++ b/portal/src/types.ts @@ -704,7 +704,7 @@ export interface SAMLIdpSigningSecrets { export interface SMSProviderSecrets { twilioCredentials?: SMSProviderTwilioCredentials | null; - customSmsProvider?: SMSProviderCustomSmsProviderSecrets | null; + customSMSProvider?: SMSProviderCustomSmsProviderSecrets | null; } export interface SMSProviderTwilioCredentials { @@ -824,7 +824,7 @@ export interface CustomSmsProviderSecretsInput { export interface SMSProviderSecretsSetDataInput { twilioCredentials?: SMSProviderTwilioCredentialsInput; - customSmsProvider?: CustomSmsProviderSecretsInput; + customSMSProvider?: CustomSmsProviderSecretsInput; } export interface SMSProviderSecretsUpdateInstructions { From 2193679c37dfa2ca0fd4bec0393498cc3ca5d7ab Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Thu, 16 Jan 2025 15:16:55 +0800 Subject: [PATCH 29/33] Rename SMSProviderCustomSmsProviderSecrets to SMSProviderCustomSMSProviderSecrets --- pkg/portal/graphql/app.go | 2 +- portal/src/graphql/portal/globalTypes.generated.ts | 2 +- .../graphql/portal/query/appAndSecretConfigQuery.generated.ts | 4 ++-- portal/src/graphql/portal/schema.graphql | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pkg/portal/graphql/app.go b/pkg/portal/graphql/app.go index d2ee0d8555..52d97de2d8 100644 --- a/pkg/portal/graphql/app.go +++ b/pkg/portal/graphql/app.go @@ -188,7 +188,7 @@ var smsProviderTwilioCredentials = graphql.NewObject(graphql.ObjectConfig{ }) var smsProviderCustomSmsProviderSecrets = graphql.NewObject(graphql.ObjectConfig{ - Name: "SMSProviderCustomSmsProviderSecrets", + Name: "SMSProviderCustomSMSProviderSecrets", Description: "Custom SMS Provider configs", Fields: graphql.Fields{ "url": &graphql.Field{ diff --git a/portal/src/graphql/portal/globalTypes.generated.ts b/portal/src/graphql/portal/globalTypes.generated.ts index 02197c3ba6..5f17bd7f63 100644 --- a/portal/src/graphql/portal/globalTypes.generated.ts +++ b/portal/src/graphql/portal/globalTypes.generated.ts @@ -675,7 +675,7 @@ export type SamlSpSigningSecretsUpdateInstructionsInput = { /** Custom SMS Provider configs */ export type SmsProviderCustomSmsProviderSecrets = { - __typename?: 'SMSProviderCustomSmsProviderSecrets'; + __typename?: 'SMSProviderCustomSMSProviderSecrets'; timeout?: Maybe; url: Scalars['String']['output']; }; diff --git a/portal/src/graphql/portal/query/appAndSecretConfigQuery.generated.ts b/portal/src/graphql/portal/query/appAndSecretConfigQuery.generated.ts index eccc743a50..2c510bf76e 100644 --- a/portal/src/graphql/portal/query/appAndSecretConfigQuery.generated.ts +++ b/portal/src/graphql/portal/query/appAndSecretConfigQuery.generated.ts @@ -3,7 +3,7 @@ import * as Types from '../globalTypes.generated'; import { gql } from '@apollo/client'; import * as Apollo from '@apollo/client'; const defaultOptions = {} as const; -export type AppAndSecretConfigFragment = { __typename?: 'App', id: string, effectiveAppConfig: any, rawAppConfig: any, rawAppConfigChecksum: any, secretConfigChecksum: any, samlIdpEntityID: string, secretConfig: { __typename?: 'SecretConfig', oauthSSOProviderClientSecrets?: Array<{ __typename?: 'OAuthSSOProviderClientSecret', alias: string, clientSecret?: string | null }> | null, webhookSecret?: { __typename?: 'WebhookSecret', secret?: string | null } | null, adminAPISecrets?: Array<{ __typename?: 'AdminAPISecret', keyID: string, createdAt?: any | null, publicKeyPEM: string, privateKeyPEM?: string | null }> | null, smtpSecret?: { __typename?: 'SMTPSecret', host: string, port: number, username: string, password?: string | null } | null, oauthClientSecrets?: Array<{ __typename?: 'oauthClientSecretItem', clientID: string, keys?: Array<{ __typename?: 'oauthClientSecretKey', keyID: string, createdAt?: any | null, key: string }> | null }> | null, botProtectionProviderSecret?: { __typename?: 'BotProtectionProviderSecret', type: string, secretKey?: string | null } | null, samlIdpSigningSecrets?: { __typename?: 'SAMLIdpSigningSecrets', certificates: Array<{ __typename?: 'SAMLIdpSigningCertificate', certificateFingerprint: string, certificatePEM: string, keyID: string }> } | null, samlSpSigningSecrets?: Array<{ __typename?: 'SAMLSpSigningSecrets', clientID: string, certificates: Array<{ __typename?: 'samlSpSigningCertificate', certificateFingerprint: string, certificatePEM: string }> }> | null, smsProviderSecrets?: { __typename?: 'SMSProviderSecrets', customSMSProvider?: { __typename?: 'SMSProviderCustomSmsProviderSecrets', timeout?: number | null, url: string } | null, twilioCredentials?: { __typename?: 'SMSProviderTwilioCredentials', accountSID: string, authToken?: string | null, messagingServiceSID: string } | null } | null }, viewer: { __typename?: 'Collaborator', id: string, role: Types.CollaboratorRole, createdAt: any, user: { __typename?: 'User', id: string, email?: string | null } } }; +export type AppAndSecretConfigFragment = { __typename?: 'App', id: string, effectiveAppConfig: any, rawAppConfig: any, rawAppConfigChecksum: any, secretConfigChecksum: any, samlIdpEntityID: string, secretConfig: { __typename?: 'SecretConfig', oauthSSOProviderClientSecrets?: Array<{ __typename?: 'OAuthSSOProviderClientSecret', alias: string, clientSecret?: string | null }> | null, webhookSecret?: { __typename?: 'WebhookSecret', secret?: string | null } | null, adminAPISecrets?: Array<{ __typename?: 'AdminAPISecret', keyID: string, createdAt?: any | null, publicKeyPEM: string, privateKeyPEM?: string | null }> | null, smtpSecret?: { __typename?: 'SMTPSecret', host: string, port: number, username: string, password?: string | null } | null, oauthClientSecrets?: Array<{ __typename?: 'oauthClientSecretItem', clientID: string, keys?: Array<{ __typename?: 'oauthClientSecretKey', keyID: string, createdAt?: any | null, key: string }> | null }> | null, botProtectionProviderSecret?: { __typename?: 'BotProtectionProviderSecret', type: string, secretKey?: string | null } | null, samlIdpSigningSecrets?: { __typename?: 'SAMLIdpSigningSecrets', certificates: Array<{ __typename?: 'SAMLIdpSigningCertificate', certificateFingerprint: string, certificatePEM: string, keyID: string }> } | null, samlSpSigningSecrets?: Array<{ __typename?: 'SAMLSpSigningSecrets', clientID: string, certificates: Array<{ __typename?: 'samlSpSigningCertificate', certificateFingerprint: string, certificatePEM: string }> }> | null, smsProviderSecrets?: { __typename?: 'SMSProviderSecrets', customSMSProvider?: { __typename?: 'SMSProviderCustomSMSProviderSecrets', timeout?: number | null, url: string } | null, twilioCredentials?: { __typename?: 'SMSProviderTwilioCredentials', accountSID: string, authToken?: string | null, messagingServiceSID: string } | null } | null }, viewer: { __typename?: 'Collaborator', id: string, role: Types.CollaboratorRole, createdAt: any, user: { __typename?: 'User', id: string, email?: string | null } } }; export type AppAndSecretConfigQueryQueryVariables = Types.Exact<{ id: Types.Scalars['ID']['input']; @@ -11,7 +11,7 @@ export type AppAndSecretConfigQueryQueryVariables = Types.Exact<{ }>; -export type AppAndSecretConfigQueryQuery = { __typename?: 'Query', node?: { __typename: 'App', id: string, effectiveAppConfig: any, rawAppConfig: any, rawAppConfigChecksum: any, secretConfigChecksum: any, samlIdpEntityID: string, secretConfig: { __typename?: 'SecretConfig', oauthSSOProviderClientSecrets?: Array<{ __typename?: 'OAuthSSOProviderClientSecret', alias: string, clientSecret?: string | null }> | null, webhookSecret?: { __typename?: 'WebhookSecret', secret?: string | null } | null, adminAPISecrets?: Array<{ __typename?: 'AdminAPISecret', keyID: string, createdAt?: any | null, publicKeyPEM: string, privateKeyPEM?: string | null }> | null, smtpSecret?: { __typename?: 'SMTPSecret', host: string, port: number, username: string, password?: string | null } | null, oauthClientSecrets?: Array<{ __typename?: 'oauthClientSecretItem', clientID: string, keys?: Array<{ __typename?: 'oauthClientSecretKey', keyID: string, createdAt?: any | null, key: string }> | null }> | null, botProtectionProviderSecret?: { __typename?: 'BotProtectionProviderSecret', type: string, secretKey?: string | null } | null, samlIdpSigningSecrets?: { __typename?: 'SAMLIdpSigningSecrets', certificates: Array<{ __typename?: 'SAMLIdpSigningCertificate', certificateFingerprint: string, certificatePEM: string, keyID: string }> } | null, samlSpSigningSecrets?: Array<{ __typename?: 'SAMLSpSigningSecrets', clientID: string, certificates: Array<{ __typename?: 'samlSpSigningCertificate', certificateFingerprint: string, certificatePEM: string }> }> | null, smsProviderSecrets?: { __typename?: 'SMSProviderSecrets', customSMSProvider?: { __typename?: 'SMSProviderCustomSmsProviderSecrets', timeout?: number | null, url: string } | null, twilioCredentials?: { __typename?: 'SMSProviderTwilioCredentials', accountSID: string, authToken?: string | null, messagingServiceSID: string } | null } | null }, viewer: { __typename?: 'Collaborator', id: string, role: Types.CollaboratorRole, createdAt: any, user: { __typename?: 'User', id: string, email?: string | null } } } | { __typename: 'User' } | { __typename: 'Viewer' } | null }; +export type AppAndSecretConfigQueryQuery = { __typename?: 'Query', node?: { __typename: 'App', id: string, effectiveAppConfig: any, rawAppConfig: any, rawAppConfigChecksum: any, secretConfigChecksum: any, samlIdpEntityID: string, secretConfig: { __typename?: 'SecretConfig', oauthSSOProviderClientSecrets?: Array<{ __typename?: 'OAuthSSOProviderClientSecret', alias: string, clientSecret?: string | null }> | null, webhookSecret?: { __typename?: 'WebhookSecret', secret?: string | null } | null, adminAPISecrets?: Array<{ __typename?: 'AdminAPISecret', keyID: string, createdAt?: any | null, publicKeyPEM: string, privateKeyPEM?: string | null }> | null, smtpSecret?: { __typename?: 'SMTPSecret', host: string, port: number, username: string, password?: string | null } | null, oauthClientSecrets?: Array<{ __typename?: 'oauthClientSecretItem', clientID: string, keys?: Array<{ __typename?: 'oauthClientSecretKey', keyID: string, createdAt?: any | null, key: string }> | null }> | null, botProtectionProviderSecret?: { __typename?: 'BotProtectionProviderSecret', type: string, secretKey?: string | null } | null, samlIdpSigningSecrets?: { __typename?: 'SAMLIdpSigningSecrets', certificates: Array<{ __typename?: 'SAMLIdpSigningCertificate', certificateFingerprint: string, certificatePEM: string, keyID: string }> } | null, samlSpSigningSecrets?: Array<{ __typename?: 'SAMLSpSigningSecrets', clientID: string, certificates: Array<{ __typename?: 'samlSpSigningCertificate', certificateFingerprint: string, certificatePEM: string }> }> | null, smsProviderSecrets?: { __typename?: 'SMSProviderSecrets', customSMSProvider?: { __typename?: 'SMSProviderCustomSMSProviderSecrets', timeout?: number | null, url: string } | null, twilioCredentials?: { __typename?: 'SMSProviderTwilioCredentials', accountSID: string, authToken?: string | null, messagingServiceSID: string } | null } | null }, viewer: { __typename?: 'Collaborator', id: string, role: Types.CollaboratorRole, createdAt: any, user: { __typename?: 'User', id: string, email?: string | null } } } | { __typename: 'User' } | { __typename: 'Viewer' } | null }; export const AppAndSecretConfigFragmentDoc = gql` fragment AppAndSecretConfig on App { diff --git a/portal/src/graphql/portal/schema.graphql b/portal/src/graphql/portal/schema.graphql index 8bea6e2869..56e847caa4 100644 --- a/portal/src/graphql/portal/schema.graphql +++ b/portal/src/graphql/portal/schema.graphql @@ -777,7 +777,7 @@ input SAMLSpSigningSecretsUpdateInstructionsInput { } """Custom SMS Provider configs""" -type SMSProviderCustomSmsProviderSecrets { +type SMSProviderCustomSMSProviderSecrets { """""" timeout: Int @@ -788,7 +788,7 @@ type SMSProviderCustomSmsProviderSecrets { """SMS Provider secrets""" type SMSProviderSecrets { """""" - customSMSProvider: SMSProviderCustomSmsProviderSecrets + customSMSProvider: SMSProviderCustomSMSProviderSecrets """""" twilioCredentials: SMSProviderTwilioCredentials From fa74295df4f220bfaa8e6e0da70420d613f4285b Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Thu, 16 Jan 2025 15:23:45 +0800 Subject: [PATCH 30/33] Rename customSMSProvider to customSMSProviderCredentials --- pkg/lib/config/secret_update_instruction.go | 2 +- pkg/portal/graphql/app.go | 2 +- pkg/portal/graphql/app_mutation.go | 2 +- pkg/portal/model/app.go | 6 +- .../portal/SMSProviderConfigurationScreen.tsx | 59 +++++++++++-------- .../graphql/portal/globalTypes.generated.ts | 4 +- .../appAndSecretConfigQuery.generated.ts | 6 +- .../query/appAndSecretConfigQuery.graphql | 2 +- portal/src/graphql/portal/schema.graphql | 4 +- portal/src/types.ts | 6 +- 10 files changed, 51 insertions(+), 42 deletions(-) diff --git a/pkg/lib/config/secret_update_instruction.go b/pkg/lib/config/secret_update_instruction.go index 4da6347e41..a6da8bf2c0 100644 --- a/pkg/lib/config/secret_update_instruction.go +++ b/pkg/lib/config/secret_update_instruction.go @@ -776,7 +776,7 @@ func (i *SAMLSpSigningSecretsUpdateInstruction) set(currentConfig *SecretConfig) type SMSProviderSecretsUpdateInstructionSetData struct { TwilioCredentials *SMSProviderSecretsUpdateInstructionTwilioCredentials `json:"twilioCredentials,omitempty"` - CustomSMSProvider *SMSProviderSecretsUpdateInstructionCustomSMSProvider `json:"customSMSProvider,omitempty"` + CustomSMSProvider *SMSProviderSecretsUpdateInstructionCustomSMSProvider `json:"customSMSProviderCredentials,omitempty"` } type SMSProviderSecretsUpdateInstructionTwilioCredentials struct { diff --git a/pkg/portal/graphql/app.go b/pkg/portal/graphql/app.go index 52d97de2d8..61a898f380 100644 --- a/pkg/portal/graphql/app.go +++ b/pkg/portal/graphql/app.go @@ -207,7 +207,7 @@ var smsProviderSecret = graphql.NewObject(graphql.ObjectConfig{ "twilioCredentials": &graphql.Field{ Type: smsProviderTwilioCredentials, }, - "customSMSProvider": &graphql.Field{ + "customSMSProviderCredentials": &graphql.Field{ Type: smsProviderCustomSmsProviderSecrets, }, }, diff --git a/pkg/portal/graphql/app_mutation.go b/pkg/portal/graphql/app_mutation.go index 2e69a4654c..f7820711ca 100644 --- a/pkg/portal/graphql/app_mutation.go +++ b/pkg/portal/graphql/app_mutation.go @@ -139,7 +139,7 @@ var smsProviderSecretsSetDataInput = graphql.NewInputObject(graphql.InputObjectC "twilioCredentials": &graphql.InputObjectFieldConfig{ Type: smsProviderTwilioCredentialsInput, }, - "customSMSProvider": &graphql.InputObjectFieldConfig{ + "customSMSProviderCredentials": &graphql.InputObjectFieldConfig{ Type: customSmsProviderSecretsInput, }, }, diff --git a/pkg/portal/model/app.go b/pkg/portal/model/app.go index b65644d2db..efef626090 100644 --- a/pkg/portal/model/app.go +++ b/pkg/portal/model/app.go @@ -96,8 +96,8 @@ type SMSProviderCustomSMSProviderConfigs struct { } type SMSProviderSecrets struct { - TwilioCredentials *SMSProviderTwilioCredentials `json:"twilioCredentials,omitempty"` - CustomSMSProvider *SMSProviderCustomSMSProviderConfigs `json:"customSMSProvider,omitempty"` + TwilioCredentials *SMSProviderTwilioCredentials `json:"twilioCredentials,omitempty"` + CustomSMSProviderCredentials *SMSProviderCustomSMSProviderConfigs `json:"customSMSProviderCredentials,omitempty"` } type SecretConfig struct { @@ -277,7 +277,7 @@ func NewSecretConfig(secretConfig *config.SecretConfig, unmaskedSecrets []config } if customSMSProviderConfig, ok := secretConfig.LookupData(config.CustomSMSProviderConfigKey).(*config.CustomSMSProviderConfig); ok { - smsProviderSecrets.CustomSMSProvider = &SMSProviderCustomSMSProviderConfigs{ + smsProviderSecrets.CustomSMSProviderCredentials = &SMSProviderCustomSMSProviderConfigs{ URL: customSMSProviderConfig.URL, Timeout: (*int)(customSMSProviderConfig.Timeout), } diff --git a/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx b/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx index 7df7b5e209..f2ad738341 100644 --- a/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx +++ b/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx @@ -122,7 +122,7 @@ function constructFormState( config.messaging?.sms_gateway != null && config.messaging.sms_gateway.provider === "custom"; const hasCustomProviderSecrets = - secrets.smsProviderSecrets?.customSMSProvider != null; + secrets.smsProviderSecrets?.customSMSProviderCredentials != null; if (isSMSGatewayIsTwilio && hasCustomTwilioCredentials) { enabled = true; @@ -130,13 +130,15 @@ function constructFormState( } else if (isSMSGatewayIsCustom && hasCustomProviderSecrets) { enabled = true; if ( - getHookKind(secrets.smsProviderSecrets!.customSMSProvider!.url) === - "denohook" + getHookKind( + secrets.smsProviderSecrets!.customSMSProviderCredentials!.url + ) === "denohook" ) { } providerType = - getHookKind(secrets.smsProviderSecrets!.customSMSProvider!.url) === - "denohook" + getHookKind( + secrets.smsProviderSecrets!.customSMSProviderCredentials!.url + ) === "denohook" ? SMSProviderType.Deno : SMSProviderType.Webhook; } else { @@ -168,19 +170,24 @@ function constructFormState( enabled && (providerType === SMSProviderType.Webhook || providerType === SMSProviderType.Deno) && - secrets.smsProviderSecrets?.customSMSProvider != null + secrets.smsProviderSecrets?.customSMSProviderCredentials != null ) { if ( - getHookKind(secrets.smsProviderSecrets.customSMSProvider.url) === - "denohook" + getHookKind( + secrets.smsProviderSecrets.customSMSProviderCredentials.url + ) === "denohook" ) { - denoHookURL = secrets.smsProviderSecrets.customSMSProvider.url; + denoHookURL = secrets.smsProviderSecrets.customSMSProviderCredentials.url; } else { - webhookURL = secrets.smsProviderSecrets.customSMSProvider.url; + webhookURL = secrets.smsProviderSecrets.customSMSProviderCredentials.url; } - if (secrets.smsProviderSecrets.customSMSProvider.timeout != null) { - denoHookTimeout = secrets.smsProviderSecrets.customSMSProvider.timeout; - webhookTimeout = secrets.smsProviderSecrets.customSMSProvider.timeout; + if ( + secrets.smsProviderSecrets.customSMSProviderCredentials.timeout != null + ) { + denoHookTimeout = + secrets.smsProviderSecrets.customSMSProviderCredentials.timeout; + webhookTimeout = + secrets.smsProviderSecrets.customSMSProviderCredentials.timeout; } } return { @@ -251,7 +258,7 @@ function constructConfig( break; case SMSProviderType.Webhook: secrets.smsProviderSecrets = { - customSMSProvider: { + customSMSProviderCredentials: { url: currentState.webhookURL, timeout: currentState.webhookTimeout, }, @@ -259,7 +266,7 @@ function constructConfig( break; case SMSProviderType.Deno: secrets.smsProviderSecrets = { - customSMSProvider: { + customSMSProviderCredentials: { url: currentState.denoHookURL, timeout: currentState.denoHookTimeout, }, @@ -306,33 +313,35 @@ function constructSecretUpdateInstruction( }, }; case SMSProviderType.Webhook: - if (secrets.smsProviderSecrets.customSMSProvider == null) { - console.error("unexpected null customSMSProvider"); + if (secrets.smsProviderSecrets.customSMSProviderCredentials == null) { + console.error("unexpected null customSMSProviderCredentials"); return undefined; } return { smsProviderSecrets: { action: "set", setData: { - customSMSProvider: { - url: secrets.smsProviderSecrets.customSMSProvider.url, - timeout: secrets.smsProviderSecrets.customSMSProvider.timeout, + customSMSProviderCredentials: { + url: secrets.smsProviderSecrets.customSMSProviderCredentials.url, + timeout: + secrets.smsProviderSecrets.customSMSProviderCredentials.timeout, }, }, }, }; case SMSProviderType.Deno: - if (secrets.smsProviderSecrets.customSMSProvider == null) { - console.error("unexpected null customSMSProvider"); + if (secrets.smsProviderSecrets.customSMSProviderCredentials == null) { + console.error("unexpected null customSMSProviderCredentials"); return undefined; } return { smsProviderSecrets: { action: "set", setData: { - customSMSProvider: { - url: secrets.smsProviderSecrets.customSMSProvider.url, - timeout: secrets.smsProviderSecrets.customSMSProvider.timeout, + customSMSProviderCredentials: { + url: secrets.smsProviderSecrets.customSMSProviderCredentials.url, + timeout: + secrets.smsProviderSecrets.customSMSProviderCredentials.timeout, }, }, }, diff --git a/portal/src/graphql/portal/globalTypes.generated.ts b/portal/src/graphql/portal/globalTypes.generated.ts index 5f17bd7f63..58b3506b8c 100644 --- a/portal/src/graphql/portal/globalTypes.generated.ts +++ b/portal/src/graphql/portal/globalTypes.generated.ts @@ -683,12 +683,12 @@ export type SmsProviderCustomSmsProviderSecrets = { /** SMS Provider secrets */ export type SmsProviderSecrets = { __typename?: 'SMSProviderSecrets'; - customSMSProvider?: Maybe; + customSMSProviderCredentials?: Maybe; twilioCredentials?: Maybe; }; export type SmsProviderSecretsSetDataInput = { - customSMSProvider?: InputMaybe; + customSMSProviderCredentials?: InputMaybe; twilioCredentials?: InputMaybe; }; diff --git a/portal/src/graphql/portal/query/appAndSecretConfigQuery.generated.ts b/portal/src/graphql/portal/query/appAndSecretConfigQuery.generated.ts index 2c510bf76e..3bb7d50c81 100644 --- a/portal/src/graphql/portal/query/appAndSecretConfigQuery.generated.ts +++ b/portal/src/graphql/portal/query/appAndSecretConfigQuery.generated.ts @@ -3,7 +3,7 @@ import * as Types from '../globalTypes.generated'; import { gql } from '@apollo/client'; import * as Apollo from '@apollo/client'; const defaultOptions = {} as const; -export type AppAndSecretConfigFragment = { __typename?: 'App', id: string, effectiveAppConfig: any, rawAppConfig: any, rawAppConfigChecksum: any, secretConfigChecksum: any, samlIdpEntityID: string, secretConfig: { __typename?: 'SecretConfig', oauthSSOProviderClientSecrets?: Array<{ __typename?: 'OAuthSSOProviderClientSecret', alias: string, clientSecret?: string | null }> | null, webhookSecret?: { __typename?: 'WebhookSecret', secret?: string | null } | null, adminAPISecrets?: Array<{ __typename?: 'AdminAPISecret', keyID: string, createdAt?: any | null, publicKeyPEM: string, privateKeyPEM?: string | null }> | null, smtpSecret?: { __typename?: 'SMTPSecret', host: string, port: number, username: string, password?: string | null } | null, oauthClientSecrets?: Array<{ __typename?: 'oauthClientSecretItem', clientID: string, keys?: Array<{ __typename?: 'oauthClientSecretKey', keyID: string, createdAt?: any | null, key: string }> | null }> | null, botProtectionProviderSecret?: { __typename?: 'BotProtectionProviderSecret', type: string, secretKey?: string | null } | null, samlIdpSigningSecrets?: { __typename?: 'SAMLIdpSigningSecrets', certificates: Array<{ __typename?: 'SAMLIdpSigningCertificate', certificateFingerprint: string, certificatePEM: string, keyID: string }> } | null, samlSpSigningSecrets?: Array<{ __typename?: 'SAMLSpSigningSecrets', clientID: string, certificates: Array<{ __typename?: 'samlSpSigningCertificate', certificateFingerprint: string, certificatePEM: string }> }> | null, smsProviderSecrets?: { __typename?: 'SMSProviderSecrets', customSMSProvider?: { __typename?: 'SMSProviderCustomSMSProviderSecrets', timeout?: number | null, url: string } | null, twilioCredentials?: { __typename?: 'SMSProviderTwilioCredentials', accountSID: string, authToken?: string | null, messagingServiceSID: string } | null } | null }, viewer: { __typename?: 'Collaborator', id: string, role: Types.CollaboratorRole, createdAt: any, user: { __typename?: 'User', id: string, email?: string | null } } }; +export type AppAndSecretConfigFragment = { __typename?: 'App', id: string, effectiveAppConfig: any, rawAppConfig: any, rawAppConfigChecksum: any, secretConfigChecksum: any, samlIdpEntityID: string, secretConfig: { __typename?: 'SecretConfig', oauthSSOProviderClientSecrets?: Array<{ __typename?: 'OAuthSSOProviderClientSecret', alias: string, clientSecret?: string | null }> | null, webhookSecret?: { __typename?: 'WebhookSecret', secret?: string | null } | null, adminAPISecrets?: Array<{ __typename?: 'AdminAPISecret', keyID: string, createdAt?: any | null, publicKeyPEM: string, privateKeyPEM?: string | null }> | null, smtpSecret?: { __typename?: 'SMTPSecret', host: string, port: number, username: string, password?: string | null } | null, oauthClientSecrets?: Array<{ __typename?: 'oauthClientSecretItem', clientID: string, keys?: Array<{ __typename?: 'oauthClientSecretKey', keyID: string, createdAt?: any | null, key: string }> | null }> | null, botProtectionProviderSecret?: { __typename?: 'BotProtectionProviderSecret', type: string, secretKey?: string | null } | null, samlIdpSigningSecrets?: { __typename?: 'SAMLIdpSigningSecrets', certificates: Array<{ __typename?: 'SAMLIdpSigningCertificate', certificateFingerprint: string, certificatePEM: string, keyID: string }> } | null, samlSpSigningSecrets?: Array<{ __typename?: 'SAMLSpSigningSecrets', clientID: string, certificates: Array<{ __typename?: 'samlSpSigningCertificate', certificateFingerprint: string, certificatePEM: string }> }> | null, smsProviderSecrets?: { __typename?: 'SMSProviderSecrets', customSMSProviderCredentials?: { __typename?: 'SMSProviderCustomSMSProviderSecrets', timeout?: number | null, url: string } | null, twilioCredentials?: { __typename?: 'SMSProviderTwilioCredentials', accountSID: string, authToken?: string | null, messagingServiceSID: string } | null } | null }, viewer: { __typename?: 'Collaborator', id: string, role: Types.CollaboratorRole, createdAt: any, user: { __typename?: 'User', id: string, email?: string | null } } }; export type AppAndSecretConfigQueryQueryVariables = Types.Exact<{ id: Types.Scalars['ID']['input']; @@ -11,7 +11,7 @@ export type AppAndSecretConfigQueryQueryVariables = Types.Exact<{ }>; -export type AppAndSecretConfigQueryQuery = { __typename?: 'Query', node?: { __typename: 'App', id: string, effectiveAppConfig: any, rawAppConfig: any, rawAppConfigChecksum: any, secretConfigChecksum: any, samlIdpEntityID: string, secretConfig: { __typename?: 'SecretConfig', oauthSSOProviderClientSecrets?: Array<{ __typename?: 'OAuthSSOProviderClientSecret', alias: string, clientSecret?: string | null }> | null, webhookSecret?: { __typename?: 'WebhookSecret', secret?: string | null } | null, adminAPISecrets?: Array<{ __typename?: 'AdminAPISecret', keyID: string, createdAt?: any | null, publicKeyPEM: string, privateKeyPEM?: string | null }> | null, smtpSecret?: { __typename?: 'SMTPSecret', host: string, port: number, username: string, password?: string | null } | null, oauthClientSecrets?: Array<{ __typename?: 'oauthClientSecretItem', clientID: string, keys?: Array<{ __typename?: 'oauthClientSecretKey', keyID: string, createdAt?: any | null, key: string }> | null }> | null, botProtectionProviderSecret?: { __typename?: 'BotProtectionProviderSecret', type: string, secretKey?: string | null } | null, samlIdpSigningSecrets?: { __typename?: 'SAMLIdpSigningSecrets', certificates: Array<{ __typename?: 'SAMLIdpSigningCertificate', certificateFingerprint: string, certificatePEM: string, keyID: string }> } | null, samlSpSigningSecrets?: Array<{ __typename?: 'SAMLSpSigningSecrets', clientID: string, certificates: Array<{ __typename?: 'samlSpSigningCertificate', certificateFingerprint: string, certificatePEM: string }> }> | null, smsProviderSecrets?: { __typename?: 'SMSProviderSecrets', customSMSProvider?: { __typename?: 'SMSProviderCustomSMSProviderSecrets', timeout?: number | null, url: string } | null, twilioCredentials?: { __typename?: 'SMSProviderTwilioCredentials', accountSID: string, authToken?: string | null, messagingServiceSID: string } | null } | null }, viewer: { __typename?: 'Collaborator', id: string, role: Types.CollaboratorRole, createdAt: any, user: { __typename?: 'User', id: string, email?: string | null } } } | { __typename: 'User' } | { __typename: 'Viewer' } | null }; +export type AppAndSecretConfigQueryQuery = { __typename?: 'Query', node?: { __typename: 'App', id: string, effectiveAppConfig: any, rawAppConfig: any, rawAppConfigChecksum: any, secretConfigChecksum: any, samlIdpEntityID: string, secretConfig: { __typename?: 'SecretConfig', oauthSSOProviderClientSecrets?: Array<{ __typename?: 'OAuthSSOProviderClientSecret', alias: string, clientSecret?: string | null }> | null, webhookSecret?: { __typename?: 'WebhookSecret', secret?: string | null } | null, adminAPISecrets?: Array<{ __typename?: 'AdminAPISecret', keyID: string, createdAt?: any | null, publicKeyPEM: string, privateKeyPEM?: string | null }> | null, smtpSecret?: { __typename?: 'SMTPSecret', host: string, port: number, username: string, password?: string | null } | null, oauthClientSecrets?: Array<{ __typename?: 'oauthClientSecretItem', clientID: string, keys?: Array<{ __typename?: 'oauthClientSecretKey', keyID: string, createdAt?: any | null, key: string }> | null }> | null, botProtectionProviderSecret?: { __typename?: 'BotProtectionProviderSecret', type: string, secretKey?: string | null } | null, samlIdpSigningSecrets?: { __typename?: 'SAMLIdpSigningSecrets', certificates: Array<{ __typename?: 'SAMLIdpSigningCertificate', certificateFingerprint: string, certificatePEM: string, keyID: string }> } | null, samlSpSigningSecrets?: Array<{ __typename?: 'SAMLSpSigningSecrets', clientID: string, certificates: Array<{ __typename?: 'samlSpSigningCertificate', certificateFingerprint: string, certificatePEM: string }> }> | null, smsProviderSecrets?: { __typename?: 'SMSProviderSecrets', customSMSProviderCredentials?: { __typename?: 'SMSProviderCustomSMSProviderSecrets', timeout?: number | null, url: string } | null, twilioCredentials?: { __typename?: 'SMSProviderTwilioCredentials', accountSID: string, authToken?: string | null, messagingServiceSID: string } | null } | null }, viewer: { __typename?: 'Collaborator', id: string, role: Types.CollaboratorRole, createdAt: any, user: { __typename?: 'User', id: string, email?: string | null } } } | { __typename: 'User' } | { __typename: 'Viewer' } | null }; export const AppAndSecretConfigFragmentDoc = gql` fragment AppAndSecretConfig on App { @@ -66,7 +66,7 @@ export const AppAndSecretConfigFragmentDoc = gql` } } smsProviderSecrets { - customSMSProvider { + customSMSProviderCredentials { timeout url } diff --git a/portal/src/graphql/portal/query/appAndSecretConfigQuery.graphql b/portal/src/graphql/portal/query/appAndSecretConfigQuery.graphql index ac864e7a33..5ea14c0dc7 100644 --- a/portal/src/graphql/portal/query/appAndSecretConfigQuery.graphql +++ b/portal/src/graphql/portal/query/appAndSecretConfigQuery.graphql @@ -50,7 +50,7 @@ fragment AppAndSecretConfig on App { } } smsProviderSecrets { - customSMSProvider { + customSMSProviderCredentials { timeout url } diff --git a/portal/src/graphql/portal/schema.graphql b/portal/src/graphql/portal/schema.graphql index 56e847caa4..c419d46484 100644 --- a/portal/src/graphql/portal/schema.graphql +++ b/portal/src/graphql/portal/schema.graphql @@ -788,7 +788,7 @@ type SMSProviderCustomSMSProviderSecrets { """SMS Provider secrets""" type SMSProviderSecrets { """""" - customSMSProvider: SMSProviderCustomSMSProviderSecrets + customSMSProviderCredentials: SMSProviderCustomSMSProviderSecrets """""" twilioCredentials: SMSProviderTwilioCredentials @@ -797,7 +797,7 @@ type SMSProviderSecrets { """""" input SMSProviderSecretsSetDataInput { """""" - customSMSProvider: CustomSmsProviderSecretsInput + customSMSProviderCredentials: CustomSmsProviderSecretsInput """""" twilioCredentials: SMSProviderTwilioCredentialsInput diff --git a/portal/src/types.ts b/portal/src/types.ts index 201f7087d2..063ee58e06 100644 --- a/portal/src/types.ts +++ b/portal/src/types.ts @@ -704,7 +704,7 @@ export interface SAMLIdpSigningSecrets { export interface SMSProviderSecrets { twilioCredentials?: SMSProviderTwilioCredentials | null; - customSMSProvider?: SMSProviderCustomSmsProviderSecrets | null; + customSMSProviderCredentials?: SMSProviderCustomSMSProviderSecrets | null; } export interface SMSProviderTwilioCredentials { @@ -713,7 +713,7 @@ export interface SMSProviderTwilioCredentials { messagingServiceSID: string; } -export interface SMSProviderCustomSmsProviderSecrets { +export interface SMSProviderCustomSMSProviderSecrets { url: string; timeout?: number | null; // In seconds } @@ -824,7 +824,7 @@ export interface CustomSmsProviderSecretsInput { export interface SMSProviderSecretsSetDataInput { twilioCredentials?: SMSProviderTwilioCredentialsInput; - customSMSProvider?: CustomSmsProviderSecretsInput; + customSMSProviderCredentials?: CustomSmsProviderSecretsInput; } export interface SMSProviderSecretsUpdateInstructions { From feaf036e78704cce27c3c15760ebd849c18a0267 Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Thu, 16 Jan 2025 15:25:07 +0800 Subject: [PATCH 31/33] Update some copywritings --- portal/src/locale-data/en.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/portal/src/locale-data/en.json b/portal/src/locale-data/en.json index d96471f9d4..5c271771a1 100644 --- a/portal/src/locale-data/en.json +++ b/portal/src/locale-data/en.json @@ -1580,8 +1580,8 @@ "SMSProviderConfigurationScreen.provider.webhook.description": "Learn more about {ExternalLink, react, href{{href}} children{Webhook integration}}.", "SMSProviderConfigurationScreen.provider.deno": "Custom JS/TS", "SMSProviderConfigurationScreen.provider.deno.description": "Learn more about {ExternalLink, react, href{{href}} children{Custom JS/TS integration}}.", - "SMSProviderConfigurationScreen.form.twilio.twilioSID": "Application SID", - "SMSProviderConfigurationScreen.form.twilio.twilioAuthToken": "AuthToken", + "SMSProviderConfigurationScreen.form.twilio.twilioSID": "Twilio Account SID", + "SMSProviderConfigurationScreen.form.twilio.twilioAuthToken": "Auth Token", "SMSProviderConfigurationScreen.form.twilio.twilioMessagingServiceSID": "Messaging Service SID", "SMSProviderConfigurationScreen.form.webhook.url": "Webhook Endpoint", "SMSProviderConfigurationScreen.form.webhook.payload": "JSON Payload Sample", From 2ed0a45eb454f6c42a80c4d38c045cbfda8298b6 Mon Sep 17 00:00:00 2001 From: Tung Wu Date: Thu, 16 Jan 2025 15:31:27 +0800 Subject: [PATCH 32/33] Remove secrets of other sms providers if disabled to avoid confusion --- pkg/lib/config/secret_update_instruction.go | 33 ++++++++++++++++--- .../portal/SMSProviderConfigurationScreen.tsx | 8 ++++- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/pkg/lib/config/secret_update_instruction.go b/pkg/lib/config/secret_update_instruction.go index a6da8bf2c0..d268c64d66 100644 --- a/pkg/lib/config/secret_update_instruction.go +++ b/pkg/lib/config/secret_update_instruction.go @@ -775,8 +775,8 @@ func (i *SAMLSpSigningSecretsUpdateInstruction) set(currentConfig *SecretConfig) } type SMSProviderSecretsUpdateInstructionSetData struct { - TwilioCredentials *SMSProviderSecretsUpdateInstructionTwilioCredentials `json:"twilioCredentials,omitempty"` - CustomSMSProvider *SMSProviderSecretsUpdateInstructionCustomSMSProvider `json:"customSMSProviderCredentials,omitempty"` + TwilioCredentials *SMSProviderSecretsUpdateInstructionTwilioCredentials `json:"twilioCredentials,omitempty"` + CustomSMSProviderCredentials *SMSProviderSecretsUpdateInstructionCustomSMSProvider `json:"customSMSProviderCredentials,omitempty"` } type SMSProviderSecretsUpdateInstructionTwilioCredentials struct { @@ -834,6 +834,19 @@ func (i *SMSProviderSecretsUpdateInstruction) set(currentConfig *SecretConfig) ( return nil } + remove := func(credentialKey SecretKey) error { + newSecretItems := []SecretItem{} + + for _, item := range out.Secrets { + if item.Key != credentialKey { + newSecretItems = append(newSecretItems, item) + } + } + + out.Secrets = newSecretItems + return nil + } + if i.SetData.TwilioCredentials != nil { twilioCredentials := TwilioCredentials{ AccountSID: i.SetData.TwilioCredentials.AccountSID, @@ -844,17 +857,27 @@ func (i *SMSProviderSecretsUpdateInstruction) set(currentConfig *SecretConfig) ( if err != nil { return nil, err } + } else { + err := remove(TwilioCredentialsKey) + if err != nil { + return nil, err + } } - if i.SetData.CustomSMSProvider != nil { + if i.SetData.CustomSMSProviderCredentials != nil { customSMSProviderConfig := CustomSMSProviderConfig{ - URL: i.SetData.CustomSMSProvider.URL, - Timeout: i.SetData.CustomSMSProvider.Timeout, + URL: i.SetData.CustomSMSProviderCredentials.URL, + Timeout: i.SetData.CustomSMSProviderCredentials.Timeout, } err := upsert(CustomSMSProviderConfigKey, customSMSProviderConfig) if err != nil { return nil, err } + } else { + err := remove(CustomSMSProviderConfigKey) + if err != nil { + return nil, err + } } return out, nil } diff --git a/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx b/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx index f2ad738341..5f513215f9 100644 --- a/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx +++ b/portal/src/graphql/portal/SMSProviderConfigurationScreen.tsx @@ -284,7 +284,13 @@ function constructSecretUpdateInstruction( currentState: ConfigFormState ): PortalAPISecretConfigUpdateInstruction | undefined { if (!currentState.enabled || !secrets.smsProviderSecrets) { - return undefined; + // Remove all existing secrets + return { + smsProviderSecrets: { + action: "set", + setData: {}, + }, + }; } switch (currentState.providerType) { From d8a2b82874685825b10cd15d5cea4e39591342ea Mon Sep 17 00:00:00 2001 From: Louis Chan Date: Thu, 16 Jan 2025 21:47:52 +0800 Subject: [PATCH 33/33] Enhance the validation of custom SMS provider --- pkg/lib/config/secret_custom_sms_provider.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/lib/config/secret_custom_sms_provider.go b/pkg/lib/config/secret_custom_sms_provider.go index 57e4b744da..b18d66cf9e 100644 --- a/pkg/lib/config/secret_custom_sms_provider.go +++ b/pkg/lib/config/secret_custom_sms_provider.go @@ -5,8 +5,8 @@ var _ = SecretConfigSchema.Add("CustomSMSProviderConfig", ` "type": "object", "additionalProperties": false, "properties": { - "url": { "type": "string" }, - "timeout": { "type": "integer" } + "url": { "type": "string", "format": "x_hook_uri" }, + "timeout": { "type": "integer", "minimum": 1, "maximum": 60 } }, "required": ["url"] }