X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fsvc_acct.pm;h=053f1e0f41773576260fdad6ff4410e5dd632372;hp=59d1e04f9407480586dd061ef85c1fd345da936d;hb=7917cc1f73ef49554d05bc5039add533be725a3e;hpb=6bfd3e59317994ac1911988109fc6add0cf87f13 diff --git a/FS/FS/svc_acct.pm b/FS/FS/svc_acct.pm index 59d1e04f9..053f1e0f4 100644 --- a/FS/FS/svc_acct.pm +++ b/FS/FS/svc_acct.pm @@ -67,11 +67,11 @@ FS::UID->install_callback( sub { @shells = $conf->config('shells'); $usernamemin = $conf->config('usernamemin') || 2; $usernamemax = $conf->config('usernamemax'); - $passwordmin = $conf->config('passwordmin'); # || 6; - #blank->6, keep 0 + $passwordmin = $conf->config('passwordmin'); + #blank->8, keep 0 $passwordmin = ( defined($passwordmin) && $passwordmin =~ /\d+/ ) ? $passwordmin - : 6; + : 8; $passwordmax = $conf->config('passwordmax') || 12; $username_letter = $conf->exists('username-letter'); $username_letterfirst = $conf->exists('username-letterfirst'); @@ -93,12 +93,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; @@ -297,7 +296,7 @@ sub table_info { disable_inventory => 1, }, '_password' => { label => 'Password', - required => 1 + #required => 1 }, 'gid' => { label => 'GID', @@ -317,6 +316,7 @@ sub table_info { 'domsvc' => { label => 'Domain', type => 'select', + select_svc => 1, select_table => 'svc_domain', select_key => 'svcnum', select_label => 'domain', @@ -329,6 +329,15 @@ sub table_info { disable_select => 1, #UI wonky, pry works otherwise }, 'sectornum' => 'Tower sector', + 'routernum' => 'Router/block', + 'blocknum' => { + 'label' => 'Address block', + 'type' => 'select', + 'select_table' => 'addr_block', + 'select_key' => 'blocknum', + 'select_label' => 'cidr', + 'disable_inventory' => 1, + }, 'usergroup' => { label => 'RADIUS groups', type => 'select-radius_group.html', @@ -341,7 +350,7 @@ sub table_info { type => 'text', disable_inventory => 1, disable_select => 1, - disable_part_svc_column => 1, + #disable_part_svc_column => 1, }, 'upbytes' => { label => 'Upload', type => 'text', @@ -713,14 +722,21 @@ sub insert { # slight false laziness w/ edit/process/cust_main.cgi... # and also slightly arbitrary behavior. - # if the "real name" of this account matches the first + last name - # of a contact, attach the email address to that person. - my @contacts = map { $_->contact } $cust_main->cust_contact; - my $myname = $self->get('finger'); - my ($contact) = - grep { $_->get('first') . ' ' . $_->get('last') eq $myname } @contacts; - # otherwise just pick the first one - $contact ||= $contacts[0]; + # + # this will never happen but check it anyway + my ($contact) = map { $_->contact } + qsearch('contact_email', { emailaddress => $self->email }); + + if (!$contact) { + # if the "real name" of this account matches the first + last name + # of a contact, attach the email address to that person. + my @contacts = map { $_->contact } $cust_main->cust_contact; + my $myname = $self->get('finger'); + my ($contact) = + grep { $_->get('first') . ' ' . $_->get('last') eq $myname } @contacts; + # otherwise just pick the first one + $contact = $contacts[0]; + } # if there is one $contact ||= FS::contact->new({ 'custnum' => $cust_main->get('custnum'), @@ -743,18 +759,6 @@ sub insert { } } - #welcome email - my @welcome_exclude_svcparts = $conf->config('svc_acct_welcome_exclude'); - unless ( grep { $_ eq $self->svcpart } @welcome_exclude_svcparts ) { - my $error = ''; - my $msgnum = $conf->config('welcome_msgnum', $agentnum); - if ( $msgnum ) { - my $msg_template = qsearchs('msg_template', { msgnum => $msgnum }); - $error = $msg_template->send('cust_main' => $cust_main, - 'object' => $self); - #should this do something on error? - } - } } # if $cust_pkg $dbh->commit or die $dbh->errstr if $oldAutoCommit; @@ -840,7 +844,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; @@ -1316,8 +1332,7 @@ sub check { $recref->{_password} = $1; } else { return gettext('illegal_password'). " $passwordmin-$passwordmax ". - FS::Msgcat::_gettext('illegal_password_characters'). - ": ". $recref->{_password}; + FS::Msgcat::_gettext('illegal_password_characters'); } if ( $password_noampersand ) { @@ -1965,6 +1980,9 @@ sub _op_usage { return '' unless $amount; + return '' + if $self->cust_svc->part_svc->part_svc_column($column)->columnflag eq 'F'; + local $SIG{HUP} = 'IGNORE'; local $SIG{INT} = 'IGNORE'; local $SIG{QUIT} = 'IGNORE'; @@ -1990,14 +2008,16 @@ sub _op_usage { die "Can't update $column for svcnum". $self->svcnum if $rv == 0; - #$self->snapshot; #not necessary, we retain the old values - #create an object with the updated usage values - my $new = qsearchs('svc_acct', { 'svcnum' => $self->svcnum }); - #call exports - my $error = $new->replace($self); - if ( $error ) { - $dbh->rollback if $oldAutoCommit; - return "Error replacing: $error"; + if ( $conf->exists('radius-chillispot-max') ) { + #$self->snapshot; #not necessary, we retain the old values + #create an object with the updated usage values + my $new = qsearchs('svc_acct', { 'svcnum' => $self->svcnum }); + #call exports + my $error = $new->replace($self); + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return "Error replacing: $error"; + } } #overlimit_action eq 'cancel' handling @@ -2187,15 +2207,17 @@ sub set_usage { die "Can't update usage for svcnum ". $self->svcnum if $rv == 0; } - - #$self->snapshot; #not necessary, we retain the old values - #create an object with the updated usage values - my $new = qsearchs('svc_acct', { 'svcnum' => $self->svcnum }); - local($FS::Record::nowarn_identical) = 1; - my $error = $new->replace($self); #call exports - if ( $error ) { - $dbh->rollback if $oldAutoCommit; - return "Error replacing: $error"; + + if ( $conf->exists('radius-chillispot-max') ) { + #$self->snapshot; #not necessary, we retain the old values + #create an object with the updated usage values + my $new = qsearchs('svc_acct', { 'svcnum' => $self->svcnum }); + local($FS::Record::nowarn_identical) = 1; + my $error = $new->replace($self); #call exports + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return "Error replacing: $error"; + } } if ( $reset ) { @@ -2272,7 +2294,7 @@ sub is_rechargable { =item seconds_since TIMESTAMP Returns the number of seconds this account has been online since TIMESTAMP, -according to the session monitor (see L). +according to the session monitor (see L). TIMESTAMP is specified as a UNIX timestamp; see L. Also see L and L for conversion functions. @@ -2300,8 +2322,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 @@ -2312,6 +2334,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); @@ -2327,12 +2350,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) . ')'; @@ -2531,6 +2558,11 @@ sub crypt_password { ); } elsif ( $encryption eq 'md5' ) { return unix_md5_crypt( $self->_password ); + } elsif ( $encryption eq 'sha512' ) { + return crypt( + $self->_password, + '$6$rounds=15420$'. join('', map $saltset[int(rand(64))], (1..16) ) + ); } elsif ( $encryption eq 'sha1_base64' ) { #for acct_sql my $pass = sha1_base64( $self->_password ); $pass .= '=' x (4 - length($pass) % 4); #properly padded base64