1 #include "WWWLib.h"
2 #include "CSLUtils.h"
3 #include "CSUser.h"
4 #include "CSUserSt.h"
5 #include "CSLL.h"
6 #include "CSLLSt.h"
7 
8 extern void CSLabel_dump(CSLabel_t * pCSLabel);
9 
10 struct State_Parms_s {
11     CSLabel_t * pCSLabel;
12     CSUser_t * pCSUser;
13     int matchedServices;
14     int matchedRatings;
15     CSError_t iteratorError;
16     };
17 
18 PRIVATE CSLabel_callback_t CSCheckLabel_checkRatings;
CSCheckLabel_checkRatings(CSLabel_t * pCSLabel,State_Parms_t * pParms,const char * identifier,void * pVoid)19 PRIVATE CSError_t CSCheckLabel_checkRatings(CSLabel_t * pCSLabel, State_Parms_t * pParms, const char * identifier, void * pVoid)
20 {
21     UserServiceRating_t * pUserServiceRating = CSUser_getUserServiceRating(pParms->pCSUser);
22     CSError_t ret;
23     FVal_t fVal;
24     fVal = CSLabel_ratingsIncludeRanges(pCSLabel, pUserServiceRating->ranges);
25     ret = FVal_isZero(&fVal) ? CSError_OK : CSError_RATING_RANGE;
26     if (ret != CSError_OK)
27         HTTRACE(PICS_TRACE, "PICS: Access denial - service:\"%s\" label number:%d rating identifier:\"%s\"\n" _
28 		CSLabel_getServiceName(pCSLabel) _
29 		CSLabel_getLabelNumber(pCSLabel) _
30 		CSLabel_getRatingName(pCSLabel));
31     return ret;
32 }
33 
34 PRIVATE CSUser_callback_t CSCheckLabel_findLabelServiceRating;
CSCheckLabel_findLabelServiceRating(CSUser_t * pCSUser,State_Parms_t * pParms,const char * identifier,void * pVoid)35 PRIVATE CSError_t CSCheckLabel_findLabelServiceRating(CSUser_t * pCSUser, State_Parms_t * pParms, const char * identifier, void * pVoid)
36 {
37     UserServiceRating_t * pUserServiceRating = CSUser_getUserServiceRating(pParms->pCSUser);
38     CSError_t ret;
39     if ((ret = CSLabel_iterateLabelRatings(pParms->pCSLabel, CSCheckLabel_checkRatings, pParms, SVal_value(&pUserServiceRating->identifier), 0)) != CSError_SERVICE_MISSING)
40         pParms->matchedRatings++;
41     else
42         if (!BVal_value(&pUserServiceRating->missing_scale))
43             ret = CSError_OK;        /* keep checking */
44     return ret;
45 }
46 
47 PRIVATE CSLabel_callback_t CSCheckLabel_checkSingleLabel;
CSCheckLabel_checkSingleLabel(CSLabel_t * pCSLabel,State_Parms_t * pParms,const char * identifier,void * pVoid)48 PRIVATE CSError_t CSCheckLabel_checkSingleLabel(CSLabel_t * pCSLabel, State_Parms_t * pParms, const char * identifier, void * pVoid)
49 {
50     return CSUser_iterateServiceRatings(pParms->pCSUser, CSCheckLabel_findLabelServiceRating, pParms, 0, 0);
51 }
52 
53 PRIVATE CSLabel_callback_t CSCheckLabel_checkLabel;
CSCheckLabel_checkLabel(CSLabel_t * pCSLabel,State_Parms_t * pParms,const char * identifier,void * pVoid)54 PRIVATE CSError_t CSCheckLabel_checkLabel(CSLabel_t * pCSLabel, State_Parms_t * pParms, const char * identifier, void * pVoid)
55 {
56     return CSLabel_iterateSingleLabels(pParms->pCSLabel, CSCheckLabel_checkSingleLabel, pParms, 0, 0);
57 }
58 
59 PRIVATE CSLabel_callback_t CSCheckLabel_checkService;
CSCheckLabel_checkService(CSLabel_t * pCSLabel,State_Parms_t * pParms,const char * identifier,void * pVoid)60 PRIVATE CSError_t CSCheckLabel_checkService(CSLabel_t * pCSLabel, State_Parms_t * pParms, const char * identifier, void * pVoid)
61 {
62     return CSLabel_iterateLabels(pParms->pCSLabel, CSCheckLabel_checkLabel, pParms, 0, 0);
63 }
64 
65 PRIVATE CSUser_callback_t CSCheckLabel_findLabelService;
CSCheckLabel_findLabelService(CSUser_t * pCSUser,State_Parms_t * pParms,const char * identifier,void * pVoid)66 PRIVATE CSError_t CSCheckLabel_findLabelService(CSUser_t * pCSUser, State_Parms_t * pParms, const char * identifier, void * pVoid)
67 {
68     UserService_t * pUserService = CSUser_getUserService(pParms->pCSUser);
69     CSError_t ret;
70     if ((ret = CSLabel_iterateServices(pParms->pCSLabel, CSCheckLabel_checkService, pParms, SVal_value(&pUserService->rating_service), 0)) == CSError_SERVICE_MISSING)
71         return BVal_value(&pUserService->missing_service) ? CSError_SERVICE_MISSING : CSError_OK;
72     if (ret == CSError_OK)
73         pParms->matchedServices++;
74     return ret;
75 }
76 
CSCheckLabel_checkLabelAndUser(CSLabel_t * pCSLabel,CSUser_t * pCSUser)77 PUBLIC CSError_t CSCheckLabel_checkLabelAndUser(CSLabel_t * pCSLabel, CSUser_t * pCSUser)
78 {
79     CSError_t ret;
80     State_Parms_t parms = {0, 0, 0, 0, CSError_OK};
81     parms.pCSLabel = pCSLabel;
82     parms.pCSUser = pCSUser;
83     parms.iteratorError = CSError_SERVICE_NONE;
84 /*
85     CSLabel_output(parms.pCSLabel, pKwik);
86 */
87     if (PICS_TRACE) CSLabel_dump(parms.pCSLabel);
88 /*
89     HTList * tmp;
90     tmp = CSLLData_getAllSingleLabels(parms.pCSLabel);
91     HTList_delete(tmp); */
92     if ((ret = CSUser_iterateServices(parms.pCSUser, CSCheckLabel_findLabelService, &parms, 0, 0)) != CSError_OK)
93         return ret;
94     if (FVal_initialized(&CSUser_getCSUserData(pCSUser)->minimum_services) &&
95         parms.matchedServices < FVal_value(&CSUser_getCSUserData(pCSUser)->
96 					   minimum_services))
97         return CSError_SERVICE_NONE;
98     return CSError_OK;
99 }
100 
CSCheckLabel_parseAndValidateLabelStr(const char * label,CSUser_t * pCSUser)101 PUBLIC CSError_t CSCheckLabel_parseAndValidateLabelStr(const char * label, CSUser_t * pCSUser)
102 {
103     CSParse_t * pCSParse = CSParse_newLabel(0, 0);
104     CSError_t ret;
105 
106     CSParse_parseChunk(pCSParse, label, (int) strlen(label), 0);
107     ret = CSCheckLabel_checkLabelAndUser(CSParse_getLabel(pCSParse), pCSUser);
108 
109     CSParse_deleteLabel(pCSParse);
110     return ret;
111 }
112