Create tag for version 0.99
[oscam.git] / oscam-chk.c
blob2f23a9892a6c6d5ee704832ff4cdb3c3d176f7eb
1 #include "globals.h"
3 static int chk_srvid_match(ECM_REQUEST *er, SIDTAB *sidtab)
5 int i, rc=0;
7 if (!sidtab->num_caid)
8 rc|=1;
9 else
10 for (i=0; (i<sidtab->num_caid) && (!(rc&1)); i++)
11 if (er->caid==sidtab->caid[i]) rc|=1;
13 if (!sidtab->num_provid)
14 rc|=2;
15 else
16 for (i=0; (i<sidtab->num_provid) && (!(rc&2)); i++)
17 if (er->prid==sidtab->provid[i]) rc|=2;
19 if (!sidtab->num_srvid)
20 rc|=4;
21 else
22 for (i=0; (i<sidtab->num_srvid) && (!(rc&4)); i++)
23 if (er->srvid==sidtab->srvid[i]) rc|=4;
25 return(rc==7);
28 int chk_srvid(ECM_REQUEST *er, int idx)
30 int nr, rc=0;
31 char *ptr;
32 SIDTAB *sidtab;
34 if (!client[idx].sidtabok)
36 if (!client[idx].sidtabno) return(1);
37 rc=1;
39 for (nr=0, sidtab=cfg->sidtab; sidtab; sidtab=sidtab->next, nr++)
40 if (sidtab->num_caid | sidtab->num_provid | sidtab->num_srvid)
42 if ((client[idx].sidtabno&(1<<nr)) &&
43 (chk_srvid_match(er, sidtab)))
44 return(0);
45 if ((client[idx].sidtabok&(1<<nr)) &&
46 (chk_srvid_match(er, sidtab)))
47 rc=1;
49 return(rc);
52 // server filter for newcamd
53 int chk_sfilter(ECM_REQUEST *er, PTAB *ptab)
55 int i, j, pi, rc=1;
56 ushort caid, scaid;
57 ulong prid, sprid;
59 if (!ptab) return(1);
61 caid = er->caid;
62 prid = er->prid;
63 pi = client[cs_idx].port_idx;
65 if (ptab->nports && ptab->ports[pi].ftab.nfilts)
67 for( rc=j=0; (!rc) && (j<ptab->ports[pi].ftab.nfilts); j++ )
69 scaid = ptab->ports[pi].ftab.filts[j].caid;
70 if (caid==0||(caid!=0 && caid==scaid))
72 for( i=0; (!rc) && i<ptab->ports[pi].ftab.filts[j].nprids; i++ )
74 sprid=ptab->ports[pi].ftab.filts[j].prids[i];
75 cs_debug("trying server filter %04X:%06X", scaid, sprid);
76 if (prid==sprid)
78 rc=1;
79 cs_debug("%04X:%06X allowed by server filter %04X:%06X",
80 caid, prid, scaid, sprid);
85 if(!rc)
87 cs_debug("no match, %04X:%06X rejected by server filters", caid, prid);
88 if (!er->rcEx) er->rcEx=(E1_LSERVER<<4)|E2_IDENT;
89 return(rc);
92 return (rc);
95 static int chk_chid(ECM_REQUEST *er, FTAB *fchid, char *type, char *name)
97 int rc=1, i, j;
99 if( (er->caid & 0xFF00)!=0x600 ) return 1;
100 if( !er->chid ) return 1;
101 if( !fchid->nfilts ) return 1;
103 for( i=rc=0; (!rc) && i<fchid->nfilts; i++ )
104 if( er->caid == fchid->filts[i].caid )
105 for( j=0; (!rc) && j<fchid->filts[i].nprids; j++ )
107 cs_debug("trying %s '%s' CHID filter %04X:%04X",
108 type, name, fchid->filts[i].caid, fchid->filts[i].prids[j]);
109 if( er->chid == fchid->filts[i].prids[j] )
111 cs_debug("%04X:%04X allowed by %s '%s' CHID filter %04X:%04X",
112 er->caid, er->chid, type, name, fchid->filts[i].caid,
113 fchid->filts[i].prids[j]);
114 rc=1;
118 if( !rc ) cs_debug("no match, %04X:%04X rejected by %s '%s' CHID filter(s)",
119 er->caid, er->chid, type, name);
121 return (rc);
124 int chk_ufilters(ECM_REQUEST *er)
126 int i, j, rc;
127 ushort ucaid;
128 ulong uprid;
130 rc=1;
131 if( client[cs_idx].ftab.nfilts )
133 FTAB *f = &client[cs_idx].ftab;
134 for( i=rc=0; (!rc) && (i<f->nfilts); i++ )
136 ucaid = f->filts[i].caid;
137 if( er->caid==0 || ucaid==0 || (er->caid!=0 && er->caid==ucaid) )
139 for( j=rc=0; (!rc) && (j<f->filts[i].nprids); j++ )
141 uprid = f->filts[i].prids[j];
142 cs_debug("trying user '%s' filter %04X:%06X",
143 client[cs_idx].usr, ucaid, uprid);
144 if( er->prid == uprid )
146 rc=1;
147 cs_debug("%04X:%06X allowed by user '%s' filter %04X:%06X",
148 er->caid, er->prid, client[cs_idx].usr, ucaid, uprid);
153 if( !rc ) {
154 cs_debug("no match, %04X:%06X rejected by user '%s' filters",
155 er->caid, er->prid, client[cs_idx].usr);
156 if( !er->rcEx ) er->rcEx=(E1_USER<<4)|E2_IDENT;
157 return (rc);
161 if( !(rc=chk_class(er, &client[cs_idx].cltab, "user", client[cs_idx].usr)) )
162 if( !er->rcEx ) er->rcEx=(E1_USER<<4)|E2_CLASS;
163 else if( !(rc=chk_chid(er, &client[cs_idx].fchid, "user", client[cs_idx].usr)) )
164 if( !er->rcEx ) er->rcEx=(E1_USER<<4)|E2_CHID;
166 if( rc ) er->rcEx=0;
168 return (rc);
171 int chk_rsfilter(ECM_REQUEST *er, int disable_server_filt)
173 int i, rc=1;
174 ushort caid;
175 ulong prid;
177 if( disable_server_filt )
179 cs_debug("%04X:%06X allowed - server filters disabled",
180 er->caid, er->prid);
181 return 1;
184 rc=prid=0;
185 caid = reader[ridx].caid[0];
186 if( caid==er->caid )
188 for( i=0; (!rc) && (i<reader[ridx].nprov); i++ )
190 prid = (ulong)((reader[ridx].prid[i][0]<<16) |
191 (reader[ridx].prid[i][1]<<8) |
192 (reader[ridx].prid[i][2]));
193 cs_debug("trying server '%s' filter %04X:%06X",
194 reader[ridx].device, caid, prid);
195 if( prid==er->prid )
197 rc=1;
198 cs_debug("%04X:%06X allowed by server '%s' filter %04X:%06X",
199 er->caid, er->prid, reader[ridx].device, caid, prid);
203 if(!rc) {
204 cs_debug("no match, %04X:%06X rejected by server '%s' filters",
205 er->caid, er->prid, reader[ridx].device);
206 if( !er->rcEx ) er->rcEx=(E1_SERVER<<4)|E2_IDENT;
207 return 0;
210 return(rc);
213 int chk_rfilter(ECM_REQUEST *er, struct s_reader *rdr)
215 int i, j, rc=1;
216 ushort caid=0;
217 ulong prid=0;
219 if( rdr->ftab.nfilts )
221 for( rc=i=0; (!rc) && (i<rdr->ftab.nfilts); i++ )
223 caid = rdr->ftab.filts[i].caid;
224 if( (caid!=0 && caid==er->caid) || caid==0 )
226 for( j=0; (!rc) && (j<rdr->ftab.filts[i].nprids); j++)
228 prid = rdr->ftab.filts[i].prids[j];
229 cs_debug("trying reader '%s' filter %04X:%06X",
230 rdr->label, caid, prid);
231 if( prid==er->prid )
233 rc=1;
234 cs_debug("%04X:%06X allowed by reader '%s' filter %04X:%06X",
235 er->caid, er->prid, rdr->label, caid, prid);
240 if(!rc) {
241 cs_debug("no match, %04X:%06X rejected by reader '%s' filters",
242 er->caid, er->prid, rdr->label);
243 return 0;
247 return(rc);
250 int chk_avail_reader(ECM_REQUEST *er, struct s_reader *rdr)
252 if( !chk_rfilter(er, rdr) ) {
253 if( !er->rcEx ) er->rcEx=(E1_READER<<4)|E2_IDENT;
254 return 0;
256 if( !chk_class(er, &rdr->cltab, "reader", rdr->label) ) {
257 if( !er->rcEx ) er->rcEx=(E1_READER<<4)|E2_CLASS;
258 return 0;
260 if( !chk_chid(er, &rdr->fchid, "reader", rdr->label) ) {
261 if( !er->rcEx ) er->rcEx=(E1_READER<<4)|E2_CHID;
262 return 0;
265 if( rdr->typ=='r' )
267 if( rdr->qlen>=rdr->maxqlen )
269 cs_log("reader '%s' max. queue length(%d) reached, rejected", rdr->label,
270 rdr->qlen);
271 if( !er->rcEx ) er->rcEx=(E1_READER<<4)|E2_QUEUE;
272 return 0;
274 else {
275 cs_log("reader '%s' qlen=%d", rdr->label, rdr->qlen);
276 rdr->qlen++;
280 return 1;
283 int matching_reader(ECM_REQUEST *er, struct s_reader *rdr)
285 if (!((rdr->fd) && (rdr->grp&client[cs_idx].grp))) return(0);
286 if (!chk_srvid(er, rdr->cs_idx))
287 return(0);
288 if (!chk_rfilter(er, rdr))
290 // if (!er->rcEx) er->rcEx=(E1_READER<<4)|E2_IDENT;
291 return(0);
293 if (!chk_class(er, &rdr->cltab, "reader", rdr->label))
295 // if (!er->rcEx) er->rcEx=(E1_READER<<4)|E2_CLASS;
296 return(0);
298 if (!chk_chid(er, &rdr->fchid, "reader", rdr->label))
300 // if (!er->rcEx) er->rcEx=(E1_READER<<4)|E2_CHID;
301 return(0);
303 return(1);