X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Faccess_user.pm;h=ca0bcd657917f132886deb2b42e5610d297ca682;hb=fc3483c8679daf2e00467db05342e9fcd314d541;hp=5d1e183e7d8f288c3f1bf6ceedd5646a1b11a071;hpb=7aae40398f1c8ed42424f1694640c9796a580d22;p=freeside.git diff --git a/FS/FS/access_user.pm b/FS/FS/access_user.pm index 5d1e183e7..ca0bcd657 100644 --- a/FS/FS/access_user.pm +++ b/FS/FS/access_user.pm @@ -5,6 +5,7 @@ use vars qw( @ISA $htpasswd_file ); use FS::Record qw( qsearch qsearchs dbh ); use FS::m2m_Common; use FS::access_usergroup; +use FS::agent; @ISA = qw( FS::m2m_Common FS::Record ); @@ -106,6 +107,10 @@ sub insert { sub htpasswd_kludge { my $self = shift; + + #awful kludge to skip setting htpasswd for fs_* users + return '' if $self->username =~ /^fs_/; + unshift @_, '-c' unless -e $htpasswd_file; if ( system('htpasswd', '-b', @_, @@ -292,9 +297,47 @@ Returns an sql fragement to select only agentnums this user can view. sub agentnums_sql { my $self = shift; - '( '. - join( ' OR ', map "agentnum = $_", $self->agentnums ). - ' )'; + + my @agentnums = map { "agentnum = $_" } $self->agentnums; + + push @agentnums, 'agentnum IS NULL' + if $self->access_right('View/link unlinked services'); + + return ' 1 = 0 ' unless scalar(@agentnums); + '( '. join( ' OR ', @agentnums ). ' )'; +} + +=item agentnum + +Returns true if the user can view the specified agent. + +=cut + +sub agentnum { + my( $self, $agentnum ) = @_; + my $sth = dbh->prepare( + "SELECT COUNT(*) FROM access_usergroup + JOIN access_groupagent USING ( groupnum ) + WHERE usernum = ? AND agentnum = ?" + ) or die dbh->errstr; + $sth->execute($self->usernum, $agentnum) or die $sth->errstr; + $sth->fetchrow_arrayref->[0]; +} + +=item agents + +Returns the list of agents this user can view (via group membership), as +FS::agent objects. + +=cut + +sub agents { + my $self = shift; + qsearch({ + 'table' => 'agent', + 'hashref' => { disabled=>'' }, + 'extra_sql' => ' AND '. $self->agentnums_sql, + }); } =item access_right