const failable authorize()

in modules/oauth/mod-oauth2.cpp [182:225]


const failable<int> authorize(const list<value>& args, request_rec* const r, const list<value>& appkeys) {
    // Extract authorize, access_token, client ID and info URIs
    const list<value> ref = assoc<value>("openauth_referrer", args);
    if (isNull(ref) || isNull(cdr(ref)))
        return mkfailure<int>("Missing openauth_referrer parameter");
    const list<value> auth = assoc<value>("oauth2_authorize", args);
    if (isNull(auth) || isNull(cdr(auth)))
        return mkfailure<int>("Missing oauth2_authorize parameter");
    const list<value> tok = assoc<value>("oauth2_access_token", args);
    if (isNull(tok) || isNull(cdr(tok)))
        return mkfailure<int>("Missing oauth2_access_token parameter");
    const list<value> cid = assoc<value>("oauth2_client_id", args);
    if (isNull(cid) || isNull(cdr(cid)))
        return mkfailure<int>("Missing oauth2_client_id parameter");
    const list<value> info = assoc<value>("oauth2_info", args);
    if (isNull(info) || isNull(cdr(info)))
        return mkfailure<int>("Missing oauth2_info parameter");
    const list<value> scope = assoc<value>("oauth2_scope", args);
    if (isNull(scope) || isNull(cdr(scope)))
        return mkfailure<int>("Missing oauth2_scope parameter");
    const list<value> display = assoc<value>("oauth2_display", args);

    // Build the redirect URI
    const string redir = httpd::url("/oauth2/access_token/", r);
    debug(redir, "modoauth2::authorize::redir");

    // Build the state URI
    const list<value> stargs = mklist<value>(tok, cid, info, ref);
    const string state = http::queryString(stargs);
    debug(state, "modoauth2::authorize::state");

    // Lookup client app configuration
    const list<value> app = assoc<value>(cadr(cid), appkeys);
    if (isNull(app) || isNull(cdr(app)))
        return mkfailure<int>(string("client id not found: ") + (string)cadr(cid));
    list<value> appkey = cadr(app);

    // Redirect to the authorize URI
    const list<value> adisplay = (isNull(display) || isNull(cdr(display)))? nilListValue : mklist<value>("display", cadr(display));
    const list<value> aargs = mklist<value>(mklist<value>("response_type", "code"), mklist<value>("client_id", car(appkey)), mklist<value>("scope", cadr(scope)), adisplay, mklist<value>("redirect_uri", httpd::escape(redir)), mklist<value>("state", httpd::escape(state)));
    const string uri = httpd::unescape(cadr(auth)) + string("?") + http::queryString(aargs);
    debug(uri, "modoauth2::authorize::uri");
    return httpd::externalRedirect(uri, r);
}