Authen-Ticket

 view release on metacpan or  search on metacpan

lib/Authen/Ticket/Client.pm  view on Meta::CPAN

# ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

package Authen::Ticket::Client;

use strict;

use vars (qw/$VERSION %DEFAULTS @ISA/);

use MIME::Base64 (qw/decode_base64/);

use Carp;

if($ENV{MOD_PERL}) {
  @ISA = (qw/Apache/);
} else {
  @ISA = ( );
}

$VERSION = '0.02';

%DEFAULTS = (
  TicketDomain => undef,
  TicketName   => 'ticket',
);

sub debug {
  my $self = shift;

  if($$self{_log}) {
    $$self{_log}->debug(join($,,@_));
  } elsif($$self{DEBUG}) {
    carp join($,,@_);
  }
}

sub new {
  my $class = shift;
  $class = ref($class) || $class;
  my $r;
  my $self = { };
  my $cookies;

  bless $self, $class;

  if($ENV{MOD_PERL}) {
    $r = shift;
    unless(ref $r) {
      unshift @_, $r;
      $r = '';
    }
    $r ||= Apache->request;
    $self->{_r} = $r;
    $self->{_log} = $r->log;
    $cookies = $r->headers_in->{Cookie};
  } else {
    $cookies = $ENV{HTTP_COOKIE};
  }

  my @cookies = split(/;\s*/, $cookies);

  $self->configure(@_);

  $self->initialize;

  $self->debug("Getting ticket: $$self{TicketName}");
  my $ticket;
  my $ticket_name = $$self{TicketName};

  while(@cookies && !$ticket) {
    my $t = shift @cookies;
    $self->debug("Considering [$t]");
    my($k, $v) = split(/=/, $t, 2);
    $k =~ s{%(..)}{chr(hex($1))}ge;
    $self->debug("$k => [$v]");
    next unless $k eq $$self{TicketName};
    $v =~ s{%(..)}{chr(hex($1))}ge;
    $ticket = $v;
  }

  $self->debug("Cookies: [$cookies]");
  $self->debug("Ticket: [$ticket]");
  
  #
  # provide automatic signature verification if available...
  #
  $self->debug("Ticket: [$ticket]");
  my $sc = eval { $self->verify_ticket($ticket); };
  if($@) {
    $self->debug("Eval results: [$@]");
  } else {
    $ticket = $sc;
    $self->debug("Verified ticket: [$sc]");
  }
  $self->debug("Ticket now: [$ticket]");

  $self->{ticket} = $self->deconstruct_cookie(
                      $self->decode_cookie(
                        ref($ticket) ? join('', @{ $ticket })
                                     : $ticket
                      )
                    );

  return $self
}

sub configure {
  my $self = shift;
  my %opts = (@_);

  # build options hash
  my %defaults = ( );
  my @classes = ( );
  my %classes_seen = ( );

  push @classes, (ref $self or $self);

  while(@classes) {
    no strict;
    my $class = shift @classes;
    next if $classes_seen{$class};
    $classes_seen{$class}++;
    push @classes, @{ "$class\::ISA" };
 

    if(defined %{ "$class\::DEFAULTS" }) {
      foreach my $k ( keys %{ "$class\::DEFAULTS" } ) {
        $defaults{$k} ||= ${ "$class\::DEFAULTS" }{$k};
      }
    } 
  } 
  
  if($$self{_r}) {
    foreach my $k (keys %defaults) {
      $self->{$k} = $self->dir_config($k);
    }
 
    unless($self->{TicketDomain}) {
      $$self{TicketDomain} = $self->server->server_hostname;
      $$self{TicketDomain} =~ s/^[^.]+//;
    }



( run in 1.368 second using v1.01-cache-2.11-cpan-39bf76dae61 )