From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Daniel Pettersson Newsgroups: gmane.emacs.bugs Subject: bug#62444: [PATCH] erc: Fix "dcc get" flag parsing Date: Sat, 25 Mar 2023 16:25:48 +0100 Message-ID: Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="12778"; mail-complaints-to="usenet@ciao.gmane.io" To: 62444@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Sat Mar 25 16:27:25 2023 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1pg5ng-00034k-Tt for geb-bug-gnu-emacs@m.gmane-mx.org; Sat, 25 Mar 2023 16:27:25 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pg5nP-0008Uv-LD; Sat, 25 Mar 2023 11:27:07 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pg5nL-0008UP-7K for bug-gnu-emacs@gnu.org; Sat, 25 Mar 2023 11:27:03 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pg5nK-0003O8-Tq for bug-gnu-emacs@gnu.org; Sat, 25 Mar 2023 11:27:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1pg5nK-0001dM-Lm for bug-gnu-emacs@gnu.org; Sat, 25 Mar 2023 11:27:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Daniel Pettersson Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 25 Mar 2023 15:27:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 62444 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.16797579786225 (code B ref -1); Sat, 25 Mar 2023 15:27:02 +0000 Original-Received: (at submit) by debbugs.gnu.org; 25 Mar 2023 15:26:18 +0000 Original-Received: from localhost ([127.0.0.1]:43259 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pg5mc-0001cK-1i for submit@debbugs.gnu.org; Sat, 25 Mar 2023 11:26:18 -0400 Original-Received: from lists.gnu.org ([209.51.188.17]:48572) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pg5mX-0001c8-1B for submit@debbugs.gnu.org; Sat, 25 Mar 2023 11:26:16 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pg5mW-0008At-PC for bug-gnu-emacs@gnu.org; Sat, 25 Mar 2023 11:26:12 -0400 Original-Received: from mail-vs1-f43.google.com ([209.85.217.43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pg5mU-0003Hb-II for bug-gnu-emacs@gnu.org; Sat, 25 Mar 2023 11:26:12 -0400 Original-Received: by mail-vs1-f43.google.com with SMTP id f23so3881919vsv.13 for ; Sat, 25 Mar 2023 08:26:09 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679757965; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=pUH86Jb3KLMhnq/7kBWwLAfGQk2z4Kg6Enax+x1OJLA=; b=MG2mxMoGvhWFAKYAx3PBLvyIjXykAgulL/b3PUmjwjVIbyP57zkxSRQMIh1p6LXqlg Bm+p7DhXWnZUlTwGoD1O+uB4dJtlOKF2kc8Y7aCXzg/0X09y3nW1WIyxWD0go1X5AEGQ n8jOft/CZXv54PLq5tHjh420AMFVIrJ4xs+J2IP7L4maOLDUInOsYSZmGyCsn2VO5WFc 8l3wnXaKiIx756g0fMMgNMLvkiZcQlcA0MqsF+Gk7tZ+rErAWuZCpxBX81jd5MCVf0YK An4heCmxDhnEtAbbVwdMKqLrzfMy/gFXDyo0vxqtY+9qpmEh6Sk/mVeGsKnwuJLiQS+w Y2fw== X-Gm-Message-State: AAQBX9fJJTUvwlewGztp2p0+gSEV3ywy+j3Bmc1dOeVfsLg16FB2Yg91 w2tYLnopu0hJU6oZjk4VYpz4KS1fAnOIJay0 X-Google-Smtp-Source: AKy350a716sYiYlk+Tqp6U3fmw3Te4+IXZ/EX/2MNWojDZszO3zYtT9OcDkm5G/xKp7Ki5V7NPUuDw== X-Received: by 2002:a67:eb54:0:b0:425:e598:5541 with SMTP id x20-20020a67eb54000000b00425e5985541mr2240504vso.18.1679757960093; Sat, 25 Mar 2023 08:26:00 -0700 (PDT) Original-Received: from mail-ua1-f53.google.com (mail-ua1-f53.google.com. [209.85.222.53]) by smtp.gmail.com with ESMTPSA id f23-20020ab06f97000000b0068b82f80963sm2776166uav.34.2023.03.25.08.25.59 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 25 Mar 2023 08:25:59 -0700 (PDT) Original-Received: by mail-ua1-f53.google.com with SMTP id n17so3400963uaj.10 for ; Sat, 25 Mar 2023 08:25:59 -0700 (PDT) X-Received: by 2002:a1f:b2d2:0:b0:43b:96b8:1a9f with SMTP id b201-20020a1fb2d2000000b0043b96b81a9fmr105364vkf.2.1679757959510; Sat, 25 Mar 2023 08:25:59 -0700 (PDT) X-Gmail-Original-Message-ID: Received-SPF: pass client-ip=209.85.217.43; envelope-from=daniel.dpettersson.net@gmail.com; helo=mail-vs1-f43.google.com X-Spam_score_int: -13 X-Spam_score: -1.4 X-Spam_bar: - X-Spam_report: (-1.4 / 5.0 requ) BAYES_00=-1.9, FREEMAIL_FORGED_FROMDOMAIN=0.25, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.25, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:258591 Archived-At: In erc mode when receiving a file with "/dcc get" if the nick or filename starts with a dash or the filename contains the following string " -", "/dcc get" is unable to download the file. Reproduce: As this is a bit cumbersome to reproduce without mocking files. I included a patch of erc-dcc-tests where the file name contains a the string " - ". Apply the following patch for erc-dcc-tests and run lisp-erc tests. --- diff --git a/test/lisp/erc/erc-dcc-tests.el b/test/lisp/erc/erc-dcc-tests.el index bd8a9fc7951..a487f9067cd 100644 --- a/test/lisp/erc/erc-dcc-tests.el +++ b/test/lisp/erc/erc-dcc-tests.el @@ -109,7 +109,7 @@ erc-dcc-do-GET-command :parent proc :ip "127.0.0.1" :port "9899" - :file "foo.bin" + :file "foo - .bin" :size 1405135128)) (erc-dcc-list (list elt)) ;; @@ -124,7 +124,7 @@ erc-dcc-do-GET-command erc-server-current-nick "dummy") (set-process-query-on-exit-flag proc nil) (cl-letf (((symbol-function 'read-file-name) - (lambda (&rest _) "foo.bin")) + (lambda (&rest _) "foo - .bin")) ((symbol-function 'erc-dcc-get-file) (lambda (&rest r) (push r calls)))) (goto-char (point-max)) @@ -134,36 +134,36 @@ erc-dcc-do-GET-command (ert-info ("No turbo") (should-not (plist-member elt :turbo)) (goto-char erc-input-marker) - (insert "/dcc GET tester foo.bin") + (insert "/dcc GET tester foo - .bin") (erc-send-current-line) (should-not (plist-member (car erc-dcc-list) :turbo)) - (should (equal (pop calls) (list elt "foo.bin" proc)))) + (should (equal (pop calls) (list elt "foo - .bin" proc)))) (ert-info ("Arg turbo in pos 2") (should-not (plist-member elt :turbo)) (goto-char erc-input-marker) - (insert "/dcc GET -t tester foo.bin") + (insert "/dcc GET -t tester foo - .bin") (erc-send-current-line) (should (eq t (plist-get (car erc-dcc-list) :turbo))) - (should (equal (pop calls) (list elt "foo.bin" proc)))) + (should (equal (pop calls) (list elt "foo - .bin" proc)))) (ert-info ("Arg turbo in pos 4") (setq elt (plist-put elt :turbo nil) erc-dcc-list (list elt)) (goto-char erc-input-marker) - (insert "/dcc GET tester -t foo.bin") + (insert "/dcc GET tester -t foo - .bin") (erc-send-current-line) (should (eq t (plist-get (car erc-dcc-list) :turbo))) - (should (equal (pop calls) (list elt "foo.bin" proc)))) + (should (equal (pop calls) (list elt "foo - .bin" proc)))) (ert-info ("Arg turbo in pos 6") (setq elt (plist-put elt :turbo nil) erc-dcc-list (list elt)) (goto-char erc-input-marker) - (insert "/dcc GET tester foo.bin -t") + (insert "/dcc GET tester foo - .bin -t") (erc-send-current-line) (should (eq t (plist-get (car erc-dcc-list) :turbo))) - (should (equal (pop calls) (list elt "foo.bin" proc)))))))) + (should (equal (pop calls) (list elt "foo - .bin" proc)))))))) (defun erc-dcc-tests--pcomplete-common (test-fn) (with-current-buffer (get-buffer-create "*erc-dcc-do-GET-command*") --- Issue present since: df1e553688b * Accommodate nonstandard turbo file senders in erc-dcc Proposed patch: erc: Fix "dcc get" flag parsing When nick or filename starts with `?-' or filename contains the following string " -", "dcc get" is unable determine nick/filename and fails to download file. Flag parsing rules is kept as is: [flag] nick [flag] filename [flag] Flags have the highest priority when parsing the arguments to dcc get. This is not an complete fix as dcc will fail on: - nicks "-s" and "-t" - filenames starting with r"-s|t +" - filenames with ending with r" -s|t" An more robust solution and cleaner implementation would be possible if flag position was limited to the end of the arguments list. This would also make it easier to implement pcomplete for flags as well. --- lisp/erc/erc-dcc.el | 36 +++++++++++++++++++++++----------- test/lisp/erc/erc-dcc-tests.el | 27 ++++++++++++++----------- 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/lisp/erc/erc-dcc.el b/lisp/erc/erc-dcc.el index 4c557e0e0f9..d7c685e9413 100644 --- a/lisp/erc/erc-dcc.el +++ b/lisp/erc/erc-dcc.el @@ -504,18 +504,32 @@ erc-dcc-do-CLOSE-command ?n (erc-extract-nick (plist-get ret :nick)))))) t)) -(defun erc-dcc-do-GET-command (proc nick &rest file) - "Do a DCC GET command. NICK is the person who is sending the file. -FILE is the filename. If FILE is split into multiple arguments, -re-join the arguments, separated by a space. +(defun erc-dcc-do-GET-command (proc &rest args) + "Do a DCC GET command. +ARGS are expected to contain: + nick The person who is sending the file. + filename The filename to be downloaded. Can be split into multiple arguments + which is then joined by a space. + flags \"-t\" sets `:turbo' see `erc-dcc-list' + \"-s\" sets `:secure' see `erc-dcc-list' +ARGS are parsed as follows: + [flag] nick [flag] filename [flag] PROC is the server process." - (let* ((args (seq-group-by (lambda (s) (eq ?- (aref s 0))) (cons nick file))) - (flags (prog1 (cdr (assq t args)) - (setq args (cdr (assq nil args)) - nick (pop args) - file (and args (mapconcat #'identity args " "))))) - (elt (erc-dcc-member :nick nick :type 'GET :file file)) - (filename (or file (plist-get elt :file) "unknown"))) + (let ((possible-flags '("-s" "-t")) + flags nick elt possible-files filename) + ;; Get flags between get and nick + (while (seq-contains-p possible-flags (car args) 'equal) + (setq flags (cons (pop args) flags))) + (setq nick (or (pop args) "")) + ;; Get flags between nick and filename + (while (seq-contains-p possible-flags (car args) 'equal) + (setq flags (cons (pop args) flags))) + ;; Get flags after filename + (setq args (reverse args)) + (while (seq-contains-p possible-flags (car args) 'equal) + (setq flags (cons (pop args) flags))) + (setq filename (or (mapconcat #'identity (reverse args) " ") "") + elt (erc-dcc-member :nick nick :type 'GET :file filename)) (if elt (let* ((file (read-file-name (format-prompt "Local filename" diff --git a/test/lisp/erc/erc-dcc-tests.el b/test/lisp/erc/erc-dcc-tests.el index bd8a9fc7951..f21463bb5a0 100644 --- a/test/lisp/erc/erc-dcc-tests.el +++ b/test/lisp/erc/erc-dcc-tests.el @@ -100,7 +100,7 @@ erc-dcc-handle-ctcp-send--base (ert-deftest erc-dcc-handle-ctcp-send--turbo () (erc-dcc-tests--dcc-handle-ctcp-send t)) -(ert-deftest erc-dcc-do-GET-command () +(defun erc-dcc-tests--erc-dcc-do-GET-command (file) (with-temp-buffer (let* ((proc (start-process "fake" (current-buffer) "sleep" "10")) (elt (list :nick "tester!~tester@fake.irc" @@ -109,7 +109,7 @@ erc-dcc-do-GET-command :parent proc :ip "127.0.0.1" :port "9899" - :file "foo.bin" + :file file :size 1405135128)) (erc-dcc-list (list elt)) ;; @@ -124,7 +124,7 @@ erc-dcc-do-GET-command erc-server-current-nick "dummy") (set-process-query-on-exit-flag proc nil) (cl-letf (((symbol-function 'read-file-name) - (lambda (&rest _) "foo.bin")) + (lambda (&rest _) file)) ((symbol-function 'erc-dcc-get-file) (lambda (&rest r) (push r calls)))) (goto-char (point-max)) @@ -134,36 +134,41 @@ erc-dcc-do-GET-command (ert-info ("No turbo") (should-not (plist-member elt :turbo)) (goto-char erc-input-marker) - (insert "/dcc GET tester foo.bin") + (insert "/dcc GET tester " file) (erc-send-current-line) (should-not (plist-member (car erc-dcc-list) :turbo)) - (should (equal (pop calls) (list elt "foo.bin" proc)))) + (should (equal (pop calls) (list elt file proc)))) (ert-info ("Arg turbo in pos 2") (should-not (plist-member elt :turbo)) (goto-char erc-input-marker) - (insert "/dcc GET -t tester foo.bin") + (insert "/dcc GET -t tester " file) (erc-send-current-line) (should (eq t (plist-get (car erc-dcc-list) :turbo))) - (should (equal (pop calls) (list elt "foo.bin" proc)))) + (should (equal (pop calls) (list elt file proc)))) (ert-info ("Arg turbo in pos 4") (setq elt (plist-put elt :turbo nil) erc-dcc-list (list elt)) (goto-char erc-input-marker) - (insert "/dcc GET tester -t foo.bin") + (insert "/dcc GET tester -t " file) (erc-send-current-line) (should (eq t (plist-get (car erc-dcc-list) :turbo))) - (should (equal (pop calls) (list elt "foo.bin" proc)))) + (should (equal (pop calls) (list elt file proc)))) (ert-info ("Arg turbo in pos 6") (setq elt (plist-put elt :turbo nil) erc-dcc-list (list elt)) (goto-char erc-input-marker) - (insert "/dcc GET tester foo.bin -t") + (insert "/dcc GET tester " file " -t") (erc-send-current-line) (should (eq t (plist-get (car erc-dcc-list) :turbo))) - (should (equal (pop calls) (list elt "foo.bin" proc)))))))) + (should (equal (pop calls) (list elt file proc)))))))) + +(ert-deftest erc-dcc-do-GET-command () + (erc-dcc-tests--erc-dcc-do-GET-command "foo.bin") + (erc-dcc-tests--erc-dcc-do-GET-command "foo - file.bin") + (erc-dcc-tests--erc-dcc-do-GET-command "foo -t file.bin")) (defun erc-dcc-tests--pcomplete-common (test-fn) (with-current-buffer (get-buffer-create "*erc-dcc-do-GET-command*") -- 2.32.0 (Apple Git-132)