]> git.eshelyaron.com Git - emacs.git/commitdiff
erc-dcc: allow SEND commands containing quoted filenames with spaces in them
authorJulien Danjou <julien@danjou.info>
Mon, 28 Nov 2011 09:24:08 +0000 (10:24 +0100)
committerJulien Danjou <julien@danjou.info>
Mon, 28 Nov 2011 09:24:08 +0000 (10:24 +0100)
* erc-dcc.el (erc-dcc-ctcp-query-send-regexp): Updated regexp to
match quoted filenames with spaces inside.
(erc-dcc-handle-ctcp-send): Updated regexp match group numbers,
added processing of escaped quotes and backslashes if filename
itself was in quotes.

lisp/erc/ChangeLog
lisp/erc/erc-dcc.el

index 3fd2c87d59cb3a7379862e4debab5f41b488a8c6..1b67835cb07c5976cf164384c6f67793a76c8e31 100644 (file)
@@ -1,3 +1,11 @@
+2011-11-28  Mike Kazantsev  <mk.fraggod@gmail.com>  (tiny change)
+
+       * erc-dcc.el (erc-dcc-ctcp-query-send-regexp): Updated regexp to
+       match quoted filenames with spaces inside.
+       (erc-dcc-handle-ctcp-send): Updated regexp match group numbers,
+       added processing of escaped quotes and backslashes if filename
+       itself was in quotes.
+
 2011-11-20  Juanma Barranquero  <lekktu@gmail.com>
 
        * erc-log.el (erc-logging-enabled): Fix typo.
index 19e1801e03c674ac7b2797e8c3a3ddaf6adc169a..fce22aadcc4bfd34353312db616904749f37523a 100644 (file)
@@ -649,7 +649,16 @@ that subcommand."
        ?q query ?n nick ?u login ?h host))))
 
 (defconst erc-dcc-ctcp-query-send-regexp
-  "^DCC SEND \\([^ ]+\\) \\([0-9]+\\) \\([0-9]+\\) *\\([0-9]*\\)")
+  (concat "^DCC SEND \\("
+          ;; Following part matches either filename without spaces
+          ;; or filename enclosed in double quotes with any number
+          ;; of escaped double quotes inside.
+          "\"\\(\\(.*?\\(\\\\\"\\)?\\)+?\\)\"\\|\\([^ ]+\\)"
+          "\\) \\([0-9]+\\) \\([0-9]+\\) *\\([0-9]*\\)"))
+
+(defsubst erc-dcc-unquote-filename (filename)
+  (erc-replace-regexp-in-string "\\\\\\\\" "\\"
+                                (erc-replace-regexp-in-string "\\\\\"" "\"" filename t t) t t))
 
 (defun erc-dcc-handle-ctcp-send (proc query nick login host to)
   "This is called if a CTCP DCC SEND subcommand is sent to the client.
@@ -664,10 +673,12 @@ It extracts the information about the dcc request and adds it to
        'dcc-request-bogus
        ?r "SEND" ?n nick ?u login ?h host))
      ((string-match erc-dcc-ctcp-query-send-regexp query)
-      (let ((filename (match-string 1 query))
-            (ip       (erc-decimal-to-ip (match-string 2 query)))
-            (port     (match-string 3 query))
-            (size     (match-string 4 query)))
+      (let ((filename
+             (or (match-string 3 query)
+                 (erc-dcc-unquote-filename (match-string 2 query))))
+            (ip       (erc-decimal-to-ip (match-string 6 query)))
+            (port     (match-string 7 query))
+            (size     (match-string 8 query)))
         ;; FIXME: a warning really should also be sent
         ;; if the ip address != the host the dcc sender is on.
         (erc-display-message