Skip to content

Commit

Permalink
Extend email plugin settings api (#48048) (#48606)
Browse files Browse the repository at this point in the history
  • Loading branch information
bernardjkim authored Nov 7, 2024
1 parent c85a081 commit 2eaafdc
Show file tree
Hide file tree
Showing 11 changed files with 3,594 additions and 2,067 deletions.
41 changes: 41 additions & 0 deletions api/proto/teleport/legacy/types/types.proto
Original file line number Diff line number Diff line change
Expand Up @@ -6255,6 +6255,8 @@ message PluginSpecV1 {
PluginDatadogAccessSettings datadog = 15;
// PluginAWSICSettings holds settings for AWSICSettings
PluginAWSICSettings aws_ic = 16;
// Settings for the Email Access Request plugin
PluginEmailSettings email = 17;
}

// generation contains a unique ID that should:
Expand Down Expand Up @@ -6595,6 +6597,45 @@ message AWSICProvisioningSpec {
string bearer_token = 2;
}

// PluginEmailSettings holds the settings for an Email Access Request plugin.
message PluginEmailSettings {
option (gogoproto.equal) = true;

// Sender specifies the email sender.
string sender = 1;
// FallbackRecipient specifies the default recipient.
string fallback_recipient = 2;

// Spec configures the mail service settings.
oneof spec {
// MailgunSpec configures Mailgun service settings.
MailgunSpec mailgun_spec = 3;
// SmtpSpec configures generic SMTP service settings.
SMTPSpec smtp_spec = 4;
}
}

// MailgunSpec holds Mailgun-specific settings.
message MailgunSpec {
option (gogoproto.equal) = true;

// Domain specifies the Mailgun sending domain.
string domain = 1;
}

// SMTPSpec holds a generic SMTP service specific settings.
message SMTPSpec {
option (gogoproto.equal) = true;

// Host specifies the SMTP service host name.
string host = 1;
// Port specifies the SMTP service port number.
int32 port = 2;
// StartTLSPolicy specifies the SMTP start TLS policy used to send emails over
// SMTP.
string start_tls_policy = 3;
}

message PluginBootstrapCredentialsV1 {
oneof credentials {
PluginOAuth2AuthorizationCodeCredentials oauth2_authorization_code = 1;
Expand Down
68 changes: 68 additions & 0 deletions api/types/plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ var AllPluginTypes = []PluginType{
PluginTypeSCIM,
PluginTypeDatadog,
PluginTypeAWSIdentityCenter,
PluginTypeEmail,
}

const (
Expand Down Expand Up @@ -78,6 +79,8 @@ const (
PluginTypeDatadog = "datadog"
// PluginTypeAWSIdentityCenter indicates AWS Identity Center plugin
PluginTypeAWSIdentityCenter = "aws-identity-center"
// PluginTypeEmail indicates an Email Access Request plugin
PluginTypeEmail = "email"
)

// PluginSubkind represents the type of the plugin, e.g., access request, MDM etc.
Expand Down Expand Up @@ -356,6 +359,20 @@ func (p *PluginV1) CheckAndSetDefaults() error {
if err := settings.AwsIc.CheckAndSetDefaults(); err != nil {
return trace.Wrap(err)
}
case *PluginSpecV1_Email:
if settings.Email == nil {
return trace.BadParameter("missing Email settings")
}
if err := settings.Email.CheckAndSetDefaults(); err != nil {
return trace.Wrap(err)
}
staticCreds := p.Credentials.GetStaticCredentialsRef()
if staticCreds == nil {
return trace.BadParameter("Email plugin must be used with the static credentials ref type")
}
if len(staticCreds.Labels) == 0 {
return trace.BadParameter("labels must be specified")
}
default:
return nil
}
Expand Down Expand Up @@ -522,6 +539,8 @@ func (p *PluginV1) GetType() PluginType {
return PluginTypeDatadog
case *PluginSpecV1_AwsIc:
return PluginTypeAWSIdentityCenter
case *PluginSpecV1_Email:
return PluginTypeEmail
default:
return PluginTypeUnknown
}
Expand Down Expand Up @@ -740,6 +759,55 @@ func (c *AWSICProvisioningSpec) CheckAndSetDefaults() error {
return nil
}

func (c *PluginEmailSettings) CheckAndSetDefaults() error {
if c.Sender == "" {
return trace.BadParameter("sender must be set")
}
if c.FallbackRecipient == "" {
return trace.BadParameter("fallback_recipient must be set")
}

switch spec := c.GetSpec().(type) {
case *PluginEmailSettings_MailgunSpec:
if c.GetMailgunSpec() == nil {
return trace.BadParameter("missing Mailgun Spec")
}
if err := c.GetMailgunSpec().CheckAndSetDefaults(); err != nil {
return trace.Wrap(err)
}
case *PluginEmailSettings_SmtpSpec:
if c.GetSmtpSpec() == nil {
return trace.BadParameter("missing SMTP Spec")
}
if err := c.GetSmtpSpec().CheckAndSetDefaults(); err != nil {
return trace.Wrap(err)
}
default:
return trace.BadParameter("unknown email spec: %T", spec)
}
return nil
}

func (c *MailgunSpec) CheckAndSetDefaults() error {
if c.Domain == "" {
return trace.BadParameter("domain must be set")
}
return nil
}

func (c *SMTPSpec) CheckAndSetDefaults() error {
if c.Host == "" {
return trace.BadParameter("host must be set")
}
if c.Port == 0 {
return trace.BadParameter("port must be set")
}
if c.StartTlsPolicy == "" {
return trace.BadParameter("start TLS policy must be set")
}
return nil
}

// GetCode returns the status code
func (c PluginStatusV1) GetCode() PluginStatusCode {
return c.Code
Expand Down
Loading

0 comments on commit 2eaafdc

Please sign in to comment.