diff --git a/email/worker.go b/email/worker.go index 0123fc0b985a08b01daf6d7f1cfcbec18e64dcc3..bb74a0ca183a5ac628111802e4d122287cc176b4 100644 --- a/email/worker.go +++ b/email/worker.go @@ -134,9 +134,13 @@ log.Printf("Encrypting mail to %s failed: %s", strings.Join(rcpts, ", "), err.Error()) } - cleartext, err = prepareSigned(header, &buf, queue.entity) - if err != nil { - log.Fatalf("Signing mail failed: %v", err) + if queue.entity != nil { + cleartext, err = prepareSigned(header, &buf, queue.entity) + if err != nil { + log.Fatalf("Signing mail failed: %v", err) + } + } else { + cleartext = nopWriteCloser{&buf} } } defer cleartext.Close() @@ -157,11 +161,24 @@ return queue.Enqueue(NewTask(&buf, rcpts)) } +type nopWriteCloser struct { + io.Writer +} + +func (nopWriteCloser) Close() error { + return nil +} + type Queue struct { *work.Queue smtpFrom *mail.Address ownerAddress *mail.Address entity *openpgp.Entity +} + +// CanPGPSign checks whether emails sent via the queue are signed via OpenPGP. +func (q *Queue) CanPGPSign() bool { + return q.entity != nil } // Creates a new email processing queue. @@ -187,27 +204,25 @@ Name: ownerName, Address: ownerEmail, } - privKeyPath, ok := conf.Get("mail", "pgp-privkey") - if !ok { - panic("Expected [mail]pgp-privkey in config") - } + var entity *openpgp.Entity + if privKeyPath, ok := conf.Get("mail", "pgp-privkey"); ok { + privKeyFile, err := os.Open(privKeyPath) + if err != nil { + panic(fmt.Errorf("Failed to open [mail]pgp-privkey: %v", err)) + } + defer privKeyFile.Close() - privKeyFile, err := os.Open(privKeyPath) - if err != nil { - panic(fmt.Errorf("Failed to open [mail]pgp-privkey: %v", err)) - } - defer privKeyFile.Close() - - keyring, err := openpgp.ReadArmoredKeyRing(privKeyFile) - if err != nil { - panic(fmt.Errorf("Failed to read PGP key ring from [mail]pgp-privkey: %v", err)) - } - if len(keyring) != 1 { - panic("Expected [mail]pgp-privkey to contain one key") - } - entity := keyring[0] - if entity.PrivateKey == nil || entity.PrivateKey.Encrypted { - panic("Failed to load [mail]pgp-privkey for email signature") + keyring, err := openpgp.ReadArmoredKeyRing(privKeyFile) + if err != nil { + panic(fmt.Errorf("Failed to read PGP key ring from [mail]pgp-privkey: %v", err)) + } + if len(keyring) != 1 { + panic("Expected [mail]pgp-privkey to contain one key") + } + entity = keyring[0] + if entity.PrivateKey == nil || entity.PrivateKey.Encrypted { + panic("Failed to load [mail]pgp-privkey for email signature") + } } return &Queue{