asgard.git

commit 012f84f77af699d5d03e62d2b70994e9382e987f

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)