static ap_unix_identity_t *domaintree_hook_get_suexec_identity(const request_rec *r) { ap_unix_identity_t *ugid = NULL; #if APR_HAS_USER const char *username; if ((username = apr_table_get(r->notes, "mod_domaintree.suexec"))) { if ((ugid = apr_palloc(r->pool, sizeof(*ugid)))) { if (APR_SUCCESS == apr_uid_get(&ugid->uid, &ugid->gid, username, r->pool)) { ugid->userdir = 1; } } } #endif return ugid; }
static void fail_userinfo(CuTest *tc) { apr_uid_t uid; apr_gid_t gid; apr_status_t rv; char *tmp; errno = 0; gid = uid = 9999999; tmp = NULL; rv = apr_uid_name_get(&tmp, uid, p); CuAssert(tc, "apr_uid_name_get should fail or " "return a user name", rv != APR_SUCCESS || tmp != NULL); errno = 0; tmp = NULL; rv = apr_gid_name_get(&tmp, gid, p); CuAssert(tc, "apr_gid_name_get should fail or " "return a group name", rv != APR_SUCCESS || tmp != NULL); gid = 424242; errno = 0; rv = apr_gid_get(&gid, "I_AM_NOT_A_GROUP", p); CuAssert(tc, "apr_gid_get should fail or " "set a group number", rv != APR_SUCCESS || gid == 424242); gid = uid = 424242; errno = 0; rv = apr_uid_get(&uid, &gid, "I_AM_NOT_A_USER", p); CuAssert(tc, "apr_gid_get should fail or " "set a user and group number", rv != APR_SUCCESS || uid == 424242 || gid == 4242442); errno = 0; tmp = NULL; rv = apr_uid_homepath_get(&tmp, "I_AM_NOT_A_USER", p); CuAssert(tc, "apr_uid_homepath_get should fail or " "set a path name", rv != APR_SUCCESS || tmp != NULL); }
static void username(CuTest *tc) { apr_uid_t uid; apr_gid_t gid; apr_uid_t retreived_uid; apr_gid_t retreived_gid; apr_status_t rv; char *uname = NULL; rv = apr_uid_current(&uid, &gid, p); CuAssertIntEquals(tc, APR_SUCCESS, rv); rv = apr_uid_name_get(&uname, uid, p); CuAssertIntEquals(tc, APR_SUCCESS, rv); CuAssertPtrNotNull(tc, uname); rv = apr_uid_get(&retreived_uid, &retreived_gid, uname, p); CuAssertIntEquals(tc, APR_SUCCESS, rv); CuAssertIntEquals(tc, APR_SUCCESS, apr_uid_compare(uid, retreived_uid)); #ifdef WIN32 /* ### this fudge was added for Win32 but makes the test return NotImpl * on Unix if run as root, when !gid is also true. */ if (!gid || !retreived_gid) { /* The function had no way to recover the gid (this would have been * an ENOTIMPL if apr_uid_ functions didn't try to double-up and * also return apr_gid_t values, which was bogus. */ if (!gid) { CuNotImpl(tc, "Groups from apr_uid_current"); } else { CuNotImpl(tc, "Groups from apr_uid_get"); } } else { #endif CuAssertIntEquals(tc, APR_SUCCESS, apr_gid_compare(gid, retreived_gid)); #ifdef WIN32 } #endif }
static ap_unix_identity_t *get_suexec_id_doer(const request_rec *r) { ap_unix_identity_t *ugid = NULL; #if APR_HAS_USER const char *username = apr_table_get(r->notes, "mod_userdir_user"); if (username == NULL) { return NULL; } if ((ugid = apr_palloc(r->pool, sizeof(*ugid))) == NULL) { return NULL; } if (apr_uid_get(&ugid->uid, &ugid->gid, username, r->pool) != APR_SUCCESS) { return NULL; } ugid->userdir = 1; #endif return ugid; }
/* translates username to userid */ MVMint64 MVM_proc_nametouid(MVMThreadContext *tc, MVMString *name) { apr_status_t rv; apr_uid_t userid; apr_gid_t groupid; char *namestring = MVM_string_utf8_encode_C_string(tc, name); apr_pool_t *tmp_pool; /* need a temporary pool */ if ((rv = apr_pool_create(&tmp_pool, POOL(tc))) != APR_SUCCESS) { free(namestring); MVM_exception_throw_apr_error(tc, rv, "Failed to get uid from user name: "); } if ((rv = apr_uid_get(&userid, &groupid, (const char *)namestring, tmp_pool)) != APR_SUCCESS) { apr_pool_destroy(tmp_pool); free(namestring); MVM_exception_throw_apr_error(tc, rv, "Failed to get uid from user name: "); } apr_pool_destroy(tmp_pool); free(namestring); return (MVMint64)userid; }
/* Query the ProfileImagePath from the version-specific branch, where the * regkey uses the user's name on 9x, and user's sid string on NT. */ APR_DECLARE(apr_status_t) apr_uid_homepath_get(char **dirname, const char *username, apr_pool_t *p) { #ifdef _WIN32_WCE *dirname = apr_pstrdup(p, "/My Documents"); return APR_SUCCESS; #else apr_status_t rv; char regkey[MAX_PATH * 2]; char *fixch; DWORD keylen; DWORD type; HKEY key; if (apr_os_level >= APR_WIN_NT) { apr_uid_t uid; apr_gid_t gid; if ((rv = apr_uid_get(&uid, &gid, username, p)) != APR_SUCCESS) return rv; strcpy(regkey, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\" "ProfileList\\"); keylen = (DWORD)strlen(regkey); get_sid_string(regkey + keylen, sizeof(regkey) - keylen, uid); } else { strcpy(regkey, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\" "ProfileList\\"); keylen = (DWORD)strlen(regkey); apr_cpystrn(regkey + keylen, username, sizeof(regkey) - keylen); } if ((rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE, regkey, 0, KEY_QUERY_VALUE, &key)) != ERROR_SUCCESS) return APR_FROM_OS_ERROR(rv); #if APR_HAS_UNICODE_FS IF_WIN_OS_IS_UNICODE { keylen = sizeof(regkey); rv = RegQueryValueExW(key, L"ProfileImagePath", NULL, &type, (void*)regkey, &keylen); RegCloseKey(key); if (rv != ERROR_SUCCESS) return APR_FROM_OS_ERROR(rv); if (type == REG_SZ) { char retdir[MAX_PATH]; if ((rv = unicode_to_utf8_path(retdir, sizeof(retdir), (apr_wchar_t*)regkey)) != APR_SUCCESS) return rv; *dirname = apr_pstrdup(p, retdir); } else if (type == REG_EXPAND_SZ) { apr_wchar_t path[MAX_PATH]; char retdir[MAX_PATH]; ExpandEnvironmentStringsW((apr_wchar_t*)regkey, path, sizeof(path) / 2); if ((rv = unicode_to_utf8_path(retdir, sizeof(retdir), path)) != APR_SUCCESS) return rv; *dirname = apr_pstrdup(p, retdir); } else return APR_ENOENT; } #endif #if APR_HAS_ANSI_FS ELSE_WIN_OS_IS_ANSI { keylen = sizeof(regkey); rv = RegQueryValueEx(key, "ProfileImagePath", NULL, &type, (void*)regkey, &keylen); RegCloseKey(key); if (rv != ERROR_SUCCESS) return APR_FROM_OS_ERROR(rv); if (type == REG_SZ) { *dirname = apr_pstrdup(p, regkey); } else if (type == REG_EXPAND_SZ) { char path[MAX_PATH]; ExpandEnvironmentStrings(regkey, path, sizeof(path)); *dirname = apr_pstrdup(p, path); } else return APR_ENOENT; } #endif /* APR_HAS_ANSI_FS */ for (fixch = *dirname; *fixch; ++fixch) if (*fixch == '\\') *fixch = '/'; return APR_SUCCESS; #endif /* _WIN32_WCE */ }
/* deprecated */ APR_DECLARE(apr_status_t) apr_get_userid(apr_uid_t *uid, apr_gid_t *gid, const char *username, apr_pool_t *p) { return apr_uid_get(uid, gid, username, p); }