async def handle_required_auth(request):
    res = list()
    try:
        req = common_interfaces.AuthRequired_validate(
            json.loads(request.rel_url.query['authRequired']))
        availableRefs = set()
        for authRef in req['refs']:
            if common_app_server.is_valid_authRef(authRef):
                availableRefs.add(authRef['authId'])
        actionId = req['actionId']
        logger.debug("handle_required_auth for actionId '{}'".format(actionId))
        if actionId == "login":
            res.extend(
                getRequiredAuthForConfig(
                    availableRefs, getGitRepoConfig(), "RepoUrl",
                    "Please enter your {CredentialType} authentication data in order to clone the GIT Reposiory!"
                ))
        elif actionId == "bundleSync":
            cwd = None
            try:
                unused_session, cwd = validateSession(request)
            except Exception as e:
                return web.Response(text="Invalid Session: {}".format(e),
                                    status=401)
            res.extend(
                getRequiredAuthForConfig(
                    availableRefs, getTracConfig(cwd=cwd), "TracUrl",
                    "Please enter your {CredentialType} authentication data to sync with Trac!"
                ))
        elif actionId == "gitPullRebase":
            cwd = None
            try:
                unused_session, cwd = validateSession(request)
            except Exception as e:
                return web.Response(text="Invalid Session: {}".format(e),
                                    status=401)
            res.extend(
                getRequiredAuthForConfig(
                    availableRefs, getGitRepoConfig(cwd=cwd), "RepoUrl",
                    "Please enter your {CredentialType} authentication data to pull changes from the Git-Server!"
                ))
        elif actionId == "publishChanges":
            try:
                unused_session, cwd = validateSession(request)
            except Exception as e:
                return web.Response(text="Invalid Session: {}".format(e),
                                    status=401)
            res.extend(
                getRequiredAuthForConfig(
                    availableRefs, getGitRepoConfig(cwd=cwd), "RepoUrl",
                    "Please enter your {CredentialType} authentication data to publish changes to GIT!"
                ))
        return web.json_response(res)
    except Exception as e:
        return web.Response(text="Illegal Arguments Provided: {}".format(e),
                            status=400)
async def handle_git_pull_rebase(request):
    cwd = None
    try:
        unused_session, cwd = validateSession(request)
    except Exception as e:
        return web.Response(text="Invalid Session: {}".format(e), status=401)

    logger.info("Updating git-repository from the git-server")

    repoUrl, credType, useAuthentication = None, None, None
    try:
        config = getGitRepoConfig(required=True, cwd=cwd)
        repoUrl = config["RepoUrl"]
        credType = config.get("CredentialType", "").upper()
        useAuthentication = len(credType) > 0
    except Exception as e:
        return web.Response(text="Invalid Configuration: {}".format(e),
                            status=500)

    user, password, ssId = "", "", None
    try:
        if useAuthentication:
            (user, password,
             ssId) = common_app_server.get_credentials(request, credType)
    except Exception as e:
        return web.Response(text="Illegal Arguments Provided: {}".format(e),
                            status=400)
    res, auth_ok = await asyncio.wrap_future(
        ppe.submit(git_pull_rebase, repoUrl, useAuthentication, user, password,
                   cwd))
    if not auth_ok:
        common_app_server.invalidate_credentials(ssId)
    return web.json_response(res)
async def handle_login(request):
    logger.info("Handling 'login'")

    config, repoUrl, branch, credType, useAuthentication = None, None, None, None, None
    try:
        config = getGitRepoConfig(required=True)
        repoUrl = config["RepoUrl"]
        branch = config.get("Branch") or "master"
        credType = config.get("CredentialType", "").upper()
        useAuthentication = len(credType) > 0
    except Exception as e:
        return web.Response(text="Invalid Configuration: {}".format(e),
                            status=500)

    user, password, ssId = "", "", None
    try:
        if useAuthentication:
            (user, password,
             ssId) = common_app_server.get_credentials(request, credType)
    except Exception as e:
        return web.Response(text="Illegal Arguments Provided: {}".format(e),
                            status=400)

    res = []
    session = None
    with common_app_server.logging_redirect_for_webapp() as logs:
        try:
            tmpDir = tempfile.mkdtemp()
            logger.debug("Cloning '{}' to '{}'".format(repoUrl, tmpDir))
            await asyncio.wrap_future(
                ppe.submit(git_clone_repository, repoUrl, branch, tmpDir,
                           useAuthentication, user, password))
            logger.info(
                "Successfully cloned {} to a (temporary) local working directory, branch '{}'."
                .format(repoUrl, branch))
            session = createSession(tmpDir)
            session["RepoUrl"] = repoUrl
            session["Branch"] = branch
        except (Exception, GitCommandError) as e:
            logger.error(str(e))
            common_app_server.invalidate_credentials(ssId)
        res = logs.toBackendLogEntryList()
    response = web.json_response(res)
    emitOrCleanSessionCookie(response, session)
    return response