File Coverage

blib/lib/Authen/SASL/Perl/PLAIN.pm
Criterion Covered Total %
statement 47 50 94.0
branch 10 12 83.3
condition 5 8 62.5
subroutine 11 11 100.0
pod 0 3 0.0
total 73 84 86.9


line stmt bran cond sub pod time code
1             # Copyright (c) 2002 Graham Barr . All rights reserved.
2             # This program is free software; you can redistribute it and/or
3             # modify it under the same terms as Perl itself.
4              
5             package Authen::SASL::Perl::PLAIN 2.2000;
6              
7 5     5   211742 use strict;
  5         8  
  5         194  
8 5     5   44 use warnings;
  5         8  
  5         344  
9 5     5   31 use vars qw(@ISA);
  5         7  
  5         3498  
10              
11             @ISA = qw(Authen::SASL::Perl);
12              
13             my %secflags = (
14             noanonymous => 1,
15             );
16              
17             my @tokens = qw(authname user pass);
18              
19 36     36   83 sub _order { 1 }
20             sub _secflags {
21 19     19   38 shift;
22 19         73 grep { $secflags{$_} } @_;
  0         0  
23             }
24              
25 6     6 0 434 sub mechanism { 'PLAIN' }
26              
27             sub client_start {
28 5     5 0 18 my $self = shift;
29              
30 5         15 $self->{error} = undef;
31 5         9 $self->{need_step} = 0;
32              
33             my @parts = map {
34 5         11 my $v = $self->_call($_);
  15         60  
35 15 100       39 defined($v) ? $v : ''
36             } @tokens;
37              
38 5         22 join("\0", @parts);
39             }
40              
41             sub server_start {
42 24     24 0 303 my $self = shift;
43 24         42 my $response = shift;
44 24   66 1   49 my $user_cb = shift || sub {};
45              
46 24         43 $self->{error} = undef;
47 24 50       39 return $self->set_error("No response: Credentials don't match")
48             unless defined $response;
49              
50 24         29 my %parts;
51 24         120 @parts{@tokens} = split "\0", $response, scalar @tokens;
52              
53              
54             # I'm not entirely sure of what I am doing
55 24         86 $self->{answer}{$_} = $parts{$_} for qw/authname user/;
56 24         28 my $error = "Credentials don't match";
57              
58             ## checkpass
59 24 100       64 if (my $checkpass = $self->callback('checkpass')) {
    50          
60             my $cb = sub {
61 22     22   1802 my $result = shift;
62 22 100       35 unless ($result) {
63 19         43 $self->set_error($error);
64             }
65             else {
66 3         15 $self->set_success;
67             }
68 22         46 $user_cb->();
69 22         63 };
70 22         92 $checkpass->($self => { %parts } => $cb );
71 22         157 return;
72             }
73              
74             ## getsecret
75             elsif (my $getsecret = $self->callback('getsecret')) {
76             my $cb = sub {
77 2     2   5 my $good_pass = shift;
78 2 100 50     8 if ($good_pass && $good_pass eq ($parts{pass} || "")) {
      66        
79 1         5 $self->set_success;
80             }
81             else {
82 1         7 $self->set_error($error);
83             }
84 2         3 $user_cb->();
85 2         5 };
86 2         4 $getsecret->( $self, { map { $_ => $parts{$_ } } qw/user authname/ }, $cb );
  4         12  
87 2         35 return;
88             }
89              
90             ## error by default
91             else {
92 0           $self->set_error($error);
93 0           $user_cb->();
94             }
95             }
96              
97             1;
98              
99             __END__