Code

Updated password method.
[gosa.git] / gosa-plugins / heimdal / admin / systems / services / kerberos / class_password-methods-MIT.inc
index 4ce94463406b675ba9b9b551fa2fbfe6e673e1c3..fbfd17c91ebc41b62c4ae7fa4991dfe6149d027c 100644 (file)
 class passwordMethodMIT extends passwordMethod
 {
 
-  var $dn          = "new";     // DN of the current object
-  var $parent_dn   = "new";     // parents DN
-  var $is_account  = FALSE;     // This is TRUE if this object already has a krb extension
-  var $server_list = array();   // A list with all configured servers
-  var $map         = array();   // Mapping array, maps SERVER-REALM, REALM-SERVER ...
+  var $dn             = "new";   // DN of the current object
+  var $parent_dn      = "new";   // parents DN
+  var $is_account     = FALSE;   // This is TRUE if this object already has a krb extension
+  var $server_list    = array(); // A list with all configured servers
+  var $map            = array(); // Mapping array, maps SERVER-REALM, REALM-SERVER ...
 
-  var $goKrbRealm  = "";        // The realm name this principal belongs to
-  var $principal   = "";        // The principals name (e.g. user@MY-DOMAIN.SYS)
-  var $is_new      = TRUE;      // Is TRUE if principal is new 
+  var $goKrbRealm     = "";      // The realm name this principal belongs to
+  var $principal      = "";      // The principals name (e.g. user@MY-DOMAIN.SYS)
+  var $is_new         = TRUE;    // Is TRUE if principal is new 
+
+  var $si_error       = FALSE;   // TRUE is daemon communication failed
+  var $si_error_msg   = "";      // The last error message if above attribute is TRUE.
 
   var $values = array(
       "PRINC_EXPIRE_TIME",      // Expiry date of this principal
@@ -39,19 +42,33 @@ class passwordMethodMIT extends passwordMethod
       "MAX_RENEWABLE_LIFE",     // Max ticket lifetime when renewed
       "POLICY");                // The policy used by this principal
 
+  var $PRINC_EXPIRE_TIME        = 0;
+  var $PW_EXPIRATION            = 0;
+  var $PRINC_EXPIRE_TIME_clear  = TRUE;
+  var $PW_EXPIRATION_clear      = TRUE;
+  var $MAX_LIFE                 = 36000;
+  var $MAX_RENEWABLE_LIFE       = 604800;
+  var $MASK                     = 0;
+
   var $flags = array(
-      "DISALLOW_POSTDATED"  ,   // Pohibit postdated tickets
-      "DISALLOW_FORWARDABLE",   // Prohibit forwardable tickets
-      "DISALLOW_RENEWABLE"  ,   // Prohibit renewable tickets
-      "DISALLOW_PROXIABLE"  ,   // Disallow proxiable tickets
-      "DISALLOW_DUP_SKEY"   ,   // Disallow user to user authentification
-      "REQUIRES_PRE_AUTH"   ,   // Preauthentication required
-      "REQUIRES_HW_AUTH"    ,   // Hardware preauthentication
-      "DISALLOW_SVR"        ,   // Prohibit issuance of service tickets
-      "DISALLOW_TGT_BASED"  ,   // Disallow Ticket-Granting Service
-      "DISALLOW_ALL_TIX"    ,   // Forbid ticket issuance
-      "REQUIRES_PWCHANGE"   ,   // Force a password change
-      "PWCHANGE_SERVICE"    );  // Password change service 
+      "DISALLOW_POSTDATED"    =>0x00000001 ,  // Pohibit postdated tickets
+      "DISALLOW_FORWARDABLE"  =>0x00000002 ,  // Prohibit forwardable tickets
+      "DISALLOW_TGT_BASED"    =>0x00000004 ,  // Disallow Ticket-Granting Service
+      "DISALLOW_RENEWABLE"    =>0x00000008 ,  // Prohibit renewable tickets
+      "DISALLOW_PROXIABLE"    =>0x00000010 ,  // Disallow proxiable tickets
+      "DISALLOW_DUP_SKEY"     =>0x00000020 ,  // Disallow user to user authentification
+      "DISALLOW_ALL_TIX"      =>0x00000040 ,  // Forbid ticket issuance
+      "REQUIRES_PRE_AUTH"     =>0x00000080 ,  // Preauthentication required
+      "REQUIRES_HW_AUTH"      =>0x00000100 ,  // Hardware preauthentication
+      "REQUIRES_PWCHANGE"     =>0x00000200 ,  // Force a password change
+      "UNKNOWN_0x00000400"    =>0x00000400 ,  // ? 
+      "UNKNOWN_0x00000800"    =>0x00000800 ,  // ?
+      "DISALLOW_SVR"          =>0x00001000 ,  // Prohibit issuance of service tickets
+      "PWCHANGE_SERVICE"      =>0x00002000 ,  // Password change service
+      "SUPPORT_DESMD5"        =>0x00004000 ,  // ?
+      "NEW_PRINC"             =>0x00008000 ); // ?
+  
+  var $used_flags = 128;        // Flags, see below
 
   var $readonly = array(
       "FAIL_AUTH_COUNT",        // The number of failed logins 
@@ -61,31 +78,6 @@ class passwordMethodMIT extends passwordMethod
       "LAST_SUCCESS",           // Last successful login 
       "MOD_DATE");              // Last modification time
 
-
-  var $POLICY                   = "";
-  var $POLICIES                 = array(); // Policies provided by the corrently selected realm/server
-
-  var $PRINC_EXPIRE_TIME        = 0;
-  var $PW_EXPIRATION            = 0;
-  var $PRINC_EXPIRE_TIME_clear  = TRUE;
-  var $PW_EXPIRATION_clear      = TRUE;
-  var $MAX_LIFE                 = 0;
-  var $MAX_RENEWABLE_LIFE       = 0;
-  var $MASK                     = "";
-
-  var $DISALLOW_POSTDATED       = FALSE;
-  var $DISALLOW_FORWARDABLE     = FALSE;
-  var $DISALLOW_RENEWABLE       = FALSE;
-  var $DISALLOW_PROXIABLE       = FALSE;
-  var $DISALLOW_DUP_SKEY        = FALSE;
-  var $REQUIRES_PRE_AUTH        = FALSE;
-  var $REQUIRES_HW_AUTH         = FALSE;
-  var $DISALLOW_SVR             = FALSE;
-  var $DISALLOW_TGT_BASED       = FALSE;
-  var $DISALLOW_ALL_TIX         = FALSE;
-  var $REQUIRES_PWCHANGE        = FALSE;
-  var $PWCHANGE_SERVICE         = FALSE;
-
   var $FAIL_AUTH_COUNT          = 0;
   var $KVNO                     = "";
   var $LAST_FAILED              = 0;
@@ -93,7 +85,11 @@ class passwordMethodMIT extends passwordMethod
   var $LAST_SUCCESS             = 0;
   var $MOD_DATE                 = 0;
 
-  function __construct(&$config,$dn = "new")  
+  var $POLICY                   = "";
+  var $POLICIES                 = array(); // Policies provided by the corrently selected realm/server
+
+
+  public function __construct(&$config,$dn = "new")  
   {
     $this->config= $config;
     $this->parent_dn = $dn;
@@ -105,10 +101,15 @@ class passwordMethodMIT extends passwordMethod
       return;
     }  
 
-    /* Keep cache until we try to configure a principal 
+    /* Keep the cached valued and skip loading principals 
+        from si until this method gets configured.
      */
+    $skip_si_access = TRUE;
     if($dn != "new" && $dn != ""){
       session::un_set("MIT_CACHE");
+      session::un_set("MIT_PRINCIPAL_CACHE");
+      session::un_set("MIT_POLICY_CACHE");
+      $skip_si_access = FALSE;
     }
 
     /* Get a list of all kerberos servers, defined in ldap
@@ -122,7 +123,11 @@ class passwordMethodMIT extends passwordMethod
       if(!isset($attrs['macAddress'][0])) continue;
       if(!isset($attrs['description'][0])) $attrs['description'][0] ="";
 
-      $principals = $this->load_principals_for_server($attrs['macAddress'][0]);
+      if($skip_si_access){
+        $principals = array();
+      }else{
+        $principals = $this->load_principals_for_server($attrs['macAddress'][0]);
+      }
 
       /* Create Realm/Server/Principal mapping.
        */
@@ -133,6 +138,12 @@ class passwordMethodMIT extends passwordMethod
       $this->map["SERVER_REALM"][$attrs['cn'][0]] = $attrs['goKrbRealm'][0];
       $this->map["REALM_SERVER"][$attrs['goKrbRealm'][0]] = $attrs['cn'][0];
 
+      /* Set first realm as selected.  
+       */
+      if($this->goKrbRealm == ""){
+        $this->goKrbRealm = $attrs['goKrbRealm'][0];
+      }
+
       /* Create Server list
        */
       $this->server_list[$attrs['cn'][0]] = array("macAddress" => $attrs['macAddress'][0],
@@ -143,21 +154,30 @@ class passwordMethodMIT extends passwordMethod
           "cn"         => $attrs['cn'][0]);
     }
 
-    /* Load object data from ldap && initialize this class  
+    /*  If this methods is initialized with a valid object dn then 
+         load the object data from ldap and the SI daemon && initialize this class.
      */
     $this->is_new = TRUE;
-    if($dn != "new" && $dn != ""){
+    if(!$skip_si_access){
       $ldap = $this->config->get_ldap_link();
       $ldap->cd($dn);
       $ldap->cat($dn);
       $this->attrs = $ldap->fetch();
-      if(isset($this->attrs['userPassword'])){
 
+      /* Set initial pwd hash which take effect if no password method was set yet.  
+         Will be overwritten by the following lines, if the user has already a valid principal.
+       */
+      $this->principal = $this->attrs['uid'][0]."@".$this->goKrbRealm;
+
+      if(isset($this->attrs['userPassword']) && preg_match("/^\{".$this->get_hash_name()."\}/",$this->attrs['userPassword'][0])){
+
+        /* Extract principal name out of userPassword attribute 
+         */
         $p_name = preg_replace("/^\{".$this->get_hash_name()."\}/","",$this->attrs['userPassword'][0]);
 
         /* Try to detect server our principal is configured on
          */
-        if($this->map['PRINCIPAL_SERVER'][$p_name]){
+        if(isset($this->map['PRINCIPAL_SERVER'][$p_name])){
           $server= $this->map['PRINCIPAL_SERVER'][$p_name];
           $this->goKrbRealm = $this->map['SERVER_REALM'][$server];
           $this->principal  = $p_name;
@@ -176,7 +196,8 @@ class passwordMethodMIT extends passwordMethod
   }
 
 
-  /*! \brief  Load this plugin with the values of the given principal
+  /*! \brief  Load a specific principal from the si daemon 
+               and initialize this plugin with it.
     @param  String  The macAddress of the kerberos server.
     @param  String  The name of the principal to load.
    */
@@ -185,25 +206,24 @@ class passwordMethodMIT extends passwordMethod
     $o = new gosaSupportDaemon();
     $tmp = array();
     $tmp = $o->krb5_get_principal($server,$name);
+  
     if($o->is_error()){
+      $this->si_error     = TRUE;
+      $this->si_error_msg = sprintf(_("While loading principal for '%s', from server '%s'."),$name,$server).":&nbsp;<br>".$o->get_error(); 
       msg_dialog::display(_("Service infrastructure"),msgPool::siError($o->get_error()),ERROR_DIALOG);      
     }else{
 
       /* Load flags 
        */
       if(isset($tmp['ATTRIBUTES'])){
-        foreach($this->flags as $flag){
-          if(in_array($flag,$tmp['ATTRIBUTES'])){
-            $this->$flag = TRUE;
-          }
-        } 
+        $this->used_flags = $tmp['ATTRIBUTES'];
       }
 
       /* Load readonly attributes 
        */
       foreach($this->readonly as $attr){
         if(isset($tmp[$attr])){
-          $this->$flag = $tmp[$attr];
+          $this->$attr = $tmp[$attr];
         }
       } 
 
@@ -211,16 +231,27 @@ class passwordMethodMIT extends passwordMethod
        */
       foreach($this->values as $attr){
         if(isset($tmp[$attr])){
-          $this->$flag = $tmp[$attr];
+          $this->$attr = $tmp[$attr];
         }
       } 
+
+      /* Update time checkboxes 
+       */
+      $date_values = array("PW_EXPIRATION","PRINC_EXPIRE_TIME");
+      foreach($date_values as $value){
+        if(!empty($this->$value)){
+          $clear = $value."_clear";
+          $this->$clear = FALSE;
+        }
+      }
     }
   }
 
 
-  /*! \brief get list of all configured principals
-    for a given server. 
-    The results will cached.  
+  /*! \brief  Get the list of all configured principals for a given server.
+      @param  String The servers mac address.
+      @return Array A list with all principals
+      The results will cached.  
    */
   public function load_principals_for_server($server)
   {
@@ -231,7 +262,14 @@ class passwordMethodMIT extends passwordMethod
     if(!isset($cache[$server])){
       $o = new gosaSupportDaemon();
       $tmp = $o->krb5_list_principals($server);
-      $cache[$server] = $tmp;
+      if($o->is_error()){
+        $this->si_error     = TRUE;
+        $this->si_error_msg = sprintf(_("While loading principals from server '%s'."),$server).":&nbsp;<br>".$o->get_error(); 
+        msg_dialog::display(_("Service infrastructure"),msgPool::siError($o->get_error()),ERROR_DIALOG);
+        return(array());
+      }else{
+        $cache[$server] = $tmp;
+      }
       session::set("MIT_PRINCIPAL_CACHE",$cache);
     }
     return($cache[$server]);
@@ -248,15 +286,22 @@ class passwordMethodMIT extends passwordMethod
       session::set("MIT_POLICY_CACHE",array());
     }
     $cache = session::get("MIT_POLICY_CACHE");
-    if(1 | !isset($cache[$server])){
+    if(!isset($cache[$server])){
       $o = new gosaSupportDaemon();
       $tmp = $o->krb5_list_policies($server);
-      $cache[$server] = array();
-      $cache[$server]["_none_"] = _("none"); 
-      foreach($tmp as $policy){
-        $cache[$server][$policy] = $policy;
+      if($o->is_error()){
+        $this->si_error     = TRUE;
+        $this->si_error_msg = sprintf(_("While loading policies from server '%s'."),$server).":&nbsp;<br>".$o->get_error(); 
+        msg_dialog::display(_("Service infrastructure"),msgPool::siError($o->get_error()),ERROR_DIALOG);
+        return(array());
+      }else{
+        $cache[$server] = array();
+        $cache[$server]["_none_"] = _("none"); 
+        foreach($tmp as $policy){
+          $cache[$server][$policy] = $policy;
+        }
+        ksort($cache[$server]);
       }
-      ksort($cache[$server]);
       session::set("MIT_POLICY_CACHE",$cache);
     }
     return($cache[$server]);
@@ -267,7 +312,7 @@ class passwordMethodMIT extends passwordMethod
     This is the case if there is a si server running and at least one server configured.
     kerberos support. 
    */ 
-  function is_available()
+  public function is_available()
   {
     $o = new gosaSupportDaemon(FALSE);
     if(count($this->server_list) && $o->connect()){
@@ -277,7 +322,11 @@ class passwordMethodMIT extends passwordMethod
   }
 
 
-  function generate_hash($pwd)
+  /*! \brief Create the password hash. In this case: {kerberos/sasl}name@RELAM 
+      @param  String  The password -in this case unusued.             
+      @return String  The generated hash
+   */
+  public function generate_hash($pwd = "")
   {
     $mode= "kerberos";
     if (isset($this->config->current['KRBSASL']) && preg_match('/^true$/i', $this->config->current['KRBSASL'])){
@@ -287,35 +336,41 @@ class passwordMethodMIT extends passwordMethod
   }
 
 
-  function remove_from_parent()
+  /*! \brief  Removes this principal.
+   */
+  public function remove_from_parent()
   {
     if(!empty($this->principal) && $this->goKrbRealm){
       $server = $this->map['REALM_SERVER'][$this->goKrbRealm];
       $o = new gosaSupportDaemon();
       if(!$o->krb5_del_principal($this->server_list[$server]['macAddress'],$this->principal)){
+        $this->si_error     = TRUE;
+        $this->si_error_msg = $o->get_error();
         msg_dialog::display(_("Service infrastructure"),msgPool::siError($o->get_error()),ERROR_DIALOG);      
       }
     }
   }
 
 
-  function set_password($password)
+  /*! \brief  Set a new password for this principal 
+      @param  String The new password.
+   */
+  public function set_password($password)
   {
     if(!empty($this->principal) && $this->goKrbRealm){
       $server = $this->map['REALM_SERVER'][$this->goKrbRealm];
       $o = new gosaSupportDaemon();
-
-      echo "Not implemented yet";
-      $attrs = array("password" => $password);
-
-#      if(!$o->krb5_set_principal($this->server_list[$server]['macAddress'],$this->principal,$attrs)){
-#        msg_dialog::display(_("Service infrastructure"),msgPool::siError($o->get_error()),ERROR_DIALOG);      
-#      }
+      if(!$o->krb5_set_password($this->server_list[$server]['macAddress'],$this->principal,$password)){
+        msg_dialog::display(_("Service infrastructure"),msgPool::siError($o->get_error()),ERROR_DIALOG);      
+      }
     }
   }
 
 
-  function get_hash_name()
+  /*! \brief  Return the hash name of this mehtod,  e.g. to identify methods.
+      @return String  The hash used by this method.
+    */
+  public function get_hash_name()
   {
     $mode= "kerberos";
     if (isset($this->config->current['KRBSASL']) && preg_match('/^true$/i', $this->config->current['KRBSASL'])){
@@ -325,13 +380,28 @@ class passwordMethodMIT extends passwordMethod
   }
 
 
-  function is_configurable()
+  /*! \brief  Returns TRUE if this method is configurable else FALSE
+      @retrun Boolena TRUE if configurable, else FALSE.
+   */
+  public function is_configurable()
   {
     return TRUE;
   }
 
 
-  function configure()
+  /*! \brief  Additional info displayed in the users password method drop down.
+      @retunr String  Additional password method info.
+   */
+  public function get_description()
+  {
+    return(_("Daemon based"));
+  }
+
+
+  /*! \brief  Display a HTML based configuration dialog for this plugin
+      @return String  HTML.
+   */
+  public function configure()
   {
     $this->save_object();
 
@@ -377,18 +447,17 @@ class passwordMethodMIT extends passwordMethod
       }
     }
 
-
     $smarty = get_smarty();
+    $smarty->assign("si_error",$this->si_error);
+    $smarty->assign("si_error_msg",$this->si_error_msg);
     $smarty->assign("years",$years);
     $smarty->assign("month",$month);
     $smarty->assign("days",$days);
     $smarty->assign("hours",$hours);
     $smarty->assign("minutes",$minutes);
-
     $smarty->assign("server_list",$this->server_list);
     $smarty->assign("POLICY"  ,$this->POLICY);
     $smarty->assign("goKrbRealm" , $this->goKrbRealm);
-
     $server_name = $this->map['REALM_SERVER'][$this->goKrbRealm];
     $server_mac  = $this->server_list[$server_name]['macAddress'];
     $this->POLICIES = $this->load_policies_for_server($server_mac);
@@ -400,36 +469,54 @@ class passwordMethodMIT extends passwordMethod
     foreach($this->readonly as $attr){
       $smarty->assign($attr ,$this->$attr);
     }
-    foreach($this->flags as $attr){
-      $smarty->assign($attr,$this->$attr);
+    foreach($this->flags as $attr => $hex){
+      $smarty->assign($attr, ($this->used_flags & $hex ));
     }
 
     $date_values = array("PRINC_EXPIRE_TIME","PW_EXPIRATION");
     foreach($date_values as $date_val){
       $clear = $date_val."_clear";
       $smarty->assign($date_val."_clear",$this->$clear);
-      $smarty->assign($date_val."_y",substr($this->$date_val,0,4));
-      $smarty->assign($date_val."_m",substr($this->$date_val,4,2));
-      $smarty->assign($date_val."_d",substr($this->$date_val,6,2));
-      $smarty->assign($date_val."_h",substr($this->$date_val,8,2));
-      $smarty->assign($date_val."_i",substr($this->$date_val,10,2));
+      $smarty->assign($date_val."_y",date("Y",$this->$date_val));
+      $smarty->assign($date_val."_m",date("m",$this->$date_val));
+      $smarty->assign($date_val."_d",date("d",$this->$date_val));
+      $smarty->assign($date_val."_h",date("h",$this->$date_val));
+      $smarty->assign($date_val."_i",date("i",$this->$date_val));
     }
 
-
-    return($smarty->fetch(get_template_path("pwd_kerberos_mit.tpl")));
+    return($smarty->fetch(get_template_path("pwd_kerberos_mit.tpl",TRUE,dirname(__FILE__))));
   }
 
 
-  function save_object()
+  /*! \brief  Saves all relevant HTML posts for this plugin
+   */
+  public function save_object()
   {
+    /* If the communication with the si server failed, 
+        you are able to retry to connect to the server.
+       Here we hanlde those requests.
+     */
+    if(isset($_POST['retry_si'])){
+      $this->si_error= FALSE;
+      $this->si_error_msg= "";
+      session::un_set("MIT_PRINCIPAL_CACHE");
+      session::un_set("MIT_POLICY_CACHE");
+      $this->__construct($this->config,$this->parent_dn);
+    }
+
+    /* Only handle posts for this plugin, it its content was posted
+     */
     if(isset($_POST['pwd_heimdal_posted'])){
 
       if(isset($_POST['goKrbRealm'])){
         $this->goKrbRealm = get_post("goKrbRealm");
       }
 
-      foreach($this->flags as $attr){
-        $this->$attr = isset($_POST[$attr]);
+      $this->used_flags = 0;
+      foreach($this->flags as $attr => $hex){
+        if(isset($_POST[$attr])){
+          $this->used_flags |= $hex; 
+        }
       }
 
       foreach(array("MAX_LIFE","MAX_RENEWABLE_LIFE","POLICY") as $attr){
@@ -445,43 +532,45 @@ class passwordMethodMIT extends passwordMethod
           $this->$clear = TRUE;
         }else{
           $this->$clear = FALSE;
-          $str = "";
-          foreach(array("y","m","d","h","i") as $val){
-            if(isset($_POST[$date_value."_".$val])){
-              $str .= $_POST[$date_value."_".$val]; 
-            }
-          }
-          $this->$date_value = $str."Z";
+          $this->$date_value = gmmktime(  
+              $_POST[$date_value."_h"],
+              $_POST[$date_value."_i"],
+              0,
+              $_POST[$date_value."_m"],
+              $_POST[$date_value."_d"],
+              $_POST[$date_value."_y"]);
         }
       }
     }
   }
 
-  function check()
+
+  /*! \brief  Checks the values specified in the configuration dialog. 
+      @return Array Containing all error messages.
+   */
+  public function check()
   {
     $message = array();
-    echo "Checks missing";
-    return($message);
-  }
-
 
-  function chk_times($str)
-  {
-    if(preg_match("/^([0-9]){12,12}[a-z]$/i",$str)){
-      return(true);
+    if(!preg_match("/^[0-9]*$/",$this->MAX_LIFE)){
+      $message[] = msgPool::invalid(_("Ticket max life"),$this->MAX_LIFE,"/[0-9]/");
+    }
+    if(!preg_match("/^[0-9]*$/",$this->MAX_RENEWABLE_LIFE)){
+      $message[] = msgPool::invalid(_("Ticket max renew"),$this->MAX_RENEWABLE_LIFE,"/[0-9]/");
     }
-    return(false);
+    return($message);
   }
 
 
-  function save($dn)
+  /*! \brief Saves changes back to the SI daemon.
+   */
+  public function save($dn)
   {
-    $realm = $this->config->data['SERVERS']['KERBEROS']['REALM'];
-
     $ldap = $this->config->get_ldap_link();
     $ldap->cd($dn);
     $ldap->cat($dn,array('uid'));
     $attrs = $ldap->fetch();
+
     if(isset($attrs['uid'][0])){
 
       /* Get servers mac */
@@ -495,14 +584,8 @@ class passwordMethodMIT extends passwordMethod
       /* Collect flags */
       $flags = array();
       $entry = array();
-      foreach($this->flags as $flag){
-        if($this->$flag){
-          $flags[] = $flag;
-        }
-      }
-      if(count($flags)){
-        $entry['ATTRIBUTES'] = $flags;
-      }
+
+      $entry['ATTRIBUTES'] = $this->used_flags;
 
       /* Append other values */
       foreach($this->values as $attr){
@@ -515,14 +598,31 @@ class passwordMethodMIT extends passwordMethod
         $entry['POLICY'] = $policy;
       }
 
+      /* Set date values 
+       */
+     $date_values = array("PW_EXPIRATION","PRINC_EXPIRE_TIME");
+      foreach($date_values as $value){
+        $clear = $value."_clear";
+        if($this->$clear){
+          $entry[$value] = 0;
+        }
+      }    
+
+
       /* Save principal changes */
       $o = new gosaSupportDaemon();
+      if(in_array($principal,$this->server_list[$server_name]['principals'])){
+        $this->is_new = FALSE;
+      }
+
       if($this->is_new){
         $o->krb5_add_principal($server_mac,$principal,$entry);
       }else{
         $o->krb5_set_principal($server_mac,$principal,$entry);
       }
       if($o->is_error()){
+        $this->si_error     = TRUE;
+        $this->si_error_msg = $o->get_error();
         msg_dialog::display(_("Service infrastructure"),msgPool::siError($o->get_error()),ERROR_DIALOG);      
       }
     }