session monitor
[freeside.git] / FS / FS / Record.pm
index 0d989e3..59472c8 100644 (file)
@@ -8,7 +8,6 @@ use Carp qw(carp cluck croak confess);
 use File::CounterFile;
 use FS::UID qw(dbh checkruid swapuid getotaker datasrc driver_name);
 use FS::dbdef;
 use File::CounterFile;
 use FS::UID qw(dbh checkruid swapuid getotaker datasrc driver_name);
 use FS::dbdef;
-use diagnostics;
 
 @ISA = qw(Exporter);
 @EXPORT_OK = qw(dbh fields hfields qsearch qsearchs dbdef);
 
 @ISA = qw(Exporter);
 @EXPORT_OK = qw(dbh fields hfields qsearch qsearchs dbdef);
@@ -168,7 +167,7 @@ sub qsearch {
   my $statement = "SELECT * FROM $table";
   if ( @fields ) {
     $statement .= " WHERE ". join(' AND ', map {
   my $statement = "SELECT * FROM $table";
   if ( @fields ) {
     $statement .= " WHERE ". join(' AND ', map {
-      if ( $record->{$_} eq '' || $record->{$_} eq undef ) {
+      if ( ! defined( $record->{$_} ) || $record->{$_} eq '' ) {
         if ( driver_name eq 'Pg' ) {
           "$_ IS NULL";
         } else {
         if ( driver_name eq 'Pg' ) {
           "$_ IS NULL";
         } else {
@@ -184,7 +183,7 @@ sub qsearch {
   my $sth = $dbh->prepare_cached($statement) or croak $dbh->errstr;
 
   $sth->execute( map $record->{$_},
   my $sth = $dbh->prepare_cached($statement) or croak $dbh->errstr;
 
   $sth->execute( map $record->{$_},
-    grep $record->{$_} ne '' && $record->{$_} ne undef, @fields
+    grep defined( $record->{$_} ) && $record->{$_} ne '', @fields
   ) or croak $dbh->errstr;
 
   if ( eval 'scalar(@FS::'. $table. '::ISA);' ) {
   ) or croak $dbh->errstr;
 
   if ( eval 'scalar(@FS::'. $table. '::ISA);' ) {
@@ -694,29 +693,84 @@ sub ut_alphan {
   '';
 }
 
   '';
 }
 
-=item ut_phonen COLUMN
+=item ut_phonen COLUMN [ COUNTRY ]
 
 Check/untaint phone numbers.  May be null.  If there is an error, returns
 the error, otherwise returns false.
 
 
 Check/untaint phone numbers.  May be null.  If there is an error, returns
 the error, otherwise returns false.
 
+Takes an optional two-letter ISO country code; without it or with unsupported
+countries, ut_phonen simply calls ut_alphan.
+
 =cut
 
 sub ut_phonen {
 =cut
 
 sub ut_phonen {
-  my($self,$field)=@_;
+  my( $self, $field, $country ) = @_;
+  return $self->ut_alphan($field) unless defined $country;
   my $phonen = $self->getfield($field);
   if ( $phonen eq '' ) {
     $self->setfield($field,'');
   my $phonen = $self->getfield($field);
   if ( $phonen eq '' ) {
     $self->setfield($field,'');
-  } else {
+  } elsif ( $country eq 'US' ) {
     $phonen =~ s/\D//g;
     $phonen =~ /^(\d{3})(\d{3})(\d{4})(\d*)$/
       or return "Illegal (phone) $field: ". $self->getfield($field);
     $phonen = "$1-$2-$3";
     $phonen .= " x$4" if $4;
     $self->setfield($field,$phonen);
     $phonen =~ s/\D//g;
     $phonen =~ /^(\d{3})(\d{3})(\d{4})(\d*)$/
       or return "Illegal (phone) $field: ". $self->getfield($field);
     $phonen = "$1-$2-$3";
     $phonen .= " x$4" if $4;
     $self->setfield($field,$phonen);
+  } else {
+    warn "don't know how to check phone numbers for country $country";
+    return $self->ut_alphan($field);
   }
   '';
 }
 
   }
   '';
 }
 
+=item ut_ip COLUMN
+
+Check/untaint ip addresses.  IPv4 only for now.
+
+=cut
+
+sub ut_ip {
+  my( $self, $field ) = @_;
+  $self->getfield($field) =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/
+    or return "Illegal (IP address) $field: ". $self->getfield($field);
+  for ( $1, $2, $3, $4 ) { return "Illegal (IP address) $field" if $_ > 255; }
+  $self->setfield($field, "$1.$2.$3.$3");
+  '';
+}
+
+=item ut_ipn COLUMN
+
+Check/untaint ip addresses.  IPv4 only for now.  May be null.
+
+=cut
+
+sub ut_ipn {
+  my( $self, $field ) = @_;
+  if ( $self->getfield($field) =~ /^()$/ ) {
+    $self->setfield($field,'');
+    '';
+  } else {
+    $self->ut_ip($field);
+  }
+}
+
+=item ut_domain COLUMN
+
+Check/untaint host and domain names.
+
+=cut
+
+sub ut_domain {
+  my( $self, $field ) = @_;
+  #$self->getfield($field) =~/^(\w+\.)*\w+$/
+  $self->getfield($field) =~/^(\w+\.)*\w+$/
+    or return "Illegal (domain) $field: ". $self->getfield($field);
+  $self->setfield($field,$1);
+  '';
+}
+
+=cut
+
 =item ut_anything COLUMN
 
 Untaints arbitrary data.  Be careful.
 =item ut_anything COLUMN
 
 Untaints arbitrary data.  Be careful.
@@ -841,7 +895,7 @@ sub hfields {
 
 =head1 VERSION
 
 
 =head1 VERSION
 
-$Id: Record.pm,v 1.4 2000-06-23 12:25:59 ivan Exp $
+$Id: Record.pm,v 1.9 2000-11-07 15:00:37 ivan Exp $
 
 =head1 BUGS
 
 
 =head1 BUGS