File Coverage

blib/lib/Wizard/LDAP.pm
Criterion Covered Total %
statement 4 6 66.6
branch n/a
condition n/a
subroutine 2 2 100.0
pod n/a
total 6 8 75.0


line stmt bran cond sub pod time code
1             # -*- perl -*-
2              
3 1     1   2273 use Socket ();
  1         4881  
  1         36  
4 1     1   506 use Wizard ();
  0            
  0            
5             use Wizard::State ();
6             use Wizard::SaveAble();
7             use Wizard::LDAP::Config ();
8              
9             package Wizard::LDAP;
10              
11             @Wizard::LDAP::ISA = qw(Wizard::State);
12             $Wizard::LDAP::VERSION = '0.1008';
13              
14             sub init {
15             my $self = shift;
16             my $item = $self->{'prefs'} || die "Missing prefs";
17             my $admin = { 'ldap-admin-dn' => $item->{'ldap-prefs-adminDN'},
18             'ldap-admin-password' => $item->{'ldap-prefs-adminPassword'} };
19             ($item, $admin);
20             }
21              
22             sub Action_Reset {
23             my($self, $wiz) = @_;
24              
25             # Load prefs, if required.
26             unless ($self->{'prefs'}) {
27             my $cfg = $Wizard::LDAP::Config::config;
28             my $file = $cfg->{'ldap-prefs-file'};
29             $self->{'prefs'} = Wizard::SaveAble->new('file' => $file, 'load' => 1);
30             }
31             $self->Store($wiz);
32              
33             # Return the initial menu.
34             (['Wizard::Elem::Title', 'value' => 'LDAP Wizard Menu '],
35             ['Wizard::Elem::Submit', 'value' => 'User Menu',
36             'name' => 'Wizard::LDAP::User::Action_Reset',
37             'id' => 1],
38             ['Wizard::Elem::Submit', 'value' => 'Net Menu',
39             'name' => 'Wizard::LDAP::Net::Action_Reset',
40             'id' => 2],
41             ['Wizard::Elem::BR'],
42             ['Wizard::Elem::Submit', 'value' => 'LDAP Wizard preferences',
43             'name' => 'Action_Preferences',
44             'id' => 3],
45             ['Wizard::Elem::BR'],
46             ['Wizard::Elem::Submit', 'value' => 'Exit LDAP Wizard',
47             'id' => 99]);
48             }
49              
50             sub Action_Preferences {
51             my($self, $wiz) = @_;
52             my ($prefs, $admin) = $self->init();
53              
54             # Return a list of input elements.
55             (['Wizard::Elem::Title', 'value' => 'LDAP Wizard Preferences'],
56             ['Wizard::Elem::Text', 'name' => 'ldap-prefs-serverip',
57             'value' => $prefs->{'ldap-prefs-serverip'},
58             'descr' => 'Server DNS name or IP Adress of the LDAP Server'],
59             ['Wizard::Elem::Text', 'name' => 'ldap-prefs-serverport',
60             'value' => $prefs->{'ldap-prefs-serverport'},
61             'descr' => 'Server Port of the LDAP Server (default LDAP port on 0)'],
62             ['Wizard::Elem::Text', 'name' => 'ldap-prefs-adminDN',
63             'value' => $prefs->{'ldap-prefs-adminDN'},
64             'descr' => 'Distinguished name of the admin object we bind as ' .
65             'to the server'],
66             ['Wizard::Elem::Text', 'name' => 'ldap-prefs-adminPassword',
67             'value' => $prefs->{'ldap-prefs-adminPassword'},
68             'descr' => 'Password of the admin object'],
69             ['Wizard::Elem::Text', 'name' => 'ldap-prefs-nextuid',
70             'value' => $prefs->{'ldap-prefs-nextuid'} || '500',
71             'descr' => 'Next UID that will be assigned (increased automatically'],
72             ['Wizard::Elem::Text', 'name' => 'ldap-prefs-gid',
73             'value' => $prefs->{'ldap-prefs-gid'} || '500',
74             'descr' => 'Group ID of the group the users will belong to'],
75             ['Wizard::Elem::Text', 'name' => 'ldap-prefs-home',
76             'value' => $prefs->{'ldap-prefs-home'} || '/home',
77             'descr' => 'Homedir prefix'],
78             ['Wizard::Elem::Text', 'name' => 'ldap-prefs-userbase',
79             'value' => $prefs->{'ldap-prefs-userbase'} || 'dc=ispsoft, c=de',
80             'descr' => 'LDAP base for user administration'],
81             ['Wizard::Elem::Text', 'name' => 'ldap-prefs-netbase',
82             'value' => $prefs->{'ldap-prefs-netbase'} || 'dc=ispsoft, c=de',
83             'descr' => 'LDAP base for net administration'],
84             ['Wizard::Elem::Text', 'name' => 'ldap-prefs-domain',
85             'value' => $prefs->{'ldap-prefs-domain'} || '',
86             'descr' => 'Default domain for user administration'],
87             ['Wizard::Elem::Text', 'name' => 'ldap-prefs-prefschange',
88             'value' => $prefs->{'ldap-prefs-prefschange'} || '',
89             'descr' => 'Shell command after the prefs have been changed'],
90             ['Wizard::Elem::Text', 'name' => 'ldap-prefs-hostchange',
91             'value' => $prefs->{'ldap-prefs-hostchange'} || '',
92             'descr' => 'Shell command after Hosts have been changed'],
93             ['Wizard::Elem::Text', 'name' => 'ldap-prefs-netchange',
94             'value' => $prefs->{'ldap-prefs-netchange'} || '',
95             'descr' => 'Shell command after Nets have been changed'],
96             ['Wizard::Elem::Text', 'name' => 'ldap-prefs-userchange-new',
97             'value' => $prefs->{'ldap-prefs-userchange-new'} || '',
98             'descr' => 'Shell command after an user has been created'],
99             ['Wizard::Elem::Text', 'name' => 'ldap-prefs-userchange-modify',
100             'value' => $prefs->{'ldap-prefs-userchange-modify'} || '',
101             'descr' => 'Shell command after an user has been modified'],
102             ['Wizard::Elem::Text', 'name' => 'ldap-prefs-userchange-delete',
103             'value' => $prefs->{'ldap-prefs-userchange-delete'} || '',
104             'descr' => 'Shell command after an user has been deleted'],
105             ['Wizard::Elem::Submit', 'name' => 'Action_PreferencesSave',
106             'value' => 'Save these settings', 'id' => 1],
107             ['Wizard::Elem::Submit', 'name' => 'Action_PreferencesReset',
108             'value' => 'Reset this form', 'id' => 98],
109             ['Wizard::Elem::Submit', 'name' => 'Action_Reset',
110             'value' => 'Return to top menu', 'id' => 99]);
111             }
112              
113              
114             #
115             # universal method, that is supposed to be used by subclasses
116             #
117             sub ItemList {
118             my($self, $prefs, $admin, $base, $key) = @_;
119              
120             my $ldap = Net::LDAP->new($prefs->{'ldap-prefs-serverip'},
121             (($prefs->{'ldap-prefs-serverport'} >0) ?
122             (port => $prefs->{'ldap-prefs-serverport'}) : ()));
123             die "Could not create LDAP object, maybe connecting is currently not "
124             . "possible , probable cause: $@"
125             unless ref($ldap);
126              
127             my $dn = $admin->{'ldap-admin-dn'};
128             my $password = $admin->{'ldap-admin-password'};
129             $ldap->bind(dn => $dn, password => $password)
130             || die "Cannot bind to LDAP server $@";
131             my $mesg = $ldap->search(base => $base,
132             filter => $key . '=*',
133             scope => 1);
134             die ("Following error occured while searching for $base: code=",
135             $mesg->code, ", error=", $mesg->error) if $mesg->code;
136              
137             my @items = map { ($_->get($key)) } $mesg->entries;
138             $ldap->unbind();
139             wantarray ? @items : $mesg;
140             }
141              
142              
143             sub Action_PreferencesSave {
144             my($self, $wiz) = @_;
145             my ($prefs, $admin) = $self->init();
146             foreach my $opt ($wiz->param()) {
147             $prefs->{$opt} = $wiz->param($opt)
148             if (($opt =~ /^ldap\-prefs/) && (defined($wiz->param($opt))));
149             }
150              
151             my $errors = '';
152             my $ip = $prefs->{'ldap-prefs-serverip'}
153             or ($errors .= "Missing Server IP or DNS name.\n");
154             my $adminDN = $prefs->{'ldap-prefs-adminDN'}
155             or ($errors .= "Missing admin DN.\n");
156             my $port = $prefs->{'ldap-prefs-serverport'};
157             my $uid = $prefs->{'ldap-prefs-nextuid'};
158             my $gid = $prefs->{'ldap-prefs-gid'};
159             my $home = $prefs->{'ldap-prefs-home'};
160             if($ip) {
161             unless(Socket::inet_aton($ip)) {
162             $errors .= "Unresolveable server DNS name $ip.\n";
163             }
164             }
165             $port = 0 if $port eq '';
166             $errors .= "Invalid port $port.\n" unless $port =~ /^[\d]*$/;
167             $errors .= "Invalid UID $uid" unless $uid =~ /^[\d]+$/;
168             $errors .= "Invalid GID $gid" unless $gid =~ /^[\d]+$/;
169             if ($home =~ /^((\/[^\/]+)+)\/?$/) {
170             $prefs->{'ldap-prefs-home'} = $home = $1;
171             } else {
172             $errors .= "Invalid home $home";
173             }
174             die $errors if $errors;
175             $prefs->Modified(1);
176             $self->Store($wiz, 1);
177             $self->OnChange('prefs');
178             $self->Action_Reset($wiz);
179             }
180              
181             sub Action_PreferencesReset {
182             my($self, $wiz) = @_;
183             $self->Action_Reset($wiz);
184             $self->Action_Preferences($wiz);
185             }
186              
187             sub OnChange {
188             my $self = shift; my $topic = shift;
189             my $mode = shift || '';
190             my $subst = shift || {};
191             my($prefs) = $self->init();
192             my $cmd = $prefs->{'ldap-prefs-' . $topic . 'change' . $mode};
193             my ($k, $s);
194             while(($k, $s) = each %$subst) {
195             $cmd =~ s/\$$k/$s/g;
196             }
197             my $file = $cmd; $file =~ s/\ .*//g;
198             `$cmd` if(-f $file);
199             }
200              
201              
202             1;
203              
204              
205             __END__