diff --git a/librefi/fxckers/_common.py b/librefi/fxckers/_common.py index ebbb830..44f8fda 100644 --- a/librefi/fxckers/_common.py +++ b/librefi/fxckers/_common.py @@ -1,12 +1,11 @@ import requests -from http.cookiejar import CookieJar -from ..utils import get_user_agent +from ..utils import get_user_agent, absolute_url class BaseFxcker: def __init__(self, logger, log_level): - self.cookie_jar = CookieJar() + self.cookie_jar = requests.cookies.RequestsCookieJar() self.user_agent = get_user_agent() self.log = logger(key=self.FXCKER_KEY, log_level=log_level) @@ -26,11 +25,14 @@ class BaseFxcker: self.log.info("Requesting " + resource if resource is not None else (str(method) + " " + str(url))) - req = requests.request(method, url, **kwargs) + sess = requests.Session() + req = sess.request(method, url, **kwargs) + self.cookie_jar.update(sess.cookies) if follow_redirects is True and req.headers.get("Location"): kwargs["data"] = None kwargs["headers"]["Referer"] = url - return self.request("GET", req.headers.get("Location"), + new_url = absolute_url(req.headers.get("Location"), url) + return self.request("GET", new_url, resource=resource, follow_redirects=follow_redirects, **kwargs) diff --git a/librefi/fxckers/_map.py b/librefi/fxckers/_map.py index 1dbce81..76cdef0 100644 --- a/librefi/fxckers/_map.py +++ b/librefi/fxckers/_map.py @@ -3,6 +3,7 @@ from .umwarszawa import UMWarszawaFxcker from .ledatel import LedatelFxcker from .ipartners import IPartnersFxcker from .kfchotspot import KFCHotspotFxcker +from .justwifi import JustWifiFxcker fxckers_map = [ ([r"re:MZK Opole \d{3}(?: (?:2.4|5)GHz)?"], DummyFxcker), @@ -10,4 +11,8 @@ fxckers_map = [ (["Pendolino_WiFi"], LedatelFxcker), (["McD-Hotspot"], IPartnersFxcker), (["KFC Hotspot"], KFCHotspotFxcker), + ([ + "Intercity_WiFi", + "_PKP_WIFI", + ], JustWifiFxcker), ] diff --git a/librefi/fxckers/justwifi.py b/librefi/fxckers/justwifi.py new file mode 100644 index 0000000..ed6b9da --- /dev/null +++ b/librefi/fxckers/justwifi.py @@ -0,0 +1,95 @@ +from ._common import BaseFxcker +from ..utils import regex_search_string, absolute_url, dump_qs + + +class JustWifiFxcker(BaseFxcker): + # tested with Intercity_WiFi (PKP IC Dart) + def unfxck(self, location=None): + start = self.request( + # flake8: noqa: E501 + "GET", location or "http://tank.justwifi.pl/connect?returnurl=http://detectportal.firefox.com/success.txt%3f", + resource="start redir") + redir_url = regex_search_string([ + r'window\.location\.href = "([^"]+)";', + ], start.text) + sgu = self.request("GET", redir_url, resource="splash page") + glash_form_url = absolute_url(regex_search_string([ + r"\$\('#glash_form(?:_adv)?'\).attr\('action', '([^']+)'\);", + r'
]*name="glash_step\[_token\]" value="([^"]+)"', + sgu.text) + glash_gdc = regex_search_string( + r']*name="glash_step\[gdc\]" value="([^"]+)" />', + sgu.text, default=None) + # /en/p/sgu/glash/forward -> /en/p/sgu/open + sgu_open = self.request("POST", glash_form_url, + resource="glash forward", + data=dump_qs({ + "glash_step": { + "gdc": glash_gdc, + "_token": glash_token, + }, + }), + headers={ + "Referer": sgu.url, + "Content-Type": + "application/x-www-form-urlencoded", + }, + ) + sgu_open_forward_url = absolute_url(regex_search_string( + r']*action="([^"]+)"', + sgu_open.text, + default="http://connect.justwifi.pl/en/p/sgu/open/forward" + ), sgu_open.url) + sgu_open_token = regex_search_string( + r']*name="form\[_token\]" value="([^"]+)"', + sgu_open.text) + sgu_after = self.request("POST", sgu_open_forward_url, + resource="sgu after (ad redir page)", + data=dump_qs({ + "form": { + "_token": sgu_open_token + } + }), headers={ + "Referer": sgu_open.url, + "Content-Type": + "application/x-www-form-urlencoded", + }) + cnt_url = regex_search_string([ + r"var cnt_url = '([^']+)';", + r']*name="adv_step\[url\] " value="([^"]+)"', + ], sgu_after.text) + banner_url_encoded = regex_search_string([ + r"var banner_url_encoded = '([^']+)';", + r']*name="adv_step\[url\] " value="([^"]+)"', + ], sgu_after.text, default="") + bannerzone = regex_search_string([ + r"\$\(\"input\[name='adv_step\[bannerZone\]']\"\).val\('([^']+)'\);", + r']*name="adv_step\[bannerZone\] " value="([^"]+)"', + ], sgu_after.text) + sgu_after_token = regex_search_string([ + r']*name="adv_step\[_token\] " value="([^"]+)"', + ], sgu_after.text) + sgu_after_form_url = absolute_url(regex_search_string([ + r']*action="([^"]+)"', + ], sgu_after.text), sgu_after.url) + self.request("POST", sgu_after_form_url, + resource="ad campaign redir", + data=dump_qs({ + "adv_step": { + # "cta" | "nothanks" | "skip" + "action": "cta", + "bannerZone": bannerzone, + "url": cnt_url + banner_url_encoded + if cnt_url is str and banner_url_encoded is str + else "http://connect.justwifi.pl/en/mgbc/%s/l" + % (bannerzone), + "_token": sgu_after_token, + }, + }), headers={ + "Referer": sgu_after.url, + "Content-Type": "application/x-www-form-urlencoded", + }) + return True diff --git a/librefi/librefi.py b/librefi/librefi.py index 5221166..94cf914 100644 --- a/librefi/librefi.py +++ b/librefi/librefi.py @@ -54,7 +54,7 @@ class LibreFi: self.log.info("No internet access, trying {}.unfxck()" .format(self.current_fxcker.FXCKER_KEY)) self.current_fxcker.unfxck( - location=check_req.headers["location"], + location=check_req.headers.get("Location"), ) else: self.log.debug("Internet access working") diff --git a/librefi/utils.py b/librefi/utils.py index 8355694..4b2cd6a 100644 --- a/librefi/utils.py +++ b/librefi/utils.py @@ -1,7 +1,7 @@ # flake8: noqa: E501 import re -from urllib.parse import parse_qs, quote as qs_quote +from urllib.parse import parse_qs, quote as qs_quote, urlparse from datetime import datetime import random @@ -112,17 +112,19 @@ def dump_qs(obj): qs.append((old_qs_element[0], old_qs_element[1])) elif isinstance(old_qs_element[1], (dict)): for subkey in old_qs_element[1]: - qs.append( - (old_qs_element[0] + "[" + subkey + "]", old_qs_element[1][subkey])) - if isinstance(old_qs_element[1][subkey], (dict, list)): - not_flat = True + if old_qs_element[1][subkey] is not None: + qs.append( + (old_qs_element[0] + "[" + subkey + "]", old_qs_element[1][subkey])) + if isinstance(old_qs_element[1][subkey], (dict, list)): + not_flat = True elif isinstance(old_qs_element[1], (list)): for index in range(len(old_qs_element[1])): element = old_qs_element[1][index] - qs.append( - (old_qs_element[0] + "[" + str(index) + "]", element)) - if isinstance(element, (dict, list)): - not_flat = True + if element is not None: + qs.append( + (old_qs_element[0] + "[" + str(index) + "]", element)) + if isinstance(element, (dict, list)): + not_flat = True if not_flat: old_qs = qs qs = [] @@ -131,3 +133,24 @@ def dump_qs(obj): strng += qs_quote(str(el[0]), encoding="utf8") + "=" + \ qs_quote(str(el[1]), encoding="utf8") + "&" return strng[:-1] + + +def absolute_url(new_url: str, old_url: str): + if new_url.startswith("http:") or new_url.startswith("https:"): + return new_url + + old = urlparse(old_url) + scheme = old.scheme if old.scheme is not None else "http" + + if new_url.startswith("://"): + return scheme + new_url + if new_url.startswith("//"): + return scheme + ":" + new_url + + hostname = old.netloc + + if new_url.startswith("/"): + return scheme + "://" + hostname + new_url + + # like "hostname/path?query", if other checks fail + return scheme + "://" + new_url diff --git a/tests/url_utils.py b/tests/url_utils.py new file mode 100644 index 0000000..7dc34dc --- /dev/null +++ b/tests/url_utils.py @@ -0,0 +1,15 @@ +from librefi.utils import absolute_url + +OLD_URL = "https://sakamoto.pl/ddd" +NEW_URL_RELATIVE = "/DDD?test=yes" + +# expected value +NEW_URL_ABSOLUTE = "https://sakamoto.pl/DDD?test=yes" + + +def test_basic(): + abso = absolute_url(NEW_URL_RELATIVE, OLD_URL) + assert isinstance(abso, (str)) + print(abso) + assert abso == NEW_URL_ABSOLUTE + pass