Code

Updated acl listUpdated acl list
[gosa.git] / gosa-si / client / events / krb5.pm
1 package krb5;
4 use strict;
5 use warnings;
7 use Exporter;
8 use GOSA::GosaSupportDaemon;
9 use Authen::Krb5;
10 use Authen::Krb5::Admin qw(:constants);
12 our @ISA = qw(Exporter);
14 my @events = (
15     "get_events",
16     "krb5_list_principals",  
17     "krb5_list_policies",
18     "krb5_get_principal",
19     "krb5_create_principal",
20     "krb5_modify_principal",
21     "krb5_del_principal",
22     "krb5_get_policy",
23     "krb5_create_policy",
24     "krb5_modify_policy",
25     "krb5_del_policy",
26     "krb5_set_password",
27     );
28     
29 our @EXPORT = @events;
31 BEGIN {}
33 END {}
35 ### Start ######################################################################
37 Authen::Krb5::init_context;
38 Authen::Krb5::init_ets;
40 my $krb_admin;
41 my $krb_password;
43 my %cfg_defaults = (
44 "krb5" => {
45    "admin" => [\$krb_admin, ""],
46    "password" => [\$krb_password, ""],
47    },
48 );
49 &krb5_read_configfile($main::cfg_file, %cfg_defaults);
52 sub krb5_read_configfile {
53     my ($cfg_file, %cfg_defaults) = @_;
54     my $cfg;
56     if( defined( $cfg_file) && ( (-s $cfg_file) > 0 )) {
57         if( -r $cfg_file ) {
58             $cfg = Config::IniFiles->new( -file => $cfg_file );
59         } else {
60             &main::daemon_log("ERROR: krb5.pm couldn't read config file!", 1);
61         }
62     } else {
63         $cfg = Config::IniFiles->new() ;
64     }
65     foreach my $section (keys %cfg_defaults) {
66         foreach my $param (keys %{$cfg_defaults{ $section }}) {
67             my $pinfo = $cfg_defaults{ $section }{ $param };
68             ${@$pinfo[0]} = $cfg->val( $section, $param, @$pinfo[1] );
69         }
70     }
71 }
74 sub get_events { return \@events; }
77 sub krb5_list_principals {
78     my ($msg, $msg_hash) = @_;
79     my $header = @{$msg_hash->{'header'}}[0];
80     my $source = @{$msg_hash->{'source'}}[0];
81     my $target = @{$msg_hash->{'target'}}[0];
82     my $session_id = @{$msg_hash->{'session_id'}}[0];
84     # build return message with twisted target and source
85     my $out_hash = &main::create_xml_hash("answer_$header", $target, $source);
86     &add_content2xml_hash($out_hash, "session_id", $session_id);
88     # Authenticate
89     my $kadm5 = Authen::Krb5::Admin->init_with_password($krb_admin, $krb_password);
90     if (not defined $kadm5){
91       &add_content2xml_hash($out_hash, "error", "Cannot connect to kadmin server");
92     } else {
93       my @principals= $kadm5->get_principals() or &add_content2xml_hash($out_hash, "error", Authen::Krb5::Admin::error);
94       for my $principal (@principals) {
95         &add_content2xml_hash($out_hash, "principal", $principal);
96       }
97     }
99     my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
100     if (defined $forward_to_gosa) {
101         &add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
102     }
104     # return message
105     return &create_xml_string($out_hash);
109 sub krb5_create_principal {
110     my ($msg, $msg_hash) = @_;
111     my $header = @{$msg_hash->{'header'}}[0];
112     my $source = @{$msg_hash->{'source'}}[0];
113     my $target = @{$msg_hash->{'target'}}[0];
114     my $session_id = @{$msg_hash->{'session_id'}}[0];
115     my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
117     # build return message with twisted target and source
118     my $out_hash = &main::create_xml_hash("answer_$header", $target, $source);
119     &add_content2xml_hash($out_hash, "session_id", $session_id);
121     # Sanity check
122     if (not defined @{$msg_hash->{'principal'}}[0]){
123       &add_content2xml_hash($out_hash, "error", "No principal specified");
124       return &create_xml_string($out_hash);
125     }
127     # Authenticate
128     my $kadm5 = Authen::Krb5::Admin->init_with_password($krb_admin, $krb_password);
129     my $principal;
130     if (not defined $kadm5){
131       &add_content2xml_hash($out_hash, "error", "Cannot connect to kadmin server");
132     } else {
133       $principal= Authen::Krb5::parse_name(@{$msg_hash->{'principal'}}[0]);
134       if(not defined $principal) {
135         &add_content2xml_hash($out_hash, "error", "Illegal principal name");
136       } else {
137         if ( $kadm5->get_principal($principal)){
138           &add_content2xml_hash($out_hash, "error", "Principal exists");
139           if (defined $forward_to_gosa) {
140               &add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
141           }
142           return &create_xml_string($out_hash);
143         }
145         my $princ= Authen::Krb5::Admin::Principal->new;
146         foreach ('mask', 'attributes', 'aux_attributes', 'max_life', 'max_renewable_life', 
147                  'policy', 'princ_expire_time', 'pw_expiration'){
149           if (defined @{$msg_hash->{$_}}[0]){
150             $princ->$_(@{$msg_hash->{$_}}[0]);
151           }
152         }
154         $princ->principal($principal);
155         $kadm5->create_principal($princ, join '', map { chr rand(255) + 1 } 1..256) or &add_content2xml_hash($out_hash, "error", Authen::Krb5::Admin::error);
157         # Directly randomize key
158         $kadm5->randkey_principal($principal);
159       }
160     }
162     if (defined $forward_to_gosa) {
163         &add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
164     }
166     # return message
167     return &create_xml_string($out_hash);
171 sub krb5_modify_principal {
172     my ($msg, $msg_hash) = @_;
173     my $header = @{$msg_hash->{'header'}}[0];
174     my $source = @{$msg_hash->{'source'}}[0];
175     my $target = @{$msg_hash->{'target'}}[0];
176     my $session_id = @{$msg_hash->{'session_id'}}[0];
177     my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
179     # build return message with twisted target and source
180     my $out_hash = &main::create_xml_hash("answer_$header", $target, $source);
181     &add_content2xml_hash($out_hash, "session_id", $session_id);
183     # Sanity check
184     if (not defined @{$msg_hash->{'principal'}}[0]){
185         &add_content2xml_hash($out_hash, "error", "No principal specified");
186         if (defined $forward_to_gosa) {
187             &add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
188         }
189         return &create_xml_string($out_hash);
190     }
192     # Authenticate
193     my $kadm5 = Authen::Krb5::Admin->init_with_password($krb_admin, $krb_password);
194     my $principal;
195     if (not defined $kadm5){
196       &add_content2xml_hash($out_hash, "error", "Cannot connect to kadmin server");
197     } else {
198       $principal= Authen::Krb5::parse_name(@{$msg_hash->{'principal'}}[0]);
199       if(not defined $principal) {
200         &add_content2xml_hash($out_hash, "error", "Illegal principal name");
201       } else {
202         if (not $kadm5->get_principal($principal)){
203           &add_content2xml_hash($out_hash, "error", "Principal does not exists");
204           if (defined $forward_to_gosa) {
205               &add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
206           }
207           return &create_xml_string($out_hash);
208         }
210         my $princ= Authen::Krb5::Admin::Principal->new;
211         foreach ('mask', 'attributes', 'aux_attributes', 'max_life', 'max_renewable_life', 
212                  'policy', 'princ_expire_time', 'pw_expiration'){
214           if (defined @{$msg_hash->{$_}}[0]){
215             $princ->$_(@{$msg_hash->{$_}}[0]);
216           }
217         }
219         $princ->principal($principal);
220         $kadm5->modify_principal($princ) or &add_content2xml_hash($out_hash, "error", Authen::Krb5::Admin::error);
221       }
222     }
224     if (defined $forward_to_gosa) {
225         &add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
226     }
228     # return message
229     return &create_xml_string($out_hash);
233 sub krb5_get_principal {
234     my ($msg, $msg_hash) = @_;
235     my $header = @{$msg_hash->{'header'}}[0];
236     my $source = @{$msg_hash->{'source'}}[0];
237     my $target = @{$msg_hash->{'target'}}[0];
238     my $session_id = @{$msg_hash->{'session_id'}}[0];
239     my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
241     # build return message with twisted target and source
242     my $out_hash = &main::create_xml_hash("answer_$header", $target, $source);
243     &add_content2xml_hash($out_hash, "session_id", $session_id);
245     # Sanity check
246     if (not defined @{$msg_hash->{'principal'}}[0]){
247       &add_content2xml_hash($out_hash, "error", "No principal specified");
248       if (defined $forward_to_gosa) {
249           &add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
250       }
251       return &create_xml_string($out_hash);
252     }
254     # Authenticate
255     my $kadm5 = Authen::Krb5::Admin->init_with_password($krb_admin, $krb_password);
256     my $principal;
257     if (not defined $kadm5){
258       &add_content2xml_hash($out_hash, "error", "Cannot connect to kadmin server");
259     } else {
260       $principal= Authen::Krb5::parse_name(@{$msg_hash->{'principal'}}[0]);
261       if(not defined $principal) {
262         &add_content2xml_hash($out_hash, "error", "Illegal principal name");
263       } else {
264         my $data= $kadm5->get_principal($principal) or &add_content2xml_hash($out_hash, "error", Authen::Krb5::Admin::error);
265         &add_content2xml_hash($out_hash, "principal", @{$msg_hash->{'principal'}}[0]);
266         &add_content2xml_hash($out_hash, "mask", $data->mask);
267         &add_content2xml_hash($out_hash, "attributes", $data->attributes);
268         &add_content2xml_hash($out_hash, "kvno", $data->kvno);
269         &add_content2xml_hash($out_hash, "max_life", $data->max_life);
270         &add_content2xml_hash($out_hash, "max_renewable_life", $data->max_renewable_life);
271         &add_content2xml_hash($out_hash, "aux_attributes", $data->aux_attributes);
272         &add_content2xml_hash($out_hash, "policy", $data->policy);
273         &add_content2xml_hash($out_hash, "fail_auth_count", $data->fail_auth_count);
274         &add_content2xml_hash($out_hash, "last_failed", $data->last_failed);
275         &add_content2xml_hash($out_hash, "last_pwd_change", $data->last_pwd_change);
276         &add_content2xml_hash($out_hash, "last_success", $data->last_success);
277         &add_content2xml_hash($out_hash, "mod_date", $data->mod_date);
278         &add_content2xml_hash($out_hash, "princ_expire_time", $data->princ_expire_time);
279         &add_content2xml_hash($out_hash, "pw_expiration", $data->pw_expiration);
280       }
281     }
283     if (defined $forward_to_gosa) {
284         &add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
285     }
287     # return message
288     return &create_xml_string($out_hash);
292 sub krb5_del_principal {
293     my ($msg, $msg_hash) = @_;
294     my $header = @{$msg_hash->{'header'}}[0];
295     my $source = @{$msg_hash->{'source'}}[0];
296     my $target = @{$msg_hash->{'target'}}[0];
297     my $session_id = @{$msg_hash->{'session_id'}}[0];
298     my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[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->{'principal'}}[0]){
306         if (defined $forward_to_gosa) {
307             &add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
308         }
309         &add_content2xml_hash($out_hash, "error", "No principal specified");
310         return &create_xml_string($out_hash);
311     }
313     # Authenticate
314     my $kadm5 = Authen::Krb5::Admin->init_with_password($krb_admin, $krb_password);
315     my $principal;
316     if (not defined $kadm5){
317       &add_content2xml_hash($out_hash, "error", "Cannot connect to kadmin server");
318     } else {
319       $principal= Authen::Krb5::parse_name(@{$msg_hash->{'principal'}}[0]);
320       if(not defined $principal) {
321         &add_content2xml_hash($out_hash, "error", "Illegal principal name");
322       } else {
323         $kadm5->delete_principal($principal) or &add_content2xml_hash($out_hash, "error", Authen::Krb5::Admin::error);
324       }
325     }
327     if (defined $forward_to_gosa) {
328         &add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
329     }
331     # return message
332     return &create_xml_string($out_hash);
336 sub krb5_list_policies {
337     my ($msg, $msg_hash) = @_;
338     my $header = @{$msg_hash->{'header'}}[0];
339     my $source = @{$msg_hash->{'source'}}[0];
340     my $target = @{$msg_hash->{'target'}}[0];
341     my $session_id = @{$msg_hash->{'session_id'}}[0];
343     # build return message with twisted target and source
344     my $out_hash = &main::create_xml_hash("answer_$header", $target, $source);
345     &add_content2xml_hash($out_hash, "session_id", $session_id);
347     # Authenticate
348     my $kadm5 = Authen::Krb5::Admin->init_with_password($krb_admin, $krb_password);
349     if (not defined $kadm5){
350       &add_content2xml_hash($out_hash, "error", "Cannot connect to kadmin server");
351     } else {
352       my @policies= $kadm5->get_policies(); # or &add_content2xml_hash($out_hash, "error", Authen::Krb5::Admin::error);
353       for my $policy (@policies) {
354         &add_content2xml_hash($out_hash, "policy", $policy);
355       }
356     }
358     my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
359     if (defined $forward_to_gosa) {
360         &add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
361     }
363     # return message
364     return &create_xml_string($out_hash);
368 sub krb5_get_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];
374     my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
376     # build return message with twisted target and source
377     my $out_hash = &main::create_xml_hash("answer_$header", $target, $source);
378     &add_content2xml_hash($out_hash, "session_id", $session_id);
380     # Sanity check
381     if (not defined @{$msg_hash->{'policy'}}[0]){
382         &add_content2xml_hash($out_hash, "error", "No policy specified");
383         if (defined $forward_to_gosa) {
384             &add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
385         }
386         return &create_xml_string($out_hash);
387     }
389     # Authenticate
390     my $kadm5 = Authen::Krb5::Admin->init_with_password($krb_admin, $krb_password);
391     my $principal;
392     if (not defined $kadm5){
393       &add_content2xml_hash($out_hash, "error", "Cannot connect to kadmin server");
394     } else {
395       my $data= $kadm5->get_policy(@{$msg_hash->{'policy'}}[0]) or &add_content2xml_hash($out_hash, "error", Authen::Krb5::Admin::error);
396       &add_content2xml_hash($out_hash, "name", $data->name);
397       &add_content2xml_hash($out_hash, "mask", $data->mask);
398       &add_content2xml_hash($out_hash, "pw_history_num", $data->pw_history_num);
399       &add_content2xml_hash($out_hash, "pw_max_life", $data->pw_max_life);
400       &add_content2xml_hash($out_hash, "pw_min_classes", $data->pw_min_classes);
401       &add_content2xml_hash($out_hash, "pw_min_length", $data->pw_min_length);
402       &add_content2xml_hash($out_hash, "pw_min_life", $data->pw_min_life);
403       &add_content2xml_hash($out_hash, "policy_refcnt", $data->policy_refcnt);
404     }
406     if (defined $forward_to_gosa) {
407         &add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
408     }
410     # return message
411     return &create_xml_string($out_hash);
415 sub krb5_create_policy {
416     my ($msg, $msg_hash) = @_;
417     my $header = @{$msg_hash->{'header'}}[0];
418     my $source = @{$msg_hash->{'source'}}[0];
419     my $target = @{$msg_hash->{'target'}}[0];
420     my $session_id = @{$msg_hash->{'session_id'}}[0];
421     my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
423     # Build return message
424     my $out_hash = &main::create_xml_hash("answer_$header", $target, $source);
425     &add_content2xml_hash($out_hash, "session_id", $session_id);
427     # Sanity check
428     if (not defined @{$msg_hash->{'policy'}}[0]){
429         &add_content2xml_hash($out_hash, "error", "No policy specified");
430         if (defined $forward_to_gosa) {
431             &add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
432         }
434         return &create_xml_string($out_hash);
435     }
436     &add_content2xml_hash($msg_hash, "name", @{$msg_hash->{'policy'}}[0]);
438     # Authenticate
439     my $kadm5 = Authen::Krb5::Admin->init_with_password($krb_admin, $krb_password);
440     if (not defined $kadm5){
441         &add_content2xml_hash($out_hash, "error", "Cannot connect to kadmin server");
442     } else {
443         if ( $kadm5->get_policy(@{$msg_hash->{'policy'}}[0])) {
444             &add_content2xml_hash($out_hash, "error", "Policy exists");
445             if (defined $forward_to_gosa) {
446                 &add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
447             }
448             return &create_xml_string($out_hash);
449         }
451       my $pol = Authen::Krb5::Admin::Policy->new;
453       # Move information from xml message to modifyer
454       foreach ('name', 'mask', 'pw_history_num', 'pw_max_life', 'pw_min_classes',
455                 'pw_min_length', 'pw_min_life'){
457         if (defined @{$msg_hash->{$_}}[0]){
458           $pol->$_(@{$msg_hash->{$_}}[0]);
459         }
460       }
462       # Create info
463       $kadm5->create_policy($pol) or &add_content2xml_hash($out_hash, "error", Authen::Krb5::Admin::error);
464     }
466     if (defined $forward_to_gosa) {
467         &add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
468     }
470     # build return message with twisted target and source
471     my $out_msg = &create_xml_string($out_hash);
473     # return message
474     return $out_msg;
478 sub krb5_modify_policy {
479     my ($msg, $msg_hash) = @_;
480     my $header = @{$msg_hash->{'header'}}[0];
481     my $source = @{$msg_hash->{'source'}}[0];
482     my $target = @{$msg_hash->{'target'}}[0];
483     my $session_id = @{$msg_hash->{'session_id'}}[0];
484     my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
486     # Build return message
487     my $out_hash = &main::create_xml_hash("answer_$header", $target, $source);
488     &add_content2xml_hash($out_hash, "session_id", $session_id);
490     # Sanity check
491     if (not defined @{$msg_hash->{'policy'}}[0]){
492         if (defined $forward_to_gosa) {
493             &add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
494         }
495         &add_content2xml_hash($out_hash, "error", "No policy specified");
496         return &create_xml_string($out_hash);
497     }
498     &add_content2xml_hash($msg_hash, "name", @{$msg_hash->{'policy'}}[0]);
500     # Authenticate
501     my $kadm5 = Authen::Krb5::Admin->init_with_password($krb_admin, $krb_password);
502     if (not defined $kadm5){
503       &add_content2xml_hash($out_hash, "error", "Cannot connect to kadmin server");
504     } else {
505       my $pol = Authen::Krb5::Admin::Policy->new;
507       # Move information from xml message to modifyer
508       foreach ('name', 'mask', 'pw_history_num', 'pw_max_life', 'pw_min_classes',
509                 'pw_min_length', 'pw_min_life'){
511         if (defined @{$msg_hash->{$_}}[0]){
512           $pol->$_(@{$msg_hash->{$_}}[0]);
513         }
514       }
516       # Create info
517       $kadm5->modify_policy($pol) or &add_content2xml_hash($out_hash, "error", Authen::Krb5::Admin::error);
518     }
520     if (defined $forward_to_gosa) {
521         &add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
522     }
524     # build return message with twisted target and source
525     my $out_msg = &create_xml_string($out_hash);
527     # return message
528     return $out_msg;
532 sub krb5_del_policy {
533     my ($msg, $msg_hash) = @_;
534     my $header = @{$msg_hash->{'header'}}[0];
535     my $source = @{$msg_hash->{'source'}}[0];
536     my $target = @{$msg_hash->{'target'}}[0];
537     my $session_id = @{$msg_hash->{'session_id'}}[0];
538     my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
540     # build return message with twisted target and source
541     my $out_hash = &main::create_xml_hash("answer_$header", $target, $source);
542     &add_content2xml_hash($out_hash, "session_id", $session_id);
544     # Sanity check
545     if (not defined @{$msg_hash->{'policy'}}[0]){
546         if (defined $forward_to_gosa) {
547             &add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
548         }
549         &add_content2xml_hash($out_hash, "error", "No policy specified");
550         return &create_xml_string($out_hash);
551     }
553     # Authenticate
554     my $kadm5 = Authen::Krb5::Admin->init_with_password($krb_admin, $krb_password);
555     my $policy= @{$msg_hash->{'policy'}}[0];
556     if (not defined $kadm5){
557       &add_content2xml_hash($out_hash, "error", "Cannot connect to kadmin server");
558     } else {
559       $kadm5->delete_policy($policy) or &add_content2xml_hash($out_hash, "error", Authen::Krb5::Admin::error);
560     }
562     if (defined $forward_to_gosa) {
563         &add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
564     }
566     # return message
567     return &create_xml_string($out_hash);
570 sub krb5_set_password {
571     my ($msg, $msg_hash) = @_;
572     my $header = @{$msg_hash->{'header'}}[0];
573     my $source = @{$msg_hash->{'source'}}[0];
574     my $target = @{$msg_hash->{'target'}}[0];
575     my $session_id = @{$msg_hash->{'session_id'}}[0];
576     my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
578     # build return message with twisted target and source
579     my $out_hash = &main::create_xml_hash("answer_$header", $target, $source);
580     &add_content2xml_hash($out_hash, "session_id", $session_id);
582     # Sanity check
583     if (not defined @{$msg_hash->{'principal'}}[0]){
584         if (defined $forward_to_gosa) {
585             &add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
586         }
588         &add_content2xml_hash($out_hash, "error", "No principal specified");
589         return &create_xml_string($out_hash);
590     }
591     if (not defined @{$msg_hash->{'password'}}[0]){
592         if (defined $forward_to_gosa) {
593             &add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
594         }
596         &add_content2xml_hash($out_hash, "error", "No password specified");
597         return &create_xml_string($out_hash);
598     }
600     # Authenticate
601     my $kadm5 = Authen::Krb5::Admin->init_with_password($krb_admin, $krb_password);
602     my $principal;
603     if (not defined $kadm5){
604       &add_content2xml_hash($out_hash, "error", "Cannot connect to kadmin server");
605     } 
607     $principal= Authen::Krb5::parse_name(@{$msg_hash->{'principal'}}[0]);
608     if(not defined $principal) {
609       &add_content2xml_hash($out_hash, "error", "Illegal principal name");
610     } else {
611       $kadm5->chpass_principal($principal, @{$msg_hash->{'password'}}[0]) or &add_content2xml_hash($out_hash, "error", Authen::Krb5::Admin::error);
612     }
614     if (defined $forward_to_gosa) {
615         &add_content2xml_hash($out_hash, "forward_to_gosa", $forward_to_gosa);
616     }
618     # return message
619     return &create_xml_string($out_hash);
621 1;