Smail/backend/controllers/config_mail_ports_test.go

110 lines
3.7 KiB
Go

package controllers
import (
"encoding/json"
"testing"
"git.pcux.cn/xuans/Smail/config"
)
func TestPublicMailPortsMatchListenersWithoutChangingSnapshot(t *testing.T) {
for _, custom := range []bool{false, true} {
runtime := config.RuntimeConfig{
SMTP: config.SMTPSectionConfig{Relay: config.SMTPConfig{RelayPort: 9999}},
Email: config.EmailSectionConfig{Policy: config.EmailConfig{SMTPPort: 2525, IMAPPort: 1143, POP3Port: 1110}},
}
if custom {
runtime.SMTP.Listener = config.SMTPListenerConfig{Port: 3025, STARTTLSPort: 3587, TLSPort: 3465}
runtime.Email.IMAP.TLSPort = 3993
runtime.Email.POP3 = config.POP3ListenerConfig{Port: 3110, TLSPort: 3995}
}
before := runtime.Email
want := config.ResolveMailPorts(runtime.SMTP, runtime.Email)
mailPublic, err := publicConfigSection(runtime, config.SectionMail)
if err != nil {
t.Fatal(err)
}
mailData, err := json.Marshal(mailPublic)
if err != nil {
t.Fatal(err)
}
var writableMail map[string]json.RawMessage
if err := json.Unmarshal(mailData, &writableMail); err != nil {
t.Fatal(err)
}
delete(writableMail, "relayPasswordStatus")
mailData, err = json.Marshal(writableMail)
if err != nil {
t.Fatal(err)
}
var mail config.MailSectionConfig
if err := config.ParseStrict(mailData, &mail); err != nil {
t.Fatal(err)
}
if mail.Listener.Port != want.SMTP || mail.Listener.STARTTLSPort != want.SMTPSTARTTLS || mail.Listener.TLSPort != want.SMTPTLS || mail.IMAP.TLSPort != want.IMAP || mail.POP3.Port != want.POP3 || mail.POP3.TLSPort != want.POP3TLS {
t.Fatal("combined public mail ports differ from listener configuration")
}
if mail.Listener.Security != runtime.SMTP.Listener.Security {
t.Fatal("public mail view changed legacy security state")
}
smtpPublic, err := publicConfigSection(runtime, config.SectionSMTP)
if err != nil {
t.Fatal(err)
}
data, err := json.Marshal(smtpPublic)
if err != nil {
t.Fatal(err)
}
var smtp struct {
Listener config.SMTPListenerConfig `json:"listener"`
}
if err := json.Unmarshal(data, &smtp); err != nil {
t.Fatal(err)
}
emailPublic, err := publicConfigSection(runtime, config.SectionEmail)
if err != nil {
t.Fatal(err)
}
email := emailPublic.(config.EmailSectionConfig)
if smtp.Listener.Port != want.SMTP || smtp.Listener.STARTTLSPort != want.SMTPSTARTTLS || smtp.Listener.TLSPort != want.SMTPTLS || email.IMAP.TLSPort != want.IMAP || email.POP3.Port != want.POP3 || email.POP3.TLSPort != want.POP3TLS {
t.Fatal("public ports differ from listener configuration")
}
if before != runtime.Email {
t.Fatal("public view changed runtime configuration")
}
}
}
func TestPublicMailSecurityNormalizesLegacyTLSNames(t *testing.T) {
runtime := config.RuntimeConfig{
SMTP: config.SMTPSectionConfig{
Listener: config.SMTPListenerConfig{Security: "tls"},
Relay: config.SMTPConfig{Security: "tls"},
},
}
for _, section := range []config.Section{config.SectionSMTP, config.SectionMail} {
public, err := publicConfigSection(runtime, section)
if err != nil {
t.Fatal(err)
}
data, err := json.Marshal(public)
if err != nil {
t.Fatal(err)
}
var value struct {
Listener config.SMTPListenerConfig `json:"listener"`
Relay config.SMTPConfig `json:"relay"`
}
if err := json.Unmarshal(data, &value); err != nil {
t.Fatal(err)
}
if value.Listener.Security != config.MailSecurityImplicitTLS {
t.Fatalf("%s listener security = %q, want %q", section, value.Listener.Security, config.MailSecurityImplicitTLS)
}
if value.Relay.Security != config.MailSecurityImplicitTLS {
t.Fatalf("%s relay security = %q, want %q", section, value.Relay.Security, config.MailSecurityImplicitTLS)
}
}
}