[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] erc-dcc: allow SEND commands containing quoted filenames wit
From: |
Michael Olson |
Subject: |
Re: [PATCH] erc-dcc: allow SEND commands containing quoted filenames with spaces in them |
Date: |
Sun, 30 Oct 2011 21:47:48 -0700 |
+1 from me
On Sun, Oct 30, 2011 at 8:56 PM, Mike Kazantsev <address@hidden> wrote:
> Good day,
>
> This patch allows receiving DCC SEND requests like these:
>
> DCC SEND "some name with spaces" 3473212121 3746 322641
>
> Filename here is enclosed in double quotes, which seem to be a common
> IRC client (and dcc bot) convention for names with whitespaces and is
> widely used in file-sharing channels.
>
> Main change here is regexp, matching the filename, with additional
> processing of matched result to unescape any double quotes and slashes
> that might be inside.
>
> Any quoted filename will be processed through erc-dcc-unquote-filename
> from now on, which contradicts pre-patch behavior somewhat in that now
> "file\"x" will be stored as file"x, not as-is (with enclosing quotes),
> even if filename doesn't have any spaces in it.
> It seemed to be more consistent behavor for cases when clients might use
> quoting w/o regard to the actual quoted contents.
>
> Patch was created on top of erc tree.
> Many thanks to Michael Olson for giving the patch a thorough review.
>
> Thanks.
>
>
> From b18c2639d53c2b87270ad21198cfe09a9b6a6684 Mon Sep 17 00:00:00 2001
> From: Mike Kazantsev <address@hidden>
> Date: Sat, 29 Oct 2011 11:36:49 +0600
> Subject: [PATCH] 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.
> ---
> erc-dcc.el | 21 ++++++++++++++++-----
> 1 files changed, 16 insertions(+), 5 deletions(-)
>
> diff --git a/erc-dcc.el b/erc-dcc.el
> index 9e53edc..5aa346b 100644
> --- a/erc-dcc.el
> +++ b/erc-dcc.el
> @@ -646,7 +646,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.
> @@ -661,10 +670,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
> --
> 1.7.7
>
>
>
> --
> Mike Kazantsev // fraggod.net
>
--
Michael Olson | http://mwolson.org/