OpenPKG CVS Repository http://cvs.openpkg.org/ ____________________________________________________________________________
Server: cvs.openpkg.org Name: Ralf S. Engelschall Root: /v/openpkg/cvs Email: [EMAIL PROTECTED] Module: openpkg-src Date: 07-Mar-2006 19:54:51 Branch: HEAD Handle: 2006030718545100 Added files: openpkg-src/openpkg-registry openpkg-registry.patch Modified files: openpkg-src/openpkg-registry openpkg-registry.spec Log: flush patch file to CVS and upgrade to latest version Summary: Revision Changes Path 1.1 +506 -0 openpkg-src/openpkg-registry/openpkg-registry.patch 1.11 +3 -3 openpkg-src/openpkg-registry/openpkg-registry.spec ____________________________________________________________________________ patch -p0 <<'@@ .' Index: openpkg-src/openpkg-registry/openpkg-registry.patch ============================================================================ $ cvs diff -u -r0 -r1.1 openpkg-registry.patch --- /dev/null 2006-03-07 19:54:36 +0100 +++ openpkg-registry.patch 2006-03-07 19:54:51 +0100 @@ -0,0 +1,506 @@ +--- /dev/null 2005-11-27 00:46:14 +0100 ++++ ase.pm 2005-11-27 00:47:12 +0100 +@@ -0,0 +1,503 @@ ++## ++## OSSP ase -- Affiliation Service Environment ++## Copyright (c) 2005 Ralf S. Engelschall <[EMAIL PROTECTED]> ++## Copyright (c) 2005 The OSSP Project <http://www.ossp.org/> ++## ++## This file is part of OSSP ase, a service environment for managing ++## affiliations which can be found at http://www.ossp.org/pkg/tool/ase/. ++## ++## This program is free software; you can redistribute it and/or modify ++## it under the terms of the GNU General Public License as published by ++## the Free Software Foundation; either version 2 of the License, or ++## (at your option) any later version. ++## ++## This program is distributed in the hope that it will be useful, ++## but WITHOUT ANY WARRANTY; without even the implied warranty of ++## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++## General Public License for more details. ++## ++## You should have received a copy of the GNU General Public License ++## along with this program; if not, write to the Free Software ++## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++## USA, or contact Ralf S. Engelschall <[EMAIL PROTECTED]>. ++## ++## ase.pm: client API ++## ++ ++package OSSP::ase::client; ++ ++use 5.008; ++use strict; ++use warnings; ++use base 'Exporter'; ++ ++our $VERSION = do { my @v = ('0.0.1' =~ m/\d+/g); sprintf("%d.".("%02d"x$#v), @v); }; ++ ++our @EXPORT_OK = (); ++our @EXPORT = (); ++ ++# names of valid ASE session attributes ++my @valid_attributes = qw( ++ session-id ++ session-valid ++ session-created ++ session-expires ++ canvas-url ++ canvas-mark-head ++ canvas-mark-body ++ client-address ++ client-login-uuid ++ client-login-name ++); ++ ++# textual markers for canvas ++my $canvas_mark = { ++ head => "<!-- ASE: HEAD -->", ++ body => "<!-- ASE: BODY -->" ++}; ++ ++# lazy loading of modules ++sub _use ($$) { ++ my ($self, $name) = @_; ++ if (not defined($self->{-use}->{$name})) { ++ eval "require $name; import $name;"; ++ $self->{-use}->{$name} = 1; ++ } ++ return; ++} ++ ++# debugging: time identification ++sub _time () { ++ my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time()); ++ return sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year, $mon+1, $mday, $hour, $min, $sec); ++} ++ ++# debugging: message formatting ++sub _debug ($$;@) { ++ my ($self, $fmt, @args) = @_; ++ ++ return if (not defined($self->{-debug})); ++ if (defined($args[0])) { ++ $self->{-debug}->printf("%s $fmt\n", $self->_time(), @args); ++ } ++ else { ++ $self->{-debug}->printf("%s %s\n", $self->_time(), $fmt); ++ } ++ return; ++} ++ ++# debugging: structure dumping ++sub _dump ($;@) { ++ my ($self, $prefix, @args) = @_; ++ ++ return if (not defined($self->{-debug})); ++ $self->_use("Data::Dumper"); ++ my $d = Data::Dumper->new([EMAIL PROTECTED]); ++ $d->Purity(0); ++ $d->Indent(1); ++ $d->Terse(1); ++ $d->Pad(sprintf("%s %s| ", $self->_time()), $prefix); ++ $self->{-debug}->print($d->Dump()); ++ return; ++} ++ ++# object constructor ++sub new { ++ my $proto = shift; ++ my %args = @_; ++ ++ # create new object ++ my $class = ref($proto) || $proto; ++ my $self = {}; ++ bless ($self, $class); ++ ++ # fill object with attributes ++ $self->{-server} = ($args{-server} || die "no OSSP ase server URL specified with \"-server\""); ++ $self->{-cgi} = ($args{-cgi} || new CGI); ++ $self->{-session} = ($args{-session} || new CGI::Session); ++ $self->{-mode} = ($args{-mode} || "mode"); ++ $self->{-valid} = ($args{-valid} || 0); ++ $self->{-debug} = ($args{-debug} || undef); ++ $self->{-response} = ""; ++ $self->{-error} = ""; ++ $self->{-use} = {}; ++ ++ # optionally open debug logfile ++ if (defined($self->{-debug})) { ++ $self->_use("IO::File"); ++ $self->{-debug} = IO::File->new(">>" . $self->{-debug}) ++ or die "failed to open debug logfile: $!"; ++ } ++ ++ # return object ++ return $self; ++} ++ ++# object destructor (explicit) ++sub destroy ($) { ++ my ($self) = @_; ++ ++ # shutdown sub-objects ++ $self->{-session}->flush() if (defined($self->{-session})); ++ $self->{-debug}->close() if (defined($self->{-debug})); ++ ++ # destroy sub-objects ++ delete $self->{-cgi}; ++ delete $self->{-session}; ++ delete $self->{-debug}; ++ ++ return; ++} ++ ++# object destructor (implicit) ++sub DESTROY ($) { ++ my ($self) = @_; ++ $self->destroy(); ++ return; ++} ++ ++# run-time responsibility check ++sub responsible ($) { ++ my ($self) = @_; ++ ++ my $action = $self->{-cgi}->url_param("ase-action") || ""; ++ return $action =~ m/^(login|logout|info|comeback)$/; ++} ++ ++# run-time action handler ++sub action ($;%) { ++ my ($self, %args) = @_; ++ ++ # debugging ++ $self->_debug("action: client-sid=%s server-sid=%s", ++ $self->{-session}->id(), $self->attr("session-id") || "none"); ++ ++ my $action = $self->{-cgi}->url_param("ase-action") || ""; ++ if ($action =~ m/^(login|logout|info)$/) { ++ # ++ # request ASE actions ++ # ++ my $mode_during = $self->{-cgi}->url_param("ase-mode-during") ++ or { $self->error("CGI parameter \"ase-mode-during\" missing or empty"), return 0 }; ++ my $mode_after = $self->{-cgi}->url_param("ase-mode-after") ++ or { $self->error("CGI parameter \"ase-mode-after\" missing or empty"), return 0 }; ++ ++ # debugging ++ $self->_debug("action: action=%s mode-during=%s mode-after=%s", $action, $mode_during, $mode_after); ++ ++ # remember mode after action ++ $self->attr("mode-after", $mode_after); ++ ++ # determine URLs for canvas and return ++ my $canvas = sprintf("%s?%s=%s", ++ $self->{-cgi}->url(-full => 1), $self->{-mode}, $mode_during); ++ my $return = sprintf("%s?ase-action=comeback;ase-action-old=%s;ase-sid=%%s", ++ $self->{-cgi}->url(-full => 1), $action); ++ ++ # determine URL for server request ++ $self->_use("URI::Escape"); ++ my $url = sprintf( ++ "%s?mode=rpc;method=%s;" . ++ "return=%s;canvas=%s;canvas_mark_head=%s;canvas_mark_body=%s", ++ $self->{-server}, $action, ++ URI::Escape::uri_escape($return), ++ URI::Escape::uri_escape($canvas), ++ URI::Escape::uri_escape($canvas_mark->{"head"}), ++ URI::Escape::uri_escape($canvas_mark->{"body"})); ++ ++ # redirect to server request URL ++ $self->response($self->{-cgi}->redirect(-url => $url, -status => 302)); ++ return 1; ++ } ++ elsif ($action eq 'comeback') { ++ # ++ # respond to ASE actions ++ # ++ my $action_old = $self->{-cgi}->url_param("ase-action-old") ++ or { $self->error("CGI parameter \"ase-action-old\" missing or empty"), return 0 }; ++ my $sid = $self->{-cgi}->url_param("ase-sid") ++ or { $self->error("CGI parameter \"ase-sid\" missing or empty"), return 0 }; ++ ++ $self->_debug("action: action=%s action-old=%s sid=%s", $action, $action_old, $sid); ++ ++ # sanity check remote server session ++ $self->attr("session-id", $sid); ++ $self->validate(1); ++ if ($action_old eq "login" and $self->attr("session-valid") ne "yes") { ++ $self->error("server session still invalid after login: \"%s\"", $sid); ++ return 0; ++ } ++ elsif ($action_old eq "logout" and $self->attr("session-valid") ne "no") { ++ $self->error("server session still valid after logout: \"%s\"", $sid); ++ return 0; ++ } ++ ++ # redirect to own following URL ++ my $mode_after = $self->attr("mode-after"); ++ my $url = sprintf("%s?%s=%s", $self->{-cgi}->url(-relative => 1), $self->{-mode}, $mode_after); ++ $self->response($self->{-cgi}->redirect(-url => $url, -status => 302)); ++ return 1; ++ } ++ else { ++ $self->error("unable to determine action"); ++ return 0; ++ } ++} ++ ++sub response ($;$) { ++ my ($self, $response) = @_; ++ ++ my $rv = $self->{-response}; ++ if (not $rv and $self->error()) { ++ $rv = $self->{-cgi}->header( ++ -status => "500 Internal Server Error", ++ -type => "text/plain", ++ -expires => "+0s", ++ ) . "ASE ERROR: " . $self->error() . "\n"; ++ } ++ $self->{-response} = $response if (@_ == 2); ++ return $rv; ++} ++ ++sub error ($;$@) { ++ my ($self, $fmt, @args) = @_; ++ ++ my $rv = $self->{-error}; ++ $self->{-error} = (@_ >= 3 ? sprintf($fmt, @args) : sprintf("%s", $fmt)) if (@_ >= 2); ++ return $rv; ++} ++ ++# session validation ++sub validate ($) { ++ my ($self, $forced) = @_; ++ ++ # make sure there is a session to be validated ++ my $sid = $self->attr("session-id"); ++ return if (not defined($sid)); ++ ++ # debugging ++ $self->_debug("METHOD: validate: forced=%s sid=%s", $forced ? "yes" : "no", $sid); ++ ++ # short-circuit if still no (re-)validation is necessary ++ my $valid_since = $self->attr("session-valid-since"); ++ return if ( not $forced ++ and defined($valid_since) ++ and ( $self->{-valid} == 0 ++ or ($valid_since + $self->{-valid}) > time())); ++ ++ # clear all remembered session attributes ++ foreach my $key (@valid_attributes) { ++ $self->attr($key, undef); ++ } ++ ++ # query server for session information ++ $self->_use("IO::Socket::INET"); ++ my $server = $self->{-server}; ++ my ($host, $port, $path) = ($server =~ m|^http://([^:/]+)((?::\d+)?)(.*)$|) or die; ++ $port ||= 80; ++ $port =~ s|^:||; ++ $path .= "?mode=rpc;method=info;sid=$sid"; ++ my $sock = IO::Socket::INET->new ( ++ PeerAddr => $host, ++ PeerPort => $port, ++ Proto => "tcp", ++ Timeout => 10 ++ ) or die "failed to connect to $host:$port: $@"; ++ $sock->autoflush(1); ++ $sock->printf( ++ "GET $path HTTP/1.0\n" . ++ "Host: $host:$port\n" . ++ "\n" ++ ); ++ my $response = ''; ++ $response .= $_ while (<$sock>); ++ $sock->close(); ++ $self->_debug("METHOD: validate: response from %s", $server); ++ ++ # parse session information response ++ my $attribute = {}; ++ $response =~ s|^HTTP/1.[01x]\s+200\s+.+?\r?\n\r?\n||s; ++ foreach my $key (@valid_attributes) { ++ $attribute->{$key} = ""; ++ $response =~ s|${key}:[ \t]+([^\r\n]+)\r?\n|$attribute->{$key} = $1, ''|sei; ++ } ++ ++ # check validatity of session ++ my $expires = ($attribute->{"session-expires"} || 0) - time(); ++ if (not ( $attribute->{"session-valid"} eq "yes" ++ and $attribute->{"client-login-uuid"} ne "" ++ and $attribute->{"client-login-name"} ne "" ++ and $expires > 0 )) { ++ $attribute->{"session-valid"} = "no"; ++ $attribute->{"session-expires"} = time()+1; ++ $expires = 1; ++ } ++ ++ # take over session attributes ++ foreach my $key (@valid_attributes) { ++ $self->attr($key, $attribute->{$key}, sprintf("+%ds", $expires)); ++ } ++ ++ # remember time of this validation ++ $self->attr("session-valid-since", time()); ++ $self->_dump("validate: ", $self->{-session}); ++ return; ++} ++ ++# self-referencing URL generator ++sub url ($%) { ++ my ($self, %args) = @_; ++ ++ # create self-referencing URL ++ my $base = $self->{-cgi}->url(-relative => 1); ++ $base = '.' if ($base eq ''); ++ my $mode = $self->{-cgi}->url_param($self->{-mode}) ++ || $self->{-cgi}->param($self->{-mode}) ++ || ""; ++ my $url = sprintf( ++ "%s?ase-action=%s;ase-mode-during=%s;ase-mode-after=%s", ++ $base, $args{-action}, ++ $args{-mode_during} || $mode, ++ $args{-mode_after} || $mode ++ ); ++ ++ return $url; ++} ++ ++# return arbitrary ASE session attributes ++sub attr ($$;$$) { ++ my ($self, $name, $value, $expire) = @_; ++ ++ my $value_old = $self->{-session}->param("ase-$name"); ++ if (@_ >= 3) { ++ if (defined($value)) { ++ $self->{-session}->param("ase-$name", $value); ++ if (defined($expire)) { ++ $self->{-session}->expire("ase-$name", $expire); ++ } ++ } ++ else { ++ $self->{-session}->clear("ase-$name"); ++ } ++ } ++ return $value_old; ++} ++ ++# return current login ++sub login ($) { ++ my ($self) = @_; ++ ++ return (($self->attr("session-valid") || "no") eq "yes"); ++} ++ ++# return ASE canvas marker for head and body ++sub canvas ($%) { ++ my ($self, %args) = @_; ++ ++ return ( $args{-part} eq 'head' ++ ? $canvas_mark->{"head"} ++ : $canvas_mark->{"body"}); ++} ++ ++1; ++ ++__END__ ++ ++=pod ++ ++=head1 NAME ++ ++OSSP::ase::client -- OSSP ase Client API ++ ++=head1 DESCRIPTION ++ ++B<OSSP::ase::client> is the client Perl API of B<OSSP ase>. ++It allows an arbitrary CGI written in Perl to leverage from ++B<OSSP ase> authentication. ++ ++=head1 APPLICATION PROGRAMMING INTERFACE (API) ++ ++The following API methods are provided: ++ ++=over 4 ++ ++=item C<my $ase = >B<new OSSP::ase::client>C<(>I<options>C<);> ++ ++This creates a new B<OSSP ase> client object. ++The available I<options> are: ++ ++=over 4 ++ ++=item B<-server> (default: I<none>) ++ ++Mandatory URL of the B<OSSP ase> server CGI. ++Usually something like C<http://ase.example.com/ase.cgi>". ++ ++=item B<-cgi> (default: C<new CGI>) ++ ++Optional but strongly recommended reference to a B<CGI> query object. ++ ++=item B<-session> (default: C<new CGI::Session>) ++ ++Optional but strongly recommended reference to a B<CGI::Session> session ++handling object. ++ ++=item B<-mode> (default: C<"mode">) ++ ++Optional name of B<CGI> parameter holding the run-time mode ++dispatching information, i.e., the parameter your application ++uses to decide which application screen/page to display. ++ ++=item B<-valid> (default: C<0>) ++ ++Optional number of seconds a B<OSSP ase> server session information is ++valid before it is forced to be revalidated. A value of C<0> indicates ++that no revalidation is enforced at all. Nevertheless the B<OSSP ase> ++server session information is automatically expiring after the time ++the server indicated. The revalidated is intended for intermediate ++revalidation. ++ ++=back ++ ++=item C<$ase-E<gt>destroy();> ++ ++=item C<undef $ase;> ++ ++This destroys the B<OSSP ase> client object. ++ ++=item C<$ase-E<gt>responsible();> ++ ++FIXME ++ ++=item C<$ase-E<gt>action();> ++ ++FIXME ++ ++=item C<$ase-E<gt>error();> ++ ++FIXME ++ ++=item C<$ase-E<gt>response();> ++ ++FIXME ++ ++=item C<$ase-E<gt>validate($forced);> ++ ++FIXME ++ ++=item C<$ase-E<gt>url();> ++ ++FIXME ++ ++=item C<$ase-E<gt>attr($name>[C<, $value>[C<, $expire>]]C<);> ++ ++FIXME ++ ++=item C<$ase-E<gt>canvas();> ++ ++FIXME ++ ++=back ++ ++=cut ++ @@ . patch -p0 <<'@@ .' Index: openpkg-src/openpkg-registry/openpkg-registry.spec ============================================================================ $ cvs diff -u -r1.10 -r1.11 openpkg-registry.spec --- openpkg-src/openpkg-registry/openpkg-registry.spec 23 Feb 2006 13:24:56 -0000 1.10 +++ openpkg-src/openpkg-registry/openpkg-registry.spec 7 Mar 2006 18:54:51 -0000 1.11 @@ -32,8 +32,8 @@ Class: EVAL Group: Bootstrapping License: BSD-style -Version: 0.2.7 -Release: 20060223 +Version: 0.3.0 +Release: 20060307 # package options %option with_client yes @@ -71,7 +71,7 @@ %prep %setup - %patch + %patch -p0 %build @@ . ______________________________________________________________________ The OpenPKG Project www.openpkg.org CVS Repository Commit List openpkg-cvs@openpkg.org