1
#include "modules_profiles.hpp"
4
#include <davixcontext.hpp>
5
#include <utils/davix_logger_internal.hpp>
6
#include <system_utils/env_utils.hpp>
12
std::string cert_path;
17
GridEnv createGridEnv(){
19
DAVIX_TRACE("Enable GRID profile for DAVIX");
22
env.ca_path = EnvUtils::getEnv("X509_CERT_DIR", "/etc/grid-security/certificates/");
23
DAVIX_TRACE("Add CA path %s to valid CA path list", env.ca_path.c_str());
25
std::string proxy = EnvUtils::getEnv("X509_USER_PROXY", std::string());
27
std::ostringstream ss;
28
ss << "/tmp/x509up_u" << geteuid();
30
if(access(proxy.c_str(), R_OK) !=0){
31
DAVIX_LOG(DAVIX_LOG_WARNING, "Unable to read proxy file %s", proxy.c_str());
36
DAVIX_TRACE("Define %s proxy certificate for use", proxy.c_str());
37
env.cert_path = env.key_path = proxy;
39
// No proxy, load simply creds
40
env.key_path = EnvUtils::getEnv("X509_USER_KEY", std::string());
41
env.cert_path = EnvUtils::getEnv("X509_USER_CERT", std::string());
42
DAVIX_TRACE("Define to use GRID key %s and GRID cert %s ", env.key_path.c_str(), env.cert_path.c_str());
48
void awesomeGridHook(RequestParams& p, HttpRequest & req, Uri & u, RequestPreRunHook previous_hook, GridEnv env_grid){
50
// initialize environment
52
if(env_grid.ca_path.size() >0){
53
p.addCertificateAuthorityPath(env_grid.ca_path);
55
// if no cert auth configured, configure one
56
if(env_grid.key_path.size() > 0){
58
DavixError* tmp_err=NULL;
59
if( x509.loadFromFilePEM(env_grid.key_path, env_grid.cert_path, "", &tmp_err) <0){
60
DAVIX_LOG(DAVIX_LOG_WARNING, "Impossible to load GRID certificate %s %s: %s",
61
env_grid.key_path.c_str(),
62
env_grid.cert_path.c_str(),
63
tmp_err->getErrMsg().c_str());
65
// in current state, GRID profiles ignore all manually defined callbacks
66
p.setClientCertCallbackX509(NULL, NULL);
67
p.setClientCertX509(x509);
72
previous_hook(p, req, u);
77
void loadGridProfile(Context & context){
78
GridEnv grid_env = createGridEnv();
80
RequestPreRunHook previous_hook = context.getHook<RequestPreRunHook>();
81
RequestPreRunHook new_hook = std::bind(awesomeGridHook, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, previous_hook, grid_env);
82
context.setHook<RequestPreRunHook>(new_hook);