Code

Removed mod_change
[gosa.git] / gosa-si / client / events / krb5.pm
1 package krb5;
2 use Exporter;
3 @ISA = qw(Exporter);
4 my @events = (
5     "get_events",
6     "krb5_list_principals",  
7     "krb5_list_policies",
8     "krb5_get_principal",
9     "krb5_create_principal",
10     "krb5_modify_principal",
11     "krb5_del_principal",
12     "krb5_get_policy",
13     "krb5_create_policy",
14     "krb5_modify_policy",
15     "krb5_del_policy",
16     "krb5_set_password",
17     );
18 @EXPORT = @events;
20 use strict;
21 use warnings;
22 use Data::Dumper;
23 use GOSA::GosaSupportDaemon;
24 use Authen::Krb5;
25 use Authen::Krb5::Admin qw(:constants);
27 BEGIN {}
29 END {}
31 ### Start ######################################################################
33 Authen::Krb5::init_context;
34 Authen::Krb5::init_ets;
36 my $krb_admin;
37 my $krb_password;
39 my %cfg_defaults = (
40 "krb5" => {
41    "admin" => [\$krb_admin, ""],
42    "password" => [\$krb_password, ""],
43    },
44 );
45 &read_configfile($main::cfg_file, %cfg_defaults);
48 sub read_configfile {
49     my ($cfg_file, %cfg_defaults) = @_;
50     my $cfg;
52     if( defined( $cfg_file) && ( (-s $cfg_file) > 0 )) {
53         if( -r $cfg_file ) {
54             $cfg = Config::IniFiles->new( -file => $cfg_file );
55         } else {
56             &main::daemon_log("ERROR: krb5.pm couldn't read config file!", 1);
57         }
58     } else {
59         $cfg = Config::IniFiles->new() ;
60     }
61     foreach my $section (keys %cfg_defaults) {
62         foreach my $param (keys %{$cfg_defaults{ $section }}) {
63             my $pinfo = $cfg_defaults{ $section }{ $param };
64             ${@$pinfo[0]} = $cfg->val( $section, $param, @$pinfo[1] );
65         }
66     }
67 }
70 sub get_events { return \@events; }
73 sub krb5_list_principals {
74     my ($msg, $msg_hash) = @_;
75     my $header = @{$msg_hash->{'header'}}[0];
76     my $source = @{$msg_hash->{'source'}}[0];
77     my $target = @{$msg_hash->{'target'}}[0];
78     my $session_id = @{$msg_hash->{'session_id'}}[0];
80     # build return message with twisted target and source
81     my $out_hash = &main::create_xml_hash("answer_$header", $target, $source);
82     &add_content2xml_hash($out_hash, "session_id", $session_id);
84     # Authenticate
85     my $kadm5 = Authen::Krb5::Admin->init_with_password($krb_admin, $krb_password);
86     if (not defined $kadm5){
87       &add_content2xml_hash($out_hash, "error", "Cannot connect to kadmin server");
88     } else {
89       my @principals= $kadm5->get_principals() or &add_content2xml_hash($out_hash, "error", Authen::Krb5::Admin::error);
90       for my $principal (@principals) {
91         &add_content2xml_hash($out_hash, "principal", $principal);
92       }
93     }
95     # return message
96     return &create_xml_string($out_hash);
97 }
100 sub krb5_create_principal {
101     my ($msg, $msg_hash) = @_;
102     my $header = @{$msg_hash->{'header'}}[0];
103     my $source = @{$msg_hash->{'source'}}[0];
104     my $target = @{$msg_hash->{'target'}}[0];
105     my $session_id = @{$msg_hash->{'session_id'}}[0];
107     # build return message with twisted target and source
108     my $out_hash = &main::create_xml_hash("answer_$header", $target, $source);
109     &add_content2xml_hash($out_hash, "session_id", $session_id);
111     # Sanity check
112     if (not defined @{$msg_hash->{'principal'}}[0]){
113       &add_content2xml_hash($out_hash, "error", "No principal specified");
114       return &create_xml_string($out_hash);
115     }
117     # Authenticate
118     my $kadm5 = Authen::Krb5::Admin->init_with_password($krb_admin, $krb_password);
119     my $principal;
120     if (not defined $kadm5){
121       &add_content2xml_hash($out_hash, "error", "Cannot connect to kadmin server");
122     } else {
123       $principal= Authen::Krb5::parse_name(@{$msg_hash->{'principal'}}[0]);
124       if(not defined $principal) {
125         &add_content2xml_hash($out_hash, "error", "Illegal principal name");
126       } else {
127         if ( $kadm5->get_principal($principal) or &add_content2xml_hash($out_hash, "error", Authen::Krb5::Admin::error)){
128           &add_content2xml_hash($out_hash, "error", "Principal exists");
129           return &create_xml_string($out_hash);
130         }
131       }
132     }
134     # return message
135     return &create_xml_string($out_hash);
139 sub krb5_modify_principal {
140     my ($msg, $msg_hash) = @_;
141     my $header = @{$msg_hash->{'header'}}[0];
142     my $source = @{$msg_hash->{'source'}}[0];
143     my $target = @{$msg_hash->{'target'}}[0];
144     my $session_id = @{$msg_hash->{'session_id'}}[0];
146     # build return message with twisted target and source
147     my $out_hash = &main::create_xml_hash("answer_$header", $target, $source);
148     &add_content2xml_hash($out_hash, "session_id", $session_id);
150     # Sanity check
151     if (not defined @{$msg_hash->{'principal'}}[0]){
152       &add_content2xml_hash($out_hash, "error", "No principal specified");
153       return &create_xml_string($out_hash);
154     }
156     # Authenticate
157     my $kadm5 = Authen::Krb5::Admin->init_with_password($krb_admin, $krb_password);
158     my $principal;
159     if (not defined $kadm5){
160       &add_content2xml_hash($out_hash, "error", "Cannot connect to kadmin server");
161     } else {
162       $principal= Authen::Krb5::parse_name(@{$msg_hash->{'principal'}}[0]);
163       if(not defined $principal) {
164         &add_content2xml_hash($out_hash, "error", "Illegal principal name");
165       } else {
166         if ( $kadm5->get_principal($principal) or &add_content2xml_hash($out_hash, "error", Authen::Krb5::Admin::error)){
167           &add_content2xml_hash($out_hash, "error", "Principal exists");
168           return &create_xml_string($out_hash);
169         }
170       }
171     }
173     # return message
174     return &create_xml_string($out_hash);
178 sub krb5_get_principal {
179     my ($msg, $msg_hash) = @_;
180     my $header = @{$msg_hash->{'header'}}[0];
181     my $source = @{$msg_hash->{'source'}}[0];
182     my $target = @{$msg_hash->{'target'}}[0];
183     my $session_id = @{$msg_hash->{'session_id'}}[0];
185     # build return message with twisted target and source
186     my $out_hash = &main::create_xml_hash("answer_$header", $target, $source);
187     &add_content2xml_hash($out_hash, "session_id", $session_id);
189     # Sanity check
190     if (not defined @{$msg_hash->{'principal'}}[0]){
191       &add_content2xml_hash($out_hash, "error", "No principal specified");
192       return &create_xml_string($out_hash);
193     }
195     # Authenticate
196     my $kadm5 = Authen::Krb5::Admin->init_with_password($krb_admin, $krb_password);
197     my $principal;
198     if (not defined $kadm5){
199       &add_content2xml_hash($out_hash, "error", "Cannot connect to kadmin server");
200     } else {
201       $principal= Authen::Krb5::parse_name(@{$msg_hash->{'principal'}}[0]);
202       if(not defined $principal) {
203         &add_content2xml_hash($out_hash, "error", "Illegal principal name");
204       } else {
205         my $data= $kadm5->get_principal($principal) or &add_content2xml_hash($out_hash, "error", Authen::Krb5::Admin::error);
206         &add_content2xml_hash($out_hash, "principal", @{$msg_hash->{'principal'}}[0]);
207         &add_content2xml_hash($out_hash, "mask", $data->mask);
208         &add_content2xml_hash($out_hash, "attributes", $data->attributes);
209         &add_content2xml_hash($out_hash, "aux_attributes", $data->aux_attributes);
210         &add_content2xml_hash($out_hash, "kvno", $data->kvno);
211         &add_content2xml_hash($out_hash, "max_life", $data->max_life);
212         &add_content2xml_hash($out_hash, "max_renewable_life", $data->max_renewable_life);
213         &add_content2xml_hash($out_hash, "aux_attributes", $data->aux_attributes);
214         &add_content2xml_hash($out_hash, "policy", $data->policy);
215         &add_content2xml_hash($out_hash, "fail_auth_count", $data->fail_auth_count);
216         &add_content2xml_hash($out_hash, "last_failed", $data->last_failed);
217         &add_content2xml_hash($out_hash, "last_pwd_change", $data->last_pwd_change);
218         &add_content2xml_hash($out_hash, "last_success", $data->last_success);
219         &add_content2xml_hash($out_hash, "mod_date", $data->mod_date);
220         &add_content2xml_hash($out_hash, "princ_expire_time", $data->princ_expire_time);
221         &add_content2xml_hash($out_hash, "pw_expiration", $data->pw_expiration);
222       }
223     }
225     # return message
226     return &create_xml_string($out_hash);
230 sub krb5_del_principal {
231     my ($msg, $msg_hash) = @_;
232     my $header = @{$msg_hash->{'header'}}[0];
233     my $source = @{$msg_hash->{'source'}}[0];
234     my $target = @{$msg_hash->{'target'}}[0];
235     my $session_id = @{$msg_hash->{'session_id'}}[0];
237     # build return message with twisted target and source
238     my $out_hash = &main::create_xml_hash("answer_$header", $target, $source);
239     &add_content2xml_hash($out_hash, "session_id", $session_id);
241     # Sanity check
242     if (not defined @{$msg_hash->{'principal'}}[0]){
243       &add_content2xml_hash($out_hash, "error", "No principal specified");
244       return &create_xml_string($out_hash);
245     }
247     # Authenticate
248     my $kadm5 = Authen::Krb5::Admin->init_with_password($krb_admin, $krb_password);
249     my $principal;
250     if (not defined $kadm5){
251       &add_content2xml_hash($out_hash, "error", "Cannot connect to kadmin server");
252     } else {
253       $principal= Authen::Krb5::parse_name(@{$msg_hash->{'principal'}}[0]);
254       if(not defined $principal) {
255         &add_content2xml_hash($out_hash, "error", "Illegal principal name");
256       } else {
257         $kadm5->delete_principal($principal) or &add_content2xml_hash($out_hash, "error", Authen::Krb5::Admin::error);
258       }
259     }
261     # return message
262     return &create_xml_string($out_hash);
266 sub krb5_list_policies {
267     my ($msg, $msg_hash) = @_;
268     my $header = @{$msg_hash->{'header'}}[0];
269     my $source = @{$msg_hash->{'source'}}[0];
270     my $target = @{$msg_hash->{'target'}}[0];
271     my $session_id = @{$msg_hash->{'session_id'}}[0];
273     # build return message with twisted target and source
274     my $out_hash = &main::create_xml_hash("answer_$header", $target, $source);
275     &add_content2xml_hash($out_hash, "session_id", $session_id);
277     # Authenticate
278     my $kadm5 = Authen::Krb5::Admin->init_with_password($krb_admin, $krb_password);
279     if (not defined $kadm5){
280       &add_content2xml_hash($out_hash, "error", "Cannot connect to kadmin server");
281     } else {
282       my @policies= $kadm5->get_policies() or &add_content2xml_hash($out_hash, "error", Authen::Krb5::Admin::error);
283       for my $policy (@policies) {
284         &add_content2xml_hash($out_hash, "policy", $policy);
285       }
286     }
288     # return message
289     return &create_xml_string($out_hash);
293 sub krb5_get_policy {
294     my ($msg, $msg_hash) = @_;
295     my $header = @{$msg_hash->{'header'}}[0];
296     my $source = @{$msg_hash->{'source'}}[0];
297     my $target = @{$msg_hash->{'target'}}[0];
298     my $session_id = @{$msg_hash->{'session_id'}}[0];
300     # build return message with twisted target and source
301     my $out_hash = &main::create_xml_hash("answer_$header", $target, $source);
302     &add_content2xml_hash($out_hash, "session_id", $session_id);
304     # Sanity check
305     if (not defined @{$msg_hash->{'policy'}}[0]){
306       &add_content2xml_hash($out_hash, "error", "No policy specified");
307       return &create_xml_string($out_hash);
308     }
310     # Authenticate
311     my $kadm5 = Authen::Krb5::Admin->init_with_password($krb_admin, $krb_password);
312     my $principal;
313     if (not defined $kadm5){
314       &add_content2xml_hash($out_hash, "error", "Cannot connect to kadmin server");
315     } else {
316       my $data= $kadm5->get_policy(@{$msg_hash->{'policy'}}[0]) or &add_content2xml_hash($out_hash, "error", Authen::Krb5::Admin::error);
317       &add_content2xml_hash($out_hash, "name", $data->name);
318       &add_content2xml_hash($out_hash, "mask", $data->mask);
319       &add_content2xml_hash($out_hash, "pw_history_num", $data->pw_history_num);
320       &add_content2xml_hash($out_hash, "pw_max_life", $data->pw_max_life);
321       &add_content2xml_hash($out_hash, "pw_min_classes", $data->pw_min_classes);
322       &add_content2xml_hash($out_hash, "pw_min_length", $data->pw_min_length);
323       &add_content2xml_hash($out_hash, "pw_min_life", $data->pw_min_life);
324       &add_content2xml_hash($out_hash, "policy_refcnt", $data->policy_refcnt);
325     }
327     # return message
328     return &create_xml_string($out_hash);
332 sub krb5_create_policy {
333     my ($msg, $msg_hash) = @_;
334     my $header = @{$msg_hash->{'header'}}[0];
335     my $source = @{$msg_hash->{'source'}}[0];
336     my $target = @{$msg_hash->{'target'}}[0];
337     my $session_id = @{$msg_hash->{'session_id'}}[0];
339     # build return message with twisted target and source
340     my $out_hash = &main::create_xml_hash("answer_krb5_list_principals", $target, $source);
341     my $out_msg = &create_xml_string($out_hash);
343     # return message
344     return $out_msg;
350 sub krb5_modify_policy {
351     my ($msg, $msg_hash) = @_;
352     my $header = @{$msg_hash->{'header'}}[0];
353     my $source = @{$msg_hash->{'source'}}[0];
354     my $target = @{$msg_hash->{'target'}}[0];
355     my $session_id = @{$msg_hash->{'session_id'}}[0];
357     # build return message with twisted target and source
358     my $out_hash = &main::create_xml_hash("answer_krb5_list_principals", $target, $source);
359     my $out_msg = &create_xml_string($out_hash);
361     # return message
362     return $out_msg;
368 sub krb5_del_policy {
369     my ($msg, $msg_hash) = @_;
370     my $header = @{$msg_hash->{'header'}}[0];
371     my $source = @{$msg_hash->{'source'}}[0];
372     my $target = @{$msg_hash->{'target'}}[0];
373     my $session_id = @{$msg_hash->{'session_id'}}[0];
375     # build return message with twisted target and source
376     my $out_hash = &main::create_xml_hash("answer_$header", $target, $source);
377     &add_content2xml_hash($out_hash, "session_id", $session_id);
379     # Sanity check
380     if (not defined @{$msg_hash->{'policy'}}[0]){
381       &add_content2xml_hash($out_hash, "error", "No policy specified");
382       return &create_xml_string($out_hash);
383     }
385     # Authenticate
386     my $kadm5 = Authen::Krb5::Admin->init_with_password($krb_admin, $krb_password);
387     my $policy;
388     if (not defined $kadm5){
389       &add_content2xml_hash($out_hash, "error", "Cannot connect to kadmin server");
390     } else {
391       $kadm5->delete_policy($policy) or &add_content2xml_hash($out_hash, "error", Authen::Krb5::Admin::error);
392     }
394     # return message
395     return &create_xml_string($out_hash);
398 sub krb5_set_password {
399     my ($msg, $msg_hash) = @_;
400     my $header = @{$msg_hash->{'header'}}[0];
401     my $source = @{$msg_hash->{'source'}}[0];
402     my $target = @{$msg_hash->{'target'}}[0];
403     my $session_id = @{$msg_hash->{'session_id'}}[0];
405     # build return message with twisted target and source
406     my $out_hash = &main::create_xml_hash("answer_$header", $target, $source);
407     &add_content2xml_hash($out_hash, "session_id", $session_id);
409     # Sanity check
410     if (not defined @{$msg_hash->{'principal'}}[0]){
411       &add_content2xml_hash($out_hash, "error", "No principal specified");
412       return &create_xml_string($out_hash);
413     }
414     if (not defined @{$msg_hash->{'password'}}[0]){
415       &add_content2xml_hash($out_hash, "error", "No password specified");
416       return &create_xml_string($out_hash);
417     }
419     # Authenticate
420     my $kadm5 = Authen::Krb5::Admin->init_with_password($krb_admin, $krb_password);
421     my $principal;
422     if (not defined $kadm5){
423       &add_content2xml_hash($out_hash, "error", "Cannot connect to kadmin server");
424     } 
426     $principal= Authen::Krb5::parse_name(@{$msg_hash->{'principal'}}[0]);
427     if(not defined $principal) {
428       &add_content2xml_hash($out_hash, "error", "Illegal principal name");
429     } else {
430       $kadm5->chpass_principal($principal, @{$msg_hash->{'password'}}[0]) or &add_content2xml_hash($out_hash, "error", Authen::Krb5::Admin::error);
431     }
433     # return message
434     return &create_xml_string($out_hash);
436 1;