|
|
//*******************************************************************
//*
//* PICSRule.cpp
//*
//* Revision History:
//* Created 7/98 - Mark Hammond (t-markh)
//*
//* Implements PICSRules parsing, decision making,
//* exporting, and editing.
//*
//*******************************************************************
//*******************************************************************
//*
//* A brief rundown on PICSRules files:
//* (The official spec is at: http://www.w3.org/TR/REC-PICSRules)
//*
//* PICSRules files have MIME type: application/pics-rules and
//* consist of a sequence of parenthesis encapsulated attribute
//* value pairs. Values consist of quoted strings or parenthesized
//* lists of further attribute value pairs. Every subsection of a
//* PICSRules file has a primary attribute (denoted in the outline
//* below by square brackets); if any value is not paired with an
//* attribute, it is assigned to the primary attribute.
//*
//* Whitespace consists of the characters ' ', '\t', '\r', and '\n'
//* and is ignored except between attribute value pairs.
//*
//* Quoted strings can be encapsulated in either single ticks ('')
//* or double ticks (""), but may not use mixed notation ('" or "').
//*
//* The following escape sequences are observed in the quoted strings:
//* " = %22
//* ' = %27
//* % = %25
//* Any other escape sequence is invalid.
//*
//* Both attributes and values are case sensitive.
//*
//* Curly brackets denote comments.
//*
//* --- Code Requirements ---
//*
//* The rule evaluator needs to return yes (accept) or no (reject)
//* AS WELL AS the policy clause that determined the answer.
//*
//* The rule evaluator stops when it hits the first policy clause
//* which is applicable.
//*
//* If no clause is satisfied, the default clause is:
//* AcceptIf "otherwise". In this implementation, if no clause is
//* satisfied, evaluation is passed to our non-PICSRule evaluator.
//*
//* PICSRules 1.1 does NOT support Internationalization of the name
//* section (i.e. each language needs its own PICSRules file).
//* The AddItem function of the PICSRulesName class can easily be
//* extended if this behavior changes in a future revision of the
//* PICSRules spec.
//*
//* The Ratfile attribute is either an entire machine readable .RAT
//* file, or the URL where the .RAT file can be obtained.
//*
//* --- Attribute Value specifications ---
//*
//*
//* The main body of a PICSRules has the form:
//*
//* (PicsRule-%verMajor%.%verMinor%
//* (
//* Attribute Value
//* ...
//* Tag (
//* Attribute Value
//* ...
//* )
//* )
//* )
//*
//* The current %verMajor% is 1
//* The current %verMinor% is 1
//*
//* Possible Tags and their Attribute Value pairs are:
//*
//* Policy (
//* [Explanation] quoted
//* RejectByURL URL | ( [patterns] URL )
//* AcceptByURL URL | ( [patterns] URL )
//* RejectIf PolicyExpression
//* RejectUnless PolicyExpression
//* AcceptIf PolicyExpression
//* AcceptUnless PolicyExpression
//* *Extension* )
//*
//* name (
//* [Rulename] quoted
//* Description quoted
//* *Extension* )
//*
//* source (
//* [SourceURL] URL
//* CreationTool quoted (has format application/version)
//* author email
//* LastModified ISO Date
//* *Extension* )
//*
//* serviceinfo (
//* [Name] URL
//* shortname quoted
//* BureauURL URL
//* UseEmbedded Y|N
//* Ratfile quoted
//* BureauUnavailable PASS|FAIL
//* *Extension* )
//*
//* optextension (
//* [extension-name] URL
//* shortname quoted
//* *Extension* )
//*
//* reqextension (
//* [extension-name] URL
//* shortname quoted
//* *Extension* )
//*
//* *Extension*
//*
//* Further comments are given below
//*
//*******************************************************************
//*******************************************************************
//*
//* #Includes
//*
//*******************************************************************
#include "msrating.h"
#include "mslubase.h"
#include "debug.h"
#include "parselbl.h" /* we use a couple of this guy's subroutines */
#include "msluglob.h"
#include "reghive.h" // CRegistryHive
#include "buffer.h"
#include "resource.h"
#include <wininet.h>
#include "picsrule.h"
#include <mluisupp.h>
#include <winsock2.h>
#include <shlwapip.h>
//*******************************************************************
//*
//* Globals
//*
//*******************************************************************
array<PICSRulesRatingSystem*> g_arrpPRRS; //this is the array of PICSRules systems
//which are inforced while ie is running
PICSRulesRatingSystem * g_pApprovedPRRS; //this is the Approved Sites PICSRules
//system
PICSRulesRatingSystem * g_pPRRS=NULL; //this is a temporary pointer used while
//parsing a PICSRules file
HMODULE g_hURLMON,g_hWININET;
BOOL g_fPICSRulesEnforced,g_fApprovedSitesEnforced;
char g_szLastURL[INTERNET_MAX_URL_LENGTH];
extern DWORD g_dwDataSource;
extern HANDLE g_HandleGlobalCounter,g_ApprovedSitesHandleGlobalCounter; extern long g_lGlobalCounterValue,g_lApprovedSitesGlobalCounterValue;
//*******************************************************************
//*
//* Function Prototypes
//*
//*******************************************************************
HRESULT PICSRulesParseSubPolicyExpression(LPSTR& lpszCurrent,PICSRulesPolicyExpression *pPRPolicyExpression,PICSRulesFileParser *pParser); HRESULT PICSRulesParseSimplePolicyExpression(LPSTR& lpszCurrent,PICSRulesPolicyExpression *pPRPolicyExpression,PICSRulesFileParser *pParser); BOOL IsServiceDefined(LPSTR lpszService,LPSTR lpszFullService,PICSRulesServiceInfo **ppServiceInfo); BOOL IsOptExtensionDefined(LPSTR lpszExtension); BOOL IsReqExtensionDefined(LPSTR lpszExtension); HRESULT PICSRulesParseSingleByURL(LPSTR lpszByURL, PICSRulesByURLExpression *pPRByURLExpression, PICSRulesFileParser *pParser);
//*******************************************************************
//*
//* Some definitions specific to this file
//*
//*******************************************************************
PICSRulesAllowableOption aaoPICSRules[] = { { PROID_PICSVERSION, 0 }, { PROID_POLICY, AO_MANDATORY }, { PROID_EXPLANATION, AO_SINGLE }, { PROID_REJECTBYURL, AO_SINGLE }, { PROID_ACCEPTBYURL, AO_SINGLE }, { PROID_REJECTIF, AO_SINGLE }, { PROID_ACCEPTIF, AO_SINGLE }, { PROID_ACCEPTUNLESS, AO_SINGLE }, { PROID_REJECTUNLESS, AO_SINGLE }, { PROID_NAME, AO_SINGLE }, { PROID_RULENAME, 0 }, { PROID_DESCRIPTION, 0 }, { PROID_SOURCE, AO_SINGLE }, { PROID_SOURCEURL, 0 }, { PROID_CREATIONTOOL, 0 }, { PROID_AUTHOR, 0 }, { PROID_LASTMODIFIED, 0 }, { PROID_SERVICEINFO, 0 }, { PROID_SINAME, AO_SINGLE }, { PROID_SHORTNAME, AO_SINGLE }, { PROID_BUREAUURL, 0 }, { PROID_USEEMBEDDED, AO_SINGLE }, { PROID_RATFILE, AO_SINGLE }, { PROID_BUREAUUNAVAILABLE, AO_SINGLE }, { PROID_OPTEXTENSION, 0 }, { PROID_EXTENSIONNAME, AO_SINGLE }, //{ PROID_SHORTNAME, AO_SINGLE },
{ PROID_REQEXTENSION, 0 }, //{ PROID_EXTENSIONNAME, AO_SINGLE },
//{ PROID_SHORTNAME, AO_SINGLE },
{ PROID_EXTENSION, 0 },
{ PROID_POLICYDEFAULT, AO_SINGLE }, { PROID_NAMEDEFAULT, AO_SINGLE }, { PROID_SOURCEDEFAULT, AO_SINGLE }, { PROID_SERVICEINFODEFAULT, AO_SINGLE }, { PROID_OPTEXTENSIONDEFAULT, AO_SINGLE }, { PROID_REQEXTENSIONDEFAULT, AO_SINGLE },
{ PROID_INVALID, 0 } }; const UINT caoPICSRules=sizeof(aaoPICSRules)/sizeof(aaoPICSRules[0]);
//The FN_INTERNETCRACKURL type describes the URLMON function InternetCrackUrl
typedef BOOL (*FN_INTERNETCRACKURL)(LPCTSTR lpszUrl,DWORD dwUrlLength,DWORD dwFlags,LPURL_COMPONENTS lpUrlComponents);
//The FN_ISVALIDURL type describes the URLMON function IsValidURL
//and is called by the three IsURLValid methods of PICSRulesQuotedURL
typedef HRESULT (*FN_ISVALIDURL)(LPBC pBC,LPCWSTR szURL,DWORD dwReserved);
//*******************************************************************
//*
//* This function is called by AdvancedDlgProc while processing
//* WM_COMMOND with LOWORD(wParam)==IDC_PICSRULESOPEN in msludlg.cpp
//* The argument lpszFileName is the name of the PICSRules file
//* selected by the user to import.
//*
//* This begins the PICSRules Import process.
//*
//*******************************************************************
HRESULT PICSRulesImport(char *lpszFileName, PICSRulesRatingSystem **pprrsOut) { PICSRulesRatingSystem *pPRRS=new PICSRulesRatingSystem;
*pprrsOut=pPRRS; if(pPRRS==NULL) { return E_OUTOFMEMORY; }
UINT cbFilename=strlenf(lpszFileName)+1+1; //room for marker character
LPSTR lpszNameCopy=new char[cbFilename]; if(lpszNameCopy==NULL) { return E_OUTOFMEMORY; }
strcpyf(lpszNameCopy,lpszFileName); pPRRS->m_etstrFile.SetTo(lpszNameCopy);
HRESULT hRes;
HANDLE hFile=CreateFile(lpszNameCopy,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,NULL);
if(hFile!=INVALID_HANDLE_VALUE) { DWORD cbFile=::GetFileSize(hFile,NULL);
BUFFER bufData(cbFile+1);
if(bufData.QueryPtr()!=NULL) { LPSTR lpszData=(LPSTR)bufData.QueryPtr(); DWORD cbRead;
if(ReadFile(hFile,lpszData,cbFile,&cbRead,NULL)) { lpszData[cbRead]='\0'; //null terminate whole file
g_pPRRS=pPRRS; //make data available to
//parsing functions during
//parsing
hRes=pPRRS->Parse(lpszFileName,lpszData);
if(SUCCEEDED(hRes)) { pPRRS->m_dwFlags|=PRRS_ISVALID; } else { g_pPRRS=NULL; } } else { hRes=HRESULT_FROM_WIN32(::GetLastError()); } CloseHandle(hFile); } else { hRes=E_OUTOFMEMORY; } } else { hRes=HRESULT_FROM_WIN32(::GetLastError()); }
if(!(pPRRS->m_dwFlags&PRS_ISVALID)) { //file is invalid
}
return hRes; }
/* White returns a pointer to the first whitespace character starting at pc.*/ extern char* White(char *);
/* NonWhite returns a pointer to the first non-whitespace character starting at pc.*/ extern char* NonWhite(char *);
//*******************************************************************
//*
//* The following are handler functions which parse the various
//* kinds of content which can occur within a parenthesized object.
//*
//* ppszIn is always advanced to the next non-white space token
//* ppszOut returns the processed data
//*
//*******************************************************************
//The following escape sequences are observed:
// " =%22
// ' =%27
// % =%25
//any other escape sequence is invalid
HRESULT PICSRulesParseString(LPSTR *ppszIn, LPVOID *ppOut, PICSRulesFileParser *pParser) { BOOL fQuote; LPSTR lpszEscapeSequence,lpszNewEnd;
*ppOut=NULL; LPSTR pszCurrent=*ppszIn;
if(*pszCurrent=='\"') { fQuote=PR_QUOTE_DOUBLE; } else if(*pszCurrent=='\'') { fQuote=PR_QUOTE_SINGLE; } else { return(PICSRULES_E_EXPECTEDSTRING); }
pszCurrent++;
LPSTR pszEnd=pParser->EatQuotedString(pszCurrent,fQuote); if(pszEnd==NULL) { return(PICSRULES_E_EXPECTEDSTRING); }
lpszNewEnd=pszEnd;
do { lpszEscapeSequence=strstrf(pszCurrent,"%22");
if(lpszEscapeSequence>lpszNewEnd) { lpszEscapeSequence=NULL; }
if(lpszEscapeSequence!=NULL) { *lpszEscapeSequence='\"';
memcpyf(lpszEscapeSequence+1,lpszEscapeSequence+3,(int)(lpszNewEnd-lpszEscapeSequence-3));
lpszNewEnd-=2; }
} while(lpszEscapeSequence!=NULL);
do { lpszEscapeSequence=strstrf(pszCurrent,"%27");
if(lpszEscapeSequence>lpszNewEnd) { lpszEscapeSequence=NULL; }
if(lpszEscapeSequence!=NULL) { *lpszEscapeSequence='\'';
memcpyf(lpszEscapeSequence+1,lpszEscapeSequence+3,(int)(lpszNewEnd-lpszEscapeSequence-3));
lpszNewEnd-=2; }
} while(lpszEscapeSequence!=NULL);
do { lpszEscapeSequence=strstrf(pszCurrent,"%25");
if(lpszEscapeSequence>lpszNewEnd) { lpszEscapeSequence=NULL; }
if(lpszEscapeSequence!=NULL) { *lpszEscapeSequence='%';
memcpyf(lpszEscapeSequence+1,lpszEscapeSequence+3,(int)(lpszNewEnd-lpszEscapeSequence-3));
lpszNewEnd-=2; }
} while(lpszEscapeSequence!=NULL);
UINT cbString= (unsigned int) (lpszNewEnd-pszCurrent); LPSTR pszNew = new char[cbString + 1]; //This memory gets assigned to an ET derived
//type via the AddItem call for the class handling
//the parenthesized object. The memory is
//deallocated when the handling class, and hence
//the ET derived type, goes out of scope.
if (pszNew==NULL) { return(E_OUTOFMEMORY); }
memcpyf(pszNew, pszCurrent, cbString); pszNew[cbString]='\0';
*ppOut=(LPVOID) pszNew; *ppszIn=pParser->FindNonWhite(pszEnd+1);
return(NOERROR); }
HRESULT PICSRulesParseNumber(LPSTR *ppszIn, LPVOID *ppOut, PICSRulesFileParser *pParser) { int n;
LPSTR pszCurrent=*ppszIn; HRESULT hres=::ParseNumber(&pszCurrent,&n,TRUE);
if(FAILED(hres)) { return(PICSRULES_E_EXPECTEDNUMBER); }
*(int *)ppOut=n;
LPSTR pszNewline=strchrf(*ppszIn, '\n');
while((pszNewline!=NULL)&&(pszNewline<pszCurrent)) { pParser->m_nLine++; pszNewline=strchrf(pszNewline+1,'\n'); } *ppszIn=pszCurrent;
return(NOERROR); }
HRESULT PICSRulesParseYesNo(LPSTR *ppszIn, LPVOID *ppOut, PICSRulesFileParser *pParser) { BOOL b;
//The PICSRules spec allows the following:
//
// "y" == Yes
// "yes" == Yes
// "n" == no
// "no" == no
//
// string comparison is not case sensitive
//
LPSTR pszCurrent=*ppszIn;
if((*pszCurrent=='\"')||(*pszCurrent=='\'')) { pszCurrent++; }
HRESULT hres=::GetBool(&pszCurrent,&b,PR_BOOLEAN_YESNO);
if (FAILED(hres)) { return(PICSRULES_E_EXPECTEDBOOL); }
LPSTR pszNewline=strchrf(*ppszIn,'\n'); while((pszNewline!=NULL)&&(pszNewline<pszCurrent)) { pParser->m_nLine++; pszNewline=strchrf(pszNewline+1,'\n'); }
if((*pszCurrent=='\"')||(*pszCurrent=='\'')) { pszCurrent++; }
*ppszIn=pszCurrent;
*(LPBOOL)ppOut=b;
return(NOERROR); }
HRESULT PICSRulesParsePassFail(LPSTR *ppszIn, LPVOID *ppOut, PICSRulesFileParser *pParser) { BOOL b;
//The PICSRules spec allows the following:
//
// "pass" == pass
// "fail" == fail
//
// for completeness we add:
//
// "p" == pass
// "f" == fail
//
// string comparison is not case sensitive
//
LPSTR pszCurrent=*ppszIn;
if((*pszCurrent=='\"')||(*pszCurrent=='\'')) { pszCurrent++; }
HRESULT hres=::GetBool(&pszCurrent,&b,PR_BOOLEAN_PASSFAIL);
if (FAILED(hres)) { return(PICSRULES_E_EXPECTEDBOOL); }
LPSTR pszNewline=strchrf(*ppszIn,'\n'); while((pszNewline!=NULL)&&(pszNewline<pszCurrent)) { pParser->m_nLine++; pszNewline=strchrf(pszNewline+1,'\n'); }
if((*pszCurrent=='\"')||(*pszCurrent=='\'')) { pszCurrent++; }
*ppszIn=pszCurrent;
*(LPBOOL)ppOut=b;
return(NOERROR); }
HRESULT PICSRulesParseVersion(LPSTR *ppszIn, LPVOID *ppOut, PICSRulesFileParser *pParser) { //t-markh - 8/98 - This shouldn't get called, version info should be filled
// out before processing begins
return(E_UNEXPECTED); }
PICSRulesAllowableOption aaoPICSRulesPolicy[] = { { PROID_EXPLANATION, AO_SINGLE }, { PROID_REJECTBYURL, AO_SINGLE }, { PROID_ACCEPTBYURL, AO_SINGLE }, { PROID_REJECTIF, AO_SINGLE }, { PROID_ACCEPTIF, AO_SINGLE }, { PROID_ACCEPTUNLESS, AO_SINGLE }, { PROID_REJECTUNLESS, AO_SINGLE }, { PROID_EXTENSION, 0 }, { PROID_INVALID, 0 } }; const UINT caoPICSRulesPolicy=sizeof(aaoPICSRulesPolicy)/sizeof(aaoPICSRulesPolicy[0]);
HRESULT PICSRulesParsePolicy(LPSTR *ppszIn, LPVOID *ppOut, PICSRulesFileParser *pParser) { //We must make a copy of the allowable options array because the
//parser will fiddle with the flags in the entries -- specifically,
//setting AO_SEEN. It wouldn't be thread-safe to do this to a
//static array.
PICSRulesAllowableOption aao[caoPICSRulesPolicy];
::memcpyf(aao,::aaoPICSRulesPolicy,sizeof(aao));
PICSRulesPolicy *pPolicy=new PICSRulesPolicy; if(pPolicy==NULL) { return E_OUTOFMEMORY; }
HRESULT hres=pParser->ParseParenthesizedObject( ppszIn, //var containing current ptr
aao, //what's legal in this object
pPolicy); //object to add items back to
if (FAILED(hres)) { delete pPolicy; pPolicy = NULL; return hres; }
*ppOut=(LPVOID) pPolicy;
return NOERROR; }
//PICSRules URLpatterns can be presented to ParseByURL as either a single
//pattern, or a parenthesized list of multiple patterns. i.e.
//
// Policy (RejectByURL "http://*@*.badsite.com:*/*" )
// Policy (AcceptByURL (
// "http://*@www.goodsite.com:*/*"
// "ftp://*@www.goodsite.com:*/*" ) )
//
//The general form of an URLpattern is:
//
// internet pattern - internetscheme://user@hostoraddr:port/pathmatch
// other pattern - otherscheme:nonquotedcharacters
//
// in all cases, an ommitted section only matches to a URL if that section
// was omitted in the URL being navigated to.
//
// the wild card character '*' may be used to match any pattern as specified
// on a per section basis below. To encode the actual character '*' the escape
// sequence '%*' is recognized.
//
// recognized internet schemes are:
// ftp, http, gopher, nntp, irc, prospero, telnet, and *
//
// the user section consists of '*' nonquotedcharacters '*', in other words, an
// alphanumeric user name with optional wild card sections before and after the
// name. A single * matches all names.
//
// the hostoraddr section can be in one of two forms, either:
// '*' hostname, or ipnum.ipnum.ipnum.ipnum!bitlength
// hostname must be a substring of a fully qualified domain name
// bitlength is an integer between 0 and 32 inclusive, and
// ipnum is an integer between 0 and 255 inclusive.
// the bitlength parameter masks out the last n bits of the 32 bit ip address
// specified (i.e. treats them as a wild card)
//
// the port section can have one of four forms:
// *
// *-portnum
// portnum-*
// portnum-portnum
//
// a single * matches against all port numbers, *-portnum matches all ports
// lessthan or equal to portnum, portnum-* matches all aports greaterthan or
// equal to portnum, and portnum-portnum matches all ports between the two
// portnums, inclusive.
//
// the pathmatch section has the form:
// '*' nonquotedchars '*'
// i.e. *foo* would match any pathname containing the word foo. A single *
// matches all pathnames.
HRESULT PICSRulesParseByURL(LPSTR *ppszIn, LPVOID *ppOut, PICSRulesFileParser *pParser) { PICSRulesByURLExpression *pPRByURLExpression; PICSRulesByURL *pPRByURL; HRESULT hRes; LPSTR lpszCurrent;
pPRByURL=new PICSRulesByURL;
//first, we need to find out if we have a list of URLpatterns or a single
//URLpattern
if(**ppszIn=='(') //we have a list of patterns
{ lpszCurrent=pParser->FindNonWhite(*ppszIn+1); while(*lpszCurrent!=')') { LPSTR lpszSubString;
if(*lpszCurrent=='\0') { delete pPRByURL; pPRByURL = NULL;
return(E_INVALIDARG); }
hRes=PICSRulesParseString(&lpszCurrent,ppOut,pParser); //get the string
if(FAILED(hRes)) { //we couldn't get the string, so lets fail
delete pPRByURL; pPRByURL = NULL;
return(hRes); }
lpszSubString=(char *) *ppOut;
//we've got it, so lets instantiate the classes to fill out;
pPRByURLExpression=new PICSRulesByURLExpression;
hRes=pPRByURL->m_arrpPRByURL.Append(pPRByURLExpression) ? S_OK : E_OUTOFMEMORY; if(FAILED(hRes)) { delete lpszSubString; lpszSubString = NULL; delete pPRByURLExpression; pPRByURLExpression = NULL; delete pPRByURL; pPRByURL = NULL;
return(hRes); }
hRes=PICSRulesParseSingleByURL(lpszSubString,pPRByURLExpression,pParser); if(FAILED(hRes)) { delete lpszSubString; lpszSubString = NULL; delete pPRByURL; //deleting the array deletes the embeeded expression
pPRByURL = NULL;
return(hRes); }
delete lpszSubString; lpszSubString = NULL; }
if(*lpszCurrent==')') { *ppszIn=pParser->FindNonWhite(lpszCurrent+1); } } else //we have a single pattern
{ hRes=PICSRulesParseString(ppszIn,ppOut,pParser); //get the string
if(FAILED(hRes)) { //we couldn't get the string, so lets fail
delete pPRByURL; pPRByURL = NULL;
return(hRes); }
lpszCurrent=(char *) *ppOut;
//we've got it, so lets instantiate the classes to fill out;
pPRByURLExpression=new PICSRulesByURLExpression;
hRes=pPRByURL->m_arrpPRByURL.Append(pPRByURLExpression) ? S_OK : E_OUTOFMEMORY; if(FAILED(hRes)) { delete lpszCurrent; lpszCurrent = NULL; delete pPRByURLExpression; pPRByURLExpression = NULL; delete pPRByURL; pPRByURL = NULL;
return(hRes); }
hRes=PICSRulesParseSingleByURL(lpszCurrent,pPRByURLExpression,pParser); if(FAILED(hRes)) { delete lpszCurrent; lpszCurrent = NULL; delete pPRByURL; //deleting the array deletes the embeeded expression
pPRByURL = NULL;
return(hRes); }
delete lpszCurrent; lpszCurrent= NULL; }
*ppOut=(void *) pPRByURL;
return(NOERROR); }
HRESULT PICSRulesParseSingleByURL(LPSTR lpszByURL, PICSRulesByURLExpression *pPRByURLExpression, PICSRulesFileParser *pParser) { LPSTR lpszMarker;
lpszMarker=strchrf(lpszByURL,':'); //find the marker '://' for an internet
//pattern or ':' for a non-internet pattern
if(lpszMarker==NULL) //no marker, i.e. our string is invalid
{ return(E_INVALIDARG); }
//check the scheme for a wild card
if(*lpszByURL=='*') { if((lpszByURL+1)!=lpszMarker) //we have a non-internet scheme
{ pPRByURLExpression->m_fInternetPattern=FALSE;
*lpszMarker='\0';
pPRByURLExpression->m_etstrScheme.Set(lpszByURL);
lpszByURL=lpszMarker+1;
pPRByURLExpression->m_etstrPath.Set(lpszByURL);
return(S_OK); }
//no need to set a NonWild flag, just move
//on to the user name
pPRByURLExpression->m_bSpecified|=BYURL_SCHEME; } else { *lpszMarker='\0';
//check for an internet pattern
if((lstrcmpi(lpszByURL,szPICSRulesFTP)!=0)&& (lstrcmpi(lpszByURL,szPICSRulesHTTP)!=0)&& (lstrcmpi(lpszByURL,szPICSRulesGOPHER)!=0)&& (lstrcmpi(lpszByURL,szPICSRulesNNTP)!=0)&& (lstrcmpi(lpszByURL,szPICSRulesIRC)!=0)&& (lstrcmpi(lpszByURL,szPICSRulesPROSPERO)!=0)&& (lstrcmpi(lpszByURL,szPICSRulesTELNET)!=0)) //we've got a non-internet pattern
{ pPRByURLExpression->m_fInternetPattern=FALSE; pPRByURLExpression->m_bNonWild=BYURL_SCHEME|BYURL_PATH; pPRByURLExpression->m_bSpecified=BYURL_SCHEME|BYURL_PATH; pPRByURLExpression->m_etstrScheme.Set(lpszByURL);
lpszByURL=lpszMarker+1;
pPRByURLExpression->m_etstrPath.Set(lpszByURL);
return(S_OK); }
pPRByURLExpression->m_bNonWild|=BYURL_SCHEME; pPRByURLExpression->m_bSpecified|=BYURL_SCHEME; pPRByURLExpression->m_etstrScheme.Set(lpszByURL); }
if((*(lpszMarker+1)=='/')&&(*(lpszMarker+2)=='/')) { pPRByURLExpression->m_fInternetPattern=TRUE; lpszByURL=lpszMarker+3; } else { return(E_INVALIDARG); }
//we've got an internet pattern, and lpszURL now points
//to the user field
lpszMarker=strchrf(lpszByURL,'@'); //find the marker between user and host
if(lpszMarker!=NULL) //a user name was specified
{ pPRByURLExpression->m_bSpecified|=BYURL_USER;
//check for a wild card
if(!((*lpszByURL=='*')&&((lpszByURL+1)==lpszMarker))) { pPRByURLExpression->m_bNonWild|=BYURL_USER; *lpszMarker='\0';
pPRByURLExpression->m_etstrUser.Set(lpszByURL); }
lpszByURL=lpszMarker+1; }
//lpszByURL now points to host
lpszMarker=strchrf(lpszByURL,':');
if(lpszMarker==NULL) //the port was omitted
{ lpszMarker=strchrf(lpszByURL,'/');
if(lpszMarker!=NULL) //there is a pathmatch
{ pPRByURLExpression->m_bSpecified|=BYURL_PATH; } } else //we have a host and port
{ pPRByURLExpression->m_bSpecified|=BYURL_PORT; } pPRByURLExpression->m_bSpecified|=BYURL_HOST;
if(lpszMarker!=NULL) { *lpszMarker='\0'; }
if(lstrcmp(lpszByURL,"*")!=0) { pPRByURLExpression->m_bNonWild|=BYURL_HOST; }
pPRByURLExpression->m_etstrHost.Set(lpszByURL);
if(lpszMarker==NULL) { return(S_OK); }
lpszByURL=lpszMarker+1;
if(pPRByURLExpression->m_bSpecified&BYURL_PORT) { lpszMarker=strchrf(lpszByURL,'/');
if(lpszMarker!=NULL) //there is a pathmatch
{ pPRByURLExpression->m_bSpecified|=BYURL_PATH; *lpszMarker='\0'; }
if(!((*lpszByURL=='*')&&(lpszByURL+1==lpszMarker))) { pPRByURLExpression->m_bNonWild|=BYURL_PORT;
pPRByURLExpression->m_etstrPort.Set(lpszByURL); }
if(pPRByURLExpression->m_bSpecified&BYURL_PATH) { lpszByURL=lpszMarker+1; } }
if(pPRByURLExpression->m_bSpecified&BYURL_PATH) { if(!((*lpszByURL=='*')&&(*(lpszByURL+1)==NULL))) { pPRByURLExpression->m_bNonWild|=BYURL_PATH;
pPRByURLExpression->m_etstrPath.Set(lpszByURL); } }
return(S_OK); }
//PICSRules PolicyExpressions have 6 possible expressions:
//
// simple-expression - ( Service.Category [Operator] [Constant] )
// or-expression - ( PolicyExpression or PolicyExpression )
// and-expression - ( PolicyExpression and PolicyExpression )
// service & category - ( Service.Category )
// service only - ( Service )
// degenerate-expression - "otherwise"
//
// thus, for example, embedded expressions can take the form:
//
// "((Cool.Coolness < 3) or (Cool.Graphics < 3))"
//
// or
//
// "(((Cool.Coolness < 3) or (Cool.Graphics < 3)) and (Cool.Fun < 2))"
//
// ad infinitum
//
// thus, existing pics labels can be encoded as:
//
// "((((RSACi.s <= 0) and (RSACi.v <= 0)) and (RSACi.n <= 0)) and RSACi.l <=0)"
//
// allowable operators are: '<', '<=', '=', '>=', '>'
//
// the service only expression evaluates to TRUE iff a label from that
// service is found.
//
// the service & category expression evaluates to TRUE iff a label from
// that service is found, and it contains at least one value for the
// indicated category.
//
// the degenerate-expression always evaluates to TRUE
HRESULT PICSRulesParsePolicyExpression(LPSTR *ppszIn, LPVOID *ppOut, PICSRulesFileParser *pParser) { PICSRulesPolicyExpression *pPRPolicyExpression; HRESULT hRes; LPSTR lpszPolicyExpression,lpszCurrent;
//first lets get the string
hRes=PICSRulesParseString(ppszIn,ppOut,pParser);
if(FAILED(hRes)) { //we couldn't get the string, so lets fail
return(hRes); } lpszPolicyExpression=(char *) *ppOut;
//we've got it, so lets instantiate a PICSRulesPolicyExpression to fill out
pPRPolicyExpression=new PICSRulesPolicyExpression;
if(pPRPolicyExpression==NULL) { return(E_OUTOFMEMORY); }
pPRPolicyExpression->m_PROPolicyOperator=PR_OPERATOR_RESULT; //set as the topmost node
//of the binary tree
if(lstrcmpi(lpszPolicyExpression,szPICSRulesDegenerateExpression)==0) { //we have a degenerate expression, so delete lpszPolicyExpresion
delete lpszPolicyExpression; lpszPolicyExpression = NULL;
pPRPolicyExpression->m_PROPolicyOperator=PR_OPERATOR_DEGENERATE;
*ppOut=(LPVOID) pPRPolicyExpression;
return(NOERROR); }
//make sure we have a parenthesized object
if(*lpszPolicyExpression!='(') { delete lpszPolicyExpression; lpszPolicyExpression = NULL; delete pPRPolicyExpression; pPRPolicyExpression= NULL; return(E_INVALIDARG); } lpszCurrent=NonWhite(lpszPolicyExpression+1);
//check for an or-expression or an and-expression
if(*lpszCurrent=='(') { hRes=PICSRulesParseSubPolicyExpression(lpszCurrent,pPRPolicyExpression,pParser);
if(FAILED(hRes)) { delete lpszPolicyExpression; lpszPolicyExpression = NULL; delete pPRPolicyExpression; pPRPolicyExpression = NULL; return(hRes); } else { if((pPRPolicyExpression->m_pPRPolicyExpressionLeft)!=NULL) { BOOL fFlag; fFlag=pPRPolicyExpression->m_pPRPolicyExpressionLeft->m_prYesNoUseEmbedded.GetYesNo();
pPRPolicyExpression->m_prYesNoUseEmbedded.Set(&fFlag); } } } else //we've got a simple-expression
{ hRes=PICSRulesParseSimplePolicyExpression(lpszCurrent,pPRPolicyExpression,pParser);
if(FAILED(hRes)) { delete lpszPolicyExpression; lpszPolicyExpression = NULL; delete pPRPolicyExpression; pPRPolicyExpression= NULL;
return(hRes); } }
delete lpszPolicyExpression; lpszPolicyExpression= NULL;
*ppOut=(void *) pPRPolicyExpression;
return(NOERROR); }
//Our PolicyExpression is either an or-expression or an and-expression
//so pPRPolicyExpression need to have another PICSRulesPolicyExpression
//embedded in it, with all the details filled out.
HRESULT PICSRulesParseSubPolicyExpression(LPSTR& lpszCurrent,PICSRulesPolicyExpression *pPRPolicyExpression,PICSRulesFileParser *pParser) { HRESULT hRes; PICSRulesPolicyExpression * pPRPolicyExpressionEmbeddedLeft, * pPRPolicyExpressionEmbeddedRight; LPSTR lpszNextPolicyExpression, lpszOrAnd,lpszOrAndEnd; int iStringLen; BOOL fFlag;
lpszCurrent=NonWhite(lpszCurrent+1);
//check for nested or-expressions and and-expressions
if(*lpszCurrent=='(') { pPRPolicyExpressionEmbeddedLeft=new PICSRulesPolicyExpression;
if(pPRPolicyExpressionEmbeddedLeft==NULL) { return(E_OUTOFMEMORY); }
pPRPolicyExpressionEmbeddedLeft->m_PROPolicyOperator=PR_OPERATOR_RESULT;
hRes=PICSRulesParseSubPolicyExpression(lpszCurrent,pPRPolicyExpressionEmbeddedLeft,pParser);
if(FAILED(hRes)) { delete pPRPolicyExpressionEmbeddedLeft; pPRPolicyExpressionEmbeddedLeft = NULL;
return(hRes); }
pPRPolicyExpression->m_pPRPolicyExpressionLeft=pPRPolicyExpressionEmbeddedLeft; fFlag=pPRPolicyExpressionEmbeddedLeft->m_prYesNoUseEmbedded.GetYesNo();
pPRPolicyExpression->m_prYesNoUseEmbedded.Set(&fFlag); } else //only one level deep
{ pPRPolicyExpressionEmbeddedLeft=new PICSRulesPolicyExpression;
if(pPRPolicyExpressionEmbeddedLeft==NULL) { return(E_OUTOFMEMORY); }
hRes=PICSRulesParseSimplePolicyExpression(lpszCurrent,pPRPolicyExpressionEmbeddedLeft,pParser);
if(FAILED(hRes)) { delete pPRPolicyExpressionEmbeddedLeft; pPRPolicyExpressionEmbeddedLeft= NULL;
return(hRes); }
pPRPolicyExpression->m_pPRPolicyExpressionLeft=pPRPolicyExpressionEmbeddedLeft;
fFlag=pPRPolicyExpressionEmbeddedLeft->m_prYesNoUseEmbedded.GetYesNo();
pPRPolicyExpression->m_prYesNoUseEmbedded.Set(&fFlag);
lpszCurrent=strchrf(lpszCurrent,')'); lpszCurrent=NonWhite(lpszCurrent+1); }
lpszNextPolicyExpression=strchrf(lpszCurrent,'('); if(lpszNextPolicyExpression==NULL) //invalid policy expression
{ return(E_INVALIDARG); }
lpszOrAndEnd=White(lpszCurrent);
if(lpszOrAndEnd>lpszNextPolicyExpression) //no white space
{ lpszOrAndEnd=lpszNextPolicyExpression; }
iStringLen=(int) (lpszOrAndEnd-lpszCurrent);
lpszOrAnd=new char[iStringLen+1];
if(lpszOrAnd==NULL) { return(E_OUTOFMEMORY); }
memcpyf(lpszOrAnd,lpszCurrent,iStringLen); lpszOrAnd[iStringLen]='\0';
if(lstrcmpi(lpszOrAnd,szPICSRulesAnd)==0) { pPRPolicyExpression->m_PRPEPolicyEmbedded=PR_POLICYEMBEDDED_AND; } else if(lstrcmpi(lpszOrAnd,szPICSRulesOr)==0) { pPRPolicyExpression->m_PRPEPolicyEmbedded=PR_POLICYEMBEDDED_OR; } else { delete lpszOrAnd; lpszOrAnd = NULL;
return(E_INVALIDARG); }
delete lpszOrAnd; lpszOrAnd= NULL;
lpszCurrent=NonWhite(lpszOrAndEnd+1);
if(lpszCurrent!=lpszNextPolicyExpression) { return(E_INVALIDARG); }
lpszCurrent=NonWhite(lpszCurrent+1);
//do we have more embedded objects, or another simple-expression?
if(*lpszCurrent=='(') //more embedded
{ pPRPolicyExpressionEmbeddedRight=new PICSRulesPolicyExpression;
if(pPRPolicyExpressionEmbeddedRight==NULL) { return(E_OUTOFMEMORY); }
pPRPolicyExpressionEmbeddedRight->m_PROPolicyOperator=PR_OPERATOR_RESULT; hRes=PICSRulesParseSubPolicyExpression(lpszCurrent,pPRPolicyExpressionEmbeddedRight,pParser);
if(FAILED(hRes)) { return(hRes); }
if(*lpszCurrent!=')') { delete pPRPolicyExpressionEmbeddedRight; pPRPolicyExpressionEmbeddedRight= NULL;
return(E_INVALIDARG); }
lpszCurrent=NonWhite(lpszCurrent+1);
pPRPolicyExpression->m_pPRPolicyExpressionRight=pPRPolicyExpressionEmbeddedRight;
fFlag=pPRPolicyExpressionEmbeddedRight->m_prYesNoUseEmbedded.GetYesNo();
pPRPolicyExpression->m_prYesNoUseEmbedded.Set(&fFlag); } else //simple expression
{ pPRPolicyExpressionEmbeddedRight=new PICSRulesPolicyExpression;
if(pPRPolicyExpressionEmbeddedRight==NULL) { return(E_OUTOFMEMORY); }
hRes=PICSRulesParseSimplePolicyExpression(lpszCurrent,pPRPolicyExpressionEmbeddedRight,pParser);
if(FAILED(hRes)) { delete pPRPolicyExpressionEmbeddedRight; pPRPolicyExpressionEmbeddedRight = NULL;
return(hRes); }
lpszCurrent=strchrf(lpszCurrent,')'); lpszCurrent=NonWhite(lpszCurrent+1);
if(*lpszCurrent!=')') { delete pPRPolicyExpressionEmbeddedRight; pPRPolicyExpressionEmbeddedRight= NULL;
return(E_INVALIDARG); }
lpszCurrent=NonWhite(lpszCurrent+1);
pPRPolicyExpression->m_pPRPolicyExpressionRight=pPRPolicyExpressionEmbeddedRight;
fFlag=pPRPolicyExpressionEmbeddedRight->m_prYesNoUseEmbedded.GetYesNo();
pPRPolicyExpression->m_prYesNoUseEmbedded.Set(&fFlag); }
return(S_OK); }
HRESULT PICSRulesParseSimplePolicyExpression(LPSTR& lpszCurrent,PICSRulesPolicyExpression *pPRPolicyExpression,PICSRulesFileParser *pParser) { LPSTR lpszEnd,lpszDot; PICSRulesServiceInfo *pPRServiceInfo=NULL; lpszEnd=strchrf(lpszCurrent,')');
if(lpszEnd==NULL) //we don't have a valid expression
{ return(E_INVALIDARG); }
lpszDot=strchrf(lpszCurrent,'.');
if(lpszDot==NULL) //we have a service only expression
{ LPSTR lpszService,lpszServiceEnd,lpszFullService; int iStringLen;
lpszServiceEnd=White(lpszCurrent); if(lpszServiceEnd>lpszEnd) //there isn't any white space between
//the service name and the closing
//parenthesis
{ lpszServiceEnd=lpszEnd; }
iStringLen=(int)(lpszServiceEnd-lpszCurrent);
lpszService=new char[iStringLen+1];
if(lpszService==NULL) { return(E_OUTOFMEMORY); }
memcpyf(lpszService,lpszCurrent,iStringLen); lpszService[iStringLen]='\0';
lpszFullService=new char[INTERNET_MAX_URL_LENGTH+1];
if(IsServiceDefined(lpszService,lpszFullService,&pPRServiceInfo)==FALSE) { delete lpszService; lpszService = NULL;
delete lpszFullService; lpszFullService = NULL; return(PICSRULES_E_SERVICEUNDEFINED); }
//we have a valid service only expression
if(pPRServiceInfo!=NULL) { BOOL fFlag;
fFlag=pPRServiceInfo->m_prYesNoUseEmbedded.GetYesNo(); pPRPolicyExpression->m_prYesNoUseEmbedded.Set(&fFlag); }
pPRPolicyExpression->m_etstrServiceName.SetTo(lpszService); pPRPolicyExpression->m_etstrFullServiceName.SetTo(lpszFullService); pPRPolicyExpression->m_PROPolicyOperator=PR_OPERATOR_SERVICEONLY; } else //could be service and category or a full simple-expression
{ LPSTR lpszService,lpszCategory,lpszCategoryEnd,lpszOperator,lpszFullService; int iStringLen;
lpszCategoryEnd=White(lpszCurrent); if(lpszCategoryEnd>lpszEnd) //there isn't any white space between
//the category name and the closing
//parenthesis
{ lpszCategoryEnd=lpszEnd; }
lpszOperator=strchrf(lpszCurrent,'<');
if(lpszOperator!=NULL) { if(lpszOperator<lpszCategoryEnd) //there was an operator with
//no white space
{ lpszCategoryEnd=lpszOperator; } }
lpszOperator=strchrf(lpszCurrent,'>');
if(lpszOperator!=NULL) { if(lpszOperator<lpszCategoryEnd) //there was an operator with
//no white space
{ lpszCategoryEnd=lpszOperator; } }
lpszOperator=strchrf(lpszCurrent,'=');
if(lpszOperator!=NULL) { if(lpszOperator<lpszCategoryEnd) //there was an operator with
//no white space
{ lpszCategoryEnd=lpszOperator; } }
iStringLen=(int)(lpszDot-lpszCurrent);
lpszService=new char[iStringLen+1];
if(lpszService==NULL) { return(E_OUTOFMEMORY); }
memcpyf(lpszService,lpszCurrent,iStringLen); lpszService[iStringLen]='\0';
lpszFullService=new char[INTERNET_MAX_URL_LENGTH+1];
if(IsServiceDefined(lpszService,lpszFullService,&pPRServiceInfo)==FALSE) { delete lpszService; lpszService = NULL;
delete lpszFullService; lpszFullService= NULL; return(PICSRULES_E_SERVICEUNDEFINED); }
iStringLen=(int)(lpszCategoryEnd-lpszDot-1); lpszCategory=new char[iStringLen+1];
if(lpszCategory==NULL) { return(E_OUTOFMEMORY); }
memcpyf(lpszCategory,lpszDot+1,iStringLen); lpszCategory[iStringLen]='\0';
lpszCurrent=NonWhite(lpszCategoryEnd);
if(*lpszCurrent==')') //we have a valid service and category expression
{ if(pPRServiceInfo!=NULL) { BOOL fFlag;
fFlag=pPRServiceInfo->m_prYesNoUseEmbedded.GetYesNo(); pPRPolicyExpression->m_prYesNoUseEmbedded.Set(&fFlag); }
pPRPolicyExpression->m_etstrServiceName.SetTo(lpszService); pPRPolicyExpression->m_etstrFullServiceName.SetTo(lpszFullService); pPRPolicyExpression->m_etstrCategoryName.SetTo(lpszCategory); pPRPolicyExpression->m_PROPolicyOperator=PR_OPERATOR_SERVICEANDCATEGORY; } else //we have a full simple-expression
{ //lpszCurrent should be pointing to an operator
enum PICSRulesOperators PROPolicyOperator; int iValue;
switch(*lpszCurrent) { case '>': { if(*(lpszCurrent+1)=='=') { PROPolicyOperator=PR_OPERATOR_GREATEROREQUAL; lpszCurrent=NonWhite(lpszCurrent+2); } else { PROPolicyOperator=PR_OPERATOR_GREATER; lpszCurrent=NonWhite(lpszCurrent+1); }
break; } case '<': { if(*(lpszCurrent+1)=='=') { PROPolicyOperator=PR_OPERATOR_LESSOREQUAL; lpszCurrent=NonWhite(lpszCurrent+2); } else { PROPolicyOperator=PR_OPERATOR_LESS; lpszCurrent=NonWhite(lpszCurrent+1); }
break; } case '=': { PROPolicyOperator=PR_OPERATOR_EQUAL; lpszCurrent=NonWhite(lpszCurrent+1);
break; } default: //we didn't get a valid operator
{ delete lpszService; lpszService = NULL;
delete lpszCategory; lpszCategory = NULL; return(E_INVALIDARG); } }
//lpszCurrent now points at the Value
if(FAILED(ParseNumber(&lpszCurrent,&iValue,FALSE))) { delete lpszService; lpszService = NULL;
delete lpszCategory; lpszCategory = NULL;
return(E_INVALIDARG); }
if(*lpszCurrent!=')') //we should be done, so the argument is invalid
{ delete lpszService; lpszService = NULL;
delete lpszCategory; lpszCategory = NULL;
return(E_INVALIDARG); }
//we now have a complete simple-expression
if(pPRServiceInfo!=NULL) { BOOL fFlag;
fFlag=pPRServiceInfo->m_prYesNoUseEmbedded.GetYesNo(); pPRPolicyExpression->m_prYesNoUseEmbedded.Set(&fFlag); }
pPRPolicyExpression->m_etstrServiceName.SetTo(lpszService); pPRPolicyExpression->m_etstrFullServiceName.SetTo(lpszFullService); pPRPolicyExpression->m_etstrCategoryName.SetTo(lpszCategory); pPRPolicyExpression->m_etnValue.Set(iValue); pPRPolicyExpression->m_PROPolicyOperator=PROPolicyOperator; } }
return(S_OK); }
//Determines if the service name in lpszService has been read in a
//ServiceInfo section of the PICSRules file
BOOL IsServiceDefined(LPSTR lpszService,LPSTR lpszFullService,PICSRulesServiceInfo **ppServiceInfo) { array<PICSRulesServiceInfo*> *arrpPRServiceInfo; LPSTR lpszShortName; int iNumServices,iCounter; BOOL fDefined=FALSE;
if(g_pPRRS==NULL) { return(FALSE); }
arrpPRServiceInfo=(array<PICSRulesServiceInfo*> *) &(g_pPRRS->m_arrpPRServiceInfo);
iNumServices=arrpPRServiceInfo->Length();
for(iCounter=0;iCounter<iNumServices;iCounter++) { PICSRulesServiceInfo * pPRServiceInfo; pPRServiceInfo=(*arrpPRServiceInfo)[iCounter];
lpszShortName=pPRServiceInfo->m_etstrShortName.Get();
if(lstrcmp(lpszService,lpszShortName)==0) { fDefined=TRUE;
if(ppServiceInfo!=NULL) { *ppServiceInfo=pPRServiceInfo; }
lstrcpy(lpszFullService,pPRServiceInfo->m_prURLName.Get());
break; } }
return(fDefined); }
//Determines if the extension name in lpszExtension has been read in a
//OptExtension of the PICSRules file
BOOL IsOptExtensionDefined(LPSTR lpszExtension) { array<PICSRulesOptExtension*> *arrpPROptExtension; LPSTR lpszShortName; int iNumExtensions,iCounter; BOOL fDefined=FALSE;
if(g_pPRRS==NULL) { return(FALSE); }
arrpPROptExtension=(array<PICSRulesOptExtension*> *) &(g_pPRRS->m_arrpPROptExtension);
iNumExtensions=arrpPROptExtension->Length();
for(iCounter=0;iCounter<iNumExtensions;iCounter++) { PICSRulesOptExtension * pPROptExtension; pPROptExtension=(*arrpPROptExtension)[iCounter];
lpszShortName=pPROptExtension->m_etstrShortName.Get();
if(lstrcmp(lpszExtension,lpszShortName)==0) { fDefined=TRUE; break; } }
return(fDefined); }
//Deteremines is the extension name in lpszExtension has been read in a
//ReqExtension of the PICSRules file
BOOL IsReqExtensionDefined(LPSTR lpszExtension) { array<PICSRulesReqExtension*> *arrpPRReqExtension; LPSTR lpszShortName; int iNumExtensions,iCounter; BOOL fDefined=FALSE;
if(g_pPRRS==NULL) { return(FALSE); }
arrpPRReqExtension=(array<PICSRulesReqExtension*> *) &(g_pPRRS->m_arrpPRReqExtension);
iNumExtensions=arrpPRReqExtension->Length();
for(iCounter=0;iCounter<iNumExtensions;iCounter++) { PICSRulesReqExtension * pPRReqExtension; pPRReqExtension=(*arrpPRReqExtension)[iCounter];
lpszShortName=pPRReqExtension->m_etstrShortName.Get();
if(lstrcmp(lpszExtension,lpszShortName)==0) { fDefined=TRUE; break; } }
return(fDefined); }
PICSRulesAllowableOption aaoPICSRulesName[] = { { PROID_RULENAME, 0 }, { PROID_DESCRIPTION, 0 }, { PROID_EXTENSION, 0 }, { PROID_INVALID, 0 } }; const UINT caoPICSRulesName=sizeof(aaoPICSRulesName)/sizeof(aaoPICSRulesName[0]);
HRESULT PICSRulesParseName(LPSTR *ppszIn, LPVOID *ppOut, PICSRulesFileParser *pParser) { //We must make a copy of the allowable options array because the
//parser will fiddle with the flags in the entries -- specifically,
//setting AO_SEEN. It wouldn't be thread-safe to do this to a
//static array.
PICSRulesAllowableOption aao[caoPICSRulesName];
::memcpyf(aao,::aaoPICSRulesName,sizeof(aao));
PICSRulesName *pName=new PICSRulesName; if(pName==NULL) { return E_OUTOFMEMORY; }
HRESULT hres=pParser->ParseParenthesizedObject( ppszIn, //var containing current ptr
aao, //what's legal in this object
pName); //object to add items back to
if (FAILED(hres)) { delete pName; pName = NULL; return hres; }
*ppOut=(LPVOID) pName;
return NOERROR; }
PICSRulesAllowableOption aaoPICSRulesSource[] = { { PROID_SOURCEURL, 0 }, { PROID_CREATIONTOOL, 0 }, { PROID_AUTHOR, 0 }, { PROID_LASTMODIFIED, 0 }, { PROID_EXTENSION, 0 }, { PROID_INVALID, 0 } }; const UINT caoPICSRulesSource=sizeof(aaoPICSRulesSource)/sizeof(aaoPICSRulesSource[0]);
HRESULT PICSRulesParseSource(LPSTR *ppszIn, LPVOID *ppOut, PICSRulesFileParser *pParser) { //We must make a copy of the allowable options array because the
//parser will fiddle with the flags in the entries -- specifically,
//setting AO_SEEN. It wouldn't be thread-safe to do this to a
//static array.
PICSRulesAllowableOption aao[caoPICSRulesSource];
::memcpyf(aao,::aaoPICSRulesSource,sizeof(aao));
PICSRulesSource *pSource=new PICSRulesSource; if(pSource==NULL) { return E_OUTOFMEMORY; }
HRESULT hres=pParser->ParseParenthesizedObject( ppszIn, //var containing current ptr
aao, //what's legal in this object
pSource); //object to add items back to
if (FAILED(hres)) { delete pSource; pSource = NULL; return hres; }
*ppOut=(LPVOID) pSource;
return NOERROR; }
PICSRulesAllowableOption aaoPICSRulesServiceInfo[] = { { PROID_SINAME, AO_SINGLE }, { PROID_SHORTNAME, AO_SINGLE }, { PROID_BUREAUURL, 0 }, { PROID_USEEMBEDDED, AO_SINGLE }, { PROID_RATFILE, AO_SINGLE }, { PROID_BUREAUUNAVAILABLE, AO_SINGLE }, { PROID_EXTENSION, 0 }, { PROID_INVALID, 0 } }; const UINT caoPICSRulesServiceInfo=sizeof(aaoPICSRulesServiceInfo)/sizeof(aaoPICSRulesServiceInfo[0]);
HRESULT PICSRulesParseServiceInfo(LPSTR *ppszIn, LPVOID *ppOut, PICSRulesFileParser *pParser) { //We must make a copy of the allowable options array because the
//parser will fiddle with the flags in the entries -- specifically,
//setting AO_SEEN. It wouldn't be thread-safe to do this to a
//static array.
PICSRulesAllowableOption aao[caoPICSRulesServiceInfo];
::memcpyf(aao,::aaoPICSRulesServiceInfo,sizeof(aao));
PICSRulesServiceInfo *pServiceInfo=new PICSRulesServiceInfo; if(pServiceInfo==NULL) { return E_OUTOFMEMORY; }
HRESULT hres=pParser->ParseParenthesizedObject( ppszIn, //var containing current ptr
aao, //what's legal in this object
pServiceInfo); //object to add items back to
if (FAILED(hres)) { delete pServiceInfo; pServiceInfo = NULL; return hres; }
*ppOut=(LPVOID) pServiceInfo;
return NOERROR; }
PICSRulesAllowableOption aaoPICSRulesOptExtension[] = { { PROID_EXTENSIONNAME, AO_SINGLE }, { PROID_SHORTNAME, AO_SINGLE }, { PROID_EXTENSION, 0 }, { PROID_INVALID, 0 } }; const UINT caoPICSRulesOptExtension=sizeof(aaoPICSRulesOptExtension)/sizeof(aaoPICSRulesOptExtension[0]);
HRESULT PICSRulesParseOptExtension(LPSTR *ppszIn, LPVOID *ppOut, PICSRulesFileParser *pParser) { //We must make a copy of the allowable options array because the
//parser will fiddle with the flags in the entries -- specifically,
//setting AO_SEEN. It wouldn't be thread-safe to do this to a
//static array.
PICSRulesAllowableOption aao[caoPICSRulesOptExtension];
::memcpyf(aao,::aaoPICSRulesOptExtension,sizeof(aao));
PICSRulesOptExtension *pOptExtension=new PICSRulesOptExtension; if(pOptExtension==NULL) { return E_OUTOFMEMORY; }
HRESULT hres=pParser->ParseParenthesizedObject( ppszIn, //var containing current ptr
aao, //what's legal in this object
pOptExtension); //object to add items back to
if (FAILED(hres)) { delete pOptExtension; pOptExtension = NULL; return hres; }
*ppOut=(LPVOID) pOptExtension;
return NOERROR; }
PICSRulesAllowableOption aaoPICSRulesReqExtension[] = { { PROID_EXTENSIONNAME, AO_SINGLE }, { PROID_SHORTNAME, AO_SINGLE }, { PROID_EXTENSION, 0 }, { PROID_INVALID, 0 } }; const UINT caoPICSRulesReqExtension=sizeof(aaoPICSRulesReqExtension)/sizeof(aaoPICSRulesReqExtension[0]);
HRESULT PICSRulesParseReqExtension(LPSTR *ppszIn, LPVOID *ppOut, PICSRulesFileParser *pParser) { //We must make a copy of the allowable options array because the
//parser will fiddle with the flags in the entries -- specifically,
//setting AO_SEEN. It wouldn't be thread-safe to do this to a
//static array.
PICSRulesAllowableOption aao[caoPICSRulesReqExtension];
::memcpyf(aao,::aaoPICSRulesReqExtension,sizeof(aao));
PICSRulesReqExtension *pReqExtension=new PICSRulesReqExtension; if(pReqExtension==NULL) { return E_OUTOFMEMORY; }
HRESULT hres=pParser->ParseParenthesizedObject( ppszIn, //var containing current ptr
aao, //what's legal in this object
pReqExtension); //object to add items back to
if (FAILED(hres)) { delete pReqExtension; pReqExtension = NULL; return hres; }
*ppOut=(LPVOID) pReqExtension;
return NOERROR; }
//Currently, we acknowledge no extensions. If support for an extension
//needs to be added in the future, a PICSRulesParseExtensionName function
//should be added, similar to the other PICSRulesParseSection functions.
//This function should be called after confirming the extension string
//here.
//
//For now, we just eat the extensions
HRESULT PICSRulesParseExtension(LPSTR *ppszIn, LPVOID *ppOut, PICSRulesFileParser *pParser) { LPTSTR lpszExtension,lpszEnd;
lpszEnd=strchrf(*ppszIn,'.'); if(lpszEnd==NULL) { return(PICSRULES_E_UNKNOWNITEM); }
*lpszEnd='\0';
//*ppszIn now points to the extension name
//if we ever implement support for extensions, we'll need to do a comparison
//here. After the comparison is completed, the following code will point
//to the extension's method.
*ppszIn=lpszEnd+1;
lpszEnd=strchrf(*ppszIn,'('); if(lpszEnd==NULL) { return(PICSRULES_E_EXPECTEDLEFT); }
lpszExtension=White(*ppszIn);
if((lpszExtension!=NULL)&&(lpszExtension<lpszEnd)) { *lpszExtension='\0'; } else { *lpszEnd='\0'; }
lpszExtension=*ppszIn;
//lpszExtension now points to the clause on the given extension name
//if we ever implement support for extensions, we'll need to do a comparison
//here. Using both this comparison and the one above, a callback needs
//to be implemented to support the extension, for now we'll just parse to
//the closing parenthesis and eat the extension.
*ppszIn=lpszEnd+1;
int iOpenParenthesis=1;
do { if(**ppszIn=='(') { iOpenParenthesis++; } else if (**ppszIn==')') { iOpenParenthesis--;
if(iOpenParenthesis==0) { break; } }
*ppszIn=pParser->FindNonWhite(*ppszIn+1);
} while (**ppszIn!='\0');
if(**ppszIn=='\0') { return(PICSRULES_E_EXPECTEDRIGHT); } else { *ppszIn=pParser->FindNonWhite(*ppszIn+1); }
*ppOut=(LPVOID) NULL;
return NOERROR; }
//*******************************************************************
//*
//* Code for the PICSRulesRatingSystem class
//*
//*******************************************************************
PICSRulesRatingSystem::PICSRulesRatingSystem() : m_dwFlags(0), m_nErrLine(0) { // nothing to do but construct members
}
PICSRulesRatingSystem::~PICSRulesRatingSystem() { m_arrpPRPolicy.DeleteAll(); m_arrpPRServiceInfo.DeleteAll(); m_arrpPROptExtension.DeleteAll(); m_arrpPRReqExtension.DeleteAll(); }
HRESULT PICSRulesRatingSystem::InitializeMyDefaults() { return NOERROR; //no defaults to initialize
}
//Allowable options from within PICSRulesRaginSystem's scope include only the
//first teer of aaoPICSRules[] defined in picsrule.h
PICSRulesAllowableOption aaoPICSRulesRatingSystem[] = { { PROID_PICSVERSION, 0 }, { PROID_POLICY, AO_MANDATORY }, { PROID_NAME, AO_SINGLE }, { PROID_SOURCE, AO_SINGLE }, { PROID_SERVICEINFO, 0 }, { PROID_OPTEXTENSION, 0 }, { PROID_REQEXTENSION, 0 }, { PROID_EXTENSION, 0 },
{ PROID_INVALID, 0 } }; const UINT caoPICSRulesRatingSystem=sizeof(aaoPICSRulesRatingSystem)/sizeof(aaoPICSRulesRatingSystem[0]);
//The following array is indexed by PICSRulesObjectID values.
//PICSRulesObjectHandler is defined in mslubase.h as:
//typedef HRESULT (*PICSRulesObjectHandler)(LPSTR *ppszIn, LPVOID *ppOut, PICSRulesFileParser *pParser);
struct { LPCSTR lpszToken; //token by which we identify it
PICSRulesObjectHandler pHandler; //function which parses the object's contents
} aPRObjectDescriptions[] = { { szNULL, NULL }, { szPICSRulesVersion, PICSRulesParseVersion }, { szPICSRulesPolicy, PICSRulesParsePolicy }, { szPICSRulesExplanation, PICSRulesParseString }, { szPICSRulesRejectByURL, PICSRulesParseByURL }, { szPICSRulesAcceptByURL, PICSRulesParseByURL }, { szPICSRulesRejectIf, PICSRulesParsePolicyExpression }, { szPICSRulesAcceptIf, PICSRulesParsePolicyExpression }, { szPICSRulesAcceptUnless, PICSRulesParsePolicyExpression }, { szPICSRulesRejectUnless, PICSRulesParsePolicyExpression }, { szPICSRulesName, PICSRulesParseName }, { szPICSRulesRuleName, PICSRulesParseString }, { szPICSRulesDescription, PICSRulesParseString }, { szPICSRulesSource, PICSRulesParseSource }, { szPICSRulesSourceURL, PICSRulesParseString }, { szPICSRulesCreationTool, PICSRulesParseString }, { szPICSRulesAuthor, PICSRulesParseString }, { szPICSRulesLastModified, PICSRulesParseString }, { szPICSRulesServiceInfo, PICSRulesParseServiceInfo }, { szPICSRulesSIName, PICSRulesParseString }, { szPICSRulesShortName, PICSRulesParseString }, { szPICSRulesBureauURL, PICSRulesParseString }, { szPICSRulesUseEmbedded, PICSRulesParseYesNo }, { szPICSRulesRATFile, PICSRulesParseString }, { szPICSRulesBureauUnavailable, PICSRulesParsePassFail }, { szPICSRulesOptExtension, PICSRulesParseOptExtension }, { szPICSRulesExtensionName, PICSRulesParseString }, //{ szPICSRulesShortName, PICSRulesParseString },
{ szPICSRulesReqExtension, PICSRulesParseReqExtension }, //{ szPICSRulesExtensionName, PICSRulesParseString },
//{ szPICSRulesShortName, PICSRulesParseString },
{ szPICSRulesExtension, PICSRulesParseExtension }, { szPICSRulesOptionDefault, PICSRulesParseString }, { szPICSRulesOptionDefault, PICSRulesParseString }, { szPICSRulesOptionDefault, PICSRulesParseString }, { szPICSRulesOptionDefault, PICSRulesParseString }, { szPICSRulesOptionDefault, PICSRulesParseString }, { szPICSRulesOptionDefault, PICSRulesParseString } };
HRESULT PICSRulesRatingSystem::Parse(LPCSTR pszFilename, LPSTR pIn) { //This guy is small enough to just init directly on the stack
PICSRulesAllowableOption aaoRoot[] = { { PROID_PICSVERSION, 0 }, { PROID_INVALID, 0 } }; PICSRulesAllowableOption aao[caoPICSRulesRatingSystem];
::memcpyf(aao,::aaoPICSRulesRatingSystem,sizeof(aao));
PICSRulesAllowableOption *pFound;
PICSRulesFileParser parser;
LPSTR lpszVersionDash=strchrf(pIn,'-'); //since this is the first
//time through, we need to
//prepare the PicsRule
//token for the parser
if(lpszVersionDash!=NULL) //check for no dash we'll
//fail in ParseToOpening
//if this is the case
{ *lpszVersionDash=' '; //set it up for the parser
}
HRESULT hres=parser.ParseToOpening(&pIn,aaoRoot,&pFound);
if (FAILED(hres)) { return hres; //some error early on
} else //we got the PicsRule tag
//now we need to check
//the version number
{ LPSTR lpszDot=strchrf(pIn,'.'); if(lpszDot!=NULL) //continue on and fail
//in ParseParenthesizedObject
{ int iVersion;
*lpszDot=' ';
ParseNumber(&pIn,&iVersion,TRUE); m_etnPRVerMajor.Set(iVersion);
pIn=parser.FindNonWhite(pIn);
ParseNumber(&pIn,&iVersion,TRUE); m_etnPRVerMinor.Set(iVersion);
pIn=parser.FindNonWhite(pIn); } }
//we'll fail if the version is 1.0, or 2.0 or higher
//versions 1.1 - 2.0 (not including 2.0) will pass
int iVerNumber=m_etnPRVerMajor.Get();
if(iVerNumber!=1) { hres=PICSRULES_E_VERSION; m_nErrLine=parser.m_nLine;
return(hres); } else //check the minor version number
{ iVerNumber=m_etnPRVerMinor.Get();
if(iVerNumber==0) { hres=PICSRULES_E_VERSION; m_nErrLine=parser.m_nLine;
return(hres); } }
hres=parser.ParseParenthesizedObject( &pIn, //var containing current ptr
aao, //what's legal in this object
this); //object to add items back to
if(SUCCEEDED(hres)) { if(*pIn!=')') //check for a closing parenthesis
{ hres=PICSRULES_E_EXPECTEDRIGHT; } else { LPTSTR lpszEnd=NonWhite(pIn+1);
if(*lpszEnd!='\0') // make sure we're at the end of the file
{ hres=PICSRULES_E_EXPECTEDEND; } } }
if(FAILED(hres)) { m_nErrLine=parser.m_nLine; }
return hres; }
HRESULT PICSRulesRatingSystem::AddItem(PICSRulesObjectID roid, LPVOID pData) { HRESULT hres = S_OK;
switch (roid) { case PROID_PICSVERSION: { //Takes a pointer to a PICSRULES_VERSION struct (defined in picsrule.h)
PICSRULES_VERSION * PRVer;
if(PRVer=((PICSRULES_VERSION *) pData)) { m_etnPRVerMajor.Set(PRVer->iPICSRulesVerMajor); m_etnPRVerMinor.Set(PRVer->iPICSRulesVerMinor); } else { hres=E_INVALIDARG; }
break; } case PROID_OPTEXTENSION: { PICSRulesOptExtension *pOptExtension;
if(pOptExtension=((PICSRulesOptExtension *) pData)) { hres=m_arrpPROptExtension.Append(pOptExtension) ? S_OK : E_OUTOFMEMORY; if (FAILED(hres)) { delete pOptExtension; pOptExtension = NULL; } } else { hres=E_INVALIDARG; }
break; } case PROID_REQEXTENSION: { PICSRulesReqExtension *pReqExtension;
if(pReqExtension=((PICSRulesReqExtension *) pData)) { hres=m_arrpPRReqExtension.Append(pReqExtension) ? S_OK : E_OUTOFMEMORY; if (FAILED(hres)) { delete pReqExtension; pReqExtension= NULL; } } else { hres=E_INVALIDARG; }
break; } case PROID_POLICY: { PICSRulesPolicy *pPolicy; if(pPolicy=((PICSRulesPolicy *) pData)) { hres=m_arrpPRPolicy.Append(pPolicy) ? S_OK : E_OUTOFMEMORY; if (FAILED(hres)) { delete pPolicy; pPolicy = NULL; } } else { hres=E_INVALIDARG; }
break; } case PROID_NAME: { PICSRulesName *pName; if(pName=((PICSRulesName *) pData)) { m_pPRName=pName; } else { hres=E_INVALIDARG; }
break; } case PROID_SOURCE: { PICSRulesSource *pSource; if(pSource=((PICSRulesSource *) pData)) { m_pPRSource=pSource; } else { hres=E_INVALIDARG; }
break; } case PROID_SERVICEINFO: { PICSRulesServiceInfo *pServiceInfo; if(pServiceInfo=((PICSRulesServiceInfo *) pData)) { hres=m_arrpPRServiceInfo.Append(pServiceInfo) ? S_OK : E_OUTOFMEMORY; if (FAILED(hres)) { delete pServiceInfo; pServiceInfo = NULL; } } else { hres=E_INVALIDARG; }
break; } case PROID_EXTENSION: { //just eat extensions
break; } case PROID_INVALID: default: { ASSERT(FALSE); // shouldn't have been given a PROID that wasn't in
// the table we passed to the parser!
hres=E_UNEXPECTED; break; } } return hres; }
void PICSRulesRatingSystem::ReportError(HRESULT hres) { UINT idMsg,idTemplate; WCHAR szErrorMessage[MAX_PATH],szErrorTitle[MAX_PATH], szLoadStringTemp[MAX_PATH]; //we may be reporting E_OUTOFMEMORY, so we'll keep our string memory
//on the stack so that its gauranteed to be there
if((hres==E_OUTOFMEMORY)||((hres>PICSRULES_E_BASE)&&(hres<=PICSRULES_E_BASE+0xffff))) { idTemplate=IDS_PICSRULES_SYNTAX_TEMPLATE; //default is PICSRules content error
switch(hres) { case E_OUTOFMEMORY: { idMsg=IDS_PICSRULES_MEMORY; idTemplate=IDS_PICSRULES_GENERIC_TEMPLATE; break; } case PICSRULES_E_EXPECTEDLEFT: { idMsg=IDS_PICSRULES_EXPECTEDLEFT; break; } case PICSRULES_E_EXPECTEDRIGHT: { idMsg=IDS_PICSRULES_EXPECTEDRIGHT; break; } case PICSRULES_E_EXPECTEDTOKEN: { idMsg=IDS_PICSRULES_EXPECTEDTOKEN; break; } case PICSRULES_E_EXPECTEDSTRING: { idMsg=IDS_PICSRULES_EXPECTEDSTRING; break; } case PICSRULES_E_EXPECTEDNUMBER: { idMsg=IDS_PICSRULES_EXPECTEDNUMBER; break; } case PICSRULES_E_EXPECTEDBOOL: { idMsg=IDS_PICSRULES_EXPECTEDBOOL; break; } case PICSRULES_E_DUPLICATEITEM: { idMsg=IDS_PICSRULES_DUPLICATEITEM; break; } case PICSRULES_E_MISSINGITEM: { idMsg=IDS_PICSRULES_MISSINGITEM; break; } case PICSRULES_E_UNKNOWNITEM: { idMsg=IDS_PICSRULES_UNKNOWNITEM; break; } case PICSRULES_E_UNKNOWNMANDATORY: { idMsg=IDS_PICSRULES_UNKNOWNMANDATORY; break; } case PICSRULES_E_SERVICEUNDEFINED: { idMsg=IDS_PICSRULES_SERVICEUNDEFINED; break; } case PICSRULES_E_EXPECTEDEND: { idMsg=IDS_PICSRULES_EXPECTEDEND;
break; } case PICSRULES_E_REQEXTENSIONUSED: { idTemplate=IDS_PICSRULES_GENERIC_TEMPLATE; idMsg=IDS_PICSRULES_REQEXTENSIONUSED;
break; } case PICSRULES_E_VERSION: { idTemplate=IDS_PICSRULES_GENERIC_TEMPLATE; idMsg=IDS_PICSRULES_BADVERSION;
break; } default: { ASSERT(FALSE); //there aren't any other PICSRULES_E_ errors
idMsg=IDS_PICSRULES_UNKNOWNERROR; break; } }
MLLoadString(idTemplate,(LPTSTR) szLoadStringTemp,MAX_PATH); wsprintf((LPTSTR) szErrorMessage,(LPTSTR) szLoadStringTemp,m_etstrFile.Get());
MLLoadString(idMsg,(LPTSTR) szLoadStringTemp,MAX_PATH); wsprintf((LPTSTR) szErrorTitle,(LPTSTR) szLoadStringTemp,m_nErrLine);
lstrcat((LPTSTR) szErrorMessage,(LPTSTR) szErrorTitle); } else { idTemplate=IDS_PICSRULES_GENERIC_TEMPLATE;
if(HRESULT_FACILITY(hres)==FACILITY_WIN32) { switch(hres) { case E_OUTOFMEMORY: { idMsg=IDS_PICSRULES_MEMORY; break; } case E_INVALIDARG: { idMsg=IDS_PICSRULES_INVALID; break; } default: { idMsg=IDS_PICSRULES_WINERROR; break; } } MLLoadString(idTemplate,(LPTSTR) szLoadStringTemp,MAX_PATH); wsprintf((LPTSTR) szErrorMessage,(LPTSTR) szLoadStringTemp,m_etstrFile.Get());
MLLoadString(idMsg,(LPTSTR) szLoadStringTemp,MAX_PATH); if(idMsg==IDS_PICSRULES_WINERROR) { wsprintf((LPTSTR) szErrorTitle,(LPTSTR) szLoadStringTemp,HRESULT_CODE(hres)); } else { wsprintf((LPTSTR) szErrorTitle,(LPTSTR) szLoadStringTemp,m_nErrLine); }
lstrcat((LPTSTR) szErrorMessage,(LPTSTR) szErrorTitle); } else { idMsg=IDS_PICSRULES_MISCERROR;
MLLoadString(idTemplate,(LPTSTR) szLoadStringTemp,MAX_PATH); wsprintf((LPTSTR) szErrorMessage,(LPTSTR) szLoadStringTemp,m_etstrFile.Get());
MLLoadString(idMsg,(LPTSTR) szLoadStringTemp,MAX_PATH); wsprintf((LPTSTR) szErrorTitle,(LPTSTR) szLoadStringTemp,HRESULT_CODE(hres));
lstrcat((LPTSTR) szErrorMessage,(LPTSTR) szErrorTitle); } }
MLLoadString(IDS_ERROR,(LPTSTR) szErrorTitle,MAX_PATH); MessageBox(NULL,(LPCTSTR) szErrorMessage,(LPCTSTR) szErrorTitle,MB_OK|MB_ICONERROR); }
//*******************************************************************
//*
//* Code for the PICSRulesByURL class
//*
//*******************************************************************
PICSRulesByURL::PICSRulesByURL() { //nothing to do
}
PICSRulesByURL::~PICSRulesByURL() { m_arrpPRByURL.DeleteAll(); }
PICSRulesEvaluation PICSRulesByURL::EvaluateRule(PICSRulesQuotedURL *pprurlComparisonURL) { int iCounter; URL_COMPONENTS URLComponents; FN_INTERNETCRACKURL pfnInternetCrackUrl; INTERNET_SCHEME INetScheme=INTERNET_SCHEME_DEFAULT; INTERNET_PORT INetPort=INTERNET_INVALID_PORT_NUMBER; LPSTR lpszScheme,lpszHostName,lpszUserName, lpszPassword,lpszUrlPath,lpszExtraInfo; BOOL fApplies=FALSE;
lpszScheme=new char[INTERNET_MAX_SCHEME_LENGTH+1]; lpszHostName=new char[INTERNET_MAX_PATH_LENGTH+1]; lpszUserName=new char[INTERNET_MAX_PATH_LENGTH+1]; lpszPassword=new char[INTERNET_MAX_PATH_LENGTH+1]; lpszUrlPath=new char[INTERNET_MAX_PATH_LENGTH+1]; lpszExtraInfo=new char[INTERNET_MAX_PATH_LENGTH+1];
if(lpszScheme==NULL || lpszHostName==NULL || lpszUserName==NULL || lpszPassword==NULL || lpszUrlPath==NULL || lpszExtraInfo==NULL) { if (lpszScheme) { delete [] lpszScheme; lpszScheme = NULL; }
if (lpszHostName) { delete [] lpszHostName; lpszHostName = NULL; }
if (lpszUserName) { delete [] lpszUserName; lpszUserName = NULL; }
if (lpszPassword) { delete [] lpszPassword; lpszPassword = NULL; }
if (lpszUrlPath) { delete [] lpszUrlPath; lpszUrlPath = NULL; }
if (lpszExtraInfo) { delete [] lpszExtraInfo; lpszExtraInfo = NULL; }
return(PR_EVALUATION_DOESNOTAPPLY); }
URLComponents.dwStructSize=sizeof(URL_COMPONENTS); URLComponents.lpszScheme=lpszScheme; URLComponents.dwSchemeLength=INTERNET_MAX_SCHEME_LENGTH; URLComponents.nScheme=INetScheme; URLComponents.lpszHostName=lpszHostName; URLComponents.dwHostNameLength=INTERNET_MAX_PATH_LENGTH; URLComponents.nPort=INetPort; URLComponents.lpszUserName=lpszUserName; URLComponents.dwUserNameLength=INTERNET_MAX_PATH_LENGTH; URLComponents.lpszPassword=lpszPassword; URLComponents.dwPasswordLength=INTERNET_MAX_PATH_LENGTH; URLComponents.lpszUrlPath=lpszUrlPath; URLComponents.dwUrlPathLength=INTERNET_MAX_PATH_LENGTH; URLComponents.lpszExtraInfo=lpszExtraInfo; URLComponents.dwExtraInfoLength=INTERNET_MAX_PATH_LENGTH;
pfnInternetCrackUrl=(FN_INTERNETCRACKURL) GetProcAddress(g_hWININET,"InternetCrackUrlA");
if(pfnInternetCrackUrl==NULL) { return(PR_EVALUATION_DOESNOTAPPLY); }
pfnInternetCrackUrl(pprurlComparisonURL->Get(),0,ICU_DECODE,&URLComponents);
for(iCounter=0;iCounter<m_arrpPRByURL.Length();iCounter++) { PICSRulesByURLExpression * pPRByURLExpression;
pPRByURLExpression=m_arrpPRByURL[iCounter];
//schemes must be specified as per the spec, so there is no need to check
//the m_bSpecified flag against BYURL_SCHEME
//if the scheme is non-wild then we match against exact strings only, the
//match is case insensitive as per the spec
if(pPRByURLExpression->m_bNonWild&BYURL_SCHEME) { if(lstrcmp(lpszScheme,pPRByURLExpression->m_etstrScheme.Get())!=0) { continue; } }
//if the user name is omitted we only match if the url navigated to also
//had the user name omitted
if(!(pPRByURLExpression->m_bSpecified&BYURL_USER)) { if(*lpszUserName!=NULL) { continue; } } else if(pPRByURLExpression->m_bNonWild&BYURL_USER) { int iLength; char * lpszCurrent,lpszCompare[INTERNET_MAX_URL_LENGTH+1], lpszCopy[INTERNET_MAX_URL_LENGTH+1]; BOOL fFrontWild=0,fBackWild=0,fFrontEscaped=0,fBackEscaped=0;
//if the user was specified we match a '*' at the beginning as wild, a '*'
//at the end as wild, and '%*' matches aginst the character '*', this
//comparison is case sensitive
lstrcpy(lpszCompare,pPRByURLExpression->m_etstrUser.Get()); iLength=lstrlen(lpszCompare);
if(lpszCompare[0]=='*') { fFrontWild=1; } if(lpszCompare[iLength-1]=='*') { fBackWild=1; lpszCompare[iLength-1]='\0'; }
if((lpszCompare[0]=='%')&&(lpszCompare[1]=='*')) { fFrontEscaped=1; }
if((lpszCompare[iLength-2]=='%')&&fBackWild) { fBackWild=0; fBackEscaped=1;
lpszCompare[iLength-2]='*'; }
lpszCurrent=lpszCompare+fFrontWild+fFrontEscaped;
lstrcpy(lpszCopy,lpszCurrent);
if(fFrontWild==1) { lpszCurrent=strstrf(lpszUserName,lpszCopy); if(lpszCurrent!=NULL) { if(fBackWild==0) { if(lstrcmp(lpszCurrent,lpszUserName)!=0) { continue; } } } else { continue; } } else { if(fBackWild==1) { lpszUserName[lstrlen(lpszCopy)]='\0'; }
if(lstrcmp(lpszUserName,lpszCopy)!=0) { continue; } } }
//the host (or ipwild) must always be specified, so there is no need to
//check against m_bSpecified
//the host is either an ipwild (i.e. #.#.#.#!#) or a URL substring. If
//we have an ipwild, then we have to first resolve the site being browsed
//to to a set of IP addresses. We consider it a match if we match any
//of those IPs. If the host is an URL substring, then the first character
//being a '*' matches any number of characters, and being '%*' matches '*'
//itself. Everything further must match exactly. The compare is case-
//insensitive.
if(pPRByURLExpression->m_bNonWild&BYURL_HOST) { BOOL fFrontWild=0,fWasIpWild=FALSE,fNoneMatched=TRUE; DWORD dwIpRules=0; char * lpszCurrent;
lpszCurrent=pPRByURLExpression->m_etstrHost.Get();
if((lpszCurrent[0]>='0')&&(lpszCurrent[0]<='9')) { //make a copy of the string since we are going to delete the masking '!'
//to test for an ipwild
char * lpszMask; char lpszIpWild[INTERNET_MAX_PATH_LENGTH+1]; int iBitMask=(sizeof(DWORD)*8); lstrcpy(lpszIpWild,lpszCurrent);
lpszMask=strchrf(lpszIpWild,'!');
if(lpszMask!=NULL) { *lpszMask='\0'; lpszMask++;
ParseNumber(&lpszMask,&iBitMask,TRUE); }
//test for an ipwild case
dwIpRules = inet_addr(lpszIpWild); if(dwIpRules != INADDR_NONE) { //we definately have an ipwild
array<DWORD*> arrpIpCompare; HOSTENT * pHostEnt; int iCounter;
fWasIpWild=TRUE;
pHostEnt=gethostbyname(lpszHostName);
if(pHostEnt!=NULL) { char *lpszHosts;
lpszHosts=pHostEnt->h_addr_list[0];
iCounter=0;
while(lpszHosts!=NULL) { DWORD *pdwIP; pdwIP=new DWORD;
*pdwIP=*((DWORD *) lpszHosts);
arrpIpCompare.Append(pdwIP);
iCounter++;
lpszHosts=pHostEnt->h_addr_list[iCounter]; } }
//we've got all the IPs to test against, so lets do it
for(iCounter=0;iCounter<arrpIpCompare.Length();iCounter++) { DWORD dwIpCompare; int iBitCounter; BOOL fMatched; dwIpCompare=*(arrpIpCompare[iCounter]); fMatched=TRUE;
//compare the first iBitMask bits as per the spec
for(iBitCounter=0; iBitCounter<iBitMask; iBitCounter++) { int iPower; DWORD dwMask=1;
for(iPower=0;iPower<iBitCounter;iPower++) { dwMask*=2; }
if((dwIpRules&dwMask)!=(dwIpCompare&dwMask)) { //they don't match
fMatched=FALSE;
break; } }
if(fMatched==TRUE) { fNoneMatched=FALSE;
break; } } } }
if(fWasIpWild) { if(fNoneMatched) { //if none matched, we don't apply, so continue to the next
//iteration of the loop
continue; } } else { if((lpszCurrent[0]=='%')&&(lpszCurrent[1]=='*')) { lpszCurrent++; } else if (lpszCurrent[0]=='*') { fFrontWild=1; lpszCurrent++; } if(fFrontWild==1) { char * lpszTest;
lpszTest=strstrf(lpszHostName,lpszCurrent);
if(lstrcmpi(lpszTest,lpszCurrent)!=0) { continue; } } else { if(lstrcmpi(lpszHostName,lpszCurrent)!=0) { continue; } } } } //if the port is ommitted, we only match if the port was also ommitted in
//the URL being browsed to.
if(!(pPRByURLExpression->m_bSpecified&BYURL_PORT)) { if(URLComponents.nPort!=INTERNET_INVALID_PORT_NUMBER) { char * lpszCheck;
//URLComponents.nPort gets filled in anyway due to the scheme, so
//check it against the string itself
lpszCheck=strstrf(pprurlComparisonURL->Get(),lpszHostName);
if(lpszCheck!=NULL) { lpszCheck+=lstrlen(lpszHostName);
if(*lpszCheck==':') { continue; } } } } else if(pPRByURLExpression->m_bNonWild&BYURL_PORT) { char * lpszPort,* lpszRange;
//the port can be a single number or a range, with wild cards at both ends
//of the range
lpszPort=pPRByURLExpression->m_etstrPort.Get();
lpszRange=strchrf(lpszPort,'-'); if(lpszRange==NULL) { int iPort;
//we've got a single port
ParseNumber(&lpszPort,&iPort,TRUE);
if(iPort!=URLComponents.nPort) { continue; } } else { int iLow,iHigh;
*lpszRange='\0'; lpszRange++;
if(*lpszPort=='*') { iLow=0; } else { ParseNumber(&lpszPort,&iLow,TRUE); }
if(*lpszRange=='*') { iHigh=INTERNET_MAX_PORT_NUMBER_VALUE; } else { ParseNumber(&lpszRange,&iHigh,TRUE); }
if((URLComponents.nPort>iHigh)||URLComponents.nPort<iLow) { continue; } } }
//if the path is ommitted, we only match if the path was also ommitted in
//the URL being browsed to.
if(!(pPRByURLExpression->m_bSpecified&BYURL_PATH)) { if(*lpszUrlPath!=NULL) { if(!((*lpszUrlPath=='/')&&(*(lpszUrlPath+1)==NULL))) { continue; } } } else if(pPRByURLExpression->m_bNonWild&BYURL_PATH) { int iLength; char * lpszCurrent,lpszCompare[INTERNET_MAX_URL_LENGTH+1], lpszCopy[INTERNET_MAX_URL_LENGTH+1],* lpszUrlCheck, * lpszPreCompare; BOOL fFrontWild=0,fBackWild=0,fFrontEscaped=0,fBackEscaped=0;
//if the path was specified we match a '*' at the beginning as wild, a '*'
//at the end as wild, and '%*' matches aginst the character '*', this
//comparison is case sensitive
//kill leading slashes
if(*lpszUrlPath=='/') { lpszUrlCheck=lpszUrlPath+1; } else { lpszUrlCheck=lpszUrlPath; }
iLength=lstrlen(lpszUrlCheck);
//kill trailing slashes
if(lpszUrlCheck[iLength-1]=='/') { lpszUrlCheck[iLength-1]='\0'; }
lpszPreCompare=pPRByURLExpression->m_etstrPath.Get();
//kill leading slashes
if(*lpszPreCompare=='/') { lstrcpy(lpszCompare,lpszPreCompare+1); } else { lstrcpy(lpszCompare,lpszPreCompare); } iLength=lstrlen(lpszCompare);
//kill trailing slashes
if(lpszCompare[iLength-1]=='/') { lpszCompare[iLength-1]='\0'; }
if(lpszCompare[0]=='*') { fFrontWild=1; } if(lpszCompare[iLength-1]=='*') { fBackWild=1; lpszCompare[iLength-1]='\0'; }
if((lpszCompare[0]=='%')&&(lpszCompare[1]=='*')) { fFrontEscaped=1; }
if((lpszCompare[iLength-2]=='%')&&fBackWild) { fBackWild=0; fBackEscaped=1;
lpszCompare[iLength-2]='*'; }
lpszCurrent=lpszCompare+fFrontWild+fFrontEscaped;
lstrcpy(lpszCopy,lpszCurrent);
if(fFrontWild==1) { lpszCurrent=strstrf(lpszUrlCheck,lpszCopy); if(lpszCurrent!=NULL) { if(fBackWild==0) { if(lstrcmp(lpszCurrent,lpszUrlCheck)!=0) { continue; } } } else { continue; } } else { if(fBackWild==1) { lpszUrlCheck[lstrlen(lpszCopy)]='\0'; }
if(lstrcmp(lpszUrlCheck,lpszCopy)!=0) { continue; } } }
//if we made it this far we do apply!
fApplies=TRUE; break; }
delete lpszScheme; lpszScheme = NULL; delete lpszHostName; lpszHostName = NULL; delete lpszUserName; lpszUserName = NULL; delete lpszPassword; lpszPassword = NULL; delete lpszUrlPath; lpszUrlPath = NULL; delete lpszExtraInfo; lpszExtraInfo = NULL; if(fApplies==TRUE) { return(PR_EVALUATION_DOESAPPLY); } else { return(PR_EVALUATION_DOESNOTAPPLY); } }
//*******************************************************************
//*
//* Code for the PICSRulesFileParser class
//*
//*******************************************************************
//FindNonWhite returns a pointer to the first non-whitespace
//character starting at pc.
char* PICSRulesFileParser::FindNonWhite(char *pc) { ASSERT(pc); while (1) { if (*pc != ' ' && *pc != '\t' && *pc != '\r' && *pc != '\n') /* includes null terminator */ { return pc; } if (*pc == '\n')
m_nLine++; pc++; } }
//Returns a pointer to the closing quotation mark of a quoted
//string, counting linefeeds as we go. Returns NULL if no closing
//quotation mark is found.
//
//fQuote can be either PR_QUOTE_DOUBLE or PR_QUOTE_SINGLE
//defaults to PR_QUOTE_DOUBLE.
LPSTR PICSRulesFileParser::EatQuotedString(LPSTR pIn,BOOL fQuote) { LPSTR pszQuote;
if(fQuote==PR_QUOTE_DOUBLE) { pszQuote=strchrf(pIn,'\"'); } else { pszQuote=strchrf(pIn,'\''); }
if (pszQuote == NULL) { return NULL; }
pIn=strchrf(pIn,'\n'); while ((pIn!=NULL)&&(pIn<pszQuote)) { m_nLine++; pIn=strchrf(pIn+1,'\n'); }
return pszQuote; }
//ParseToOpening eats the opening '(' of a parenthesized object, and
//verifies that the token just inside it is one of the expected ones.
//If so, *ppIn is advanced past that token to the next non-whitespace
//character; otherwise, an error is returned.
//
//For example, if *ppIn is pointing at "(PicsRule-1.1)", and
//PROID_PICSVERSION is in the allowable option table supplied, then
//NOERROR is returned and *ppIn will point at "1.1)".
//
//If the function is successful, *ppFound is set to point to the element
//in the allowable-options table which matches the type of thing this
//object actually is.
HRESULT PICSRulesFileParser::ParseToOpening(LPSTR *ppIn, PICSRulesAllowableOption *paoExpected, PICSRulesAllowableOption **ppFound) { LPSTR lpszCurrent=*ppIn;
lpszCurrent=FindNonWhite(lpszCurrent); if(*lpszCurrent=='(') { lpszCurrent=FindNonWhite(lpszCurrent+1); //skip ( and whitespace
}
if((*lpszCurrent=='\"')||(*lpszCurrent=='\'')) { //we found a default option section, treat it as a string and return
//ppFound set to PROID_NAMEDEFAULT
paoExpected->roid=PROID_NAMEDEFAULT; *ppFound=paoExpected; *ppIn=lpszCurrent;
return NOERROR; }
LPSTR lpszTokenEnd=FindTokenEnd(lpszCurrent);
for(;paoExpected->roid!=PROID_INVALID;paoExpected++) { LPCSTR lpszThisToken=aPRObjectDescriptions[paoExpected->roid].lpszToken;
if(paoExpected->roid==PROID_EXTENSION) { LPTSTR lpszDot;
lpszDot=strchrf(lpszCurrent,'.');
if(lpszDot!=NULL) { *lpszDot='\0';
if(IsOptExtensionDefined(lpszCurrent)==TRUE) { *lpszDot='.';
lpszTokenEnd=lpszCurrent;
break; }
if(IsReqExtensionDefined(lpszCurrent)==TRUE) { //currently no extensions are supported so we return
//an error on a required extension.
//if support for extensions is implemented
//this should be identical to above with a different
//callback for reqextensions defined.
return(PICSRULES_E_REQEXTENSIONUSED); } } }
if(IsEqualToken(lpszCurrent,lpszTokenEnd,lpszThisToken)) { break; } }
if(paoExpected->roid!=PROID_INVALID) { *ppIn=FindNonWhite(lpszTokenEnd); //skip token and whitespace
*ppFound=paoExpected; return NOERROR; } else { return PICSRULES_E_UNKNOWNITEM; } }
//ParseParenthesizedObjectContents is called with a text pointer pointing at
//the first non-whitespace thing following the token identifying the type of
//object. It parses the rest of the contents of the object, up to and
//including the ')' which closes it. The array of PICSRulesAllowableOption
//structures specifies which understood options are allowed to occur within
//this object.
HRESULT PICSRulesFileParser::ParseParenthesizedObject(LPSTR *ppIn, PICSRulesAllowableOption aao[], PICSRulesObjectBase *pObject) { PICSRulesAllowableOption *pFound;
HRESULT hres=S_OK; LPSTR pszCurrent=*ppIn;
for(pFound=aao;pFound->roid!=PROID_INVALID;pFound++) { pFound->fdwOptions&=~AO_SEEN; }
pFound=NULL;
while((*pszCurrent!=')')&&(*pszCurrent!='\0')&&(SUCCEEDED(hres))) { hres=ParseToOpening(&pszCurrent,aao,&pFound);
if(SUCCEEDED(hres)) { LPVOID pData;
hres=(*(aPRObjectDescriptions[pFound->roid].pHandler))(&pszCurrent,&pData,this); if(SUCCEEDED(hres)) { if((pFound->fdwOptions&(AO_SINGLE|AO_SEEN))==(AO_SINGLE|AO_SEEN)) { hres=PICSRULES_E_DUPLICATEITEM; } else { pFound->fdwOptions|=AO_SEEN; hres=pObject->AddItem(pFound->roid,pData); if(SUCCEEDED(hres)) { pszCurrent=FindNonWhite(pszCurrent); } } } } }
if(FAILED(hres)) { return hres; }
for(pFound=aao;pFound->roid!=PROID_INVALID;pFound++) { if((pFound->fdwOptions&(AO_MANDATORY|AO_SEEN))==AO_MANDATORY) { return(PICSRULES_E_MISSINGITEM); //mandatory item not found
} }
pszCurrent=FindNonWhite(pszCurrent+1); //skip the closing parenthesis
*ppIn=pszCurrent;
return(hres); }
//*******************************************************************
//*
//* Code for the PICSRulesName class
//*
//*******************************************************************
PICSRulesName::PICSRulesName() { //just need to construct members
}
PICSRulesName::~PICSRulesName() { //nothing to do
}
HRESULT PICSRulesName::AddItem(PICSRulesObjectID proid, LPVOID pData) { HRESULT hRes = S_OK;
switch (proid) { case PROID_NAMEDEFAULT: case PROID_RULENAME: { m_etstrRuleName.SetTo((char *) pData); break; } case PROID_DESCRIPTION: { m_etstrDescription.SetTo((char *) pData);
break; } case PROID_EXTENSION: { //just eat extensions
break; } case PROID_INVALID: default: { ASSERT(FALSE); // shouldn't have been given a PROID that wasn't in
// the table we passed to the parser!
hRes=E_UNEXPECTED; break; } } return hRes; }
HRESULT PICSRulesName::InitializeMyDefaults() { //no defaults to initialize
return(NOERROR); }
//*******************************************************************
//*
//* Code for the PICSRulesOptExtension class
//*
//*******************************************************************
PICSRulesOptExtension::PICSRulesOptExtension() { //nothing to do
}
PICSRulesOptExtension::~PICSRulesOptExtension() { //nothing to do
}
HRESULT PICSRulesOptExtension::AddItem(PICSRulesObjectID proid, LPVOID pData) { HRESULT hRes = S_OK;
switch (proid) { case PROID_NAMEDEFAULT: case PROID_EXTENSIONNAME: { m_prURLExtensionName.SetTo((char *) pData); if(m_prURLExtensionName.IsURLValid()==FALSE) { hRes=E_INVALIDARG; }
break; } case PROID_SHORTNAME: { m_etstrShortName.SetTo((char *) pData);
break; } case PROID_EXTENSION: { //just eat extensions
break; } case PROID_INVALID: default: { ASSERT(FALSE); // shouldn't have been given a PROID that wasn't in
// the table we passed to the parser!
hRes=E_UNEXPECTED; break; } } return hRes; }
HRESULT PICSRulesOptExtension::InitializeMyDefaults() { //no defaults to initialize
return(NOERROR); }
//*******************************************************************
//*
//* Code for the PICSRulesPassFail class
//*
//*******************************************************************
PICSRulesPassFail::PICSRulesPassFail() { m_fPassOrFail=PR_PASSFAIL_PASS; }
PICSRulesPassFail::~PICSRulesPassFail() { //nothing to do
}
void PICSRulesPassFail::Set(const BOOL *pIn) { switch(*pIn) { case PR_PASSFAIL_PASS: { ETS::Set(szPRPass); m_fPassOrFail=PR_PASSFAIL_PASS;
break; } case PR_PASSFAIL_FAIL: { ETS::Set(szPRFail); m_fPassOrFail=PR_PASSFAIL_FAIL;
break; } } }
void PICSRulesPassFail::SetTo(BOOL *pIn) { Set(pIn); }
//*******************************************************************
//*
//* Code for the PICSRulesPolicy class
//*
//*******************************************************************
PICSRulesPolicy::PICSRulesPolicy() { m_PRPolicyAttribute=PR_POLICY_NONEVALID; }
PICSRulesPolicy::~PICSRulesPolicy() { switch(m_PRPolicyAttribute) { case PR_POLICY_REJECTBYURL: { if(m_pPRRejectByURL!=NULL) { delete m_pPRRejectByURL; m_pPRRejectByURL = NULL; } break; } case PR_POLICY_ACCEPTBYURL: { if(m_pPRAcceptByURL!=NULL) { delete m_pPRAcceptByURL; m_pPRAcceptByURL = NULL; } break; } case PR_POLICY_REJECTIF: { if(m_pPRRejectIf!=NULL) { delete m_pPRRejectIf; m_pPRRejectIf = NULL; } break; } case PR_POLICY_ACCEPTIF: { if(m_pPRAcceptIf!=NULL) { delete m_pPRAcceptIf; m_pPRAcceptIf = NULL; } break; } case PR_POLICY_REJECTUNLESS: { if(m_pPRRejectUnless!=NULL) { delete m_pPRRejectUnless; m_pPRRejectUnless = NULL; } break; } case PR_POLICY_ACCEPTUNLESS: { if(m_pPRAcceptUnless!=NULL) { delete m_pPRAcceptUnless; m_pPRAcceptUnless = NULL; } break; } case PR_POLICY_NONEVALID: default: { break; } } }
HRESULT PICSRulesPolicy::AddItem(PICSRulesObjectID proid, LPVOID pData) { HRESULT hRes = S_OK;
switch (proid) { case PROID_NAMEDEFAULT: case PROID_EXPLANATION: { m_etstrExplanation.SetTo((char *) pData); break; } case PROID_REJECTBYURL: { m_pPRRejectByURL=((PICSRulesByURL *) pData); m_PRPolicyAttribute=PR_POLICY_REJECTBYURL;
break; } case PROID_ACCEPTBYURL: { m_pPRAcceptByURL=((PICSRulesByURL *) pData); m_PRPolicyAttribute=PR_POLICY_ACCEPTBYURL;
break; } case PROID_REJECTIF: { m_pPRRejectIf=((PICSRulesPolicyExpression *) pData); m_PRPolicyAttribute=PR_POLICY_REJECTIF;
break; } case PROID_ACCEPTIF: { m_pPRAcceptIf=((PICSRulesPolicyExpression *) pData); m_PRPolicyAttribute=PR_POLICY_ACCEPTIF;
break; } case PROID_REJECTUNLESS: { m_pPRRejectUnless=((PICSRulesPolicyExpression *) pData); m_PRPolicyAttribute=PR_POLICY_REJECTUNLESS;
break; } case PROID_ACCEPTUNLESS: { m_pPRAcceptUnless=((PICSRulesPolicyExpression *) pData); m_PRPolicyAttribute=PR_POLICY_ACCEPTUNLESS;
break; } case PROID_EXTENSION: { //just eat extensions
break; } case PROID_INVALID: default: { ASSERT(FALSE); // shouldn't have been given a PROID that wasn't in
// the table we passed to the parser!
hRes=E_UNEXPECTED; break; } } return hRes; }
HRESULT PICSRulesPolicy::InitializeMyDefaults() { return(NOERROR); //no defaults to initialize
}
//*******************************************************************
//*
//* Code for the PICSRulesPolicyExpression class
//*
//*******************************************************************
PICSRulesPolicyExpression::PICSRulesPolicyExpression() { m_PRPEPolicyEmbedded= PR_POLICYEMBEDDED_NONE; m_PROPolicyOperator= PR_OPERATOR_INVALID; m_pPRPolicyExpressionLeft= NULL; m_pPRPolicyExpressionRight= NULL; }
PICSRulesPolicyExpression::~PICSRulesPolicyExpression() { if(m_PRPEPolicyEmbedded!=PR_POLICYEMBEDDED_NONE) //do we need to delete an
//embedded PolicyExpression?
{ if(m_pPRPolicyExpressionLeft!=NULL) //double check, just to make sure
{ delete m_pPRPolicyExpressionLeft; m_pPRPolicyExpressionLeft = NULL; } if(m_pPRPolicyExpressionRight!=NULL) //double check, just to make sure
{ delete m_pPRPolicyExpressionRight; m_pPRPolicyExpressionRight = NULL; } } }
PICSRulesEvaluation PICSRulesPolicyExpression::EvaluateRule(CParsedLabelList *pParsed) { PICSRulesEvaluation PREvaluationResult;
if((pParsed==NULL)||(m_PROPolicyOperator==PR_OPERATOR_DEGENERATE)) { //we can't apply if there is no label, and we
//don't handle the degenerate case since we have
//to pass on to the PICS handler
return(PR_EVALUATION_DOESNOTAPPLY); }
if((m_prYesNoUseEmbedded.GetYesNo()==PR_YESNO_NO)&&(g_dwDataSource==PICS_LABEL_FROM_PAGE)) { return(PR_EVALUATION_DOESNOTAPPLY); }
switch(m_PRPEPolicyEmbedded) { case PR_POLICYEMBEDDED_NONE: { switch(m_PROPolicyOperator) { case PR_OPERATOR_GREATEROREQUAL: case PR_OPERATOR_GREATER: case PR_OPERATOR_EQUAL: case PR_OPERATOR_LESSOREQUAL: case PR_OPERATOR_LESS: { LPCSTR lpszTest; CParsedServiceInfo * pCParsedServiceInfo; CParsedRating * pCParsedRating; PREvaluationResult=PR_EVALUATION_DOESNOTAPPLY;
pCParsedServiceInfo=&(pParsed->m_ServiceInfo); do { lpszTest=pCParsedServiceInfo->m_pszServiceName;
if(lstrcmp(lpszTest,m_etstrFullServiceName.Get())==0) { PREvaluationResult=PR_EVALUATION_DOESAPPLY; break; }
pCParsedServiceInfo=pCParsedServiceInfo->Next(); } while (pCParsedServiceInfo!=NULL);
if(PREvaluationResult==PR_EVALUATION_DOESAPPLY) { int iCounter;
PREvaluationResult=PR_EVALUATION_DOESNOTAPPLY;
//we've got the service, now check for the category
for(iCounter=0;iCounter<pCParsedServiceInfo->aRatings.Length();iCounter++) { pCParsedRating=&(pCParsedServiceInfo->aRatings[iCounter]);
if(lstrcmp(pCParsedRating->pszTransmitName,m_etstrCategoryName.Get())==0) { PREvaluationResult=PR_EVALUATION_DOESAPPLY;
break; } } }
if(PREvaluationResult==PR_EVALUATION_DOESAPPLY) { int iLabelValue; iLabelValue=pCParsedRating->nValue;
//now check the values
PREvaluationResult=PR_EVALUATION_DOESNOTAPPLY;
switch(m_PROPolicyOperator) { case PR_OPERATOR_GREATEROREQUAL: { if(iLabelValue>=m_etnValue.Get()) { PREvaluationResult=PR_EVALUATION_DOESAPPLY; }
break; } case PR_OPERATOR_GREATER: { if(iLabelValue>m_etnValue.Get()) { PREvaluationResult=PR_EVALUATION_DOESAPPLY; }
break; } case PR_OPERATOR_EQUAL: { if(iLabelValue==m_etnValue.Get()) { PREvaluationResult=PR_EVALUATION_DOESAPPLY; }
break; } case PR_OPERATOR_LESSOREQUAL: { if(iLabelValue<=m_etnValue.Get()) { PREvaluationResult=PR_EVALUATION_DOESAPPLY; }
break; } case PR_OPERATOR_LESS: { if(iLabelValue<m_etnValue.Get()) { PREvaluationResult=PR_EVALUATION_DOESAPPLY; }
break; } } }
break; } case PR_OPERATOR_SERVICEONLY: { LPCSTR lpszTest; CParsedServiceInfo * pCParsedServiceInfo; PREvaluationResult=PR_EVALUATION_DOESNOTAPPLY;
pCParsedServiceInfo=&(pParsed->m_ServiceInfo); do { lpszTest=pCParsedServiceInfo->m_pszServiceName;
if(lstrcmp(lpszTest,m_etstrFullServiceName.Get())==0) { PREvaluationResult=PR_EVALUATION_DOESAPPLY; break; }
pCParsedServiceInfo=pCParsedServiceInfo->Next(); } while (pCParsedServiceInfo!=NULL);
break; } case PR_OPERATOR_SERVICEANDCATEGORY: { LPCSTR lpszTest; CParsedServiceInfo * pCParsedServiceInfo; PREvaluationResult=PR_EVALUATION_DOESNOTAPPLY;
pCParsedServiceInfo=&(pParsed->m_ServiceInfo); do { lpszTest=pCParsedServiceInfo->m_pszServiceName;
if(lstrcmp(lpszTest,m_etstrFullServiceName.Get())==0) { PREvaluationResult=PR_EVALUATION_DOESAPPLY; break; }
pCParsedServiceInfo=pCParsedServiceInfo->Next(); } while (pCParsedServiceInfo!=NULL);
if(PREvaluationResult==PR_EVALUATION_DOESAPPLY) { int iCounter;
PREvaluationResult=PR_EVALUATION_DOESNOTAPPLY;
//we've got the service, now check for the category
for(iCounter=0;iCounter<pCParsedServiceInfo->aRatings.Length();iCounter++) { CParsedRating * pCParsedRating;
pCParsedRating=&(pCParsedServiceInfo->aRatings[iCounter]);
if(lstrcmp(pCParsedRating->pszTransmitName,m_etstrCategoryName.Get())==0) { PREvaluationResult=PR_EVALUATION_DOESAPPLY;
break; } } }
break; } }
break; } case PR_POLICYEMBEDDED_OR: { PICSRulesEvaluation PREvaluationIntermediate;
PREvaluationIntermediate=m_pPRPolicyExpressionLeft->EvaluateRule(pParsed);
if(PREvaluationIntermediate==PR_EVALUATION_DOESAPPLY) { PREvaluationResult=PR_EVALUATION_DOESAPPLY;
break; } else { PREvaluationResult=m_pPRPolicyExpressionRight->EvaluateRule(pParsed); } break; } case PR_POLICYEMBEDDED_AND: { PICSRulesEvaluation PREvaluationIntermediate;
PREvaluationIntermediate=m_pPRPolicyExpressionLeft->EvaluateRule(pParsed);
PREvaluationResult=m_pPRPolicyExpressionRight->EvaluateRule(pParsed);
if((PREvaluationIntermediate==PR_EVALUATION_DOESAPPLY)&& (PREvaluationResult==PR_EVALUATION_DOESAPPLY)) { break; } else { PREvaluationResult=PR_EVALUATION_DOESNOTAPPLY; }
break; } }
return(PREvaluationResult); }
//*******************************************************************
//*
//* Code for the PICSRulesQuotedDate class
//*
//*******************************************************************
PICSRulesQuotedDate::PICSRulesQuotedDate() { m_dwDate=0; }
PICSRulesQuotedDate::~PICSRulesQuotedDate() { //nothing to do
}
HRESULT PICSRulesQuotedDate::Set(const char *pIn) { HRESULT hRes; DWORD dwDate;
hRes=ParseTime((char *) pIn,&dwDate);
if(FAILED(hRes)) { return(E_INVALIDARG); }
m_dwDate=dwDate;
ETS::Set(pIn);
return(S_OK); }
HRESULT PICSRulesQuotedDate::SetTo(char *pIn) { HRESULT hRes; DWORD dwDate;
hRes=ParseTime(pIn,&dwDate,TRUE);
if(FAILED(hRes)) { return(E_INVALIDARG); }
m_dwDate=dwDate;
ETS::SetTo(pIn);
return(S_OK); }
BOOL PICSRulesQuotedDate::IsDateValid() { if(m_dwDate) { return(TRUE); } else { return(FALSE); } }
BOOL PICSRulesQuotedDate::IsDateValid(char * lpszDate) { HRESULT hRes; DWORD dwDate;
hRes=ParseTime(lpszDate,&dwDate);
if(SUCCEEDED(hRes)) { return(TRUE); } else { return(FALSE); } }
BOOL PICSRulesQuotedDate::IsDateValid(ETS etstrDate) { HRESULT hRes; DWORD dwDate; LPTSTR lpszDate;
lpszDate=etstrDate.Get();
hRes=ParseTime(lpszDate,&dwDate);
if(SUCCEEDED(hRes)) { return(TRUE); } else { return(FALSE); } }
//*******************************************************************
//*
//* Code for the PICSRulesQuotedEmail class
//*
//*******************************************************************
PICSRulesQuotedEmail::PICSRulesQuotedEmail() { //nothing to do
}
PICSRulesQuotedEmail::~PICSRulesQuotedEmail() { //nothing to do
}
BOOL PICSRulesQuotedEmail::IsEmailValid() { //We don't use this internally, so as far as we are concerned
//its always valid.
//If we ever add UI that displays this, we can defer verification
//of the email address to the mail client by sticking a mailto://
//in front of our string
return(TRUE); }
BOOL PICSRulesQuotedEmail::IsEmailValid(char * lpszEmail) { //We don't use this internally, so as far as we are concerned
//its always valid.
//If we ever add UI that displays this, we can defer verification
//of the email address to the mail client by sticking a mailto://
//in front of our string
return(TRUE); }
BOOL PICSRulesQuotedEmail::IsEmailValid(ETS etstrEmail) { //We don't use this internally, so as far as we are concerned
//its always valid.
//If we ever add UI that displays this, we can defer verification
//of the email address to the mail client by sticking a mailto://
//in front of our string
return(TRUE); }
//*******************************************************************
//*
//* Code for the PICSRulesQuotedURL class
//*
//*******************************************************************
PICSRulesQuotedURL::PICSRulesQuotedURL() { //nothing to do
}
PICSRulesQuotedURL::~PICSRulesQuotedURL() { //nothing to do
}
BOOL IsURLValid(WCHAR wcszURL[INTERNET_MAX_URL_LENGTH]) { FN_ISVALIDURL pfnIsValidURL;
pfnIsValidURL=(FN_ISVALIDURL) GetProcAddress(g_hURLMON,"IsValidURL");
if(pfnIsValidURL==NULL) { return(FALSE); }
if(pfnIsValidURL(NULL,wcszURL,0)==S_OK) { return(TRUE); } else { return(FALSE); } }
BOOL PICSRulesQuotedURL::IsURLValid() { char * lpszURL; WCHAR wcszURL[INTERNET_MAX_URL_LENGTH];
lpszURL=Get();
MultiByteToWideChar(CP_OEMCP,MB_PRECOMPOSED,lpszURL,-1,wcszURL,INTERNET_MAX_URL_LENGTH); return(::IsURLValid(wcszURL)); }
BOOL PICSRulesQuotedURL::IsURLValid(char * lpszURL) { WCHAR wcszURL[INTERNET_MAX_URL_LENGTH];
MultiByteToWideChar(CP_OEMCP,MB_PRECOMPOSED,lpszURL,-1,wcszURL,INTERNET_MAX_URL_LENGTH);
return(::IsURLValid(wcszURL)); }
BOOL PICSRulesQuotedURL::IsURLValid(ETS etstrURL) { char * lpszURL; WCHAR wcszURL[INTERNET_MAX_URL_LENGTH];
lpszURL=etstrURL.Get();
MultiByteToWideChar(CP_OEMCP,MB_PRECOMPOSED,lpszURL,-1,wcszURL,INTERNET_MAX_URL_LENGTH);
return(::IsURLValid(wcszURL)); }
//*******************************************************************
//*
//* Code for the PICSRulesReqExtension class
//*
//*******************************************************************
PICSRulesReqExtension::PICSRulesReqExtension() { //nothing to do
}
PICSRulesReqExtension::~PICSRulesReqExtension() { //nothing to do
}
HRESULT PICSRulesReqExtension::AddItem(PICSRulesObjectID proid, LPVOID pData) { HRESULT hRes = S_OK;
switch (proid) { case PROID_NAMEDEFAULT: case PROID_EXTENSIONNAME: { m_prURLExtensionName.SetTo((char *) pData); if(m_prURLExtensionName.IsURLValid()==FALSE) { hRes=E_INVALIDARG; }
break; } case PROID_SHORTNAME: { m_etstrShortName.SetTo((char *) pData);
break; } case PROID_EXTENSION: { //just eat extensions
break; } case PROID_INVALID: default: { ASSERT(FALSE); // shouldn't have been given a PROID that wasn't in
// the table we passed to the parser!
hRes=E_UNEXPECTED; break; } } return hRes; }
HRESULT PICSRulesReqExtension::InitializeMyDefaults() { //no defaults to initialize
return(NOERROR); }
//*******************************************************************
//*
//* Code for the PICSRulesServiceInfo class
//*
//*******************************************************************
PICSRulesServiceInfo::PICSRulesServiceInfo() { const BOOL fYes=PR_YESNO_YES; const BOOL fPass=PR_PASSFAIL_PASS;
m_prPassFailBureauUnavailable.Set(&fPass); m_prYesNoUseEmbedded.Set(&fYes); }
PICSRulesServiceInfo::~PICSRulesServiceInfo() { //nothing to do
}
HRESULT PICSRulesServiceInfo::AddItem(PICSRulesObjectID proid, LPVOID pData) { HRESULT hRes = S_OK;
switch (proid) { case PROID_NAMEDEFAULT: case PROID_NAME: case PROID_SINAME: { m_prURLName.SetTo((char *) pData); if(m_prURLName.IsURLValid()==FALSE) { hRes=E_INVALIDARG; }
break; } case PROID_SHORTNAME: { m_etstrShortName.SetTo((char *) pData);
break; } case PROID_BUREAUURL: { m_prURLBureauURL.SetTo((char *) pData);
if(m_prURLBureauURL.IsURLValid()==FALSE) { hRes=E_INVALIDARG; }
break; } case PROID_USEEMBEDDED: { m_prYesNoUseEmbedded.SetTo((BOOL *) &pData);
break; } case PROID_RATFILE: { m_etstrRatfile.SetTo((char *) pData);
break; } case PROID_BUREAUUNAVAILABLE: { m_prPassFailBureauUnavailable.SetTo((BOOL *) &pData);
break; } case PROID_EXTENSION: { //just eat extensions
break; } case PROID_INVALID: default: { ASSERT(FALSE); // shouldn't have been given a PROID that wasn't in
// the table we passed to the parser!
hRes=E_UNEXPECTED; break; } } return hRes; }
HRESULT PICSRulesServiceInfo::InitializeMyDefaults() { //nothing to do
return(S_OK); }
//*******************************************************************
//*
//* Code for the PICSRulesSource class
//*
//*******************************************************************
PICSRulesSource::PICSRulesSource() { //nothing to do but construct members
}
PICSRulesSource::~PICSRulesSource() { //nothing to do
}
HRESULT PICSRulesSource::AddItem(PICSRulesObjectID proid, LPVOID pData) { HRESULT hRes = S_OK;
switch (proid) { case PROID_NAMEDEFAULT: case PROID_SOURCEURL: { m_prURLSourceURL.SetTo((char *) pData); if(m_prURLSourceURL.IsURLValid()==FALSE) { hRes=E_INVALIDARG; }
break; } case PROID_AUTHOR: { m_prEmailAuthor.SetTo((char *) pData);
if(m_prEmailAuthor.IsEmailValid()==FALSE) { hRes=E_INVALIDARG; }
break; } case PROID_CREATIONTOOL: { m_etstrCreationTool.SetTo((char *) pData);
break; } case PROID_LASTMODIFIED: { m_prDateLastModified.SetTo((char *) pData);
if(m_prDateLastModified.IsDateValid()==FALSE) { hRes=E_INVALIDARG; }
break; } case PROID_EXTENSION: { //just eat extensions
break; } case PROID_INVALID: default: { ASSERT(FALSE); // shouldn't have been given a PROID that wasn't in
// the table we passed to the parser!
hRes=E_UNEXPECTED; break; } } return hRes; }
HRESULT PICSRulesSource::InitializeMyDefaults() { //no defaults to initialize
return(NOERROR); }
char * PICSRulesSource::GetToolName() { return m_etstrCreationTool.Get(); }
//*******************************************************************
//*
//* Code for the PICSRulesYesNo class
//*
//*******************************************************************
PICSRulesYesNo::PICSRulesYesNo() { m_fYesOrNo=PR_YESNO_YES; }
PICSRulesYesNo::~PICSRulesYesNo() { }
void PICSRulesYesNo::Set(const BOOL *pIn) { switch(*pIn) { case PR_YESNO_YES: { ETS::Set(szPRYes); m_fYesOrNo=PR_YESNO_YES;
break; } case PR_YESNO_NO: { ETS::Set(szPRNo); m_fYesOrNo=PR_YESNO_NO;
break; } } }
void PICSRulesYesNo::SetTo(BOOL *pIn) { Set(pIn); }
//*******************************************************************
//*
//* Code for the PICSRulesByURLExpression class
//*
//*******************************************************************
PICSRulesByURLExpression::PICSRulesByURLExpression() { m_bNonWild=0; m_bSpecified=0; }
PICSRulesByURLExpression::~PICSRulesByURLExpression() { //nothing to do
}
HRESULT EtStringRegWriteCipher(ETS &ets,HKEY hKey,char *pKeyWord) { if(pKeyWord==NULL) { return(E_INVALIDARG); }
if(ets.fIsInit()) { return(RegSetValueEx(hKey,pKeyWord,0,REG_SZ,(LPBYTE)ets.Get(),strlenf(ets.Get())+1)); }
return(NOERROR); }
HRESULT EtNumRegWriteCipher(ETN &etn,HKEY hKey,char *pKeyWord) { int iTemp;
if(pKeyWord==NULL) { return(E_INVALIDARG); }
if(etn.fIsInit()) { iTemp=etn.Get();
return(RegSetValueEx(hKey,pKeyWord,0,REG_DWORD,(LPBYTE)&iTemp,sizeof(iTemp))); }
return(NOERROR); }
HRESULT EtBoolRegWriteCipher(ETB &etb,HKEY hKey,char *pKeyWord) { DWORD dwNum;
if(pKeyWord==NULL) { return(E_INVALIDARG); }
if(etb.fIsInit()) { dwNum=etb.Get();
return(RegSetValueEx(hKey,pKeyWord,0,REG_DWORD,(LPBYTE)&dwNum,sizeof(dwNum))); }
return(NOERROR); }
HRESULT EtStringRegReadCipher(ETS &ets,HKEY hKey,char *pKeyWord) { unsigned long lType;
if(pKeyWord==NULL) { return(E_INVALIDARG); }
char * lpszString=new char[INTERNET_MAX_URL_LENGTH + 1]; DWORD dwSizeOfString=INTERNET_MAX_URL_LENGTH + 1; if(lpszString==NULL) { return(E_OUTOFMEMORY); }
if(RegQueryValueEx(hKey,pKeyWord,NULL,&lType,(LPBYTE) lpszString,&dwSizeOfString)!=ERROR_SUCCESS) { ets.SetTo(NULL);
delete lpszString; lpszString = NULL;
return(E_UNEXPECTED); } else { ets.SetTo(lpszString); }
return(NOERROR); }
HRESULT EtNumRegReadCipher(ETN &etn,HKEY hKey,char *pKeyWord) { unsigned long lType;
if(pKeyWord==NULL) { return(E_INVALIDARG); }
DWORD dwNum; DWORD dwSizeOfNum=sizeof(DWORD); if(RegQueryValueEx(hKey,pKeyWord,NULL,&lType,(LPBYTE) &dwNum,&dwSizeOfNum)!=ERROR_SUCCESS) { etn.Set(0);
return(E_UNEXPECTED); } else { etn.Set(dwNum); }
return(NOERROR); }
HRESULT EtBoolRegReadCipher(ETB &etb,HKEY hKey,char *pKeyWord) { unsigned long lType;
if(pKeyWord==NULL) { return(E_INVALIDARG); }
BOOL fFlag; DWORD dwSizeOfFlag=sizeof(BOOL); if(RegQueryValueEx(hKey,pKeyWord,NULL,&lType,(LPBYTE) &fFlag,&dwSizeOfFlag)!=ERROR_SUCCESS) { etb.Set(0);
return(E_UNEXPECTED); } else { etb.Set(fFlag); }
return(NOERROR); }
void PICSRulesOutOfMemory() { char szTitle[MAX_PATH],szMessage[MAX_PATH];
MLLoadString(IDS_ERROR,(LPTSTR) szTitle,MAX_PATH); MLLoadString(IDS_PICSRULES_OUTOFMEMORY,(LPTSTR) szMessage,MAX_PATH);
MessageBox(NULL,(LPCTSTR) szMessage,(LPCTSTR) szTitle,MB_OK|MB_ICONERROR); }
HRESULT CopySubPolicyExpressionFromRegistry(PICSRulesPolicyExpression * pPRPolicyExpressionBeingCopied,HKEY hKeyExpression) { PICSRulesPolicyExpression * pPRSubPolicyExpressionToCopy; ETB etb; ETN etn; int iTemp; long lError;
EtBoolRegReadCipher(etb,hKeyExpression,(char *) szPICSRULESEXPRESSIONEMBEDDED); iTemp=(int) etb.Get(); pPRPolicyExpressionBeingCopied->m_prYesNoUseEmbedded.Set(&iTemp);
EtStringRegReadCipher(pPRPolicyExpressionBeingCopied->m_etstrServiceName,hKeyExpression,(char *) &szPICSRULESEXPRESSIONSERVICENAME); EtStringRegReadCipher(pPRPolicyExpressionBeingCopied->m_etstrCategoryName,hKeyExpression,(char *) &szPICSRULESEXPRESSIONCATEGORYNAME); EtStringRegReadCipher(pPRPolicyExpressionBeingCopied->m_etstrFullServiceName,hKeyExpression,(char *) &szPICSRULESEXPRESSIONFULLSERVICENAME);
EtNumRegReadCipher(etn,hKeyExpression,(char *) &szPICSRULESEXPRESSIONVALUE); pPRPolicyExpressionBeingCopied->m_etnValue.Set(etn.Get());
EtNumRegReadCipher(etn,hKeyExpression,(char *) &szPICSRULESEXPRESSIONPOLICYOPERATOR); pPRPolicyExpressionBeingCopied->m_PROPolicyOperator=(PICSRulesOperators) etn.Get();
EtNumRegReadCipher(etn,hKeyExpression,(char *) &szPICSRULESEXPRESSIONOPPOLICYEMBEDDED); pPRPolicyExpressionBeingCopied->m_PRPEPolicyEmbedded=(PICSRulesPolicyEmbedded) etn.Get();
// Handle Left Expression
{ CRegKey keyExpressionSubKey;
lError = keyExpressionSubKey.Open( hKeyExpression, szPICSRULESEXPRESSIONLEFT, KEY_READ );
if(lError!=ERROR_SUCCESS) { pPRPolicyExpressionBeingCopied->m_pPRPolicyExpressionLeft=NULL; } else { pPRSubPolicyExpressionToCopy=new PICSRulesPolicyExpression;
if(pPRSubPolicyExpressionToCopy==NULL) { TraceMsg( TF_WARNING, "CopySubPolicyExpressionFromRegistry() - Failed PICSRulesPolicyExpression Creation LEFT '%s' Expression!", szPICSRULESEXPRESSIONLEFT ); PICSRulesOutOfMemory(); return(E_OUTOFMEMORY); }
pPRPolicyExpressionBeingCopied->m_pPRPolicyExpressionLeft=pPRSubPolicyExpressionToCopy;
if ( FAILED( CopySubPolicyExpressionFromRegistry( pPRSubPolicyExpressionToCopy, keyExpressionSubKey.m_hKey ))) { TraceMsg( TF_WARNING, "CopySubPolicyExpressionFromRegistry() - Failed Copy LEFT '%s' Expression!", szPICSRULESEXPRESSIONLEFT ); return(E_OUTOFMEMORY); } } }
// Handle Right Expression
{ CRegKey keyExpressionSubKey;
lError = keyExpressionSubKey.Open( hKeyExpression, szPICSRULESEXPRESSIONRIGHT, KEY_READ );
if(lError!=ERROR_SUCCESS) { pPRPolicyExpressionBeingCopied->m_pPRPolicyExpressionRight=NULL; } else { pPRSubPolicyExpressionToCopy=new PICSRulesPolicyExpression;
if(pPRSubPolicyExpressionToCopy==NULL) { TraceMsg( TF_WARNING, "CopySubPolicyExpressionFromRegistry() - Failed PICSRulesPolicyExpression Creation RIGHT '%s' Expression!", szPICSRULESEXPRESSIONRIGHT ); PICSRulesOutOfMemory(); return(E_OUTOFMEMORY); }
pPRPolicyExpressionBeingCopied->m_pPRPolicyExpressionRight=pPRSubPolicyExpressionToCopy;
if ( FAILED( CopySubPolicyExpressionFromRegistry( pPRSubPolicyExpressionToCopy, keyExpressionSubKey.m_hKey ) ) ) { TraceMsg( TF_WARNING, "CopySubPolicyExpressionFromRegistry() - Failed Copy RIGHT '%s' Expression!", szPICSRULESEXPRESSIONRIGHT ); return(E_OUTOFMEMORY); } } }
return(NOERROR); }
class CReadRatingSystem { private: PICSRulesRatingSystem ** m_ppPRRS;
public: CReadRatingSystem( PICSRulesRatingSystem ** p_ppPRRS ) { m_ppPRRS = p_ppPRRS; }
~CReadRatingSystem() { if ( m_ppPRRS ) { if ( *m_ppPRRS ) { delete *m_ppPRRS; *m_ppPRRS = NULL; }
m_ppPRRS = NULL; } }
void ValidRatingSystem( void ) { m_ppPRRS = NULL; } };
HRESULT ReadSystemFromRegistry(HKEY hKey,PICSRulesRatingSystem **ppPRRS) { PICSRulesRatingSystem * pPRRSBeingCopied; PICSRulesPolicy * pPRPolicyBeingCopied; PICSRulesPolicyExpression * pPRPolicyExpressionBeingCopied; PICSRulesServiceInfo * pPRServiceInfoBeingCopied; PICSRulesOptExtension * pPROptExtensionBeingCopied; PICSRulesReqExtension * pPRReqExtensionBeingCopied; PICSRulesName * pPRNameBeingCopied; PICSRulesSource * pPRSourceBeingCopied; PICSRulesByURL * pPRByURLToCopy; PICSRulesByURLExpression * pPRByURLExpressionToCopy; ETN etn; ETB etb; long lError; char szNumber[MAX_PATH]; DWORD dwNumSystems,dwSubCounter,dwNumServiceInfo,dwNumExtensions;
pPRRSBeingCopied=*ppPRRS;
if(pPRRSBeingCopied!=NULL) { delete pPRRSBeingCopied; pPRRSBeingCopied = NULL; }
pPRRSBeingCopied=new PICSRulesRatingSystem;
if(pPRRSBeingCopied==NULL) { TraceMsg( TF_WARNING, "ReadSystemFromRegistry() - Failed PICSRulesRatingSystem Creation!" );
PICSRulesOutOfMemory();
return(E_OUTOFMEMORY); }
*ppPRRS=pPRRSBeingCopied;
CReadRatingSystem readRatingSystem( ppPRRS );
EtStringRegReadCipher(pPRRSBeingCopied->m_etstrFile,hKey,(char *) &szPICSRULESFILENAME); EtNumRegReadCipher(pPRRSBeingCopied->m_etnPRVerMajor,hKey,(char *) &szPICSRULESVERMAJOR); EtNumRegReadCipher(pPRRSBeingCopied->m_etnPRVerMinor,hKey,(char *) &szPICSRULESVERMINOR);
EtNumRegReadCipher(etn,hKey,(char *) &szPICSRULESDWFLAGS); pPRRSBeingCopied->m_dwFlags=etn.Get();
EtNumRegReadCipher(etn,hKey,(char *) &szPICSRULESERRLINE); pPRRSBeingCopied->m_nErrLine=etn.Get();
{ CRegKey keySubKey;
//Read in the PICSRulesName Structure
lError = keySubKey.Open( hKey, szPICSRULESPRNAME, KEY_READ );
if(lError!=ERROR_SUCCESS) { pPRRSBeingCopied->m_pPRName=NULL; } else { pPRNameBeingCopied=new PICSRulesName;
if(pPRNameBeingCopied==NULL) { TraceMsg( TF_WARNING, "ReadSystemFromRegistry() - Failed PICSRulesName Creation!" ); PICSRulesOutOfMemory(); return(E_OUTOFMEMORY); } else { pPRRSBeingCopied->m_pPRName=pPRNameBeingCopied; } }
if((pPRRSBeingCopied->m_pPRName)!=NULL) { EtStringRegReadCipher( pPRNameBeingCopied->m_etstrRuleName, keySubKey.m_hKey, (char *) &szPICSRULESRULENAME ); EtStringRegReadCipher( pPRNameBeingCopied->m_etstrDescription, keySubKey.m_hKey ,(char *) &szPICSRULESDESCRIPTION ); } }
{ CRegKey keySubKey;
//Read in the PICSRulesSource Structure
lError = keySubKey.Open( hKey, szPICSRULESPRSOURCE, KEY_READ );
if(lError!=ERROR_SUCCESS) { pPRRSBeingCopied->m_pPRSource=NULL; } else { pPRSourceBeingCopied=new PICSRulesSource;
if(pPRSourceBeingCopied==NULL) { TraceMsg( TF_WARNING, "ReadSystemFromRegistry() - Failed PICSRulesSource Creation!" ); PICSRulesOutOfMemory(); return(E_OUTOFMEMORY); } else { pPRRSBeingCopied->m_pPRSource=pPRSourceBeingCopied; } }
if((pPRRSBeingCopied->m_pPRSource)!=NULL) { EtStringRegReadCipher( pPRSourceBeingCopied->m_prURLSourceURL, keySubKey.m_hKey, (char *) &szPICSRULESSOURCEURL ); EtStringRegReadCipher( pPRSourceBeingCopied->m_etstrCreationTool, keySubKey.m_hKey, (char *) &szPICSRULESCREATIONTOOL ); EtStringRegReadCipher( pPRSourceBeingCopied->m_prEmailAuthor, keySubKey.m_hKey, (char *) &szPICSRULESEMAILAUTHOR ); EtStringRegReadCipher( pPRSourceBeingCopied->m_prDateLastModified, keySubKey.m_hKey, (char *) &szPICSRULESLASTMODIFIED ); } }
{ CRegKey keySubKey;
//Read in the PICSRulesPolicy structure
lError = keySubKey.Open( hKey, szPICSRULESPRPOLICY, KEY_READ );
if(lError!=ERROR_SUCCESS) { dwNumSystems=0; } else { EtNumRegReadCipher( etn, keySubKey.m_hKey, (char *) &szPICSRULESNUMPOLICYS );
dwNumSystems=etn.Get(); }
for(dwSubCounter=0;dwSubCounter<dwNumSystems;dwSubCounter++) { DWORD dwPolicyExpressionSubCounter; wsprintf(szNumber,"%d",dwSubCounter);
CRegKey keyCopy;
lError = keyCopy.Open( keySubKey.m_hKey, szNumber, KEY_READ );
if(lError!=ERROR_SUCCESS) { TraceMsg( TF_WARNING, "ReadSystemFromRegistry() - Failed keyCopy Open szNumber='%s'!", szNumber ); return(E_FAIL); } else { pPRPolicyBeingCopied=new PICSRulesPolicy;
if(pPRPolicyBeingCopied==NULL) { TraceMsg( TF_WARNING, "ReadSystemFromRegistry() - Failed PICSRulesPolicy Creation!" ); PICSRulesOutOfMemory(); return(E_OUTOFMEMORY); } }
pPRRSBeingCopied->m_arrpPRPolicy.Append(pPRPolicyBeingCopied);
EtStringRegReadCipher( pPRPolicyBeingCopied->m_etstrExplanation, keyCopy.m_hKey, (char *) &szPICSRULESPOLICYEXPLANATION );
EtNumRegReadCipher( etn, keyCopy.m_hKey, (char *) &szPICSRULESPOLICYATTRIBUTE );
pPRPolicyBeingCopied->m_PRPolicyAttribute=(PICSRulesPolicyAttribute) etn.Get();
CRegKey keyExpression;
lError = keyExpression.Open( keyCopy.m_hKey, szPICSRULESPOLICYSUB, KEY_READ );
if(lError!=ERROR_SUCCESS) { TraceMsg( TF_WARNING, "ReadSystemFromRegistry() - Failed keyExpression Open szPICSRULESPOLICYSUB='%s'!", szPICSRULESPOLICYSUB ); return(E_FAIL); }
pPRByURLToCopy=NULL; pPRPolicyExpressionBeingCopied=NULL;
switch(pPRPolicyBeingCopied->m_PRPolicyAttribute) { case PR_POLICY_ACCEPTBYURL: case PR_POLICY_REJECTBYURL: { pPRByURLToCopy=new PICSRulesByURL;
if(pPRByURLToCopy==NULL) { TraceMsg( TF_WARNING, "ReadSystemFromRegistry() - Failed PICSRulesByURL Creation!" ); PICSRulesOutOfMemory(); return(E_OUTOFMEMORY); }
break; } case PR_POLICY_REJECTIF: case PR_POLICY_ACCEPTIF: case PR_POLICY_REJECTUNLESS: case PR_POLICY_ACCEPTUNLESS: { pPRPolicyExpressionBeingCopied=new PICSRulesPolicyExpression;
if(pPRPolicyExpressionBeingCopied==NULL) { TraceMsg( TF_WARNING, "ReadSystemFromRegistry() - Failed PICSRulesPolicyExpression Creation!" ); PICSRulesOutOfMemory(); return(E_OUTOFMEMORY); }
break; } }
switch(pPRPolicyBeingCopied->m_PRPolicyAttribute) { case PR_POLICY_ACCEPTBYURL: { pPRPolicyBeingCopied->m_pPRAcceptByURL=pPRByURLToCopy; break; } case PR_POLICY_REJECTBYURL: { pPRPolicyBeingCopied->m_pPRRejectByURL=pPRByURLToCopy;
break; } case PR_POLICY_REJECTIF: { pPRPolicyBeingCopied->m_pPRRejectIf=pPRPolicyExpressionBeingCopied;
break; } case PR_POLICY_ACCEPTIF: { pPRPolicyBeingCopied->m_pPRAcceptIf=pPRPolicyExpressionBeingCopied;
break; } case PR_POLICY_REJECTUNLESS: { pPRPolicyBeingCopied->m_pPRRejectUnless=pPRPolicyExpressionBeingCopied;
break; } case PR_POLICY_ACCEPTUNLESS: { pPRPolicyBeingCopied->m_pPRAcceptUnless=pPRPolicyExpressionBeingCopied;
break; } }
if(pPRByURLToCopy!=NULL) { DWORD dwNumExpressions;
EtNumRegReadCipher( etn, keyExpression.m_hKey, (char *) &szPICSRULESNUMBYURL ); dwNumExpressions=etn.Get();
for(dwPolicyExpressionSubCounter=0; dwPolicyExpressionSubCounter<dwNumExpressions; dwPolicyExpressionSubCounter++) { CRegKey keyByURL;
wsprintf(szNumber,"%d",dwPolicyExpressionSubCounter);
lError = keyByURL.Open( keyExpression.m_hKey, szNumber, KEY_READ );
if(lError!=ERROR_SUCCESS) { TraceMsg( TF_WARNING, "ReadSystemFromRegistry() - Failed keyByURL Open szNumber='%s'!", szNumber ); return(E_FAIL); } else { pPRByURLExpressionToCopy=new PICSRulesByURLExpression;
if(pPRByURLExpressionToCopy==NULL) { TraceMsg( TF_WARNING, "ReadSystemFromRegistry() - Failed PICSRulesByURLExpression Creation!" ); PICSRulesOutOfMemory(); return(E_FAIL); } }
pPRByURLToCopy->m_arrpPRByURL.Append(pPRByURLExpressionToCopy);
EtBoolRegReadCipher( etb, keyByURL.m_hKey, (char *) szPICSRULESBYURLINTERNETPATTERN ); pPRByURLExpressionToCopy->m_fInternetPattern=etb.Get();
EtNumRegReadCipher( etn, keyByURL.m_hKey, (char *) szPICSRULESBYURLNONWILD ); pPRByURLExpressionToCopy->m_bNonWild = (unsigned char) etn.Get();
EtNumRegReadCipher( etn, keyByURL.m_hKey, (char *) szPICSRULESBYURLSPECIFIED ); pPRByURLExpressionToCopy->m_bSpecified = (unsigned char) etn.Get();
EtStringRegReadCipher( pPRByURLExpressionToCopy->m_etstrScheme, keyByURL.m_hKey, (char *) &szPICSRULESBYURLSCHEME ); EtStringRegReadCipher( pPRByURLExpressionToCopy->m_etstrUser, keyByURL.m_hKey, (char *) &szPICSRULESBYURLUSER ); EtStringRegReadCipher( pPRByURLExpressionToCopy->m_etstrHost, keyByURL.m_hKey, (char *) &szPICSRULESBYURLHOST ); EtStringRegReadCipher( pPRByURLExpressionToCopy->m_etstrPort, keyByURL.m_hKey, (char *) &szPICSRULESBYURLPORT ); EtStringRegReadCipher( pPRByURLExpressionToCopy->m_etstrPath, keyByURL.m_hKey, (char *) &szPICSRULESBYURLPATH ); EtStringRegReadCipher( pPRByURLExpressionToCopy->m_etstrURL, keyByURL.m_hKey, (char *) &szPICSRULESBYURLURL ); } }
if(pPRPolicyExpressionBeingCopied!=NULL) { PICSRulesPolicyExpression * pPRSubPolicyExpressionToCopy; int iTemp;
EtBoolRegReadCipher( etb, keyExpression.m_hKey,(char *) szPICSRULESEXPRESSIONEMBEDDED ); iTemp=(int) etb.Get(); pPRPolicyExpressionBeingCopied->m_prYesNoUseEmbedded.Set(&iTemp);
EtStringRegReadCipher( pPRPolicyExpressionBeingCopied->m_etstrServiceName, keyExpression.m_hKey, (char *) &szPICSRULESEXPRESSIONSERVICENAME ); EtStringRegReadCipher( pPRPolicyExpressionBeingCopied->m_etstrCategoryName, keyExpression.m_hKey, (char *) &szPICSRULESEXPRESSIONCATEGORYNAME ); EtStringRegReadCipher( pPRPolicyExpressionBeingCopied->m_etstrFullServiceName, keyExpression.m_hKey, (char *) &szPICSRULESEXPRESSIONFULLSERVICENAME );
EtNumRegReadCipher( etn, keyExpression.m_hKey, (char *) &szPICSRULESEXPRESSIONVALUE ); pPRPolicyExpressionBeingCopied->m_etnValue.Set(etn.Get());
EtNumRegReadCipher( etn, keyExpression.m_hKey, (char *) &szPICSRULESEXPRESSIONPOLICYOPERATOR ); pPRPolicyExpressionBeingCopied->m_PROPolicyOperator=(PICSRulesOperators) etn.Get();
EtNumRegReadCipher( etn, keyExpression.m_hKey, (char *) &szPICSRULESEXPRESSIONOPPOLICYEMBEDDED ); pPRPolicyExpressionBeingCopied->m_PRPEPolicyEmbedded=(PICSRulesPolicyEmbedded) etn.Get();
{ CRegKey keyExpressionSubKey;
lError = keyExpressionSubKey.Open( keyExpression.m_hKey, szPICSRULESEXPRESSIONLEFT, KEY_READ );
if(lError!=ERROR_SUCCESS) { pPRPolicyExpressionBeingCopied->m_pPRPolicyExpressionLeft=NULL; } else { pPRSubPolicyExpressionToCopy=new PICSRulesPolicyExpression;
if(pPRSubPolicyExpressionToCopy==NULL) { TraceMsg( TF_WARNING, "ReadSystemFromRegistry() - Failed LEFT PICSRulesPolicyExpression Creation!" ); PICSRulesOutOfMemory(); return(E_OUTOFMEMORY); }
pPRPolicyExpressionBeingCopied->m_pPRPolicyExpressionLeft=pPRSubPolicyExpressionToCopy;
if ( FAILED( CopySubPolicyExpressionFromRegistry( pPRSubPolicyExpressionToCopy, keyExpressionSubKey.m_hKey ) ) ) { TraceMsg( TF_WARNING, "ReadSystemFromRegistry() - Failed LEFT CopySubPolicyExpressionFromRegistry()!" ); return(E_FAIL); } } }
{ CRegKey keyExpressionSubKey;
lError = keyExpressionSubKey.Open( keyExpression.m_hKey, szPICSRULESEXPRESSIONRIGHT, KEY_READ );
if(lError!=ERROR_SUCCESS) { pPRPolicyExpressionBeingCopied->m_pPRPolicyExpressionRight=NULL; } else { pPRSubPolicyExpressionToCopy=new PICSRulesPolicyExpression;
if(pPRSubPolicyExpressionToCopy==NULL) { TraceMsg( TF_WARNING, "ReadSystemFromRegistry() - Failed RIGHT PICSRulesPolicyExpression Creation!" ); PICSRulesOutOfMemory(); return(E_OUTOFMEMORY); }
pPRPolicyExpressionBeingCopied->m_pPRPolicyExpressionRight=pPRSubPolicyExpressionToCopy;
if ( FAILED( CopySubPolicyExpressionFromRegistry( pPRSubPolicyExpressionToCopy, keyExpressionSubKey.m_hKey ) ) ) { TraceMsg( TF_WARNING, "ReadSystemFromRegistry() - Failed RIGHT CopySubPolicyExpressionFromRegistry()!" ); return(E_FAIL); } } } } } }
{ CRegKey keySubKey;
//Read In PICSRulesServiceInfo Structure
lError = keySubKey.Open( hKey, szPICSRULESSERVICEINFO, KEY_READ );
if(lError!=ERROR_SUCCESS) { dwNumServiceInfo=0; } else { EtNumRegReadCipher( etn, keySubKey.m_hKey ,(char *) &szPICSRULESNUMSERVICEINFO ); dwNumServiceInfo=etn.Get(); }
for(dwSubCounter=0;dwSubCounter<dwNumServiceInfo;dwSubCounter++) { CRegKey keyCopy; int iTemp;
wsprintf(szNumber,"%d",dwSubCounter);
lError = keyCopy.Open( keySubKey.m_hKey, szNumber, KEY_READ );
if(lError!=ERROR_SUCCESS) { TraceMsg( TF_WARNING, "ReadSystemFromRegistry() - Failed szPICSRULESSERVICEINFO keyCopy Open szNumber='%s'!", szNumber ); return(E_FAIL); } else { pPRServiceInfoBeingCopied=new PICSRulesServiceInfo;
if(pPRServiceInfoBeingCopied==NULL) { TraceMsg( TF_WARNING, "ReadSystemFromRegistry() - Failed PICSRulesServiceInfo Creation!" ); PICSRulesOutOfMemory(); return(E_OUTOFMEMORY); } }
pPRRSBeingCopied->m_arrpPRServiceInfo.Append(pPRServiceInfoBeingCopied);
EtStringRegReadCipher( pPRServiceInfoBeingCopied->m_prURLName, keyCopy.m_hKey, (char *) &szPICSRULESSIURLNAME ); EtStringRegReadCipher( pPRServiceInfoBeingCopied->m_prURLBureauURL, keyCopy.m_hKey, (char *) &szPICSRULESSIBUREAUURL ); EtStringRegReadCipher( pPRServiceInfoBeingCopied->m_etstrShortName, keyCopy.m_hKey, (char *) &szPICSRULESSISHORTNAME ); EtStringRegReadCipher( pPRServiceInfoBeingCopied->m_etstrRatfile, keyCopy.m_hKey, (char *) &szPICSRULESSIRATFILE );
EtBoolRegReadCipher( etb, keyCopy.m_hKey, (char *) &szPICSRULESSIUSEEMBEDDED ); iTemp=(int) etb.Get(); pPRServiceInfoBeingCopied->m_prYesNoUseEmbedded.Set(&iTemp);
EtBoolRegReadCipher( etb, keyCopy.m_hKey, (char *) &szPICSRULESSIBUREAUUNAVAILABLE ); iTemp=(int) etb.Get(); pPRServiceInfoBeingCopied->m_prPassFailBureauUnavailable.Set(&iTemp); } }
{ CRegKey keySubKey;
//Read in OptExtension Structures
lError = keySubKey.Open( hKey, szPICSRULESOPTEXTENSION, KEY_READ );
if(lError!=ERROR_SUCCESS) { dwNumExtensions=0; } else { EtNumRegReadCipher( etn, keySubKey.m_hKey, (char *) &szPICSRULESNUMOPTEXTENSIONS ); dwNumExtensions=etn.Get(); }
for(dwSubCounter=0;dwSubCounter<(DWORD) (pPRRSBeingCopied->m_arrpPROptExtension.Length());dwSubCounter++) { CRegKey keyCopy;
wsprintf(szNumber,"%d",dwSubCounter);
lError = keyCopy.Open( keySubKey.m_hKey, szNumber, KEY_READ );
if(lError!=ERROR_SUCCESS) { TraceMsg( TF_WARNING, "ReadSystemFromRegistry() - Failed szPICSRULESOPTEXTENSION keyCopy Open szNumber='%s'!", szNumber ); return(E_FAIL); } else { pPROptExtensionBeingCopied=new PICSRulesOptExtension;
if(pPROptExtensionBeingCopied==NULL) { TraceMsg( TF_WARNING, "ReadSystemFromRegistry() - Failed PICSRulesOptExtension Creation!" ); PICSRulesOutOfMemory(); return(E_OUTOFMEMORY); } }
pPRRSBeingCopied->m_arrpPROptExtension.Append(pPROptExtensionBeingCopied);
EtStringRegReadCipher( pPROptExtensionBeingCopied->m_prURLExtensionName, keyCopy.m_hKey, (char *) &szPICSRULESOPTEXTNAME ); EtStringRegReadCipher( pPROptExtensionBeingCopied->m_etstrShortName, keyCopy.m_hKey, (char *) &szPICSRULESOPTEXTSHORTNAME ); } }
{ CRegKey keySubKey;
//Read in ReqExtension Structures
lError = keySubKey.Open( hKey, szPICSRULESREQEXTENSION, KEY_READ );
if(lError!=ERROR_SUCCESS) { dwNumExtensions=0; } else { EtNumRegReadCipher( etn, keySubKey.m_hKey, (char *) &szPICSRULESNUMREQEXTENSIONS ); dwNumExtensions=etn.Get(); }
for(dwSubCounter=0;dwSubCounter<(DWORD) (pPRRSBeingCopied->m_arrpPRReqExtension.Length());dwSubCounter++) { CRegKey keyCopy;
wsprintf(szNumber,"%d",dwSubCounter);
lError = keyCopy.Open( keySubKey.m_hKey, szNumber, KEY_READ );
if(lError!=ERROR_SUCCESS) { TraceMsg( TF_WARNING, "ReadSystemFromRegistry() - Failed szPICSRULESREQEXTENSION keyCopy Open szNumber='%s'!", szNumber ); return(E_FAIL); } else { pPRReqExtensionBeingCopied=new PICSRulesReqExtension;
if(pPRReqExtensionBeingCopied==NULL) { TraceMsg( TF_WARNING, "ReadSystemFromRegistry() - Failed PICSRulesReqExtension Creation!" ); PICSRulesOutOfMemory(); return(E_OUTOFMEMORY); } }
pPRRSBeingCopied->m_arrpPRReqExtension.Append(pPRReqExtensionBeingCopied);
EtStringRegReadCipher( pPRReqExtensionBeingCopied->m_prURLExtensionName, keyCopy.m_hKey, (char *) &szPICSRULESREQEXTNAME ); EtStringRegReadCipher( pPRReqExtensionBeingCopied->m_etstrShortName, keyCopy.m_hKey, (char *) &szPICSRULESREQEXTSHORTNAME ); } }
// Insure the Copied Rating System is not deleted.
readRatingSystem.ValidRatingSystem();
TraceMsg( TF_ALWAYS, "ReadSystemFromRegistry() - Successfully Read PICS Rules from Registry!" );
return(NOERROR); }
HRESULT CopySubPolicyExpressionToRegistry(PICSRulesPolicyExpression * pPRPolicyExpressionBeingCopied,HKEY hKeyExpression) { ETB etb; ETN etn; long lError;
etb.Set(pPRPolicyExpressionBeingCopied->m_prYesNoUseEmbedded.GetYesNo()); EtBoolRegWriteCipher(etb,hKeyExpression,(char *) szPICSRULESEXPRESSIONEMBEDDED);
EtStringRegWriteCipher(pPRPolicyExpressionBeingCopied->m_etstrServiceName,hKeyExpression,(char *) &szPICSRULESEXPRESSIONSERVICENAME); EtStringRegWriteCipher(pPRPolicyExpressionBeingCopied->m_etstrCategoryName,hKeyExpression,(char *) &szPICSRULESEXPRESSIONCATEGORYNAME); EtStringRegWriteCipher(pPRPolicyExpressionBeingCopied->m_etstrFullServiceName,hKeyExpression,(char *) &szPICSRULESEXPRESSIONFULLSERVICENAME);
etn.Set(pPRPolicyExpressionBeingCopied->m_etnValue.Get()); EtNumRegWriteCipher(etn,hKeyExpression,(char *) &szPICSRULESEXPRESSIONVALUE);
etn.Set(pPRPolicyExpressionBeingCopied->m_PROPolicyOperator); EtNumRegWriteCipher(etn,hKeyExpression,(char *) &szPICSRULESEXPRESSIONPOLICYOPERATOR);
etn.Set(pPRPolicyExpressionBeingCopied->m_PRPEPolicyEmbedded); EtNumRegWriteCipher(etn,hKeyExpression,(char *) &szPICSRULESEXPRESSIONOPPOLICYEMBEDDED);
if(pPRPolicyExpressionBeingCopied->m_pPRPolicyExpressionLeft!=NULL) { PICSRulesPolicyExpression * pPRSubPolicyExpressionToCopy; CRegKey keyExpressionSubKey;
lError = keyExpressionSubKey.Create( hKeyExpression, szPICSRULESEXPRESSIONLEFT ); if ( lError != ERROR_SUCCESS ) { TraceMsg( TF_WARNING, "CopySubPolicyExpressionToRegistry() - Failed Registry Key Creation LEFT '%s' Expression!", szPICSRULESEXPRESSIONLEFT ); return(E_FAIL); }
pPRSubPolicyExpressionToCopy=pPRPolicyExpressionBeingCopied->m_pPRPolicyExpressionLeft;
if ( FAILED( CopySubPolicyExpressionToRegistry(pPRSubPolicyExpressionToCopy, keyExpressionSubKey.m_hKey ) ) ) { TraceMsg( TF_WARNING, "CopySubPolicyExpressionToRegistry() - Failed LEFT CopySubPolicyExpressionToRegistry() Recursive Call!" ); return(E_FAIL); } }
if(pPRPolicyExpressionBeingCopied->m_pPRPolicyExpressionRight!=NULL) { PICSRulesPolicyExpression * pPRSubPolicyExpressionToCopy; CRegKey keyExpressionSubKey;
lError = keyExpressionSubKey.Create( hKeyExpression, szPICSRULESEXPRESSIONRIGHT ); if ( lError != ERROR_SUCCESS ) { TraceMsg( TF_WARNING, "CopySubPolicyExpressionToRegistry() - Failed Registry Key Creation RIGHT '%s' Expression!", szPICSRULESEXPRESSIONRIGHT ); return(E_FAIL); }
pPRSubPolicyExpressionToCopy=pPRPolicyExpressionBeingCopied->m_pPRPolicyExpressionRight;
if ( FAILED( CopySubPolicyExpressionToRegistry(pPRSubPolicyExpressionToCopy, keyExpressionSubKey.m_hKey ) ) ) { TraceMsg( TF_WARNING, "CopySubPolicyExpressionToRegistry() - Failed RIGHT CopySubPolicyExpressionToRegistry() Recursive Call!" ); return(E_FAIL); } }
return(NOERROR); }
HRESULT WriteSystemToRegistry(HKEY hKey,PICSRulesRatingSystem **ppPRRS) { PICSRulesRatingSystem * pPRRSBeingCopied; PICSRulesPolicy * pPRPolicyBeingCopied; PICSRulesPolicyExpression * pPRPolicyExpressionBeingCopied; PICSRulesServiceInfo * pPRServiceInfoBeingCopied; PICSRulesOptExtension * pPROptExtensionBeingCopied; PICSRulesReqExtension * pPRReqExtensionBeingCopied; PICSRulesName * pPRNameBeingCopied; PICSRulesSource * pPRSourceBeingCopied; PICSRulesByURL * pPRByURLToCopy; PICSRulesByURLExpression * pPRByURLExpressionToCopy; ETN etn; ETB etb; long lError; char szNumber[MAX_PATH];
pPRRSBeingCopied=*ppPRRS;
if(pPRRSBeingCopied==NULL) { TraceMsg( TF_WARNING, "WriteSystemToRegistry() - pPRRSBeingCopied is NULL!" ); return(E_INVALIDARG); }
EtStringRegWriteCipher( pPRRSBeingCopied->m_etstrFile, hKey, (char *) &szPICSRULESFILENAME ); EtNumRegWriteCipher( pPRRSBeingCopied->m_etnPRVerMajor, hKey, (char *) &szPICSRULESVERMAJOR ); EtNumRegWriteCipher( pPRRSBeingCopied->m_etnPRVerMinor, hKey, (char *) &szPICSRULESVERMINOR );
etn.Set(pPRRSBeingCopied->m_dwFlags); EtNumRegWriteCipher( etn, hKey, (char *) &szPICSRULESDWFLAGS );
etn.Set(pPRRSBeingCopied->m_nErrLine); EtNumRegWriteCipher( etn, hKey, (char *) &szPICSRULESERRLINE );
if((pPRRSBeingCopied->m_pPRName)!=NULL) { CRegKey keySubKey;
lError = keySubKey.Create( hKey, szPICSRULESPRNAME ); if ( lError != ERROR_SUCCESS ) { TraceMsg( TF_WARNING, "WriteSystemToRegistry() - Failed to Create szPICSRULESPRNAME='%s' Key!", szPICSRULESPRNAME ); return(E_FAIL); }
pPRNameBeingCopied=pPRRSBeingCopied->m_pPRName;
EtStringRegWriteCipher( pPRNameBeingCopied->m_etstrRuleName, hKey, (char *) &szPICSRULESSYSTEMNAME ); EtStringRegWriteCipher( pPRNameBeingCopied->m_etstrRuleName, keySubKey.m_hKey, (char *) &szPICSRULESRULENAME ); EtStringRegWriteCipher( pPRNameBeingCopied->m_etstrDescription, keySubKey.m_hKey, (char *) &szPICSRULESDESCRIPTION ); }
if((pPRRSBeingCopied->m_pPRSource)!=NULL) { CRegKey keySubKey;
lError = keySubKey.Create( hKey, szPICSRULESPRSOURCE ); if ( lError != ERROR_SUCCESS ) { TraceMsg( TF_WARNING, "WriteSystemToRegistry() - Failed to Create szPICSRULESPRSOURCE='%s' Key!", szPICSRULESPRSOURCE ); return(E_FAIL); }
pPRSourceBeingCopied=pPRRSBeingCopied->m_pPRSource;
EtStringRegWriteCipher( pPRSourceBeingCopied->m_prURLSourceURL, keySubKey.m_hKey, (char *) &szPICSRULESSOURCEURL ); EtStringRegWriteCipher( pPRSourceBeingCopied->m_etstrCreationTool, keySubKey.m_hKey, (char *) &szPICSRULESCREATIONTOOL ); EtStringRegWriteCipher( pPRSourceBeingCopied->m_prEmailAuthor, keySubKey.m_hKey, (char *) &szPICSRULESEMAILAUTHOR ); EtStringRegWriteCipher( pPRSourceBeingCopied->m_prDateLastModified, keySubKey.m_hKey, (char *) &szPICSRULESLASTMODIFIED ); }
if(pPRRSBeingCopied->m_arrpPRPolicy.Length()>0) { CRegKey keySubKey; DWORD dwSubCounter;
lError = keySubKey.Create( hKey, szPICSRULESPRPOLICY ); if ( lError != ERROR_SUCCESS ) { TraceMsg( TF_WARNING, "WriteSystemToRegistry() - Failed to Create szPICSRULESPRPOLICY='%s' Key!", szPICSRULESPRPOLICY ); return(E_FAIL); }
etn.Set(pPRRSBeingCopied->m_arrpPRPolicy.Length()); EtNumRegWriteCipher( etn, keySubKey.m_hKey, (char *) &szPICSRULESNUMPOLICYS );
for(dwSubCounter=0;dwSubCounter<(DWORD) (pPRRSBeingCopied->m_arrpPRPolicy.Length());dwSubCounter++) { DWORD dwPolicyExpressionSubCounter;
wsprintf(szNumber,"%d",dwSubCounter);
CRegKey keyCopy;
lError = keyCopy.Create( keySubKey.m_hKey, szNumber ); if ( lError != ERROR_SUCCESS ) { TraceMsg( TF_WARNING, "WriteSystemToRegistry() - Failed to Create m_arrpPRPolicy szNumber='%s' Key!", szNumber ); return(E_FAIL); }
pPRPolicyBeingCopied=pPRRSBeingCopied->m_arrpPRPolicy[dwSubCounter];
EtStringRegWriteCipher( pPRPolicyBeingCopied->m_etstrExplanation, keyCopy.m_hKey, (char *) &szPICSRULESPOLICYEXPLANATION );
etn.Set(pPRPolicyBeingCopied->m_PRPolicyAttribute); EtNumRegWriteCipher( etn, keyCopy.m_hKey, (char *) &szPICSRULESPOLICYATTRIBUTE );
CRegKey keyExpression;
lError = keyExpression.Create( keyCopy.m_hKey, szPICSRULESPOLICYSUB ); if ( lError != ERROR_SUCCESS ) { TraceMsg( TF_WARNING, "WriteSystemToRegistry() - Failed to Create szPICSRULESPOLICYSUB='%s' Key!", szPICSRULESPOLICYSUB ); return(E_FAIL); }
pPRByURLToCopy=NULL; pPRPolicyExpressionBeingCopied=NULL;
switch(pPRPolicyBeingCopied->m_PRPolicyAttribute) { case PR_POLICY_ACCEPTBYURL: { pPRByURLToCopy=pPRPolicyBeingCopied->m_pPRAcceptByURL; break; } case PR_POLICY_REJECTBYURL: { pPRByURLToCopy=pPRPolicyBeingCopied->m_pPRRejectByURL;
break; } case PR_POLICY_REJECTIF: { pPRPolicyExpressionBeingCopied=pPRPolicyBeingCopied->m_pPRRejectIf;
break; } case PR_POLICY_ACCEPTIF: { pPRPolicyExpressionBeingCopied=pPRPolicyBeingCopied->m_pPRAcceptIf;
break; } case PR_POLICY_REJECTUNLESS: { pPRPolicyExpressionBeingCopied=pPRPolicyBeingCopied->m_pPRRejectUnless;
break; } case PR_POLICY_ACCEPTUNLESS: { pPRPolicyExpressionBeingCopied=pPRPolicyBeingCopied->m_pPRAcceptUnless;
break; } }
if(pPRByURLToCopy!=NULL) { etn.Set(pPRByURLToCopy->m_arrpPRByURL.Length()); EtNumRegWriteCipher( etn, keyExpression.m_hKey, (char *) &szPICSRULESNUMBYURL );
for(dwPolicyExpressionSubCounter=0; dwPolicyExpressionSubCounter<(DWORD) (pPRByURLToCopy->m_arrpPRByURL.Length()); dwPolicyExpressionSubCounter++) { CRegKey keyByURL;
wsprintf(szNumber,"%d",dwPolicyExpressionSubCounter);
lError = keyByURL.Create( keyExpression.m_hKey, szNumber ); if ( lError != ERROR_SUCCESS ) { TraceMsg( TF_WARNING, "WriteSystemToRegistry() - Failed to Create m_arrpPRByURL szNumber='%s' Key!", szNumber ); return(E_FAIL); }
pPRByURLExpressionToCopy=pPRByURLToCopy->m_arrpPRByURL[dwPolicyExpressionSubCounter];
etb.Set(pPRByURLExpressionToCopy->m_fInternetPattern); EtBoolRegWriteCipher( etb, keyByURL.m_hKey, (char *) szPICSRULESBYURLINTERNETPATTERN );
etn.Set(pPRByURLExpressionToCopy->m_bNonWild); EtNumRegWriteCipher( etn, keyByURL.m_hKey, (char *) szPICSRULESBYURLNONWILD );
etn.Set(pPRByURLExpressionToCopy->m_bSpecified); EtNumRegWriteCipher( etn, keyByURL.m_hKey, (char *) szPICSRULESBYURLSPECIFIED );
EtStringRegWriteCipher( pPRByURLExpressionToCopy->m_etstrScheme, keyByURL.m_hKey, (char *) &szPICSRULESBYURLSCHEME ); EtStringRegWriteCipher( pPRByURLExpressionToCopy->m_etstrUser, keyByURL.m_hKey, (char *) &szPICSRULESBYURLUSER ); EtStringRegWriteCipher( pPRByURLExpressionToCopy->m_etstrHost, keyByURL.m_hKey, (char *) &szPICSRULESBYURLHOST ); EtStringRegWriteCipher( pPRByURLExpressionToCopy->m_etstrPort, keyByURL.m_hKey, (char *) &szPICSRULESBYURLPORT ); EtStringRegWriteCipher( pPRByURLExpressionToCopy->m_etstrPath, keyByURL.m_hKey, (char *) &szPICSRULESBYURLPATH ); EtStringRegWriteCipher( pPRByURLExpressionToCopy->m_etstrURL, keyByURL.m_hKey, (char *) &szPICSRULESBYURLURL ); } }
if(pPRPolicyExpressionBeingCopied!=NULL) { etb.Set(pPRPolicyExpressionBeingCopied->m_prYesNoUseEmbedded.GetYesNo()); EtBoolRegWriteCipher( etb, keyExpression.m_hKey, (char *) szPICSRULESEXPRESSIONEMBEDDED );
EtStringRegWriteCipher( pPRPolicyExpressionBeingCopied->m_etstrServiceName, keyExpression.m_hKey, (char *) &szPICSRULESEXPRESSIONSERVICENAME ); EtStringRegWriteCipher( pPRPolicyExpressionBeingCopied->m_etstrCategoryName, keyExpression.m_hKey, (char *) &szPICSRULESEXPRESSIONCATEGORYNAME ); EtStringRegWriteCipher( pPRPolicyExpressionBeingCopied->m_etstrFullServiceName, keyExpression.m_hKey, (char *) &szPICSRULESEXPRESSIONFULLSERVICENAME );
etn.Set(pPRPolicyExpressionBeingCopied->m_etnValue.Get()); EtNumRegWriteCipher( etn, keyExpression.m_hKey, (char *) &szPICSRULESEXPRESSIONVALUE );
etn.Set(pPRPolicyExpressionBeingCopied->m_PROPolicyOperator); EtNumRegWriteCipher( etn, keyExpression.m_hKey, (char *) &szPICSRULESEXPRESSIONPOLICYOPERATOR );
etn.Set(pPRPolicyExpressionBeingCopied->m_PRPEPolicyEmbedded); EtNumRegWriteCipher( etn, keyExpression.m_hKey, (char *) &szPICSRULESEXPRESSIONOPPOLICYEMBEDDED );
if(pPRPolicyExpressionBeingCopied->m_pPRPolicyExpressionLeft!=NULL) { PICSRulesPolicyExpression * pPRSubPolicyExpressionToCopy; CRegKey keyExpressionSubKey;
lError = keyExpressionSubKey.Create( keyExpression.m_hKey, szPICSRULESEXPRESSIONLEFT ); if ( lError != ERROR_SUCCESS ) { TraceMsg( TF_WARNING, "WriteSystemToRegistry() - Failed to Create szPICSRULESEXPRESSIONLEFT='%s' Key!", szPICSRULESEXPRESSIONLEFT ); return(E_FAIL); }
pPRSubPolicyExpressionToCopy=pPRPolicyExpressionBeingCopied->m_pPRPolicyExpressionLeft;
if ( FAILED( CopySubPolicyExpressionToRegistry( pPRSubPolicyExpressionToCopy, keyExpressionSubKey.m_hKey ) ) ) { TraceMsg( TF_WARNING, "WriteSystemToRegistry() - Failed LEFT CopySubPolicyExpressionToRegistry() Call!" ); return(E_FAIL); } }
if(pPRPolicyExpressionBeingCopied->m_pPRPolicyExpressionRight!=NULL) { PICSRulesPolicyExpression * pPRSubPolicyExpressionToCopy; CRegKey keyExpressionSubKey;
lError = keyExpressionSubKey.Create( keyExpression.m_hKey, szPICSRULESEXPRESSIONRIGHT ); if ( lError != ERROR_SUCCESS ) { TraceMsg( TF_WARNING, "WriteSystemToRegistry() - Failed to Create szPICSRULESEXPRESSIONRIGHT='%s' Key!", szPICSRULESEXPRESSIONRIGHT ); return(E_FAIL); }
pPRSubPolicyExpressionToCopy=pPRPolicyExpressionBeingCopied->m_pPRPolicyExpressionRight;
if(FAILED(CopySubPolicyExpressionToRegistry(pPRSubPolicyExpressionToCopy, keyExpressionSubKey.m_hKey ))) { TraceMsg( TF_WARNING, "WriteSystemToRegistry() - Failed RIGHT CopySubPolicyExpressionToRegistry() Call!" ); return(E_FAIL); } } } } }
if(pPRRSBeingCopied->m_arrpPRServiceInfo.Length()>0) { CRegKey keySubKey; DWORD dwSubCounter;
lError = keySubKey.Create( hKey, szPICSRULESSERVICEINFO ); if ( lError != ERROR_SUCCESS ) { TraceMsg( TF_WARNING, "WriteSystemToRegistry() - Failed to Create szPICSRULESSERVICEINFO='%s' Key!", szPICSRULESSERVICEINFO ); return(E_FAIL); }
etn.Set(pPRRSBeingCopied->m_arrpPRServiceInfo.Length()); EtNumRegWriteCipher( etn, keySubKey.m_hKey, (char *) &szPICSRULESNUMSERVICEINFO );
for(dwSubCounter=0;dwSubCounter<(DWORD) (pPRRSBeingCopied->m_arrpPRServiceInfo.Length());dwSubCounter++) { CRegKey keyCopy;
wsprintf(szNumber,"%d",dwSubCounter);
lError = keyCopy.Create( keySubKey.m_hKey, szNumber ); if ( lError != ERROR_SUCCESS ) { TraceMsg( TF_WARNING, "WriteSystemToRegistry() - Failed to Create m_arrpPRServiceInfo szNumber='%s' Key!", szNumber ); return(E_FAIL); }
pPRServiceInfoBeingCopied=pPRRSBeingCopied->m_arrpPRServiceInfo[dwSubCounter];
EtStringRegWriteCipher( pPRServiceInfoBeingCopied->m_prURLName, keyCopy.m_hKey, (char *) &szPICSRULESSIURLNAME ); EtStringRegWriteCipher( pPRServiceInfoBeingCopied->m_prURLBureauURL, keyCopy.m_hKey, (char *) &szPICSRULESSIBUREAUURL ); EtStringRegWriteCipher( pPRServiceInfoBeingCopied->m_etstrShortName, keyCopy.m_hKey, (char *) &szPICSRULESSISHORTNAME ); EtStringRegWriteCipher( pPRServiceInfoBeingCopied->m_etstrRatfile, keyCopy.m_hKey, (char *) &szPICSRULESSIRATFILE );
etb.Set(pPRServiceInfoBeingCopied->m_prYesNoUseEmbedded.GetYesNo()); EtBoolRegWriteCipher( etb, keyCopy.m_hKey,(char *) &szPICSRULESSIUSEEMBEDDED );
etb.Set(pPRServiceInfoBeingCopied->m_prPassFailBureauUnavailable.GetPassFail()); EtBoolRegWriteCipher( etb, keyCopy.m_hKey,(char *) &szPICSRULESSIBUREAUUNAVAILABLE ); } }
if(pPRRSBeingCopied->m_arrpPROptExtension.Length()>0) { CRegKey keySubKey; DWORD dwSubCounter;
lError = keySubKey.Create( hKey, szPICSRULESOPTEXTENSION ); if ( lError != ERROR_SUCCESS ) { TraceMsg( TF_WARNING, "WriteSystemToRegistry() - Failed to Create szPICSRULESOPTEXTENSION='%s' Key!", szPICSRULESOPTEXTENSION ); return(E_FAIL); }
etn.Set(pPRRSBeingCopied->m_arrpPROptExtension.Length()); EtNumRegWriteCipher( etn, keySubKey.m_hKey, (char *) &szPICSRULESNUMOPTEXTENSIONS );
for(dwSubCounter=0;dwSubCounter<(DWORD) (pPRRSBeingCopied->m_arrpPROptExtension.Length());dwSubCounter++) { CRegKey keyCopy;
wsprintf(szNumber,"%d",dwSubCounter);
lError = keyCopy.Create( keySubKey.m_hKey, szNumber ); if ( lError != ERROR_SUCCESS ) { TraceMsg( TF_WARNING, "WriteSystemToRegistry() - Failed to Create m_arrpPROptExtension szNumber='%s' Key!", szNumber ); return(E_FAIL); }
pPROptExtensionBeingCopied=pPRRSBeingCopied->m_arrpPROptExtension[dwSubCounter];
EtStringRegWriteCipher( pPROptExtensionBeingCopied->m_prURLExtensionName, keyCopy.m_hKey, (char *) &szPICSRULESOPTEXTNAME ); EtStringRegWriteCipher( pPROptExtensionBeingCopied->m_etstrShortName, keyCopy.m_hKey, (char *) &szPICSRULESOPTEXTSHORTNAME ); } }
if(pPRRSBeingCopied->m_arrpPRReqExtension.Length()>0) { CRegKey keySubKey; DWORD dwSubCounter;
lError = keySubKey.Create( hKey, szPICSRULESREQEXTENSION ); if ( lError != ERROR_SUCCESS ) { TraceMsg( TF_WARNING, "WriteSystemToRegistry() - Failed to Create szPICSRULESREQEXTENSION='%s' Key!", szPICSRULESREQEXTENSION ); return(E_FAIL); }
etn.Set(pPRRSBeingCopied->m_arrpPRReqExtension.Length()); EtNumRegWriteCipher( etn, keySubKey.m_hKey, (char *) &szPICSRULESNUMREQEXTENSIONS );
for(dwSubCounter=0;dwSubCounter<(DWORD) (pPRRSBeingCopied->m_arrpPRReqExtension.Length());dwSubCounter++) { CRegKey keyCopy;
wsprintf(szNumber,"%d",dwSubCounter);
lError = keyCopy.Create( keySubKey.m_hKey, szNumber ); if ( lError != ERROR_SUCCESS ) { TraceMsg( TF_WARNING, "WriteSystemToRegistry() - Failed to Create m_arrpPRReqExtension szNumber='%s' Key!", szNumber ); return(E_FAIL); }
pPRReqExtensionBeingCopied=pPRRSBeingCopied->m_arrpPRReqExtension[dwSubCounter];
EtStringRegWriteCipher( pPRReqExtensionBeingCopied->m_prURLExtensionName, keyCopy.m_hKey, (char *) &szPICSRULESREQEXTNAME ); EtStringRegWriteCipher( pPRReqExtensionBeingCopied->m_etstrShortName, keyCopy.m_hKey, (char *) &szPICSRULESREQEXTSHORTNAME ); } }
TraceMsg( TF_ALWAYS, "WriteSystemToRegistry() - Successfully Created PICS Rules in Registry!" );
return(NOERROR); }
//*******************************************************************
//*
//* Code for saving and reading processed PICSRules from the registry
//*
//*******************************************************************
HRESULT WritePICSRulesToRegistry(LPCTSTR lpszUserName,HKEY hkeyUser,DWORD dwSystemToSave,PICSRulesRatingSystem **ppPRRS) { long lError; char *lpszSystemNumber; HRESULT hRes;
lpszSystemNumber=(char *) GlobalAlloc(GPTR,MAX_PATH);
if(lpszSystemNumber==NULL) { TraceMsg( TF_WARNING, "WritePICSRulesToRegistry() - lpszSystemNumber is NULL!" ); return(E_OUTOFMEMORY); }
CRegKey keyWrite;
lError = keyWrite.Create( hkeyUser, lpszUserName ); if ( lError != ERROR_SUCCESS ) { TraceMsg( TF_WARNING, "WritePICSRulesToRegistry() - Failed to Create lpszUserName='%s' Key!", lpszUserName ); return(E_FAIL); }
wsprintf(lpszSystemNumber,"%d",dwSystemToSave);
CRegKey keyNumbered;
lError = keyNumbered.Create( keyWrite.m_hKey, lpszSystemNumber ); if ( lError != ERROR_SUCCESS ) { TraceMsg( TF_WARNING, "WritePICSRulesToRegistry() - Failed to Create lpszSystemNumber='%s' Key!", lpszSystemNumber ); return(E_FAIL); }
hRes = WriteSystemToRegistry( keyNumbered.m_hKey, ppPRRS );
GlobalFree(lpszSystemNumber); lpszSystemNumber = NULL;
return(hRes); }
HRESULT PICSRulesSaveToRegistry(DWORD dwSystemToSave,PICSRulesRatingSystem **ppPRRS) { HRESULT hRes; CRegistryHive rh; CRegKey keyUser;
if(!(gPRSI->fSettingsValid)||!(gPRSI->fRatingInstalled)) { return(E_INVALIDARG); //there isn't a valid ratings system to save to
}
//load the hive file
if ( gPRSI->fStoreInRegistry ) { keyUser.Create( HKEY_LOCAL_MACHINE, szPICSRULESSYSTEMS ); } else { if ( rh.OpenHiveFile( true ) ) { keyUser.Create( rh.GetHiveKey().m_hKey, szPICSRULESSYSTEMS ); } }
//write information to the registry
if ( keyUser.m_hKey != NULL ) { LPCTSTR lpszUsername;
lpszUsername=gPRSI->pUserObject->nlsUsername.QueryPch();
hRes = WritePICSRulesToRegistry( lpszUsername, keyUser.m_hKey, dwSystemToSave, ppPRRS );
keyUser.Close();
if ( FAILED(hRes) ) { TraceMsg( TF_WARNING, "PICSRulesSaveToRegistry() - WritePICSRulesToRegistry Failed with hRes=0x%x!", hRes ); return(hRes); } } else { // failed to create the registry key
hRes = E_FAIL; }
return(hRes); }
HRESULT PICSRulesReadFromRegistry(DWORD dwSystemToRead, PICSRulesRatingSystem **ppPRRS) { long lError;
if(!(gPRSI->fSettingsValid)||!(gPRSI->fRatingInstalled)) { return(E_INVALIDARG); //there isn't a valid ratings system to read from
}
CRegistryHive rh; CRegKey keyUser;
//load the hive file
if(gPRSI->fStoreInRegistry) { lError = keyUser.Open( HKEY_LOCAL_MACHINE, szPICSRULESSYSTEMS, KEY_READ ); } else { if ( rh.OpenHiveFile( false ) ) { ASSERT( rh.GetHiveKey().m_hKey != NULL );
lError = keyUser.Open( rh.GetHiveKey().m_hKey, szPICSRULESSYSTEMS, KEY_READ ); } }
//read information from the registry
if ( keyUser.m_hKey != NULL ) { LPCTSTR lpszUsername; TCHAR szSystem[20];
lpszUsername=gPRSI->pUserObject->nlsUsername.QueryPch();
CRegKey keyWrite;
lError = keyWrite.Open( keyUser.m_hKey, lpszUsername, KEY_READ );
if(lError!=ERROR_SUCCESS) { TraceMsg( TF_WARNING, "PICSRulesReadFromRegistry() - Failed keyWrite lpszUsername='%s' Key Open!", lpszUsername ); keyUser.Close(); return(E_FAIL); }
wnsprintf(szSystem,ARRAYSIZE(szSystem),"%d",dwSystemToRead);
CRegKey keySystem;
lError = keySystem.Open( keyWrite.m_hKey, szSystem, KEY_READ );
if ( lError != ERROR_SUCCESS ) { TraceMsg( TF_WARNING, "PICSRulesReadFromRegistry() - Failed keySystem lpszSystem='%s' Key Open!", szSystem ); }
if( lError != ERROR_SUCCESS ) { keyWrite.Close(); keyUser.Close(); return(E_FAIL); }
HRESULT hr = ReadSystemFromRegistry( keySystem.m_hKey, ppPRRS );
keySystem.Close(); keyWrite.Close(); keyUser.Close();
if ( FAILED( hr ) ) { TraceMsg( TF_WARNING, "PICSRulesReadFromRegistry() - Failed ReadSystemFromRegistry()!" ); return(E_FAIL); } }
return(S_OK); }
HRESULT PICSRulesDeleteSystem(DWORD dwSystemToDelete) { long lError; char * lpszSystem; CRegistryHive rh; CRegKey keyUser;
if(!(gPRSI->fSettingsValid)||!(gPRSI->fRatingInstalled)) { return(E_INVALIDARG); //there isn't a valid ratings system to read from
}
//load the hive file
if ( gPRSI->fStoreInRegistry ) { keyUser.Create( HKEY_LOCAL_MACHINE, szPICSRULESSYSTEMS ); } else { if ( rh.OpenHiveFile( true ) ) { keyUser.Create( rh.GetHiveKey().m_hKey, szPICSRULESSYSTEMS ); } }
//delete information from the registry
if ( keyUser.m_hKey != NULL ) { CRegKey keyWrite; LPCTSTR lpszUsername;
lpszUsername = gPRSI->pUserObject->nlsUsername.QueryPch();
lError = keyWrite.Create( keyUser.m_hKey, lpszUsername ); if ( lError != ERROR_SUCCESS ) { TraceMsg( TF_WARNING, "PICSRulesDeleteSystem() - Failed to Create lpszUsername='%s' Key!", lpszUsername ); keyUser.Close(); return(E_FAIL); }
lpszSystem=(char *) GlobalAlloc(GPTR,MAX_PATH);
wsprintf(lpszSystem,"%d",dwSystemToDelete);
MyRegDeleteKey( keyWrite.m_hKey, lpszSystem );
GlobalFree(lpszSystem); lpszSystem = NULL;
keyWrite.Close(); keyUser.Close(); }
return(NOERROR); }
HRESULT PICSRulesGetNumSystems(DWORD * pdwNumSystems) { long lError;
if (pdwNumSystems) { *pdwNumSystems = 0; }
if(!(gPRSI->fSettingsValid)||!(gPRSI->fRatingInstalled)) { return(E_INVALIDARG); //there isn't a valid ratings system to read from
}
CRegistryHive rh; CRegKey keyUser;
//load the hive file
if(gPRSI->fStoreInRegistry) { keyUser.Open( HKEY_LOCAL_MACHINE, szPICSRULESSYSTEMS, KEY_READ ); } else { if ( rh.OpenHiveFile( false ) ) { ASSERT( rh.GetHiveKey().m_hKey != NULL );
keyUser.Open( rh.GetHiveKey().m_hKey, szPICSRULESSYSTEMS, KEY_READ ); } }
//read information from the registry
if ( keyUser.m_hKey != NULL ) { LPCTSTR lpszUsername;
lpszUsername=gPRSI->pUserObject->nlsUsername.QueryPch();
CRegKey keyWrite;
lError = keyWrite.Open( keyUser.m_hKey, lpszUsername, KEY_READ );
if(lError!=ERROR_SUCCESS) { TraceMsg( TF_WARNING, "PICSRulesGetNumSystems() - Failed keyWrite lpszUsername='%s' Key Open!", lpszUsername ); return(E_FAIL); }
DWORD dwNumSystems;
if ( keyWrite.QueryValue( dwNumSystems, szPICSRULESNUMSYS ) != ERROR_SUCCESS ) { //no value set, so we have zero systems installed
*pdwNumSystems = 0; } else { *pdwNumSystems = dwNumSystems; }
keyWrite.Close(); keyUser.Close(); }
return(NOERROR); }
HRESULT PICSRulesSetNumSystems(DWORD dwNumSystems) { long lError;
if(!(gPRSI->fSettingsValid)||!(gPRSI->fRatingInstalled)) { return(E_INVALIDARG); //there isn't a valid ratings system to save to
}
CRegistryHive rh; CRegKey keyUser;
//load the hive file
if(gPRSI->fStoreInRegistry) { keyUser.Create( HKEY_LOCAL_MACHINE, szPICSRULESSYSTEMS ); } else { if ( rh.OpenHiveFile( true ) ) { ASSERT( rh.GetHiveKey().m_hKey != NULL );
keyUser.Create( rh.GetHiveKey().m_hKey, szPICSRULESSYSTEMS ); } }
//write information to the registry
if ( keyUser.m_hKey != NULL ) { CRegKey keyWrite; LPCTSTR lpszUsername;
lpszUsername=gPRSI->pUserObject->nlsUsername.QueryPch();
lError = keyWrite.Create( keyUser.m_hKey, lpszUsername ); if(lError!=ERROR_SUCCESS) { TraceMsg( TF_WARNING, "PICSRulesSetNumSystems() - Failed to Create keyWrite lpszUsername='%s' Key!", lpszUsername ); keyUser.Close(); return(E_FAIL); }
lError = keyWrite.SetValue( dwNumSystems, szPICSRULESNUMSYS );
keyWrite.Close(); keyUser.Close();
if ( lError != ERROR_SUCCESS ) { TraceMsg( TF_WARNING, "PICSRulesSetNumSystems() - Failed to Set keyWrite dwNumSystems='%d' Value!", dwNumSystems ); return(E_FAIL); } }
return(NOERROR); }
HRESULT PICSRulesCheckApprovedSitesAccess(LPCSTR lpszUrl,BOOL *fPassFail) { int iCounter; PICSRulesEvaluation PREvaluation = PR_EVALUATION_DOESNOTAPPLY;
if(g_pApprovedPRRS==NULL) { return(E_FAIL); }
if(g_lApprovedSitesGlobalCounterValue!=SHGlobalCounterGetValue(g_ApprovedSitesHandleGlobalCounter)) { PICSRulesRatingSystem * pPRRS=NULL; HRESULT hRes;
hRes=PICSRulesReadFromRegistry(PICSRULES_APPROVEDSITES,&pPRRS);
if(SUCCEEDED(hRes)) { if(g_pApprovedPRRS!=NULL) { delete g_pApprovedPRRS; }
g_pApprovedPRRS=pPRRS; }
g_lApprovedSitesGlobalCounterValue=SHGlobalCounterGetValue(g_ApprovedSitesHandleGlobalCounter); }
for(iCounter=0;iCounter<g_pApprovedPRRS->m_arrpPRPolicy.Length();iCounter++) { PICSRulesPolicy * pPRPolicy; PICSRulesByURL * pPRByURL; PICSRulesQuotedURL PRQuotedURL;
pPRPolicy=g_pApprovedPRRS->m_arrpPRPolicy[iCounter];
if(pPRPolicy->m_PRPolicyAttribute==PR_POLICY_ACCEPTBYURL) { *fPassFail=PR_PASSFAIL_PASS;
pPRByURL=pPRPolicy->m_pPRAcceptByURL; } else { *fPassFail=PR_PASSFAIL_FAIL;
pPRByURL=pPRPolicy->m_pPRRejectByURL; }
PRQuotedURL.Set(lpszUrl);
PREvaluation=pPRByURL->EvaluateRule(&PRQuotedURL);
if(PREvaluation!=PR_EVALUATION_DOESNOTAPPLY) { break; } } if(PREvaluation==PR_EVALUATION_DOESAPPLY) { return(S_OK); } else { return(E_FAIL); } }
HRESULT PICSRulesCheckAccess(LPCSTR lpszUrl,LPCSTR lpszRatingInfo,BOOL *fPassFail,CParsedLabelList **ppParsed) { int iCounter,iSystemCounter; PICSRulesEvaluation PREvaluation; CParsedLabelList *pParsed=NULL; if(g_arrpPRRS.Length()==0) { return(E_FAIL); }
if(g_lGlobalCounterValue!=SHGlobalCounterGetValue(g_HandleGlobalCounter)) { HRESULT hRes; DWORD dwNumSystems; PICSRulesRatingSystem * pPRRS=NULL;
g_arrpPRRS.DeleteAll();
//someone modified our settings, so we'd better reload them.
hRes=PICSRulesGetNumSystems(&dwNumSystems);
if(SUCCEEDED(hRes)) { DWORD dwCounter;
for(dwCounter=PICSRULES_FIRSTSYSTEMINDEX; dwCounter<(dwNumSystems+PICSRULES_FIRSTSYSTEMINDEX); dwCounter++) { hRes=PICSRulesReadFromRegistry(dwCounter,&pPRRS);
if(FAILED(hRes)) { char *lpszTitle,*lpszMessage;
//we couldn't read in the systems, so don't inforce PICSRules,
//and notify the user
g_arrpPRRS.DeleteAll();
lpszTitle=(char *) GlobalAlloc(GPTR,MAX_PATH); lpszMessage=(char *) GlobalAlloc(GPTR,MAX_PATH);
MLLoadString(IDS_PICSRULES_TAMPEREDREADTITLE,(LPTSTR) lpszTitle,MAX_PATH); MLLoadString(IDS_PICSRULES_TAMPEREDREADMSG,(LPTSTR) lpszMessage,MAX_PATH);
MessageBox(NULL,(LPCTSTR) lpszMessage,(LPCTSTR) lpszTitle,MB_OK|MB_ICONERROR);
GlobalFree(lpszTitle); lpszTitle = NULL; GlobalFree(lpszMessage); lpszMessage = NULL;
break; } else { g_arrpPRRS.Append(pPRRS);
pPRRS=NULL; } } }
g_lGlobalCounterValue=SHGlobalCounterGetValue(g_HandleGlobalCounter); }
if(lpszRatingInfo!=NULL) { ParseLabelList(lpszRatingInfo,ppParsed); pParsed=*ppParsed; }
for(iSystemCounter=0;iSystemCounter<g_arrpPRRS.Length();iSystemCounter++) { PICSRulesRatingSystem * pPRRSCheck;
pPRRSCheck=g_arrpPRRS[iSystemCounter];
for(iCounter=0;iCounter<pPRRSCheck->m_arrpPRPolicy.Length();iCounter++) { PICSRulesPolicy * pPRPolicy; PICSRulesPolicyExpression * pPRPolicyExpression; PICSRulesByURL * pPRByURL; PICSRulesQuotedURL PRQuotedURL;
pPRPolicy=pPRRSCheck->m_arrpPRPolicy[iCounter];
switch(pPRPolicy->m_PRPolicyAttribute) { case PR_POLICY_ACCEPTBYURL: { *fPassFail=PR_PASSFAIL_PASS;
pPRByURL=pPRPolicy->m_pPRAcceptByURL;
PRQuotedURL.Set(lpszUrl);
PREvaluation=pPRByURL->EvaluateRule(&PRQuotedURL);
break; } case PR_POLICY_REJECTBYURL: { *fPassFail=PR_PASSFAIL_FAIL;
pPRByURL=pPRPolicy->m_pPRRejectByURL;
PRQuotedURL.Set(lpszUrl);
PREvaluation=pPRByURL->EvaluateRule(&PRQuotedURL);
break; } case PR_POLICY_REJECTIF: { *fPassFail=PR_PASSFAIL_FAIL;
pPRPolicyExpression=pPRPolicy->m_pPRRejectIf; PREvaluation=pPRPolicyExpression->EvaluateRule(pParsed);
break; } case PR_POLICY_ACCEPTIF: { *fPassFail=PR_PASSFAIL_PASS;
pPRPolicyExpression=pPRPolicy->m_pPRAcceptIf; PREvaluation=pPRPolicyExpression->EvaluateRule(pParsed);
break; } case PR_POLICY_REJECTUNLESS: { *fPassFail=PR_PASSFAIL_FAIL;
pPRPolicyExpression=pPRPolicy->m_pPRRejectUnless; PREvaluation=pPRPolicyExpression->EvaluateRule(pParsed);
if(PREvaluation==PR_EVALUATION_DOESNOTAPPLY) { PREvaluation=PR_EVALUATION_DOESAPPLY; } else { PREvaluation=PR_EVALUATION_DOESNOTAPPLY; }
break; } case PR_POLICY_ACCEPTUNLESS: { *fPassFail=PR_PASSFAIL_PASS;
pPRPolicyExpression=pPRPolicy->m_pPRAcceptUnless; PREvaluation=pPRPolicyExpression->EvaluateRule(pParsed);
if(PREvaluation==PR_EVALUATION_DOESNOTAPPLY) { PREvaluation=PR_EVALUATION_DOESAPPLY; } else { PREvaluation=PR_EVALUATION_DOESNOTAPPLY; }
break; } case PR_POLICY_NONEVALID: default: { PREvaluation=PR_EVALUATION_DOESNOTAPPLY;
continue; } }
if(PREvaluation!=PR_EVALUATION_DOESNOTAPPLY) { break; } }
if(PREvaluation!=PR_EVALUATION_DOESNOTAPPLY) { break; } } if(PREvaluation==PR_EVALUATION_DOESAPPLY) { return(S_OK); } else { return(E_FAIL); } }
|