2020-06-02 21:54:47 +03:00
|
|
|
from app.filter import Filter, get_first_link
|
2020-07-26 20:53:59 +03:00
|
|
|
from app.utils.session_utils import generate_user_keys
|
2020-06-02 21:54:47 +03:00
|
|
|
from app.request import gen_query
|
|
|
|
from bs4 import BeautifulSoup
|
|
|
|
from cryptography.fernet import Fernet, InvalidToken
|
|
|
|
from flask import g
|
|
|
|
from typing import Any, Tuple
|
|
|
|
|
|
|
|
|
|
|
|
class RoutingUtils:
|
2020-06-06 00:24:44 +03:00
|
|
|
def __init__(self, request, config, session, cookies_disabled=False):
|
2020-06-02 21:54:47 +03:00
|
|
|
self.request_params = request.args if request.method == 'GET' else request.form
|
|
|
|
self.user_agent = request.headers.get('User-Agent')
|
|
|
|
self.feeling_lucky = False
|
|
|
|
self.config = config
|
|
|
|
self.session = session
|
|
|
|
self.query = ''
|
2020-06-06 00:24:44 +03:00
|
|
|
self.cookies_disabled = cookies_disabled
|
2020-06-02 21:54:47 +03:00
|
|
|
self.search_type = self.request_params.get('tbm') if 'tbm' in self.request_params else ''
|
2020-06-26 01:26:02 +03:00
|
|
|
self.bang_operators = {
|
|
|
|
'!gh': 'https://github.com/search?q=',
|
|
|
|
'!ddg': 'https://duckduckgo.com/?q=',
|
|
|
|
'!w': 'https://wikipedia.com/wiki/',
|
|
|
|
'!so': 'https://stackoverflow.com/search?q=',
|
|
|
|
'!a': 'https://amazon.com/s?k=',
|
|
|
|
'!ebay': 'https://ebay.com/sch/i.html?_nkw=',
|
|
|
|
}
|
2020-06-02 21:54:47 +03:00
|
|
|
|
|
|
|
def __getitem__(self, name):
|
|
|
|
return getattr(self, name)
|
|
|
|
|
|
|
|
def __setitem__(self, name, value):
|
|
|
|
return setattr(self, name, value)
|
|
|
|
|
|
|
|
def __delitem__(self, name):
|
|
|
|
return delattr(self, name)
|
|
|
|
|
|
|
|
def __contains__(self, name):
|
|
|
|
return hasattr(self, name)
|
|
|
|
|
|
|
|
def new_search_query(self) -> str:
|
2020-06-06 00:24:44 +03:00
|
|
|
# Generate a new element key each time a new search is performed
|
2020-06-11 21:14:57 +03:00
|
|
|
self.session['fernet_keys']['element_key'] = generate_user_keys(
|
|
|
|
cookies_disabled=self.cookies_disabled)['element_key']
|
2020-06-02 21:54:47 +03:00
|
|
|
|
|
|
|
q = self.request_params.get('q')
|
|
|
|
|
|
|
|
if q is None or len(q) == 0:
|
|
|
|
return ''
|
|
|
|
else:
|
|
|
|
# Attempt to decrypt if this is an internal link
|
|
|
|
try:
|
2020-06-06 00:24:44 +03:00
|
|
|
q = Fernet(self.session['fernet_keys']['text_key']).decrypt(q.encode()).decode()
|
2020-06-02 21:54:47 +03:00
|
|
|
except InvalidToken:
|
|
|
|
pass
|
|
|
|
|
|
|
|
# Reset text key
|
2020-06-11 21:14:57 +03:00
|
|
|
self.session['fernet_keys']['text_key'] = generate_user_keys(
|
|
|
|
cookies_disabled=self.cookies_disabled)['text_key']
|
2020-06-02 21:54:47 +03:00
|
|
|
|
|
|
|
# Format depending on whether or not the query is a "feeling lucky" query
|
|
|
|
self.feeling_lucky = q.startswith('! ')
|
|
|
|
self.query = q[2:] if self.feeling_lucky else q
|
|
|
|
return self.query
|
|
|
|
|
2020-06-26 01:26:02 +03:00
|
|
|
|
|
|
|
def bang_operator(self) -> str:
|
|
|
|
print(self.query)
|
|
|
|
for operator, url in self.bang_operators.items():
|
|
|
|
if operator in self.query:
|
|
|
|
return url + self.query.replace(operator, '').strip()
|
|
|
|
return ''
|
|
|
|
|
|
|
|
|
2020-06-02 21:54:47 +03:00
|
|
|
def generate_response(self) -> Tuple[Any, int]:
|
|
|
|
mobile = 'Android' in self.user_agent or 'iPhone' in self.user_agent
|
|
|
|
|
2020-06-06 00:24:44 +03:00
|
|
|
content_filter = Filter(self.session['fernet_keys'], mobile=mobile, config=self.config)
|
2020-06-02 21:54:47 +03:00
|
|
|
full_query = gen_query(self.query, self.request_params, self.config, content_filter.near)
|
|
|
|
get_body = g.user_request.send(query=full_query).text
|
|
|
|
|
|
|
|
# Produce cleanable html soup from response
|
|
|
|
html_soup = BeautifulSoup(content_filter.reskin(get_body), 'html.parser')
|
|
|
|
|
|
|
|
if self.feeling_lucky:
|
|
|
|
return get_first_link(html_soup), 1
|
|
|
|
else:
|
|
|
|
formatted_results = content_filter.clean(html_soup)
|
|
|
|
return formatted_results, content_filter.elements
|