1/* Licensed to the Apache Software Foundation (ASF) under one or more 2 * contributor license agreements. See the NOTICE file distributed with 3 * this work for additional information regarding copyright ownership. 4 * The ASF licenses this file to You under the Apache License, Version 2.0 5 * (the "License"); you may not use this file except in compliance with 6 * the License. You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include "apr_strings.h" 18#include "apr_portable.h" 19#include "apr_user.h" 20#include "apr_private.h" 21#if APR_HAVE_SYS_TYPES_H 22#include <sys/types.h> 23#endif 24 25APR_DECLARE(apr_status_t) apr_gid_get(apr_gid_t *gid, 26 const char *groupname, apr_pool_t *p) 27{ 28#ifdef _WIN32_WCE 29 return APR_ENOTIMPL; 30#else 31 SID_NAME_USE sidtype; 32 char anydomain[256]; 33 char *domain; 34 DWORD sidlen = 0; 35 DWORD domlen = sizeof(anydomain); 36 DWORD rv; 37 char *pos; 38 39 if ((pos = strchr(groupname, '/'))) { 40 domain = apr_pstrndup(p, groupname, pos - groupname); 41 groupname = pos + 1; 42 } 43 else if ((pos = strchr(groupname, '\\'))) { 44 domain = apr_pstrndup(p, groupname, pos - groupname); 45 groupname = pos + 1; 46 } 47 else { 48 domain = NULL; 49 } 50 /* Get nothing on the first pass ... need to size the sid buffer 51 */ 52 rv = LookupAccountName(domain, groupname, domain, &sidlen, 53 anydomain, &domlen, &sidtype); 54 if (sidlen) { 55 /* Give it back on the second pass 56 */ 57 *gid = apr_palloc(p, sidlen); 58 domlen = sizeof(anydomain); 59 rv = LookupAccountName(domain, groupname, *gid, &sidlen, 60 anydomain, &domlen, &sidtype); 61 } 62 if (!sidlen || !rv) { 63 return apr_get_os_error(); 64 } 65 return APR_SUCCESS; 66#endif 67} 68 69APR_DECLARE(apr_status_t) apr_gid_name_get(char **groupname, apr_gid_t groupid, apr_pool_t *p) 70{ 71#ifdef _WIN32_WCE 72 *groupname = apr_pstrdup(p, "Administrators"); 73#else 74 SID_NAME_USE type; 75 char name[MAX_PATH], domain[MAX_PATH]; 76 DWORD cbname = sizeof(name), cbdomain = sizeof(domain); 77 if (!groupid) 78 return APR_EINVAL; 79 if (!LookupAccountSid(NULL, groupid, name, &cbname, domain, &cbdomain, &type)) 80 return apr_get_os_error(); 81 if (type != SidTypeGroup && type != SidTypeWellKnownGroup 82 && type != SidTypeAlias) 83 return APR_EINVAL; 84 *groupname = apr_pstrdup(p, name); 85#endif 86 return APR_SUCCESS; 87} 88 89APR_DECLARE(apr_status_t) apr_gid_compare(apr_gid_t left, apr_gid_t right) 90{ 91 if (!left || !right) 92 return APR_EINVAL; 93#ifndef _WIN32_WCE 94 if (!IsValidSid(left) || !IsValidSid(right)) 95 return APR_EINVAL; 96 if (!EqualSid(left, right)) 97 return APR_EMISMATCH; 98#endif 99 return APR_SUCCESS; 100} 101