branch: elpa/jabber
commit b3cfe2ee4af6e20f6abfbb1b6da39f0db115c283
Author: Thanos Apollo <[email protected]>
Commit: Thanos Apollo <[email protected]>

    omemo: Derive upload send target from JID, not current buffer
---
 lisp/jabber-omemo.el               | 16 +++++++++-------
 tests/jabber-test-omemo-message.el | 31 ++++++++++++++++++++++++++++++-
 2 files changed, 39 insertions(+), 8 deletions(-)

diff --git a/lisp/jabber-omemo.el b/lisp/jabber-omemo.el
index 0a5cacc28e..69dedc6c83 100644
--- a/lisp/jabber-omemo.el
+++ b/lisp/jabber-omemo.el
@@ -46,6 +46,8 @@
                   (group nickname new-plist))
 (declare-function jabber-muc-participant-plist "jabber-muc"
                   (group nickname))
+(declare-function jabber-muc-joined-p "jabber-muc" (group &optional jc))
+(declare-function jabber-muc-create-buffer "jabber-muc" (jc group))
 (declare-function jabber-disco-advertise-feature "jabber-disco")
 (declare-function jabber-send-iq "jabber-iq")
 (declare-function jabber-httpupload--upload "jabber-httpupload")
@@ -1600,13 +1602,13 @@ Returns (ENCRYPTED-PATH . WRAPPED-CALLBACK) or nil."
   "Send GET-URL (aesgcm://) as an OMEMO-encrypted message from JC to JID.
 Returns non-nil if handled, nil to fall through to plaintext."
   (when (string-prefix-p "aesgcm://" get-url)
-    (if (bound-and-true-p jabber-group)
-        (jabber-omemo--send-muc jc get-url)
-      ;; Capture the chat buffer now: the session callbacks may fire
-      ;; from IQ handlers where current buffer is something else, and
-      ;; --send-encrypted falls back to (current-buffer) for display
-      ;; and send-hook state.
-      (let ((buffer (current-buffer)))
+    ;; This runs from the upload process sentinel, where the current
+    ;; buffer is arbitrary; derive the chat buffer from JID rather
+    ;; than trusting buffer-local state.
+    (if (jabber-muc-joined-p jid)
+        (with-current-buffer (jabber-muc-create-buffer jc jid)
+          (jabber-omemo--send-muc jc get-url))
+      (let ((buffer (jabber-chat-create-buffer jc jid)))
         (jabber-omemo--ensure-sessions
          jc (jabber-jid-user jid)
          (lambda (recipient-sessions)
diff --git a/tests/jabber-test-omemo-message.el 
b/tests/jabber-test-omemo-message.el
index 5691aafda9..4da1869207 100644
--- a/tests/jabber-test-omemo-message.el
+++ b/tests/jabber-test-omemo-message.el
@@ -328,11 +328,40 @@ Clears OMEMO in-memory caches and tears down on exit."
             ((symbol-function 'jabber-connection-bare-jid)
              (lambda (_jc) "[email protected]"))
             ((symbol-function 'jabber-jid-user)
-             (lambda (jid) jid)))
+             (lambda (jid) jid))
+            ((symbol-function 'jabber-muc-joined-p)
+             (lambda (_group &optional _jc) nil))
+            ((symbol-function 'jabber-chat-create-buffer)
+             (lambda (_jc _jid) (current-buffer))))
     (should (jabber-omemo--httpupload-send-url
              'fake-jc "[email protected]"
              "aesgcm://host/file#abc123"))))
 
+(ert-deftest jabber-test-omemo-message-httpupload-send-url-muc-from-any-buffer 
()
+  "An aesgcm URL for a joined room is sent in that room's buffer.
+The upload callback fires from a process sentinel where the current
+buffer is arbitrary; the room must be derived from the JID, not from
+buffer-local `jabber-group'."
+  (let ((room "[email protected]")
+        (room-buffer (generate-new-buffer " *omemo-muc-upload-test*"))
+        (sent-group nil))
+    (unwind-protect
+        (progn
+          (with-current-buffer room-buffer
+            (setq-local jabber-group room))
+          (cl-letf (((symbol-function 'jabber-muc-joined-p)
+                     (lambda (group &optional _jc) (equal group room)))
+                    ((symbol-function 'jabber-muc-create-buffer)
+                     (lambda (_jc _group) room-buffer))
+                    ((symbol-function 'jabber-omemo--send-muc)
+                     (lambda (_jc _body &optional _extra)
+                       (setq sent-group (bound-and-true-p jabber-group)))))
+            (with-temp-buffer
+              (should (jabber-omemo--httpupload-send-url
+                       'fake-jc room "aesgcm://host/file#abc123"))))
+          (should (equal sent-group room)))
+      (kill-buffer room-buffer))))
+
 (ert-deftest jabber-test-omemo-message-httpupload-send-url-skips-https ()
   "Send-url override returns nil for https:// URLs."
   (should-not (jabber-omemo--httpupload-send-url

Reply via email to