Example #1
0
 private function hooks_system_integration_changes($prefs_, $diff_)
 {
     $userdb_changed_enable = array_key_exists('UserDB.enable', $diff_);
     $usersgroupdb_changed_enable = array_key_exists('UserGroupDB.enable', $diff_);
     $has_changed_u = self::check_pref_change($diff_, 'UserDB.' . $prefs_->get('UserDB', 'enable'));
     $has_changed_ug = self::check_pref_change($diff_, 'UserGroupDB.' . $prefs_->get('UserGroupDB', 'enable'));
     $userDB = UserDB::getInstance();
     $userGroupDB = UserGroupDB::getInstance();
     // Clean orphan user settings
     if ($userdb_changed_enable) {
         Abstract_User_Preferences::delete_all();
     } else {
         if ($has_changed_u) {
             $users = Abstract_User_Preferences::get_users();
             $users_to_remove = array();
             foreach ($users as $login) {
                 $user = $userDB->import($login);
                 if ($user) {
                     continue;
                 }
                 array_push($users_to_remove, $login);
             }
             if (count($users_to_remove) > 0) {
                 Abstract_User_Preferences::deleteByUserLogins($users_to_remove);
             }
         }
     }
     // Clean orphan users group settings
     if ($usersgroupdb_changed_enable) {
         Abstract_UserGroup_Preferences::delete_all();
     } else {
         if ($has_changed_ug) {
             $groups = Abstract_UserGroup_Preferences::get_usersgroups();
             $groups_to_remove = array();
             foreach ($groups as $group_id) {
                 $group = $userGroupDB->import($group_id);
                 if ($group) {
                     continue;
                 }
                 array_push($groups_to_remove, $group);
             }
             if (count($groups_to_remove) > 0) {
                 Abstract_UserGroup_Preferences::deleteByUserGroupIds($groups_to_remove);
             }
         }
     }
     // Users groups rules
     if ($usersgroupdb_changed_enable) {
         Abstract_UserGroup_Rule::delete_all();
     } else {
         if ($has_changed_ug) {
             $groups = Abstract_UserGroup_Rule::get_usersgroups();
             $groups_to_remove = array();
             foreach ($groups as $group_id) {
                 $group = $userGroupDB->import($group_id);
                 if ($group) {
                     continue;
                 }
                 array_push($groups_to_remove, $group);
             }
             if (count($groups_to_remove) > 0) {
                 Abstract_UserGroup_Rule::deleteByUserGroupIds($groups_to_remove);
             }
         }
     }
     // Unset default usersgroup
     if ($usersgroupdb_changed_enable) {
         $prefs_->set('general', 'user_default_group', NULL);
         $prefs_->backup();
     } else {
         if ($has_changed_ug) {
             $v = $prefs_->get('general', 'user_default_group');
             if (!is_null($v)) {
                 $group = $userGroupDB->import($v);
                 if (!$group) {
                     $prefs_->set('general', 'user_default_group', NULL);
                     $prefs_->backup();
                 }
             }
         }
     }
     // Clean users - usersgroup liaisons
     if ($userdb_changed_enable) {
         // Remove Users from user groups
         $ret = Abstract_Liaison::delete('UsersGroup', NULL, NULL);
         if (!$ret) {
             Logger::error('api', 'Unable to remove Users from UserGroups');
         }
     } else {
         if ($userGroupDB->isWriteable() && ($has_changed_u && $has_changed_ug)) {
             $liaisons = Abstract_Liaison::load('UsersGroup', NULL, NULL);
             foreach ($liaisons as $liaison) {
                 $must_remove_liaisons = false;
                 $user = $userDB->import($liaison->element);
                 if (!$user) {
                     $must_remove_liaisons = true;
                 }
                 if (!$must_remove_liaisons) {
                     $group = $userGroupDB->import($liaison->group);
                     if (!$group) {
                         $must_remove_liaisons = true;
                     }
                 }
                 if (!$must_remove_liaisons) {
                     continue;
                 }
                 // Delete this liaison
                 $liaisons = Abstract_Liaison::load('UsersGroup', $liaison->element, $liaison->group);
             }
         }
     }
     // Clean users - profile liaisons
     if ($userdb_changed_enable) {
         $ret = Abstract_Liaison::delete('UserProfile', NULL, NULL);
         if (!$ret) {
             Logger::error('api', 'Unable to remove Users - Profiles matches');
         }
     } else {
         if ($has_changed_u) {
             $liaisons = Abstract_Liaison::load('UserProfile', NULL, NULL);
             foreach ($liaisons as $liaison) {
                 // check if profile must become orphan
                 $user = $userDB->import($liaison->element);
                 if ($user) {
                     continue;
                 }
                 // Delete this liaison
                 $liaisons = Abstract_Liaison::load('UserProfile', $liaison->element, $liaison->group);
             }
         }
     }
     // Clean publication liaisons
     if ($usersgroupdb_changed_enable) {
         // Remove Publications
         $ret = Abstract_Liaison::delete('UsersGroupApplicationsGroup', NULL, NULL);
         if (!$ret) {
             Logger::error('api', 'Unable to remove Publications');
         }
     } else {
         if ($has_changed_ug) {
             $liaisons = Abstract_Liaison::load('UsersGroupApplicationsGroup', NULL, NULL);
             foreach ($liaisons as $liaison) {
                 $group = $userGroupDB->import($liaison->element);
                 if ($group) {
                     continue;
                 }
                 // Delete this liaison
                 $liaisons = Abstract_Liaison::load('UsersGroupApplicationsGroup', $liaison->element, $liaison->group);
             }
         }
     }
     if (in_array('SharedFolderDB', $prefs_->get('general', 'enable'))) {
         $sharedfolderdb = SharedFolderDB::getInstance();
         // Clean usersgroup - profile liaisons
         if ($usersgroupdb_changed_enable) {
             $sharedfolderdb->clear_publications();
         } else {
             if ($has_changed_ug) {
                 // TODO:check in each publication if users group still exists. If not: delete the publication
             }
         }
     }
 }