mirror of
https://github.com/foxcpp/maddy.git
synced 2025-04-06 06:27:38 +03:00
Adds partial support for tls directive
This commit is contained in:
parent
45c128b5b9
commit
d971092b38
4 changed files with 97 additions and 27 deletions
10
imap.go
Normal file
10
imap.go
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
package maddy
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/mholt/caddy/caddyfile"
|
||||||
|
imapserver "github.com/emersion/go-imap/server"
|
||||||
|
)
|
||||||
|
|
||||||
|
func newIMAPServer(tokens map[string][]caddyfile.Token) server {
|
||||||
|
return imapserver.New(nil)
|
||||||
|
}
|
65
maddy.go
65
maddy.go
|
@ -1,15 +1,18 @@
|
||||||
package maddy
|
package maddy
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/tls"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
|
|
||||||
"github.com/mholt/caddy/caddyfile"
|
"github.com/mholt/caddy/caddyfile"
|
||||||
imapserver "github.com/emersion/go-imap/server"
|
|
||||||
"github.com/emersion/go-smtp"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type server interface {
|
||||||
|
Serve(net.Listener) error
|
||||||
|
}
|
||||||
|
|
||||||
var Directives = []string{
|
var Directives = []string{
|
||||||
"bind",
|
"bind",
|
||||||
"tls",
|
"tls",
|
||||||
|
@ -21,6 +24,8 @@ var Directives = []string{
|
||||||
}
|
}
|
||||||
|
|
||||||
func Start(blocks []caddyfile.ServerBlock) error {
|
func Start(blocks []caddyfile.ServerBlock) error {
|
||||||
|
done := make(chan error, 1)
|
||||||
|
|
||||||
for _, block := range blocks {
|
for _, block := range blocks {
|
||||||
var proto string
|
var proto string
|
||||||
var adresses []Address
|
var adresses []Address
|
||||||
|
@ -40,37 +45,43 @@ func Start(blocks []caddyfile.ServerBlock) error {
|
||||||
adresses = append(adresses, addr)
|
adresses = append(adresses, addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: parse directives
|
var s server
|
||||||
|
|
||||||
switch proto {
|
switch proto {
|
||||||
case "imap":
|
case "imap":
|
||||||
s := imapserver.New(nil) // TODO
|
s = newIMAPServer(block.Tokens)
|
||||||
|
|
||||||
for _, addr := range adresses {
|
|
||||||
l, err := net.Listen("tcp", fmt.Sprintf("%s:%s", addr.Host, addr.Port))
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("Cannot listen: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Println("IMAP server listening on", l.Addr().String())
|
|
||||||
go s.Serve(l)
|
|
||||||
}
|
|
||||||
case "smtp":
|
case "smtp":
|
||||||
s := smtp.NewServer(nil) // TODO
|
s = newSMTPServer(block.Tokens)
|
||||||
|
|
||||||
for _, addr := range adresses {
|
|
||||||
l, err := net.Listen("tcp", fmt.Sprintf("%s:%s", addr.Host, addr.Port))
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("Cannot listen: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Println("SMTP server listening on", l.Addr().String())
|
|
||||||
go s.Serve(l)
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("Unsupported protocol %q", proto)
|
return fmt.Errorf("Unsupported protocol %q", proto)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var tlsConfig *tls.Config
|
||||||
|
if tokens, ok := block.Tokens["tls"]; ok {
|
||||||
|
var err error
|
||||||
|
tlsConfig, err = getTLSConfig(caddyfile.NewDispenserTokens("", tokens))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, addr := range adresses {
|
||||||
|
var l net.Listener
|
||||||
|
var err error
|
||||||
|
l, err = net.Listen("tcp", fmt.Sprintf("%s:%s", addr.Host, addr.Port))
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("Cannot listen: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if tlsConfig != nil {
|
||||||
|
l = tls.NewListener(l, tlsConfig)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("%s server listening on %s\n", proto, l.Addr().String())
|
||||||
|
go func() {
|
||||||
|
done <- s.Serve(l)
|
||||||
|
}()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
select {}
|
return <-done
|
||||||
}
|
}
|
||||||
|
|
10
smtp.go
Normal file
10
smtp.go
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
package maddy
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/mholt/caddy/caddyfile"
|
||||||
|
"github.com/emersion/go-smtp"
|
||||||
|
)
|
||||||
|
|
||||||
|
func newSMTPServer(tokens map[string][]caddyfile.Token) server {
|
||||||
|
return smtp.NewServer(nil)
|
||||||
|
}
|
39
tls.go
Normal file
39
tls.go
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
package maddy
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/tls"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/mholt/caddy/caddyfile"
|
||||||
|
)
|
||||||
|
|
||||||
|
func getTLSConfig(d caddyfile.Dispenser) (*tls.Config, error) {
|
||||||
|
config := new(tls.Config)
|
||||||
|
|
||||||
|
for d.Next() {
|
||||||
|
args := d.RemainingArgs()
|
||||||
|
switch len(args) {
|
||||||
|
case 1:
|
||||||
|
switch args[0] {
|
||||||
|
case "off":
|
||||||
|
return nil, nil
|
||||||
|
case "self_signed":
|
||||||
|
if err := makeSelfSignedCert(config); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
if cert, err := tls.LoadX509KeyPair(args[0], args[1]); err != nil {
|
||||||
|
return nil, err
|
||||||
|
} else {
|
||||||
|
config.Certificates = append(config.Certificates, cert)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return config, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeSelfSignedCert(config *tls.Config) error {
|
||||||
|
return fmt.Errorf("Not yet implemented")
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue