diff options
author | 木木田 <32796312+YT315@users.noreply.github.com> | 2023-05-03 05:40:46 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-02 17:40:46 -0400 |
commit | 8be6da3e2fd0b685aeb6b9e7fd9dee5a4571163a (patch) | |
tree | 1e8396be81b2b3fb303582b6abcfc55caeda5824 /services | |
parent | bcdd3c30afb69eac6ba5edd7eeeb81ec3d3ba74f (diff) | |
download | gitea-8be6da3e2fd0b685aeb6b9e7fd9dee5a4571163a.tar.gz gitea-8be6da3e2fd0b685aeb6b9e7fd9dee5a4571163a.zip |
Add ntlm authentication support for mail (#23811)
Add ntlm authentication support for mail
use "github.com/Azure/go-ntlmssp"
---------
Co-authored-by: yangtan_win <YangTan@Fitsco.com.cn>
Co-authored-by: silverwind <me@silverwind.io>
Diffstat (limited to 'services')
-rw-r--r-- | services/mailer/mailer.go | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/services/mailer/mailer.go b/services/mailer/mailer.go index 91cc8cb405..3d878b7c8c 100644 --- a/services/mailer/mailer.go +++ b/services/mailer/mailer.go @@ -26,6 +26,7 @@ import ( "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/templates" + ntlmssp "github.com/Azure/go-ntlmssp" "github.com/jaytaylor/html2text" "gopkg.in/gomail.v2" ) @@ -145,6 +146,35 @@ func (a *loginAuth) Next(fromServer []byte, more bool) ([]byte, error) { return nil, nil } +type ntlmAuth struct { + username, password, domain string + domainNeeded bool +} + +// NtlmAuth SMTP AUTH NTLM Auth Handler +func NtlmAuth(username, password string) smtp.Auth { + user, domain, domainNeeded := ntlmssp.GetDomain(username) + return &ntlmAuth{user, password, domain, domainNeeded} +} + +// Start starts SMTP NTLM Auth +func (a *ntlmAuth) Start(server *smtp.ServerInfo) (string, []byte, error) { + negotiateMessage, err := ntlmssp.NewNegotiateMessage(a.domain, "") + return "NTLM", negotiateMessage, err +} + +// Next next step of SMTP ntlm auth +func (a *ntlmAuth) Next(fromServer []byte, more bool) ([]byte, error) { + if more { + if len(fromServer) == 0 { + return nil, fmt.Errorf("ntlm ChallengeMessage is empty") + } + authenticateMessage, err := ntlmssp.ProcessChallenge(fromServer, a.username, a.password, a.domainNeeded) + return authenticateMessage, err + } + return nil, nil +} + // Sender SMTP mail sender type smtpSender struct{} @@ -237,6 +267,8 @@ func (s *smtpSender) Send(from string, to []string, msg io.WriterTo) error { } else if strings.Contains(options, "LOGIN") { // Patch for AUTH LOGIN auth = LoginAuth(opts.User, opts.Passwd) + } else if strings.Contains(options, "NTLM") { + auth = NtlmAuth(opts.User, opts.Passwd) } if auth != nil { |