Changeset 11337


Ignore:
Timestamp:
01/15/17 10:55:40 (6 years ago)
Author:
Gorgone Impertinence
Message:

add halfcw fix for #4359

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/oscam-chk.c

    r11308 r11337  
    2828}
    2929
    30 
    3130static int32_t find_nano(uchar *ecm, int32_t l, uchar nano, int32_t s)
    3231{
     
    190189}
    191190
    192 
    193191int32_t has_lb_srvid(struct s_client *cl, ECM_REQUEST *er)
    194192{
     
    205203    return 0;
    206204}
    207 
    208205
    209206int32_t chk_srvid_match_by_caid_prov(uint16_t caid, uint32_t provid, SIDTAB *sidtab)
     
    400397}
    401398
    402 
    403399int32_t chk_ident_filter(uint16_t rcaid, uint32_t rprid, FTAB *ftab)
    404400{
     
    430426    return(rc);
    431427}
    432 
    433428
    434429int32_t chk_ufilters(ECM_REQUEST *er)
     
    573568    return (rc);
    574569}
    575 
    576570
    577571static int32_t chk_rfilter(ECM_REQUEST *er, struct s_reader *rdr)
     
    984978            if(skip == 0 || (foundcaid == 1 && foundprovid == 1 && entryok == 0 && skip == 1))
    985979            {
    986                 cs_log_dump_dbg(D_TRACE, er->ecm, er->ecmlen,
    987                               "following ECM %04X@%06X:%04X was filtered by ECMHeaderwhitelist of Reader %s from User %s because of not matching Header:",
    988                               er->caid, er->prid, er->srvid, rdr->label, username(er->client));
     980                cs_log_dump_dbg(D_TRACE, er->ecm, er->ecmlen, "following ECM %04X@%06X:%04X was filtered by ECMHeaderwhitelist of Reader %s from User %s because of not matching Header:", er->caid, er->prid, er->srvid, rdr->label, username(er->client));
    989981                rdr->ecmsfilteredhead += 1;
    990982                rdr->webif_ecmsfilteredhead += 1;
     
    997989
    998990    //Check ip source+dest:
    999     if(cfg.block_same_ip && IP_EQUAL(cur_cl->ip, rdr->client->ip) &&
    1000             get_module(cur_cl)->listenertype != LIS_DVBAPI &&
    1001             is_network_reader(rdr))
    1002     {
    1003         rdr_log_dbg(rdr, D_TRACE, "User (%s) has the same ip (%s) as the reader, blocked because block_same_ip=1!",
    1004                        username(cur_cl), cs_inet_ntoa(rdr->client->ip));
     991    if(cfg.block_same_ip && IP_EQUAL(cur_cl->ip, rdr->client->ip) && get_module(cur_cl)->listenertype != LIS_DVBAPI && is_network_reader(rdr))
     992    {
     993        rdr_log_dbg(rdr, D_TRACE, "User (%s) has the same ip (%s) as the reader, blocked because block_same_ip=1!", username(cur_cl), cs_inet_ntoa(rdr->client->ip));
    1005994        return 0;
    1006995    }
     
    1008997    if(cfg.block_same_name && strcmp(username(cur_cl), rdr->label) == 0)
    1009998    {
    1010         rdr_log_dbg(rdr, D_TRACE, "User (%s) has the same name as the reader, blocked because block_same_name=1!",
    1011                        username(cur_cl));
     999        rdr_log_dbg(rdr, D_TRACE, "User (%s) has the same name as the reader, blocked because block_same_name=1!", username(cur_cl));
    10121000        return 0;
    10131001    }
     
    10291017    {
    10301018        CAIDTAB_DATA *d = &ctab->ctdata[i];
    1031         if((caid & d->mask) == d->caid)
    1032             return d->cmap ? d->cmap : caid;
     1019        if((caid & d->mask) == d->caid) { return d->cmap ? d->cmap : caid; }
    10331020    }
    10341021    return -1;
     
    10521039    int32_t caid;
    10531040    caid = chk_caid(er->caid, ctab);
    1054     if(caid < 0)
    1055         { return 0; }
     1041    if(caid < 0) { return 0; }
    10561042    er->caid = caid;
    10571043    return 1;
     
    10721058}
    10731059
    1074 
    1075 
    10761060/**
    10771061 * Check for ecm request that expects half cw format
     
    10791063int8_t is_halfCW_er(ECM_REQUEST *er)
    10801064{
    1081     if(caid_is_videoguard(er->caid) &&
    1082      (er->caid == 0x09C4 || er->caid ==  0x098C || er->caid == 0x0963 || er->caid == 0x09CD || er->caid == 0x0919 || er->caid == 0x093B || er->caid == 0x098E)
    1083     )
    1084         return 1;
    1085 
    1086   return 0;
    1087 }
    1088 
     1065    if( caid_is_videoguard(er->caid) && (er->caid == 0x09C4 || er->caid == 0x09C7 || er->caid == 0x098C || er->caid == 0x0963 || er->caid == 0x09CD || er->caid == 0x0919 || er->caid == 0x093B || er->caid == 0x098E))
     1066        { return 1; }
     1067    return 0;
     1068}
    10891069
    10901070/**
     
    10931073int8_t chk_halfCW(ECM_REQUEST *er, uchar *cw)
    10941074{
    1095   if(is_halfCW_er(er) && cw){
    1096 
    1097      int8_t part1 = checkCWpart(cw, 0);
    1098      int8_t part2 = checkCWpart(cw, 1);
    1099 
    1100      //check for correct half cw format
    1101      if(part1 && part2){
    1102          return 0;
    1103      }
    1104 
    1105      //check for correct cw position
    1106      if(
    1107         (get_odd_even(er) == 0x80 && part1 && !part2)   //xxxxxxxx00000000
     1075    if(is_halfCW_er(er) && cw)
     1076    {
     1077        uchar cw15 = cw[15];
     1078        if(get_odd_even(er) == 0x80 && cw[15] == 0xF0) { cw[15] = 0; }
     1079
     1080        int8_t part1 = checkCWpart(cw, 0);
     1081        int8_t part2 = checkCWpart(cw, 1);
     1082
     1083        //check for correct half cw format
     1084        if(part1 && part2){ cw[15] = cw15; return 0; }
     1085
     1086        //check for correct cw position
     1087        if(
     1088        (get_odd_even(er) == 0x80 && part1 && !part2)   //xxxxxxxx00000000
    11081089        ||
    11091090        (get_odd_even(er) == 0x81 && !part1 && part2)   //00000000xxxxxxxx
    1110      )
    1111      {
    1112         return 1;
    1113      }
    1114 
    1115      return 0;  //not correct swapped cw
    1116 
    1117   }else
     1091        )
     1092        { return 1; }
     1093        cw[15] = cw15;
     1094        return 0;  //not correct swapped cw
     1095    }else
    11181096    return 1;
    11191097}
    1120 
    11211098
    11221099/**
     
    11281105    for(i = 0; i < len; i++)
    11291106    {
    1130         if(node_id[i])
    1131             { return 0; }
     1107        if(node_id[i]) { return 0; }
    11321108    }
    11331109    return 1;
     
    11371113bool check_client(struct s_client *cl)
    11381114{
    1139     if(cl && !cl->kill)
    1140         { return true; }
     1115    if(cl && !cl->kill) { return true; }
    11411116    return false;
    11421117}
     
    11481123    {
    11491124        CAIDVALUETAB_DATA *cvdata = &cv->cvdata[i];
    1150         if(cvdata->caid == caid || cvdata->caid == caid >> 8)
    1151             return cvdata->value;
     1125        if(cvdata->caid == caid || cvdata->caid == caid >> 8) { return cvdata->value; }
    11521126    }
    11531127    return default_value;
     
    11581132    uint32_t i, is_fakecw = 0;
    11591133    uint32_t idx = ((cw[0]&0xF)<<4) | (cw[8]&0xF);
    1160    
     1134
    11611135    cs_readlock(__func__, &config_lock);
    11621136    for(i=0; i<cfg.fakecws[idx].count; i++)
Note: See TracChangeset for help on using the changeset viewer.