diff options
Diffstat (limited to 'internal/auth/smtp/config.go')
-rw-r--r-- | internal/auth/smtp/config.go | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/internal/auth/smtp/config.go b/internal/auth/smtp/config.go new file mode 100644 index 00000000..33985f45 --- /dev/null +++ b/internal/auth/smtp/config.go @@ -0,0 +1,58 @@ +// Copyright 2020 The Gogs Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package smtp + +import ( + "crypto/tls" + "fmt" + "net/smtp" + + "github.com/pkg/errors" +) + +// Config contains configuration for SMTP authentication. +// +// ⚠️ WARNING: Change to the field name must preserve the INI key name for backward compatibility. +type Config struct { + Auth string + Host string + Port int + AllowedDomains string + TLS bool `ini:"tls"` + SkipVerify bool +} + +func (c *Config) doAuth(auth smtp.Auth) error { + client, err := smtp.Dial(fmt.Sprintf("%s:%d", c.Host, c.Port)) + if err != nil { + return err + } + defer client.Close() + + if err = client.Hello("gogs"); err != nil { + return err + } + + if c.TLS { + if ok, _ := client.Extension("STARTTLS"); ok { + if err = client.StartTLS(&tls.Config{ + InsecureSkipVerify: c.SkipVerify, + ServerName: c.Host, + }); err != nil { + return err + } + } else { + return errors.New("SMTP server does not support TLS") + } + } + + if ok, _ := client.Extension("AUTH"); ok { + if err = client.Auth(auth); err != nil { + return err + } + return nil + } + return errors.New("unsupported SMTP authentication method") +} |