
    i              	           d Z ddlmZmZ ddlZddlZddlZddlmZ ddl	m
Z
 dedefd	Zd
eez  dej                  dej                  dej                   dz  fdZy)a&  
Method ``http_sec_fetch``
-------------------------

The ``http_sec_fetch`` method protect resources from web attacks with `Fetch
Metadata`_.  A request is filtered out in case of:

- http header Sec-Fetch-Mode_ is invalid
- http header Sec-Fetch-Dest_ is invalid

.. _Fetch Metadata:
   https://developer.mozilla.org/en-US/docs/Glossary/Fetch_metadata_request_header

.. _Sec-Fetch-Dest:
   https://developer.mozilla.org/en-US/docs/Web/API/Request/destination

.. _Sec-Fetch-Mode:
   https://developer.mozilla.org/en-US/docs/Web/API/Request/mode


    )IPv4NetworkIPv6NetworkN   )config)logger
user_agentreturnc                    | j                         } t        j                  d|       }|rt        |j	                  d            }|dk\  S t        j                  d|       }|rt        |j	                  d            }|dk\  S t        j                  d|       }|rGt        |j	                  d            }t        |j	                  d            }|dkD  xs |dk(  xr |d	k\  S y
)al  Check if the browser supports Sec-Fetch headers.

    https://caniuse.com/mdn-http_headers_sec-fetch-dest
    https://caniuse.com/mdn-http_headers_sec-fetch-mode
    https://caniuse.com/mdn-http_headers_sec-fetch-site

    Supported browsers:
    - Chrome >= 80
    - Firefox >= 90
    - Safari >= 16.4
    - Edge (mirrors Chrome)
    - Opera (mirrors Chrome)
    zchrome/(\d+)r   P   zfirefox/(\d+)Z   zversion/(\d+)\.(\d+)         F)lowerresearchintgroup)r   chrome_matchversionfirefox_matchsafari_matchmajorminors          2/root/searxng/searx/botdetection/http_sec_fetch.pyis_browser_supportedr   '   s     !!#J 99_j9Ll((+,"} II.
;Mm))!,-"} 994jALL&&q)*L&&q)*rz9erk8eqj9    networkrequestcfgc                    |j                   st        j                  d       y |j                  j	                  dd      }t        |      r |j                  j	                  dd      }|dvr@t        j                  d|       t        j                  t        j                  d      d	      S |j                  j	                  d
d      }|dvr@t        j                  d|       t        j                  t        j                  d      d	       |j                  j	                  dd      }|dvr@t        j                  d|       t        j                  t        j                  d      d	       y )NzcSec-Fetch cannot be verified for non-secure requests (HTTP headers are not set/sent by the client).z
User-Agent zSec-Fetch-Mode)navigatecorszinvalid Sec-Fetch-Mode '%s'indexi.  )codezSec-Fetch-Site)zsame-originz	same-sitenonezinvalid Sec-Fetch-Site '%s'zSec-Fetch-Dest)documentemptyzinvalid Sec-Fetch-Dest '%s')
	is_securer   warningheadersgetr   debugflaskredirecturl_for)r   r   r    r   vals        r   filter_requestr3   M   s    q	
  $$\26JJ'oo!!"2B7**LL6<>>%--"8sCCoo!!"2B7::LL6<NN5==1<oo!!"2B7++LL6<NN5==1<r   )__doc__	ipaddressr   r   r   r/   werkzeugr"   r   _helpersr   strboolr   RequestConfigResponser3    r   r   <module>r>      su   0
 
    #S #T #L;&]] 
 	r   