diff --git a/docs/docs/apis/proto/admin.md b/docs/docs/apis/proto/admin.md
index 5e5000f423..98aed2c13f 100644
--- a/docs/docs/apis/proto/admin.md
+++ b/docs/docs/apis/proto/admin.md
@@ -224,6 +224,30 @@ Update twilio sms provider token
PUT: /sms/twilio/{id}/token
+### ActivateSMSProvider
+
+> **rpc** ActivateSMSProvider([ActivateSMSProviderRequest](#activatesmsproviderrequest))
+[ActivateSMSProviderResponse](#activatesmsproviderresponse)
+
+Activate sms provider
+
+
+
+ POST: /sms/{id}/_activate
+
+
+### DeactivateSMSProvider
+
+> **rpc** DeactivateSMSProvider([DeactivateSMSProviderRequest](#deactivatesmsproviderrequest))
+[DeactivateSMSProviderResponse](#deactivatesmsproviderresponse)
+
+Deactivate sms provider
+
+
+
+ POST: /sms/{id}/_deactivate
+
+
### RemoveSMSProvider
> **rpc** RemoveSMSProvider([RemoveSMSProviderRequest](#removesmsproviderrequest))
@@ -1482,6 +1506,28 @@ This is an empty request
+### ActivateSMSProviderRequest
+
+
+
+| Field | Type | Description | Validation |
+| ----- | ---- | ----------- | ----------- |
+| id | string | - | string.min_len: 1
string.max_len: 200
|
+
+
+
+
+### ActivateSMSProviderResponse
+
+
+
+| Field | Type | Description | Validation |
+| ----- | ---- | ----------- | ----------- |
+| details | zitadel.v1.ObjectDetails | - | |
+
+
+
+
### AddCustomDomainPolicyRequest
@@ -1753,6 +1799,28 @@ This is an empty request
+### DeactivateSMSProviderRequest
+
+
+
+| Field | Type | Description | Validation |
+| ----- | ---- | ----------- | ----------- |
+| id | string | - | string.min_len: 1
string.max_len: 200
|
+
+
+
+
+### DeactivateSMSProviderResponse
+
+
+
+| Field | Type | Description | Validation |
+| ----- | ---- | ----------- | ----------- |
+| details | zitadel.v1.ObjectDetails | - | |
+
+
+
+
### FailedEvent
diff --git a/internal/api/grpc/admin/sms.go b/internal/api/grpc/admin/sms.go
index 2332ab11d5..9f46eb8b67 100644
--- a/internal/api/grpc/admin/sms.go
+++ b/internal/api/grpc/admin/sms.go
@@ -6,7 +6,6 @@ import (
"github.com/zitadel/zitadel/internal/api/authz"
"github.com/zitadel/zitadel/internal/api/grpc/object"
admin_pb "github.com/zitadel/zitadel/pkg/grpc/admin"
- settings_pb "github.com/zitadel/zitadel/pkg/grpc/settings"
)
func (s *Server) ListSMSProviders(ctx context.Context, req *admin_pb.ListSMSProvidersRequest) (*admin_pb.ListSMSProvidersResponse, error) {
@@ -17,10 +16,10 @@ func (s *Server) ListSMSProviders(ctx context.Context, req *admin_pb.ListSMSProv
result, err := s.query.SearchSMSConfigs(ctx, queries)
if err != nil {
return nil, err
-
}
return &admin_pb.ListSMSProvidersResponse{
Details: object.ToListDetails(result.Count, result.Sequence, result.Timestamp),
+ Result: SMSConfigsToPb(result.Configs),
}, nil
}
@@ -28,15 +27,9 @@ func (s *Server) GetSMSProvider(ctx context.Context, req *admin_pb.GetSMSProvide
result, err := s.query.SMSProviderConfigByID(ctx, req.Id)
if err != nil {
return nil, err
-
}
return &admin_pb.GetSMSProviderResponse{
- Config: &settings_pb.SMSProvider{
- Details: object.ToViewDetailsPb(result.Sequence, result.CreationDate, result.ChangeDate, result.ResourceOwner),
- Id: result.ID,
- State: smsStateToPb(result.State),
- Config: SMSConfigToPb(result),
- },
+ Config: SMSConfigToProviderPb(result),
}, nil
}
@@ -44,7 +37,6 @@ func (s *Server) AddSMSProviderTwilio(ctx context.Context, req *admin_pb.AddSMSP
id, result, err := s.command.AddSMSConfigTwilio(ctx, authz.GetInstance(ctx).InstanceID(), AddSMSConfigTwilioToConfig(req))
if err != nil {
return nil, err
-
}
return &admin_pb.AddSMSProviderTwilioResponse{
Details: object.DomainToAddDetailsPb(result),
@@ -56,7 +48,6 @@ func (s *Server) UpdateSMSProviderTwilio(ctx context.Context, req *admin_pb.Upda
result, err := s.command.ChangeSMSConfigTwilio(ctx, authz.GetInstance(ctx).InstanceID(), req.Id, UpdateSMSConfigTwilioToConfig(req))
if err != nil {
return nil, err
-
}
return &admin_pb.UpdateSMSProviderTwilioResponse{
Details: object.DomainToChangeDetailsPb(result),
@@ -74,11 +65,31 @@ func (s *Server) UpdateSMSProviderTwilioToken(ctx context.Context, req *admin_pb
}, nil
}
+func (s *Server) ActivateSMSProvider(ctx context.Context, req *admin_pb.ActivateSMSProviderRequest) (*admin_pb.ActivateSMSProviderResponse, error) {
+ result, err := s.command.ActivateSMSConfig(ctx, authz.GetInstance(ctx).InstanceID(), req.Id)
+ if err != nil {
+ return nil, err
+ }
+ return &admin_pb.ActivateSMSProviderResponse{
+ Details: object.DomainToAddDetailsPb(result),
+ }, nil
+}
+
+func (s *Server) DeactivateSMSProvider(ctx context.Context, req *admin_pb.DeactivateSMSProviderRequest) (*admin_pb.DeactivateSMSProviderResponse, error) {
+ result, err := s.command.DeactivateSMSConfig(ctx, authz.GetInstance(ctx).InstanceID(), req.Id)
+ if err != nil {
+ return nil, err
+
+ }
+ return &admin_pb.DeactivateSMSProviderResponse{
+ Details: object.DomainToAddDetailsPb(result),
+ }, nil
+}
+
func (s *Server) RemoveSMSProvider(ctx context.Context, req *admin_pb.RemoveSMSProviderRequest) (*admin_pb.RemoveSMSProviderResponse, error) {
result, err := s.command.RemoveSMSConfig(ctx, authz.GetInstance(ctx).InstanceID(), req.Id)
if err != nil {
return nil, err
-
}
return &admin_pb.RemoveSMSProviderResponse{
Details: object.DomainToAddDetailsPb(result),
diff --git a/internal/api/grpc/admin/sms_converter.go b/internal/api/grpc/admin/sms_converter.go
index 214c98caa3..92edd11ebb 100644
--- a/internal/api/grpc/admin/sms_converter.go
+++ b/internal/api/grpc/admin/sms_converter.go
@@ -20,9 +20,26 @@ func listSMSConfigsToModel(req *admin_pb.ListSMSProvidersRequest) (*query.SMSCon
}, nil
}
-func SMSConfigToPb(app *query.SMSConfig) settings_pb.SMSConfig {
- if app.TwilioConfig != nil {
- return TwilioConfigToPb(app.TwilioConfig)
+func SMSConfigsToPb(configs []*query.SMSConfig) []*settings_pb.SMSProvider {
+ c := make([]*settings_pb.SMSProvider, len(configs))
+ for i, config := range configs {
+ c[i] = SMSConfigToProviderPb(config)
+ }
+ return c
+}
+
+func SMSConfigToProviderPb(config *query.SMSConfig) *settings_pb.SMSProvider {
+ return &settings_pb.SMSProvider{
+ Details: object.ToViewDetailsPb(config.Sequence, config.CreationDate, config.ChangeDate, config.ResourceOwner),
+ Id: config.ID,
+ State: smsStateToPb(config.State),
+ Config: SMSConfigToPb(config),
+ }
+}
+
+func SMSConfigToPb(config *query.SMSConfig) settings_pb.SMSConfig {
+ if config.TwilioConfig != nil {
+ return TwilioConfigToPb(config.TwilioConfig)
}
return nil
}
diff --git a/internal/command/sms_config.go b/internal/command/sms_config.go
index 3eb82b3610..71ec8a7d27 100644
--- a/internal/command/sms_config.go
+++ b/internal/command/sms_config.go
@@ -110,7 +110,7 @@ func (c *Commands) ChangeSMSConfigTwilioToken(ctx context.Context, instanceID, i
return writeModelToObjectDetails(&smsConfigWriteModel.WriteModel), nil
}
-func (c *Commands) ActivateSMSConfigTwilio(ctx context.Context, instanceID, id string) (*domain.ObjectDetails, error) {
+func (c *Commands) ActivateSMSConfig(ctx context.Context, instanceID, id string) (*domain.ObjectDetails, error) {
if id == "" {
return nil, caos_errs.ThrowInvalidArgument(nil, "SMS-dn93n", "Errors.IDMissing")
}
@@ -119,7 +119,7 @@ func (c *Commands) ActivateSMSConfigTwilio(ctx context.Context, instanceID, id s
return nil, err
}
- if !smsConfigWriteModel.State.Exists() || smsConfigWriteModel.Twilio == nil {
+ if !smsConfigWriteModel.State.Exists() {
return nil, caos_errs.ThrowNotFound(nil, "COMMAND-sn9we", "Errors.SMSConfig.NotFound")
}
if smsConfigWriteModel.State == domain.SMSConfigStateActive {
@@ -140,7 +140,7 @@ func (c *Commands) ActivateSMSConfigTwilio(ctx context.Context, instanceID, id s
return writeModelToObjectDetails(&smsConfigWriteModel.WriteModel), nil
}
-func (c *Commands) DeactivateSMSConfigTwilio(ctx context.Context, instanceID, id string) (*domain.ObjectDetails, error) {
+func (c *Commands) DeactivateSMSConfig(ctx context.Context, instanceID, id string) (*domain.ObjectDetails, error) {
if id == "" {
return nil, caos_errs.ThrowInvalidArgument(nil, "SMS-frkwf", "Errors.IDMissing")
}
@@ -148,7 +148,7 @@ func (c *Commands) DeactivateSMSConfigTwilio(ctx context.Context, instanceID, id
if err != nil {
return nil, err
}
- if !smsConfigWriteModel.State.Exists() || smsConfigWriteModel.Twilio == nil {
+ if !smsConfigWriteModel.State.Exists() {
return nil, caos_errs.ThrowNotFound(nil, "COMMAND-s39Kg", "Errors.SMSConfig.NotFound")
}
if smsConfigWriteModel.State == domain.SMSConfigStateInactive {
diff --git a/internal/command/sms_config_test.go b/internal/command/sms_config_test.go
index 987554669f..8c6b40972b 100644
--- a/internal/command/sms_config_test.go
+++ b/internal/command/sms_config_test.go
@@ -364,7 +364,7 @@ func TestCommandSide_ActivateSMSConfigTwilio(t *testing.T) {
r := &Commands{
eventstore: tt.fields.eventstore,
}
- got, err := r.ActivateSMSConfigTwilio(tt.args.ctx, tt.args.instanceID, tt.args.id)
+ got, err := r.ActivateSMSConfig(tt.args.ctx, tt.args.instanceID, tt.args.id)
if tt.res.err == nil {
assert.NoError(t, err)
}
@@ -482,7 +482,7 @@ func TestCommandSide_DeactivateSMSConfigTwilio(t *testing.T) {
r := &Commands{
eventstore: tt.fields.eventstore,
}
- got, err := r.DeactivateSMSConfigTwilio(tt.args.ctx, tt.args.instanceID, tt.args.id)
+ got, err := r.DeactivateSMSConfig(tt.args.ctx, tt.args.instanceID, tt.args.id)
if tt.res.err == nil {
assert.NoError(t, err)
}
diff --git a/internal/notification/channels/twilio/channel.go b/internal/notification/channels/twilio/channel.go
index 420cf9cab0..ff9b6b126a 100644
--- a/internal/notification/channels/twilio/channel.go
+++ b/internal/notification/channels/twilio/channel.go
@@ -1,8 +1,9 @@
package twilio
import (
- twilio "github.com/kevinburke/twilio-go"
+ "github.com/kevinburke/twilio-go"
"github.com/zitadel/logging"
+
caos_errs "github.com/zitadel/zitadel/internal/errors"
"github.com/zitadel/zitadel/internal/notification/channels"
"github.com/zitadel/zitadel/internal/notification/messages"
@@ -11,7 +12,7 @@ import (
func InitTwilioChannel(config TwilioConfig) channels.NotificationChannel {
client := twilio.NewClient(config.SID, config.Token, nil)
- logging.Log("NOTIF-KaxDZ").Debug("successfully initialized twilio sms channel")
+ logging.Debug("successfully initialized twilio sms channel")
return channels.HandleMessageFunc(func(message channels.Message) error {
twilioMsg, ok := message.(*messages.SMS)
@@ -22,7 +23,7 @@ func InitTwilioChannel(config TwilioConfig) channels.NotificationChannel {
if err != nil {
return caos_errs.ThrowInternal(err, "TWILI-osk3S", "could not send message")
}
- logging.LogWithFields("SMS_-f335c523", "message_sid", m.Sid, "status", m.Status).Debug("sms sent")
+ logging.WithFields("message_sid", m.Sid, "status", m.Status).Debug("sms sent")
return nil
})
}
diff --git a/internal/notification/repository/eventsourcing/handler/notification.go b/internal/notification/repository/eventsourcing/handler/notification.go
index a759672a0e..d33b7d1b5c 100644
--- a/internal/notification/repository/eventsourcing/handler/notification.go
+++ b/internal/notification/repository/eventsourcing/handler/notification.go
@@ -494,14 +494,18 @@ func (n *Notification) getSMTPConfig(ctx context.Context) (*smtp.EmailConfig, er
// Read iam twilio config
func (n *Notification) getTwilioConfig(ctx context.Context) (*twilio.TwilioConfig, error) {
- config, err := n.queries.SMSProviderConfigByID(ctx, authz.GetInstance(ctx).InstanceID())
+ active, err := query.NewSMSProviderStateQuery(domain.SMSConfigStateActive)
+ if err != nil {
+ return nil, err
+ }
+ config, err := n.queries.SMSProviderConfig(ctx, active)
if err != nil {
return nil, err
}
if config.TwilioConfig == nil {
return nil, errors.ThrowNotFound(nil, "HANDLER-8nfow", "Errors.SMS.Twilio.NotFound")
}
- token, err := crypto.Decrypt(config.TwilioConfig.Token, n.smtpPasswordCrypto)
+ token, err := crypto.Decrypt(config.TwilioConfig.Token, n.smsTokenCrypto)
if err != nil {
return nil, err
}
diff --git a/internal/query/projection/sms.go b/internal/query/projection/sms.go
index f0c00da3fa..5f60d6cf74 100644
--- a/internal/query/projection/sms.go
+++ b/internal/query/projection/sms.go
@@ -82,6 +82,10 @@ func (p *SMSConfigProjection) reducers() []handler.AggregateReducer {
Event: instance.SMSConfigTwilioChangedEventType,
Reduce: p.reduceSMSConfigTwilioChanged,
},
+ {
+ Event: instance.SMSConfigTwilioTokenChangedEventType,
+ Reduce: p.reduceSMSConfigTwilioTokenChanged,
+ },
{
Event: instance.SMSConfigActivatedEventType,
Reduce: p.reduceSMSConfigActivated,
@@ -111,7 +115,6 @@ func (p *SMSConfigProjection) reduceSMSConfigTwilioAdded(event eventstore.Event)
[]handler.Column{
handler.NewCol(SMSColumnID, e.ID),
handler.NewCol(SMSColumnAggregateID, e.Aggregate().ID),
- handler.NewCol(SMSTwilioColumnInstanceID, e.Aggregate().InstanceID),
handler.NewCol(SMSColumnCreationDate, e.CreationDate()),
handler.NewCol(SMSColumnChangeDate, e.CreationDate()),
handler.NewCol(SMSColumnResourceOwner, e.Aggregate().ResourceOwner),
@@ -140,10 +143,43 @@ func (p *SMSConfigProjection) reduceSMSConfigTwilioChanged(event eventstore.Even
}
columns := make([]handler.Column, 0)
if e.SID != nil {
- columns = append(columns, handler.NewCol(SMSTwilioConfigColumnSID, e.SID))
+ columns = append(columns, handler.NewCol(SMSTwilioConfigColumnSID, *e.SID))
}
if e.SenderNumber != nil {
- columns = append(columns, handler.NewCol(SMSTwilioConfigColumnSenderNumber, e.SenderNumber))
+ columns = append(columns, handler.NewCol(SMSTwilioConfigColumnSenderNumber, *e.SenderNumber))
+ }
+
+ return crdb.NewMultiStatement(
+ e,
+ crdb.AddUpdateStatement(
+ columns,
+ []handler.Condition{
+ handler.NewCond(SMSTwilioConfigColumnSMSID, e.ID),
+ handler.NewCond(SMSTwilioColumnInstanceID, e.Aggregate().InstanceID),
+ },
+ crdb.WithTableSuffix(smsTwilioTableSuffix),
+ ),
+ crdb.AddUpdateStatement(
+ []handler.Column{
+ handler.NewCol(SMSColumnChangeDate, e.CreationDate()),
+ handler.NewCol(SMSColumnSequence, e.Sequence()),
+ },
+ []handler.Condition{
+ handler.NewCond(SMSColumnID, e.ID),
+ handler.NewCond(SMSColumnInstanceID, e.Aggregate().InstanceID),
+ },
+ ),
+ ), nil
+}
+
+func (p *SMSConfigProjection) reduceSMSConfigTwilioTokenChanged(event eventstore.Event) (*handler.Statement, error) {
+ e, ok := event.(*instance.SMSConfigTwilioTokenChangedEvent)
+ if !ok {
+ return nil, errors.ThrowInvalidArgumentf(nil, "HANDL-fi99F", "reduce.wrong.event.type %s", instance.SMSConfigTwilioTokenChangedEventType)
+ }
+ columns := make([]handler.Column, 0)
+ if e.Token != nil {
+ columns = append(columns, handler.NewCol(SMSTwilioConfigColumnToken, e.Token))
}
return crdb.NewMultiStatement(
diff --git a/internal/query/projection/sms_test.go b/internal/query/projection/sms_test.go
index 9b936e461b..4dec8a490b 100644
--- a/internal/query/projection/sms_test.go
+++ b/internal/query/projection/sms_test.go
@@ -3,6 +3,7 @@ package projection
import (
"testing"
+ "github.com/zitadel/zitadel/internal/crypto"
"github.com/zitadel/zitadel/internal/domain"
"github.com/zitadel/zitadel/internal/errors"
"github.com/zitadel/zitadel/internal/eventstore"
@@ -11,12 +12,6 @@ import (
"github.com/zitadel/zitadel/internal/repository/instance"
)
-var (
- sid = "sid"
- token = "token"
- senderNumber = "sender-number"
-)
-
func TestSMSProjection_reduces(t *testing.T) {
type args struct {
event func(t *testing.T) eventstore.Event
@@ -39,7 +34,8 @@ func TestSMSProjection_reduces(t *testing.T) {
"token": {
"cryptoType": 0,
"algorithm": "RSA-265",
- "keyId": "key-id"
+ "keyId": "key-id",
+ "crypted": "Y3J5cHRlZA=="
},
"senderNumber": "sender-number"
}`),
@@ -54,11 +50,10 @@ func TestSMSProjection_reduces(t *testing.T) {
executer: &testExecuter{
executions: []execution{
{
- expectedStmt: "INSERT INTO projections.sms_configs (id, aggregate_id, instance_id, creation_date, change_date, resource_owner, instance_id, state, sequence) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)",
+ expectedStmt: "INSERT INTO projections.sms_configs (id, aggregate_id, creation_date, change_date, resource_owner, instance_id, state, sequence) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)",
expectedArgs: []interface{}{
"id",
"agg-id",
- "instance-id",
anyArg{},
anyArg{},
"ro-id",
@@ -73,7 +68,12 @@ func TestSMSProjection_reduces(t *testing.T) {
"id",
"instance-id",
"sid",
- anyArg{},
+ &crypto.CryptoValue{
+ CryptoType: crypto.TypeEncryption,
+ Algorithm: "RSA-265",
+ KeyID: "key-id",
+ Crypted: []byte("crypted"),
+ },
"sender-number",
},
},
@@ -105,8 +105,59 @@ func TestSMSProjection_reduces(t *testing.T) {
{
expectedStmt: "UPDATE projections.sms_configs_twilio SET (sid, sender_number) = ($1, $2) WHERE (sms_id = $3) AND (instance_id = $4)",
expectedArgs: []interface{}{
- &sid,
- &senderNumber,
+ "sid",
+ "sender-number",
+ "id",
+ "instance-id",
+ },
+ },
+ {
+ expectedStmt: "UPDATE projections.sms_configs SET (change_date, sequence) = ($1, $2) WHERE (id = $3) AND (instance_id = $4)",
+ expectedArgs: []interface{}{
+ anyArg{},
+ uint64(15),
+ "id",
+ "instance-id",
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ name: "instance.reduceSMSConfigTwilioTokenChanged",
+ args: args{
+ event: getEvent(testEvent(
+ repository.EventType(instance.SMSConfigTwilioTokenChangedEventType),
+ instance.AggregateType,
+ []byte(`{
+ "id": "id",
+ "token": {
+ "cryptoType": 0,
+ "algorithm": "RSA-265",
+ "keyId": "key-id",
+ "crypted": "Y3J5cHRlZA=="
+ }
+ }`),
+ ), instance.SMSConfigTwilioTokenChangedEventMapper),
+ },
+ reduce: (&SMSConfigProjection{}).reduceSMSConfigTwilioTokenChanged,
+ want: wantReduce{
+ aggregateType: eventstore.AggregateType("instance"),
+ sequence: 15,
+ previousSequence: 10,
+ projection: SMSConfigProjectionTable,
+ executer: &testExecuter{
+ executions: []execution{
+ {
+ expectedStmt: "UPDATE projections.sms_configs_twilio SET (token) = ($1) WHERE (sms_id = $2) AND (instance_id = $3)",
+ expectedArgs: []interface{}{
+ &crypto.CryptoValue{
+ CryptoType: crypto.TypeEncryption,
+ Algorithm: "RSA-265",
+ KeyID: "key-id",
+ Crypted: []byte("crypted"),
+ },
"id",
"instance-id",
},
diff --git a/internal/query/sms.go b/internal/query/sms.go
index e85ae57a03..334271e844 100644
--- a/internal/query/sms.go
+++ b/internal/query/sms.go
@@ -112,8 +112,8 @@ var (
)
func (q *Queries) SMSProviderConfigByID(ctx context.Context, id string) (*SMSConfig, error) {
- stmt, scan := prepareSMSConfigQuery()
- query, args, err := stmt.Where(
+ query, scan := prepareSMSConfigQuery()
+ stmt, args, err := query.Where(
sq.Eq{
SMSConfigColumnID.identifier(): id,
SMSConfigColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
@@ -123,7 +123,25 @@ func (q *Queries) SMSProviderConfigByID(ctx context.Context, id string) (*SMSCon
return nil, errors.ThrowInternal(err, "QUERY-dn9JW", "Errors.Query.SQLStatement")
}
- row := q.client.QueryRowContext(ctx, query, args...)
+ row := q.client.QueryRowContext(ctx, stmt, args...)
+ return scan(row)
+}
+
+func (q *Queries) SMSProviderConfig(ctx context.Context, queries ...SearchQuery) (*SMSConfig, error) {
+ query, scan := prepareSMSConfigQuery()
+ for _, searchQuery := range queries {
+ query = searchQuery.toQuery(query)
+ }
+ stmt, args, err := query.Where(
+ sq.Eq{
+ SMSConfigColumnInstanceID.identifier(): authz.GetInstance(ctx).InstanceID(),
+ },
+ ).ToSql()
+ if err != nil {
+ return nil, errors.ThrowInternal(err, "QUERY-dn9JW", "Errors.Query.SQLStatement")
+ }
+
+ row := q.client.QueryRowContext(ctx, stmt, args...)
return scan(row)
}
@@ -149,6 +167,10 @@ func (q *Queries) SearchSMSConfigs(ctx context.Context, queries *SMSConfigsSearc
return apps, err
}
+func NewSMSProviderStateQuery(state domain.SMSConfigState) (SearchQuery, error) {
+ return NewNumberQuery(SMSConfigColumnState, state, NumberEquals)
+}
+
func prepareSMSConfigQuery() (sq.SelectBuilder, func(*sql.Row) (*SMSConfig, error)) {
return sq.Select(
SMSConfigColumnID.identifier(),
diff --git a/internal/repository/instance/sms.go b/internal/repository/instance/sms.go
index 61bbe1d332..c406ba1f7d 100644
--- a/internal/repository/instance/sms.go
+++ b/internal/repository/instance/sms.go
@@ -140,7 +140,7 @@ type SMSConfigTwilioTokenChangedEvent struct {
eventstore.BaseEvent `json:"-"`
ID string `json:"id,omitempty"`
- Token *crypto.CryptoValue `json:"password,omitempty"`
+ Token *crypto.CryptoValue `json:"token,omitempty"`
}
func NewSMSConfigTokenChangedEvent(
diff --git a/proto/zitadel/admin.proto b/proto/zitadel/admin.proto
index 8f2f925fd1..c9e0add517 100644
--- a/proto/zitadel/admin.proto
+++ b/proto/zitadel/admin.proto
@@ -343,6 +343,30 @@ service AdminService {
};
}
+ // Activate sms provider
+ rpc ActivateSMSProvider(ActivateSMSProviderRequest) returns (ActivateSMSProviderResponse) {
+ option (google.api.http) = {
+ post: "/sms/{id}/_activate";
+ body: "*"
+ };
+
+ option (zitadel.v1.auth_option) = {
+ permission: "iam.write";
+ };
+ }
+
+ // Deactivate sms provider
+ rpc DeactivateSMSProvider(DeactivateSMSProviderRequest) returns (DeactivateSMSProviderResponse) {
+ option (google.api.http) = {
+ post: "/sms/{id}/_deactivate";
+ body: "*"
+ };
+
+ option (zitadel.v1.auth_option) = {
+ permission: "iam.write";
+ };
+ }
+
// Remove sms provider token
rpc RemoveSMSProvider(RemoveSMSProviderRequest) returns (RemoveSMSProviderResponse) {
option (google.api.http) = {
@@ -2783,6 +2807,22 @@ message UpdateSMSProviderTwilioTokenResponse {
zitadel.v1.ObjectDetails details = 1;
}
+message ActivateSMSProviderRequest {
+ string id = 1 [(validate.rules).string = {min_len: 1, max_len: 200}];
+}
+
+message ActivateSMSProviderResponse {
+ zitadel.v1.ObjectDetails details = 1;
+}
+
+message DeactivateSMSProviderRequest {
+ string id = 1 [(validate.rules).string = {min_len: 1, max_len: 200}];
+}
+
+message DeactivateSMSProviderResponse {
+ zitadel.v1.ObjectDetails details = 1;
+}
+
message RemoveSMSProviderRequest {
string id = 1 [(validate.rules).string = {min_len: 1, max_len: 200}];
}