Code

1947a40f442666cae5bc10da4c47554ee8c70fab
[gosa.git] / gosa-plugins / mit-krb5 / admin / systems / services / kerberos / class_goKrbServer.inc
1 <?php
2 /*
3    This code is part of GOsa (https://gosa.gonicus.de)
4    Copyright (C) 2008 Fabian Hickert
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2 of the License, or
9    (at your option) any later version.
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
22 /*! brief   The kerberos service class 
23  */
24 class goKrbServer extends goService{
26     var $cli_summary      = "This pluign is used within the ServerService Pluign \nand indicates that this server supports NTP service.";
27     var $cli_description  = "Some longer text\nfor help";
28     var $cli_parameters   = array("eins" => "Eins ist toll", "zwei" => "Zwei ist noch besser");
30     /* This plugin only writes its objectClass */
31     var $objectclasses    = array("goKrbServer");
32     var $attributes       = array("goKrbRealm");
33     var $StatusFlag       = "goKrbServerStatus";
35     /* This class can't be assigned twice so it conflicts with itsself */
36     var $conflicts        = array("goKrbServer");
38     var $DisplayName      = "";
39     var $dn               = NULL;
40     var $goKrbServerStatus= "";
41     var $cn               = "";
42     var $goKrbRealm       = "";
43     var $view_logged      = FALSE;
45     var $policies         = array();
46     var $id               = -1;
47     var $macAddress       = "" ;
50     /*! \brief Initializes the kerberos service 
51       @param  Object  GOsa configuration object.
52       @param  String  The object dn we are currently editing.
53       @param  Object  The parent object.
54      */ 
55     public function goKrbServer(&$config,$dn,$parent)
56     {
57         goService::goService($config,$dn);
58         $this->DisplayName = _("Kerberos service");
59         $this->parent = $parent;
61         /* Detect macAddress of this device 
62          */
63         $this->macAddress = "";
64         if(isset($this->parent->parent->netConfigDNS->macAddress)){
65             $this->macAddress = &$this->parent->parent->netConfigDNS->macAddress;
66         }
68         /* Get configured policies 
69          */ 
70         if(!empty($this->macAddress) && $this->is_account){
71             $o = new gosaSupportDaemon();
72             $tmp = $o->krb5_list_policies($this->macAddress);
73             if($o->is_error()){
74                 msg_dialog::display(_("Service infrastructure"),msgPool::siError($o->get_error()),ERROR_DIALOG);
75             }else{
76                 $this->policies = array();
77                 foreach($tmp as $policy){
78                     $this->policies[] = array("NAME" => $policy,"STATUS" => "LOADED","DATA" => array());
79                 }
80             }
81         }
83         // Prepare lists
84         $this->principleList = new sortableListing();
85         $this->principleList->setDeleteable(true);
86         $this->principleList->setInstantDelete(false);
87         $this->principleList->setEditable(true);
88         $this->principleList->setWidth("100%");
89         $this->principleList->setHeight("100px");
90         $this->principleList->setHeader(array(_("Name")));
91         $this->principleList->setColspecs(array('*','40px'));
92         $this->principleList->setDefaultSortColumn(0);
94     }
97     /*! \brief  Create HTML output
98       @return String HMTL output.
99      */
100     public function execute()
101     { 
102         $smarty = get_smarty(); 
103         $smarty->assign("MIT_KRB", class_available("passwordMethodMIT"));
105         if(!$this->view_logged){
106             $this->view_logged = TRUE;
107             new log("view","server/".get_class($this),$this->dn);
108         }
110         /*******  
111           Display sub dialogs
112          *******/
114         /*  CANCEL Policy dialog 
115          */
116         if(isset($_POST['cancel_policy'])){
117             $this->dialog = NULL;
118         }
120         /*  SAVE Policy dialog 
121          */
122         if($this->dialog instanceof krb5_policy && isset($_POST['save_policy'])){
123             $this->dialog->save_object();
124             $msgs = $this->dialog->check();
125             if(count($msgs)){
126                 msg_dialog::displayChecks($msgs);
127             }else{
128                 $this->AddPolicy($this->id,$this->dialog->save());
129                 $this->dialog = NULL;
130             }
131         }
133         /* DISPLAY policy dialog
134          */
135         if($this->dialog instanceof krb5_policy){
136             $this->dialog->save_object();
137             return($this->dialog->execute());
138         } 
140         /*******
141           Create HTML output for this plugin
142          *******/  
144         $tmp = $this->plinfo();
145         foreach($tmp['plProvidedAcls'] as $name => $translation){
146             $smarty->assign($name."ACL",$this->getacl($name));
147         }
149         foreach($this->attributes as $attr){
150             $smarty->assign($attr, set_post($this->$attr));
151         }
153         $this->principleList->setAcl($this->getAcl('goKrbPolicy'));
154         $data = $lData = array();
155         foreach($this->policies as $key => $policy){
156             if($policy['STATUS'] == "REMOVED") continue;
157             $data[$key] = $policy;
158             $lData[$key]= array('data' => array($policy['NAME']));
159         }
160         $this->principleList->setListData($data,$lData);
161         $this->principleList->update();
162         $smarty->assign("list",$this->principleList->render());
163         return($smarty->fetch(get_template_path("goKrbServer.tpl",TRUE,dirname(__FILE__))));
164     }
167     /* \brief  Return serice informations, which will be shown in the service overview.
168        @return  Array  Some service information.
169      */
170     public function getListEntry()
171     {
172         $fields               = goService::getListEntry();
173         $fields['Message']    = _("Kerberos service (kadmin access informations)");
174 #$fields['AllowEdit']  = true;
175         return($fields);
176     }
179     /*! \brief Checks if all given values are valid 
180       @return Array   An array containing all error messages.
181      */
182     public function check()
183     { 
184         $message = plugin::check();
185         if (empty($this->goKrbRealm)){
186             $message[]= msgPool::required(_("Realm"));
187         }
188         if(count($this->policies) && (empty($this->macAddress) || !tests::is_mac($this->macAddress))){
189             $message[] = _("Cannot apply policy changes! The defined Kerberos server has no MAC address.");
190         }
191         return($message);
192     }
195     /*! \brief Adds or updated a given policy.
196       @param  Integer ID  The policy to update, or -1 if it is a new one.
197       @param  Array  The policy settings.
198      */
199     public function AddPolicy($id,$policy)
200     {
201         if($id != -1 && $this->policies[$id]['NAME'] == $policy['NAME']){
203             /* Policy was edited 
204              */
205             if($this->policies[$id]['STATUS'] == "LOADED"){
206                 $policy['STATUS'] = "EDITED";
207             }else{
208                 $policy['STATUS'] = $this->policies[$id]['STATUS'];
209             }
210             $this->policies[$this->id] = $policy;
212         }elseif($id != -1 && $this->policies[$id]['NAME'] != $policy['NAME']){
214             /* Policy was renamed, remove old and add new policy  
215              */
216             $this->RemovePolicy($id);
217             $this->AddPolicy(-1,$policy);
218         }else{
220             /* Policy was added 
221              */
222             $name = $policy['NAME'];
224             /* Check if there is already a policy with this name 
225                which was removed before
226              */
227             foreach($this->policies as $pid => $entry){
228                 if($entry['NAME'] == $name && $entry['STATUS'] == "REMOVED"){
229                     $id = $pid;
230                     break;
231                 }
232             }
234             /* Update existing policy or create new one
235              */ 
236             if(isset($this->policies[$id])){
237                 $policy['STATUS'] = "EDITED";
238                 $this->policies[$id] = $policy;
239             }else{
240                 $policy['STATUS'] = "ADDED";
241                 $this->policies[] = $policy;
242             }
243         }
244     }
247     /*! \brief  Returns all used policy names.
248       @return Array A list of used policy names.
249      */
250     public function getPolicyNames()
251     {
252         $ret = array();
253         foreach($this->policies as $policy){
254             if($policy['STATUS'] == "REMOVED") continue;
255             $ret[] = $policy['NAME'];
256         }
257         return($ret);
258     }
261     /*! \brief  Marks a policy as remvoed 
262       @param  Integer the Id of the policy to remove 
263      */ 
264     public function RemovePolicy($id)
265     {
266         /* Load policy information, if not done before 
267          */
268         if(!isset($this->policies[$id]))  return;
269         if($this->policies[$id]['STATUS'] == "LOADED" && empty($this->policies[$id]['DATA'])){
270             $o = new gosaSupportDaemon();
271             $this->policies[$id]['DATA'] = $o->krb5_get_policy($this->macAddress,$this->policies[$id]['NAME']);
272         }
273         if($this->policies[$id]['DATA']['POLICY_REFCNT']){
274             msg_dialog::display(_("Remove"),msgPool::stillInUse(_("Policy")),ERROR_DIALOG) ;
275         }else{
276             if($this->policies[$id]['STATUS'] == "ADDED"){
277                 unset($this->policies[$id]);
278             }else{
279                 $this->policies[$id]['STATUS'] = "REMOVED";
280             }
281         } 
282     }  
285     /*! \brief  Save POSTed html variables
286      */
287     public function save_object()
288     {
289         if(isset($_POST['goKrbServerPosted'])){
290             plugin::save_object();
292             /* Add new Policy requested 
293              */
294             if(isset($_POST['policy_add']) && class_available("krb5_policy")){
295                 $this->dialog = new krb5_policy($this->config,array(),$this);
296                 $this->id = -1;
297             }
300             $this->principleList->save_object();
301             $action = $this->principleList->getAction();
302             if($action['action'] == 'delete'){
303                 $id = $this->principleList->getKey($action['targets'][0]);
304                 $this->RemovePolicy($id);
305             }
306             if($action['action'] == 'edit'){
307                 $id = $this->principleList->getKey($action['targets'][0]);
308                 if(isset($this->policies[$id])){
310                     /* Load policy information, if not done before 
311                      */ 
312                     if($this->policies[$id]['STATUS'] == "LOADED" && empty($this->policies[$id]['DATA'])){
313                         $o = new gosaSupportDaemon();
314                         $this->policies[$id]['DATA'] = $o->krb5_get_policy($this->macAddress,$this->policies[$id]['NAME']);
315                     }
317                     /* Open dialog */
318                     $this->id = $id;
319                     $this->dialog = new krb5_policy($this->config,$this->policies[$id], $this);
320                 }
321             }
322         }
323     } 
326     /*! \brief Save changes to ldap
327      */
328     public function save()
329     {
330         goService::save();
332         /* Send policy changes back to the si daemon 
333          */
334         $actions = array("del" => array(),"add_edit" => array());
335         foreach($this->policies as $policy){
337             /* Unset not used vars */
338             if(isset($policy['DATA']['MASK']))          unset($policy['DATA']['MASK']);
339             if(isset($policy['DATA']['POLICY_REFCNT'])) unset($policy['DATA']['POLICY_REFCNT']);
341             switch($policy['STATUS']){
342                 case "REMOVED" : $actions['del'] [] = $policy;break; 
343                 case "ADDED"   : 
344                     case "EDITED"  : $actions['add_edit'] [] = $policy;break; 
345             }
346         }
348         $o = new gosaSupportDaemon();
349         $policies = $o->krb5_list_policies($this->macAddress);
351         /* Send remove policy event  
352          */
353         foreach($actions['del'] as $policy){
354             if(!in_array($policy['NAME'],$policies)) continue;
355             if(!$o->krb5_del_policy($this->macAddress,$policy['NAME'])){
356                 msg_dialog::display(_("Service infrastructure"),msgPool::siError($o->get_error()),ERROR_DIALOG);
357             }
358         }
360         /* Send add new/edit policy event
361          */
362         foreach($actions['add_edit'] as $policy){
363             if(in_array($policy['NAME'],$policies)){
364                 if(!$o->krb5_set_policy($this->macAddress,$policy['NAME'],$policy['DATA'])){
365                     msg_dialog::display(_("Service infrastructure"),msgPool::siError($o->get_error()),ERROR_DIALOG);
366                 }
367             }else{
368                 if(!$o->krb5_add_policy($this->macAddress,$policy['NAME'],$policy['DATA'])){
369                     msg_dialog::display(_("Service infrastructure"),msgPool::siError($o->get_error()),ERROR_DIALOG);
370                 }
371             }
372         }
373     }
376     /*! \brief Return plugin informations for acl handling 
377       @return Array   ACL infos.
378      */
379     static function plInfo()
380     {
381         return (array(
382                     "plShortName"   => _("Kerberos"),
383                     "plDescription" => _("Kerberos access information")." ("._("Services").")",
384                     "plSelfModify"  => FALSE,
385                     "plDepends"     => array(),
386                     "plPriority"    => 95,
387                     "plSection"     => array("administration"),
388                     "plCategory"    => array("server"),
389                     "plRequirements"=> array(
390                         'ldapSchema' => array('goKrbServer' => '>=2.7'),
391                         'onFailureDisablePlugin' => array(get_class())
392                         ),
394                     "plProvidedAcls"=> array(
395                         "start"         => _("Start"),
396                         "stop"          => _("Stop"),
397                         "restart"       => _("Restart"),
398                         "goKrbPolicy"   => _("Policies"),
399                         "goKrbRealm"    => _("Realm")) 
400                     ));
401     }
403 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
404 ?>