fix RADIUS attribute capitalization
[freeside.git] / FS / FS / svc_acct.pm
index 42eb7d9..11e5a3c 100644 (file)
@@ -3,16 +3,19 @@ package FS::svc_acct;
 use strict;
 use vars qw( @ISA $nossh_hack $conf $dir_prefix @shells $usernamemin
              $usernamemax $passwordmin $username_letter $username_letterfirst
-             $shellmachine $useradd $usermod $userdel 
+             $shellmachine $useradd $usermod $userdel $mydomain
              @saltset @pw_set);
 use Carp;
 use FS::Conf;
-use FS::Record qw( qsearch qsearchs fields );
+use FS::Record qw( qsearch qsearchs fields dbh );
 use FS::svc_Common;
 use Net::SSH qw(ssh);
 use FS::part_svc;
 use FS::svc_acct_pop;
 use FS::svc_acct_sm;
+use FS::cust_main_invoice;
+use FS::svc_domain;
+use FS::raddb;
 
 @ISA = qw( FS::svc_Common );
 
@@ -48,6 +51,7 @@ $FS::UID::callback{'FS::svc_acct'} = sub {
   }
   $username_letter = $conf->exists('username-letter');
   $username_letterfirst = $conf->exists('username-letterfirst');
+  $mydomain = $conf->config('domain');
 };
 
 @saltset = ( 'a'..'z' , 'A'..'Z' , '0'..'9' , '.' , '/' );
@@ -115,6 +119,10 @@ FS::svc_Common.  The following fields are currently supported:
 
 =item slipip - IP address
 
+=item seconds - 
+
+=item domsvc - svcnum from svc_domain
+
 =item radius_I<Radius_Attribute> - I<Radius-Attribute>
 
 =item domsvc - service number of svc_domain with which to associate
@@ -182,7 +190,7 @@ sub insert {
   my $part_svc = qsearchs( 'part_svc', { 'svcpart' => $self->svcpart } );
   return "Unknown svcpart" unless $part_svc;
   return "uid in use"
-    if $part_svc->svc_acct__uid_flag ne 'F'
+    if $part_svc->part_svc_column('uid')->columnflag ne 'F'
       && qsearchs( 'svc_acct', { 'uid' => $self->uid } )
       && $self->username !~ /^(hyla)?fax$/
     ;
@@ -232,11 +240,21 @@ $username and $dir.
 
 sub delete {
   my $self = shift;
-  my $error;
 
-  return "Can't delete an account which has mail aliases pointed to it!"
+  return "Can't delete an account which has (svc_acct_sm) mail aliases!"
     if $self->uid && qsearch( 'svc_acct_sm', { 'domuid' => $self->uid } );
 
+  return "Can't delete an account which is a (svc_forward) source!"
+    if qsearch( 'svc_forward', { 'srcsvc' => $self->svcnum } );
+
+  return "Can't delete an account which is a (svc_forward) destination!"
+    if qsearch( 'svc_forward', { 'dstsvc' => $self->svcnum } );
+
+  return "Can't delete an account with (svc_www) web service!"
+    if qsearch( 'svc_www', { 'usersvc' => $self->usersvc } );
+
+  # what about records in session ?
+
   local $SIG{HUP} = 'IGNORE';
   local $SIG{INT} = 'IGNORE';
   local $SIG{QUIT} = 'IGNORE';
@@ -244,8 +262,43 @@ sub delete {
   local $SIG{TSTP} = 'IGNORE';
   local $SIG{PIPE} = 'IGNORE';
 
-  $error = $self->SUPER::delete;
-  return $error if $error;
+  my $oldAutoCommit = $FS::UID::AutoCommit;
+  local $FS::UID::AutoCommit = 0;
+  my $dbh = dbh;
+
+  foreach my $cust_main_invoice (
+    qsearch( 'cust_main_invoice', { 'dest' => $self->svcnum } )
+  ) {
+    my %hash = $cust_main_invoice->hash;
+    $hash{'dest'} = $self->email;
+    my $new = new FS::cust_main_invoice \%hash;
+    my $error = $new->replace($cust_main_invoice);
+    if ( $error ) {
+      $dbh->rollback if $oldAutoCommit;
+      return $error;
+    }
+  }
+
+  foreach my $svc_domain (
+    qsearch( 'svc_domain', { 'catchall' => $self->svcnum } )
+  ) {
+    my %hash = new FS::svc_domain->hash;
+    $hash{'catchall'} = '';
+    my $new = new FS::svc_domain \%hash;
+    my $error = $new->replace($svc_domain);
+    if ( $error ) {
+      $dbh->rollback if $oldAutoCommit;
+      return $error;
+    }
+  }
+
+  my $error = $self->SUPER::delete;
+  if ( $error ) {
+    $dbh->rollback if $oldAutoCommit;
+    return $error;
+  }
+
+  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
 
   my( $username, $dir ) = (
     $self->username,
@@ -387,7 +440,9 @@ sub check {
   return $x unless ref($x);
   my $part_svc = $x;
 
-  my $error = $self->ut_number('domsvc');
+  my $error = $self->ut_numbern('svcnum')
+              || $self->ut_number('domsvc')
+  ;
   return $error if $error;
 
   my $ulen = $usernamemax || $self->dbdef_table->column('username')->length;
@@ -406,7 +461,7 @@ sub check {
     ! $recref->{popnum} ||
     qsearchs('svc_acct_pop',{'popnum'=> $recref->{popnum} } );
 
-  unless ( $part_svc->getfield('svc_acct__uid_flag') eq 'F' ) {
+  unless ( $part_svc->part_svc_column('uid')->columnflag eq 'F' ) {
 
     $recref->{uid} =~ /^(\d*)$/ or return "Illegal uid";
     $recref->{uid} = $1 eq '' ? $self->unique('uid') : $1;
@@ -456,7 +511,7 @@ sub check {
       return "Can't have quota without uid" : ( $recref->{quota}='' );
   }
 
-  unless ( $part_svc->getfield('svc_acct__slipip_flag') eq 'F' ) {
+  unless ( $part_svc->part_svc_column('slipip')->columnflag eq 'F' ) {
     unless ( $recref->{slipip} eq '0e0' ) {
       $recref->{slipip} =~ /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/
         or return "Illegal slipip". $self->slipip;
@@ -526,8 +581,8 @@ sub radius_reply {
   map {
     /^(radius_(.*))$/;
     my($column, $attrib) = ($1, $2);
-    $attrib =~ s/_/\-/g;
-    ( $attrib, $self->getfield($column) );
+    #$attrib =~ s/_/\-/g;
+    ( $FS::raddb::attrib{lc($attrib)}, $self->getfield($column) );
   } grep { /^radius_/ && $self->getfield($_) } fields( $self->table );
 }
 
@@ -546,11 +601,28 @@ sub radius_check {
   map {
     /^(rc_(.*))$/;
     my($column, $attrib) = ($1, $2);
-    $attrib =~ s/_/\-/g;
-    ( $attrib, $self->getfield($column) );
+    #$attrib =~ s/_/\-/g;
+    ( $FS::raddb:attrib{lc($attrib)}, $self->getfield($column) );
   } grep { /^rc_/ && $self->getfield($_) } fields( $self->table );
 }
 
+=item domain
+
+Returns the domain associated with this account.
+
+=cut
+
+sub domain {
+  my $self = shift;
+  if ( $self->domsvc ) {
+    my $svc_domain = qsearchs( 'svc_domain', { 'svcnum' => $self->domsvc } )
+      or die "no svc_domain.svcnum for svc_acct.domsvc ". $self->domsvc;
+    $svc_domain->domain;
+  } else {
+    $mydomain or die "svc_acct.domsvc is null and no legacy domain config file";
+  }
+}
+
 =item email
 
 Returns an email address associated with the account.
@@ -559,22 +631,14 @@ Returns an email address associated with the account.
 
 sub email {
   my $self = shift;
-  my $domain;
-  my $svc_domain = qsearchs( 'svc_domain', { 'svcnum' => $self->domsvc } );
-  if ($svc_domain) {
-    $domain=$svc_domain->domain;
-  }else{
-    warn "couldn't find svc_acct.domsvc " . $self->domsvc . "!";
-    $domain="unknown";
-  }
-  return $self->username . "@" . $domain;
+  $self->username. '@'. $self->domain;
 }
 
 =back
 
 =head1 VERSION
 
-$Id: svc_acct.pm,v 1.24 2001-08-19 15:53:34 jeff Exp $
+$Id: svc_acct.pm,v 1.32 2001-09-07 20:17:49 ivan Exp $
 
 =head1 BUGS