int svr_chk_owner_generic( struct batch_request *preq, char *owner, char *submit_host) { char *pu; char rmtuser[PBS_MAXUSER + 1]; /* map user@host to "local" name */ pu = site_map_user(preq->rq_user, preq->rq_host); if (pu == NULL) { /* FAILURE */ return(-1); } snprintf(rmtuser, sizeof(rmtuser), "%s", pu); pu = site_map_user(owner, submit_host); return(strcmp(rmtuser, pu)); }
int svr_chk_ownerResv(struct batch_request *preq, resc_resv *presv) { char owner[PBS_MAXUSER + 1]; char *host; char *pu; char rmtuser[PBS_MAXUSER + 1]; /* map user@host to "local" name */ pu = site_map_user(preq->rq_user, preq->rq_host); if (pu == NULL) return (-1); (void)strncpy(rmtuser, pu, PBS_MAXUSER); get_jobowner(presv->ri_wattr[(int)RESV_ATR_resv_owner].at_val.at_str, owner); host = get_hostPart(presv->ri_wattr[(int)RESV_ATR_resv_owner].at_val.at_str); pu = site_map_user(owner, host); return (strcmp(rmtuser, pu)); }
static char *geteusernam( job *pjob, pbs_attribute *pattr) /* pointer to User_List pbs_attribute */ { int rule3 = 0; char *hit = 0; int i; struct array_strings *parst; char *pn; char *ptr; char username[PBS_MAXUSER + 1]; char *ret_user; /* search the user-list pbs_attribute */ if ((pattr->at_flags & ATR_VFLAG_SET) && (parst = pattr->at_val.at_arst)) { for (i = 0;i < parst->as_usedptr;i++) { pn = parst->as_string[i]; ptr = strchr(pn, '@'); if (ptr != NULL) { /* has host specification */ if (!strncmp(server_host, ptr + 1, strlen(ptr + 1))) { hit = pn; /* option 1. */ break; } } else { /* wildcard host (null) */ hit = pn; /* option 2. */ } } } if (!hit) { /* default to the job owner ( 3.) */ hit = pjob->ji_wattr[JOB_ATR_job_owner].at_val.at_str; rule3 = 1; } /* copy user name into return buffer, strip off host name */ get_jobowner(hit, username); if (rule3) { ptr = site_map_user(username, get_variable(pjob, (char *)"PBS_O_HOST")); if (ptr != username) snprintf(username, sizeof(username), "%s", ptr); } ret_user = (char *)calloc(1, strlen(username) + 1); strcpy(ret_user,username); return(ret_user); } /* END geteusernam() */
int svr_chk_owner(struct batch_request *preq, job *pjob) { char owner[PBS_MAXUSER+1]; char *pu; char *ph; char rmtuser[PBS_MAXUSER+PBS_MAXHOSTNAME+2]; extern int ruserok(const char *rhost, int suser, const char *ruser, const char *luser); #ifdef WIN32 extern int user_read_password(char *user, char **cred, size_t *len); extern int read_cred(job *pjob, char **cred, size_t *len); extern int decrypt_pwd(char *crypted, size_t len, char **passwd); #endif /* Are the owner and requestor the same? */ snprintf(rmtuser, sizeof(rmtuser), "%s", pjob->ji_wattr[(int)JOB_ATR_job_owner].at_val.at_str); pu = rmtuser; ph = strchr(rmtuser, '@'); if (!ph) return -1; *ph++ = '\0'; if (strcmp(preq->rq_user, pu) == 0) { /* Avoid the lookup if they match. */ if (strcmp(preq->rq_host, ph) == 0) return 0; /* Perform the lookup. */ if (is_same_host(preq->rq_host, ph)) return 0; } /* map requestor user@host to "local" name */ pu = site_map_user(preq->rq_user, preq->rq_host); if (pu == NULL) return (-1); (void)strncpy(rmtuser, pu, PBS_MAXUSER); /* * Get job owner name without "@host" and then map to "local" name. */ get_jobowner(pjob->ji_wattr[(int)JOB_ATR_job_owner].at_val.at_str, owner); pu = site_map_user(owner, get_hostPart(pjob->ji_wattr[(int)JOB_ATR_job_owner].at_val.at_str)); if (server.sv_attr[(int)SRV_ATR_FlatUID].at_val.at_long) { /* with flatuid, all that must match is user names */ return (strcmp(rmtuser, pu)); } else { /* non-flatuid space, must validate rmtuser vs owner */ #ifdef WIN32 if ( (server.sv_attr[SRV_ATR_ssignon_enable].at_flags & \ ATR_VFLAG_SET) && \ (server.sv_attr[SRV_ATR_ssignon_enable].at_val.at_long \ == 1) ) { /* read/cache user password */ cache_usertoken_and_homedir(pu, NULL, 0, user_read_password, (char *)pu, pbs_decrypt_pwd, 0); } else { /* read/cache job password */ cache_usertoken_and_homedir(pu, NULL, 0, read_cred, (job *)pjob, pbs_decrypt_pwd, 0); } #endif return (ruserok(preq->rq_host, 0, rmtuser, pu)); } }