File Coverage

blib/lib/Net/LDAP/Control.pm
Criterion Covered Total %
statement 21 46 45.6
branch 6 26 23.0
condition 3 29 10.3
subroutine 5 12 41.6
pod 10 10 100.0
total 45 123 36.5


line stmt bran cond sub pod time code
1             # Copyright (c) 1999-2004 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 Net::LDAP::Control;
6              
7 6     6   51 use strict;
  6         12  
  6         252  
8              
9 6         4583 use Net::LDAP::Constant qw(
10             LDAP_CONTROL_SORTREQUEST
11             LDAP_CONTROL_SORTRESULT
12             LDAP_CONTROL_VLVREQUEST
13             LDAP_CONTROL_VLVRESPONSE
14             LDAP_CONTROL_PAGED
15             LDAP_CONTROL_PROXYAUTHORIZATION
16             LDAP_CONTROL_MANAGEDSAIT
17             LDAP_CONTROL_PERSISTENTSEARCH
18             LDAP_CONTROL_ENTRYCHANGE
19             LDAP_CONTROL_MATCHEDVALUES
20             LDAP_CONTROL_PASSWORDPOLICY
21             LDAP_CONTROL_PREREAD
22             LDAP_CONTROL_POSTREAD
23             LDAP_CONTROL_SYNC
24             LDAP_CONTROL_SYNC_STATE
25             LDAP_CONTROL_SYNC_DONE
26             LDAP_CONTROL_ASSERTION
27             LDAP_CONTROL_RELAX
28             LDAP_CONTROL_DONTUSECOPY
29             LDAP_CONTROL_TREE_DELETE
30             LDAP_CONTROL_SUBENTRIES
31             LDAP_CONTROL_NOOP
32 6     6   30 );
  6         10  
33              
34             our $VERSION = '0.20';
35              
36             my %Pkg2Type = (
37              
38             'Net::LDAP::Control::Sort' => LDAP_CONTROL_SORTREQUEST,
39             'Net::LDAP::Control::SortResult' => LDAP_CONTROL_SORTRESULT,
40              
41             'Net::LDAP::Control::VLV' => LDAP_CONTROL_VLVREQUEST,
42             'Net::LDAP::Control::VLVResponse' => LDAP_CONTROL_VLVRESPONSE,
43              
44             'Net::LDAP::Control::Paged' => LDAP_CONTROL_PAGED,
45              
46             'Net::LDAP::Control::ProxyAuth' => LDAP_CONTROL_PROXYAUTHORIZATION,
47              
48             'Net::LDAP::Control::ManageDsaIT' => LDAP_CONTROL_MANAGEDSAIT,
49              
50             'Net::LDAP::Control::PersistentSearch' => LDAP_CONTROL_PERSISTENTSEARCH,
51             'Net::LDAP::Control::EntryChange' => LDAP_CONTROL_ENTRYCHANGE,
52              
53             'Net::LDAP::Control::MatchedValues' => LDAP_CONTROL_MATCHEDVALUES,
54              
55             'Net::LDAP::Control::PasswordPolicy' => LDAP_CONTROL_PASSWORDPOLICY,
56              
57             'Net::LDAP::Control::PreRead' => LDAP_CONTROL_PREREAD,
58              
59             'Net::LDAP::Control::PostRead' => LDAP_CONTROL_POSTREAD,
60              
61             'Net::LDAP::Control::SyncRequest' => LDAP_CONTROL_SYNC,
62             'Net::LDAP::Control::SyncState' => LDAP_CONTROL_SYNC_STATE,
63             'Net::LDAP::Control::SyncDone' => LDAP_CONTROL_SYNC_DONE,
64             'Net::LDAP::Control::Assertion' => LDAP_CONTROL_ASSERTION,
65             'Net::LDAP::Control::Relax' => LDAP_CONTROL_RELAX,
66             'Net::LDAP::Control::DontUseCopy' => LDAP_CONTROL_DONTUSECOPY,
67             'Net::LDAP::Control::TreeDelete' => LDAP_CONTROL_TREE_DELETE,
68             'Net::LDAP::Control::Subentries' => LDAP_CONTROL_SUBENTRIES,
69             'Net::LDAP::Control::NoOp' => LDAP_CONTROL_NOOP,
70             #
71             #LDAP_CONTROL_PWEXPIRED
72             #LDAP_CONTROL_PWEXPIRING
73             #
74             #LDAP_CONTROL_REFERRALS
75             );
76              
77             my %Type2Pkg = reverse %Pkg2Type;
78              
79             sub register {
80 0     0 1 0 my($class, $oid) = @_;
81              
82             require Carp and Carp::croak("$oid is already registered to $Type2Pkg{$oid}")
83 0 0 0     0 if exists $Type2Pkg{$oid} and $Type2Pkg{$oid} ne $class;
      0        
84              
85             require Carp and Carp::croak("$class is already registered to $Pkg2Type{$class}")
86 0 0 0     0 if exists $Pkg2Type{$class} and $Pkg2Type{$class} ne $oid;
      0        
87              
88 0         0 $Type2Pkg{$oid} = $class;
89 0         0 $Pkg2Type{$class} = $oid;
90             }
91              
92             sub new {
93 4     4 1 6 my $self = shift;
94 4   33     12 my $pkg = ref($self) || $self;
95 4 50       9 my $oid = (@_ & 1) ? shift : undef;
96 4         19 my %args = @_;
97              
98 4   0     10 $args{type} ||= $oid || $Pkg2Type{$pkg} || '';
      33        
99              
100 4 50       26 unless ($args{type} =~ /^\d+(?:\.\d+)+$/) {
101 0         0 $args{error} = 'Invalid OID';
102 0         0 return bless \%args;
103             }
104              
105 4 50 33     15 if ($pkg eq __PACKAGE__ and exists $Type2Pkg{$args{type}}) {
106 4         7 $pkg = $Type2Pkg{$args{type}};
107 4 50       202 eval "require $pkg" or die $@;
108             }
109              
110 4         10 delete $args{error};
111              
112 4         13 bless(\%args, $pkg)->init;
113             }
114              
115              
116             sub from_asn {
117 0     0 1 0 my $self = shift;
118 0         0 my $asn = shift;
119 0   0     0 my $class = ref($self) || $self;
120              
121 0 0 0     0 if ($class eq __PACKAGE__ and exists $Type2Pkg{$asn->{type}}) {
122 0         0 $class = $Type2Pkg{$asn->{type}};
123 0 0       0 eval "require $class" or die $@;
124             }
125              
126 0         0 delete $asn->{error};
127              
128 0         0 bless($asn, $class)->init;
129             }
130              
131             sub to_asn {
132 0     0 1 0 my $self = shift;
133 0         0 $self->value; # Ensure value is there
134 0 0       0 delete $self->{critical} unless $self->{critical};
135 0         0 $self;
136             }
137              
138             sub critical {
139 2     2 1 3 my $self = shift;
140 2 50       3 $self->{critical} = shift if @_;
141 2 50       9 $self->{critical} || 0;
142             }
143              
144             sub value {
145 0     0 1 0 my $self = shift;
146 0 0       0 $self->{value} = shift if @_;
147             $self->{value} || undef
148 0 0       0 }
149              
150 4     4 1 14 sub type { shift->{type} }
151 0     0 1   sub valid { ! exists shift->{error} }
152 0     0 1   sub error { shift->{error} }
153 0     0 1   sub init { shift }
154              
155             1;
156              
157             __END__