summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--perl/Wallet/Object.pm197
1 files changed, 196 insertions, 1 deletions
diff --git a/perl/Wallet/Object.pm b/perl/Wallet/Object.pm
index 0cc7d69..602b426 100644
--- a/perl/Wallet/Object.pm
+++ b/perl/Wallet/Object.pm
@@ -79,9 +79,15 @@ sub create {
}
##############################################################################
-# History functions
+# Utility functions
##############################################################################
+# Returns the current error message of the object, if any.
+sub error {
+ my ($self) = @_;
+ return $self->{error};
+}
+
# Record a global object action for this object. Takes the action (which must
# be one of get or store), and the trace information: user, host, and time.
# Returns true on success and false on failure, setting error appropriately.
@@ -161,6 +167,7 @@ sub log_set {
# Returns undef on failure and the new value on success.
sub _set_internal {
my ($self, $attr, $value, $user, $host, $time) = @_;
+ $time ||= time;
my $name = $self->{name};
my $type = $self->{type};
eval {
@@ -307,6 +314,7 @@ sub show {
# is stored about this object.
sub destroy {
my ($self, $user, $host, $time) = @_;
+ $time ||= time;
my $name = $self->{name};
my $type = $self->{type};
eval {
@@ -327,3 +335,190 @@ sub destroy {
}
return 1;
}
+
+##############################################################################
+# Documentation
+##############################################################################
+
+=head1 NAME
+
+Wallet::Object - Generic parent class for wallet objects
+
+=head1 SYNOPSIS
+
+ package Wallet::Object::Simple;
+ @ISA = qw(Wallet::Object);
+ sub get {
+ my ($self, $user, $host, $time) = @_;
+ $self->log_action ('get', $user, $host, $time) or return undef;
+ return "Some secure data";
+ }
+
+=head1 DESCRIPTION
+
+Wallet::Object is the generic parent class for wallet objects (data types
+that can be stored in the wallet system). It provides defualt functions and
+behavior, including handling generic object settings. All handlers for
+objects stored in the wallet should inherit from it. It is not used
+directly.
+
+=head1 PUBLIC CLASS METHODS
+
+The following methods are called by the rest of the wallet system and should
+be implemented by all objects stored in the wallet. They should be called
+with the desired wallet object class as the first argument (generally using
+the Wallet::Object::Type->new syntax).
+
+=over 4
+
+=item new(NAME, TYPE, DBH)
+
+Creates a new object with the given object name and type, based on data
+already in the database. This method will only succeed if an object of the
+given NAME and TYPE is already present in the wallet database. If no such
+object exits, returns undef. Otherwise, returns an object blessed into the
+class used for the new() call (so subclasses can leave this method alone and
+not override it).
+
+Takes a database handle, which is stored in the object and used for any
+further operations. This database handle is taken over by the wallet system
+and its settings (such as RaiseError and AutoCommit) will be modified by the
+object for its own needs.
+
+=item create(NAME, TYPE, DBH, PRINCIPAL, HOSTNAME [, DATETIME])
+
+Similar to new() but instead creates a new entry in the database. This
+method will fail (returning undef) if an entry for that name and type
+already exists in the database or if creating the database record fails.
+Otherwise, a new database entry will be created with that name and type, no
+owner, no ACLs, no expiration, no flags, and with created by, from, and on
+set to the PRINCIPAL, HOSTNAME, and DATETIME parameters. If DATETIME isn't
+given, the current time is used. The database handle is treated as with
+new().
+
+=back
+
+=head1 PUBLIC INSTANCE METHODS
+
+The following methods may be called on instantiated wallet objects.
+Normally, the only methods that a subclass will need to override are get(),
+store(), show(), and destroy().
+
+=over 4
+
+=item acl(TYPE [, ACL, PRINCIPAL, HOSTNAME [, DATETIME]])
+
+Sets or retrieves a given object ACL as a numeric ACL ID. TYPE must be one
+of C<get>, C<store>, C<show>, C<destroy>, or C<flags>, corresponding to the
+ACLs kept on an object. If no other arguments are given, returns the
+current ACL setting as an ACL ID or undef if that ACL isn't set. If other
+arguments are given, change that ACL to ACL. The other arguments are used
+for logging and history and should indicate the user and host from which the
+change is made and the time of the change.
+
+=item destroy(PRINCIPAL, HOSTNAME [, DATETIME])
+
+Destroys the object by removing all record of it from the database. The
+Wallet::Object implementation handles the generic database work, but any
+subclass should override this method to do any deletion of files or entries
+in external databases and any other database entries and then call the
+parent method to handle the generic database cleanup. Returns true on
+success and false on failure. The arguments are used for logging and
+history and should indicate the user and host from which the change is made
+and the time of the change.
+
+=item error()
+
+Returns the error message from the last failing operation or undef if no
+operations have failed. Callers should call this function to get the error
+message after an undef return from any other instance method.
+
+=item expires([EXPIRES, PRINCIPAL, HOSTNAME [, DATETIME]])
+
+Sets or retrieves the expiration date of an object. If no arguments are
+given, returns the current expiration or undef if no expiration is set. If
+arguments are given, change the expiration to EXPIRES, which should be in
+seconds since epoch. The other arguments are used for logging and history
+and should indicate the user and host from which the change is made and the
+time of the change.
+
+=item get(PRINCIPAL, HOSTNAME [, DATETIME])
+
+An object implementation must override this method with one that returns
+either the data of the object or undef on some error, using the provided
+arguments to update history information. The Wallet::Object implementation
+just throws an exception.
+
+=item owner([OWNER, PRINCIPAL, HOSTNAME [, DATETIME]])
+
+Sets or retrieves the owner of an object as a numeric ACL ID. If no
+arguments are given, returns the current owner ACL ID or undef if none is
+set. If arguments are given, change the owner to OWNER. The other
+arguments are used for logging and history and should indicate the user and
+host from which the change is made and the time of the change.
+
+=item show()
+
+Returns a formatted text description of the object suitable for human
+display, or undef on error. The default implementation shows all of the
+base metadata about the object, formatted as key: value pairs with the keys
+aligned in the first 15 characters followed by a space, a colon, and the
+value. Object implementations with additional data to display can rely on
+that format to add additional settings into the formatted output or at the
+end with a matching format.
+
+=item store(DATA, PRINCIPAL, HOSTNAME [, DATETIME])
+
+Store user-supplied data into the given object. This may not be supported
+by all backends (for instance, backends that automatically generate the data
+will not support this). The default implementation rejects all store()
+calls with an error message saying that the object is immutable.
+
+=back
+
+=head1 UTILITY METHODS
+
+The following instance methods should not be called externally but are
+provided for subclasses to call to implement some generic actions.
+
+=over 4
+
+=item log_action (ACTION, PRINCIPAL, HOSTNAME, DATETIME)
+
+Updates the history tables and trace information appropriately for ACTION,
+which should be either C<get> or C<store>. No other changes are made to the
+database, just updates of the history table and trace fields with the
+provided data about who performed the action and when.
+
+This function commits its transaction when complete and therefore should not
+be called inside another transaction. Normally it's called as a separate
+transaction after the data is successfully stored or retrieved.
+
+=item log_set (FIELD, OLD, NEW, PRINCIPAL, HOSTNAME, DATETIME)
+
+Updates the history tables for the change in a setting value for an object.
+FIELD should be one of C<owner>, C<acl_get>, C<acl_store>, C<acl_show>,
+C<acl_destroy>, C<acl_flags>, C<expires>, C<flags>, or a value starting with
+C<type_data> followed by a space and a type-specific field name. The last
+form is the most common form used by a subclass. OLD is the previous value
+of the field or undef if the field was unset, and NEW is the new value of
+the field or undef if the field should be unset.
+
+This function does not commit and does not catch database exceptions. It
+should normally be called as part of a larger transaction that implements
+the change in the setting.
+
+=back
+
+=head1 SEE ALSO
+
+walletd(8)
+
+This module is part of the wallet system. The current version is available
+from L<http://www.eyrie.org/~eagle/software/wallet/>.
+
+=head1 AUTHOR
+
+Russ Allbery <rra@stanford.edu>
+
+=cut