>From 062ade7fe5cdbae36f4b488761e6367beb6e3a41 Mon Sep 17 00:00:00 2001 From: Kai Tetzlaff Date: Mon, 28 Feb 2022 11:08:07 +0100 Subject: [PATCH 1/4] Fix bug in sieve-manage--append-to-log, improve sieve-manage buffer config Also update/add some comments/docs. * lisp/net/sieve-manage.el sieve-manage--coding-system: New constant. (sieve-manage--set-internal-buffer-properties): New function. (sieve-manage-open-server): Use `sieve-manage--coding-system'. (sieve-manage--append-to-log): Use `sieve-manage--set-internal-buffer-properties' to fix log buffer creation. (sieve-manage-encode) (sieve-manage-make-process-buffer): Use `sieve-manage--set-internal-buffer-properties'. --- lisp/net/sieve-manage.el | 50 +++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/lisp/net/sieve-manage.el b/lisp/net/sieve-manage.el index 5bee4f4c4ad..4f0f9b1891b 100644 --- a/lisp/net/sieve-manage.el +++ b/lisp/net/sieve-manage.el @@ -58,7 +58,7 @@ ;; ;; References: ;; -;; draft-martin-managesieve-02.txt, +;; RFC5804, ;; "A Protocol for Remotely Managing Sieve Scripts", ;; by Tim Martin. ;; @@ -145,6 +145,15 @@ sieve-manage-ignore-starttls :type 'boolean) ;; Internal variables: +(defconst sieve-manage--coding-system 'raw-text-unix + "Use 'raw-text-unix coding system for (network) communication. + +Sets the coding system used for the internal (process, log) +buffers and the network stream created to communicate with the +managesieve server. Using 'raw-text encoding enables unibyte +mode and makes sure that sent/received octets (bytes) remain +untouched by the coding system. The explicit use of `-unix` +avoids EOL conversions (and thus keeps CRLF (\"\\r\\n\") intact).") (defconst sieve-manage-local-variables '(sieve-manage-server sieve-manage-port @@ -167,6 +176,24 @@ sieve-manage-process (defvar sieve-manage-capability nil) ;; Internal utility functions +(defun sieve-manage--set-internal-buffer-properties (buffer) + "Set BUFFER properties for internally used buffers. + +Used for process and log buffers, this function makes sure that +those buffers keep received and sent data intact by: +- setting the coding system to 'sieve-manage--coding-system', +- setting `after-change-functions' to nil to avoid those + functions messing with buffer content. +Also disables undo (to save a bit of memory and improve +performance). + +Returns BUFFER." + (with-current-buffer buffer + (set-buffer-file-coding-system sieve-manage--coding-system) + (setq-local after-change-functions nil) + (buffer-disable-undo) + (current-buffer))) + (defun sieve-manage--append-to-log (&rest args) "Append ARGS to sieve-manage log buffer. @@ -175,10 +202,8 @@ sieve-manage--append-to-log `sieve-manage-log'. If it is nil, logging is disabled." (when sieve-manage-log (with-current-buffer (or (get-buffer sieve-manage-log) - (with-current-buffer - (get-buffer-create sieve-manage-log) - (set-buffer-multibyte nil) - (buffer-disable-undo))) + (sieve-manage--set-internal-buffer-properties + (get-buffer-create sieve-manage-log))) (goto-char (point-max)) (apply #'insert args)))) @@ -204,7 +229,7 @@ sieve-manage--error (defun sieve-manage-encode (utf8-string) "Convert UTF8-STRING to managesieve protocol octets." - (encode-coding-string utf8-string 'raw-text t)) + (encode-coding-string utf8-string sieve-manage--coding-system t)) (defun sieve-manage-decode (octets &optional buffer) "Convert managesieve protocol OCTETS to utf-8 string. @@ -216,13 +241,11 @@ sieve-manage-decode (defun sieve-manage-make-process-buffer () (with-current-buffer - (generate-new-buffer (format " *sieve %s:%s*" - sieve-manage-server - sieve-manage-port)) + (sieve-manage--set-internal-buffer-properties + (generate-new-buffer (format " *sieve %s:%s*" + sieve-manage-server + sieve-manage-port))) (mapc #'make-local-variable sieve-manage-local-variables) - (set-buffer-multibyte nil) - (setq-local after-change-functions nil) - (buffer-disable-undo) (current-buffer))) (defun sieve-manage-erase (&optional p buffer) @@ -244,8 +267,7 @@ sieve-manage-open-server (open-network-stream "SIEVE" buffer server port :type stream - ;; eol type unix is required to preserve "\r\n" - :coding 'raw-text-unix + :coding `(binary . ,sieve-manage--coding-system) :capability-command "CAPABILITY\r\n" :end-of-command "^\\(OK\\|NO\\).*\n" :success "^OK.*\n" -- 2.39.0