static int set_session_cookie(request_rec *r, modauthopenid_config *s_cfg, opkele::params_t& params, std::string identity) { // now set auth cookie, if we're doing session based auth std::string session_id, hostname, path, cookie_value, redirect_location, args; if(s_cfg->cookie_path != NULL) path = std::string(s_cfg->cookie_path); else modauthopenid::base_dir(std::string(r->uri), path); modauthopenid::make_rstring(32, session_id); modauthopenid::make_cookie_value(cookie_value, std::string(s_cfg->cookie_name), session_id, path, s_cfg->cookie_lifespan); APDEBUG(r, "Setting cookie after authentication of user %s", identity.c_str()); apr_table_set(r->err_headers_out, "Set-Cookie", cookie_value.c_str()); hostname = std::string(r->hostname); // save session values modauthopenid::SessionManager sm(std::string(s_cfg->db_location)); sm.store_session(session_id, hostname, path, identity, s_cfg->cookie_lifespan); sm.close(); opkele::params_t ext_params; modauthopenid::get_extension_params(ext_params, params); modauthopenid::remove_openid_vars(params); modauthopenid::merge_params(ext_params, params); args = params.append_query("", "").substr(1); if(args.length() == 0) r->args = NULL; else apr_cpystrn(r->args, args.c_str(), 1024); full_uri(r, redirect_location, s_cfg); return modauthopenid::http_redirect(r, redirect_location); };
static int start_authentication_session(request_rec *r, modauthopenid_config *s_cfg, opkele::params_t& params, std::string& return_to, std::string& trust_root) { // remove all openid GET query params (openid.*) - we don't want that maintained through // the redirection process. We do, however, want to keep all aother GET params. // also, add a nonce for security std::string identity = params.get_param("openid_identifier"); // pull out the extension parameters before we get rid of openid.* opkele::params_t ext_params; modauthopenid::get_extension_params(ext_params, params); modauthopenid::remove_openid_vars(params); // add a nonce and reset what return_to is std::string nonce, re_direct; modauthopenid::make_rstring(10, nonce); modauthopenid::MoidConsumer consumer(std::string(s_cfg->db_location), nonce, return_to); params["modauthopenid.nonce"] = nonce; full_uri(r, return_to, s_cfg, true); return_to = params.append_query(return_to, ""); // get identity provider and redirect try { consumer.initiate(identity); opkele::openid_message_t cm; re_direct = consumer.checkid_(cm, opkele::mode_checkid_setup, return_to, trust_root).append_query(consumer.get_endpoint().uri); re_direct = ext_params.append_query(re_direct, ""); } catch (opkele::failed_xri_resolution &e) { consumer.close(); return show_input(r, s_cfg, modauthopenid::invalid_id); } catch (opkele::failed_discovery &e) { consumer.close(); return show_input(r, s_cfg, modauthopenid::invalid_id); } catch (opkele::bad_input &e) { consumer.close(); return show_input(r, s_cfg, modauthopenid::invalid_id); } catch (opkele::exception &e) { consumer.close(); APERR(r, "Error while fetching idP location: %s", e.what()); return show_input(r, s_cfg, modauthopenid::no_idp_found); } consumer.close(); if(!is_trusted_provider(s_cfg , re_direct, r) || is_distrusted_provider(s_cfg, re_direct, r)) return show_input(r, s_cfg, modauthopenid::idp_not_trusted); return modauthopenid::http_redirect(r, re_direct); };