Checkpoint before final conversion.

Added getIpUsers method to Group.pm
Group->getUsers and User->isInGroup both use getIpUsers
Tests added to Group.t to verify that getIpUsers works.
This commit is contained in:
Colin Kuskie 2006-04-11 21:17:30 +00:00
parent 29b317bec3
commit 8b8b4af41b
3 changed files with 118 additions and 14 deletions

View file

@ -487,7 +487,6 @@ sub getScratchUsers {
my $scratchFilter;
return [] unless $scratchFilter = $self->scratchFilter();
my $sessionId = $self->session->db->quote($self->session->getId());
my $time = $self->session->datetime->time();
$scratchFilter =~ s/\s//g;
@ -511,6 +510,42 @@ EOQ
return $self->session->db->buildArrayRef($query, [ @scratchPlaceholders ]);
}
#-------------------------------------------------------------------
=head2 getIpUsers ( )
Get the set of users allowed to be in this group via the lastIP recorded in
the user's session and this group's IpFilter. The set is returned as an array ref.
If no IpFilter has been set for this group, returns an empty array ref.
=cut
sub getIpUsers {
my $self = shift;
my $IpFilter;
return [] unless $IpFilter = $self->ipFilter();
my $time = $self->session->datetime->time();
$IpFilter =~ s/\s//g;
my @filters = split /;/, $IpFilter;
my $query = "select userId,lastIP from userSession where expires > ?";
my $sth = $self->session->db->read($query, [ $self->session->datetime->time() ]);
my %localCache = ();
my @ipUsers = ();
while (my ($userId, $lastIP) = $sth->array() ) {
if (!exists $localCache{$lastIP}) {
$localCache{$lastIP} = isInSubnet($lastIP, \@filters);
}
push @ipUsers, $userId if $localCache{$lastIP};
}
return \@ipUsers;
}
#-------------------------------------------------------------------
=head2 find ( session, name )
@ -672,6 +707,7 @@ sub getUsers {
@{ $extGroup->getDatabaseUsers() },
@{ $extGroup->getKarmaUsers() },
@{ $extGroup->getScratchUsers() },
@{ $extGroup->getIpUsers() },
;
}
}
@ -681,6 +717,7 @@ sub getUsers {
@{ $self->getDatabaseUsers() },
@{ $self->getKarmaUsers() },
@{ $self->getScratchUsers() },
@{ $self->getIpUsers() },
;
my @users = ( @localUsers, @externalUsers );
return \@users;

View file

@ -255,20 +255,11 @@ sub isInGroup {
### The following several checks are to increase performance. If this section were removed, everything would continue to work as normal.
return 1 if ($gid eq '7'); # everyone is in the everyone group
return 1 if ($gid eq '1' && $uid eq '1'); # visitors are in the visitors group
return 1 if ($gid eq '2' && $uid ne '1'); # if you're not a visitor, then you're a registered user
return 1 if ($uid eq '3'); #Admin is in every group
### Get data for auxillary checks.
my $group = WebGUI::Group->new($self->session,$gid);
my $isInGroup = $self->session->stow->get("isInGroup");
### Check IP Address
if ($group->get("ipFilter")) {
my $ipFilter = $group->get("ipFilter");
$ipFilter =~ s/\s+//g;
my @ips = split(",",$ipFilter);
my $ipMatch = WebGUI::Utility::isInSubnet($self->session->env->get("REMOTE_ADDR"), [ @ips ]);
return 1 if $ipMatch;
}
return 0 if ($uid eq '1'); #Visitor is in no other groups
return 1 if ($uid eq '3'); #Admin is in every group
return 1 if ($gid eq '2' && $uid ne '1'); # if you're not a visitor, then you're a registered user
### Look to see if we've already looked up this group.
if ($isInGroup->{$uid}{$gid} eq '1') {
return 1;
@ -348,6 +339,13 @@ sub isInGroup {
$self->session->stow->set("isInGroup",$isInGroup);
return 1 if ($isInGroup->{$uid}{$gid});
}
if (my @ipUsers = @{ $group->getIpUsers() }) {
foreach my $extUserId ( @ipUsers ) {
$isInGroup->{$extUserId}{$gid} = 1;
}
$self->session->stow->set("isInGroup",$isInGroup);
return 1 if ($isInGroup->{$uid}{$gid});
}
### Check for groups of groups.
my $groups = $group->getGroupsIn(1);
foreach (@{$groups}) {