#include "config.h"
#ifdef _SQUID_CYGWIN_
#include <wchar.h>
-int _wcsicmp(const wchar_t*, const wchar_t*);
+int _wcsicmp(const wchar_t *, const wchar_t *);
#endif
#if HAVE_STDIO_H
#include <stdio.h>
char debug_enabled = 0;
char *myname;
pid_t mypid;
-char * machinedomain;
+char *machinedomain;
int use_case_insensitive_compare = 0;
-char * DefaultDomain = NULL;
+char *DefaultDomain = NULL;
const char NTV_VALID_DOMAIN_SEPARATOR[] = "\\/";
#include "win32_check_group.h"
-char * AllocStrFromLSAStr(LSA_UNICODE_STRING LsaStr)
+char *
+AllocStrFromLSAStr(LSA_UNICODE_STRING LsaStr)
{
size_t len;
- static char * target;
+ static char *target;
- len = LsaStr.Length/sizeof(WCHAR) + 1;
+ len = LsaStr.Length / sizeof(WCHAR) + 1;
/* allocate buffer for str + null termination */
safe_free(target);
- target = (char *)xmalloc(len);
+ target = (char *) xmalloc(len);
if (target == NULL)
return NULL;
/* copy unicode buffer */
- WideCharToMultiByte(CP_ACP, 0, LsaStr.Buffer, LsaStr.Length, target, len, NULL, NULL );
+ WideCharToMultiByte(CP_ACP, 0, LsaStr.Buffer, LsaStr.Length, target, len, NULL, NULL);
/* add null termination */
- target[len-1] = '\0';
+ target[len - 1] = '\0';
return target;
}
-char * GetDomainName(void)
-
+char *
+GetDomainName(void)
{
LSA_HANDLE PolicyHandle;
LSA_OBJECT_ATTRIBUTES ObjectAttributes;
PPOLICY_PRIMARY_DOMAIN_INFO ppdiDomainInfo;
PWKSTA_INFO_100 pwkiWorkstationInfo;
DWORD netret;
- char * DomainName = NULL;
+ char *DomainName = NULL;
/*
* Always initialize the object attributes to all zeroes.
- */
+ */
memset(&ObjectAttributes, '\0', sizeof(ObjectAttributes));
/*
*
* The wki100_computername field contains a pointer to a UNICODE
* string containing the local computer name.
- */
- netret = NetWkstaGetInfo(NULL, 100, (LPBYTE *)&pwkiWorkstationInfo);
+ */
+ netret = NetWkstaGetInfo(NULL, 100, (LPBYTE *) & pwkiWorkstationInfo);
if (netret == NERR_Success) {
/*
* We have the workstation name in:
*
* Next, open the policy object for the local system using
* the LsaOpenPolicy function.
- */
+ */
status = LsaOpenPolicy(
- NULL,
- &ObjectAttributes,
- GENERIC_READ | POLICY_VIEW_LOCAL_INFORMATION,
- &PolicyHandle
- );
-
+ NULL,
+ &ObjectAttributes,
+ GENERIC_READ | POLICY_VIEW_LOCAL_INFORMATION,
+ &PolicyHandle
+ );
+
/*
* Error checking.
- */
+ */
if (status) {
debug("OpenPolicy Error: %ld\n", status);
} else {
/*
* You have a handle to the policy object. Now, get the
* domain information using LsaQueryInformationPolicy.
- */
+ */
status = LsaQueryInformationPolicy(PolicyHandle,
PolicyPrimaryDomainInformation,
- (PVOID *)&ppdiDomainInfo);
+ (PVOID *) & ppdiDomainInfo);
if (status) {
debug("LsaQueryInformationPolicy Error: %ld\n", status);
- } else {
+ } else {
/* Get name in useable format */
DomainName = AllocStrFromLSAStr(ppdiDomainInfo->Name);
* Check the Sid pointer, if it is null, the
* workstation is either a stand-alone computer
* or a member of a workgroup.
- */
+ */
if (ppdiDomainInfo->Sid) {
/*
* Member of a domain. Display it in debug mode.
- */
- debug("Member of Domain %s\n",DomainName);
+ */
+ debug("Member of Domain %s\n", DomainName);
} else {
DomainName = NULL;
- }
+ }
}
}
/*
* Clean up all the memory buffers created by the LSA and
* Net* APIs.
- */
+ */
NetApiBufferFree(pwkiWorkstationInfo);
- LsaFreeMemory((LPVOID)ppdiDomainInfo);
- } else
+ LsaFreeMemory((LPVOID) ppdiDomainInfo);
+ } else
debug("NetWkstaGetInfo Error: %ld\n", netret);
return DomainName;
}
/* returns 0 on match, -1 if no match */
-static int wcstrcmparray(const wchar_t *str, const char **array)
+static int
+wcstrcmparray(const wchar_t * str, const char **array)
{
- WCHAR wszGroup[GNLEN+1]; // Unicode Group
+ WCHAR wszGroup[GNLEN + 1]; // Unicode Group
while (*array) {
MultiByteToWideChar(CP_ACP, 0, *array,
strlen(*array) + 1, wszGroup, sizeof(wszGroup) / sizeof(wszGroup[0]));
- debug("Windows group: %S, Squid group: %S\n", str, wszGroup);
+ debug("Windows group: %S, Squid group: %S\n", str, wszGroup);
if ((use_case_insensitive_compare ? _wcsicmp(str, wszGroup) : wcscmp(str, wszGroup)) == 0)
return 0;
array++;
Valid_Local_Groups(char *UserName, const char **Groups)
{
int result = 0;
- char * Domain_Separator;
- WCHAR wszUserName[UNLEN+1]; // Unicode user name
+ char *Domain_Separator;
+ WCHAR wszUserName[UNLEN + 1]; // Unicode user name
LPLOCALGROUP_USERS_INFO_0 pBuf = NULL;
LPLOCALGROUP_USERS_INFO_0 pTmpBuf;
DWORD dwTotalCount = 0;
if ((Domain_Separator = strchr(UserName, '/')) != NULL)
- *Domain_Separator = '\\';
-
+ *Domain_Separator = '\\';
+
debug("Valid_Local_Groups: checking group membership of '%s'.\n", UserName);
-
+
/* Convert ANSI User Name and Group to Unicode */
MultiByteToWideChar(CP_ACP, 0, UserName,
/*
* Call the NetUserGetLocalGroups function
- * specifying information level 0.
- *
- * The LG_INCLUDE_INDIRECT flag specifies that the
- * function should also return the names of the local
- * groups in which the user is indirectly a member.
- */
+ * specifying information level 0.
+ *
+ * The LG_INCLUDE_INDIRECT flag specifies that the
+ * function should also return the names of the local
+ * groups in which the user is indirectly a member.
+ */
nStatus = NetUserGetLocalGroups(
NULL,
- wszUserName,
- dwLevel,
- dwFlags,
- (LPBYTE *) &pBuf,
+ wszUserName,
+ dwLevel,
+ dwFlags,
+ (LPBYTE *) & pBuf,
dwPrefMaxLen,
&dwEntriesRead,
&dwTotalEntries);
- /*
- * If the call succeeds,
- */
+ /*
+ * If the call succeeds,
+ */
if (nStatus == NERR_Success) {
if ((pTmpBuf = pBuf) != NULL) {
for (i = 0; i < dwEntriesRead; i++) {
}
}
} else
- result = 0;
+ result = 0;
/*
* Free the allocated memory.
*/
Valid_Global_Groups(char *UserName, const char **Groups)
{
int result = 0;
- WCHAR wszUserName[UNLEN+1]; // Unicode user name
- WCHAR wszLocalDomain[DNLEN+1]; // Unicode Local Domain
- WCHAR wszUserDomain[DNLEN+1]; // Unicode User Domain
+ WCHAR wszUserName[UNLEN + 1]; // Unicode user name
- char NTDomain[DNLEN+UNLEN+2];
+ WCHAR wszLocalDomain[DNLEN + 1]; // Unicode Local Domain
+
+ WCHAR wszUserDomain[DNLEN + 1]; // Unicode User Domain
+
+ char NTDomain[DNLEN + UNLEN + 2];
char *domain_qualify;
- char User[UNLEN+1];
+ char User[UNLEN + 1];
size_t j;
LPWSTR LclDCptr = NULL;
strncpy(NTDomain, UserName, sizeof(NTDomain));
- for (j=0; j < strlen(NTV_VALID_DOMAIN_SEPARATOR); j++) {
- if ((domain_qualify = strchr(NTDomain, NTV_VALID_DOMAIN_SEPARATOR[j])) != NULL)
- break;
+ for (j = 0; j < strlen(NTV_VALID_DOMAIN_SEPARATOR); j++) {
+ if ((domain_qualify = strchr(NTDomain, NTV_VALID_DOMAIN_SEPARATOR[j])) != NULL)
+ break;
}
if (domain_qualify == NULL) {
strcpy(User, NTDomain);
/* Call the NetServerGetInfo function for local computer, specifying level 101. */
dwLevel = 101;
- nStatus = NetServerGetInfo(NULL, dwLevel, (LPBYTE *)&pSrvBuf);
-
- if (nStatus == NERR_Success)
- {
- /* Check if we are running on a Domain Controller */
- if ((pSrvBuf->sv101_type & SV_TYPE_DOMAIN_CTRL) ||
- (pSrvBuf->sv101_type & SV_TYPE_DOMAIN_BAKCTRL))
- {
- LclDCptr = NULL;
- debug("Running on a DC.\n");
- }
- else
- nStatus = (use_PDC_only ? NetGetDCName(NULL, wszLocalDomain, (LPBYTE *) & LclDCptr) : NetGetAnyDCName(NULL, wszLocalDomain, (LPBYTE *) & LclDCptr));
+ nStatus = NetServerGetInfo(NULL, dwLevel, (LPBYTE *) & pSrvBuf);
+
+ if (nStatus == NERR_Success) {
+ /* Check if we are running on a Domain Controller */
+ if ((pSrvBuf->sv101_type & SV_TYPE_DOMAIN_CTRL) ||
+ (pSrvBuf->sv101_type & SV_TYPE_DOMAIN_BAKCTRL)) {
+ LclDCptr = NULL;
+ debug("Running on a DC.\n");
+ } else
+ nStatus = (use_PDC_only ? NetGetDCName(NULL, wszLocalDomain, (LPBYTE *) & LclDCptr) : NetGetAnyDCName(NULL, wszLocalDomain, (LPBYTE *) & LclDCptr));
} else {
fprintf(stderr, "%s NetServerGetInfo() failed.'\n", myname);
- if (pSrvBuf != NULL)
- NetApiBufferFree(pSrvBuf);
- return result;
+ if (pSrvBuf != NULL)
+ NetApiBufferFree(pSrvBuf);
+ return result;
}
if (nStatus == NERR_Success) {
- debug("Using '%S' as DC for '%S' local domain.\n", LclDCptr, wszLocalDomain);
-
- if (strcmp(NTDomain, machinedomain) != 0) {
+ debug("Using '%S' as DC for '%S' local domain.\n", LclDCptr, wszLocalDomain);
+
+ if (strcmp(NTDomain, machinedomain) != 0) {
MultiByteToWideChar(CP_ACP, 0, NTDomain,
strlen(NTDomain) + 1, wszUserDomain, sizeof(wszUserDomain) / sizeof(wszUserDomain[0]));
- nStatus = (use_PDC_only ? NetGetDCName(LclDCptr, wszUserDomain, (LPBYTE *) & UsrDCptr) : NetGetAnyDCName(LclDCptr, wszUserDomain, (LPBYTE *) & UsrDCptr));
- if (nStatus != NERR_Success) {
- fprintf(stderr, "%s Can't find DC for user's domain '%s'\n", myname, NTDomain);
- if (pSrvBuf != NULL)
- NetApiBufferFree(pSrvBuf);
- if (LclDCptr != NULL)
- NetApiBufferFree((LPVOID) LclDCptr);
- if (UsrDCptr != NULL)
- NetApiBufferFree((LPVOID) UsrDCptr);
- return result;
- }
+ nStatus = (use_PDC_only ? NetGetDCName(LclDCptr, wszUserDomain, (LPBYTE *) & UsrDCptr) : NetGetAnyDCName(LclDCptr, wszUserDomain, (LPBYTE *) & UsrDCptr));
+ if (nStatus != NERR_Success) {
+ fprintf(stderr, "%s Can't find DC for user's domain '%s'\n", myname, NTDomain);
+ if (pSrvBuf != NULL)
+ NetApiBufferFree(pSrvBuf);
+ if (LclDCptr != NULL)
+ NetApiBufferFree((LPVOID) LclDCptr);
+ if (UsrDCptr != NULL)
+ NetApiBufferFree((LPVOID) UsrDCptr);
+ return result;
+ }
} else
UsrDCptr = LclDCptr;
- debug("Using '%S' as DC for '%s' user's domain.\n", UsrDCptr, NTDomain);
+ debug("Using '%S' as DC for '%s' user's domain.\n", UsrDCptr, NTDomain);
/*
* Call the NetUserGetGroups function
- * specifying information level 0.
- */
- dwLevel = 0;
- nStatus = NetUserGetGroups(UsrDCptr,
- wszUserName,
- dwLevel,
- (LPBYTE *) & pUsrBuf,
- dwPrefMaxLen,
- &dwEntriesRead,
- &dwTotalEntries);
- /*
- * If the call succeeds,
- */
+ * specifying information level 0.
+ */
+ dwLevel = 0;
+ nStatus = NetUserGetGroups(UsrDCptr,
+ wszUserName,
+ dwLevel,
+ (LPBYTE *) & pUsrBuf,
+ dwPrefMaxLen,
+ &dwEntriesRead,
+ &dwTotalEntries);
+ /*
+ * If the call succeeds,
+ */
if (nStatus == NERR_Success) {
if ((pTmpBuf = pUsrBuf) != NULL) {
for (i = 0; i < dwEntriesRead; i++) {
dwTotalCount++;
}
}
- } else {
+ } else {
result = 0;
- fprintf(stderr, "%s NetUserGetGroups() failed.'\n", myname);
- }
+ fprintf(stderr, "%s NetUserGetGroups() failed.'\n", myname);
+ }
} else {
fprintf(stderr, "%s Can't find DC for local domain '%s'\n", myname, machinedomain);
}
* Free the allocated memory.
*/
if (pSrvBuf != NULL)
- NetApiBufferFree(pSrvBuf);
+ NetApiBufferFree(pSrvBuf);
if (pUsrBuf != NULL)
- NetApiBufferFree(pUsrBuf);
+ NetApiBufferFree(pUsrBuf);
if ((UsrDCptr != NULL) && (UsrDCptr != LclDCptr))
- NetApiBufferFree((LPVOID) UsrDCptr);
+ NetApiBufferFree((LPVOID) UsrDCptr);
if (LclDCptr != NULL)
- NetApiBufferFree((LPVOID) LclDCptr);
+ NetApiBufferFree((LPVOID) LclDCptr);
return result;
}
static void
usage(char *program)
{
- fprintf(stderr,"Usage: %s [-D domain][-G][-P][-c][-d][-h]\n"
- " -D default user Domain\n"
- " -G enable Domain Global group mode\n"
- " -P use ONLY PDCs for group validation\n"
- " -c use case insensitive compare\n"
- " -d enable debugging\n"
- " -h this message\n",
- program);
+ fprintf(stderr, "Usage: %s [-D domain][-G][-P][-c][-d][-h]\n"
+ " -D default user Domain\n"
+ " -G enable Domain Global group mode\n"
+ " -P use ONLY PDCs for group validation\n"
+ " -c use case insensitive compare\n"
+ " -d enable debugging\n"
+ " -h this message\n",
+ program);
}
void
switch (opt) {
case 'D':
DefaultDomain = xstrndup(optarg, DNLEN + 1);
- strlwr(DefaultDomain);
+ strlwr(DefaultDomain);
break;
case 'G':
use_global = 1;
int
-main (int argc, char *argv[])
+main(int argc, char *argv[])
{
char *p;
char buf[BUFSIZE];
const char *groups[512];
int n;
- if (argc > 0) { /* should always be true */
- myname=strrchr(argv[0],'/');
- if (myname==NULL)
- myname=argv[0];
+ if (argc > 0) { /* should always be true */
+ myname = strrchr(argv[0], '/');
+ if (myname == NULL)
+ myname = argv[0];
} else {
- myname="(unknown)";
+ myname = "(unknown)";
}
- mypid=getpid();
+ mypid = getpid();
setbuf(stdout, NULL);
setbuf(stderr, NULL);
process_options(argc, argv);
if (use_global) {
- if ((machinedomain = GetDomainName()) == NULL) {
+ if ((machinedomain = GetDomainName()) == NULL) {
fprintf(stderr, "%s Can't read machine domain\n", myname);
exit(1);
}
strlwr(machinedomain);
- if (!DefaultDomain)
- DefaultDomain = xstrdup(machinedomain);
+ if (!DefaultDomain)
+ DefaultDomain = xstrdup(machinedomain);
}
-
debug("External ACL win32 group helper build " __DATE__ ", " __TIME__
- " starting up...\n");
+ " starting up...\n");
if (use_global)
- debug("Domain Global group mode enabled using '%s' as default domain.\n", DefaultDomain);
+ debug("Domain Global group mode enabled using '%s' as default domain.\n", DefaultDomain);
if (use_case_insensitive_compare)
- debug("Warning: running in case insensitive mode !!!\n");
+ debug("Warning: running in case insensitive mode !!!\n");
if (use_PDC_only)
- debug("Warning: using only PDCs for group validation !!!\n");
+ debug("Warning: using only PDCs for group validation !!!\n");
/* Main Loop */
- while (fgets (buf, sizeof(buf), stdin))
- {
+ while (fgets(buf, sizeof(buf), stdin)) {
if (NULL == strchr(buf, '\n')) {
/* too large message received.. skip and deny */
fprintf(stderr, "%s: ERROR: Too large: %s\n", argv[0], buf);
}
goto error;
}
-
if ((p = strchr(buf, '\n')) != NULL)
*p = '\0'; /* strip \n */
if ((p = strchr(buf, '\r')) != NULL)
*p = '\0'; /* strip \r */
- debug("Got '%s' from Squid (length: %d).\n",buf,strlen(buf));
+ debug("Got '%s' from Squid (length: %d).\n", buf, strlen(buf));
if (buf[0] == '\0') {
fprintf(stderr, "Invalid Request\n");
goto error;
}
-
username = strtok(buf, " ");
for (n = 0; (group = strtok(NULL, " ")) != NULL; n++) {
rfc1738_unescape(group);
}
groups[n] = NULL;
- if (NULL == username) {
- fprintf(stderr, "Invalid Request\n");
- goto error;
- }
+ if (NULL == username) {
+ fprintf(stderr, "Invalid Request\n");
+ goto error;
+ }
rfc1738_unescape(username);
if ((use_global ? Valid_Global_Groups(username, groups) : Valid_Local_Groups(username, groups))) {
- printf ("OK\n");
+ printf("OK\n");
} else {
-error:
- printf ("ERR\n");
+ error:
+ printf("ERR\n");
}
err = 0;
}