[Rt-commit] rt branch, ip-customfields, updated. rt-3.8.8-662-g4c6b7bd

? sunnavy sunnavy at bestpractical.com
Fri Sep 3 05:47:34 EDT 2010


The branch, ip-customfields has been updated
       via  4c6b7bdc6889bbe16f9d00e198d53044b2fc28ea (commit)
       via  7f52e20d34f2d13fac6ad34e082cc145089c43c7 (commit)
       via  7f07692971c1c95031649518f78b37ce185066b5 (commit)
       via  16afadeb78f9ed5fc924683c4532ea733386977c (commit)
       via  7dd5bc9fbbc5a1bbf3eb255d530c7dd5116b1445 (commit)
       via  8bf3073339ee8077766e0600f12665f4c40219cb (commit)
       via  e999a36a0a5f1a1977bd7ebbe68fa3b7c3d4ba6a (commit)
       via  a7feaa272e45872ec1f6a8edbd9c840307e77e6f (commit)
      from  082373ddf7c2124515242672407e27c124fa7171 (commit)

Summary of changes:
 lib/RT/ObjectCustomFieldValue_Overlay.pm |   13 +-
 lib/RT/Tickets_Overlay.pm                |   26 +-
 sbin/rt-test-dependencies.in             |    2 +
 share/html/Elements/ValidateCustomFields |   16 +-
 t/customfields/ip.t                      |  676 ++++++++++++------------------
 5 files changed, 316 insertions(+), 417 deletions(-)

- Log -----------------------------------------------------------------
commit a7feaa272e45872ec1f6a8edbd9c840307e77e6f
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Fri Sep 3 16:29:13 2010 +0800

    not show 127.0.0.1-127.0.0.1, a single 127.0.0.1 is fine

diff --git a/lib/RT/ObjectCustomFieldValue_Overlay.pm b/lib/RT/ObjectCustomFieldValue_Overlay.pm
index 1797fc7..929d8b0 100644
--- a/lib/RT/ObjectCustomFieldValue_Overlay.pm
+++ b/lib/RT/ObjectCustomFieldValue_Overlay.pm
@@ -230,7 +230,12 @@ sub Content {
         my $large_content = $self->__Value('LargeContent');
             if ( $large_content =~ /^\s*($re_ip_serialized)\s*$/o ) {
                 my $eIP = sprintf "%d.%d.%d.%d", split /\./, $1;
-                return $content . "-".$eIP if ($content  && $eIP);
+                if ( $content eq $eIP ) {
+                    return $content;
+                }
+                else {
+                    return $content . "-".$eIP;
+                }
             } else {
                 return $content;
             }

commit e999a36a0a5f1a1977bd7ebbe68fa3b7c3d4ba6a
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Fri Sep 3 16:31:21 2010 +0800

    handle IP cf

diff --git a/lib/RT/Tickets_Overlay.pm b/lib/RT/Tickets_Overlay.pm
index 857695f..5e8e4f1 100755
--- a/lib/RT/Tickets_Overlay.pm
+++ b/lib/RT/Tickets_Overlay.pm
@@ -1379,14 +1379,19 @@ sub _CustomFieldLimit {
         return 'NOT MATCHES' if $op eq '!=';
         return $op;
     };
-       if ( $cf && ( $cf->Type eq 'IPAddress'  || $cf->Type eq 'IPAddressRange')) {
-        return unless $op =~ /^\s*$RE{net}{CIDR}{IPv4}{-keep}\s*$/o;
+    if (   $cf
+        && ( $cf->Type eq 'IPAddress' || $cf->Type eq 'IPAddressRange' )
+        && $value =~ /^\s*$RE{net}{CIDR}{IPv4}{-keep}\s*$/o )
+    {
+
         # convert incomplete 192.168/24 to 192.168.0.0/24 format
-        my $cidr = join( '.', map $_||0, (split /\./, $1)[0..3] ) ."/$2";
+        my $cidr =
+          join( '.', map $_ || 0, ( split /\./, $1 )[ 0 .. 3 ] ) . "/$2";
+
         # convert to range and continue, it will be catched by next wrapper
-        $op = (Net::CIDR::cidr2range( $cidr ))[0] || $op;
+        $value = ( Net::CIDR::cidr2range($cidr) )[0] || $value;
 
-     }
+    }
 
     my $single_value = !$cf || !$cfid || $cf->SingleValue;
 
@@ -1415,7 +1420,7 @@ sub _CustomFieldLimit {
         ) if $CFs;
         $self->_CloseParen;
     }
-       elsif ( $op!~ /^[<>]=?$/ && (  $cf && ($cf->Type eq 'IPAddress'  || $cf->Type eq 'IPAddressRange'))) {
+    elsif ( $op !~ /^[<>]=?$/ && (  $cf && ($cf->Type eq 'IPAddress'  || $cf->Type eq 'IPAddressRange'))) {
     
         $value =~ /^\s*($RE{net}{IPv4})\s*(?:-\s*($RE{net}{IPv4})\s*)?$/o;
         my ($start_ip, $end_ip) = ($1, ($2 || $1));
@@ -1423,15 +1428,14 @@ sub _CustomFieldLimit {
             for $start_ip, $end_ip;
         ($start_ip, $end_ip) = ($end_ip, $start_ip) if $start_ip gt $end_ip;
         
-        my ($self, $field, $op, $value, %rest) = @_[0..($#_-1)];
         $self->_OpenParen;
         if ( $op !~ /NOT|!=|<>/i ) { # positive equation
             $self->_CustomFieldLimit(
-                $field, '<=', $end_ip, %rest,
+                'CF', '<=', $end_ip, %rest,
                 SUBKEY => $rest{'SUBKEY'}. '.Content',
             );
             $self->_CustomFieldLimit(
-                $field, '>=', $start_ip, %rest,
+                'CF', '>=', $start_ip, %rest,
                 SUBKEY          => $rest{'SUBKEY'}. '.LargeContent',
                 ENTRYAGGREGATOR => 'AND',
             ); 
@@ -1459,6 +1463,7 @@ sub _CustomFieldLimit {
             # estimations and scan less rows, but it's harder to do
             # as we have OR aggregator
         }
+        $self->_CloseParen;
     } 
     elsif ( !$negative_op || $single_value ) {
         $cfkey .= '.'. $self->{'_sql_multiple_cfs_index'}++ if !$single_value && !$range_op;

commit 8bf3073339ee8077766e0600f12665f4c40219cb
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Fri Sep 3 16:31:50 2010 +0800

    I can't believe we misses this

diff --git a/lib/RT/Tickets_Overlay.pm b/lib/RT/Tickets_Overlay.pm
index 5e8e4f1..86e44c2 100755
--- a/lib/RT/Tickets_Overlay.pm
+++ b/lib/RT/Tickets_Overlay.pm
@@ -1484,6 +1484,9 @@ sub _CustomFieldLimit {
                 VALUE      => $value,
                 %rest
             );
+            $self->_CloseParen;
+            $self->_CloseParen;
+            $self->_CloseParen;
         }
         else {
             my $cf = RT::CustomField->new( $self->CurrentUser );

commit 7dd5bc9fbbc5a1bbf3eb255d530c7dd5116b1445
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Fri Sep 3 16:37:02 2010 +0800

    not allow empty ip cf value

diff --git a/lib/RT/ObjectCustomFieldValue_Overlay.pm b/lib/RT/ObjectCustomFieldValue_Overlay.pm
index 929d8b0..9e6c633 100644
--- a/lib/RT/ObjectCustomFieldValue_Overlay.pm
+++ b/lib/RT/ObjectCustomFieldValue_Overlay.pm
@@ -78,7 +78,13 @@ sub Create {
     if($cf_as_sys->Type eq 'IPAddress' || $cf_as_sys->Type eq 'IPAddressRange') {
         if ($args{'Content'}) {
             ($args{'Content'}, $args{'LargeContent'}) = $self->ParseIPRange( $args{'Content'} );
+        }
 
+        unless ( defined $args{'Content'} ) {
+            return
+              wantarray
+              ? ( 0, $self->loc("Content can't be empty for IPAddress(Range)") )
+              : 0;
         }
     }
 

commit 16afadeb78f9ed5fc924683c4532ea733386977c
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Fri Sep 3 16:57:50 2010 +0800

    port ip cf tests

diff --git a/t/customfields/ip.t b/t/customfields/ip.t
index 9cb04fe..73ed696 100644
--- a/t/customfields/ip.t
+++ b/t/customfields/ip.t
@@ -3,9 +3,10 @@
 use strict;
 use warnings;
 
-use RT::Test tests => 489;
+use RT::Test tests => 139;
 
 my ($baseurl, $agent) =RT::Test->started_ok;
+ok( $agent->login, 'log in' );
 
 my $q = RT::Queue->new($RT::SystemUser);
 $q->Load('General');
@@ -13,6 +14,7 @@ my $ip_cf = RT::CustomField->new($RT::SystemUser);
         
 my ($val,$msg) = $ip_cf->Create(Name => 'IP', Type =>'IPAddressRange', LookupType => 'RT::Queue-RT::Ticket');
 ok($val,$msg);
+my $cf_id = $val;
 $ip_cf->AddToObject($q);
 use_ok('RT');
 
@@ -30,360 +32,262 @@ diag "load and check basic properties of the IP CF" if $ENV{'TEST_VERBOSE'};
     ok( !$cf->Disabled, "not disabled" );
 }
 
-diag "check that CF applies to all RTIR's queues" if $ENV{'TEST_VERBOSE'};
+diag "check that CF applies to queue General" if $ENV{'TEST_VERBOSE'};
 {
-    foreach ( 'General'){ 
-        my $queue = RT::Queue->new( $RT::SystemUser );
-        $queue->Load( $_ );
-        ok( $queue->id, 'loaded queue '. $_ );
-        my $cfs = $queue->TicketCustomFields;
-        $cfs->Limit( FIELD => 'id', VALUE => $cf->id, ENTRYAGGREGATOR => 'AND' );
-        is( $cfs->Count, 1, 'field applies to queue' );
-    }
+    my $cfs = $q->TicketCustomFields;
+    $cfs->Limit( FIELD => 'id', VALUE => $cf->id, ENTRYAGGREGATOR => 'AND' );
+    is( $cfs->Count, 1, 'field applies to queue' );
 }
-my $rtir_user = RT::CurrentUser->new( 'root' );
 
 diag "create a ticket via web and set IP" if $ENV{'TEST_VERBOSE'};
 {
-    my $i = 0;
-    my $incident_id; # block couldn't be created without incident id
-    foreach my $queue( 'Incidents', 'Incident Reports', 'Investigations', 'Blocks' ) {
-        diag "create a ticket in the '$queue' queue" if $ENV{'TEST_VERBOSE'};
-
-        my $val = '192.168.20.'. ++$i;
-        my $id = $agent->create_ticket_ok(
-            $queue,
-            {
-                Subject => "test ip",
-                ( $queue eq 'Blocks' ? ( Incident => $incident_id ) : () ),
-            },
-            { IP => $val },
-        );
-        $incident_id = $id if $queue eq 'Incidents';
-
-        $agent->display_ticket( $id);
-        $agent->content_like( qr/\Q$val/, "IP on the page" );
-
-        my $ticket = RT::Ticket->new( $RT::SystemUser );
-        $ticket->Load( $id );
-        ok( $ticket->id, 'loaded ticket' );
-        is( $ticket->FirstCustomFieldValue('IP'), $val, 'correct value' );
-    }
-}
-
-diag "create a ticket via web with IP in message" if $ENV{'TEST_VERBOSE'};
-{
-    my $i = 0;
-    my $incident_id; # block couldn't be created without incident id
-    foreach my $queue( 'Incidents', 'Incident Reports', 'Investigations', 'Blocks' ) {
-        diag "create a ticket in the '$queue' queue" if $ENV{'TEST_VERBOSE'};
-
-        my $val = '192.168.20.'. ++$i;
-        my $id = $agent->create_ticket_ok(
-            $queue,
-            {
-                Subject => "test ip in message",
-                ($queue eq 'Blocks'? (Incident => $incident_id): ()),
-                Content => "$val",
-            },
-        );
-        $incident_id = $id if $queue eq 'Incidents';
+    my $val = '192.168.20.1';
+    ok $agent->goto_create_ticket($q), "go to create ticket";
+    my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
+    $agent->submit_form(
+        form_name => 'TicketCreate',
+        fields    => {
+            Subject                                       => 'test ip',
+            $cf_field => $val,
+        }
+    );
 
-        $agent->display_ticket( $id);
-        $agent->content_like( qr/\Q$val/, "IP on the page" );
+    $agent->content_like( qr/\Q$val/, "IP on the page" );
+    my ($id) = $agent->content =~ /Ticket (\d+) created/;
+    ok( $id, "created ticket $id" );
 
-        my $ticket = RT::Ticket->new( $RT::SystemUser );
-        $ticket->Load( $id );
-        ok( $ticket->id, 'loaded ticket' );
-        is( $ticket->FirstCustomFieldValue('IP'), $val, 'correct value' );
-    }
+    my $ticket = RT::Ticket->new($RT::SystemUser);
+    $ticket->Load($id);
+    ok( $ticket->id, 'loaded ticket' );
+    is( $ticket->FirstCustomFieldValue('IP'), $val, 'correct value' );
 }
 
 diag "create a ticket via web with CIDR" if $ENV{'TEST_VERBOSE'};
 {
-    my $i = 0;
-    my $incident_id; # block couldn't be created without incident id
-    foreach my $queue( 'Incidents', 'Incident Reports', 'Investigations', 'Blocks' ) {
-        diag "create a ticket in the '$queue' queue" if $ENV{'TEST_VERBOSE'};
-
-        my $val = '172.16.'. ++$i .'/31'; # add two hosts
-        my $id = $agent->create_ticket_ok(
-            $queue,
-            {
-                Subject => "test ip",
-                ($queue eq 'Blocks'? (Incident => $incident_id): ()),
-            },
-            { IP => $val },
-        );
-        $incident_id = $id if $queue eq 'Incidents';
-
-        $agent->display_ticket( $id);
-        $agent->content_like( qr/172\.16\.$i\.0-172\.16\.$i\.1/, "IP range on the page" );
-
-        my $ticket = RT::Ticket->new( $RT::SystemUser );
-        $ticket->Load( $id );
-        ok( $ticket->id, 'loaded ticket' );
-        my $values = $ticket->CustomFieldValues('IP');
-        my %has = map { $_->Content => 1 } @{ $values->ItemsArrayRef };
-        ok( $has{ "172.16.$i.0-172.16.$i.1" }, "has value" )
-            or diag "but has values ". join ", ", keys %has;
-    }
-}
+    my $val = '172.16.20/31';
+    ok $agent->goto_create_ticket($q), "go to create ticket";
+    my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
+    $agent->submit_form(
+        form_name => 'TicketCreate',
+        fields    => {
+            Subject                                       => 'test ip',
+            $cf_field => $val,
+        }
+    );
 
-diag "create a ticket via web with CIDR in message" if $ENV{'TEST_VERBOSE'};
-{
-    my $i = 0;
-    my $incident_id; # block couldn't be created without incident id
-    foreach my $queue( 'Incidents', 'Incident Reports', 'Investigations', 'Blocks' ) {
-        diag "create a ticket in the '$queue' queue" if $ENV{'TEST_VERBOSE'};
-
-        my $val = '172.16.'. ++$i .'/31'; # add two hosts
-        my $id = $agent->create_ticket_ok(
-            $queue,
-            {
-                Subject => "test ip in message",
-                ($queue eq 'Blocks'? (Incident => $incident_id): ()),
-                Content => "$val",
-            },
-        );
-        $incident_id = $id if $queue eq 'Incidents';
-
-        $agent->display_ticket( $id);
-        $agent->content_like( qr/172\.16\.$i\.0-172\.16\.$i\.1/, "IP range on the page" );
-
-        my $ticket = RT::Ticket->new( $RT::SystemUser );
-        $ticket->Load( $id );
-        ok( $ticket->id, 'loaded ticket' );
-        my $values = $ticket->CustomFieldValues('IP');
-        my %has = map { $_->Content => 1 } @{ $values->ItemsArrayRef };
-        ok( $has{ "172.16.$i.0-172.16.$i.1" }, "has value" )
-            or diag "but has values ". join ", ", keys %has;
-    }
-}
+    my ($id) = $agent->content =~ /Ticket (\d+) created/;
+    ok( $id, "created ticket $id" );
 
-diag "create a ticket and edit IP field using Edit page" if $ENV{'TEST_VERBOSE'};
-{
-    my $i = 0;
-    my $incident_id; # block couldn't be created without incident id
-    foreach my $queue( 'Incidents', 'Incident Reports', 'Investigations', 'Blocks' ) {
-        diag "create a ticket in the '$queue' queue" if $ENV{'TEST_VERBOSE'};
-
-        my $id = $agent->create_ticket_ok(
-            $queue,
-            {
-                Subject => "test ip in message",
-                ($queue eq 'Blocks'? (Incident => $incident_id): ()),
-            },
-        );
-        $incident_id = $id if $queue eq 'Incidents';
-        $agent->display_ticket( $id);
-
-        my $field_name = "Object-RT::Ticket-$id-CustomField-". $cf->id ."-Values";
-
-diag "set IP" if $ENV{'TEST_VERBOSE'};
-        my $val = '172.16.0.1';
-        $agent->follow_link_ok({text => 'Edit', n => "1"}, "Followed 'Edit' link");
-        $agent->form_number(3);
-        like( $agent->value($field_name), qr/^\s*$/, 'IP is empty' );
-        $agent->field( $field_name => $val );
-        $agent->click('SaveChanges');
-
-        $agent->content_like( qr/\Q$val/, "IP on the page" );
-
-        my $ticket = RT::Ticket->new( $RT::SystemUser );
-        $ticket->Load( $id );
-        ok( $ticket->id, 'loaded ticket' );
-        my $values = $ticket->CustomFieldValues('IP');
-        my %has = map { $_->Content => 1 } @{ $values->ItemsArrayRef };
-        is( scalar values %has, 1, "one IP were added");
-        ok( $has{ $val }, "has value" )
-            or diag "but has values ". join ", ", keys %has;
-
-diag "set IP with spaces around" if $ENV{'TEST_VERBOSE'};
-        $val = "  172.16.0.2  \n  ";
-        $agent->follow_link_ok({text => 'Edit', n => "1"}, "Followed 'Edit' link");
-        $agent->form_number(3);
-        like( $agent->value($field_name), qr/^\s*\Q172.16.0.1\E\s*$/, 'IP is in input box' );
-        $agent->field( $field_name => $val );
-        $agent->click('SaveChanges');
-
-        $agent->content_like( qr/\Q172.16.0.2/, "IP on the page" );
-
-        $ticket = RT::Ticket->new( $RT::SystemUser );
-        $ticket->Load( $id );
-        ok( $ticket->id, 'loaded ticket' );
-        $values = $ticket->CustomFieldValues('IP');
-        %has = map { $_->Content => 1 } @{ $values->ItemsArrayRef };
-        is( scalar values %has, 1, "one IP were added");
-        ok( $has{ '172.16.0.2' }, "has value" )
-            or diag "but has values ". join ", ", keys %has;
-
-diag "replace IP with a range" if $ENV{'TEST_VERBOSE'};
-        $val = '172.16.0.0-172.16.0.255';
-        $agent->follow_link_ok({text => 'Edit', n => "1"}, "Followed 'Edit' link");
-        $agent->form_number(3);
-        like( $agent->value($field_name), qr/^\s*\Q172.16.0.2\E\s*$/, 'IP is in input box' );
-        $agent->field( $field_name => $val );
-        $agent->click('SaveChanges');
-
-        $agent->content_like( qr/\Q$val/, "IP on the page" );
-
-        $ticket = RT::Ticket->new( $RT::SystemUser );
-        $ticket->Load( $id );
-        ok( $ticket->id, 'loaded ticket' );
-        $values = $ticket->CustomFieldValues('IP');
-        %has = map { $_->Content => 1 } @{ $values->ItemsArrayRef };
-        is( scalar values %has, 1, "one IP were added");
-        ok( $has{ $val }, "has value" )
-            or diag "but has values ". join ", ", keys %has;
-
-diag "delete range, add another range using CIDR" if $ENV{'TEST_VERBOSE'};
-        $val = '172.16/16';
-        $agent->follow_link_ok({text => 'Edit', n => "1"}, "Followed 'Edit' link");
-        $agent->form_number(3);
-        like( $agent->value($field_name), qr/^\s*\Q172.16.0.0-172.16.0.255\E\s*$/, 'IP is empty' );
-        $agent->field( $field_name => $val );
-        $agent->click('SaveChanges');
-
-        $agent->content_like( qr/\Q$val/, "IP on the page" );
-
-        $ticket = RT::Ticket->new( $RT::SystemUser );
-        $ticket->Load( $id );
-        ok( $ticket->id, 'loaded ticket' );
-        $values = $ticket->CustomFieldValues('IP');
-        %has = map { $_->Content => 1 } @{ $values->ItemsArrayRef };
-        is( scalar values %has, 1, "one IP were added");
-        ok( $has{ '172.16.0.0-172.16.255.255' }, "has value" )
-            or diag "but has values ". join ", ", keys %has;
-    }
+    my $ticket = RT::Ticket->new($RT::SystemUser);
+    $ticket->Load($id);
+    ok( $ticket->id, 'loaded ticket' );
+    is( $ticket->FirstCustomFieldValue('IP'), '172.16.20.0-172.16.20.1', 'correct value' );
 }
 
-diag "check that we parse correct IPs only" if $ENV{'TEST_VERBOSE'};
+diag "create a ticket and edit IP field using Edit page" if $ENV{'TEST_VERBOSE'};
 {
-    my $id = $agent->create_ir( { Subject => "test ip", Content => '1.0.0.0' } );
-    ok($id, "created a ticket");
+    my $val = '172.16.0.1';
+    ok $agent->goto_create_ticket($q), "go to create ticket";
+    $agent->submit_form(
+        form_name => 'TicketCreate',
+        fields    => { Subject => 'test ip', }
+    );
 
-    my $ticket = RT::Ticket->new( $RT::SystemUser );
-    $ticket->Load( $id );
-    is( $ticket->id, $id, 'loaded ticket' );
+    my ($id) = $agent->content =~ /Ticket (\d+) created/;
+    ok( $id, "created ticket $id" );
+    my $cf_field = "Object-RT::Ticket-$id-CustomField-$cf_id-Values";
 
-    my %has = ();
-    $has{ $_->Content }++ foreach @{ $ticket->CustomFieldValues('IP')->ItemsArrayRef };
-    is(scalar values %has, 1, "one IP was added");
-    ok($has{'1.0.0.0'}, 'correct value');
+    $agent->follow_link_ok( { text => 'Basics', n => "1" },
+        "Followed 'Basics' link" );
+    $agent->form_number(3);
 
-    $id = $agent->create_ir( { Subject => "test ip", Content => '255.255.255.255' } );
-    ok($id, "created a ticket");
+    like( $agent->value($cf_field), qr/^\s*$/, 'IP is empty' );
+    $agent->field( $cf_field => $val );
+    $agent->click('SubmitTicket');
 
-    $ticket = RT::Ticket->new( $RT::SystemUser );
-    $ticket->Load( $id );
-    is($ticket->id, $id, 'loaded ticket');
+    $agent->content_like( qr/\Q$val/, "IP on the page" );
 
-    %has = ();
-    $has{ $_->Content }++ foreach @{ $ticket->CustomFieldValues('IP')->ItemsArrayRef };
-    is(scalar values %has, 1, "one IP was added");
-    ok($has{'255.255.255.255'}, 'correct value');
+    my $ticket = RT::Ticket->new($RT::SystemUser);
+    $ticket->Load($id);
+    ok( $ticket->id, 'loaded ticket' );
+    my $values = $ticket->CustomFieldValues('IP');
+    my %has = map { $_->Content => 1 } @{ $values->ItemsArrayRef };
+    is( scalar values %has, 1, "one IP were added" );
+    ok( $has{$val}, "has value" )
+      or diag "but has values " . join ", ", keys %has;
+
+    diag "set IP with spaces around" if $ENV{'TEST_VERBOSE'};
+    $val = "  172.16.0.2  \n  ";
+    $agent->follow_link_ok( { text => 'Basics', n => "1" },
+        "Followed 'Basics' link" );
+    $agent->form_number(3);
+    like( $agent->value($cf_field),
+        qr/^\s*\Q172.16.0.1\E\s*$/, 'IP is in input box' );
+    $agent->field( $cf_field => $val );
+    $agent->click('SubmitTicket');
 
-    $id = $agent->create_ir( { Subject => "test ip", Content => '255.255.255.256' } );
-    ok($id, "created a ticket");
+    $agent->content_like( qr/\Q172.16.0.2/, "IP on the page" );
 
-    $ticket = RT::Ticket->new( $RT::SystemUser );
-    $ticket->Load( $id );
-    is($ticket->id, $id, 'loaded ticket');
-    is($ticket->CustomFieldValues('IP')->Count, 0, "IP wasn't added");
+    $ticket = RT::Ticket->new($RT::SystemUser);
+    $ticket->Load($id);
+    ok( $ticket->id, 'loaded ticket' );
+    $values = $ticket->CustomFieldValues('IP');
+    %has = map { $_->Content => 1 } @{ $values->ItemsArrayRef };
+    is( scalar values %has, 1, "one IP were added" );
+    ok( $has{'172.16.0.2'}, "has value" )
+      or diag "but has values " . join ", ", keys %has;
+
+    diag "replace IP with a range" if $ENV{'TEST_VERBOSE'};
+    $val = '172.16.0.0-172.16.0.255';
+    $agent->follow_link_ok( { text => 'Basics', n => "1" },
+        "Followed 'Basics' link" );
+    $agent->form_number(3);
+    like( $agent->value($cf_field),
+        qr/^\s*\Q172.16.0.2\E\s*$/, 'IP is in input box' );
+    $agent->field( $cf_field => $val );
+    $agent->click('SubmitTicket');
 
-    $id = $agent->create_ir( { Subject => "test ip", Content => '355.255.255.255' } );
-    ok($id, "created a ticket");
+    $agent->content_like( qr/\Q$val/, "IP on the page" );
 
-    $ticket = RT::Ticket->new( $RT::SystemUser );
-    $ticket->Load( $id );
-    is($ticket->id, $id, 'loaded ticket');
-    is($ticket->CustomFieldValues('IP')->Count, 0, "IP wasn't added");
+    $ticket = RT::Ticket->new($RT::SystemUser);
+    $ticket->Load($id);
+    ok( $ticket->id, 'loaded ticket' );
+    $values = $ticket->CustomFieldValues('IP');
+    %has = map { $_->Content => 1 } @{ $values->ItemsArrayRef };
+    is( scalar values %has, 1, "one IP were added" );
+    ok( $has{$val}, "has value" )
+      or diag "but has values " . join ", ", keys %has;
+
+    diag "delete range, add another range using CIDR" if $ENV{'TEST_VERBOSE'};
+    $val = '172.16/16';
+    $agent->follow_link_ok( { text => 'Basics', n => "1" },
+        "Followed 'Basics' link" );
+    $agent->form_number(3);
+    like(
+        $agent->value($cf_field),
+        qr/^\s*\Q172.16.0.0-172.16.0.255\E\s*$/,
+        'IP is empty'
+    );
+    $agent->field( $cf_field => $val );
+    $agent->click('SubmitTicket');
 
-    $id = $agent->create_ir( { Subject => "test ip", Content => '8.13.8/8.13.0/1.0' } );
-    ok($id, "created a ticket");
+    $agent->content_like( qr/\Q$val/, "IP on the page" );
 
-    $ticket = RT::Ticket->new( $RT::SystemUser );
-    $ticket->Load( $id );
-    is($ticket->id, $id, 'loaded ticket');
-    is($ticket->CustomFieldValues('IP')->Count, 0, "IP wasn't added");
+    $ticket = RT::Ticket->new($RT::SystemUser);
+    $ticket->Load($id);
+    ok( $ticket->id, 'loaded ticket' );
+    $values = $ticket->CustomFieldValues('IP');
+    %has = map { $_->Content => 1 } @{ $values->ItemsArrayRef };
+    is( scalar values %has, 1, "one IP were added" );
+    ok( $has{'172.16.0.0-172.16.255.255'}, "has value" )
+      or diag "but has values " . join ", ", keys %has;
 }
 
-diag "check that IPs in messages don't add duplicates" if $ENV{'TEST_VERBOSE'};
+diag "check that we parse correct IPs only" if $ENV{'TEST_VERBOSE'};
 {
-    my $id = $agent->create_ir( {
-        Subject => "test ip",
-        Content => '192.168.20.2 192.168.20.2 192.168.20.2/32'
-    } );
-    ok($id, "created first ticket");
-
-    my $ticket = RT::Ticket->new( $RT::SystemUser );
-    $ticket->Load( $id );
-    ok( $ticket->id, 'loaded ticket' );
 
-    my $values = $ticket->CustomFieldValues('IP');
-    my %has;
-    $has{ $_->Content }++ foreach @{ $values->ItemsArrayRef };
-    is(scalar values %has, 1, "one IP were added");
-    ok(!grep( $_ != 1, values %has ), "no duplicated values");
-    ok($has{'192.168.20.2'}, "IP is there");
-}
+    my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
+    for my $valid (qw/1.0.0.0 255.255.255.255/) {
+        ok $agent->goto_create_ticket($q), "go to create ticket";
+        $agent->submit_form(
+            form_name => 'TicketCreate',
+            fields    => {
+                Subject   => 'test ip',
+                $cf_field => $valid,
+            }
+        );
 
-diag "check IPs separated by commas and semicolons" if $ENV{'TEST_VERBOSE'};
-{
-    my $id = $agent->create_ir( {
-        Subject => "test ip",
-        Content => '64.64.64.64, 32.32.32.32; 16.16.16.16.'
-    } );
-    ok($id, "created first ticket");
-
-    my $ticket = RT::Ticket->new( $RT::SystemUser );
-    $ticket->Load( $id );
-    ok( $ticket->id, 'loaded ticket' );
+        my ($id) = $agent->content =~ /Ticket (\d+) created/;
+        ok( $id, "created ticket $id" );
+        my $ticket = RT::Ticket->new($RT::SystemUser);
+        $ticket->Load($id);
+        is( $ticket->id, $id, 'loaded ticket' );
+
+        my %has = ();
+        $has{ $_->Content }++
+          foreach @{ $ticket->CustomFieldValues('IP')->ItemsArrayRef };
+        is( scalar values %has, 1, "one IP was added" );
+        ok( $has{$valid}, 'correct value' );
+    }
+
+    for my $invalid (qw{255.255.255.256 355.255.255.255 8.13.8/8.13.0/1.0}) {
+        ok $agent->goto_create_ticket($q), "go to create ticket";
+        $agent->submit_form(
+            form_name => 'TicketCreate',
+            fields    => {
+                Subject   => 'test ip',
+                $cf_field => $invalid,
+            }
+        );
+        my ($id) = $agent->content =~ /Ticket (\d+) created/;
+        ok( $id, "created ticket $id" );
+        my $ticket = RT::Ticket->new($RT::SystemUser);
+        $ticket->Load($id);
+        is( $ticket->id,                             $id, 'loaded ticket' );
+        is( $ticket->CustomFieldValues('IP')->Count, 0,   "IP wasn't added" );
+    }
 
-    my $values = $ticket->CustomFieldValues('IP');
-    my %has;
-    $has{ $_->Content }++ foreach @{ $values->ItemsArrayRef };
-    is(scalar values %has, 3, "three IPs were added");
-    ok(!grep( $_ != 1, values %has ), "no duplicated values");
-    ok($has{'64.64.64.64'}, "IP is there");
-    ok($has{'32.32.32.32'}, "IP is there");
-    ok($has{'16.16.16.16'}, "IP is there");
 }
 
 diag "search tickets by IP" if $ENV{'TEST_VERBOSE'};
 {
-    my $id = $agent->create_ir( {
-        Subject => "test ip",
-        Content => '172.16.1/31'
-    } );
-    ok($id, "created first ticket");
+    my $val = '172.16.1/31';
+    ok $agent->goto_create_ticket($q), "go to create ticket";
+    my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
+    $agent->submit_form(
+        form_name => 'TicketCreate',
+        fields    => {
+            Subject   => 'test ip',
+            $cf_field => $val,
+        }
+    );
+
+    my ($id) = $agent->content =~ /Ticket (\d+) created/;
+    ok( $id, "created ticket $id" );
+
+    my $ticket = RT::Ticket->new($RT::SystemUser);
+    $ticket->Load($id);
+    ok( $ticket->id, 'loaded ticket' );
 
-    my $tickets = RT::Tickets->new( $rtir_user );
+    my $tickets = RT::Tickets->new($RT::SystemUser);
     $tickets->FromSQL("id = $id AND CF.{IP} = '172.16.1.1'");
     ok( $tickets->Count, "found tickets" );
 
     my $flag = 1;
     while ( my $ticket = $tickets->Next ) {
-        my %has = map { $_->Content => 1 } @{ $ticket->CustomFieldValues('IP')->ItemsArrayRef };
+        my %has =
+          map { $_->Content => 1 }
+          @{ $ticket->CustomFieldValues('IP')->ItemsArrayRef };
         next if $has{'172.16.1.0-172.16.1.1'};
         $flag = 0;
-        ok(0, "ticket #". $ticket->id ." has no IP 172.16.1.1, but should")
-            or diag "but has values ". join ", ", keys %has;
+        ok( 0, "ticket #" . $ticket->id . " has no IP 172.16.1.1, but should" )
+          or diag "but has values " . join ", ", keys %has;
         last;
     }
-    ok(1, "all tickets has IP 172.16.1.1") if $flag;
+    ok( 1, "all tickets has IP 172.16.1.1" ) if $flag;
 }
 
 diag "search tickets by IP range" if $ENV{'TEST_VERBOSE'};
 {
-    my $id = $agent->create_ir( {
-        Subject => "test ip",
-        Content => '172.16.2/26'
-    } );
-    ok($id, "created first ticket");
+    my $val = '172.16.2/26';
+    ok $agent->goto_create_ticket($q), "go to create ticket";
+    my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
+    $agent->submit_form(
+        form_name => 'TicketCreate',
+        fields    => {
+            Subject   => 'test ip',
+            $cf_field => $val,
+        }
+    );
 
-    my $tickets = RT::Tickets->new( $rtir_user );
+    my ($id) = $agent->content =~ /Ticket (\d+) created/;
+    ok( $id, "created ticket $id" );
+
+    my $ticket = RT::Ticket->new($RT::SystemUser);
+    $ticket->Load($id);
+    ok( $ticket->id, 'loaded ticket' );
+
+    my $tickets = RT::Tickets->new( $RT::SystemUser );
     $tickets->FromSQL("id = $id AND CF.{IP} = '172.16.2.0-172.16.2.255'");
     ok( $tickets->Count, "found tickets" );
 
@@ -400,77 +304,97 @@ diag "search tickets by IP range" if $ENV{'TEST_VERBOSE'};
 
 diag "create two tickets with different IPs and check several searches" if $ENV{'TEST_VERBOSE'};
 {
-    my $id1 = $agent->create_ir( { Subject => "test ip" }, { IP => '192.168.21.10' } );
-    ok($id1, "created first ticket");
-    my $id2 = $agent->create_ir( { Subject => "test ip" }, { IP => '192.168.22.10' } );
-    ok($id2, "created second ticket");
+    ok $agent->goto_create_ticket($q), "go to create ticket";
+    my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
+    $agent->submit_form(
+        form_name => 'TicketCreate',
+        fields    => {
+            Subject   => 'test ip',
+            $cf_field => '192.168.21.10',
+        }
+    );
+
+    my ($id1) = $agent->content =~ /Ticket (\d+) created/;
+    ok( $id1, "created first ticket $id1" );
 
-    my $tickets = RT::Tickets->new( $rtir_user );
+    ok $agent->goto_create_ticket($q), "go to create ticket";
+    $agent->submit_form(
+        form_name => 'TicketCreate',
+        fields    => {
+            Subject   => 'test ip',
+            $cf_field => '192.168.22.10',
+        }
+    );
+
+    my ($id2) = $agent->content =~ /Ticket (\d+) created/;
+    ok( $id2, "created second ticket $id2" );
+
+    my $tickets = RT::Tickets->new( $RT::SystemUser );
     $tickets->FromSQL("id = $id1 OR id = $id2");
     is( $tickets->Count, 2, "found both tickets by 'id = x OR y'" );
 
     # IP
-    $tickets = RT::Tickets->new( $rtir_user );
+    $tickets = RT::Tickets->new( $RT::SystemUser );
     $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.10'");
     is( $tickets->Count, 1, "found one ticket" );
     is( $tickets->First->FirstCustomFieldValue('IP'), '192.168.21.10', "correct value" );
-    $tickets = RT::Tickets->new( $rtir_user );
+    $tickets = RT::Tickets->new( $RT::SystemUser );
     $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.22.10'");
     is( $tickets->Count, 1, "found one ticket" );
     is( $tickets->First->FirstCustomFieldValue('IP'), '192.168.22.10', "correct value" );
 
     # IP/32 - one address
-    $tickets = RT::Tickets->new( $rtir_user );
+    $tickets = RT::Tickets->new( $RT::SystemUser );
     $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.10/32'");
     is( $tickets->Count, 1, "found one ticket" );
     is( $tickets->First->FirstCustomFieldValue('IP'), '192.168.21.10', "correct value" );
-    $tickets = RT::Tickets->new( $rtir_user );
+    $tickets = RT::Tickets->new( $RT::SystemUser );
     $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.22.10/32'");
     is( $tickets->Count, 1, "found one ticket" );
     is( $tickets->First->FirstCustomFieldValue('IP'), '192.168.22.10', "correct value" );
 
     # IP range
-    $tickets = RT::Tickets->new( $rtir_user );
+    $tickets = RT::Tickets->new( $RT::SystemUser );
     $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.0-192.168.21.255'");
     is( $tickets->Count, 1, "found one ticket" );
     is( $tickets->First->FirstCustomFieldValue('IP'), '192.168.21.10', "correct value" );
-    $tickets = RT::Tickets->new( $rtir_user );
+    $tickets = RT::Tickets->new( $RT::SystemUser );
     $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.22.0-192.168.22.255'");
     is( $tickets->Count, 1, "found one ticket" );
     is( $tickets->First->FirstCustomFieldValue('IP'), '192.168.22.10', "correct value" );
 
     # IP range, with start IP greater than end
-    $tickets = RT::Tickets->new( $rtir_user );
+    $tickets = RT::Tickets->new( $RT::SystemUser );
     $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.255-192.168.21.0'");
     is( $tickets->Count, 1, "found one ticket" );
     is( $tickets->First->FirstCustomFieldValue('IP'), '192.168.21.10', "correct value" );
-    $tickets = RT::Tickets->new( $rtir_user );
+    $tickets = RT::Tickets->new( $RT::SystemUser );
     $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.22.255-192.168.22.0'");
     is( $tickets->Count, 1, "found one ticket" );
     is( $tickets->First->FirstCustomFieldValue('IP'), '192.168.22.10', "correct value" );
 
     # CIDR/24
-    $tickets = RT::Tickets->new( $rtir_user );
+    $tickets = RT::Tickets->new( $RT::SystemUser );
     $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.0/24'");
     is( $tickets->Count, 1, "found one ticket" );
     is( $tickets->First->FirstCustomFieldValue('IP'), '192.168.21.10', "correct value" );
-    $tickets = RT::Tickets->new( $rtir_user );
+    $tickets = RT::Tickets->new( $RT::SystemUser );
     $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.22.0/24'");
     is( $tickets->Count, 1, "found one ticket" );
     is( $tickets->First->FirstCustomFieldValue('IP'), '192.168.22.10', "correct value" );
 
     # IP is not in CIDR/24
-    $tickets = RT::Tickets->new( $rtir_user );
+    $tickets = RT::Tickets->new( $RT::SystemUser );
     $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} != '192.168.21.0/24'");
     is( $tickets->Count, 1, "found one ticket" );
     is( $tickets->First->FirstCustomFieldValue('IP'), '192.168.22.10', "correct value" );
-    $tickets = RT::Tickets->new( $rtir_user );
+    $tickets = RT::Tickets->new( $RT::SystemUser );
     $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} != '192.168.22.0/24'");
     is( $tickets->Count, 1, "found one ticket" );
     is( $tickets->First->FirstCustomFieldValue('IP'), '192.168.21.10', "correct value" );
 
     # CIDR or CIDR
-    $tickets = RT::Tickets->new( $rtir_user );
+    $tickets = RT::Tickets->new( $RT::SystemUser );
     $tickets->FromSQL("(id = $id1 OR id = $id2) AND "
         ."(CF.{IP} = '192.168.21.0/24' OR CF.{IP} = '192.168.22.0/24')");
     is( $tickets->Count, 2, "found both tickets" );
@@ -478,17 +402,37 @@ diag "create two tickets with different IPs and check several searches" if $ENV{
 
 diag "create two tickets with different IP ranges and check several searches" if $ENV{'TEST_VERBOSE'};
 {
-    my $id1 = $agent->create_ir( { Subject => "test ip" }, { IP => '192.168.21.0-192.168.21.127' } );
-    ok($id1, "created first ticket");
-    my $id2 = $agent->create_ir( { Subject => "test ip" }, { IP => '192.168.21.128-192.168.21.255' } );
-    ok($id2, "created second ticket");
+    ok $agent->goto_create_ticket($q), "go to create ticket";
+    my $cf_field = "Object-RT::Ticket--CustomField-$cf_id-Values";
+    $agent->submit_form(
+        form_name => 'TicketCreate',
+        fields    => {
+            Subject   => 'test ip',
+            $cf_field => '192.168.21.0-192.168.21.127',
+        }
+    );
 
-    my $tickets = RT::Tickets->new( $rtir_user );
+    my ($id1) = $agent->content =~ /Ticket (\d+) created/;
+    ok( $id1, "created first ticket $id1" );
+
+    ok $agent->goto_create_ticket($q), "go to create ticket";
+    $agent->submit_form(
+        form_name => 'TicketCreate',
+        fields    => {
+            Subject   => 'test ip',
+            $cf_field => '192.168.21.128-192.168.21.255',
+        }
+    );
+
+    my ($id2) = $agent->content =~ /Ticket (\d+) created/;
+    ok( $id2, "created ticket $id2" );
+
+    my $tickets = RT::Tickets->new( $RT::SystemUser );
     $tickets->FromSQL("id = $id1 OR id = $id2");
     is( $tickets->Count, 2, "found both tickets by 'id = x OR y'" );
 
     # IP
-    $tickets = RT::Tickets->new( $rtir_user );
+    $tickets = RT::Tickets->new( $RT::SystemUser );
     $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.0'");
     is( $tickets->Count, 1, "found one ticket" );
     is( $tickets->First->id, $id1, "correct value" );
@@ -509,7 +453,7 @@ diag "create two tickets with different IP ranges and check several searches" if
     is( $tickets->First->id, $id2, "correct value" );
 
     # IP/32 - one address
-    $tickets = RT::Tickets->new( $rtir_user );
+    $tickets = RT::Tickets->new( $RT::SystemUser );
     $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.21.63/32'");
     is( $tickets->Count, 1, "found one ticket" );
     is( $tickets->First->id, $id1, "correct value" );
@@ -518,7 +462,7 @@ diag "create two tickets with different IP ranges and check several searches" if
     is( $tickets->First->id, $id2, "correct value" );
 
     # IP range, lower than both
-    $tickets = RT::Tickets->new( $rtir_user );
+    $tickets = RT::Tickets->new( $RT::SystemUser );
     $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.20.0-192.168.20.255'");
     is( $tickets->Count, 0, "didn't finnd ticket" ) or diag "but found ". $tickets->First->id;
 
@@ -550,85 +494,9 @@ diag "create two tickets with different IP ranges and check several searches" if
     is( $tickets->Count, 2, "found both tickets" );
 
     # IP range, greater than both
-    $tickets = RT::Tickets->new( $rtir_user );
+    $tickets = RT::Tickets->new( $RT::SystemUser );
     $tickets->FromSQL("(id = $id1 OR id = $id2) AND CF.{IP} = '192.168.22/24'");
     is( $tickets->Count, 0, "didn't finnd ticket" ) or diag "but found ". $tickets->First->id;
 }
 
-diag "merge ticket, IPs should be merged";
-{
-    my $incident_id = $agent->create_ticket_ok(
-        'Incidents',
-        { Subject => "test" },
-    );
-    my $b1_id = $agent->create_block(
-        {
-            Subject => "test ip",
-            Incident => $incident_id,
-        },
-        { IP => '172.16.0.1' },
-    );
-    my $b2_id = $agent->create_block(
-        {
-            Subject => "test ip",
-            Incident => $incident_id,
-        },
-        { IP => '172.16.0.2' },
-    );
-
-    $agent->display_ticket( $b1_id);
-    $agent->follow_link_ok({ text => 'Merge' }, "Followed merge link");
-    $agent->form_number(3);
-    $agent->field('SelectedTicket', $b2_id);
-    $agent->submit;
-    $agent->ok_and_content_like( qr{Merge Successful}, 'Merge Successful');
-
-    my $ticket = RT::Ticket->new( $RT::SystemUser );
-    $ticket->Load( $b1_id );
-    ok $ticket->id, 'loaded ticket';
-    my $values = $ticket->CustomFieldValues('IP');
-    my %has = map { $_->Content => 1 } @{ $values->ItemsArrayRef };
-    is( scalar values %has, 2, "both IPs are there");
-    ok( $has{ '172.16.0.1' }, "has value" )
-        or diag "but has values ". join ", ", keys %has;
-    ok( $has{ '172.16.0.2' }, "has value" )
-        or diag "but has values ". join ", ", keys %has;
-}
-
-diag "merge ticket with the same IP";
-{
-    my $incident_id = $agent->create_ticket_ok(
-        'Incidents',
-        { Subject => "test" },
-    );
-    my $b1_id = $agent->create_block(
-        {
-            Subject => "test ip",
-            Incident => $incident_id,
-        },
-        { IP => '172.16.0.1' },
-    );
-    my $b2_id = $agent->create_block(
-        {
-            Subject => "test ip",
-            Incident => $incident_id,
-        },
-        { IP => '172.16.0.1' },
-    );
-
-    $agent->display_ticket( $b1_id);
-    $agent->follow_link_ok({ text => 'Merge' }, "Followed merge link");
-    $agent->form_number(3);
-    $agent->field('SelectedTicket', $b2_id);
-    $agent->submit;
-    $agent->ok_and_content_like( qr{Merge Successful}, 'Merge Successful');
-
-    my $ticket = RT::Ticket->new( $RT::SystemUser );
-    $ticket->Load( $b1_id );
-    ok $ticket->id, 'loaded ticket';
-    my $values = $ticket->CustomFieldValues('IP');
-    my @has = map $_->Content, @{ $values->ItemsArrayRef };
-    is( scalar @has, 1, "only one IP") or diag "values: @has";
-    is( $has[0], '172.16.0.1', "has value" );
-}
 

commit 7f07692971c1c95031649518f78b37ce185066b5
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Fri Sep 3 17:03:42 2010 +0800

    valid ipcfs so we can report invalidation asap

diff --git a/share/html/Elements/ValidateCustomFields b/share/html/Elements/ValidateCustomFields
index 2c655a5..f3a8290 100644
--- a/share/html/Elements/ValidateCustomFields
+++ b/share/html/Elements/ValidateCustomFields
@@ -81,7 +81,21 @@ while ( my $CF = $CustomFields->Next ) {
         grep defined, @values;
     @values = ('') unless @values;
 
-    foreach my $value( @values ) {
+    for my $value( @values ) {
+        if ( $value
+            && ( $CF->Type eq 'IPAddress' || $CF->Type eq 'IPAddressRange' ) )
+        {
+            my ( $start_ip, $end_ip ) =
+              RT::ObjectCustomFieldValue->ParseIPRange($value);
+            unless ( $start_ip && $end_ip ) {
+                my $msg =
+                  loc( "Input can not be parsed to " . loc( $CF->Type ) );
+                $m->notes( ( 'InvalidField-' . $CF->Id ) => $msg );
+                push @res, $msg;
+                $valid = 0;
+            }
+        }
+
         next if $CF->MatchPattern($value);
 
         my $msg = loc("Input must match [_1]", $CF->FriendlyPattern);

commit 7f52e20d34f2d13fac6ad34e082cc145089c43c7
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Fri Sep 3 17:04:42 2010 +0800

    ticket shouldn't be created if the ip cf is passed an invalid value

diff --git a/t/customfields/ip.t b/t/customfields/ip.t
index 73ed696..8249ef5 100644
--- a/t/customfields/ip.t
+++ b/t/customfields/ip.t
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use RT::Test tests => 139;
+use RT::Test tests => 133;
 
 my ($baseurl, $agent) =RT::Test->started_ok;
 ok( $agent->login, 'log in' );
@@ -219,12 +219,8 @@ diag "check that we parse correct IPs only" if $ENV{'TEST_VERBOSE'};
                 $cf_field => $invalid,
             }
         );
-        my ($id) = $agent->content =~ /Ticket (\d+) created/;
-        ok( $id, "created ticket $id" );
-        my $ticket = RT::Ticket->new($RT::SystemUser);
-        $ticket->Load($id);
-        is( $ticket->id,                             $id, 'loaded ticket' );
-        is( $ticket->CustomFieldValues('IP')->Count, 0,   "IP wasn't added" );
+
+        $agent->content_like( qr/can not be parsed to IPAddressRange/, 'ticket fails to create' );
     }
 
 }

commit 4c6b7bdc6889bbe16f9d00e198d53044b2fc28ea
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Fri Sep 3 17:06:44 2010 +0800

    add module deps for ip cf

diff --git a/sbin/rt-test-dependencies.in b/sbin/rt-test-dependencies.in
index a080ec8..7fb4dcb 100755
--- a/sbin/rt-test-dependencies.in
+++ b/sbin/rt-test-dependencies.in
@@ -205,6 +205,8 @@ CSS::Squish 0.06
 File::Glob
 Devel::StackTrace 1.19
 Text::Password::Pronounceable
+Net::CIDR
+Regexp::Common::net::CIDR
 .
 
 $deps{'MASON'} = [ text_to_hash( << '.') ];

-----------------------------------------------------------------------


More information about the Rt-commit mailing list