#!/usr/bin/env python import argparse from xml.etree import ElementTree import sys import requests import keyring import urllib.parse parser = argparse.ArgumentParser() parser.add_argument('url', help="URL like https://smc.swivelsecure.net/smc/complete/...") parser.add_argument('--debug') args = parser.parse_args() parsed_url = urllib.parse.urlparse(args.url) parts = parsed_url.path.split('/') assert parts[1] == 'smc' assert parts[2] == 'complete' user = parts[4] code = parts[5] # Yes, they really throw XML in as form-encoded because it just happens to have a = in it... data = {"3.1Provision{}{}".format(user, code)} user_agent = 'Mozilla/5.0 (Linux; Android 8.1.0; TA-1004 Build/OPR1.170623.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/68.0.3440.91 Mobile Safari/537.36' headers = { 'User-Agent': user_agent, 'Origin': 'file://', # yes, really # let's invent our own header which is an user agent because we put bullshit in the user agent data 'X-Requested-With': 'com.authcontrolmobile', } proxies = {'https': 'http://localhost:8080'} if args.debug else {} verify = not args.debug response = requests.post('https://sidv3611virt.hsr.ch/proxy/AgentXML', data=data, headers=headers, proxies=proxies, verify=verify) response.raise_for_status() print(response.text) tree = ElementTree.fromstring(response.text) assert tree.find('Version').text == '3.6' assert tree.find('Result').text == 'PASS' secret = tree.find('Id') keyring.set_password('hsrvpn-gettokens', user, secret)