line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package DJabberd::SASL::NTLM; |
2
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
28975
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
37
|
|
4
|
1
|
|
|
1
|
|
6
|
use warnings; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
31
|
|
5
|
1
|
|
|
1
|
|
4
|
use base qw/DJabberd::SASL/; |
|
1
|
|
|
|
|
19
|
|
|
1
|
|
|
|
|
741
|
|
6
|
1
|
|
|
1
|
|
1020
|
use IPC::Open3; |
|
1
|
|
|
|
|
4957
|
|
|
1
|
|
|
|
|
68
|
|
7
|
1
|
|
|
1
|
|
1342
|
use IO::Select; |
|
1
|
|
|
|
|
1771
|
|
|
1
|
|
|
|
|
50
|
|
8
|
1
|
|
|
1
|
|
7
|
use Carp; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
489
|
|
9
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
our $VERSION = '0.03'; |
11
|
|
|
|
|
|
|
|
12
|
0
|
|
|
0
|
0
|
|
sub manager_class { 'DJabberd::SASL::NTLMManager' } |
13
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
sub mechanisms { |
15
|
0
|
|
|
0
|
0
|
|
my $plugin = shift; |
16
|
0
|
|
|
|
|
|
return { NTLM => 1 }; |
17
|
|
|
|
|
|
|
} |
18
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
sub set_config_ntlmauthhelper { |
20
|
0
|
|
|
0
|
0
|
|
my ( $self, $val ) = @_; |
21
|
0
|
|
|
|
|
|
$val =~ s/^\s*\b(.+)\b\s*$/$1/; |
22
|
0
|
|
|
|
|
|
my ( $ntlmauthhelper, @params ) = split( /\s+/, $val ); |
23
|
0
|
0
|
0
|
|
|
|
croak "Invalid NTLM helper: $ntlmauthhelper" |
24
|
|
|
|
|
|
|
unless ( -f $ntlmauthhelper && -x $ntlmauthhelper ); |
25
|
0
|
|
|
|
|
|
$self->{err} = 1; # set STDERR for child |
26
|
0
|
|
|
|
|
|
$self->{pid} = |
27
|
|
|
|
|
|
|
open3( $self->{out}, $self->{in}, $self->{err}, $ntlmauthhelper, |
28
|
|
|
|
|
|
|
@params ); |
29
|
0
|
|
|
|
|
|
$self->{s} = IO::Select->new(); |
30
|
0
|
|
|
|
|
|
$self->{s}->add( $self->{in} ); |
31
|
0
|
|
|
|
|
|
$self->{helper} = $ntlmauthhelper; |
32
|
0
|
|
|
|
|
|
$self->{params} = [@params]; |
33
|
|
|
|
|
|
|
|
34
|
0
|
0
|
|
|
|
|
croak "Can't open bidirectional pipe to NTLM helper" |
35
|
|
|
|
|
|
|
unless ( $self->{pid} ); |
36
|
|
|
|
|
|
|
} |
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
## XXX dupe sux |
39
|
|
|
|
|
|
|
sub register { |
40
|
0
|
|
|
0
|
0
|
|
my ( $plugin, $vhost ) = @_; |
41
|
0
|
|
|
|
|
|
$plugin->SUPER::register($vhost); |
42
|
|
|
|
|
|
|
|
43
|
|
|
|
|
|
|
$vhost->register_hook( |
44
|
|
|
|
|
|
|
"SendFeatures", |
45
|
|
|
|
|
|
|
sub { |
46
|
0
|
|
|
0
|
|
|
my ( $vh, $cb, $conn ) = @_; |
47
|
0
|
0
|
|
|
|
|
if ( my $sasl_conn = $conn->sasl ) { |
48
|
0
|
0
|
|
|
|
|
if ( $sasl_conn->is_success ) { |
49
|
0
|
|
|
|
|
|
return; |
50
|
|
|
|
|
|
|
} |
51
|
|
|
|
|
|
|
} |
52
|
0
|
|
|
|
|
|
my @mech = $plugin->mechanisms_list; |
53
|
0
|
|
|
|
|
|
my $xml_mechanisms = |
54
|
|
|
|
|
|
|
""; |
55
|
0
|
|
|
|
|
|
$xml_mechanisms .= join "", |
56
|
0
|
|
|
|
|
|
map { "$_" } @mech; |
57
|
0
|
0
|
|
|
|
|
$xml_mechanisms .= "" if $plugin->is_optional; |
58
|
0
|
|
|
|
|
|
$xml_mechanisms .= ""; |
59
|
0
|
|
|
|
|
|
$cb->stanza($xml_mechanisms); |
60
|
|
|
|
|
|
|
} |
61
|
0
|
|
|
|
|
|
); |
62
|
|
|
|
|
|
|
} |
63
|
|
|
|
|
|
|
|
64
|
|
|
|
|
|
|
1; |
65
|
|
|
|
|
|
|
__END__ |