Add support for relative search results (#715)
* Relativization of search results * Fix JavaScript error when opening images * Replace single-letter logo and remove sign-in link * Add `WHOOGLE_URL_PREFIX` env var to support relative path redirection The `WHOOGLE_URL_PREFIX` var can now be set to fix internal app redirects, such as the `/session` redirect performed on the first visit to the Whoogle home page. Co-authored-by: Ben Busby <contact@benbusby.com>
This commit is contained in:
		
							parent
							
								
									94b4eb08a2
								
							
						
					
					
						commit
						6d362ca5c7
					
				|  | @ -26,6 +26,7 @@ RUN mkdir -p $config_dir | |||
| RUN chmod a+w $config_dir | ||||
| VOLUME $config_dir | ||||
| 
 | ||||
| ARG url_prefix='' | ||||
| ARG username='' | ||||
| ARG password='' | ||||
| ARG proxyuser='' | ||||
|  | @ -45,6 +46,7 @@ ARG imgur_alt='farside.link/rimgo' | |||
| ARG wikipedia_alt='farside.link/wikiless' | ||||
| 
 | ||||
| ENV CONFIG_VOLUME=$config_dir \ | ||||
|     WHOOGLE_URL_PREFIX=$url_prefix \ | ||||
|     WHOOGLE_USER=$username \ | ||||
|     WHOOGLE_PASS=$password \ | ||||
|     WHOOGLE_PROXY_USER=$proxyuser \ | ||||
|  |  | |||
|  | @ -321,6 +321,7 @@ There are a few optional environment variables available for customizing a Whoog | |||
| 
 | ||||
| | Variable             | Description                                                                               | | ||||
| | -------------------- | ----------------------------------------------------------------------------------------- | | ||||
| | WHOOGLE_URL_PREFIX   | The URL prefix to use for the whoogle instance (i.e. "/whoogle")                          | | ||||
| | WHOOGLE_DOTENV       | Load environment variables in `whoogle.env`                                               | | ||||
| | WHOOGLE_USER         | The username for basic auth. WHOOGLE_PASS must also be set if used.                       | | ||||
| | WHOOGLE_PASS         | The password for basic auth. WHOOGLE_USER must also be set if used.                       | | ||||
|  |  | |||
|  | @ -139,6 +139,8 @@ class Filter: | |||
|         input_form = soup.find('form') | ||||
|         if input_form is not None: | ||||
|             input_form['method'] = 'GET' if self.config.get_only else 'POST' | ||||
|             # Use a relative URI for submissions | ||||
|             input_form['action'] = 'search' | ||||
| 
 | ||||
|         # Ensure no extra scripts passed through | ||||
|         for script in soup('script'): | ||||
|  | @ -320,6 +322,11 @@ class Filter: | |||
|                 render_template('logo.html'), | ||||
|                 features='html.parser')) | ||||
|             return | ||||
|         elif src.startswith(G_M_LOGO_URL): | ||||
|             # Re-brand with single-letter Whoogle logo | ||||
|             element['src'] = 'static/img/favicon/apple-icon.png' | ||||
|             element.parent['href'] = 'home' | ||||
|             return | ||||
|         elif src.startswith(GOOG_IMG) or GOOG_STATIC in src: | ||||
|             element['src'] = BLANK_B64 | ||||
|             return | ||||
|  | @ -423,6 +430,10 @@ class Filter: | |||
|             # Internal google links (i.e. mail, maps, etc) should still | ||||
|             # be forwarded to Google | ||||
|             link['href'] = 'https://google.com' + q | ||||
|         elif q.startswith('https://accounts.google.com'): | ||||
|             # Remove Sign-in link | ||||
|             link.decompose() | ||||
|             return | ||||
|         elif '/search?q=' in href: | ||||
|             # "li:1" implies the query should be interpreted verbatim, | ||||
|             # which is accomplished by wrapping the query in double quotes | ||||
|  | @ -454,6 +465,16 @@ class Filter: | |||
|             if href.startswith(MAPS_URL): | ||||
|                 # Maps links don't work if a site filter is applied | ||||
|                 link['href'] = MAPS_URL + "?q=" + clean_query(q) | ||||
|             elif href.startswith('/?') or href.startswith('/search?'): | ||||
|                 # make sure that tags can be clicked as relative URLs | ||||
|                 link['href'] = href[1:] | ||||
|             elif href.startswith('/intl/'): | ||||
|                 # do nothing, keep original URL for ToS | ||||
|                 pass | ||||
|             elif href.startswith('/preferences'): | ||||
|                 # there is no config specific URL, remove this | ||||
|                 link.decompose() | ||||
|                 return | ||||
|             else: | ||||
|                 link['href'] = href | ||||
| 
 | ||||
|  |  | |||
|  | @ -625,4 +625,7 @@ def run_app() -> None: | |||
|     elif args.unix_socket: | ||||
|         waitress.serve(app, unix_socket=args.unix_socket) | ||||
|     else: | ||||
|         waitress.serve(app, listen="{}:{}".format(args.host, args.port)) | ||||
|         waitress.serve( | ||||
|             app, | ||||
|             listen="{}:{}".format(args.host, args.port), | ||||
|             url_prefix=os.environ.get('WHOOGLE_URL_PREFIX', '')) | ||||
|  |  | |||
|  | @ -1,6 +1,10 @@ | |||
| const checkForTracking = () => { | ||||
|     const mainDiv = document.getElementById("main"); | ||||
|     const query = document.getElementById("search-bar").value.replace(/\s+/g, ''); | ||||
|     const searchBar = document.getElementById("search-bar"); | ||||
|     // some pages (e.g. images) do not have these
 | ||||
|     if (!mainDiv || !searchBar) | ||||
|         return; | ||||
|     const query = searchBar.value.replace(/\s+/g, ''); | ||||
| 
 | ||||
|     // Note: regex functions for checking for tracking queries were derived
 | ||||
|     // from here -- https://stackoverflow.com/questions/619977
 | ||||
|  | @ -59,11 +63,14 @@ document.addEventListener("DOMContentLoaded", function() { | |||
|     checkForTracking(); | ||||
| 
 | ||||
|     // Clear input if reset button tapped
 | ||||
|     const search = document.getElementById("search-bar"); | ||||
|     const searchBar = document.getElementById("search-bar"); | ||||
|     const resetBtn = document.getElementById("search-reset"); | ||||
|     // some pages (e.g. images) do not have these
 | ||||
|     if (!searchBar || !resetBtn) | ||||
|         return; | ||||
|     resetBtn.addEventListener("click", event => { | ||||
|         event.preventDefault(); | ||||
|         search.value = ""; | ||||
|         search.focus(); | ||||
|         searchBar.value = ""; | ||||
|         searchBar.focus(); | ||||
|     }); | ||||
| }); | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| <form id="search-form" action="{{ url }}/search" method="post"> | ||||
| <form id="search-form" action="search" method="post"> | ||||
|     <input | ||||
|             type="text" | ||||
|             name="q" | ||||
|  |  | |||
|  | @ -12,6 +12,7 @@ import re | |||
| SKIP_ARGS = ['ref_src', 'utm'] | ||||
| SKIP_PREFIX = ['//www.', '//mobile.', '//m.'] | ||||
| GOOG_STATIC = 'www.gstatic.com' | ||||
| G_M_LOGO_URL = 'https://www.gstatic.com/m/images/icons/googleg.gif' | ||||
| GOOG_IMG = '/images/branding/searchlogo/1x/googlelogo' | ||||
| LOGO_URL = GOOG_IMG + '_desk' | ||||
| BLANK_B64 = ('data:image/png;base64,' | ||||
|  |  | |||
|  | @ -24,6 +24,7 @@ serviceAccount: | |||
|   name: "" | ||||
| 
 | ||||
| conf: {} | ||||
|   # WHOOGLE_URL_PREFIX: ""   # The URL prefix to use for the whoogle instance (i.e. "/whoogle") | ||||
|   # WHOOGLE_DOTENV: ""       # Load environment variables in whoogle.env | ||||
|   # WHOOGLE_USER: ""         # The username for basic auth. WHOOGLE_PASS must also be set if used. | ||||
|   # WHOOGLE_PASS: ""         # The password for basic auth. WHOOGLE_USER must also be set if used. | ||||
|  |  | |||
|  | @ -24,6 +24,9 @@ | |||
| #WHOOGLE_CSP=1 | ||||
| #HTTPS_ONLY=1 | ||||
| 
 | ||||
| # The URL prefix to use for the whoogle instance (i.e. "/whoogle") | ||||
| #WHOOGLE_URL_PREFIX="" | ||||
| 
 | ||||
| # Restrict results to only those near a particular city | ||||
| #WHOOGLE_CONFIG_NEAR=denver | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user