mirror of
https://github.com/axllent/mailpit.git
synced 2025-01-08 00:39:22 +02:00
f548bbb874
Originally requested in #72
77 lines
1.7 KiB
Go
77 lines
1.7 KiB
Go
package pop3
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"net"
|
|
"strings"
|
|
|
|
"github.com/axllent/mailpit/internal/auth"
|
|
"github.com/axllent/mailpit/internal/logger"
|
|
"github.com/axllent/mailpit/internal/storage"
|
|
)
|
|
|
|
func authUser(username, password string) bool {
|
|
return auth.POP3Credentials.Match(username, password)
|
|
}
|
|
|
|
// Send a response with debug logging
|
|
func sendResponse(c net.Conn, m string) {
|
|
fmt.Fprintf(c, "%s\r\n", m)
|
|
logger.Log().Debugf("[pop3] response: %s", m)
|
|
}
|
|
|
|
// Send a response without debug logging (for data)
|
|
func sendData(c net.Conn, m string) {
|
|
fmt.Fprintf(c, "%s\r\n", m)
|
|
}
|
|
|
|
func getMessages() ([]message, error) {
|
|
messages := []message{}
|
|
list, err := storage.List(0, 100)
|
|
if err != nil {
|
|
return messages, err
|
|
}
|
|
|
|
for _, m := range list {
|
|
msg := message{}
|
|
msg.ID = m.ID
|
|
msg.Size = m.Size
|
|
messages = append(messages, msg)
|
|
}
|
|
|
|
return messages, nil
|
|
}
|
|
|
|
// POP3 TOP command returns the headers, followed by the next x lines
|
|
func getTop(id string, nr int) (string, string, error) {
|
|
var header, body string
|
|
raw, err := storage.GetMessageRaw(id)
|
|
if err != nil {
|
|
return header, body, errors.New("-ERR no such message")
|
|
}
|
|
|
|
parts := strings.SplitN(string(raw), "\r\n\r\n", 2)
|
|
header = parts[0]
|
|
lines := []string{}
|
|
if nr > 0 && len(parts) == 2 {
|
|
lines = strings.SplitN(parts[1], "\r\n", nr)
|
|
}
|
|
|
|
return header, strings.Join(lines, "\r\n"), nil
|
|
}
|
|
|
|
// cuts the line into command and arguments
|
|
func getCommand(line string) (string, []string) {
|
|
line = strings.Trim(line, "\r \n")
|
|
cmd := strings.Split(line, " ")
|
|
return cmd[0], cmd[1:]
|
|
}
|
|
|
|
func getSafeArg(args []string, nr int) (string, error) {
|
|
if nr < len(args) {
|
|
return args[nr], nil
|
|
}
|
|
return "", errors.New("Out of range")
|
|
}
|