def secondFactorSucceeded(self, secondFactor, userKey): currSess = currentSession.get() logging.debug("Got SecondFactorSucceeded call from %s." % secondFactor) if str(currSess["_mayBeUserKey"]) != str(userKey): raise errors.Forbidden() # Assert that the second factor verification finished in time if datetime.datetime.now() - currSess["_secondFactorStart"] > self.secondFactorTimeWindow: raise errors.RequestTimeout() return self.authenticateUser(userKey)
def deferred(self, *args, **kwargs): """ This catches one deferred call and routes it to its destination """ global _deferedTasks, _appengineServiceIPs req = currentRequest.get().request if 'X-AppEngine-TaskName' not in req.headers: logging.critical( 'Detected an attempted XSRF attack. The header "X-AppEngine-Taskname" was not set.' ) raise errors.Forbidden() if req.environ.get( "HTTP_X_APPENGINE_USER_IP") not in _appengineServiceIPs: logging.critical( 'Detected an attempted XSRF attack. This request did not originate from Task Queue.' ) raise errors.Forbidden() # Check if the retry count exceeds our warning threshold retryCount = req.headers.get("X-Appengine-Taskretrycount", None) if retryCount: if int(retryCount) == self.retryCountWarningThreshold: utils.sendEMailToAdmins( "Deferred task retry count exceeded warning threshold", "Task %s will now be retried for the %sth time." % (req.headers.get("X-Appengine-Taskname", ""), retryCount)) cmd, data = json.loads(req.body, object_hook=jsonDecodeObjectHook) funcPath, args, kwargs, env = data if env: if "user" in env and env["user"]: currentSession.get()["user"] = env["user"] if "lang" in env and env["lang"]: currentRequest.get().language = env["lang"] if "transactionMarker" in env: marker = db.Get( db.Key("viur-transactionmarker", env["transactionMarker"])) if not marker: logging.info( "Dropping task, transaction %s did not apply" % env["transactionMarker"]) return else: logging.info("Executing task, transaction %s did succeed" % env["transactionMarker"]) if "custom" in env and conf["viur.tasks.customEnvironmentHandler"]: # Check if we need to restore additional environmental data assert isinstance(conf["viur.tasks.customEnvironmentHandler"], tuple) \ and len(conf["viur.tasks.customEnvironmentHandler"]) == 2 \ and callable(conf["viur.tasks.customEnvironmentHandler"][1]), \ "Your customEnvironmentHandler must be a tuple of two callable if set!" conf["viur.tasks.customEnvironmentHandler"][1](env["custom"]) if cmd == "rel": caller = conf["viur.mainApp"] pathlist = [x for x in funcPath.split("/") if x] for currpath in pathlist: if currpath not in dir(caller): logging.error( "ViUR missed a deferred task! Could not resolve the path %s. " "Failed segment was %s", funcPath, currpath) return caller = getattr(caller, currpath) try: caller(*args, **kwargs) except PermanentTaskFailure: pass except Exception as e: logging.exception(e) raise errors.RequestTimeout() # Task-API should retry elif cmd == "unb": if not funcPath in _deferedTasks: logging.error("ViUR missed a deferred task! %s(%s,%s)", funcPath, args, kwargs) try: _deferedTasks[funcPath](*args, **kwargs) except PermanentTaskFailure: pass except Exception as e: logging.exception(e) raise errors.RequestTimeout() # Task-API should retry