514 lines
16 KiB
C++
514 lines
16 KiB
C++
//*******************************************************************
|
|
//*
|
|
//* PICSRule.h
|
|
//*
|
|
//* Revision History:
|
|
//* Created 7/98 - Mark Hammond (t-markh)
|
|
//*
|
|
//* Contains classes and function prototypes
|
|
//* used for processing PICSRules files.
|
|
//*
|
|
//*******************************************************************
|
|
|
|
#ifndef PICS_RULE_H
|
|
#define PICS_RULE_H
|
|
|
|
//*******************************************************************
|
|
//*
|
|
//* Function Prototypes / class declarations
|
|
//*
|
|
//*******************************************************************
|
|
|
|
//Forward class declarations
|
|
class PICSRulesQuotedURL;
|
|
class PICSRulesQuotedEmail;
|
|
class PICSRulesQuotedDate;
|
|
class PICSRulesYesNo;
|
|
class PICSRulesPassFail;
|
|
class PICSRulesPolicyExpression;
|
|
class PICSRulesByURL;
|
|
class PICSRulesPolicy;
|
|
class PICSRulesName;
|
|
class PICSRulesSource;
|
|
class PICSRulesServiceInfo;
|
|
class PICSRulesOptExtension;
|
|
class PICSRulesReqExtension;
|
|
class PICSRulesFileParser;
|
|
class PICSRulesRatingSystem;
|
|
class CParsedLabelList;
|
|
|
|
//This function is called by ApprovedSitesDlgProc 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);
|
|
|
|
//For reading and saving processed PICSRules from the registry
|
|
HRESULT PICSRulesSaveToRegistry(DWORD dwSystemToSave, PICSRulesRatingSystem **ppPRRS);
|
|
HRESULT PICSRulesReadFromRegistry(DWORD dwSystemToRead, PICSRulesRatingSystem **ppPRRS);
|
|
HRESULT PICSRulesDeleteSystem(DWORD dwSystemToDelete);
|
|
HRESULT PICSRulesSetNumSystems(DWORD dwNumSystems);
|
|
HRESULT PICSRulesGetNumSystems(DWORD * pdwNumSystems);
|
|
HRESULT PICSRulesCheckApprovedSitesAccess(LPCSTR lpszUrl,BOOL *fPassFail);
|
|
HRESULT PICSRulesCheckAccess(LPCSTR lpszUrl,LPCSTR lpszRatingInfo,BOOL *fPassFail,CParsedLabelList **ppParsed);
|
|
void PICSRulesOutOfMemory();
|
|
|
|
//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
|
|
HRESULT PICSRulesParseString(LPSTR *ppszIn, LPVOID *ppOut, PICSRulesFileParser *pParser);
|
|
HRESULT PICSRulesParseNumber(LPSTR *ppszIn, LPVOID *ppOut, PICSRulesFileParser *pParser);
|
|
HRESULT PICSRulesParseYesNo(LPSTR *ppszIn, LPVOID *ppOut, PICSRulesFileParser *pParser);
|
|
HRESULT PICSRulesParsePassFail(LPSTR *ppszIn, LPVOID *ppOut, PICSRulesFileParser *pParser);
|
|
|
|
BOOL IsURLValid(WCHAR wcszURL[]);
|
|
|
|
//*******************************************************************
|
|
//*
|
|
//* Definitions used by the PICSRules code
|
|
//*
|
|
//*******************************************************************
|
|
#define PR_QUOTE_DOUBLE 1
|
|
#define PR_QUOTE_SINGLE 0
|
|
|
|
#define BYURL_SCHEME 1
|
|
#define BYURL_USER 2
|
|
#define BYURL_HOST 4
|
|
#define BYURL_PORT 8
|
|
#define BYURL_PATH 16
|
|
|
|
#define PICSRULES_FIRSTSYSTEMINDEX 100
|
|
#define PICSRULES_MAXSYSTEM 1000000
|
|
#define PICSRULES_APPROVEDSITES 0
|
|
|
|
#define PICSRULES_ALWAYS 1
|
|
#define PICSRULES_NEVER 0
|
|
|
|
#define PICSRULES_PAGE 1
|
|
#define PICSRULES_SITE 0
|
|
|
|
#define PICS_LABEL_FROM_HEADER 0
|
|
#define PICS_LABEL_FROM_PAGE 1
|
|
#define PICS_LABEL_FROM_BUREAU 2
|
|
|
|
struct PICSRULES_VERSION
|
|
{
|
|
int iPICSRulesVerMajor,iPICSRulesVerMinor;
|
|
};
|
|
|
|
//Data types for the necessary logic in evaluating
|
|
//the rules.
|
|
enum PICSRulesOperators
|
|
{
|
|
PR_OPERATOR_INVALID,
|
|
PR_OPERATOR_GREATEROREQUAL,
|
|
PR_OPERATOR_GREATER,
|
|
PR_OPERATOR_EQUAL,
|
|
PR_OPERATOR_LESSOREQUAL,
|
|
PR_OPERATOR_LESS,
|
|
PR_OPERATOR_DEGENERATE,
|
|
PR_OPERATOR_SERVICEONLY,
|
|
PR_OPERATOR_SERVICEANDCATEGORY,
|
|
PR_OPERATOR_RESULT
|
|
};
|
|
|
|
enum PICSRulesEvaluation
|
|
{
|
|
PR_EVALUATION_DOESAPPLY,
|
|
PR_EVALUATION_DOESNOTAPPLY
|
|
};
|
|
|
|
//This indicates which member is valid in a PICSRulesPolicy
|
|
//Class
|
|
enum PICSRulesPolicyAttribute
|
|
{
|
|
PR_POLICY_NONEVALID,
|
|
PR_POLICY_REJECTBYURL,
|
|
PR_POLICY_ACCEPTBYURL,
|
|
PR_POLICY_REJECTIF,
|
|
PR_POLICY_ACCEPTIF,
|
|
PR_POLICY_REJECTUNLESS,
|
|
PR_POLICY_ACCEPTUNLESS
|
|
};
|
|
|
|
//This indicates if a PolicyExpression is embedded in another
|
|
//PolicyExpression, and if so, what logic to use.
|
|
enum PICSRulesPolicyEmbedded
|
|
{
|
|
PR_POLICYEMBEDDED_NONE,
|
|
PR_POLICYEMBEDDED_OR,
|
|
PR_POLICYEMBEDDED_AND
|
|
};
|
|
|
|
//*******************************************************************
|
|
//*
|
|
//* Classes to handle possible value types... all derive from
|
|
//* ETS (the encapsulated string type) since the are found as
|
|
//* strings during processing.
|
|
//*
|
|
//* The Set() and SetTo() member functions are overloaded on the
|
|
//* types which convert from a string. We want to keep the original
|
|
//* string in case the data is invalid.
|
|
//*
|
|
//* Additional member functions are provided to assure that the
|
|
//* data is what it says it is, and to return the non-string type.
|
|
//*
|
|
//*******************************************************************
|
|
class PICSRulesByURLExpression
|
|
{
|
|
public:
|
|
PICSRulesByURLExpression();
|
|
~PICSRulesByURLExpression();
|
|
|
|
BOOL m_fInternetPattern;
|
|
BYTE m_bNonWild,m_bSpecified;
|
|
ETS m_etstrScheme,m_etstrUser,m_etstrHost,m_etstrPort,m_etstrPath,m_etstrURL;
|
|
};
|
|
|
|
class PICSRulesQuotedURL : public ETS
|
|
{
|
|
public:
|
|
PICSRulesQuotedURL();
|
|
~PICSRulesQuotedURL();
|
|
|
|
BOOL IsURLValid();
|
|
BOOL IsURLValid(char * lpszURL);
|
|
BOOL IsURLValid(ETS etstrURL);
|
|
};
|
|
|
|
class PICSRulesQuotedEmail : public ETS
|
|
{
|
|
public:
|
|
PICSRulesQuotedEmail();
|
|
~PICSRulesQuotedEmail();
|
|
|
|
BOOL IsEmailValid();
|
|
BOOL IsEmailValid(char * lpszEmail);
|
|
BOOL IsEmailValid(ETS etstrEmail);
|
|
};
|
|
|
|
class PICSRulesQuotedDate : public ETS
|
|
{
|
|
public:
|
|
PICSRulesQuotedDate();
|
|
~PICSRulesQuotedDate();
|
|
|
|
BOOL IsDateValid();
|
|
BOOL IsDateValid(char * lpszDate);
|
|
BOOL IsDateValid(ETS etstrDate);
|
|
|
|
HRESULT Set(const char *pIn);
|
|
HRESULT SetTo(char *pIn);
|
|
|
|
DWORD GetDate()
|
|
{
|
|
return m_dwDate;
|
|
};
|
|
|
|
private:
|
|
DWORD m_dwDate;
|
|
};
|
|
|
|
class PICSRulesYesNo : public ETS
|
|
{
|
|
public:
|
|
PICSRulesYesNo();
|
|
~PICSRulesYesNo();
|
|
|
|
void Set(const BOOL *pIn);
|
|
void SetTo(BOOL *pIn);
|
|
|
|
BOOL GetYesNo()
|
|
{
|
|
return m_fYesOrNo;
|
|
};
|
|
|
|
private:
|
|
BOOL m_fYesOrNo;
|
|
};
|
|
|
|
class PICSRulesPassFail : public ETS
|
|
{
|
|
public:
|
|
PICSRulesPassFail();
|
|
~PICSRulesPassFail();
|
|
|
|
void Set(const BOOL *pIn);
|
|
void SetTo(BOOL *pIn);
|
|
|
|
BOOL GetPassFail()
|
|
{
|
|
return m_fPassOrFail;
|
|
};
|
|
|
|
private:
|
|
BOOL m_fPassOrFail;
|
|
};
|
|
|
|
//*******************************************************************
|
|
//*
|
|
//* The PICSRulesPolicy class handles the "Policy" token
|
|
//* from a PICSRules stream, and its attributes (square brackets
|
|
//* denote the primary attribute):
|
|
//*
|
|
//* Policy (
|
|
//* [Explanation] quoted
|
|
//* RejectByURL URL | ( [patterns] URL )
|
|
//* AcceptByURL URL | ( [patterns] URL )
|
|
//* RejectIf PolicyExpression
|
|
//* RejectUnless PolicyExpression
|
|
//* AcceptIf PolicyExpression
|
|
//* AcceptUnless PolicyExpression
|
|
//* *Extension* )
|
|
//*
|
|
//*******************************************************************
|
|
|
|
class PICSRulesPolicyExpression
|
|
{
|
|
public:
|
|
PICSRulesPolicyExpression * m_pPRPolicyExpressionLeft,
|
|
* m_pPRPolicyExpressionRight;
|
|
ETS m_etstrServiceName,m_etstrCategoryName,
|
|
m_etstrFullServiceName;
|
|
ETN m_etnValue;
|
|
PICSRulesYesNo m_prYesNoUseEmbedded;
|
|
enum PICSRulesOperators m_PROPolicyOperator;
|
|
enum PICSRulesPolicyEmbedded m_PRPEPolicyEmbedded;
|
|
|
|
PICSRulesPolicyExpression();
|
|
~PICSRulesPolicyExpression();
|
|
|
|
PICSRulesEvaluation EvaluateRule(CParsedLabelList *pParsed);
|
|
};
|
|
|
|
class PICSRulesByURL
|
|
{
|
|
public:
|
|
array<PICSRulesByURLExpression*> m_arrpPRByURL;
|
|
|
|
PICSRulesByURL();
|
|
~PICSRulesByURL();
|
|
|
|
PICSRulesEvaluation EvaluateRule(PICSRulesQuotedURL *pprurlComparisonURL);
|
|
};
|
|
|
|
class PICSRulesPolicy : public PICSRulesObjectBase
|
|
{
|
|
public:
|
|
ETS m_etstrExplanation;
|
|
PICSRulesPolicyExpression * m_pPRRejectIf,* m_pPRRejectUnless,
|
|
* m_pPRAcceptIf,* m_pPRAcceptUnless;
|
|
PICSRulesByURL * m_pPRRejectByURL,* m_pPRAcceptByURL;
|
|
PICSRulesPolicyAttribute m_PRPolicyAttribute;
|
|
|
|
PICSRulesPolicy();
|
|
~PICSRulesPolicy();
|
|
|
|
HRESULT AddItem(PICSRulesObjectID proid, LPVOID pData);
|
|
HRESULT InitializeMyDefaults();
|
|
};
|
|
|
|
//*******************************************************************
|
|
//*
|
|
//* The PICSRulesName class handles the "name" token
|
|
//* from a PICSRules stream, and its attributes (square brackets
|
|
//* denote the primary attribute):
|
|
//*
|
|
//* name (
|
|
//* [Rulename] quoted
|
|
//* Description quoted
|
|
//* *Extension* )
|
|
//*
|
|
//*******************************************************************
|
|
class PICSRulesName : public PICSRulesObjectBase
|
|
{
|
|
public:
|
|
ETS m_etstrRuleName,m_etstrDescription;
|
|
|
|
PICSRulesName();
|
|
~PICSRulesName();
|
|
|
|
HRESULT AddItem(PICSRulesObjectID proid, LPVOID pData);
|
|
HRESULT InitializeMyDefaults();
|
|
};
|
|
|
|
//*******************************************************************
|
|
//*
|
|
//* The PICSRulesSource class handles the "source" token
|
|
//* from a PICSRules stream, and its attributes (square brackets
|
|
//* denote the primary attribute):
|
|
//*
|
|
//* source (
|
|
//* [SourceURL] URL
|
|
//* CreationTool quoted (has format toolname/version)
|
|
//* author email
|
|
//* LastModified ISO Date
|
|
//* *Extension* )
|
|
//*
|
|
//*******************************************************************
|
|
class PICSRulesSource : public PICSRulesObjectBase
|
|
{
|
|
public:
|
|
PICSRulesQuotedURL m_prURLSourceURL;
|
|
ETS m_etstrCreationTool;
|
|
PICSRulesQuotedEmail m_prEmailAuthor;
|
|
PICSRulesQuotedDate m_prDateLastModified;
|
|
|
|
PICSRulesSource();
|
|
~PICSRulesSource();
|
|
|
|
HRESULT AddItem(PICSRulesObjectID proid, LPVOID pData);
|
|
HRESULT InitializeMyDefaults();
|
|
|
|
char * GetToolName();
|
|
};
|
|
|
|
//*******************************************************************
|
|
//*
|
|
//* The PICSRulesServiceInfo class handles the "serviceinfo" token
|
|
//* from a PICSRules stream, and its attributes (square brackets
|
|
//* denote the primary attribute):
|
|
//*
|
|
//* The Ratfile attribute is either an entire machine readable .RAT
|
|
//* file, or the URL where the .RAT file can be obtained.
|
|
//*
|
|
//* serviceinfo (
|
|
//* [Name] URL
|
|
//* shortname quoted
|
|
//* BureauURL URL
|
|
//* UseEmbedded Y|N
|
|
//* Ratfile quoted
|
|
//* BureauUnavailable PASS|FAIL
|
|
//* *Extension* )
|
|
//*
|
|
//*******************************************************************
|
|
class PICSRulesServiceInfo : public PICSRulesObjectBase
|
|
{
|
|
public:
|
|
PICSRulesQuotedURL m_prURLName,m_prURLBureauURL;
|
|
ETS m_etstrShortName,m_etstrRatfile;
|
|
PICSRulesYesNo m_prYesNoUseEmbedded;
|
|
PICSRulesPassFail m_prPassFailBureauUnavailable;
|
|
|
|
PICSRulesServiceInfo();
|
|
~PICSRulesServiceInfo();
|
|
|
|
HRESULT AddItem(PICSRulesObjectID proid, LPVOID pData);
|
|
HRESULT InitializeMyDefaults();
|
|
};
|
|
|
|
//*******************************************************************
|
|
//*
|
|
//* The PICSRulesOptExtension class handles the "optextension" token
|
|
//* from a PICSRules stream, and its attributes (square brackets
|
|
//* denote the primary attribute):
|
|
//*
|
|
//* optextension (
|
|
//* [extension-name] URL
|
|
//* shortname quoted
|
|
//* *Extension* )
|
|
//*
|
|
//*******************************************************************
|
|
class PICSRulesOptExtension : public PICSRulesObjectBase
|
|
{
|
|
public:
|
|
PICSRulesQuotedURL m_prURLExtensionName;
|
|
ETS m_etstrShortName;
|
|
|
|
PICSRulesOptExtension();
|
|
~PICSRulesOptExtension();
|
|
|
|
HRESULT AddItem(PICSRulesObjectID proid, LPVOID pData);
|
|
HRESULT InitializeMyDefaults();
|
|
};
|
|
|
|
//*******************************************************************
|
|
//*
|
|
//* The PICSRulesReqExtension class handles the "reqextension" token
|
|
//* from a PICSRules stream, and its attributes (square brackets
|
|
//* denote the primary attribute):
|
|
//*
|
|
//* reqextension (
|
|
//* [extension-name] URL
|
|
//* shortname quoted
|
|
//* *Extension* )
|
|
//*
|
|
//*******************************************************************
|
|
class PICSRulesReqExtension : public PICSRulesObjectBase
|
|
{
|
|
public:
|
|
PICSRulesQuotedURL m_prURLExtensionName;
|
|
ETS m_etstrShortName;
|
|
|
|
PICSRulesReqExtension();
|
|
~PICSRulesReqExtension();
|
|
|
|
HRESULT AddItem(PICSRulesObjectID proid, LPVOID pData);
|
|
HRESULT InitializeMyDefaults();
|
|
};
|
|
|
|
//*******************************************************************
|
|
//*
|
|
//* The PICSRulesRatingSystem class encapsulates all of the
|
|
//* information from a give PICSRules source. Multiple
|
|
//* instantiations are created in the PicsRatingSystemInfo class,
|
|
//* created at startup and stored in gPRSI.
|
|
//*
|
|
//*******************************************************************
|
|
class PICSRulesRatingSystem : public PICSRulesObjectBase
|
|
{
|
|
public:
|
|
array<PICSRulesPolicy*> m_arrpPRPolicy;
|
|
array<PICSRulesServiceInfo*> m_arrpPRServiceInfo;
|
|
array<PICSRulesOptExtension*> m_arrpPROptExtension;
|
|
array<PICSRulesReqExtension*> m_arrpPRReqExtension;
|
|
PICSRulesName * m_pPRName;
|
|
PICSRulesSource * m_pPRSource;
|
|
ETS m_etstrFile;
|
|
ETN m_etnPRVerMajor,m_etnPRVerMinor;
|
|
DWORD m_dwFlags;
|
|
UINT m_nErrLine;
|
|
|
|
PICSRulesRatingSystem();
|
|
~PICSRulesRatingSystem();
|
|
HRESULT Parse(LPCSTR pszFile, LPSTR pStreamIn);
|
|
|
|
HRESULT AddItem(PICSRulesObjectID roid, LPVOID pData);
|
|
HRESULT InitializeMyDefaults();
|
|
void ReportError(HRESULT hres);
|
|
};
|
|
|
|
//*******************************************************************
|
|
//*
|
|
//* The PICSRulesFileParser class exists to provide a line number
|
|
//* shared by all the parsing routines. This line number is updated
|
|
//* as the parser walks through the stream, and is frozen as soon as
|
|
//* an error is found. This line number can later be reported to the
|
|
//* user to help localize errors.
|
|
//*
|
|
//*******************************************************************
|
|
class PICSRulesFileParser
|
|
{
|
|
public:
|
|
UINT m_nLine;
|
|
|
|
PICSRulesFileParser() { m_nLine = 1; }
|
|
|
|
LPSTR EatQuotedString(LPSTR pIn,BOOL fQuote=PR_QUOTE_DOUBLE);
|
|
HRESULT ParseToOpening(LPSTR *ppIn, PICSRulesAllowableOption *paoExpected,
|
|
PICSRulesAllowableOption **ppFound);
|
|
HRESULT ParseParenthesizedObject(
|
|
LPSTR *ppIn, //where we are in the text stream
|
|
PICSRulesAllowableOption aao[], //allowable things inside this object
|
|
PICSRulesObjectBase *pObject //object to set parameters into
|
|
);
|
|
char* FindNonWhite(char *pc);
|
|
};
|
|
|
|
#endif
|
|
|