X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Faccess_user.pm;h=70cef4a6a7ea27e7f6cfc8771a67dd89a75de4ae;hb=782c9989fba6332e28f25187da8d623bddaab466;hp=ffbe7ac751be4e8f6987a4404b47066871c54e73;hpb=f3738a9fcd588d32eea9b0af6a3e884293c0c6e5;p=freeside.git diff --git a/FS/FS/access_user.pm b/FS/FS/access_user.pm index ffbe7ac75..70cef4a6a 100644 --- a/FS/FS/access_user.pm +++ b/FS/FS/access_user.pm @@ -12,6 +12,7 @@ use FS::agent; use FS::cust_main; use FS::sales; use FS::sched_item; +use Carp qw( croak ); $DEBUG = 0; $me = '[FS::access_user]'; @@ -148,7 +149,16 @@ sub htpasswd_kludge { { return ''; } else { - return 'htpasswd exited unsucessfully'; + + if ($? == -1) { + return "htpasswd failed to execute: $!"; + } elsif ($? & 127) { + return sprintf("htpasswd died with signal %d, %s coredump", + ($? & 127), ($? & 128) ? 'with' : 'without' ); + } else { + return sprintf("htpasswd exited with value %d", $? >> 8 ); + } + } } @@ -173,7 +183,8 @@ sub delete { my $dbh = dbh; my $error = - $self->SUPER::delete(@_) + $self->delete_password_history + || $self->SUPER::delete(@_) || $self->htpasswd_kludge('-D') ; @@ -395,6 +406,12 @@ user has the provided access right Optional table name in which agentnum is being checked. Sometimes required to resolve 'column reference "agentnum" is ambiguous' errors. +=item column + +Optional column name in which agentnum is being checked. + +e.g: column => 'COALESCE ( cust_main.agentnum, prospect_main.agentnum )' + =item viewall_right All agents will be viewable if the current user has the provided access right. @@ -408,7 +425,14 @@ sub agentnums_sql { my( $self ) = shift; my %opt = ref($_[0]) ? %{$_[0]} : @_; - my $agentnum = $opt{'table'} ? $opt{'table'}.'.agentnum' : 'agentnum'; + my $agentnum; + if ( $opt{column} ) { + $agentnum = $opt{column}; + } elsif ( $opt{table} ) { + $agentnum = "$opt{table}.agentnum" + } else { + $agentnum = 'agentnum'; + } my @or = (); @@ -748,6 +772,192 @@ sub sched_item { qsearch( 'sched_item', { 'usernum' => $self->usernum } ); } +=item locale + +=cut + +sub locale { + my $self = shift; + return $self->{_locale} if exists($self->{_locale}); + $self->{_locale} = $self->option('locale'); +} + +=item get_page_pref PATH, NAME, TABLENUM + +Returns the user's page preference named NAME for the page at PATH. If the +page is a view or edit page or otherwise shows a single record at a time, +it should use TABLENUM to tell which record the preference is for. + +=cut + +sub get_page_pref { + my $self = shift; + my ($path, $prefname, $tablenum) = @_; + $tablenum ||= ''; + + my $access_user_page_pref = qsearchs('access_user_page_pref', { + path => $path, + usernum => $self->usernum, + tablenum => $tablenum, + prefname => $prefname, + }); + $access_user_page_pref ? $access_user_page_pref->prefvalue : ''; +} + +=item set_page_pref PATH, NAME, TABLENUM, VALUE + +Sets the user's page preference named NAME for the page at PATH. Use TABLENUM +as for get_page_pref. + +=cut + +sub set_page_pref { + my $self = shift; + my ($path, $prefname, $tablenum, $prefvalue) = @_; + $tablenum ||= ''; + + my $error; + my $access_user_page_pref = qsearchs('access_user_page_pref', { + path => $path, + usernum => $self->usernum, + tablenum => $tablenum, + prefname => $prefname, + }); + if ( $access_user_page_pref ) { + if ( $prefvalue eq $access_user_page_pref->get('prefvalue') ) { + return ''; + } + if ( length($prefvalue) > 0 ) { + $access_user_page_pref->set('prefvalue', $prefvalue); + $error = $access_user_page_pref->replace; + $error .= " (updating $prefname)" if $error; + } else { + $error = $access_user_page_pref->delete; + $error .= " (removing $prefname)" if $error; + } + } else { + if ( length($prefvalue) > 0 ) { + $access_user_page_pref = FS::access_user_page_pref->new({ + path => $path, + usernum => $self->usernum, + tablenum => $tablenum, + prefname => $prefname, + prefvalue => $prefvalue, + }); + $error = $access_user_page_pref->insert; + $error .= " (creating $prefname)" if $error; + } else { + return ''; + } + } + + return $error; +} + +#3.x + +sub saved_search { + my $self = shift; + qsearch('saved_search', { 'usernum' => $self->usernum }); +} + +=item get_pref NAME + +Fetch the prefvalue column from L for prefname NAME + +Returns undef when no value has been saved, or when record has expired + +=cut + +sub get_pref { + my ( $self, $prefname ) = @_; + croak 'prefname parameter requrired' unless $prefname; + + my $pref_row = $self->get_pref_row( $prefname ) + or return undef; + + return undef + if $pref_row->expiration + && $pref_row->expiration < time(); + + $pref_row->prefvalue; +} + +=item get_pref_row NAME + +Fetch the row object from L for prefname NAME + +returns undef when no row has been created + +=cut + +sub get_pref_row { + my ( $self, $prefname ) = @_; + croak 'prefname parameter required' unless $prefname; + + qsearchs( + access_user_pref => { + usernum => $self->usernum, + prefname => $prefname, + } + ); +} + +=item set_pref NAME, VALUE, [EXPIRATION_EPOCH] + +Add or update user preference in L table + +Passing an undefined VALUE will delete the user preference + +Returns VALUE + +=cut + +sub set_pref { + my $self = shift; + my ( $prefname, $prefvalue, $expiration ) = @_; + + return $self->delete_pref( $prefname ) + unless defined $prefvalue; + + if ( my $pref_row = $self->get_pref_row( $prefname )) { + return $prefvalue + if $pref_row->prefvalue eq $prefvalue; + + $pref_row->prefvalue( $prefvalue ); + $pref_row->expiration( $expiration || ''); + + if ( my $error = $pref_row->replace ) { croak $error } + + return $prefvalue; + } + + my $pref_row = FS::access_user_pref->new({ + usernum => $self->usernum, + prefname => $prefname, + prefvalue => $prefvalue, + expiration => $expiration, + }); + if ( my $error = $pref_row->insert ) { croak $error } + + $prefvalue; +} + +=item delete_pref NAME + +Delete user preference from L table + +=cut + +sub delete_pref { + my ( $self, $prefname ) = @_; + + my $pref_row = $self->get_pref_row( $prefname ) + or return; + + if ( my $error = $pref_row->delete ) { croak $error } +} + =back =head1 BUGS