def __init__(self, client, config, trace, interaction, check_factory=None, msg_factory=None, features=None, verbose=False, expect_exception=None, **extra_args): self.client = client self.client_config = config self.trace = trace self.test_output = [] self.features = features self.verbose = verbose self.check_factory = check_factory self.msg_factory = msg_factory self.expect_exception = expect_exception self.extra_args = extra_args self.cjar = { "browser": cookielib.MozillaCookieJar(), "rp": cookielib.MozillaCookieJar(), "service": cookielib.MozillaCookieJar() } self.protocol_response = [] self.last_response = None self.last_content = None self.response = None self.interaction = Interaction(self.client, interaction) self.exception = None self.provider_info = self.client.provider_info or {} self.interact_done = [] self.ignore_check = [] self.login_page = "" self.sequence = {} self.flow_index = 0 self.position = None self.request_args = {} self.args = {} self.creq = None self.cresp = None self.req = None self.request_spec = None self.last_url = "" self.state = rndstr()
def __init__(self, client, config, trace, interaction, check_factory=None, msg_factory=None, features=None, verbose=False, expect_exception=None): self.client = client self.client_config = config self.trace = trace self.test_output = [] self.features = features self.verbose = verbose self.check_factory = check_factory self.msg_factory = msg_factory self.expect_exception = expect_exception self.cjar = {"browser": cookielib.CookieJar(), "rp": cookielib.CookieJar(), "service": cookielib.CookieJar()} self.protocol_response = [] self.last_response = None self.last_content = None self.response = None self.interaction = Interaction(self.client, interaction) self.exception = None self.provider_info = self.client.provider_info or {} self.interact_done = []
def __init__(self, client, config, trace, interaction, check_factory=None, msg_factory=None, features=None, verbose=False, expect_exception=None, **extra_args): self.client = client self.client_config = config self.trace = trace self.test_output = [] self.features = features self.verbose = verbose self.check_factory = check_factory self.msg_factory = msg_factory self.expect_exception = expect_exception self.extra_args = extra_args self.cjar = {"browser": cookielib.MozillaCookieJar(), "rp": cookielib.MozillaCookieJar(), "service": cookielib.MozillaCookieJar()} self.protocol_response = [] self.last_response = None self.last_content = None self.response = None self.interaction = Interaction(self.client, interaction) self.exception = None self.provider_info = self.client.provider_info or {} self.interact_done = [] self.ignore_check = [] self.login_page = "" self.sequence = {} self.flow_index = 0 self.position = None self.request_args = {} self.args = {} self.creq = None self.cresp = None self.req = None self.request_spec = None self.last_url = "" self.state = rndstr()
class Conversation(object): """ :ivar response: The received HTTP messages :ivar protocol_response: List of the received protocol messages """ def __init__(self, client, config, trace, interaction, check_factory=None, msg_factory=None, features=None, verbose=False, expect_exception=None): self.client = client self.client_config = config self.trace = trace self.test_output = [] self.features = features self.verbose = verbose self.check_factory = check_factory self.msg_factory = msg_factory self.expect_exception = expect_exception self.cjar = {"browser": cookielib.CookieJar(), "rp": cookielib.CookieJar(), "service": cookielib.CookieJar()} self.protocol_response = [] self.last_response = None self.last_content = None self.response = None self.interaction = Interaction(self.client, interaction) self.exception = None def check_severity(self, stat): if stat["status"] >= 4: self.trace.error("WHERE: %s" % stat["id"]) self.trace.error("STATUS:%s" % STATUSCODE[stat["status"]]) try: self.trace.error("HTTP STATUS: %s" % stat["http_status"]) except KeyError: pass try: self.trace.error("INFO: %s" % stat["message"]) except KeyError: pass raise FatalError def do_check(self, test, **kwargs): if isinstance(test, basestring): chk = self.check_factory(test)(**kwargs) else: chk = test(**kwargs) stat = chk(self, self.test_output) self.check_severity(stat) def err_check(self, test, err=None, bryt=True): if err: self.exception = err chk = self.check_factory(test)() chk(self, self.test_output) if bryt: e = FatalError("%s" % err) e.trace = "".join(traceback.format_exception(*sys.exc_info())) raise e def test_sequence(self, sequence): for test in sequence: if isinstance(test, tuple): test, kwargs = test else: kwargs = {} self.do_check(test, **kwargs) if test == ExpectedError: return False return True def my_endpoints(self): pass def intermit(self): _response = self.last_response if _response.status_code >= 400: done = True else: done = False url = _response.url content = _response.text while not done: rdseq = [] while _response.status_code in [302, 301, 303]: url = _response.headers["location"] if url in rdseq: raise FatalError("Loop detected in redirects") else: rdseq.append(url) if len(rdseq) > 8: raise FatalError( "Too long sequence of redirects: %s" % rdseq) self.trace.reply("REDIRECT TO: %s" % url) # If back to me for_me = False for redirect_uri in self.my_endpoints(): if url.startswith(redirect_uri): # Back at the RP self.client.cookiejar = self.cjar["rp"] for_me = True if for_me: done = True break else: try: _response = self.client.send(url, "GET") except Exception, err: raise FatalError("%s" % err) content = _response.text self.trace.reply("CONTENT: %s" % content) self.position = url self.last_content = content self.response = _response if _response.status_code >= 400: done = True break if done or url is None: break _base = url.split("?")[0] try: _spec = self.interaction.pick_interaction(_base, content) except InteractionNeeded: self.position = url self.trace.error("Page Content: %s" % content) raise except KeyError: self.position = url self.trace.error("Page Content: %s" % content) self.err_check("interaction-needed") if len(_spec) > 2: self.trace.info(">> %s <<" % _spec["page-type"]) if _spec["page-type"] == "login": self.login_page = content _op = Action(_spec["control"]) try: _response = _op(self.client, self, self.trace, url, _response, content, self.features) if isinstance(_response, dict): self.last_response = _response self.last_content = _response return _response content = _response.text self.position = url self.last_content = content self.response = _response if _response.status_code >= 400: break except (FatalError, InteractionNeeded): raise except Exception, err: self.err_check("exception", err, False)
def __init__(self, client, config, trace, interaction, resource_owner, requester, msg_factory=None, check_factory=None, expect_exception=None, **extra_args): self.resource_owner = resource_owner self.requester = requester self._clients = client self._client_config = config self.client = None self.client_config = None self.trace = trace self.test_output = [] self.features = {} self.verbose = False self.check_factory = check_factory self.msg_factory = msg_factory self.expect_exception = expect_exception self.extra_args = extra_args self.cjar = { "browser": cookielib.CookieJar(), "rp": cookielib.CookieJar(), "service": cookielib.CookieJar() } self.protocol_response = [] self.last_response = None self.last_content = None self.response = None self.exception = None self.interact_done = [] self.ignore_check = [] self.interaction = {} self.provider_info = {} for role in ROLES: self.interaction[role] = Interaction(self._clients[role], interaction[role]) self.provider_info[role] = self._clients[role].provider_info self.role = "" self.req = None self.accept_exception = False self.request_spec = None self.login_page = None self.position = "" self.creq = self.cresp = None self.request_args = None self.args = None self.response_spec = None self.info = None self.response_type = None self.response_message = None self.cis = []
class Conversation(object): """ :param response: The received HTTP messages :param protocol_response: List of the received protocol messages """ def __init__(self, client, config, trace, interaction, check_factory=None, msg_factory=None, features=None, verbose=False, expect_exception=None, **extra_args): self.client = client self.client_config = config self.trace = trace self.test_output = [] self.features = features self.verbose = verbose self.check_factory = check_factory self.msg_factory = msg_factory self.expect_exception = expect_exception self.extra_args = extra_args self.cjar = { "browser": cookielib.MozillaCookieJar(), "rp": cookielib.MozillaCookieJar(), "service": cookielib.MozillaCookieJar() } self.protocol_response = [] self.last_response = None self.last_content = None self.response = None self.interaction = Interaction(self.client, interaction) self.exception = None self.provider_info = self.client.provider_info or {} self.interact_done = [] self.ignore_check = [] self.login_page = "" self.sequence = {} self.flow_index = 0 self.position = None self.request_args = {} self.args = {} self.creq = None self.cresp = None self.req = None self.request_spec = None self.last_url = "" self.state = rndstr() def check_severity(self, stat): if stat["status"] >= 4: self.trace.error("WHERE: %s" % stat["id"]) self.trace.error("STATUS:%s" % STATUSCODE[stat["status"]]) try: self.trace.error("HTTP STATUS: %s" % stat["http_status"]) except KeyError: pass try: self.trace.error("INFO: %s" % (stat["message"], )) except KeyError: pass if not stat["mti"]: raise Break(stat["message"]) else: raise FatalError(stat["message"]) def do_check(self, test, **kwargs): if isinstance(test, basestring): chk = self.check_factory(test)(**kwargs) else: chk = test(**kwargs) if chk.__class__.__name__ not in self.ignore_check: stat = chk(self, self.test_output) self.check_severity(stat) def err_check(self, test, err=None, bryt=True): if err: self.exception = err chk = self.check_factory(test)() chk(self, self.test_output) if bryt: e = FatalError("%s" % err) e.trace = "".join(traceback.format_exception(*sys.exc_info())) raise e def test_sequence(self, sequence): if isinstance(sequence, dict): for test, kwargs in sequence.items(): self.do_check(test, **kwargs) else: for test in sequence: if isinstance(test, tuple): test, kwargs = test else: kwargs = {} self.do_check(test, **kwargs) if test == ExpectedError: return False return True def my_endpoints(self): return [] def for_me(self, response="", url=""): if not response: response = self.last_response if not url: url = response.headers["location"] for redirect_uri in self.my_endpoints(): if url.startswith(redirect_uri): return True return False def intermit(self): _response = self.last_response if _response.status_code >= 400: done = True else: done = False rdseq = [] while not done: url = _response.url content = _response.text while _response.status_code in [302, 301, 303]: url = _response.headers["location"] if url in rdseq: raise FatalError("Loop detected in redirects") else: rdseq.append(url) if len(rdseq) > 8: raise FatalError("Too long sequence of redirects: %s" % rdseq) self.trace.reply("REDIRECT TO: %s" % url) # If back to me if self.for_me(_response): self.client.cookiejar = self.cjar["rp"] done = True break else: try: _response = self.client.send( url, "GET", headers={"Referer": self.last_url}) except Exception, err: raise FatalError("%s" % err) content = _response.text self.trace.reply("CONTENT: %s" % content) self.position = url self.last_url = url self.last_content = content self.response = _response if _response.status_code >= 400: done = True break if done or url is None: break _base = url.split("?")[0] try: _spec = self.interaction.pick_interaction(_base, content) #if _spec in self.interact_done: # self.trace.error("Same interaction a second time") # raise InteractionNeeded("Same interaction twice") #self.interact_done.append(_spec) except InteractionNeeded: if self.extra_args["break"]: self.dump_state(self.extra_args["break"]) exit(2) self.position = url self.trace.error("Page Content: %s" % content) raise except KeyError: self.position = url self.trace.error("Page Content: %s" % content) self.err_check("interaction-needed") if len(_spec) > 2: self.trace.info(">> %s <<" % _spec["page-type"]) if _spec["page-type"] == "login": self.login_page = content _op = Action(_spec["control"]) try: _response = _op(self.client, self, self.trace, url, _response, content, self.features) if isinstance(_response, dict): self.last_response = _response self.last_content = _response return _response content = _response.text self.position = url self.last_content = content self.response = _response if _response.status_code >= 400: break except (FatalError, InteractionNeeded): raise except Exception, err: self.err_check("exception", err, False) self.test_output.append({ "status": 3, "id": "Communication error", "message": "%s" % err }) raise FatalError
class Conversation(object): """ :param response: The received HTTP messages :param protocol_response: List of the received protocol messages """ def __init__(self, client, config, trace, interaction, check_factory=None, msg_factory=None, features=None, verbose=False, expect_exception=None, **extra_args): self.client = client self.client_config = config self.trace = trace self.test_output = [] self.features = features self.verbose = verbose self.check_factory = check_factory self.msg_factory = msg_factory self.expect_exception = expect_exception self.extra_args = extra_args self.cjar = {"browser": cookielib.MozillaCookieJar(), "rp": cookielib.MozillaCookieJar(), "service": cookielib.MozillaCookieJar()} self.protocol_response = [] self.last_response = None self.last_content = None self.response = None self.interaction = Interaction(self.client, interaction) self.exception = None self.provider_info = self.client.provider_info or {} self.interact_done = [] self.ignore_check = [] self.login_page = "" self.sequence = {} self.flow_index = 0 self.position = None self.request_args = {} self.args = {} self.creq = None self.cresp = None self.req = None self.request_spec = None self.last_url = "" self.state = rndstr() def check_severity(self, stat): if stat["status"] >= 4: self.trace.error("WHERE: %s" % stat["id"]) self.trace.error("STATUS:%s" % STATUSCODE[stat["status"]]) try: self.trace.error("HTTP STATUS: %s" % stat["http_status"]) except KeyError: pass try: self.trace.error("INFO: %s" % (stat["message"],)) except KeyError: pass if not stat["mti"]: raise Break(stat["message"]) else: raise FatalError(stat["message"]) def do_check(self, test, **kwargs): if isinstance(test, basestring): chk = self.check_factory(test)(**kwargs) else: chk = test(**kwargs) if chk.__class__.__name__ not in self.ignore_check: stat = chk(self, self.test_output) self.check_severity(stat) def err_check(self, test, err=None, bryt=True): if err: self.exception = err chk = self.check_factory(test)() chk(self, self.test_output) if bryt: e = FatalError("%s" % err) e.trace = "".join(traceback.format_exception(*sys.exc_info())) raise e def test_sequence(self, sequence): if isinstance(sequence, dict): for test, kwargs in sequence.items(): self.do_check(test, **kwargs) else: for test in sequence: if isinstance(test, tuple): test, kwargs = test else: kwargs = {} self.do_check(test, **kwargs) if test == ExpectedError: return False return True def my_endpoints(self): return [] def for_me(self, response="", url=""): if not response: response = self.last_response if not url: url = response.headers["location"] for redirect_uri in self.my_endpoints(): if url.startswith(redirect_uri): return True return False def intermit(self): _response = self.last_response if _response.status_code >= 400: done = True else: done = False rdseq = [] while not done: url = _response.url content = _response.text while _response.status_code in [302, 301, 303]: url = _response.headers["location"] if url in rdseq: raise FatalError("Loop detected in redirects") else: rdseq.append(url) if len(rdseq) > 8: raise FatalError( "Too long sequence of redirects: %s" % rdseq) self.trace.reply("REDIRECT TO: %s" % url) # If back to me if self.for_me(_response): self.client.cookiejar = self.cjar["rp"] done = True break else: try: _response = self.client.send( url, "GET", headers={"Referer": self.last_url}) except Exception, err: raise FatalError("%s" % err) content = _response.text self.trace.reply("CONTENT: %s" % content) self.position = url self.last_url = url self.last_content = content self.response = _response if _response.status_code >= 400: done = True break if done or url is None: break _base = url.split("?")[0] try: _spec = self.interaction.pick_interaction(_base, content) #if _spec in self.interact_done: # self.trace.error("Same interaction a second time") # raise InteractionNeeded("Same interaction twice") #self.interact_done.append(_spec) except InteractionNeeded: if self.extra_args["break"]: self.dump_state(self.extra_args["break"]) exit(2) self.position = url self.trace.error("Page Content: %s" % content) raise except KeyError: self.position = url self.trace.error("Page Content: %s" % content) self.err_check("interaction-needed") if len(_spec) > 2: self.trace.info(">> %s <<" % _spec["page-type"]) if _spec["page-type"] == "login": self.login_page = content _op = Action(_spec["control"]) try: _response = _op(self.client, self, self.trace, url, _response, content, self.features) if isinstance(_response, dict): self.last_response = _response self.last_content = _response return _response content = _response.text self.position = url self.last_content = content self.response = _response if _response.status_code >= 400: break except (FatalError, InteractionNeeded): raise except Exception, err: self.err_check("exception", err, False) self.test_output.append( {"status": 3, "id": "Communication error", "message": "%s" % err}) raise FatalError