Auth is the handler for supported authenticators.
(mech string)
| 86 | |
| 87 | // Auth is the handler for supported authenticators. |
| 88 | func (s *Session) Auth(mech string) (sasl.Server, error) { |
| 89 | s.backend.mu.Lock() |
| 90 | defer s.backend.mu.Unlock() |
| 91 | |
| 92 | if s.backend.lastMsg == nil { |
| 93 | s.backend.lastMsg = &Message{AuthMech: mech} |
| 94 | } |
| 95 | |
| 96 | switch mech { |
| 97 | case sasl.Plain: |
| 98 | return sasl.NewPlainServer(func(identity, username, password string) error { |
| 99 | s.backend.mu.Lock() |
| 100 | defer s.backend.mu.Unlock() |
| 101 | |
| 102 | s.backend.lastMsg.Identity = identity |
| 103 | s.backend.lastMsg.Username = username |
| 104 | s.backend.lastMsg.Password = password |
| 105 | |
| 106 | if s.backend.cfg.AcceptedIdentity != "" && identity != s.backend.cfg.AcceptedIdentity { |
| 107 | return xerrors.Errorf("unknown identity: %q", identity) |
| 108 | } |
| 109 | if username != s.backend.cfg.AcceptedUsername { |
| 110 | return xerrors.Errorf("unknown user: %q", username) |
| 111 | } |
| 112 | if password != s.backend.cfg.AcceptedPassword { |
| 113 | return xerrors.Errorf("incorrect password for username: %q", username) |
| 114 | } |
| 115 | |
| 116 | return nil |
| 117 | }), nil |
| 118 | case sasl.Login: |
| 119 | return sasl.NewLoginServer(func(username, password string) error { |
| 120 | s.backend.mu.Lock() |
| 121 | defer s.backend.mu.Unlock() |
| 122 | |
| 123 | s.backend.lastMsg.Username = username |
| 124 | s.backend.lastMsg.Password = password |
| 125 | |
| 126 | if username != s.backend.cfg.AcceptedUsername { |
| 127 | return xerrors.Errorf("unknown user: %q", username) |
| 128 | } |
| 129 | if password != s.backend.cfg.AcceptedPassword { |
| 130 | return xerrors.Errorf("incorrect password for username: %q", username) |
| 131 | } |
| 132 | |
| 133 | return nil |
| 134 | }), nil |
| 135 | default: |
| 136 | return nil, xerrors.Errorf("unexpected auth mechanism: %q", mech) |
| 137 | } |
| 138 | } |
| 139 | |
| 140 | func (s *Session) Mail(from string, _ *smtp.MailOptions) error { |
| 141 | s.backend.mu.Lock() |