[ -z "$creds" ] &&
echo $0: WARNING: No credentials specified. Using default lookup which is dangerous. >&2
+ # workaround for VOMS_FindByVO that seems to always require user's own VOMS config file (bug #7511)
+ user_voms_config=$HOME/.glite/vomses
+ if [ ! -f "$user_voms_config" ]; then
+ rm -f /tmp/renewal_vomses
+ su - $GLITE_USER -c "touch /tmp/renewal_vomses && chmod 644 /tmp/renewal_vomses"
+ user_voms_config=/tmp/renewal_vomses
+ fi
+
echo -n Starting ProxyRenewal Daemon: glite-proxy-renewd ...
if [ ! -d "$PROXY_REPOSITORY" ]; then
chmod 0700 $PROXY_REPOSITORY
fi
- su - $GLITE_USER -c "$GLITE_LOCATION/bin/glite-proxy-renewd \
- -r $PROXY_REPOSITORY $creds" && echo " done"
+ su - $GLITE_USER -c "VOMS_USERCONF=$user_voms_config \
+ $GLITE_LOCATION/bin/glite-proxy-renewd \
+ -r $PROXY_REPOSITORY $creds -A" && echo " done"
}
stop()
{
echo -n "Stopping ProxyRenewal Daemon: glite-proxy-renewd ..."
- PIDS=`ps -C glite-proxy-renewd -o pid --no-heading`
- if [ -z "$PIDS" ]; then
- echo " no process glite-proxy-renewd running"
- exit 1
- else
- kill $PIDS && echo " done"
- fi
+ killall glite-proxy-renewd
+ echo " done"
}
status()
{
- PIDS=`ps -C glite-proxy-renewd -o pid --no-heading`
- if ps p $PIDS >/dev/null 2>&1; then
- echo glite-proxy-renewd running \($PIDS\)
- return 0
+ if netstat -an --unix | grep "^unix .* LISTEN.* /tmp/dgpr_renew_" >/dev/null 2>&1 ;then
+ echo glite-proxy-renewd running
+ else
+ echo glite-proxy-renewd not running
+ return 1
fi
-
- echo glite-proxy-renewd not running
- return 1
}
case x$1 in
edg_wlpr_Log(LOG_DEBUG, "Trying to renew proxy in %s.%d",
basename, record->suffix);
- snprintf(tmp_proxy, sizeof(tmp_proxy), "%s.%d.renew.XXXXXX",
+ snprintf(tmp_proxy, sizeof(tmp_proxy), "%s.%d.myproxy.XXXXXX",
basename, record->suffix);
tmp_fd = mkstemp(tmp_proxy);
if (tmp_fd == -1) {
} else
socket_attrs->psport = MYPROXY_SERVER_PORT;
+ verror_clear();
ret = myproxy_get_delegation(socket_attrs, client_request,
server_response, tmp_proxy);
if (ret == 1) {
ret = EDG_WLPR_ERROR_MYPROXY;
- edg_wlpr_Log(LOG_ERR, "Error contacting MyProxy server for proxy %s",
- repository_file);
+ edg_wlpr_Log(LOG_ERR, "Error contacting MyProxy server for proxy %s: %s",
+ repository_file, verror_get_string());
+ verror_clear();
goto end;
}
renewed_proxy = tmp_proxy;
- if (voms_enabled) {
+ if (voms_enabled && record->voms_exts) {
char tmp_voms_proxy[FILENAME_MAX];
int tmp_voms_fd;
- snprintf(tmp_voms_proxy, sizeof(tmp_voms_proxy), "%s.%d.renew.XXXXXX",
+ snprintf(tmp_voms_proxy, sizeof(tmp_voms_proxy), "%s.%d.voms.XXXXXX",
basename, record->suffix);
tmp_voms_fd = mkstemp(tmp_voms_proxy);
if (tmp_voms_fd == -1) {
goto end;
}
- ret = renew_voms_certs(repository_file, tmp_voms_proxy);
- if (ret)
+ ret = renew_voms_creds(repository_file, renewed_proxy, tmp_voms_proxy);
+ close(tmp_voms_fd);
+ if (ret) {
+ unlink(tmp_voms_proxy);
goto end;
+ }
renewed_proxy = tmp_voms_proxy;
+ unlink(tmp_proxy);
}
if (new_proxy)
char * Decode(const char *, int, int *);
char **listadd(char **, char *, int);
+extern char *vomsconf;
+
static int
generate_proxy(globus_gsi_cred_handle_t cur_proxy,
X509_EXTENSION *voms_extension, const char *new_file)
result = globus_gsi_proxy_handle_init(&proxy_handle, NULL);
if (result) {
- fprintf(stderr, "globus_gsi_proxy_handle_init() failed\n");
+ edg_wlpr_Log(LOG_ERR, "globus_gsi_proxy_handle_init() failed\n");
goto end;
}
result = globus_gsi_cred_get_key(cur_proxy, &cur_proxy_priv_key);
if (result) {
- fprintf(stderr, "globus_gsi_cred_get_key() failed\n");
+ edg_wlpr_Log(LOG_ERR, "globus_gsi_cred_get_key() failed\n");
goto end;
}
/* Create and sign a new proxy */
result = globus_gsi_cred_get_cert_type(cur_proxy, &proxy_type);
if (result) {
- fprintf(stderr, "globus_gsi_cred_get_cert_type() failed\n");
+ edg_wlpr_Log(LOG_ERR, "globus_gsi_cred_get_cert_type() failed\n");
goto end;
}
result = globus_gsi_proxy_handle_set_type(proxy_handle, proxy_type);
if (result) {
- fprintf(stderr, "globus_gsi_proxy_handle_set_type() failed\n");
+ edg_wlpr_Log(LOG_ERR, "globus_gsi_proxy_handle_set_type() failed\n");
goto end;
}
result = globus_gsi_proxy_create_signed(proxy_handle, cur_proxy, &proxy);
if (result) {
- fprintf(stderr, "globus_gsi_proxy_handle_init() failed\n");
+ edg_wlpr_Log(LOG_ERR, "globus_gsi_proxy_handle_init() failed\n");
goto end;
}
/* Get the new proxy */
result = globus_gsi_cred_get_cert(proxy, &new_cert);
if (result) {
- fprintf(stderr, "globus_gsi_cred_get_cert() failed\n");
+ edg_wlpr_Log(LOG_ERR, "globus_gsi_cred_get_cert() failed\n");
goto end;
}
/* And put the cert back, older one is unallocated by the function */
result = globus_gsi_cred_set_cert(proxy, voms_cert);
if (result) {
- fprintf(stderr, "globus_gsi_cred_set_cert() failed\n");
+ edg_wlpr_Log(LOG_ERR, "globus_gsi_cred_set_cert() failed\n");
goto end;
}
p = pp = buf;
ac = d2i_AC(NULL, &p, buf_len+1);
if (ac == NULL) {
- fprintf(stderr, "d2i_AC() failed\n");
+ edg_wlpr_Log(LOG_ERR, "d2i_AC() failed\n");
return 1;
}
for (i = 2; i < argc; i++) {
ret = VOMS_Ordering(argv[i], vd, &voms_error);
if (ret == 0) {
- fprintf(stderr, "VOMS_Ordering() failed\n");
+ edg_wlpr_Log(LOG_ERR, "VOMS_Ordering() failed\n");
return 1;
}
}
#endif
if (voms_cert == NULL || *voms_cert == NULL || (*voms_cert)->std == NULL) {
- fprintf(stderr, "Invalid VOMS certificate\n");
+ edg_wlpr_Log(LOG_ERR, "Invalid VOMS certificate\n");
return 1;
}
struct contactdata **voms_contacts = NULL;
char *command = NULL;
- voms_contacts = VOMS_FindByVO(vd, (*voms_cert)->voname, NULL, NULL, &voms_error);
+ voms_contacts = VOMS_FindByVO(vd, (*voms_cert)->voname, vomsconf, NULL, &voms_error);
if (voms_contacts == NULL) {
- fprintf(stderr, "VOMS_FindByVO() failed\n");
+ edg_wlpr_Log(LOG_ERR, "VOMS_FindByVO() failed\n");
return 1;
}
(void**) buf, buf_len, &voms_version,
vd, &voms_error);
if (ret == 0) {
- fprintf(stderr, "VOMS_Contact() failed\n");
+ edg_wlpr_Log(LOG_ERR, "VOMS_Contact() failed\n");
return 1;
}
return 0;
}
-int
-renew_voms_certs(const char *cur_file, const char *new_file)
+static int
+renew_voms_certs(const char *cur_file, const char *renewed_file, const char *new_file)
{
globus_gsi_cred_handle_t cur_proxy = NULL;
+ globus_gsi_cred_handle_t new_proxy = NULL;
struct vomsdata *vd = NULL;
struct voms **voms_cert = NULL;
int voms_err, ret;
X509 *cert = NULL;
STACK_OF(X509) *chain = NULL;
char *buf = NULL;
- size_t buf_len;
+ size_t buf_len = 0;
X509_EXTENSION *extension = NULL;
char *old_env_proxy = getenv("X509_USER_PROXY");
+ char *old_env_cert = getenv("X509_USER_CERT");
+ char *old_env_key = getenv("X509_USER_KEY");
setenv("X509_USER_PROXY", cur_file, 1);
+ setenv("X509_USER_CERT", renewed_file, 1);
+ setenv("X509_USER_KEY", renewed_file, 1);
ret = load_proxy(cur_file, &cert, NULL, &chain, &cur_proxy);
if (ret)
vd = VOMS_Init(NULL, NULL);
if (vd == NULL) {
- fprintf(stderr, "VOMS_Init() failed\n");
+ edg_wlpr_Log(LOG_ERR, "VOMS_Init() failed\n");
return 1;
}
if (ret == 0) {
if (voms_err == VERR_NOEXT) {
/* no VOMS cred, no problem; continue */
- fprintf(stderr, "No VOMS attributes found in proxy %s\n", cur_file);
+ /* XXX this part shouldn't be reachable, this call is only called
+ * if the proxy does contain VOMS attributes */
+ edg_wlpr_Log(LOG_ERR, "No VOMS attributes found in proxy %s\n", cur_file);
ret = 0;
goto end;
} else {
- fprintf(stderr, "Cannot get VOMS certificate(s) from proxy");
+ edg_wlpr_Log(LOG_ERR, "Cannot get VOMS certificate(s) from proxy");
ret = 1;
goto end;
}
if (ret)
goto end;
- ret = generate_proxy(cur_proxy, extension, new_file);
+ ret = load_proxy(renewed_file, NULL, NULL, NULL, &new_proxy);
+ if (ret)
+ goto end;
+
+ ret = generate_proxy(new_proxy, extension, new_file);
end:
-#if 0
- if (ret)
- unlink(new_file);
-#endif
(old_env_proxy) ? setenv("X509_USER_PROXY", old_env_proxy, 1) :
unsetenv("X509_USER_PROXY");
-
- VOMS_Destroy(vd);
+ (old_env_cert) ? setenv("X509_USER_CERT", old_env_cert, 1) :
+ unsetenv("X509_USER_CERT");
+ (old_env_key) ? setenv("X509_USER_KEY", old_env_key, 1) :
+ unsetenv("X509_USER_KEY");
+
+ if (cert)
+ X509_free(cert);
+ if (chain)
+ sk_X509_pop_free(chain, X509_free);
+ if (vd)
+ VOMS_Destroy(vd);
+ if (cur_proxy)
+ globus_gsi_cred_handle_destroy(cur_proxy);
+ if (new_proxy)
+ globus_gsi_cred_handle_destroy(new_proxy);
+ if (buf)
+ free(buf);
return ret;
}
+int
+renew_voms_creds(const char *cur_file, const char *renewed_file, const char *new_file)
+{
+ return renew_voms_certs(cur_file, renewed_file, new_file);
+}
+
#if 0
int
main(int argc, char *argv[])
if (globus_module_activate(GLOBUS_GSI_PROXY_MODULE) != GLOBUS_SUCCESS ||
globus_module_activate(GLOBUS_GSI_CERT_UTILS_MODULE) != GLOBUS_SUCCESS) {
- fprintf(stderr, "[%d]: Unable to initialize Globus modules\n", getpid());
+ edg_wlpr_Log(LOG_ERR, "[%d]: Unable to initialize Globus modules\n", getpid());
return 1;
}