diff --git a/searx/botdetection/_helpers.py b/searx/botdetection/_helpers.py index b15f720f6..0f6bafb17 100644 --- a/searx/botdetection/_helpers.py +++ b/searx/botdetection/_helpers.py @@ -8,6 +8,7 @@ from ipaddress import ( IPv4Address, IPv6Address, ip_network, + ip_address, ) import flask import werkzeug @@ -125,6 +126,9 @@ def get_real_ip(request: SXNG_Request) -> str: if real_ip and remote_addr and real_ip != remote_addr: logger.warning("IP from WSGI environment (%s) is not equal to IP from X-Real-IP (%s)", remote_addr, real_ip) - request_ip = forwarded_for or real_ip or remote_addr or '0.0.0.0' + request_ip = ip_address(forwarded_for or real_ip or remote_addr or '0.0.0.0') + if request_ip.version == 6 and request_ip.ipv4_mapped: + request_ip = request_ip.ipv4_mapped + # logger.debug("get_real_ip() -> %s", request_ip) - return request_ip + return str(request_ip) diff --git a/searx/plugins/tor_check.py b/searx/plugins/tor_check.py index 95281eb42..e719207bf 100644 --- a/searx/plugins/tor_check.py +++ b/searx/plugins/tor_check.py @@ -21,7 +21,8 @@ from flask_babel import gettext from httpx import HTTPError from searx.network import get -from searx.result_types import Answer +from searx.result_types import EngineResults +from searx.botdetection import get_real_ip default_on = False @@ -51,8 +52,8 @@ url_exit_list = "https://check.torproject.org/exit-addresses" """URL to load Tor exit list from.""" -def post_search(request, search) -> list[Answer]: - results = [] +def post_search(request, search) -> EngineResults: + results = EngineResults() if search.search_query.pageno > 1: return results @@ -67,22 +68,17 @@ def post_search(request, search) -> list[Answer]: except HTTPError: # No answer, return error msg = gettext("Could not download the list of Tor exit-nodes from") - Answer(results=results, answer=f"{msg} {url_exit_list}") + results.add(results.types.Answer(answer=f"{msg} {url_exit_list}")) return results - x_forwarded_for = request.headers.getlist("X-Forwarded-For") + real_ip = get_real_ip(request) - if x_forwarded_for: - ip_address = x_forwarded_for[0] - else: - ip_address = request.remote_addr - - if ip_address in node_list: + if real_ip in node_list: msg = gettext("You are using Tor and it looks like you have the external IP address") - Answer(results=results, answer=f"{msg} {ip_address}") + results.add(results.types.Answer(answer=f"{msg} {real_ip}")) else: msg = gettext("You are not using Tor and you have the external IP address") - Answer(results=results, answer=f"{msg} {ip_address}") + results.add(results.types.Answer(answer=f"{msg} {real_ip}")) return results diff --git a/searx/plugins/unit_converter.py b/searx/plugins/unit_converter.py index cdd8287fe..3b9f98945 100644 --- a/searx/plugins/unit_converter.py +++ b/searx/plugins/unit_converter.py @@ -25,7 +25,7 @@ import babel.numbers from flask_babel import gettext, get_locale from searx import data -from searx.result_types import Answer +from searx.result_types import EngineResults name = "Unit converter plugin" @@ -245,8 +245,8 @@ def _parse_text_and_convert(from_query, to_query) -> str | None: return f'{result} {target_symbol}' -def post_search(_request, search) -> list[Answer]: - results = [] +def post_search(_request, search) -> EngineResults: + results = EngineResults() # only convert between units on the first page if search.search_query.pageno > 1: @@ -264,6 +264,6 @@ def post_search(_request, search) -> list[Answer]: from_query, to_query = query.split(keyword, 1) target_val = _parse_text_and_convert(from_query.strip(), to_query.strip()) if target_val: - Answer(results=results, answer=target_val) + results.add(results.types.Answer(answer=target_val)) return results