1 #define MODULE_LOG_PREFIX "config"
4 #include "oscam-array.h"
5 #include "oscam-conf-chk.h"
6 #include "oscam-garbage.h"
8 #include "oscam-string.h"
10 void chk_iprange(char *value
, struct s_ip
**base
)
13 char *ptr1
, *ptr2
, *saveptr1
= NULL
;
14 struct s_ip
*fip
, *lip
, *cip
;
16 if(!cs_malloc(&cip
, sizeof(struct s_ip
)))
20 for(ptr1
= strtok_r(value
, ",", &saveptr1
); ptr1
; ptr1
= strtok_r(NULL
, ",", &saveptr1
))
26 if(!cs_malloc(&cip
, sizeof(struct s_ip
)))
31 if((ptr2
= strchr(trim(ptr1
), '-')))
34 cs_inet_addr(trim(ptr1
), &cip
->ip
[0]);
35 cs_inet_addr(trim(ptr2
), &cip
->ip
[1]);
39 cs_inet_addr(ptr1
, &cip
->ip
[0]);
40 IP_ASSIGN(cip
->ip
[1], cip
->ip
[0]);
49 void chk_caidtab(char *value
, CAIDTAB
*caidtab
)
51 caidtab_clear(caidtab
);
52 char *ptr
, *saveptr1
= NULL
;
53 for(ptr
= strtok_r(value
, ",", &saveptr1
); ptr
; ptr
= strtok_r(NULL
, ",", &saveptr1
))
56 memset(&d
, 0, sizeof(d
));
58 char *caid_end_ptr
= strchr(ptr
, ':'); // caid_end_ptr + 1 -> cmap
60 *caid_end_ptr
++ = '\0';
61 d
.cmap
= a2i(caid_end_ptr
, 2);
62 if (errno
== EINVAL
) continue;
64 char *mask_start_ptr
= strchr(ptr
, '&'); // mask_start_ptr + 1 -> mask
66 if(mask_start_ptr
) { // Mask is optional
67 *mask_start_ptr
++ = '\0';
68 d
.mask
= a2i(mask_start_ptr
, 2);
69 if (errno
== EINVAL
) continue;
72 if (errno
== EINVAL
) continue;
74 caidtab_add(caidtab
, &d
);
78 void chk_caidvaluetab(char *value
, CAIDVALUETAB
*caidvaluetab
)
80 caidvaluetab_clear(caidvaluetab
);
81 char *ptr
, *saveptr1
= NULL
;
82 for(ptr
= strtok_r(value
, ",", &saveptr1
); ptr
; ptr
= strtok_r(NULL
, ",", &saveptr1
))
85 memset(&d
, 0, sizeof(d
));
86 char *caid_end_ptr
= strchr(ptr
, ':'); // caid_end_ptr + 1 -> value
89 *caid_end_ptr
++ = '\0';
94 d
.value
= atoi(caid_end_ptr
);
95 if (d
.caid
&& d
.value
< 10000)
96 caidvaluetab_add(caidvaluetab
, &d
);
100 void chk_cacheex_valuetab(char *lbrlt
, CECSPVALUETAB
*tab
)
102 //[caid][&mask][@provid][$servid][:awtime][:]dwtime
103 char *ptr
= NULL
, *saveptr1
= NULL
;
104 cecspvaluetab_clear(tab
);
107 for(i
= 0, ptr
= strtok_r(lbrlt
, ",", &saveptr1
); (ptr
); ptr
= strtok_r(NULL
, ",", &saveptr1
), i
++)
109 CECSPVALUETAB_DATA d
;
110 memset(&d
, 0, sizeof(d
));
112 int32_t caid
= -1, cmask
= -1, srvid
= -1;
113 int32_t j
, provid
= -1;
114 int16_t awtime
= -1, dwtime
= -1;
115 char *ptr1
= NULL
, *ptr2
= NULL
, *ptr3
= NULL
, *ptr4
= NULL
, *ptr5
= NULL
, *saveptr2
= NULL
;
117 if((ptr4
= strchr(trim(ptr
), ':')))
121 for(j
= 0, ptr5
= strtok_r(ptr4
, ":", &saveptr2
); (j
< 2) && ptr5
; ptr5
= strtok_r(NULL
, ":", &saveptr2
), j
++)
134 if((ptr3
= strchr(trim(ptr
), '$')))
137 srvid
= a2i(ptr3
, 4);
139 if((ptr2
= strchr(trim(ptr
), '@')))
142 provid
= a2i(ptr2
, 6);
144 if((ptr1
= strchr(ptr
, '&')))
147 cmask
= a2i(ptr1
, -2);
149 if(!ptr1
&& !ptr2
&& !ptr3
&& !ptr4
) //only dwtime
150 { dwtime
= atoi(ptr
); }
152 { caid
= a2i(ptr
, 2); }
153 if((i
== 0 && (caid
<= 0)) || (caid
> 0))
161 cecspvaluetab_add(tab
, &d
);
167 void chk_cacheex_cwcheck_valuetab(char *lbrlt
, CWCHECKTAB
*tab
)
169 //caid[&mask][@provid][$servid]:mode:counter
171 char *ptr
= NULL
, *saveptr1
= NULL
;
172 cwcheckvaluetab_clear(tab
);
174 for(i
= 0, ptr
= strtok_r(lbrlt
, ",", &saveptr1
); (ptr
); ptr
= strtok_r(NULL
, ",", &saveptr1
), i
++)
177 memset(&d
, 0, sizeof(d
));
179 int32_t caid
= -1, cmask
= -1, provid
= -1, srvid
= -1;
180 int16_t mode
= -1, counter
= -1;
182 char *ptr1
= NULL
, *ptr2
= NULL
, *ptr3
= NULL
, *ptr4
= NULL
, *ptr5
= NULL
, *saveptr2
= NULL
;
184 if((ptr4
= strchr(trim(ptr
), ':')))
187 ptr5
= strtok_r(ptr4
, ":", &saveptr2
);
188 if(ptr5
) mode
= atoi(ptr5
);
189 ptr5
= strtok_r(NULL
, ":", &saveptr2
);
190 if(ptr5
) counter
= atoi(ptr5
);
192 if((ptr3
= strchr(trim(ptr
), '$')))
195 srvid
= a2i(ptr3
, 4);
197 if((ptr2
= strchr(trim(ptr
), '@')))
200 provid
= a2i(ptr2
, 6);
202 if((ptr1
= strchr(ptr
, '&')))
205 cmask
= a2i(ptr1
, -2);
210 if((i
== 0 && (caid
<= 0)) || (caid
> 0))
218 cwcheckvaluetab_add(tab
, &d
);
225 void chk_cacheex_hitvaluetab(char *lbrlt
, CECSPVALUETAB
*tab
)
227 //[caid][&mask][@provid][$servid]
229 char *ptr
= NULL
, *saveptr1
= NULL
;
230 cecspvaluetab_clear(tab
);
232 for(i
= 0, ptr
= strtok_r(lbrlt
, ",", &saveptr1
); (ptr
); ptr
= strtok_r(NULL
, ",", &saveptr1
), i
++)
234 CECSPVALUETAB_DATA d
;
235 memset(&d
, 0, sizeof(d
));
237 int32_t caid
= -1, cmask
= -1, srvid
= -1;
239 char *ptr1
= NULL
, *ptr2
= NULL
, *ptr3
= NULL
;
241 if((ptr3
= strchr(trim(ptr
), '$')))
244 srvid
= a2i(ptr3
, 4);
246 if((ptr2
= strchr(trim(ptr
), '@')))
249 provid
= a2i(ptr2
, 6);
251 if((ptr1
= strchr(ptr
, '&')))
254 cmask
= a2i(ptr1
, -2);
263 cecspvaluetab_add(tab
, &d
);
269 void chk_tuntab(char *tunasc
, TUNTAB
*ttab
)
274 char *caid_ptr
, *savecaid_ptr
= NULL
;
275 for(i
= 0, caid_ptr
= strtok_r(tunasc
, ",", &savecaid_ptr
); (caid_ptr
); caid_ptr
= strtok_r(NULL
, ",", &savecaid_ptr
), i
++)
278 char *srvid_ptr
= strchr(trim(caid_ptr
), '.');
279 char *caidto_ptr
= strchr(trim(caid_ptr
), ':');
284 *caidto_ptr
++ = '\0';
285 d
.bt_caidfrom
= a2i(caid_ptr
, 2);
286 d
.bt_srvid
= a2i(srvid_ptr
, 2);
289 d
.bt_caidto
= a2i(caidto_ptr
, 2);
292 if (d
.bt_caidfrom
| d
.bt_srvid
| d
.bt_caidto
)
293 tuntab_add(ttab
, &d
);
297 void chk_services(char *labels
, SIDTABS
*sidtabs
)
300 char *ptr
, *saveptr1
= NULL
;
302 SIDTABBITS newsidok
, newsidno
;
303 newsidok
= newsidno
= 0;
304 for(ptr
= strtok_r(labels
, ",", &saveptr1
); ptr
; ptr
= strtok_r(NULL
, ",", &saveptr1
))
306 for(trim(ptr
), i
= 0, sidtab
= cfg
.sidtab
; sidtab
; sidtab
= sidtab
->next
, i
++)
308 if(!strcmp(sidtab
->label
, ptr
)) { newsidok
|= ((SIDTABBITS
)1 << i
); }
309 if((ptr
[0] == '!') && (!strcmp(sidtab
->label
, ptr
+ 1))) { newsidno
|= ((SIDTABBITS
)1 << i
); }
312 sidtabs
->ok
= newsidok
;
313 sidtabs
->no
= newsidno
;
316 void chk_ftab(char *value
, FTAB
*ftab
)
319 char *ptr1
, *saveptr1
= NULL
;
321 for(ptr1
= strtok_r(value
, ";", &saveptr1
); (ptr1
); ptr1
= strtok_r(NULL
, ";", &saveptr1
))
324 memset(&d
, 0, sizeof(d
));
325 char *caid_end_ptr
= strchr(ptr1
, ':'); // caid_end_ptr + 1 -> headers
328 caid_end_ptr
[0] = '\0';
329 d
.caid
= a2i(ptr1
, 4);
330 if (!d
.caid
|| errno
== EINVAL
)
335 ptr1
= caid_end_ptr
+ 1; // -> headers
336 char *ident_ptr
, *saveident_ptr
= NULL
;
337 for(ident_ptr
= strtok_r(ptr1
, ",", &saveident_ptr
); ident_ptr
&& d
.nprids
< ARRAY_SIZE(d
.prids
); ident_ptr
= strtok_r(NULL
, ",", &saveident_ptr
))
339 uint32_t ident
= a2i(ident_ptr
, 4);
345 d
.prids
[d
.nprids
++] = ident
;
352 void chk_cltab(char *classasc
, CLASSTAB
*clstab
)
354 int32_t max_an
= 0, max_bn
= 0;
355 char *ptr1
, *saveptr1
= NULL
, *classasc_org
;
356 CLASSTAB newclstab
, oldclstab
;
357 memset(&newclstab
, 0, sizeof(newclstab
));
358 newclstab
.an
= newclstab
.bn
= 0;
360 if(!cs_malloc(&classasc_org
, sizeof(char)*cs_strlen(classasc
)+1))
363 cs_strncpy(classasc_org
, classasc
, sizeof(char)*cs_strlen(classasc
)+1);
365 for(ptr1
= strtok_r(classasc
, ",", &saveptr1
); ptr1
; ptr1
= strtok_r(NULL
, ",", &saveptr1
))
374 if(max_an
&& !cs_malloc(&newclstab
.aclass
, sizeof(uint8_t) * max_an
))
375 { NULLFREE(classasc_org
); return; }
377 if(max_bn
&& !cs_malloc(&newclstab
.bclass
, sizeof(uint8_t) * max_bn
))
378 { NULLFREE(newclstab
.aclass
); NULLFREE(classasc_org
); return; }
380 classasc
= classasc_org
;
382 for(ptr1
= strtok_r(classasc
, ",", &saveptr1
); ptr1
; ptr1
= strtok_r(NULL
, ",", &saveptr1
))
385 if(ptr1
[0] == '!' && newclstab
.bclass
!= NULL
)
386 { newclstab
.bclass
[newclstab
.bn
++] = (uint8_t)a2i(ptr1
+ 1, 2); }
387 else if(newclstab
.aclass
!= NULL
)
388 { newclstab
.aclass
[newclstab
.an
++] = (uint8_t)a2i(ptr1
, 2); }
391 NULLFREE(classasc_org
);
393 memcpy(&oldclstab
, clstab
, sizeof(CLASSTAB
));
394 memcpy(clstab
, &newclstab
, sizeof(CLASSTAB
));
396 NULLFREE(oldclstab
.aclass
);
397 NULLFREE(oldclstab
.bclass
);
400 void chk_port_tab(char *portasc
, PTAB
*ptab
)
402 int32_t i
, j
, nfilts
, ifilt
, iport
;
404 char *ptr1
, *ptr2
, *ptr3
, *saveptr1
= NULL
;
405 char *ptr
[CS_MAXPORTS
] = {0};
406 int32_t port
[CS_MAXPORTS
] = {0};
407 if(!cs_malloc(&newptab
, sizeof(PTAB
)))
410 for(nfilts
= i
= 0, ptr1
= strtok_r(portasc
, ";", &saveptr1
); (i
< CS_MAXPORTS
) && (ptr1
); ptr1
= strtok_r(NULL
, ";", &saveptr1
), i
++)
414 if(!newptab
->ports
[i
].ncd
&& !cs_malloc(&newptab
->ports
[i
].ncd
, sizeof(struct ncd_port
)))
417 if((ptr2
= strchr(trim(ptr1
), '@')))
420 newptab
->ports
[i
].s_port
= atoi(ptr1
);
422 //checking for des key for port
423 newptab
->ports
[i
].ncd
->ncd_key_is_set
= false;
424 if((ptr3
= strchr(trim(ptr1
), '{')))
427 if(key_atob_l(ptr3
, newptab
->ports
[i
].ncd
->ncd_key
, sizeof(newptab
->ports
[i
].ncd
->ncd_key
) * 2))
428 { fprintf(stderr
, "newcamd: error in DES Key for port %s -> ignored\n", ptr1
); }
430 { newptab
->ports
[i
].ncd
->ncd_key_is_set
= true; }
434 port
[i
] = newptab
->ports
[i
].s_port
;
440 if(nfilts
== 1 && cs_strlen(portasc
) < 6 && newptab
->ports
[0].s_port
== 0)
442 newptab
->ports
[0].s_port
= atoi(portasc
);
447 for(i
= 0; i
< nfilts
; i
++)
451 for(j
= 0, ptr3
= strtok_r(ptr
[i
], ",", &saveptr1
); (j
< CS_MAXPROV
) && (ptr3
); ptr3
= strtok_r(NULL
, ",", &saveptr1
), j
++)
453 if((ptr2
= strchr(trim(ptr3
), ':')))
456 ifilt
= newptab
->ports
[iport
].ncd
->ncd_ftab
.nfilts
++;
458 newptab
->ports
[iport
].ncd
->ncd_ftab
.filts
[ifilt
].caid
= (uint16_t)a2i(ptr3
, 4);
459 newptab
->ports
[iport
].ncd
->ncd_ftab
.filts
[ifilt
].prids
[j
] = a2i(ptr2
, 6);
463 newptab
->ports
[iport
].ncd
->ncd_ftab
.filts
[ifilt
].prids
[j
] = a2i(ptr3
, 6);
465 newptab
->ports
[iport
].ncd
->ncd_ftab
.filts
[ifilt
].nprids
++;
468 memcpy(ptab
, newptab
, sizeof(PTAB
));
472 void chk_port_camd35_tab(char *portasc
, PTAB
*ptab
)
474 int32_t i
, j
, nfilts
;
476 char *ptr1
, *ptr2
, *ptr4
, *provids
, *saveptr1
= NULL
, *saveptr2
= NULL
;
477 if(!cs_malloc(&newptab
, sizeof(PTAB
)))
480 for(nfilts
= i
= 0, ptr1
= strtok_r(portasc
, ";", &saveptr1
); (i
< CS_MAXPORTS
) && (ptr1
); ptr1
= strtok_r(NULL
, ";", &saveptr1
), i
++)
482 if(!newptab
->ports
[newptab
->nports
].ncd
&& !cs_malloc(&newptab
->ports
[i
].ncd
, sizeof(struct ncd_port
)))
484 newptab
->ports
[newptab
->nports
].s_port
= atoi(ptr1
);
485 if((ptr2
= strchr(trim(ptr1
), '@')))
487 *ptr2
++ = '\0'; // clean up @ symbol
488 newptab
->ports
[newptab
->nports
].s_port
= atoi(ptr1
);
489 if((provids
= strchr(trim(ptr2
), ':')))
491 *provids
++ = '\0'; // clean up : symbol
492 for(j
= 0, ptr4
= strtok_r(provids
, ",", &saveptr2
); (i
< CS_MAXPORTS
) && (ptr4
); ptr4
= strtok_r(NULL
, ",", &saveptr2
), j
++)
494 newptab
->ports
[newptab
->nports
].ncd
->ncd_ftab
.filts
[0].prids
[j
] = a2i(ptr4
, 6);
496 newptab
->ports
[newptab
->nports
].ncd
->ncd_ftab
.filts
[0].nprids
=j
;
498 newptab
->ports
[newptab
->nports
].ncd
->ncd_ftab
.filts
[0].caid
= (uint16_t)a2i(ptr2
, sizeof(ptr2
));
503 newptab
->ports
[newptab
->nports
].s_port
= atoi(ptr1
);
504 if (newptab
->ports
[newptab
->nports
].s_port
) { newptab
->nports
++; };
508 memcpy(ptab
, newptab
, sizeof(PTAB
));
512 void chk_ecm_whitelist(char *value
, ECM_WHITELIST
*ecm_whitelist
)
514 ecm_whitelist_clear(ecm_whitelist
);
515 char *ptr
, *saveptr1
= NULL
;
516 for(ptr
= strtok_r(value
, ";", &saveptr1
); ptr
; ptr
= strtok_r(NULL
, ";", &saveptr1
))
518 ECM_WHITELIST_DATA d
;
519 memset(&d
, 0, sizeof(d
));
520 char *caid_end_ptr
= strchr(ptr
, ':'); // caid_end_ptr + 1 -> headers
521 char *provid_ptr
= strchr(ptr
, '@'); // provid_ptr + 1 -> provid
525 caid_end_ptr
[0] = '\0';
528 provid_ptr
[0] = '\0';
530 d
.ident
= a2i(provid_ptr
, 6);
532 d
.caid
= dyn_word_atob(ptr
);
533 headers
= caid_end_ptr
+ 1; // -> headers
534 } else if(provid_ptr
) {
535 provid_ptr
[0] = '\0';
536 d
.ident
= a2i(provid_ptr
, 6);
538 if (d
.caid
== 0xffff) d
.caid
= 0;
539 if (d
.ident
== 0xffff) d
.ident
= 0;
540 char *len_ptr
, *savelen_ptr
= NULL
;
541 for(len_ptr
= strtok_r(headers
, ",", &savelen_ptr
); len_ptr
; len_ptr
= strtok_r(NULL
, ",", &savelen_ptr
))
543 d
.len
= dyn_word_atob(len_ptr
);
546 ecm_whitelist_add(ecm_whitelist
, &d
);
551 void chk_ecm_hdr_whitelist(char *value
, ECM_HDR_WHITELIST
*ecm_hdr_whitelist
)
553 ecm_hdr_whitelist_clear(ecm_hdr_whitelist
);
554 char *ptr
, *saveptr
= NULL
;
555 for(ptr
= strtok_r(value
, ";", &saveptr
); ptr
; ptr
= strtok_r(NULL
, ";", &saveptr
))
557 ECM_HDR_WHITELIST_DATA d
;
558 memset(&d
, 0, sizeof(d
));
559 char *caid_end_ptr
= strchr(ptr
, ':'); // caid_end_ptr + 1 -> headers
560 char *provid_ptr
= strchr(ptr
, '@'); // provid_ptr + 1 -> provid
564 caid_end_ptr
[0] = '\0';
567 provid_ptr
[0] = '\0';
569 d
.provid
= a2i(provid_ptr
, 6);
571 d
.caid
= dyn_word_atob(ptr
);
572 headers
= caid_end_ptr
+ 1; // -> headers
573 } else if(provid_ptr
) {
574 provid_ptr
[0] = '\0';
575 d
.provid
= a2i(provid_ptr
, 6);
577 if (d
.caid
== 0xffff) d
.caid
= 0;
578 if (d
.provid
== 0xffff) d
.provid
= 0;
579 char *hdr_ptr
, *savehdr_ptr
= NULL
;
580 for(hdr_ptr
= strtok_r(headers
, ",", &savehdr_ptr
); hdr_ptr
; hdr_ptr
= strtok_r(NULL
, ",", &savehdr_ptr
))
582 hdr_ptr
= trim(hdr_ptr
);
583 d
.len
= cs_strlen(hdr_ptr
);
584 if (d
.len
/ 2 > sizeof(d
.header
))
585 d
.len
= sizeof(d
.header
) * 2;
588 key_atob_l(hdr_ptr
, d
.header
, d
.len
);
589 ecm_hdr_whitelist_add(ecm_hdr_whitelist
, &d
);
595 /* Clears the s_ip structure provided. The pointer will be set to NULL so everything is cleared.*/
596 void clear_sip(struct s_ip
**sip
)
598 struct s_ip
*cip
= *sip
;
599 for(*sip
= NULL
; cip
!= NULL
; cip
= cip
->next
)
605 /* Clears the s_ptab struct provided by setting nfilts and nprids to zero. */
606 void clear_ptab(struct s_ptab
*ptab
)
610 for(i
= 0; i
< CS_MAXPORTS
; i
++)
612 if(ptab
->ports
[i
].ncd
)
614 ptab
->ports
[i
].ncd
->ncd_ftab
.nfilts
= 0;
615 ptab
->ports
[i
].ncd
->ncd_ftab
.filts
[0].nprids
= 0;
616 NULLFREE(ptab
->ports
[i
].ncd
);
617 ptab
->ports
[i
].ncd
= NULL
;
622 /* Clears given csptab */
623 void clear_cacheextab(CECSPVALUETAB
*ctab
)
626 NULLFREE(ctab
->cevdata
);