def handle_error(self, error, url): '''Try to resolve the given error, which should be a response to the given URL, by discharging any macaroon contained in it. That is, if error.code is ERR_DISCHARGE_REQUIRED then it will try to discharge err.info.macaroon. If the discharge succeeds, the discharged macaroon will be saved to the client's cookie jar, otherwise an exception will be raised. ''' if error.info is None or error.info.macaroon is None: raise BakeryException('unable to read info in discharge error ' 'response') discharges = bakery.discharge_all( error.info.macaroon, self.acquire_discharge, self.key, ) macaroons = '[' + ','.join( map(utils.macaroon_to_json_string, discharges)) + ']' all_macaroons = base64.urlsafe_b64encode(utils.to_bytes(macaroons)) full_path = relative_url(url, error.info.macaroon_path) if error.info.cookie_name_suffix is not None: name = 'macaroon-' + error.info.cookie_name_suffix else: name = 'macaroon-auth' expires = checkers.macaroons_expiry_time(checkers.Namespace(), discharges) self.cookies.set_cookie( utils.cookie( name=name, value=all_macaroons.decode('ascii'), url=full_path, expires=expires, ))
def handle_error(self, error, url): '''Try to resolve the given error, which should be a response to the given URL, by discharging any macaroon contained in it. That is, if error.code is ERR_DISCHARGE_REQUIRED then it will try to discharge err.info.macaroon. If the discharge succeeds, the discharged macaroon will be saved to the client's cookie jar, otherwise an exception will be raised. ''' if error.info is None or error.info.macaroon is None: raise BakeryException('unable to read info in discharge error ' 'response') discharges = bakery.discharge_all( error.info.macaroon, self.acquire_discharge, self.key, ) macaroons = '[' + ','.join(map(utils.macaroon_to_json_string, discharges)) + ']' all_macaroons = base64.urlsafe_b64encode(utils.to_bytes(macaroons)) full_path = urljoin(url, error.info.macaroon_path) if error.info.cookie_name_suffix is not None: name = 'macaroon-' + error.info.cookie_name_suffix else: name = 'macaroon-auth' expires = checkers.macaroons_expiry_time(checkers.Namespace(), discharges) self.cookies.set_cookie(utils.cookie( name=name, value=all_macaroons.decode('ascii'), url=full_path, expires=expires, ))
def _login(self, macaroon: str) -> None: bakery_macaroon = bakery.Macaroon.from_dict(json.loads(macaroon)) discharges = bakery.discharge_all(bakery_macaroon, self.bakery_client.acquire_discharge) # serialize macaroons the bakery-way discharged_macaroons = ( "[" + ",".join(map(utils.macaroon_to_json_string, discharges)) + "]") self._auth = base64.urlsafe_b64encode( utils.to_bytes(discharged_macaroons)).decode("ascii") self._macaroon = macaroon
def encode_macaroon(m): macaroons = '[' + utils.macaroon_to_json_string(m) + ']' return base64.urlsafe_b64encode( utils.to_bytes(macaroons)).decode('ascii')
def encode_macaroon(m): macaroons = '[' + utils.macaroon_to_json_string(m) + ']' return base64.urlsafe_b64encode(utils.to_bytes(macaroons)).decode('ascii')