def get_private_key(): pem_str = state.get("private_key") if pem_str: return crypto.load_privatekey(crypto.FILETYPE_PEM, pem_str) log.info("Generating new private key...") key = crypto.PKey() key.generate_key(crypto.TYPE_RSA, 2048) pem = crypto.dump_privatekey(crypto.FILETYPE_PEM, key) state.set("private_key", pem.decode("utf-8")) state.set("private_key_for_api_token", config.get("api_token")) return key
def register_device(): permitted_ips = ['*'] if config.get("single_ip"): permitted_ips = [network.get_public_ip()] log.info("Registering permitted IPs {}".format(",".join(permitted_ips))) method = "v1/device-server" data = { "description": "bunq2ynab on " + network.get_hostname(), "secret": config.get("api_token"), "permitted_ips": permitted_ips } post(method, data) state.set("device_registered", "True")
def call(action, method, data=None): result = call_requests(action, method, data) if isinstance(result, str): return result if ("Error" in result and result["Error"][0]["error_description"] == "Insufficient authorisation."): state.set("session_token", "") result = call_requests(action, method, data) if isinstance(result, str): return result if "Error" in result: raise Exception(result["Error"][0]["error_description"]) global older_url older_url = result.get("Pagination", {}).get("older_url") return result["Response"]
def get_installation_token(): token = state.get("installation_token") if token: return token log.info("Requesting installation token...") public_key = get_public_key() pem = crypto.dump_publickey(crypto.FILETYPE_PEM, public_key) method = "v1/installation" data = {"client_public_key": pem.decode("utf-8")} reply = post(method, data) token = None for row in reply: if "Token" in row: token = row["Token"]["token"] if not token: raise Exception("No token returned by installation") state.set("installation_token", token)
def get_session_token(): check_stale_api_token() token = state.get("session_token") if token: return token if not state.get("installation_token"): get_installation_token() if not state.get("device_registered"): register_device() log.info("Requesting session token...") method = "v1/session-server" data = {"secret": config.get("api_token")} reply = post(method, data) session_token = None for row in reply: if "Token" in row: session_token = row["Token"]["token"] if not session_token: raise Exception("No token returned by session-server") state.set("session_token", session_token) return session_token
def clear_state(): state.set("private_key", "") state.set("private_key_for_api_token", "") state.set("installation_token", "") state.set("device_registered", "") state.set("session_token", "")