Source code for coto.clients.account

from bs4 import BeautifulSoup
from pyotp import TOTP
from datetime import datetime, timedelta
import json
from . import BaseClient


[docs]class ReauthException(Exception): pass
[docs]class Client(BaseClient): """ A low-level client representing Account: .. code-block:: python import coto session = coto.Session() client = session.client('account') These are the available methods: * :py:meth:`get_account_info` * :py:meth:`update_account_name` * :py:meth:`update_account_email` * :py:meth:`update_account_password` """ _REDIRECT_URL = "https://console.aws.amazon.com/console/home?state=hashArgs%23&isauthcode=true" def __init__(self, session): super().__init__(session) self.__csrf_token = None def _csrf_token(self): if self.__csrf_token == None: self._get_tokens() return self.__csrf_token def _get_tokens(self): r = self.session()._get( 'https://signin.aws.amazon.com/updateaccount?redirect_uri=https%3A%2F%2Fconsole.aws.amazon.com%2Fbilling%2Fhome%23%2Faccount' ) if r.status_code != 200: raise Exception("failed get tokens") soup = BeautifulSoup(r.text, 'html.parser') meta = { m['name']: m['content'] for m in soup.find_all('meta') if 'name' in m.attrs } self.__csrf_token = meta['csrf_token'] def _action(self, action, data=None): """ Execute an action on the updateaccount API. Args: action: Action to execute. data: Arguments for the action. Returns: dict: Action response. Raises: :py:class:`coto.clients.decoupled_account.ReauthException`: You have to reauthenticate, then try again. """ if not data: data = {} data['action'] = action data['redirect_uri'] = self._REDIRECT_URL data['csrf'] = self._csrf_token() r = self.session()._post( 'https://signin.aws.amazon.com/updateaccount', data=data, ) if r.status_code != 200: print(r.text) raise Exception("failed action {0}".format(action)) out = json.loads(r.text) if out['state'] == 'FAIL' and out['properties']['action'] == 'reAuth': raise ReauthException() if out['state'].lower() != 'success': if 'Message' in out['properties']: raise Exception("failed action {0}: {1}".format(action, out['properties']['Message'])) else: raise Exception("failed action {0}".format(action)) return out['properties']
[docs] def get_account_info(self): """ Gets the account name and email address. Request Syntax: .. code-block:: python response = client.get_auth_state() Returns: dict: Response Syntax .. code-block:: python { 'accountEmail': str, 'Message': str, 'accountName': str, 'Title': str, } Raises: :py:class:`coto.clients.decoupled_account.ReauthException`: You have to reauthenticate, then try again. """ return self._action('getAuthState')
[docs] def update_account_name(self, AccountName): """ Sets a new account name. Request Syntax: .. code-block:: python response = client.update_account_name( AccountName=str, ) Returns: dict: Response Syntax .. code-block:: python { 'Message': str, 'Title': str, 'updatedAccountName': str } Raises: :py:class:`coto.clients.decoupled_account.ReauthException`: You have to reauthenticate, then try again. """ return self._action('updateAccountName', { 'newAccountName': AccountName, })
[docs] def update_account_email(self, Password, AccountEmail): """ Sets a new account email address. Request Syntax: .. code-block:: python response = client.update_account_email( Password=str, AccountEmail=str, ) Args: Password (str): Current account password. AccountEmail (str): New account email. Returns: dict: Response Syntax .. code-block:: python { 'Message': str, 'Title': str, 'updatedAccountEmail': str } Raises: :py:class:`coto.clients.decoupled_account.ReauthException`: You have to reauthenticate, then try again. """ return self._action('updateAccountEmail', { 'password': Password, 'newEmailAddress': AccountEmail, })
[docs] def update_account_password(self, Password, NewPassword): """ Sets a new account password. Request Syntax: .. code-block:: python response = client.update_account_password( Password=str, NewPassword=str, ) Args: Password (str): Current account password. NewPassword (str): New account password. Returns: dict: Response Syntax .. code-block:: python { 'Message': str, 'Title': str, } Raises: :py:class:`coto.clients.decoupled_account.ReauthException`: You have to reauthenticate, then try again. """ return self._action( 'updateAccountPassword', { 'oldpassword': Password, 'newpassword': NewPassword, 'newpassword1': NewPassword, })