>From eb3c13c5a09634c2ae71bf3dc97bd32bcf1bef0f Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Wed, 13 Jul 2022 02:48:29 -0700 Subject: [PATCH 02/10] Accept bracketed IPv6 hosts in ERC * lisp/erc/erc-backend.el (erc--server-connect-dumb-ipv6-regexp): Add liberal pattern for matching bracketed IPv6 addresses. (erc-server-connect): Remove brackets from IPv6 hosts before connecting. * lisp/erc/erc.el (erc-select-read-args): Keep bracketed IPv6 hosts intact. --- lisp/erc/erc-backend.el | 8 ++++++++ lisp/erc/erc.el | 7 +++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el index bc7a7d14dc..2ead0c9ba5 100644 --- a/lisp/erc/erc-backend.el +++ b/lisp/erc/erc-backend.el @@ -532,12 +532,20 @@ erc-open-network-stream (let ((p (plist-put parameters :nowait t))) (apply #'open-network-stream name buffer host service p))) +(defvar erc--server-connect-dumb-ipv6-regexp + ;; Likely gives false positives and false negatives + (rx bot "[" + (group (+ (or (any xdigit digit ":.") (: "%" (+ alnum))))) + "]" eot)) + (defun erc-server-connect (server port buffer &optional client-certificate) "Perform the connection and login using the specified SERVER and PORT. We will store server variables in the buffer given by BUFFER. CLIENT-CERTIFICATE may optionally be used to specify a TLS client certificate to use for authentication when connecting over TLS (see `erc-session-client-certificate' for more details)." + (when (string-match erc--server-connect-dumb-ipv6-regexp server) + (setq server (match-string 1 server))) (let ((msg (erc-format-message 'connect ?S server ?p port)) process (args `(,(format "erc-%s-%s" server port) nil ,server ,port))) (when client-certificate diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 0a16831fba..a7114a4bcf 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -2348,8 +2348,11 @@ erc-select-read-args (setq user-input (read-string "IRC server: " (erc-compute-server) 'erc-server-history-list)) - - (if (string-match "\\(.*\\):\\(.*\\)\\'" user-input) + (if (and (string-match (rx (or (: (* (not "[")) ":" (* any)) + (group (+ any))) + ":" (group (+ (not (any ":]")))) eot) + user-input) + (match-string 1 user-input)) (setq port (erc-string-to-port (match-string 2 user-input)) user-input (match-string 1 user-input)) (setq port -- 2.36.1