aboutsummaryrefslogtreecommitdiffstats
path: root/services/mailer/sender/smtp_auth.go
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2024-11-29 17:15:41 -0800
committerGitHub <noreply@github.com>2024-11-30 01:15:41 +0000
commit79d593a9be48d8281ce9418906a540e1f98c2f7c (patch)
treee2a115fce68dbc1afa2c934b17fdb968f4ecf41d /services/mailer/sender/smtp_auth.go
parentfd3aa5bedb07d295d48b1f550c19ad1b387ba83f (diff)
downloadgitea-79d593a9be48d8281ce9418906a540e1f98c2f7c.tar.gz
gitea-79d593a9be48d8281ce9418906a540e1f98c2f7c.zip
Split mail sender sub package from mailer service package (#32618)
Move all mail sender related codes into a sub package of services/mailer. Just move, no code change. Then we just have dependencies on go-mail package in the new sub package. We can use other package to replace it because it's unmaintainable. ref #18664
Diffstat (limited to 'services/mailer/sender/smtp_auth.go')
-rw-r--r--services/mailer/sender/smtp_auth.go69
1 files changed, 69 insertions, 0 deletions
diff --git a/services/mailer/sender/smtp_auth.go b/services/mailer/sender/smtp_auth.go
new file mode 100644
index 0000000000..df65498a5a
--- /dev/null
+++ b/services/mailer/sender/smtp_auth.go
@@ -0,0 +1,69 @@
+// Copyright 2024 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package sender
+
+import (
+ "fmt"
+ "net/smtp"
+
+ "github.com/Azure/go-ntlmssp"
+)
+
+type loginAuth struct {
+ username, password string
+}
+
+// LoginAuth SMTP AUTH LOGIN Auth Handler
+func LoginAuth(username, password string) smtp.Auth {
+ return &loginAuth{username, password}
+}
+
+// Start start SMTP login auth
+func (a *loginAuth) Start(server *smtp.ServerInfo) (string, []byte, error) {
+ return "LOGIN", []byte{}, nil
+}
+
+// Next next step of SMTP login auth
+func (a *loginAuth) Next(fromServer []byte, more bool) ([]byte, error) {
+ if more {
+ switch string(fromServer) {
+ case "Username:":
+ return []byte(a.username), nil
+ case "Password:":
+ return []byte(a.password), nil
+ default:
+ return nil, fmt.Errorf("unknown fromServer: %s", string(fromServer))
+ }
+ }
+ 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
+}