async def login(self): params = {} params['auth-tag'] = self.usertag if self.password: params['credentials'] = self.password else: macaroons = _macaroons_for_domain(self.bakery_client.cookies, self.endpoint) params['macaroons'] = [[bakery.macaroon_to_dict(m) for m in ms] for ms in macaroons] try: return await self.rpc({ "type": "Admin", "request": "Login", "version": 3, "params": params, }) except errors.JujuAPIError as e: if e.error_code != 'redirection required': raise log.info('Controller requested redirect') # Fetch additional redirection information now so that # we can safely close the connection after login # fails. redirect_info = (await self.rpc({ "type": "Admin", "request": "RedirectInfo", "version": 3, }))['response'] raise errors.JujuRedirectException(redirect_info) from e
def test_macaroon_to_dict(self): m = pymacaroons.Macaroon( key=b'rootkey', identifier=b'some id', location='here', version=2) as_dict = bakery.macaroon_to_dict(m) data = json.dumps(as_dict) m1 = pymacaroons.Macaroon.deserialize(data, json_serializer.JsonSerializer()) self.assertEqual(m1.signature, m.signature) pymacaroons.Verifier().verify(m1, b'rootkey')
async def login(self): params = {} params['auth-tag'] = self.usertag if self.password: params['credentials'] = self.password else: macaroons = _macaroons_for_domain(self.bakery_client.cookies, self.endpoint) params['macaroons'] = [[bakery.macaroon_to_dict(m) for m in ms] for ms in macaroons] try: return await self.rpc({ "type": "Admin", "request": "Login", "version": 3, "params": params, }) except errors.JujuAPIError as e: if e.error_code != 'redirection required': raise log.info('Controller requested redirect') # Check if the redirect error provides a payload with embedded # redirection info (juju 2.6+ controller). In this case, return a # redirect exception which the library should not automatically # follow but rather bubble up to the user. This matches the # behaviour of juju cli whereas for JAAS-like redirects we will # need to make an extra RPC call to get the redirect info. if e.error_info is not None: raise errors.JujuRedirectException(e.error_info, False) from e # Fetch additional redirection information now so that # we can safely close the connection after login # fails. redirect_info = (await self.rpc({ "type": "Admin", "request": "RedirectInfo", "version": 3, }))['response'] raise errors.JujuRedirectException(redirect_info, True) from e