You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
324 lines
8.0 KiB
324 lines
8.0 KiB
/*++
|
|
Copyright (c) 2002 - 2002 Microsoft Corporation. All Rights Reserved.
|
|
|
|
THIS CODE AND INFORMATION IS PROVIDED "AS-IS" WITHOUT WARRANTY OF
|
|
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
|
|
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
|
PARTICULAR PURPOSE.
|
|
|
|
THIS CODE IS NOT SUPPORTED BY MICROSOFT.
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
//
|
|
// Private functions.
|
|
//
|
|
|
|
/***************************************************************************++
|
|
|
|
Routine Description:
|
|
Prints a record in the URL ACL store.
|
|
|
|
Arguments:
|
|
pOutput - A pointer to HTTP_SERVICE_CONFIG_URLACL_SET
|
|
|
|
Return Value:
|
|
None.
|
|
|
|
--***************************************************************************/
|
|
void
|
|
PrintUrlAclRecord(
|
|
IN PUCHAR pOutput
|
|
)
|
|
{
|
|
PHTTP_SERVICE_CONFIG_URLACL_SET pSetParam;
|
|
|
|
pSetParam = (PHTTP_SERVICE_CONFIG_URLACL_SET) pOutput;
|
|
|
|
NlsPutMsg(
|
|
HTTPCFG_URLACL_URL,
|
|
pSetParam->KeyDesc.pUrlPrefix
|
|
);
|
|
|
|
NlsPutMsg(
|
|
HTTPCFG_URLACL_ACL,
|
|
pSetParam->ParamDesc.pStringSecurityDescriptor
|
|
);
|
|
|
|
NlsPutMsg(
|
|
HTTPCFG_RECORD_SEPARATOR
|
|
);
|
|
}
|
|
|
|
/***************************************************************************++
|
|
|
|
Routine Description:
|
|
Sets an URL ACL entry.
|
|
|
|
Arguments:
|
|
pUrl - The URL
|
|
pAcl - The ACL specified as a SDDL string.
|
|
|
|
Return Value:
|
|
Success/Failure.
|
|
|
|
--***************************************************************************/
|
|
int
|
|
DoUrlAclSet(
|
|
IN PWSTR pUrl,
|
|
IN PWSTR pAcl
|
|
)
|
|
{
|
|
HTTP_SERVICE_CONFIG_URLACL_SET SetParam;
|
|
DWORD Status;
|
|
|
|
ZeroMemory(&SetParam, sizeof(SetParam));
|
|
|
|
SetParam.KeyDesc.pUrlPrefix = pUrl;
|
|
SetParam.ParamDesc.pStringSecurityDescriptor = pAcl;
|
|
|
|
Status = HttpSetServiceConfiguration(
|
|
NULL,
|
|
HttpServiceConfigUrlAclInfo,
|
|
&SetParam,
|
|
sizeof(SetParam),
|
|
NULL
|
|
);
|
|
|
|
NlsPutMsg(HTTPCFG_SETSERVICE_STATUS, Status);
|
|
|
|
return Status;
|
|
}
|
|
|
|
|
|
/***************************************************************************++
|
|
|
|
Routine Description:
|
|
Queries for a URL ACL entry.
|
|
|
|
Arguments:
|
|
pUrl - The URL (if NULL, then enumerate the store).
|
|
|
|
Return Value:
|
|
Success/Failure.
|
|
|
|
--***************************************************************************/
|
|
int DoUrlAclQuery(
|
|
IN PWSTR pUrl
|
|
)
|
|
{
|
|
DWORD Status;
|
|
PUCHAR pOutput = NULL;
|
|
DWORD OutputLength = 0;
|
|
DWORD ReturnLength = 0;
|
|
HTTP_SERVICE_CONFIG_URLACL_QUERY QueryParam;
|
|
|
|
ZeroMemory(&QueryParam, sizeof(QueryParam));
|
|
|
|
if(pUrl)
|
|
{
|
|
// If a URL is specified, we'll Query for an exact entry.
|
|
//
|
|
QueryParam.QueryDesc = HttpServiceConfigQueryExact;
|
|
QueryParam.KeyDesc.pUrlPrefix = pUrl;
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// No URL is specified, so enumerate the entire store.
|
|
//
|
|
QueryParam.QueryDesc = HttpServiceConfigQueryNext;
|
|
}
|
|
|
|
for(;;)
|
|
{
|
|
//
|
|
// First, compute bytes required for querying the first entry.
|
|
//
|
|
Status = HttpQueryServiceConfiguration(
|
|
NULL,
|
|
HttpServiceConfigUrlAclInfo,
|
|
&QueryParam,
|
|
sizeof(QueryParam),
|
|
pOutput,
|
|
OutputLength,
|
|
&ReturnLength,
|
|
NULL
|
|
);
|
|
|
|
if(Status == ERROR_INSUFFICIENT_BUFFER)
|
|
{
|
|
// If the API completes with ERROR_INSUFFICIENT_BUFFER, we'll
|
|
// allocate memory for it & continue with the loop where we'll
|
|
// call it again.
|
|
|
|
if(pOutput)
|
|
{
|
|
// If there was an existing buffer, free it.
|
|
LocalFree(pOutput);
|
|
}
|
|
|
|
// Allocate a new buffer
|
|
pOutput = LocalAlloc(LMEM_FIXED, ReturnLength);
|
|
if(!pOutput)
|
|
{
|
|
return ERROR_NOT_ENOUGH_MEMORY;
|
|
}
|
|
|
|
OutputLength = ReturnLength;
|
|
}
|
|
else if(Status == NO_ERROR)
|
|
{
|
|
|
|
// The query succeeded! We'll print the record that we just
|
|
// queried.
|
|
|
|
PrintUrlAclRecord(pOutput);
|
|
|
|
if(pUrl)
|
|
{
|
|
//
|
|
// If we are not enumerating, we are done.
|
|
//
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// Since we are enumerating, we'll move on to the next
|
|
// record. This is done by incrementing the cursor, till
|
|
// we get ERROR_NO_MORE_ITEMS.
|
|
//
|
|
QueryParam.dwToken ++;
|
|
}
|
|
}
|
|
else if(ERROR_NO_MORE_ITEMS == Status && pUrl == NULL)
|
|
{
|
|
// We are enumerating and we have reached the end. This is
|
|
// indicated by a ERROR_NO_MORE_ITEMS error code.
|
|
|
|
// This is not a real error, since it is used to indicate that
|
|
// we've finished enumeration.
|
|
|
|
Status = NO_ERROR;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// Some other error, so we are done
|
|
//
|
|
NlsPutMsg(HTTPCFG_QUERYSERVICE_STATUS, Status);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(pOutput)
|
|
{
|
|
LocalFree(pOutput);
|
|
}
|
|
|
|
return Status;
|
|
}
|
|
|
|
/***************************************************************************++
|
|
|
|
Routine Description:
|
|
Deletes an URL ACL entry.
|
|
|
|
Arguments:
|
|
pUrl - The URL
|
|
|
|
Return Value:
|
|
Success/Failure.
|
|
|
|
--***************************************************************************/
|
|
int DoUrlAclDelete(
|
|
IN PWSTR pUrl
|
|
)
|
|
{
|
|
HTTP_SERVICE_CONFIG_URLACL_SET SetParam;
|
|
DWORD Status;
|
|
|
|
SetParam.KeyDesc.pUrlPrefix = pUrl;
|
|
Status = HttpDeleteServiceConfiguration(
|
|
NULL,
|
|
HttpServiceConfigUrlAclInfo,
|
|
&SetParam,
|
|
sizeof(SetParam),
|
|
NULL
|
|
);
|
|
|
|
NlsPutMsg(HTTPCFG_DELETESERVICE_STATUS, Status);
|
|
return Status;
|
|
}
|
|
|
|
//
|
|
// Public function.
|
|
//
|
|
|
|
/***************************************************************************++
|
|
|
|
Routine Description:
|
|
The function that parses parameters specific to URL ACL &
|
|
calls Set, Query or Delete.
|
|
|
|
Arguments:
|
|
argc - Count of arguments.
|
|
argv - Pointer to command line arguments.
|
|
Type - Type of operation to be performed.
|
|
|
|
Return Value:
|
|
Success/Failure.
|
|
|
|
--***************************************************************************/
|
|
int
|
|
DoUrlAcl(
|
|
int argc,
|
|
WCHAR **argv,
|
|
HTTPCFG_TYPE Type
|
|
)
|
|
{
|
|
PWCHAR pUrl = NULL;
|
|
PWCHAR pAcl = NULL;
|
|
|
|
while(argc>=2 && (argv[0][0] == '-' || argv[0][0]== '/'))
|
|
{
|
|
switch(toupper(argv[0][1]))
|
|
{
|
|
case 'U':
|
|
pUrl = argv[1];
|
|
break;
|
|
|
|
case 'A':
|
|
pAcl = argv[1];
|
|
break;
|
|
|
|
default:
|
|
NlsPutMsg(HTTPCFG_INVALID_SWITCH, argv[0]);
|
|
return ERROR_INVALID_PARAMETER;
|
|
}
|
|
|
|
argc -=2;
|
|
argv +=2;
|
|
}
|
|
|
|
switch(Type)
|
|
{
|
|
case HttpCfgTypeSet:
|
|
return DoUrlAclSet(pUrl, pAcl);
|
|
|
|
case HttpCfgTypeQuery:
|
|
return DoUrlAclQuery(pUrl);
|
|
|
|
case HttpCfgTypeDelete:
|
|
return DoUrlAclDelete(pUrl);
|
|
|
|
default:
|
|
NlsPutMsg(HTTPCFG_INVALID_SWITCH, argv[0]);
|
|
return ERROR_INVALID_PARAMETER;
|
|
}
|
|
}
|