X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=elpher.git;a=blobdiff_plain;f=elpher.el;h=db5a82019a6d767a4654b944b35b826c31b9f133;hp=acc20badac4a4c9d4f685a1e1132422844fb0fd9;hb=bf4ca5f27dee02b0cc38633c1fe66b8891e6282c;hpb=5b568bcfd841bcd8fa3972035f6bdff82cb5d3f0 diff --git a/elpher.el b/elpher.el index acc20ba..db5a820 100644 --- a/elpher.el +++ b/elpher.el @@ -4,7 +4,7 @@ ;; Author: Tim Vaughan ;; Created: 11 April 2019 -;; Version: 2.3.5 +;; Version: 2.3.6 ;; Keywords: comm gopher ;; Homepage: https://github.com/tgvaughan/elpher ;; Package-Requires: ((emacs "26")) @@ -60,12 +60,13 @@ (require 'shr) (require 'url-util) (require 'subr-x) +(require 'dns) ;;; Global constants ;; -(defconst elpher-version "2.3.5" +(defconst elpher-version "2.3.6" "Current version of elpher.") (defconst elpher-margin-width 6 @@ -88,7 +89,7 @@ (gemini elpher-get-gemini-node elpher-render-gemini "gem" elpher-gemini) (telnet elpher-get-telnet-node nil "tel" elpher-telnet) (other-url elpher-get-other-url-node nil "url" elpher-other-url) - ((special bookmarks) elpher-get-bookmarks-node nil) + ((special bookmarks) elpher-get-bookmarks-node nil "/" elpher-index) ((special start) elpher-get-start-node nil)) "Association list from types to getters, renderers, margin codes and index faces.") @@ -282,16 +283,11 @@ For gopher addresses this is a combination of the selector type and selector." (url-host address)) (defun elpher-address-port (address) - "Retrieve port from ADDRESS object." + "Retrieve port from ADDRESS object. +If no address is defined, returns 0. (This is for compatibility with the URL library.)" (if (symbolp address) - nil) - (if (> (url-port address) 0) - (url-port address) - (or (and (or (equal (url-type address) "gopher") - (equal (url-type address) "gophers")) - 70) - (and (equal (url-type address) "gemini") - 1965)))) + 0 + (url-port address))) (defun elpher-address-special-p (address) "Return non-nil if ADDRESS object is special (e.g. start page, bookmarks page)." @@ -429,7 +425,7 @@ unless PRESERVE-PARENT is non-nil." (tls-string (if (and (not (elpher-address-special-p address)) (member (elpher-address-protocol address) '("gophers" "gemini"))) - " [TLS]" + " [TLS encryption]" "")) (header (concat display-string (propertize tls-string 'face 'bold)))) @@ -509,10 +505,12 @@ up to the calling function." (error "Cannot retrieve TLS gopher selector: GnuTLS not available"))) (condition-case the-error (let* ((kill-buffer-query-functions nil) + (port (elpher-address-port address)) + (host (elpher-address-host address)) (proc (open-network-stream "elpher-process" nil - (elpher-address-host address) - (elpher-address-port address) + host + (if (> port 0) port 70) :type (if elpher-use-tls 'tls 'plain)))) (set-process-coding-system proc 'binary) (set-process-filter proc @@ -596,7 +594,9 @@ once they are retrieved from the gopher server." (defun elpher-node-button-help (node) "Return a string containing the help text for a button corresponding to NODE." (let ((address (elpher-node-address node))) - (format "mouse-1, RET: open '%s'" (elpher-address-to-url address)))) + (format "mouse-1, RET: open '%s'" (if (elpher-address-special-p address) + address + (elpher-address-to-url address))))) (defun elpher-insert-index-record (display-string &optional address) "Function to insert an index record into the current buffer. @@ -772,6 +772,7 @@ The response is rendered using the rendering function RENDERER." ;; Gemini node retrieval (defvar elpher-gemini-response) +(defvar elpher-gemini-redirect-chain) (defun elpher-get-gemini-response (address after) "Retrieve gemini ADDRESS, then execute AFTER. @@ -781,11 +782,15 @@ The response is stored in the variable ‘elpher-gemini-response’." (error "Cannot establish gemini connection: GnuTLS not available") (condition-case the-error (let* ((kill-buffer-query-functions nil) + (network-security-level 'medium) + (port (elpher-address-port address)) + (host (elpher-address-host address)) (proc (open-network-stream "elpher-process" nil - (elpher-address-host address) - (elpher-address-port address) - :type 'tls))) + host + (if (> port 0) port 1965) + :type 'tls + :nowait t))) (set-process-coding-system proc 'binary) (set-process-filter proc (lambda (_proc string) @@ -831,7 +836,8 @@ The response is assumed to be in the variable `elpher-gemini-response'." (query-address (elpher-address-from-url (concat url "?" query-string)))) (elpher-get-gemini-response query-address (lambda (_proc event) - (unless (string-prefix-p "deleted" event) + (unless (or (string-prefix-p "deleted" event) + (string-prefix-p "open" event)) (funcall #'elpher-process-gemini-response renderer) (elpher-restore-pos)))))) @@ -840,10 +846,20 @@ The response is assumed to be in the variable `elpher-gemini-response'." (funcall renderer response-body response-meta)) (?3 ; Redirect (message "Following redirect to %s" response-meta) + (if (>= (length elpher-gemini-redirect-chain) 5) + (error "More than 5 consecutive redirects followed")) (let ((redirect-address (elpher-address-from-gemini-url response-meta))) + (if (member redirect-address elpher-gemini-redirect-chain) + (error "Redirect loop detected")) + (if (not (string= (elpher-address-protocol redirect-address) + "gemini")) + (error "Server tried to automatically redirect to non-gemini URL: %s" + response-meta)) + (add-to-list 'elpher-gemini-redirect-chain redirect-address) (elpher-get-gemini-response redirect-address (lambda (_proc event) - (unless (string-prefix-p "deleted" event) + (unless (or (string-prefix-p "deleted" event) + (string-prefix-p "open" event)) (funcall #'elpher-process-gemini-response renderer) (elpher-restore-pos)))))) @@ -872,9 +888,11 @@ The response is assumed to be in the variable `elpher-gemini-response'." (elpher-restore-pos)) (elpher-with-clean-buffer (insert "LOADING GEMINI... (use 'u' to cancel)")) + (setq elpher-gemini-redirect-chain nil) (elpher-get-gemini-response address (lambda (_proc event) - (unless (string-prefix-p "deleted" event) + (unless (or (string-prefix-p "deleted" event) + (string-prefix-p "open" event)) (funcall #'elpher-process-gemini-response renderer) (elpher-restore-pos))))) @@ -1009,7 +1027,9 @@ For instance, the filename /a/b/../c/./d will reduce to /a/c/d" (host (elpher-address-host address)) (port (elpher-address-port address))) (elpher-visit-parent-node) - (telnet host port))) + (if (> port 0) + (telnet host port) + (telnet host)))) ;; Start page node retrieval @@ -1051,6 +1071,9 @@ For instance, the filename /a/b/../c/./d will reduce to /a/c/d" "Alternatively, select the following item and enter some search terms:\n") (elpher-insert-index-record "Veronica-2 Gopher Search Engine" (elpher-make-gopher-address ?7 "/v2/vs" "gopher.floodgap.com" 70)) + (insert "\n" + "This page contains your bookmarked sites (also visit with B):\n") + (elpher-insert-index-record "Your Bookmarks" 'bookmarks) (insert "\n" "** Refer to the ") (let ((help-string "RET,mouse-1: Open Elpher info manual (if available)"))