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
use FS::cdr;
use FS::acct_snarf;
use FS::tower_sector;
-use FS::Misc;
$DEBUG = 0;
$me = '[FS::svc_acct]';
$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;
disable_inventory => 1,
},
'_password' => { label => 'Password',
- required => 1
+ #required => 1
},
'gid' => {
label => 'GID',
'domsvc' => {
label => 'Domain',
type => 'select',
+ select_svc => 1,
select_table => 'svc_domain',
select_key => 'svcnum',
select_label => 'domain',
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',
'child_objects' => $self->child_objects,
%options,
);
+
+ $error ||= $self->insert_password_history;
+
if ( $error ) {
$dbh->rollback if $oldAutoCommit;
return $error;
$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
+ unless ($FS::svc_Common::noexport_hack or ( grep { $_ eq $self->svcpart } @welcome_exclude_svcparts )) {
my $error = '';
my $msgnum = $conf->config('welcome_msgnum', $agentnum);
if ( $msgnum ) {
} # 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;
}
}
- 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;
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;
$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 ) {
Returns a paged search (L<FS::PagedSearch>) 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
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);
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) . ')';
$self->domain. '/maildirs/'. $self->username. '/';
}
+=item password_svc_check
+
+Override, for L<FS::Password_Mixin>. 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
}
}
-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