class_setupStepMigrate.inc 45.82 KiB
<?php
/*
  This code is part of FusionDirectory (http://www.fusiondirectory.org/)
  Copyright (C) 2007  Fabian Hickert
  Copyright (C) 2011-2019  FusionDirectory
  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.
  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.
  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
/****************
 * FUNCTIONS
setupStepMigrate                - Constructor.
update_strings              - Used to update the displayed step information.
initialize_checks           - Initialize migration steps.
check_ldap_permissions      - Check if the used admin account has full access to the ldap database.
check_accounts              - Check if there are users without the required objectClasses.
migrate_accounts            - Migrate selected users to FusionDirectory user accounts.
check_orgUnits              - Check if there are departments, that are not visible for FusionDirectory
migrate_orgUnits            - Migrate selected departments
check_adminAccount          - Check if there is at least one acl entry available
checkBase                   - Check if there is a root object available
get_user_list               - Get list of available users
create_admin
create_admin_user
readPost                    - Save posts
update                      - Update state
render                      - Generate html output of this plugin
array_to_ldif               - Create ldif output of an ldap result array
 ****************/
class CheckFailedException extends FusionDirectoryException
  private $error;
  public function __construct ($msg, $error)
    parent::__construct($msg);
    $this->error = $error;
  public function getError ()
    return $this->error;
class StepMigrateDialog implements FusionDirectoryDialog
  protected $post_cancel = 'dialog_cancel';
  protected $post_finish = 'dialog_confirm';
  private $infos;
  private $tplfile;
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
private $check; public function __construct (&$check, $tpl, $infos) { $this->infos = $infos; $this->tplfile = $tpl; $this->check = $check; } public function readPost () { if (isset($_POST[$this->post_cancel])) { $this->handleCancel(); } elseif (isset($_POST[$this->post_finish]) || isset($_GET[$this->post_finish])) { $this->handleFinish(); } elseif ( isset($_POST['dialog_showchanges']) || isset($_POST['dialog_hidechanges']) || isset($_POST['dialog_refresh'])) { $this->infos = $this->check->dialog_refresh(); } } public function update (): bool { return isset($this->check); } public function render (): string { $smarty = get_smarty(); $smarty->assign('infos', $this->infos); return $smarty->fetch(get_template_path($this->tplfile, TRUE, dirname(__FILE__))); } protected function handleFinish () { if ($this->check->migrate_confirm()) { unset($this->check); } } protected function handleCancel () { unset($this->check); } public function getInfos (): array { return $this->infos; } } class StepMigrateCheck { public $name; public $title; public $status = FALSE; public $msg = ''; public $error = ''; public $fnc; private $step; public function __construct (setupStepMigrate $step, string $name, string $title) { $this->name = $name; $this->title = $title; $this->fnc = 'check_'.$name; $this->step = $step; }
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
public function run ($fnc = NULL) { if ($fnc === NULL) { $fnc = $this->fnc; } try { $this->msg = _('Ok'); $this->error = $this->step->$fnc($this); $this->status = TRUE; } catch (CheckFailedException $e) { $this->status = FALSE; $this->msg = $e->getMessage(); $this->error = $e->getError(); } } public function readPost () { if (isset($_POST[$this->name.'_create'])) { $createFnc = $this->fnc.'_create'; $this->step->$createFnc($this); } elseif (isset($_POST[$this->name.'_migrate'])) { $migrateFnc = $this->fnc.'_migrate'; $this->step->$migrateFnc($this); } } public function submit ($value = NULL, $id = 'migrate') { if ($value === NULL) { $value = _('Migrate'); } return '<input type="submit" name="'.$this->name.'_'.$id.'" value="'.$value.'"/>'; } public function migrate_confirm () { $migrateConfirmFnc = $this->fnc.'_migrate'.'_confirm'; $res = $this->step->$migrateConfirmFnc($this); if ($res) { $this->run(); } return $res; } public function dialog_refresh () { $migrateRefreshFnc = $this->fnc.'_migrate'.'_refresh'; return $this->step->$migrateRefreshFnc($this); } } class setupStepMigrate extends setupStep { var $header_image = "geticon.php?context=applications&icon=utilities-system-monitor&size=48"; /* Root object classes */ var $rootOC_details = []; /* Entries needing migration */ protected $orgUnits_toMigrate = []; protected $accounts_toMigrate = []; protected $outsideUsers_toMigrate = []; protected $outsideOGroups_toMigrate = []; protected $outsidePosixGroups_toMigrate = []; /* check for multiple use of same uidNumber */ var $check_uidNumber = [];
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
/* check for multiple use of same gidNumber */ var $check_gidNumber = []; /* Defaults ACL roles */ var $defaultRoles; /* Limit of objects to check/migrate at once to avoid timeouts or memory overflow */ static protected $objectNumberLimit = 5000; static function getAttributesInfo (): array { return [ 'checks' => [ 'class' => ['fullwidth'], 'name' => _('PHP module and extension checks'), 'template' => get_template_path("setup_migrate.tpl", TRUE, dirname(__FILE__)), 'attrs' => [ new FakeAttribute('checks') ] ], ]; } function __construct ($parent) { parent::__construct($parent); $this->fill_defaultRoles(); } function update_strings () { $this->s_short_name = _('LDAP inspection'); $this->s_title = _('LDAP inspection'); $this->s_description = _('Analyze your current LDAP for FusionDirectory compatibility'); } function fill_defaultRoles () { $this->defaultRoles = [ [ 'cn' => 'manager', 'description' => _('Give all rights on users in the given branch'), 'objectclass' => ['top', 'gosaRole'], 'gosaAclTemplate' => '0:user/user;cmdrw,user/posixAccount;cmdrw' ], [ 'cn' => 'editowninfos', 'description' => _('Allow users to edit their own information (main tab and posix use only on base)'), 'objectclass' => ['top', 'gosaRole'], 'gosaAclTemplate' => '0:user/user;srw,user/posixAccount;srw' ], [ 'cn' => 'editownpwd', 'description' => _('Allow users to edit their own password (use only on base)'), 'objectclass' => ['top', 'gosaRole'], 'gosaAclTemplate' => '0:user/user;s#userPassword;rw' ], ]; } function initialize_checks () { global $config; $config->resetDepartmentCache(); $checks = [ 'baseOC' => new StepMigrateCheck($this, 'baseOC', _('Inspecting object classes in root object')), 'permissions' => new StepMigrateCheck($this, 'permissions', _('Checking permission for LDAP database')), 'accounts' => new StepMigrateCheck($this, 'accounts', _('Checking for invisible users')), 'adminAccount' => new StepMigrateCheck($this, 'adminAccount', _('Checking for super administrator')),