X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fsvc_acct.pm;h=74ddcd5c7422c1cb3f4adda8cfa042eea4cc428b;hb=ea4e037e3b3250815344e27e777d975f90a2f462;hp=40f65d6b47e3f92f6c3c8cdbf586ed4d7b1ad8e2;hpb=fe30e0938366ea9524ccbdffbfb63b0950233880;p=freeside.git diff --git a/FS/FS/svc_acct.pm b/FS/FS/svc_acct.pm index 40f65d6b4..74ddcd5c7 100644 --- a/FS/FS/svc_acct.pm +++ b/FS/FS/svc_acct.pm @@ -7,7 +7,11 @@ use base qw( FS::svc_Domain_Mixin FS::svc_Radius_Mixin FS::svc_Tower_Mixin FS::svc_IP_Mixin - FS::svc_Common ); + FS::Password_Mixin + FS::svc_Common + ); + +use strict; use vars qw( $DEBUG $me $conf $skip_fuzzyfiles $dir_prefix @shells $usernamemin $usernamemax $passwordmin $passwordmax @@ -58,7 +62,6 @@ use FS::svc_www; use FS::cdr; use FS::acct_snarf; use FS::tower_sector; -use FS::Misc; $DEBUG = 0; $me = '[FS::svc_acct]'; @@ -111,12 +114,11 @@ FS::UID->install_callback( sub { $smtpmachine = $conf->config('smtpmachine'); $radius_password = $conf->config('radius-password') || 'Password'; $radius_ip = $conf->config('radius-ip') || 'Framed-IP-Address'; - @pw_set = ( 'A'..'Z' ) if $conf->exists('password-generated-allcaps'); + @pw_set = FS::svc_acct->pw_set; } ); @saltset = ( 'a'..'z' , 'A'..'Z' , '0'..'9' , '.' , '/' ); -@pw_set = ( 'a'..'z', 'A'..'Z', '0'..'9', '(', ')', '#', '.', ',' ); sub _cache { my $self = shift; @@ -315,7 +317,7 @@ sub table_info { disable_inventory => 1, }, '_password' => { label => 'Password', - required => 1 + #required => 1 }, 'gid' => { label => 'GID', @@ -335,6 +337,7 @@ sub table_info { 'domsvc' => { label => 'Domain', type => 'select', + select_svc => 1, select_table => 'svc_domain', select_key => 'svcnum', select_label => 'domain', @@ -702,6 +705,9 @@ sub insert { 'child_objects' => $self->child_objects, %options, ); + + $error ||= $self->insert_password_history; + if ( $error ) { $dbh->rollback if $oldAutoCommit; return $error; @@ -730,11 +736,9 @@ sub insert { $cust_main->invoicing_list(\@invoicing_list); } - #welcome email/letter + #welcome email my @welcome_exclude_svcparts = $conf->config('svc_acct_welcome_exclude'); unless ( grep { $_ eq $self->svcpart } @welcome_exclude_svcparts ) { - #indent skips a level for some reason - #welcome email my $error = ''; my $msgnum = $conf->config('welcome_msgnum', $agentnum); if ( $msgnum ) { @@ -818,21 +822,7 @@ sub insert { } # if $welcome_template } # if !$msgnum - # print welcome letter - if ($conf->exists('svc_acct_welcome_letter')) { - my $queue = new FS::queue { - 'job' => 'FS::svc_acct::process_print_welcome_letter', - }; - $error = $queue->insert( - 'svcnum' => $self->svcnum, - 'template' => 'svc_acct_welcome_letter', - ); - if ($error) { - warn "can't send welcome letter: $error"; - } - } - #indent skipped a level for some reason - } # unless in @welcome_exclude_svcparts + } } # if $cust_pkg $dbh->commit or die $dbh->errstr if $oldAutoCommit; @@ -935,7 +925,19 @@ sub delete { } } - my $error = $self->SUPER::delete; # usergroup here + foreach my $svc_phone ( + qsearch( 'svc_phone', { 'forward_svcnum' => $self->svcnum }) + ) { + $svc_phone->set('forward_svcnum', ''); + my $error = $svc_phone->replace; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + } + + my $error = $self->delete_password_history + || $self->SUPER::delete; # usergroup here if ( $error ) { $dbh->rollback if $oldAutoCommit; return $error; @@ -1002,6 +1004,12 @@ sub replace { my $dbh = dbh; $error = $new->SUPER::replace($old, @_); # usergroup here + + # don't need to record this unless the password was changed + if ( $old->_password ne $new->_password ) { + $error ||= $new->insert_password_history; + } + if ( $error ) { $dbh->rollback if $oldAutoCommit; return $error if $error; @@ -2403,8 +2411,8 @@ sub last_login_text { Returns a paged search (L) for Call Detail Records associated with this service. For svc_acct, "associated with" means that -either the "src" or the "charged_party" field of the CDR matches the -"username" field of the service. +either the "src" or the "charged_party" field of the CDR matches either +the "username" field of the service or the username@domain label. =cut @@ -2415,6 +2423,7 @@ sub psearch_cdrs { my @where; my $did = dbh->quote($self->username); + my $diddomain = dbh->quote($self->label); my $prefix = $options{'default_prefix'} || ''; #convergent.au '+61' my $prefixdid = dbh->quote($prefix . $self->username); @@ -2430,12 +2439,16 @@ sub psearch_cdrs { if (!$options{'disable_charged_party'}) { push @orwhere, "charged_party = $did", - "charged_party = $prefixdid"; + "charged_party = $prefixdid", + "charged_party = $diddomain" + ; } if (!$options{'disable_src'}) { push @orwhere, "src = $did AND charged_party IS NULL", - "src = $prefixdid AND charged_party IS NULL"; + "src = $prefixdid AND charged_party IS NULL", + "src = $diddomain AND charged_party IS NULL" + ; } push @where, '(' . join(' OR ', @orwhere) . ')'; @@ -2779,6 +2792,25 @@ sub virtual_maildir { $self->domain. '/maildirs/'. $self->username. '/'; } +=item password_svc_check + +Override, for L. Not really intended for other use. + +=cut + +sub password_svc_check { + my ($self, $password) = @_; + foreach my $field ( qw(username finger) ) { + foreach my $word (split(/\W+/,$self->get($field))) { + next unless length($word) > 2; + if ($password =~ /$word/i) { + return qq(Password contains account information '$word'); + } + } + } + return ''; +} + =back =head1 CLASS METHODS @@ -3045,26 +3077,6 @@ sub reached_threshold { } } -sub process_print_welcome_letter { - my %opt = @_; - - my $self = qsearchs('svc_acct', { 'svcnum' => $opt{'svcnum'} } ) - or die "invalid svc_acct: " . $opt{'svcnum'}; - my $cust_main = $self->cust_svc->cust_pkg->cust_main; - - my $ps = $cust_main->print_ps('svc_acct_welcome_letter', - 'extra_fields' => { - map { $_ => $self->$_ } $self->fields, # or maybe just username & password? - }, - ); - my $error = FS::Misc::do_print( - [ $ps ], - 'agentnum' => $cust_main->agentnum, - ); - die $error if $error; - -} - =back =head1 BUGS