diff options
author | Julien Danjou <julien@danjou.info> | 2011-11-28 10:24:08 +0100 |
---|---|---|
committer | Julien Danjou <julien@danjou.info> | 2011-11-28 10:24:08 +0100 |
commit | 3c2727e80787678c95098db187683e8df5086d19 (patch) | |
tree | 67639d4eb81b7645a9ea01250df5c9f3c1b03ea2 /lisp/erc/erc-dcc.el | |
parent | dbf312256d8a8c731dadaf27c1260832a3796350 (diff) | |
download | emacs-3c2727e80787678c95098db187683e8df5086d19.tar.gz emacs-3c2727e80787678c95098db187683e8df5086d19.tar.bz2 emacs-3c2727e80787678c95098db187683e8df5086d19.zip |
erc-dcc: allow SEND commands containing quoted filenames with spaces in them
* 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.
Diffstat (limited to 'lisp/erc/erc-dcc.el')
-rw-r--r-- | lisp/erc/erc-dcc.el | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/lisp/erc/erc-dcc.el b/lisp/erc/erc-dcc.el index 19e1801e03c..fce22aadcc4 100644 --- a/lisp/erc/erc-dcc.el +++ b/lisp/erc/erc-dcc.el @@ -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 |