Blame lib/Authen/SASL.pm

Packit ae5a87
# Copyright (c) 2004-2006 Graham Barr <gbarr@pobox.com>. All rights reserved.
Packit ae5a87
# This program is free software; you can redistribute it and/or
Packit ae5a87
# modify it under the same terms as Perl itself.
Packit ae5a87
Packit ae5a87
package Authen::SASL;
Packit ae5a87
Packit ae5a87
use strict;
Packit ae5a87
use vars qw($VERSION @Plugins);
Packit ae5a87
use Carp;
Packit ae5a87
Packit ae5a87
$VERSION = "2.16";
Packit ae5a87
Packit ae5a87
@Plugins = qw(
Packit ae5a87
	Authen::SASL::XS
Packit ae5a87
	Authen::SASL::Cyrus
Packit ae5a87
	Authen::SASL::Perl
Packit ae5a87
);
Packit ae5a87
Packit ae5a87
Packit ae5a87
sub import {
Packit ae5a87
  shift;
Packit ae5a87
  return unless @_;
Packit ae5a87
Packit ae5a87
  local $SIG{__DIE__};
Packit ae5a87
  @Plugins = grep { /^[:\w]+$/ and eval "require $_" } map { /::/ ? $_ : "Authen::SASL::$_" } @_
Packit ae5a87
    or croak "no valid Authen::SASL plugins found";
Packit ae5a87
}
Packit ae5a87
Packit ae5a87
Packit ae5a87
sub new {
Packit ae5a87
  my $pkg = shift;
Packit ae5a87
  my %opt = ((@_ % 2 ? 'mechanism' : ()), @_);
Packit ae5a87
Packit ae5a87
  my $self = bless {
Packit ae5a87
    mechanism => $opt{mechanism} || $opt{mech},
Packit ae5a87
    callback  => {},
Packit ae5a87
    debug => $opt{debug},
Packit ae5a87
  }, $pkg;
Packit ae5a87
Packit ae5a87
  $self->callback(%{$opt{callback}}) if ref($opt{callback}) eq 'HASH';
Packit ae5a87
Packit ae5a87
  # Compat
Packit ae5a87
  $self->callback(user => ($self->{user} = $opt{user})) if exists $opt{user};
Packit ae5a87
  $self->callback(pass => $opt{password}) if exists $opt{password};
Packit ae5a87
  $self->callback(pass => $opt{response}) if exists $opt{response};
Packit ae5a87
Packit ae5a87
  $self;
Packit ae5a87
}
Packit ae5a87
Packit ae5a87
Packit ae5a87
sub mechanism {
Packit ae5a87
  my $self = shift;
Packit ae5a87
  @_ ? $self->{mechanism} = shift
Packit ae5a87
     : $self->{mechanism};
Packit ae5a87
}
Packit ae5a87
Packit ae5a87
sub callback {
Packit ae5a87
  my $self = shift;
Packit ae5a87
Packit ae5a87
  return $self->{callback}{$_[0]} if @_ == 1;
Packit ae5a87
Packit ae5a87
  my %new = @_;
Packit ae5a87
  @{$self->{callback}}{keys %new} = values %new;
Packit ae5a87
Packit ae5a87
  $self->{callback};
Packit ae5a87
}
Packit ae5a87
Packit ae5a87
# The list of packages should not really be hardcoded here
Packit ae5a87
# We need some way to discover what plugins are installed
Packit ae5a87
Packit ae5a87
sub client_new { # $self, $service, $host, $secflags
Packit ae5a87
  my $self = shift;
Packit ae5a87
Packit ae5a87
  my $err;
Packit ae5a87
  foreach my $pkg (@Plugins) {
Packit ae5a87
    if (eval "require $pkg" and $pkg->can("client_new")) {
Packit ae5a87
      if ($self->{conn} = eval { $pkg->client_new($self, @_) }) {
Packit ae5a87
        return $self->{conn};
Packit ae5a87
      }
Packit ae5a87
      $err = $@;
Packit ae5a87
    }
Packit ae5a87
  }
Packit ae5a87
Packit ae5a87
  croak $err || "Cannot find a SASL Connection library";
Packit ae5a87
}
Packit ae5a87
Packit ae5a87
sub server_new { # $self, $service, $host, $secflags
Packit ae5a87
  my $self = shift;
Packit ae5a87
Packit ae5a87
  my $err;
Packit ae5a87
  foreach my $pkg (@Plugins) {
Packit ae5a87
    if (eval "require $pkg" and $pkg->can("server_new")) {
Packit ae5a87
      if ($self->{conn} = eval { $pkg->server_new($self, @_) } ) {
Packit ae5a87
        return $self->{conn};
Packit ae5a87
      }
Packit ae5a87
      $err = $@;
Packit ae5a87
    }
Packit ae5a87
  }
Packit ae5a87
  croak $err || "Cannot find a SASL Connection library for server-side authentication";
Packit ae5a87
}
Packit ae5a87
Packit ae5a87
sub error {
Packit ae5a87
  my $self = shift;
Packit ae5a87
  $self->{conn} && $self->{conn}->error;
Packit ae5a87
}
Packit ae5a87
Packit ae5a87
# Compat.
Packit ae5a87
sub user {
Packit ae5a87
  my $self = shift;
Packit ae5a87
  my $user = $self->{callback}{user};
Packit ae5a87
  $self->{callback}{user} = shift if @_;
Packit ae5a87
  $user;
Packit ae5a87
}
Packit ae5a87
Packit ae5a87
sub challenge {
Packit ae5a87
  my $self = shift;
Packit ae5a87
  $self->{conn}->client_step(@_);
Packit ae5a87
}
Packit ae5a87
Packit ae5a87
sub initial {
Packit ae5a87
  my $self = shift;
Packit ae5a87
  $self->client_new($self)->client_start;
Packit ae5a87
}
Packit ae5a87
Packit ae5a87
sub name {
Packit ae5a87
  my $self = shift;
Packit ae5a87
  $self->{conn} ? $self->{conn}->mechanism : ($self->{mechanism} =~ /(\S+)/)[0];
Packit ae5a87
}
Packit ae5a87
Packit ae5a87
1;