From a913c5721aeee0feca1309705ac4d5004996e073 Mon Sep 17 00:00:00 2001 From: Kyle Meyer Date: Sat, 19 Sep 2020 00:46:38 -0400 Subject: Escape message IDs when constructing URLs Message IDs can include characters that must escaped before being included in the path part of public-inbox URLs. Add a variant of url-hexify-string that uses the same set of characters as public-inbox's mid_escape(). Message-Id: <20200919044639.26871-2-kyle@kyleam.com> --- piem-b4.el | 2 +- piem.el | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/piem-b4.el b/piem-b4.el index b77d111..596e563 100644 --- a/piem-b4.el +++ b/piem-b4.el @@ -66,7 +66,7 @@ (mid (piem-mid)) (buffer (condition-case nil (piem-download-and-decompress - (concat url mid "/t.mbox.gz")) + (concat url (piem-escape-mid mid) "/t.mbox.gz")) (error nil)))) (with-current-buffer buffer (write-region nil nil mbox-thread)) diff --git a/piem.el b/piem.el index dd2b30e..7c6ca6f 100644 --- a/piem.el +++ b/piem.el @@ -261,7 +261,7 @@ URL should be the top-level url for the inbox. If MID is non-nil, make the match specific for that message." (rx-to-string `(and ,(piem--ensure-trailing-slash url) - (group ,(or mid + (group ,(or (and mid (piem-escape-mid mid)) '(one-or-more (not (any "/" "\n"))))) "/" (group (zero-or-one (or "raw" @@ -403,6 +403,16 @@ buffer." ;;;; Download helpers +(defconst piem--unreserved-chars + (append url-unreserved-chars + ;; These extra characters follow what's used by + ;; public-inbox's mid_escape(). + (list ?! ?$ ?& ?' ?\( ?\) ?* ?+ ?, ?= ?: ?\; ?@))) + +(defun piem-escape-mid (mid) + "Escape MID for use in path part of a public-inbox URL." + (url-hexify-string mid piem--unreserved-chars)) + (defvar piem--has-gunzip) (defun piem-check-gunzip () "Return non-nil if gunzip is available." @@ -500,7 +510,7 @@ This function depends on :url being configured for entries in (when-let ((url (concat (or (piem-inbox-get :url) (user-error "Could not find inbox URL for current buffer")) - mid + (piem-escape-mid mid) (if message-only "/raw" "/t.mbox.gz"))) (buffer (url-retrieve-synchronously url 'silent))) (unwind-protect -- cgit v1.2.3