use strict;
use vars qw( @ISA $nossh_hack $conf $dir_prefix @shells $usernamemin
- $usernamemax $passwordmin
- $shellmachine $useradd $usermod $userdel
+ $usernamemax $passwordmin $username_letter $username_letterfirst
+ $shellmachine $useradd $usermod $userdel $mydomain
@saltset @pw_set);
use Carp;
use FS::Conf;
-use FS::Record qw( 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;
@ISA = qw( FS::svc_Common );
'rm -rf $old_dir'.
')';
}
+ $username_letter = $conf->exists('username-letter');
+ $username_letterfirst = $conf->exists('username-letterfirst');
+ $mydomain = $conf->config('domain');
};
@saltset = ( 'a'..'z' , 'A'..'Z' , '0'..'9' , '.' , '/' );
%hash = $record->radius;
+ %hash = $record->radius_reply;
+
+ %hash = $record->radius_check;
+
=head1 DESCRIPTION
An FS::svc_acct object represents an account. FS::svc_acct inherits from
=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
+
=back
=head1 METHODS
return $error if $error;
return "Username ". $self->username. " in use"
- if qsearchs( 'svc_acct', { 'username' => $self->username } );
+ if qsearchs( 'svc_acct', { 'username' => $self->username,
+ 'domsvc' => $self->domsvc,
+ } );
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$/
;
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';
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,
return $x unless ref($x);
my $part_svc = $x;
+ my $error = $self->ut_numbern('svcnum')
+ || $self->ut_number('domsvc')
+ ;
+ return $error if $error;
+
my $ulen = $usernamemax || $self->dbdef_table->column('username')->length;
$recref->{username} =~ /^([a-z0-9_\-\.]{$usernamemin,$ulen})$/
or return "Illegal username";
$recref->{username} = $1;
- $recref->{username} =~ /[a-z]/ or return "Illegal username";
+ if ( $username_letterfirst ) {
+ $recref->{username} =~ /^[a-z]/ or return "Illegal username";
+ } elsif ( $username_letter ) {
+ $recref->{username} =~ /[a-z]/ or return "Illegal username";
+ }
$recref->{popnum} =~ /^(\d*)$/ or return "Illegal popnum: ".$recref->{popnum};
$recref->{popnum} = $1;
! $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;
return "Only root can have uid 0"
if $recref->{uid} == 0 && $recref->{username} ne 'root';
- my($error);
- return $error if $error=$self->ut_textn('finger');
+ $error = $self->ut_textn('finger');
+ return $error if $error;
$recref->{dir} =~ /^([\/\w\-]*)$/
or return "Illegal directory";
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;
$recref->{_password} = $1.$3;
} elsif ( $recref->{_password} eq '*' ) {
$recref->{_password} = '*';
+ } elsif ( $recref->{_password} eq '!!' ) {
+ $recref->{_password} = '!!';
} else {
return "Illegal password";
}
} 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.
+
+=cut
+
+sub email {
+ my $self = shift;
+ $self->username. '@'. $self->domain;
+}
+
+=back
+
=head1 VERSION
-$Id: svc_acct.pm,v 1.15 2001-04-22 01:56:15 ivan Exp $
+$Id: svc_acct.pm,v 1.31 2001-09-06 21:20:58 ivan Exp $
=head1 BUGS