AnyEvent
view release on metacpan or search on metacpan
lib/AnyEvent/TLS.pm view on Meta::CPAN
$preverify_ok
}
#=item $ssl = $tls->_get_session ($mode[, $ref])
#
#Creates a new Net::SSLeay::SSL session object, puts it into C<$mode>
#(C<accept> or C<connect>) and optionally associates it with the given
#C<$ref>. If C<$mode> is already a C<Net::SSLeay::SSL> object, then just
#associate data with it.
#
#=cut
#our %REF_MAP;
our $TLS_SNI_WARNED;
sub _get_session($$;$$) {
my ($self, $mode, $ref, $cn) = @_;
my $session;
if ($mode eq "accept") {
$session = Net::SSLeay::new ($self->{ctx});
Net::SSLeay::set_accept_state ($session);
Net::SSLeay::set_options ($session, eval { Net::SSLeay::OP_NO_TICKET () })
unless $self->{session_ticket} || !exists $self->{session_ticket};
} elsif ($mode eq "connect") {
$session = Net::SSLeay::new ($self->{ctx});
if (defined &Net::SSLeay::set_tlsext_host_name) {
Net::SSLeay::set_tlsext_host_name ($session, $cn)
if length $cn;
} else {
AE::log 6 => "TLS SNI not supported by your Net::SSLeay module, connecting without"
unless $TLS_SNI_WARNED++;
}
Net::SSLeay::set_connect_state ($session);
Net::SSLeay::set_options ($session, eval { Net::SSLeay::OP_NO_TICKET () })
unless $self->{session_ticket};
} else {
croak "'$mode': unsupported TLS mode (must be either 'connect' or 'accept')"
}
# # associate data
# Net::SSLeay::set_ex_data ($session, $REF_IDX, $ref+0);
# Scalar::Util::weaken ($REF_MAP{$ref+0} = $ref)
# if ref $ref;
if ($self->{debug}) {
#d# Net::SSLeay::set_info_callback ($session, 50000);
}
if ($self->{verify_mode}) {
Scalar::Util::weaken $self;
Scalar::Util::weaken $ref;
# we have to provide a dummy callbacks as at least Net::SSLeay <= 1.35
# try to call it even if specified as 0 or undef.
Net::SSLeay::set_verify
$session,
$self->{verify_mode},
sub { $self->verify ($session, $ref, $cn, @_) };
}
$session
}
sub _put_session($$) {
my ($self, $session) = @_;
# clear callback, if any
# this leaks memoryin Net::SSLeay up to at least 1.35, but there
# apparently is no other way.
Net::SSLeay::set_verify $session, 0, undef;
# # disassociate data
# delete $REF_MAP{Net::SSLeay::get_ex_data ($session, $REF_IDX)};
Net::SSLeay::free ($session);
}
#sub _ref($) {
# $REF_MAP{Net::SSLeay::get_ex_data ($_[0], $REF_IDX)}
#}
sub DESTROY {
my ($self) = @_;
# better be safe than sorry with net-ssleay
Net::SSLeay::CTX_set_default_passwd_cb ($self->{ctx});
Net::SSLeay::CTX_free ($self->{ctx});
}
=item AnyEvent::TLS::init
AnyEvent::TLS does on-demand initialisation, and normally there is no need to call an initialise
function.
As initialisation might take some time (to read e.g. C</dev/urandom>), this
could be annoying in some highly interactive programs. In that case, you can
call C<AnyEvent::TLS::init> to make sure there will be no costly initialisation
later. It is harmless to call C<AnyEvent::TLS::init> multiple times.
=cut
sub init() {
return if $REF_IDX;
AE::log 5 => "Net::SSLeay versions older than 1.33 might malfunction."
if $Net::SSLeay::VERSION < 1.33;
Net::SSLeay::load_error_strings ();
Net::SSLeay::SSLeay_add_ssl_algorithms ();
Net::SSLeay::randomize ();
$REF_IDX = Net::SSLeay::get_ex_new_index (0, 0, 0, 0, 0)
( run in 0.617 second using v1.01-cache-2.11-cpan-39bf76dae61 )