File Coverage

blib/lib/Net/LDAP/Control.pm
Criterion Covered Total %
statement 21 46 45.6
branch 7 26 26.9
condition 6 29 20.6
subroutine 5 12 41.6
pod 10 10 100.0
total 49 123 39.8


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