Author: Adam <git@apiote.xyz>
message encoding
eostre_2.go | 62 +++++++++++++++++++++---------------------------------
diff --git a/eostre_2.go b/eostre_2.go index 4729a32039eca91dfe42991b59c6fd711db86f03..46be8c047dd15c23a566ebbc7f4ffc21880aba6a 100644 --- a/eostre_2.go +++ b/eostre_2.go @@ -2,7 +2,7 @@ package main import ( "bytes" - "fmt" + "encoding/base64" "io" "log" "os" @@ -66,41 +66,26 @@ t, _, err := m.Header.ContentType() if err != nil { log.Fatalln(err) } - if t == "multipart/..." { // TODO - mr := m.MultipartReader() - for { - p, err := mr.NextPart() - if err == io.EOF { - break - } else if err != nil { - return fmt.Errorf("while reading next part: %w", err) - } - t, _, err := p.Header.ContentType() - if err != nil { - log.Fatalln(err) - } - if t == "..." { // TODO age content-type - identity, err := age.ParseX25519Identity(config.Eostre.DiaryPrivateKey) - if err != nil { - log.Fatalf("Failed to parse private key: %v", err) - } - r, err := age.Decrypt(p.Body, identity) - if err != nil { - log.Fatalf("Failed to open encrypted file: %v", err) - } - out, err := os.Create("diary.epub") - if err != nil { - log.Fatalf("Failed to create diary file: %v", err) - } - if _, err := io.Copy(out, r); err != nil { - log.Fatalf("Failed to read encrypted file: %v", err) - } - out.Close() - break - } + if t == "application/octet-stream" || t == "application/age" { + identity, err := age.ParseX25519Identity(config.Eostre.DiaryPrivateKey) + if err != nil { + log.Fatalf("Failed to parse private key: %v", err) + } + r, err := age.Decrypt(m.Body, identity) // TODO check if body is base64-decoded + if err != nil { + log.Fatalf("Failed to open encrypted file: %v", err) + } + out, err := os.Create("diary.epub") + if err != nil { + log.Fatalf("Failed to create diary file: %v", err) + } + if _, err := io.Copy(out, r); err != nil { + log.Fatalf("Failed to read encrypted file: %v", err) } + out.Close() + break } else { - log.Printf("%d is not multipart\n", msg.Uid) + log.Printf("%d is not binary or age\n", msg.Uid) continue } } @@ -110,11 +95,12 @@ if err != nil { log.Fatalf("Failed to parse public key: %v", err) } b := &bytes.Buffer{} + b64 := base64.NewEncoder(base64.StdEncoding, b) in, err := os.Open("diary.epub") if err != nil { log.Fatalf("Failed to open decrypted file: %v", err) } - w, err := age.Encrypt(b, recipient) + w, err := age.Encrypt(b64, recipient) if err != nil { log.Fatalf("Failed to encrypt file: %v", err) } @@ -131,10 +117,10 @@ "Date: " + now + "\r\n" + "Message-ID: " + now + "_eostre@apiote.xyz\r\n" + "MIME-Version: 1.0\r\n" + "Subject: Diary\r\n" + - "Content-Type: ...; boundary=----BOUNDARY; charset=utf-8\r\n" + // TODO multipart + "Content-Type: application/age\r\n" + + "Content-Transfer-Encoding: base64\r\n" + "\r\n" + - "", - // TODO continue + string(b.Bytes()), ) auth := sasl.NewPlainClient("", config.Eostre.DiarySmtpUsername, config.Eostre.DiarySmtpPassword) err = smtp.SendMail(config.Eostre.DiarySmtpAddress, auth, config.Eostre.DiarySender, []string{config.Eostre.DiaryRecipient}, msg)