2022-07-16 22:16:24 +02:00
|
|
|
from requests import get, post, session
|
|
|
|
from mookdns import MookDns
|
|
|
|
|
|
|
|
|
|
|
|
class Authentication:
|
|
|
|
def __init__(self,
|
|
|
|
auth_url,
|
|
|
|
portal_server,
|
|
|
|
ip,
|
|
|
|
username,
|
|
|
|
password,
|
|
|
|
title,
|
|
|
|
):
|
|
|
|
self.ip = ip
|
|
|
|
with session() as req:
|
|
|
|
with MookDns(self.ip):
|
|
|
|
self.is_lemonldap(req,
|
|
|
|
auth_url,
|
|
|
|
)
|
|
|
|
self.auth_lemonldap(req,
|
|
|
|
portal_server,
|
|
|
|
username,
|
|
|
|
password,
|
|
|
|
title,
|
|
|
|
)
|
|
|
|
self.cookies = dict(req.cookies)
|
|
|
|
|
|
|
|
# @staticmethod
|
|
|
|
def is_lemonldap(self,
|
|
|
|
req,
|
|
|
|
url,
|
|
|
|
):
|
|
|
|
ret = req.get(url)
|
|
|
|
code = ret.status_code
|
|
|
|
content = ret.content
|
2022-08-19 20:30:13 +02:00
|
|
|
assert code == 200, f"cannot access to lemonldap; {content}"
|
2022-07-18 17:06:12 +02:00
|
|
|
assert b'<title trspan="authPortal">Authentication portal</title>' in content, f'cannot find LemonLdap title: {content}'
|
2022-07-16 22:16:24 +02:00
|
|
|
|
|
|
|
def auth_lemonldap(self,
|
|
|
|
req,
|
|
|
|
portal_server,
|
|
|
|
username,
|
|
|
|
password,
|
|
|
|
title,
|
|
|
|
):
|
|
|
|
# authentification
|
|
|
|
json = {'user': username,
|
|
|
|
'password': password,
|
|
|
|
}
|
|
|
|
headers = {"Content-Type": "application/x-www-form-urlencoded",
|
|
|
|
"Accept": "application/json",
|
|
|
|
}
|
|
|
|
portal_url = f'https://{portal_server}/oauth2/'
|
|
|
|
ret = req.post(portal_url, data=json, headers=headers)
|
|
|
|
json = ret.json()
|
|
|
|
assert json['error']
|
|
|
|
assert json['result'] == 1
|
|
|
|
assert json['id'] == ret.cookies.get('lemonldap')
|
|
|
|
# authorization code
|
|
|
|
# curl -X POST -d user=dwho -d password=dwho -H 'Accept: application/json' 'https://oidctest.wsweet.org/oauth2/'
|
|
|
|
# curl -s -D - -o /dev/null -b lemonldap=0640f95827111f00ba7ad5863ba819fe46cfbcecdb18ce525836369fb4c8350b 'https://oidctest.wsweet.org/oauth2/authorize?response_type=code&client_id=private&scope=openid+profile+email&redirect_uri=http://localhost' | grep '^location'
|
|
|
|
authorize_url = f'{portal_url}authorize'
|
|
|
|
ret = req.get(authorize_url)
|
|
|
|
assert ret.status_code == 200
|
|
|
|
assert title in ret.content.decode()
|
|
|
|
|
|
|
|
def get(self,
|
|
|
|
url,
|
|
|
|
json=False,
|
|
|
|
):
|
|
|
|
with MookDns(self.ip):
|
|
|
|
ret = get(url, cookies=self.cookies)
|
|
|
|
assert ret.status_code == 200, f'return code is {ret.status_code}'
|
|
|
|
if json:
|
|
|
|
return ret.json()
|
|
|
|
return ret.content.decode()
|
|
|
|
|
|
|
|
def post(self,
|
|
|
|
url,
|
|
|
|
data,
|
|
|
|
):
|
|
|
|
with MookDns(self.ip):
|
|
|
|
ret = post(url, cookies=self.cookies, data=data)
|
|
|
|
assert ret.status_code == 200, f'return code is {ret.status_code}'
|