about summary refs log tree commit diff
path: root/users/sterni/mblog/note.lisp
diff options
context:
space:
mode:
authorsterni <sternenseemann@systemli.org>2022-01-27T15·06+0100
committersterni <sternenseemann@systemli.org>2022-02-02T20·47+0000
commit5789814dec3b1a7fe46902a8f477d585b36de6b4 (patch)
tree159b9f55de7569e42b8ebc2add57670a35708491 /users/sterni/mblog/note.lisp
parentc3cf66f248d5b721629d3cb5293d6f1bd1358a43 (diff)
fix(users/sterni/mblog): handle RFC2047 in subjects r/3750
Non ASCII Subjects will use RFC2047 to encode their content. Using
mime4cl's parse-RFC2047-text we obtain a list of ASCII strings and byte
vectors tagged with their encoding. Using babel we can then decode the
byte sequence, assuming the encoding is named the same in babel and
RFC2047 (which it is for UTF-8 at least…).

Change-Id: I2840672409452bd194fb1635721e338364d9b484
Reviewed-on: https://cl.tvl.fyi/c/depot/+/5078
Reviewed-by: sterni <sternenseemann@systemli.org>
Tested-by: BuildkiteCI
Diffstat (limited to 'users/sterni/mblog/note.lisp')
-rw-r--r--users/sterni/mblog/note.lisp18
1 files changed, 17 insertions, 1 deletions
diff --git a/users/sterni/mblog/note.lisp b/users/sterni/mblog/note.lisp
index 0091e97b083f..93d9231aa293 100644
--- a/users/sterni/mblog/note.lisp
+++ b/users/sterni/mblog/note.lisp
@@ -66,6 +66,20 @@
                                :test #'string-equal))
     (string-equal (cdr uniform-id) "com.apple.mail-note")))
 
+(defun decode-RFC2047-to-string (input)
+  (apply
+   #'concatenate
+   (cons 'string
+         (mapcar
+          (lambda (el)
+            (etypecase el
+              (cons (babel:octets-to-string
+                     (car el)
+                     :encoding (babel-encodings:get-character-encoding
+                                (intern (string-upcase (cdr el)) 'keyword))))
+              (string el)))
+          (mime:parse-RFC2047-text input)))))
+
 (defun make-apple-note (msg)
   (check-type msg mime-message)
 
@@ -73,7 +87,9 @@
     (error "Passed message is not an Apple Note according to headers"))
 
   (let ((text-part (mime:find-mime-text-part msg))
-        (subject (find-mime-message-header "Subject" msg))
+        (subject (when-let ((val (find-mime-message-header "Subject" msg)))
+                   ;; TODO(sterni): mime4cl should do this
+                   (decode-RFC2047-to-string val)))
         (uuid (when-let ((val (find-mime-message-header
                                "X-Universally-Unique-Identifier"
                                msg)))