>From 45be9bbb941e91efe9dacf1b3c34d4d362593d53 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Tue, 1 Mar 2022 14:45:26 -0800 Subject: [PATCH 0/5] NOT A PATCH *** BLURB HERE *** F. Jason Park (5): Simplify network-stream opener in socks.el Fix string encoding bug in socks tests Add support for SOCKS 4a Support SOCKS resolve extension [POC] Demo SOCKS resolve with HTTPS lisp/net/socks.el | 133 ++++++++++++++++++++++++++++------- test/lisp/net/socks-tests.el | 113 +++++++++++++++++++++++++++-- 2 files changed, 213 insertions(+), 33 deletions(-) Interdiff: diff --git a/lisp/net/socks.el b/lisp/net/socks.el index cd026fd163..02edd95328 100644 --- a/lisp/net/socks.el +++ b/lisp/net/socks.el @@ -334,18 +334,22 @@ socks-filter (defvar socks-override-functions nil "If non-nil, overwrite `open-network-stream' function with SOCKSified version.") (make-obsolete-variable 'socks-override-functions - "`socks--open-network-stream' now takes a process arg." + "use custom opener with `socks-open-stream-function'." "29.1") -(defun socks-open-connection (server-info &optional opener) +(defvar socks-open-stream-function #'open-network-stream + "Function called to open a network stream connection.") + +(defun socks-open-connection (server-info &rest params) "Create and initialize a SOCKS process. Perform authentication if needed. SERVER-INFO should resemble -`socks-server'. OPENER, when present, should be a substitute for -`open-network-stream' and take the same arguments." +`socks-server'. PARAMS are those accepted by `make-network-process'." (interactive) + (unless (plist-member params :coding) + (setf (plist-get params :coding) '(binary . binary))) (save-excursion - (let ((proc (funcall (or opener #'open-network-stream) - "socks" nil (nth 1 server-info) (nth 2 server-info))) + (let ((proc (apply socks-open-stream-function "socks" nil + (nth 1 server-info) (nth 2 server-info) params)) (authtype nil) version) @@ -531,11 +535,11 @@ socks-find-services-entry (defun socks-open-network-stream (name buffer host service &rest params) (if-let* ((route (socks-find-route host service)) - (proc (socks-open-connection route #'open-network-stream))) + (proc (apply #'socks-open-connection route params))) (socks--open-network-stream proc buffer host service) (message "Warning: no SOCKS route found for %s:%s" host service) ;; Support legacy behavior (likely undesirable in most cases) - (apply #'open-network-stream name buffer host service params))) + (apply socks-open-stream-function name buffer host service params))) (defun socks--open-network-stream (proc buffer host service) (progn ; temporarily preserve git blame for easier reviewing @@ -684,17 +688,20 @@ socks-tor-resolve (let ((socks-password (or socks-password "")) host (port 80) ; unused for now + route proc ip) (unless (string-suffix-p ".onion" name) (setq host (if (string-match "\\`[[:ascii:]]+\\'" name) name (require 'puny) - (puny-encode-domain name))) + (puny-encode-domain name)) + route (socks-find-route host port)) + (cl-assert route) ;; "Host unreachable" may be raised when the lookup fails (unwind-protect (progn - (setq proc (socks-open-connection (socks-find-route host port))) + (setq proc (socks-open-connection route)) (socks-send-command proc socks-resolve-command socks-address-type-name -- 2.35.1