diff options
| author | Russ Allbery <rra@stanford.edu> | 2007-08-29 04:49:47 +0000 | 
|---|---|---|
| committer | Russ Allbery <rra@stanford.edu> | 2007-08-29 04:49:47 +0000 | 
| commit | ecafbc3bfd349d2a5a8e785e5c1161f428142533 (patch) | |
| tree | d40a0e11d258f18b096bae165e82396806170098 | |
| parent | 3d521b78ecb475dcc2e3ebac0abca061f350ce3b (diff) | |
Retrieve the ACL name on object creation and store it in the object as
well.  Add an accessor function for it.  Add a separate list method
that returns all the entries in an ACL, and use it in the check method.
| -rw-r--r-- | perl/Wallet/ACL.pm | 66 | 
1 files changed, 42 insertions, 24 deletions
| diff --git a/perl/Wallet/ACL.pm b/perl/Wallet/ACL.pm index 5b8dc86..bbab03d 100644 --- a/perl/Wallet/ACL.pm +++ b/perl/Wallet/ACL.pm @@ -43,23 +43,22 @@ sub new {      $dbh->{AutoCommit} = 0;      $dbh->{RaiseError} = 1;      $dbh->{PrintError} = 0; -    my ($sql, $data); +    my ($sql, $data, $name);      if ($id =~ /^\d+\z/) { -        $sql = 'select ac_id from acls where ac_id = ?'; +        $sql = 'select ac_id, ac_name from acls where ac_id = ?';      } else { -        $sql = 'select ac_id from acls where ac_name = ?'; +        $sql = 'select ac_id, ac_name from acls where ac_name = ?';      } -    eval { -        $data = $dbh->selectrow_array ($sql, undef, $id); -    }; +    ($data, $name) = eval { $dbh->selectrow_array ($sql, undef, $id) };      if ($@) {          die "cannot search for ACL $id: $@\n";      } elsif (not defined $data) {          die "ACL $id not found\n";      }      my $self = { -        dbh => $dbh, -        id  => $data, +        dbh  => $dbh, +        id   => $data, +        name => $name,      };      bless ($self, $class);      return $self; @@ -90,8 +89,9 @@ sub create {          die "cannot create ACL $name: $@\n";      }      my $self = { -        dbh => $dbh, -        id  => $id, +        dbh  => $dbh, +        id   => $id, +        name => $name,      };      bless ($self, $class);      return $self; @@ -113,6 +113,12 @@ sub id {      return $self->{id};  } +# Returns the name of the ACL. +sub name { +    my ($self)= @_; +    return $self->{name}; +} +  # Record a change to an ACL.  Takes the type of change, the scheme and  # identifier of the entry, and the trace information (user, host, and time).  # This function does not commit and does not catch exceptions.  It should @@ -234,23 +240,17 @@ sub remove {  # ACL checking  ############################################################################## -# Given a principal, check whether it should be granted access according to -# this ACL.  Returns 1 if access was granted, 0 if access was denied, and -# undef on some error.  Errors from ACL verifiers do not cause an error -# return, but are instead accumulated in the check_errors variable returned by -# the check_errors() method. -# -# This routine is currently rather inefficient when it comes to instantiating -# verifier objects.  They're created anew for each check.  Ideally, we should -# globally cache verifiers in some way. -sub check { -    my ($self, $principal) = @_; -    my (%verifier, @entries); +# List all of the entries in an ACL.  Returns an array of tuples, each of +# which contains a scheme and identifier, or an array containing undef on +# error.  Sets the internal error string on error. +sub list { +    my ($self) = @_; +    my @entries;      eval {          my $sql = 'select ae_scheme, ae_identifier from acl_entries where              ae_id = ?';          my $sth = $self->{dbh}->prepare ($sql); -        $sth->execute; +        $sth->execute ($self->{id});          my $entry;          while (defined ($entry = $sth->fetchrow_arrayref)) {              push (@entries, $entry); @@ -258,8 +258,26 @@ sub check {      };      if ($@) {          $self->{error} = "cannot retrieve ACL $self->{id}: $@"; -        return undef; +        return (undef); +    } else { +        return @entries;      } +} + +# Given a principal, check whether it should be granted access according to +# this ACL.  Returns 1 if access was granted, 0 if access was denied, and +# undef on some error.  Errors from ACL verifiers do not cause an error +# return, but are instead accumulated in the check_errors variable returned by +# the check_errors() method. +# +# This routine is currently rather inefficient when it comes to instantiating +# verifier objects.  They're created anew for each check.  Ideally, we should +# globally cache verifiers in some way. +sub check { +    my ($self, $principal) = @_; +    my @entries = $self->list; +    return undef if (@entries == 1 and not defined $entries[0]); +    my %verifier;      $self->{check_errors} = [];      for my $entry (@entries) {          my ($scheme, $identifier) = @$entry; | 
