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 assert code == 200, f"cannot access to lemonldap; {content}" assert b'Authentication portal' in content, f'cannot find LemonLdap title: {content}' 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 content = ret.content.decode() assert title in content, f'cannot find {title} in {content}' 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, headers=None, ): with MookDns(self.ip): ret = post(url, cookies=self.cookies, data=data, headers=headers) assert ret.status_code == 200, f'return code is {ret.status_code}'