Биллинговая система Nodeny

Главная категория => Общий раздел => Тема начата: elite от 21 Ноября 2011, 12:51:53



Название: Nodeny не проверяет уникальность ip-адресов!
Отправлено: elite от 21 Ноября 2011, 12:51:53
Попробуйте создать клиента с ип 10.10.10.5, а потом с ип 10.10.10.005
:)


Название: Re: Nodeny не проверяет уникальность ip-адресов!
Отправлено: Efendy от 21 Ноября 2011, 13:14:31
Попробуйте создать клиента с ип 10.10.10.5, а потом с ип 10.10.10.005
:)
в данном случае баг не с тем, что это одинаковые ip, а с тем, что 2й ip по сути некорректен (не вообще, а в пределах NoDeny ибо ip воспринимаются/сравниваются как строки). Щас посмотрю что нужно подправить


Название: Re: Nodeny не проверяет уникальность ip-адресов!
Отправлено: Efendy от 21 Ноября 2011, 13:23:21
быстрее всего в голову пришло такое:

в user.pl в

Код:
sub check_ip
{
    $F{ip} =~ s/\.0+([^0\.]+)/\.$1/g;

щас тока протещу, а то до этого ахинею написал)



Название: Re: Nodeny не проверяет уникальность ip-адресов!
Отправлено: elite от 21 Ноября 2011, 13:25:09
так, а при создании нового пользователя, проверка будет работать или надо еще где-то ее вставить?


Название: Re: Nodeny не проверяет уникальность ip-адресов!
Отправлено: Efendy от 21 Ноября 2011, 13:33:26
Придумал аццкий регексп:

Код:
s/(^|\.)0+([^0\.]+|\d$)/$1$2/g;

Проверка:
Код:
foreach my $ip qw(
        0.0.0.0
        10.0.0.1
        0010.1.2.30
        020.000030.04.05
        1.2.3.4
        123.0.234.000
){
        $_ = $ip;
        s/(^|\.)0+([^0\.]+|\d$)/$1$2/g;
        print "$ip -> $_\n";
}

выдает:

Цитировать
0.0.0.0 -> 0.0.0.0
10.0.0.1 -> 10.0.0.1
0010.1.2.30 -> 10.1.2.30
020.000030.04.05 -> 20.30.4.5
1.2.3.4 -> 1.2.3.4
123.0.234.000 -> 123.0.234.0

Насчет создания клиента - сейчас гляну



Название: Re: Nodeny не проверяет уникальность ip-адресов!
Отправлено: Efendy от 21 Ноября 2011, 13:40:09
Итого в user.pl после
Код:
sub check_ip
{

ставим:

Код:
  $F{ip} =~ s/(^|\.)0+([^0\.]+|\d$)/$1$2/g;

В adduser.pl после
Код:
$Fip=&trim($F{ip});

ставим:

Код:
  $Fip =~ s/(^|\.)0+([^0\.]+|\d$)/$1$2/g;


Название: Re: Nodeny не проверяет уникальность ip-адресов!
Отправлено: Efendy от 21 Ноября 2011, 14:19:36
На самом деле покрываются не все возможные варианты извращений. Более правильный вариант:

Код:
$F{ip} = join '.', map{ s/^0+(\d+)$/$1/; $_ } split /\./,$F{ip};

и

Код:
$Fip = join '.', map{ s/^0+(\d+)$/$1/; $_ } split /\./,$Fip;


Название: Re: Nodeny не проверяет уникальность ip-адресов!
Отправлено: 0xbad0c0d3 от 21 Ноября 2011, 14:59:13
А найух регексп!?
Код:
$F{ip} = join '.', map{ int } split /\./,$F{ip};


Название: Re: Nodeny не проверяет уникальность ip-адресов!
Отправлено: Efendy от 21 Ноября 2011, 15:39:43
А найух регексп!?
Код:
$F{ip} = join '.', map{ int } split /\./,$F{ip};
предполагал, что число с лидирующим нулем будет воспринято как восьмеричное:
Код:
print int(010);
выдаст 8.
Но оказывается, что в случае со строками, perl поступает иначе. Так что твой вариант лучше

Тогда проще так:

Код:
s/(\d+)/int $1/ge;