package DJabberd::Stanza::DialbackVerify;
# remote servers asking to verify results that we sent them, from when
# we were trying to initiate outbound connections.
use strict;
use base qw(DJabberd::Stanza);
use DJabberd::Log;
use DJabberd::DialbackParams;
our $logger = DJabberd::Log->get_logger();
sub on_recv_from_server {
my ($self, $conn) = @_;
$self->process($conn);
}
sub process {
my ($self, $conn) = @_;
$logger->debug("Procesing dialback verify for connection $conn->{id}");
my $fail = sub {
$logger->debug("DialbackVerify failed: $_[0]");
return 0;
};
# stream to parameter is optional on dialback, so this may be the first time
# we get to bind this connection to a vhost.
my $vhost = $conn->vhost;
my $to_host = $self->dialback_to;
unless ($vhost) {
$vhost = $conn->server->lookup_vhost($to_host)
or return $fail->("no vhost for this connection");
$conn->set_vhost($vhost)
or return $fail->("s2s disabled for this vhost");
}
my $db_params = DJabberd::DialbackParams->new(
id => $self->verify_stream_id,
orig => $to_host,
recv => $self->dialback_from,
vhost => $vhost,
);
$db_params->verify_callback(
result_text => $self->result_text,
on_success => sub {
$logger->debug("Dialback verify success for connection $conn->{id}");
$conn->dialback_verify_valid(recv_server => $self->recv_server,
orig_server => $self->orig_server,
id => $self->verify_stream_id);
},
on_failure => sub {
$logger->warn("Dialback verify success for connection $conn->{id}");
$conn->dialback_verify_invalid;
});
}
# always acceptable
sub acceptable_from_server { 1 }
sub verify_stream_id {
my $self = shift;
return $self->attr("{}id");
}
sub dialback_to {
my $self = shift;
return $self->attr("{}to");
}
*recv_server = \&dialback_to;
sub dialback_from {
my $self = shift;
return $self->attr("{}from");
}
*orig_server = \&dialback_from;
sub result_text {
my $self = shift;
return $self->first_child;
}
1;