def login(username, master_password): """ Posts username and authentication hash to /login. Decrypts vault on successful login. Returns new Session. """ print('Logging in...') url = api_base_url + '/login' auth_hash = get_auth_hash(username, master_password) body = { 'username': username, 'auth_hash': base64.b64encode(auth_hash).decode(), } response = requests.post(url, data=json.dumps(body)) if response.status_code != requests.codes.ok: print('Login attempt failed with status code: ' + str(response.status_code)) exit() response_body = response.json() cipher_text = base64.b64decode(response_body['vault'].encode()) key = get_key(username, master_password) vault_str = decrypt_vault(cipher_text, key) vault_dict = json.loads(vault_str) session = Session(username, auth_hash, key) session.dict_to_vault(vault_dict) return session