Merge branch 'master' of ssh://git.sakamoto.pl:2137/laudom/librefi into kfchotspot

This commit is contained in:
Laura Liberda 2020-09-18 23:30:55 +02:00
commit bb8cbadb14
6 changed files with 155 additions and 15 deletions

View file

@ -1,12 +1,11 @@
import requests import requests
from http.cookiejar import CookieJar
from ..utils import get_user_agent from ..utils import get_user_agent, absolute_url
class BaseFxcker: class BaseFxcker:
def __init__(self, logger, log_level): def __init__(self, logger, log_level):
self.cookie_jar = CookieJar() self.cookie_jar = requests.cookies.RequestsCookieJar()
self.user_agent = get_user_agent() self.user_agent = get_user_agent()
self.log = logger(key=self.FXCKER_KEY, log_level=log_level) self.log = logger(key=self.FXCKER_KEY, log_level=log_level)
@ -26,11 +25,14 @@ class BaseFxcker:
self.log.info("Requesting " + self.log.info("Requesting " +
resource if resource is not None resource if resource is not None
else (str(method) + " " + str(url))) 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"): if follow_redirects is True and req.headers.get("Location"):
kwargs["data"] = None kwargs["data"] = None
kwargs["headers"]["Referer"] = url 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, resource=resource,
follow_redirects=follow_redirects, follow_redirects=follow_redirects,
**kwargs) **kwargs)

View file

@ -3,6 +3,7 @@ from .umwarszawa import UMWarszawaFxcker
from .ledatel import LedatelFxcker from .ledatel import LedatelFxcker
from .ipartners import IPartnersFxcker from .ipartners import IPartnersFxcker
from .kfchotspot import KFCHotspotFxcker from .kfchotspot import KFCHotspotFxcker
from .justwifi import JustWifiFxcker
fxckers_map = [ fxckers_map = [
([r"re:MZK Opole \d{3}(?: (?:2.4|5)GHz)?"], DummyFxcker), ([r"re:MZK Opole \d{3}(?: (?:2.4|5)GHz)?"], DummyFxcker),
@ -10,4 +11,8 @@ fxckers_map = [
(["Pendolino_WiFi"], LedatelFxcker), (["Pendolino_WiFi"], LedatelFxcker),
(["McD-Hotspot"], IPartnersFxcker), (["McD-Hotspot"], IPartnersFxcker),
(["KFC Hotspot"], KFCHotspotFxcker), (["KFC Hotspot"], KFCHotspotFxcker),
([
"Intercity_WiFi",
"_PKP_WIFI",
], JustWifiFxcker),
] ]

View file

@ -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'<form action="([^"]+)"',
], sgu.text), redir_url)
glash_token = regex_search_string(
r'<input [^>]*name="glash_step\[_token\]" value="([^"]+)"',
sgu.text)
glash_gdc = regex_search_string(
r'<input [^>]*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'<form [^>]*action="([^"]+)"',
sgu_open.text,
default="http://connect.justwifi.pl/en/p/sgu/open/forward"
), sgu_open.url)
sgu_open_token = regex_search_string(
r'<input [^>]*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'<input [^>]*name="adv_step\[url\] " value="([^"]+)"',
], sgu_after.text)
banner_url_encoded = regex_search_string([
r"var banner_url_encoded = '([^']+)';",
r'<input [^>]*name="adv_step\[url\] " value="([^"]+)"',
], sgu_after.text, default="")
bannerzone = regex_search_string([
r"\$\(\"input\[name='adv_step\[bannerZone\]']\"\).val\('([^']+)'\);",
r'<input [^>]*name="adv_step\[bannerZone\] " value="([^"]+)"',
], sgu_after.text)
sgu_after_token = regex_search_string([
r'<input [^>]*name="adv_step\[_token\] " value="([^"]+)"',
], sgu_after.text)
sgu_after_form_url = absolute_url(regex_search_string([
r'<form [^>]*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

View file

@ -54,7 +54,7 @@ class LibreFi:
self.log.info("No internet access, trying {}.unfxck()" self.log.info("No internet access, trying {}.unfxck()"
.format(self.current_fxcker.FXCKER_KEY)) .format(self.current_fxcker.FXCKER_KEY))
self.current_fxcker.unfxck( self.current_fxcker.unfxck(
location=check_req.headers["location"], location=check_req.headers.get("Location"),
) )
else: else:
self.log.debug("Internet access working") self.log.debug("Internet access working")

View file

@ -1,7 +1,7 @@
# flake8: noqa: E501 # flake8: noqa: E501
import re 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 from datetime import datetime
import random import random
@ -112,17 +112,19 @@ def dump_qs(obj):
qs.append((old_qs_element[0], old_qs_element[1])) qs.append((old_qs_element[0], old_qs_element[1]))
elif isinstance(old_qs_element[1], (dict)): elif isinstance(old_qs_element[1], (dict)):
for subkey in old_qs_element[1]: for subkey in old_qs_element[1]:
qs.append( if old_qs_element[1][subkey] is not None:
(old_qs_element[0] + "[" + subkey + "]", old_qs_element[1][subkey])) qs.append(
if isinstance(old_qs_element[1][subkey], (dict, list)): (old_qs_element[0] + "[" + subkey + "]", old_qs_element[1][subkey]))
not_flat = True if isinstance(old_qs_element[1][subkey], (dict, list)):
not_flat = True
elif isinstance(old_qs_element[1], (list)): elif isinstance(old_qs_element[1], (list)):
for index in range(len(old_qs_element[1])): for index in range(len(old_qs_element[1])):
element = old_qs_element[1][index] element = old_qs_element[1][index]
qs.append( if element is not None:
(old_qs_element[0] + "[" + str(index) + "]", element)) qs.append(
if isinstance(element, (dict, list)): (old_qs_element[0] + "[" + str(index) + "]", element))
not_flat = True if isinstance(element, (dict, list)):
not_flat = True
if not_flat: if not_flat:
old_qs = qs old_qs = qs
qs = [] qs = []
@ -131,3 +133,24 @@ def dump_qs(obj):
strng += qs_quote(str(el[0]), encoding="utf8") + "=" + \ strng += qs_quote(str(el[0]), encoding="utf8") + "=" + \
qs_quote(str(el[1]), encoding="utf8") + "&" qs_quote(str(el[1]), encoding="utf8") + "&"
return strng[:-1] 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

15
tests/url_utils.py Normal file
View file

@ -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