Changeset 1838


Ignore:
Timestamp:
Mar 16, 2010, 10:00:02 PM (9 years ago)
Author:
alno
Message:

new parameter "clientdyndns=0|1" avoids running the clientresolve thread. If you have already have defined hostname for your clients the parameter must be 1, otherwise no auth is possible for this clients

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/globals.h

    r1826 r1838  
    610610    int     bindwait;
    611611    int     resolvedelay;
     612    int     clientdyndns;
    612613    int     tosleep;
    613614    in_addr_t   srvip;
  • trunk/oscam-config.c

    r1810 r1838  
    424424        } else {
    425425            cfg->resolvedelay = atoi(value);
     426            return;
     427        }
     428    }
     429
     430    if (!strcmp(token, "clientdyndns")) {
     431        if (strlen(value) == 0) {
     432            cfg->clientdyndns = 0;
     433            return;
     434        } else {
     435            cfg->clientdyndns = atoi(value);
    426436            return;
    427437        }
  • trunk/oscam.c

    r1829 r1838  
    899899static void cs_client_resolve()
    900900{
    901   while (1)
    902   {
    903     struct hostent *rht;
    904     struct s_auth *account;
    905     struct sockaddr_in udp_sa;
    906 
    907     for (account=cfg->account; account; account=account->next)
    908       if (account->dyndns[0])
    909       {
    910         rht=gethostbyname((const char *)account->dyndns);
    911         if (rht)
    912         {
    913           memcpy(&udp_sa.sin_addr, rht->h_addr, sizeof(udp_sa.sin_addr));
    914           account->dynip=cs_inet_order(udp_sa.sin_addr.s_addr);
    915         }
    916         else
    917           cs_log("can't resolve hostname %s (user: %s)", account->dyndns, account->usr);
    918         client[cs_idx].last=time((time_t)0);
    919       }
    920     sleep(cfg->resolvedelay);
    921   }
     901    while (1)
     902    {
     903        struct hostent *rht;
     904        struct s_auth *account;
     905        struct sockaddr_in udp_sa;
     906
     907        for (account=cfg->account; account; account=account->next)
     908            if (account->dyndns[0])
     909            {
     910                rht=gethostbyname((const char *)account->dyndns);
     911                if (rht)
     912                {
     913                    memcpy(&udp_sa.sin_addr, rht->h_addr, sizeof(udp_sa.sin_addr));
     914                    account->dynip=cs_inet_order(udp_sa.sin_addr.s_addr);
     915                }
     916                else
     917                    cs_log("can't resolve hostname %s (user: %s)", account->dyndns, account->usr);
     918                client[cs_idx].last=time((time_t)0);
     919            }
     920        sleep(cfg->resolvedelay);
     921    }
    922922}
    923923
    924924static void start_client_resolver()
    925925{
    926   int i;
    927   pthread_t tid;
    928 
    929   i=pthread_create(&tid, (pthread_attr_t *)0, (void *)&cs_client_resolve, (void *) 0);
    930   if (i)
    931     cs_log("ERROR: can't create resolver-thread (err=%d)", i);
    932   else
    933   {
    934     cs_log("resolver thread started");
    935     pthread_detach(tid);
    936   }
     926    int i;
     927    pthread_t tid;
     928
     929    i=pthread_create(&tid, (pthread_attr_t *)0, (void *)&cs_client_resolve, (void *) 0);
     930    if (i)
     931        cs_log("ERROR: can't create resolver-thread (err=%d)", i);
     932    else
     933    {
     934        cs_log("resolver thread started");
     935        pthread_detach(tid);
     936    }
    937937}
    938938
    939939void cs_resolve()
    940940{
    941   int i, idx;
    942   struct hostent *rht;
    943   struct s_auth;
    944   for (i=0; i<CS_MAXREADER; i++)
    945     if ((idx=reader[i].cs_idx) && (reader[i].typ & R_IS_NETWORK))
    946     {
    947       client[cs_idx].last=time((time_t)0);
    948       rht=gethostbyname(reader[i].device);
    949       if (rht)
    950       {
    951         memcpy(&client[idx].udp_sa.sin_addr, rht->h_addr,
    952                sizeof(client[idx].udp_sa.sin_addr));
    953         client[idx].ip=cs_inet_order(client[idx].udp_sa.sin_addr.s_addr);
    954       }
    955       else
    956         cs_log("can't resolve %s", reader[i].device);
    957       client[cs_idx].last=time((time_t)0);
    958     }
     941    int i, idx;
     942    struct hostent *rht;
     943    struct s_auth;
     944    for (i=0; i<CS_MAXREADER; i++)
     945        if ((idx=reader[i].cs_idx) && (reader[i].typ & R_IS_NETWORK))
     946        {
     947            client[cs_idx].last=time((time_t)0);
     948            rht = gethostbyname(reader[i].device);
     949            if (rht)
     950            {
     951                memcpy(&client[idx].udp_sa.sin_addr, rht->h_addr,
     952                        sizeof(client[idx].udp_sa.sin_addr));
     953                client[idx].ip=cs_inet_order(client[idx].udp_sa.sin_addr.s_addr);
     954            }
     955            else
     956                cs_log("can't resolve %s", reader[i].device);
     957            client[cs_idx].last=time((time_t)0);
     958        }
    959959}
    960960
     
    993993static void start_resolver()
    994994{
    995   int i;
    996 
    997   cs_sleepms(1000); // wait for reader
    998   while(1)
    999   {
    1000     if (master_pid!=getppid())
    1001       cs_exit(0);
    1002     cs_resolve();
    1003     for (i=0; i<cfg->resolvedelay; i++)
    1004       if (master_pid!=getppid())
    1005         cs_exit(0);
    1006       else
    1007         cs_sleepms(1000);
    1008 //        sleep(cfg->resolvedelay);
    1009   }
     995    int i;
     996
     997    cs_sleepms(1000); // wait for reader
     998    while(1)
     999    {
     1000        if (master_pid!=getppid())
     1001            cs_exit(0);
     1002        cs_resolve();
     1003        for (i=0; i<cfg->resolvedelay; i++)
     1004            if (master_pid!=getppid())
     1005                cs_exit(0);
     1006            else
     1007                cs_sleepms(1000);
     1008        //        sleep(cfg->resolvedelay);
     1009    }
    10101010}
    10111011
     
    11381138int cs_auth_client(struct s_auth *account, char *e_txt)
    11391139{
    1140   int rc=0;
    1141   char buf[32];
    1142   char *t_crypt="encrypted";
    1143   char *t_plain="plain";
    1144   char *t_grant=" granted";
    1145   char *t_reject=" rejected";
    1146   char *t_msg[]= { buf, "invalid access", "invalid ip", "unknown reason" };
    1147   client[cs_idx].grp=0xffffffff;
    1148   client[cs_idx].au=(-1);
    1149   switch((long)account)
    1150   {
    1151     case -2:            // gbx-dummy
    1152       client[cs_idx].dup=0;
    1153       break;
    1154     case 0:           // reject access
    1155       rc=1;
    1156       cs_log("%s %s-client %s%s (%s)",
    1157              client[cs_idx].crypted ? t_crypt : t_plain,
    1158              ph[client[cs_idx].ctyp].desc,
    1159              client[cs_idx].ip ? cs_inet_ntoa(client[cs_idx].ip) : "",
    1160              client[cs_idx].ip ? t_reject : t_reject+1,
    1161              e_txt ? e_txt : t_msg[rc]);
    1162       break;
    1163     default:            // grant/check access
    1164       if (client[cs_idx].ip && account->dyndns[0])
    1165         if (client[cs_idx].ip != account->dynip)
    1166           rc=2;
    1167       if (!rc)
    1168       {
    1169         client[cs_idx].dup=0;
    1170         if (client[cs_idx].typ=='c')
    1171         {
    1172           client[cs_idx].expirationdate=account->expirationdate;
    1173           client[cs_idx].disabled=account->disabled;
    1174           client[cs_idx].c35_suppresscmd08 = account->c35_suppresscmd08;
    1175           client[cs_idx].ncd_keepalive = account->ncd_keepalive;
    1176       client[cs_idx].grp=account->grp;
    1177           client[cs_idx].au=account->au;
    1178           client[cs_idx].autoau=account->autoau;
    1179           client[cs_idx].tosleep=(60*account->tosleep);
    1180           memcpy(&client[cs_idx].ctab, &account->ctab, sizeof(client[cs_idx].ctab));
    1181           if (account->uniq)
    1182             cs_fake_client(account->usr, account->uniq, client[cs_idx].ip);
    1183           client[cs_idx].ftab  = account->ftab;   // IDENT filter
    1184           client[cs_idx].cltab = account->cltab;  // CLASS filter
    1185           client[cs_idx].fchid = account->fchid;  // CHID filter
    1186           client[cs_idx].sidtabok= account->sidtabok;   // services
    1187           client[cs_idx].sidtabno= account->sidtabno;   // services
    1188           client[cs_idx].pcrc  = crc32(0L, MD5((uchar *)account->pwd, strlen(account->pwd), NULL), 16);
    1189           memcpy(&client[cs_idx].ttab, &account->ttab, sizeof(client[cs_idx].ttab));
     1140    int rc=0;
     1141    char buf[32];
     1142    char *t_crypt="encrypted";
     1143    char *t_plain="plain";
     1144    char *t_grant=" granted";
     1145    char *t_reject=" rejected";
     1146    char *t_msg[]= { buf, "invalid access", "invalid ip", "unknown reason" };
     1147    client[cs_idx].grp=0xffffffff;
     1148    client[cs_idx].au=(-1);
     1149    switch((long)account)
     1150    {
     1151    case -2:            // gbx-dummy
     1152    client[cs_idx].dup=0;
     1153    break;
     1154    case 0:           // reject access
     1155        rc=1;
     1156        cs_log("%s %s-client %s%s (%s)",
     1157                client[cs_idx].crypted ? t_crypt : t_plain,
     1158                ph[client[cs_idx].ctyp].desc,
     1159                client[cs_idx].ip ? cs_inet_ntoa(client[cs_idx].ip) : "",
     1160                client[cs_idx].ip ? t_reject : t_reject+1,
     1161                e_txt ? e_txt : t_msg[rc]);
     1162        break;
     1163    default:            // grant/check access
     1164        if (client[cs_idx].ip && account->dyndns[0])
     1165            if (client[cs_idx].ip != account->dynip)
     1166                rc=2;
     1167        if (!rc)
     1168        {
     1169            client[cs_idx].dup=0;
     1170            if (client[cs_idx].typ=='c')
     1171            {
     1172                client[cs_idx].expirationdate=account->expirationdate;
     1173                client[cs_idx].disabled=account->disabled;
     1174                client[cs_idx].c35_suppresscmd08 = account->c35_suppresscmd08;
     1175                client[cs_idx].ncd_keepalive = account->ncd_keepalive;
     1176                client[cs_idx].grp=account->grp;
     1177                client[cs_idx].au=account->au;
     1178                client[cs_idx].autoau=account->autoau;
     1179                client[cs_idx].tosleep=(60*account->tosleep);
     1180                memcpy(&client[cs_idx].ctab, &account->ctab, sizeof(client[cs_idx].ctab));
     1181                if (account->uniq)
     1182                    cs_fake_client(account->usr, account->uniq, client[cs_idx].ip);
     1183                client[cs_idx].ftab  = account->ftab;   // IDENT filter
     1184                client[cs_idx].cltab = account->cltab;  // CLASS filter
     1185                client[cs_idx].fchid = account->fchid;  // CHID filter
     1186                client[cs_idx].sidtabok= account->sidtabok;   // services
     1187                client[cs_idx].sidtabno= account->sidtabno;   // services
     1188                client[cs_idx].pcrc  = crc32(0L, MD5((uchar *)account->pwd, strlen(account->pwd), NULL), 16);
     1189                memcpy(&client[cs_idx].ttab, &account->ttab, sizeof(client[cs_idx].ttab));
    11901190#ifdef CS_ANTICASC
    1191           ac_init_client(account);
    1192 #endif
    1193         }
    1194       }
    1195       client[cs_idx].monlvl=account->monlvl;
    1196       strcpy(client[cs_idx].usr, account->usr);
    1197     case -1:            // anonymous grant access
    1198       if (rc)
    1199         t_grant=t_reject;
    1200       else
    1201       {
    1202         if (client[cs_idx].typ=='m')
    1203           sprintf(t_msg[0], "lvl=%d", client[cs_idx].monlvl);
    1204         else
    1205         {
    1206           if(client[cs_idx].autoau)
    1207           {
    1208             if(client[cs_idx].ncd_server)
    1209             {
    1210               int r=0;
    1211               for(r=0;r<CS_MAXREADER;r++)
    1212               {
    1213                 if(reader[r].caid[0]==cfg->ncd_ptab.ports[client[cs_idx].port_idx].ftab.filts[0].caid)
    1214                 {
    1215                   client[cs_idx].au=r;
    1216                   break;
    1217                 }
    1218               }
    1219               if(client[cs_idx].au<0) sprintf(t_msg[0], "au(auto)=%d", client[cs_idx].au+1);
    1220                 else sprintf(t_msg[0], "au(auto)=%s", reader[client[cs_idx].au].label);
    1221             }
    1222             else
    1223             {
    1224               sprintf(t_msg[0], "au=auto");
    1225             }
    1226           }
    1227           else
    1228           {
    1229             if(client[cs_idx].au<0) sprintf(t_msg[0], "au=%d", client[cs_idx].au+1);
    1230               else sprintf(t_msg[0], "au=%s", reader[client[cs_idx].au].label);
    1231           }
    1232         }
    1233       }
    1234       if(client[cs_idx].ncd_server)
    1235       {
    1236         cs_log("%s %s:%d-client %s%s (%s, %s)",
    1237              client[cs_idx].crypted ? t_crypt : t_plain,
    1238              e_txt ? e_txt : ph[client[cs_idx].ctyp].desc,
    1239              cfg->ncd_ptab.ports[client[cs_idx].port_idx].s_port,
    1240              client[cs_idx].ip ? cs_inet_ntoa(client[cs_idx].ip) : "",
    1241              client[cs_idx].ip ? t_grant : t_grant+1,
    1242              username(cs_idx), t_msg[rc]);
    1243       }
    1244       else
    1245       {
    1246         cs_log("%s %s-client %s%s (%s, %s)",
    1247              client[cs_idx].crypted ? t_crypt : t_plain,
    1248              e_txt ? e_txt : ph[client[cs_idx].ctyp].desc,
    1249              client[cs_idx].ip ? cs_inet_ntoa(client[cs_idx].ip) : "",
    1250              client[cs_idx].ip ? t_grant : t_grant+1,
    1251              username(cs_idx), t_msg[rc]);
    1252       }
    1253 
    1254       break;
    1255   }
    1256   return(rc);
     1191                ac_init_client(account);
     1192#endif
     1193            }
     1194        }
     1195        client[cs_idx].monlvl=account->monlvl;
     1196        strcpy(client[cs_idx].usr, account->usr);
     1197    case -1:            // anonymous grant access
     1198    if (rc)
     1199        t_grant=t_reject;
     1200    else
     1201    {
     1202        if (client[cs_idx].typ=='m')
     1203            sprintf(t_msg[0], "lvl=%d", client[cs_idx].monlvl);
     1204        else
     1205        {
     1206            if(client[cs_idx].autoau)
     1207            {
     1208                if(client[cs_idx].ncd_server)
     1209                {
     1210                    int r=0;
     1211                    for(r=0;r<CS_MAXREADER;r++)
     1212                    {
     1213                        if(reader[r].caid[0]==cfg->ncd_ptab.ports[client[cs_idx].port_idx].ftab.filts[0].caid)
     1214                        {
     1215                            client[cs_idx].au=r;
     1216                            break;
     1217                        }
     1218                    }
     1219                    if(client[cs_idx].au<0) sprintf(t_msg[0], "au(auto)=%d", client[cs_idx].au+1);
     1220                    else sprintf(t_msg[0], "au(auto)=%s", reader[client[cs_idx].au].label);
     1221                }
     1222                else
     1223                {
     1224                    sprintf(t_msg[0], "au=auto");
     1225                }
     1226            }
     1227            else
     1228            {
     1229                if(client[cs_idx].au<0) sprintf(t_msg[0], "au=%d", client[cs_idx].au+1);
     1230                else sprintf(t_msg[0], "au=%s", reader[client[cs_idx].au].label);
     1231            }
     1232        }
     1233    }
     1234    if(client[cs_idx].ncd_server)
     1235    {
     1236        cs_log("%s %s:%d-client %s%s (%s, %s)",
     1237                client[cs_idx].crypted ? t_crypt : t_plain,
     1238                        e_txt ? e_txt : ph[client[cs_idx].ctyp].desc,
     1239                                cfg->ncd_ptab.ports[client[cs_idx].port_idx].s_port,
     1240                                client[cs_idx].ip ? cs_inet_ntoa(client[cs_idx].ip) : "",
     1241                                        client[cs_idx].ip ? t_grant : t_grant+1,
     1242                                                username(cs_idx), t_msg[rc]);
     1243    }
     1244    else
     1245    {
     1246        cs_log("%s %s-client %s%s (%s, %s)",
     1247                client[cs_idx].crypted ? t_crypt : t_plain,
     1248                        e_txt ? e_txt : ph[client[cs_idx].ctyp].desc,
     1249                                client[cs_idx].ip ? cs_inet_ntoa(client[cs_idx].ip) : "",
     1250                                        client[cs_idx].ip ? t_grant : t_grant+1,
     1251                                                username(cs_idx), t_msg[rc]);
     1252    }
     1253
     1254    break;
     1255    }
     1256    return(rc);
    12571257}
    12581258
     
    25152515    client[0].last=time((time_t *)0);
    25162516
    2517   start_client_resolver();
     2517    if(cfg->clientdyndns)
     2518        start_client_resolver();
     2519
    25182520  init_service(97); // logger
    25192521  init_service(98); // resolver
Note: See TracChangeset for help on using the changeset viewer.