From 75f39e1a706ce77daec78c32b41a123c8f7be82c Mon Sep 17 00:00:00 2001 Message-Id: <75f39e1a706ce77daec78c32b41a123c8f7be82c.1714320538.git.mdw@distorted.org.uk> From: Mark Wooding Date: Thu, 3 Apr 2014 17:21:44 +0100 Subject: [PATCH] zone.lisp: Support for DKIM key records. Organization: Straylight/Edgeware From: Mark Wooding Reads the key data from a PEM file. Splits stuff into multiple lines in a vaguely sensible way. --- zone.lisp | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/zone.lisp b/zone.lisp index 909f755..762c6e2 100644 --- a/zone.lisp +++ b/zone.lisp @@ -622,6 +622,48 @@ (defzoneparse :txt (name data rec) ":txt TEXT" (rec :data data)) +(defzoneparse :dkim (name data rec) + ":dkim (KEYFILE {:TAG VALUE}*)" + (destructuring-bind (file &rest plist) (listify data) + (let ((things nil) (out nil)) + (labels ((flush () + (when out + (push (get-output-stream-string out) things) + (setf out nil))) + (emit (text) + (let ((len (length text))) + (when (and out (> (+ (file-position out) + (length text)) + 64)) + (flush)) + (when (plusp len) + (cond ((< len 64) + (unless out (setf out (make-string-output-stream))) + (write-string text out)) + (t + (do ((i 0 j) + (j 64 (+ j 64))) + ((>= i len)) + (push (subseq text i (min j len)) things)))))))) + (do ((p plist (cddr p))) + ((endp p)) + (emit (format nil "~(~A~)=~A;" (car p) (cadr p)))) + (emit (with-output-to-string (out) + (write-string "p=" out) + (when file + (with-open-file (in file :direction :input) + (loop + (when (string= (read-line in) + "-----BEGIN PUBLIC KEY-----") + (return))) + (loop + (let ((line (read-line in))) + (if (string= line "-----END PUBLIC KEY-----") + (return) + (write-string line out))))))))) + (rec :type :txt + :data (nreverse things))))) + (defzoneparse :mx (name data rec :zname zname) ":mx ((HOST :prio INT :ip IPADDR)*)" (dolist (mx (listify data)) -- [mdw]