Inheritance: extends AuthPluginBase
コード例 #1
0
 public function getAvailableValues()
 {
     if (!empty($this->fields['values'])) {
         $ldap_values = json_decode($this->fields['values']);
         $ldap_dropdown = new RuleRightParameter();
         if (!$ldap_dropdown->getFromDB($ldap_values->ldap_attribute)) {
             return array();
         }
         $attribute = array($ldap_dropdown->fields['value']);
         $config_ldap = new AuthLDAP();
         if (!$config_ldap->getFromDB($ldap_values->ldap_auth)) {
             return array();
         }
         if (!function_exists('warning_handler')) {
             function warning_handler($errno, $errstr, $errfile, $errline, array $errcontext)
             {
                 if (0 === error_reporting()) {
                     return false;
                 }
                 throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
             }
         }
         set_error_handler("warning_handler", E_WARNING);
         try {
             $tab_values = array();
             $ds = $config_ldap->connect();
             ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
             $cookie = '';
             do {
                 if (AuthLDAP::isLdapPageSizeAvailable($config_ldap)) {
                     ldap_control_paged_result($ds, $config_ldap->fields['pagesize'], true, $cookie);
                 }
                 $result = ldap_search($ds, $config_ldap->fields['basedn'], $ldap_values->ldap_filter, $attribute);
                 $entries = ldap_get_entries($ds, $result);
                 array_shift($entries);
                 foreach ($entries as $id => $attr) {
                     if (isset($attr[$attribute[0]]) && !in_array($attr[$attribute[0]][0], $tab_values)) {
                         $tab_values[$id] = $attr[$attribute[0]][0];
                     }
                 }
                 if (AuthLDAP::isLdapPageSizeAvailable($config_ldap)) {
                     ldap_control_paged_result_response($ds, $result, $cookie);
                 }
             } while ($cookie !== null && $cookie != '');
             if ($this->fields['show_empty']) {
                 $tab_values = array('' => '-----') + $tab_values;
             }
             asort($tab_values);
             return $tab_values;
         } catch (Exception $e) {
             return array();
         }
         restore_error_handler();
     } else {
         return array();
     }
 }
コード例 #2
0
ファイル: group.class.php プロジェクト: korial29/glpi
 /**
  * @see CommonGLPI::getAdditionalMenuOptions()
  *
  * @since version 0.85
  **/
 static function getAdditionalMenuOptions()
 {
     if (Session::haveRight('user', User::UPDATEAUTHENT)) {
         $options['ldap']['title'] = AuthLDAP::getTypeName(Session::getPluralNumber());
         $options['ldap']['page'] = "/front/ldap.group.php";
         return $options;
     }
     return false;
 }
コード例 #3
0
ファイル: entity.class.php プロジェクト: korial29/glpi
 /**
  * @since version 0.84 (before in entitydata.class)
  *
  * @param $entity Entity object
  **/
 static function showAdvancedOptions(Entity $entity)
 {
     global $DB;
     $con_spotted = false;
     $ID = $entity->getField('id');
     if (!$entity->can($ID, READ)) {
         return false;
     }
     // Entity right applied (could be User::UPDATEAUTHENT)
     $canedit = $entity->can($ID, UPDATE);
     if ($canedit) {
         echo "<form method='post' name=form action='" . Toolbox::getItemTypeFormURL(__CLASS__) . "'>";
     }
     echo "<table class='tab_cadre_fixe'>";
     echo "<tr><th colspan='2'>" . __('Values for the generic rules for assignment to entities') . "</th></tr>";
     echo "<tr class='tab_bg_1'><td colspan='2' class='center'>" . __('These parameters are used as actions in generic rules for assignment to entities') . "</td></tr>";
     echo "<tr class='tab_bg_1'>";
     echo "<td>" . __('Information in inventory tool (TAG) representing the entity') . "</td>";
     echo "<td>";
     Html::autocompletionTextField($entity, "tag", array('size' => 100));
     echo "</td></tr>";
     if (Toolbox::canUseLdap()) {
         echo "<tr class='tab_bg_1'>";
         echo "<td>" . __('LDAP directory information attribute representing the entity') . "</td>";
         echo "<td>";
         Html::autocompletionTextField($entity, "ldap_dn", array('size' => 100));
         echo "</td></tr>";
     }
     echo "<tr class='tab_bg_1'>";
     echo "<td>" . __('Mail domain surrogates entity') . "</td>";
     echo "<td>";
     Html::autocompletionTextField($entity, "mail_domain", array('size' => 100));
     echo "</td></tr>";
     if (Toolbox::canUseLdap()) {
         echo "<tr><th colspan='2'>" . __('Values used in the interface to search users from a LDAP directory') . "</th></tr>";
         echo "<tr class='tab_bg_1'>";
         echo "<td>" . __('LDAP directory of an entity') . "</td>";
         echo "<td>";
         AuthLDAP::dropdown(array('value' => $entity->fields['authldaps_id'], 'emptylabel' => __('Default server'), 'condition' => "`is_active` = '1'"));
         echo "</td></tr>";
         echo "<tr class='tab_bg_1'>";
         echo "<td>" . __('LDAP filter associated to the entity (if necessary)') . "</td>";
         echo "<td>";
         Html::autocompletionTextField($entity, 'entity_ldapfilter', array('size' => 100));
         echo "</td></tr>";
     }
     if ($canedit) {
         echo "<tr>";
         echo "<td class='tab_bg_2 center' colspan='2'>";
         echo "<input type='hidden' name='id' value='" . $entity->fields["id"] . "'>";
         echo "<input type='submit' name='update' value=\"" . _sx('button', 'Save') . "\" class='submit'>";
         echo "</td></tr>";
         echo "</table>";
         Html::closeForm();
     } else {
         echo "</table>";
     }
 }
コード例 #4
0
// Check session dir (usefull when NFS mounted))
if (is_dir(GLPI_SESSION_DIR) && is_writable(GLPI_SESSION_DIR)) {
    echo "GLPI_SESSION_DIR_OK\n";
} else {
    echo "GLPI_SESSION_DIR_PROBLEM\n";
    $ok = false;
}
// Reestablished DB connection
if (($ok_master || $ok_slave) && DBConnection::establishDBConnection(false, false, false)) {
    // Check LDAP Auth connections
    $ldap_methods = getAllDatasFromTable('glpi_authldaps', '`is_active`=1');
    if (count($ldap_methods)) {
        echo "Check LDAP servers:";
        foreach ($ldap_methods as $method) {
            echo " " . $method['name'];
            if (AuthLDAP::tryToConnectToServer($method, $method["rootdn"], Toolbox::decrypt($method["rootdn_passwd"], GLPIKEY))) {
                echo "_OK";
            } else {
                echo "_PROBLEM";
                $ok = false;
            }
            echo "\n";
        }
    } else {
        echo "No LDAP server\n";
    }
    // Check IMAP Auth connections
    $imap_methods = getAllDatasFromTable('glpi_authmails', '`is_active`=1');
    if (count($imap_methods)) {
        echo "Check IMAP servers:";
        foreach ($imap_methods as $method) {
コード例 #5
0
ファイル: question.class.php プロジェクト: CHCI74/formcreator
 /**
  * Validate form fields before add or update a question
  *
  * @param  Array $input Datas used to add the item
  *
  * @return Array        The modified $input array
  *
  * @param  [type] $input [description]
  * @return [type]        [description]
  */
 private function checkBeforeSave($input)
 {
     // Control fields values :
     // - name is required
     if (empty($input['name'])) {
         Session::addMessageAfterRedirect(__('The title is required', 'formcreator'), false, ERROR);
         return array();
     }
     // - field type is required
     if (empty($input['fieldtype'])) {
         Session::addMessageAfterRedirect(__('The field type is required', 'formcreator'), false, ERROR);
         return array();
     }
     // - section is required
     if (empty($input['plugin_formcreator_sections_id'])) {
         Session::addMessageAfterRedirect(__('The section is required', 'formcreator'), false, ERROR);
         return array();
     }
     // Values are required for GLPI dropdowns, dropdowns, multiple dropdowns, checkboxes, radios, LDAP
     $itemtypes = array('select', 'multiselect', 'checkboxes', 'radios', 'ldap');
     if (empty($input['values']) && in_array($input['fieldtype'], $itemtypes)) {
         Session::addMessageAfterRedirect(__('The field value is required:', 'formcreator') . ' ' . $input['name'], false, ERROR);
         return array();
     }
     // Fields are differents for dropdown lists, so we need to replace these values into the good ones
     if ($input['fieldtype'] == 'dropdown') {
         if (empty($input['dropdown_values'])) {
             Session::addMessageAfterRedirect(__('The field value is required:', 'formcreator') . ' ' . $input['name'], false, ERROR);
             return array();
         }
         $input['values'] = $input['dropdown_values'];
         $input['default_values'] = isset($input['dropdown_default_value']) ? $input['dropdown_default_value'] : '';
     }
     // Fields are differents for GLPI object lists, so we need to replace these values into the good ones
     if ($input['fieldtype'] == 'glpiselect') {
         if (empty($input['glpi_objects'])) {
             Session::addMessageAfterRedirect(__('The field value is required:', 'formcreator') . ' ' . $input['name'], false, ERROR);
             return array();
         }
         $input['values'] = $input['glpi_objects'];
         $input['default_values'] = isset($input['dropdown_default_value']) ? $input['dropdown_default_value'] : '';
     }
     // A description field should have a description
     if ($input['fieldtype'] == 'description' && empty($input['description'])) {
         Session::addMessageAfterRedirect(__('A description field should have a description:', 'formcreator') . ' ' . $input['name'], false, ERROR);
         return array();
     }
     // format values for numbers
     if ($input['fieldtype'] == 'integer' || $input['fieldtype'] == 'float') {
         $input['default_values'] = !empty($input['default_values']) ? (double) str_replace(',', '.', $input['default_values']) : null;
         $input['range_min'] = !empty($input['range_min']) ? (double) str_replace(',', '.', $input['range_min']) : null;
         $input['range_max'] = !empty($input['range_max']) ? (double) str_replace(',', '.', $input['range_max']) : null;
     }
     // LDAP fields validation
     if ($input['fieldtype'] == 'ldapselect') {
         // Fields are differents for dropdown lists, so we need to replace these values into the good ones
         if (!empty($input['ldap_auth'])) {
             $config_ldap = new AuthLDAP();
             $config_ldap->getFromDB($input['ldap_auth']);
             $ldap_dropdown = new RuleRightParameter();
             $ldap_dropdown->getFromDB($input['ldap_attribute']);
             $attribute = array($ldap_dropdown->fields['value']);
             // Set specific error handler too catch LDAP errors
             if (!function_exists('warning_handler')) {
                 function warning_handler($errno, $errstr, $errfile, $errline, array $errcontext)
                 {
                     if (0 === error_reporting()) {
                         return false;
                     }
                     throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
                 }
             }
             set_error_handler("warning_handler", E_WARNING);
             try {
                 $ds = $config_ldap->connect();
                 ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
                 ldap_control_paged_result($ds, 1);
                 $sn = ldap_search($ds, $config_ldap->fields['basedn'], $input['ldap_filter'], $attribute);
                 $entries = ldap_get_entries($ds, $sn);
             } catch (Exception $e) {
                 Session::addMessageAfterRedirect(__('Cannot recover LDAP informations!', 'formcreator'), false, ERROR);
             }
             restore_error_handler();
             $input['values'] = json_encode(array('ldap_auth' => $input['ldap_auth'], 'ldap_filter' => $input['ldap_filter'], 'ldap_attribute' => strtolower($input['ldap_attribute'])));
         }
     }
     // Add leading and trailing regex marker automaticaly
     if (!empty($input['regex'])) {
         if (substr($input['regex'], 0, 1) != '/') {
             if (substr($input['regex'], 0, 1) != '^') {
                 $input['regex'] = '/^' . $input['regex'];
             } else {
                 $input['regex'] = '/' . $input['regex'];
             }
         }
         if (substr($input['regex'], -1, 1) != '/') {
             if (substr($input['regex'], -1, 1) != '$') {
                 $input['regex'] = $input['regex'] . '$/';
             } else {
                 $input['regex'] = $input['regex'] . '/';
             }
         }
     }
     return $input;
 }
コード例 #6
0
 static function searchUser(AuthLDAP $authldap)
 {
     global $LANG;
     if (self::connectToServer($authldap->getField('host'), $authldap->getField('port'), $authldap->getField('rootdn'), decrypt($authldap->getField('rootdn_passwd'), GLPIKEY), $authldap->getField('use_tls'), $authldap->getField('deref_option'))) {
         self::showLdapUsers();
     } else {
         echo "<div class='center b'>" . $LANG['ldap'][6] . "<br>";
     }
 }
コード例 #7
0
ファイル: user.class.php プロジェクト: geldarr/hack-space
 /**
  * Display information from LDAP server for user
  **/
 private function showLdapDebug()
 {
     if ($this->fields['authtype'] != Auth::LDAP) {
         return false;
     }
     echo "<div class='spaced'>";
     echo "<table class='tab_cadre_fixe'>";
     echo "<tr><th colspan='4'>" . __('LDAP directory') . "</th></tr>";
     echo "<tr class='tab_bg_2'><td>" . __('User DN') . "</td>";
     echo "<td>" . $this->fields['user_dn'] . "</td></tr>\n";
     if ($this->fields['user_dn']) {
         echo "<tr class='tab_bg_2'><td>" . __('User information') . "</td><td>";
         $config_ldap = new AuthLDAP();
         $ds = false;
         if ($config_ldap->getFromDB($this->fields['auths_id'])) {
             $ds = $config_ldap->connect();
         }
         if ($ds) {
             $info = AuthLdap::getUserByDn($ds, $this->fields['user_dn'], array('*', 'createTimeStamp', 'modifyTimestamp'));
             if (is_array($info)) {
                 Html::printCleanArray($info);
             } else {
                 _e('No item to display');
             }
         } else {
             _e('Connection failed');
         }
         echo "</td></tr>\n";
     }
     echo "</table></div>";
 }
コード例 #8
0
ファイル: auth.class.php プロジェクト: JULIO8/respaldo_glpi
 /**
  *  @see CommonGLPI::getMenuContent()
  *
  *  @since version 0.85
  **/
 static function getMenuContent()
 {
     $menu = array();
     if (Config::canUpdate()) {
         $menu['title'] = __('Authentication');
         $menu['page'] = '/front/setup.auth.php';
         $menu['options']['ldap']['title'] = AuthLDAP::getTypeName(Session::getPluralNumber());
         $menu['options']['ldap']['page'] = '/front/authldap.php';
         $menu['options']['ldap']['links']['search'] = '/front/authldap.php';
         $menu['options']['ldap']['links']['add'] = '' . '/front/authldap.form.php';
         $menu['options']['imap']['title'] = AuthMail::getTypeName(Session::getPluralNumber());
         $menu['options']['imap']['page'] = '/front/authmail.php';
         $menu['options']['imap']['links']['search'] = '/front/authmail.php';
         $menu['options']['imap']['links']['add'] = '' . '/front/authmail.form.php';
         $menu['options']['others']['title'] = __('Others');
         $menu['options']['others']['page'] = '/front/auth.others.php';
         $menu['options']['settings']['title'] = __('Setup');
         $menu['options']['settings']['page'] = '/front/auth.settings.php';
     }
     if (count($menu)) {
         return $menu;
     }
     return false;
 }
コード例 #9
0
// ----------------------------------------------------------------------
// Original Author of file: Julien Dombre
// Purpose of file:
// ----------------------------------------------------------------------
define('GLPI_ROOT', '..');
include GLPI_ROOT . "/inc/includes.php";
header("Content-Type: text/html; charset=UTF-8");
header_nocache();
if (!isset($_POST['id'])) {
    exit;
}
if (!isset($_REQUEST['glpi_tab'])) {
    exit;
}
checkRight('config', 'r');
$authldap = new AuthLDAP();
if ($_POST['id'] > 0 && $authldap->can($_POST['id'], 'r')) {
    switch ($_REQUEST['glpi_tab']) {
        case -1:
            $authldap->showFormUserConfig($_POST['id'], $_POST['target']);
            $authldap->showFormGroupsConfig($_POST['id'], $_POST['target']);
            $authldap->showFormAdvancedConfig($_POST['id'], $_POST['target']);
            $authldap->showFormReplicatesConfig($_POST['id'], $_POST['target']);
            Log::showForItem($authldap);
            break;
        case 2:
            $authldap->showFormUserConfig($_POST['id'], $_POST['target']);
            break;
        case 3:
            $authldap->showFormGroupsConfig($_POST['id'], $_POST['target']);
            break;
コード例 #10
0
ファイル: authldap.form.php プロジェクト: glpi-project/glpi
GLPI 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 GLPI. If not, see <http://www.gnu.org/licenses/>.
--------------------------------------------------------------------------
*/
/** @file
* @brief
*/
include '../inc/includes.php';
Session::checkRight("config", UPDATE);
$config = new Config();
$config_ldap = new AuthLDAP();
if (!isset($_GET['id'])) {
    $_GET['id'] = "";
}
//LDAP Server add/update/delete
if (isset($_POST["update"])) {
    $config_ldap->update($_POST);
    Html::back();
} else {
    if (isset($_POST["add"])) {
        //If no name has been given to this configuration, then go back to the page without adding
        if ($_POST["name"] != "") {
            if ($newID = $config_ldap->add($_POST)) {
                if (AuthLdap::testLDAPConnection($newID)) {
                    Session::addMessageAfterRedirect(__('Test successful'));
                } else {
コード例 #11
0
You should have received a copy of the GNU General Public License
along with GLPI. If not, see <http://www.gnu.org/licenses/>.
--------------------------------------------------------------------------
*/
/** @file
* @brief
*/
$AJAX_INCLUDE = 1;
include '../inc/includes.php';
header("Content-Type: text/html; charset=UTF-8");
Html::header_nocache();
Session::checkRight('user', User::UPDATEAUTHENT);
if ($_POST["authtype"] > 0) {
    $name = 'massiveaction';
    if (isset($_POST['name'])) {
        $name = $_POST['name'];
    }
    switch ($_POST["authtype"]) {
        case Auth::DB_GLPI:
            echo "<input type='hidden' name='auths_id' value='0'>";
            break;
        case Auth::LDAP:
        case Auth::EXTERNAL:
            AuthLDAP::dropdown(array('name' => "auths_id", 'condition' => "`is_active` = 1"));
            break;
        case Auth::MAIL:
            AuthMail::dropdown(array('name' => "auths_id", 'condition' => "`is_active` = 1"));
            break;
    }
    echo "&nbsp;<input type='submit' name='{$name}' class='submit' value=\"" . _sx('button', 'Post') . "\">";
}
コード例 #12
0
ファイル: hook.php プロジェクト: pluginsGLPI/moreldap
function plugin_moreldap_item_add_or_update_user($user)
{
    //Ignore users without auths_id
    if (!isset($user->input["auths_id"])) {
        return;
    }
    // We update LDAP field only if LDAP directory is defined
    if (isset($user->input["locations_id"])) {
        return;
    }
    // default : store locations outside of any entity
    $entityID = -1;
    $pluginAuthLDAP = new PluginMoreldapAuthLDAP();
    $authsId = isset($user->input["auths_id"]) ? $user->input["auths_id"] : $user->fields["auths_id"];
    if ($authsId > 0 && $pluginAuthLDAP->getFromDBByQuery("WHERE `id`='{$authsId}'")) {
        // The target entity for the locations to be created
        $entityID = $pluginAuthLDAP->fields['entities_id'];
        // find from config all attributes to read from LDAP
        $fields = array();
        $locationHierarchy = explode('>', $pluginAuthLDAP->fields['location']);
        foreach ($locationHierarchy as $locationSubAttribute) {
            $locationSubAttribute = trim($locationSubAttribute);
            if (strlen($locationSubAttribute) > 0) {
                $fields[] = $locationSubAttribute;
            }
        }
        // LDAP query to read the needed attributes for the user
        $ldap_connection = 0;
        if (!isset($user->input["_ldap_conn"]) || !isset($user->fields["_ldap_conn"])) {
            $ldap = new AuthLDAP();
            $ldap->getFromDB($authsId);
            $ldap_connection = $ldap->connect();
        } else {
            $ldap_connection = isset($user->input["_ldap_conn"]) ? $user->input["_ldap_conn"] : $user->fields["_ldap_conn"];
        }
        $userdn = isset($user->input["user_dn"]) ? $user->input["user_dn"] : $user->fields["user_dn"];
        $userdn = str_replace('\\\\', '\\', $userdn);
        $sr = @ldap_read($ldap_connection, $userdn, "objectClass=*", $fields);
        if (!is_resource($sr) || ldap_errno($ldap_connection) > 0) {
            return;
        }
        $v = AuthLDAP::get_entries_clean($ldap_connection, $sr);
        //Find all locations needed to create the deepest one
        $locationPath = array();
        $incompleteLocation = false;
        foreach ($fields as $locationSubAttribute) {
            $locationSubAttribute = strtolower($locationSubAttribute);
            if (isset($v[0][$locationSubAttribute][0])) {
                $locationPath[] = $v[0][$locationSubAttribute][0];
            } else {
                // A LDAP attribute is not defined for the user. Cannot build the completename
                // Therefore we must giveup importing this location
                $incompleteLocation = true;
            }
        }
        // TODO : test if location import is enabled earlier in this function
        if ($pluginAuthLDAP->fields['location_enabled'] == 'Y') {
            if ($incompleteLocation == false) {
                $location = new Location();
                $locationAncestor = 0;
                $locationCompleteName = array();
                $allLocationsExist = true;
                // Assume we created or found all locations
                // while ($locatinItem = array_shift($locationPath) && $allLocationsExist) {
                foreach ($locationPath as $locationItem) {
                    if ($allLocationsExist) {
                        $locationCompleteName[] = $locationItem;
                        $locationItem = Toolbox::addslashes_deep(array('entities_id' => $entityID, 'name' => $locationItem, 'locations_id' => $locationAncestor, 'completename' => implode(' > ', $locationCompleteName), 'is_recursive' => $pluginAuthLDAP->fields['is_recursive'], 'comment' => __("Created by MoreLDAP", "moreldap")));
                        $locationAncestor = $location->findID($locationItem);
                        if ($locationAncestor == -1) {
                            // The location does not exists yet
                            $locationAncestor = $location->add($locationItem);
                        }
                        if ($locationAncestor == false) {
                            // If a location could not be imported and does not exist
                            // then give up importing children items
                            $allLocationsExist = false;
                        }
                    }
                }
                if ($allLocationsExist) {
                    // All locations exist to match the path described un LDAP
                    $locations_id = $locationAncestor;
                    $myuser = new User();
                    // new var to prevent user->input erasing (object are always passed by "reference")
                    $myuser->update(array('id' => $user->getID(), 'locations_id' => $locations_id));
                }
            }
        } else {
            // If the location retrieval is disabled, enablig this line will erase the location for the user.
            // $fields['locations_id'] = 0;
        }
    }
}
コード例 #13
0
ファイル: authldap.php プロジェクト: kipman/glpi
based on GLPI - Gestionnaire Libre de Parc Informatique
Copyright (C) 2003-2014 by the INDEPNET Development Team.

-------------------------------------------------------------------------

LICENSE

This file is part of GLPI.

GLPI 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.

GLPI 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 GLPI. If not, see <http://www.gnu.org/licenses/>.
--------------------------------------------------------------------------
*/
/** @file
* @brief
*/
include '../inc/includes.php';
Session::checkRight("config", READ);
Html::header(AuthLDAP::getTypeName(Session::getPluralNumber()), $_SERVER['PHP_SELF'], 'config', 'auth', 'ldap');
Search::show('AuthLDAP');
Html::footer();
コード例 #14
0
ファイル: authldap.php プロジェクト: gaforeror/glpi
Copyright (C) 2003-2013 by the INDEPNET Development Team.

http://indepnet.net/   http://glpi-project.org
-------------------------------------------------------------------------

LICENSE

This file is part of GLPI.

GLPI 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.

GLPI 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 GLPI. If not, see <http://www.gnu.org/licenses/>.
--------------------------------------------------------------------------
*/
/** @file
* @brief
*/
include '../inc/includes.php';
Session::checkRight("config", "r");
Html::header(AuthLDAP::getTypeName(2), $_SERVER['PHP_SELF'], 'config', 'extauth', 'ldap');
Search::show('AuthLDAP');
Html::footer();
コード例 #15
0
                 addMessageAfterRedirect($LANG['login'][22]);
             } else {
                 addMessageAfterRedirect($LANG['login'][23], false, ERROR);
             }
             glpi_header($CFG_GLPI["root_doc"] . "/front/authldap.php?next=extauth_ldap&id=" . $newID);
         }
     }
     glpi_header($_SERVER['HTTP_REFERER']);
 } else {
     if (isset($_POST["delete"])) {
         $config_ldap->delete($_POST);
         $_SESSION['glpi_authconfig'] = 1;
         $config_ldap->redirectToList();
     } else {
         if (isset($_POST["test_ldap"])) {
             $ldap = new AuthLDAP();
             $ldap->getFromDB($_POST["id"]);
             if (AuthLdap::testLDAPConnection($_POST["id"])) {
                 $_SESSION["LDAP_TEST_MESSAGE"] = $LANG['login'][22] . " (" . $LANG['ldap'][21] . " : " . $ldap->fields["name"] . ")";
             } else {
                 $_SESSION["LDAP_TEST_MESSAGE"] = $LANG['login'][23] . " (" . $LANG['ldap'][21] . " : " . $ldap->fields["name"] . ")";
             }
             glpi_header($_SERVER['HTTP_REFERER']);
         } else {
             if (isset($_POST["test_ldap_replicate"])) {
                 foreach ($_POST["test_ldap_replicate"] as $replicate_id => $value) {
                     $replicate = new AuthLdapReplicate();
                     $replicate->getFromDB($replicate_id);
                     if (AuthLdap::testLDAPConnection($_POST["id"], $replicate_id)) {
                         $_SESSION["LDAP_TEST_MESSAGE"] = $LANG['login'][22] . " (" . $LANG['ldap'][19] . " : " . $replicate->fields["name"] . ")";
                     } else {
コード例 #16
0
 public static function displayValue($value, $values)
 {
     if (!empty($values)) {
         $ldap_values = json_decode($values);
         $ldap_dropdown = new RuleRightParameter();
         $ldap_dropdown->getFromDB($ldap_values->ldap_attribute);
         $attribute = array($ldap_dropdown->fields['value']);
         $config_ldap = new AuthLDAP();
         $config_ldap->getFromDB($ldap_values->ldap_auth);
         $ds = $config_ldap->connect();
         $sn = ldap_search($ds, $config_ldap->fields['basedn'], $ldap_values->ldap_filter, $attribute);
         $entries = ldap_get_entries($ds, $sn);
         array_shift($entries);
         $tab_values = array();
         foreach ($entries as $id => $attr) {
             if (isset($attr[$attribute[0]]) && !in_array($attr[$attribute[0]][0], $tab_values)) {
                 $tab_values[$id] = $attr[$attribute[0]][0];
             }
         }
         sort($tab_values);
     }
     return $value != '' ? $tab_values[$value] : '';
 }
コード例 #17
0
 /**
  * @param $authldap  AuthLDAP object
  **/
 static function searchUser(AuthLDAP $authldap)
 {
     if (self::connectToServer($authldap->getField('host'), $authldap->getField('port'), $authldap->getField('rootdn'), Toolbox::decrypt($authldap->getField('rootdn_passwd'), GLPIKEY), $authldap->getField('use_tls'), $authldap->getField('deref_option'))) {
         self::showLdapUsers();
     } else {
         echo "<div class='center b firstbloc'>" . __('Unable to connect to the LDAP directory');
     }
 }
コード例 #18
0
ファイル: update_0803_083.php プロジェクト: btry/glpi
/**
 * Update from 0.80.3 to 0.83
 *
 * @return bool for success (will die for most error)
**/
function update0803to083()
{
    global $DB, $migration;
    $updateresult = true;
    $ADDTODISPLAYPREF = array();
    //TRANS: %s is the number of new version
    $migration->displayTitle(sprintf(__('Update to %s'), '0.83'));
    $migration->setVersion('0.83');
    $backup_tables = false;
    $newtables = array('glpi_entities_knowbaseitems', 'glpi_entities_reminders', 'glpi_groups_problems', 'glpi_groups_knowbaseitems', 'glpi_groups_reminders', 'glpi_knowbaseitems_profiles', 'glpi_knowbaseitems_users', 'glpi_items_problems', 'glpi_problems', 'glpi_problemtasks', 'glpi_problems_ticket', 'glpi_problems_users', 'glpi_profiles_reminders', 'glpi_reminders_users', 'glpi_ticketrecurrents', 'glpi_tickettemplates', 'glpi_tickettemplatehiddenfields', 'glpi_tickettemplatemandatoryfields', 'glpi_tickettemplatepredefinedfields', 'glpi_useremails');
    foreach ($newtables as $new_table) {
        // rename new tables if exists ?
        if (TableExists($new_table)) {
            $migration->dropTable("backup_{$new_table}");
            $migration->displayWarning("{$new_table} table already exists. " . "A backup have been done to backup_{$new_table}.");
            $backup_tables = true;
            $query = $migration->renameTable("{$new_table}", "backup_{$new_table}");
        }
    }
    if ($backup_tables) {
        $migration->displayWarning("You can delete backup tables if you have no need of them.", true);
    }
    //TRANS: %s is the table or item implied
    $migration->displayMessage(sprintf(__('Change of the database layout - %s'), 'Problems'));
    // Clean ticket validations : already done in 0.80
    $query = "DELETE\n             FROM `glpi_ticketvalidations`\n             WHERE `glpi_ticketvalidations`.`tickets_id` NOT IN (SELECT `glpi_tickets`.`id`\n                                                                 FROM `glpi_tickets`)";
    $DB->queryOrDie($query, "0.83 clean glpi_ticketvalidations");
    // Problems management
    if (!TableExists('glpi_problems')) {
        $query = "CREATE TABLE `glpi_problems` (\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\n                  `name` varchar(255) DEFAULT NULL,\n                  `entities_id` int(11) NOT NULL DEFAULT '0',\n                  `is_recursive` tinyint(1) NOT NULL DEFAULT '0',\n                  `is_deleted` tinyint(1) NOT NULL DEFAULT '0',\n                  `status` varchar(255) DEFAULT NULL,\n                  `content` longtext DEFAULT NULL,\n                  `date_mod` DATETIME DEFAULT NULL,\n                  `date` DATETIME DEFAULT NULL,\n                  `solvedate` DATETIME DEFAULT NULL,\n                  `closedate` DATETIME DEFAULT NULL,\n                  `due_date` DATETIME DEFAULT NULL,\n                  `users_id_recipient` int(11) NOT NULL DEFAULT '0',\n                  `users_id_lastupdater` int(11) NOT NULL DEFAULT '0',\n                  `suppliers_id_assign` int(11) NOT NULL DEFAULT '0',\n                  `urgency` int(11) NOT NULL DEFAULT '1',\n                  `impact` int(11) NOT NULL DEFAULT '1',\n                  `priority` int(11) NOT NULL DEFAULT '1',\n                  `itilcategories_id` int(11) NOT NULL DEFAULT '0',\n                  `impactcontent` longtext DEFAULT NULL,\n                  `causecontent` longtext DEFAULT NULL,\n                  `symptomcontent` longtext DEFAULT NULL,\n                  `solutiontypes_id` int(11) NOT NULL DEFAULT '0',\n                  `solution` text COLLATE utf8_unicode_ci,\n                  `actiontime` int(11) NOT NULL DEFAULT '0',\n                  `begin_waiting_date` datetime DEFAULT NULL,\n                  `waiting_duration` int(11) NOT NULL DEFAULT '0',\n                  `close_delay_stat` int(11) NOT NULL DEFAULT '0',\n                  `solve_delay_stat` int(11) NOT NULL DEFAULT '0',\n                  `notepad` LONGTEXT NULL,\n                  PRIMARY KEY (`id`),\n                  KEY `name` (`name`),\n                  KEY `entities_id` (`entities_id`),\n                  KEY `is_recursive` (`is_recursive`),\n                  KEY `is_deleted` (`is_deleted`),\n                  KEY `date` (`date`),\n                  KEY `closedate` (`closedate`),\n                  KEY `status` (`status`(1)),\n                  KEY `priority` (`priority`),\n                  KEY `date_mod` (`date_mod`),\n                  KEY `suppliers_id_assign` (`suppliers_id_assign`),\n                  KEY `itilcategories_id` (`itilcategories_id`),\n                  KEY `users_id_recipient` (`users_id_recipient`),\n                  KEY `solvedate` (`solvedate`),\n                  KEY `solutiontypes_id` (`solutiontypes_id`),\n                  KEY `urgency` (`urgency`),\n                  KEY `impact` (`impact`),\n                  KEY `due_date` (`due_date`),\n                  KEY `users_id_lastupdater` (`users_id_lastupdater`)\n                ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
        $DB->queryOrDie($query, "0.83 create glpi_problems");
        $ADDTODISPLAYPREF['Problem'] = array(21, 12, 19, 15, 3, 7, 18);
    }
    if (FieldExists('glpi_tickets', 'ticket_waiting_duration', false)) {
        $migration->changeField('glpi_tickets', 'ticket_waiting_duration', 'waiting_duration', 'integer');
    }
    if (!TableExists('glpi_problems_users')) {
        $query = "CREATE TABLE `glpi_problems_users` (\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\n                  `problems_id` int(11) NOT NULL DEFAULT '0',\n                  `users_id` int(11) NOT NULL DEFAULT '0',\n                  `type` int(11) NOT NULL DEFAULT '1',\n                  `use_notification` tinyint(1) NOT NULL DEFAULT '0',\n                  `alternative_email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,\n                  PRIMARY KEY (`id`),\n                  UNIQUE KEY `unicity` (`problems_id`,`type`,`users_id`,`alternative_email`),\n                  KEY `user` (`users_id`,`type`)\n                ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
        $DB->queryOrDie($query, "0.83 add table glpi_problems_users");
    }
    if (!TableExists('glpi_groups_problems')) {
        $query = "CREATE TABLE `glpi_groups_problems` (\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\n                  `problems_id` int(11) NOT NULL DEFAULT '0',\n                  `groups_id` int(11) NOT NULL DEFAULT '0',\n                  `type` int(11) NOT NULL DEFAULT '1',\n                  PRIMARY KEY (`id`),\n                  UNIQUE KEY `unicity` (`problems_id`,`type`,`groups_id`),\n                  KEY `group` (`groups_id`,`type`)\n                ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
        $DB->queryOrDie($query, "0.83 add table glpi_groups_problems");
    }
    if (!TableExists('glpi_items_problems')) {
        $query = "CREATE TABLE `glpi_items_problems` (\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\n                  `problems_id` int(11) NOT NULL DEFAULT '0',\n                  `itemtype` varchar(100) default NULL,\n                  `items_id` int(11) NOT NULL DEFAULT '0',\n                  PRIMARY KEY (`id`),\n                  UNIQUE KEY `unicity` (`problems_id`,`itemtype`,`items_id`),\n                  KEY `item` (`itemtype`,`items_id`)\n                ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
        $DB->queryOrDie($query, "0.83 add table glpi_items_problems");
    }
    if (!TableExists('glpi_problems_tickets')) {
        $query = "CREATE TABLE `glpi_problems_tickets` (\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\n                  `problems_id` int(11) NOT NULL DEFAULT '0',\n                  `tickets_id` int(11) NOT NULL DEFAULT '0',\n                  PRIMARY KEY (`id`),\n                  UNIQUE KEY `unicity` (`problems_id`,`tickets_id`),\n                  KEY `tickets_id` (`tickets_id`)\n                ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
        $DB->queryOrDie($query, "0.83 add table glpi_problems_tickets");
    }
    if (!TableExists('glpi_problemtasks')) {
        $query = "CREATE TABLE `glpi_problemtasks` (\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\n                  `problems_id` int(11) NOT NULL DEFAULT '0',\n                  `taskcategories_id` int(11) NOT NULL DEFAULT '0',\n                  `date` datetime DEFAULT NULL,\n                  `begin` datetime DEFAULT NULL,\n                  `end` datetime DEFAULT NULL,\n                  `users_id` int(11) NOT NULL DEFAULT '0',\n                  `users_id_tech` int(11) NOT NULL DEFAULT '0',\n                  `content` longtext COLLATE utf8_unicode_ci,\n                  `actiontime` int(11) NOT NULL DEFAULT '0',\n                  `state` int(11) NOT NULL DEFAULT '0',\n                  PRIMARY KEY (`id`),\n                  KEY `problems_id` (`problems_id`),\n                  KEY `users_id` (`users_id`),\n                  KEY `users_id_tech` (`users_id_tech`),\n                  KEY `date` (`date`),\n                  KEY `begin` (`begin`),\n                  KEY `end` (`end`),\n                  KEY `state` (`state`),\n                  KEY `taskcategories_id` (taskcategories_id)\n                ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
        $DB->queryOrDie($query, "0.83 add table glpi_problemtasks");
    }
    $migration->addField("glpi_profiles", "show_my_problem", "char", array('update' => "1", 'condition' => " WHERE `own_ticket` = 1"));
    $migration->addField("glpi_profiles", "show_all_problem", "char", array('update' => "1", 'condition' => " WHERE `show_all_ticket` = 1"));
    $migration->addField("glpi_profiles", "edit_all_problem", "char", array('update' => "1", 'condition' => " WHERE `update_ticket` = 1"));
    $migration->changeField("glpi_profiles", 'helpdesk_status', 'ticket_status', "text", array('comment' => "json encoded array of from/dest allowed status change"));
    $migration->addField('glpi_profiles', 'problem_status', "text", array('comment' => "json encoded array of from/dest allowed status change"));
    $migration->displayMessage(sprintf(__('Change of the database layout - %s'), 'Changes'));
    $migration->displayMessage(sprintf(__('Change of the database layout - %s'), 'TicketPlanning'));
    // Merge tickettasks and ticket planning
    if (TableExists('glpi_ticketplannings')) {
        $migration->addField("glpi_tickettasks", "begin", "datetime");
        $migration->addField("glpi_tickettasks", "end", "datetime");
        $migration->addField("glpi_tickettasks", "state", "integer", array('value' => '1'));
        $migration->addField("glpi_tickettasks", "users_id_tech", "integer");
        $migration->migrationOneTable('glpi_tickettasks');
        // migrate DATA
        $task = new TicketTask();
        foreach ($DB->request('glpi_ticketplannings') as $data) {
            if ($task->getFromDB($data['tickettasks_id'])) {
                $query = "UPDATE `glpi_tickettasks`\n                      SET `begin` = " . ($data['begin'] == 'NULL' || is_null($data['begin']) ? 'NULL' : "'" . $data['begin'] . "'") . ",\n                          `end` = " . ($data['end'] == 'NULL' || is_null($data['end']) ? 'NULL' : "'" . $data['end'] . "'") . ",\n                          `users_id_tech` = '" . $data['users_id'] . "',\n                          `state` = '" . $data['state'] . "'\n                      WHERE `id` = '" . $data['tickettasks_id'] . "'";
                $DB->queryOrDie($query, "0.83 migrate planning to glpi_tickettasks");
            }
        }
        $migration->dropTable("glpi_ticketplannings");
        $migration->displayMessage(sprintf(__('Change of the database layout - %s'), 'Notification'));
        // Migrate templates
        $from = array('task.planning.user##', 'task.planning.begin##', 'task.planning.end##', 'task.planning.status##');
        $to = array('task.user##', 'task.begin##', 'task.end##', 'task.status##');
        $query = "SELECT `glpi_notificationtemplatetranslations`.*\n                FROM `glpi_notificationtemplatetranslations`\n                INNER JOIN `glpi_notificationtemplates`\n                     ON (`glpi_notificationtemplates`.`id`\n                           = `glpi_notificationtemplatetranslations`.`notificationtemplates_id`)\n                WHERE `glpi_notificationtemplates`.`itemtype` = 'Ticket'";
        if ($result = $DB->query($query)) {
            if ($DB->numrows($result)) {
                while ($data = $DB->fetch_assoc($result)) {
                    $query = "UPDATE `glpi_notificationtemplatetranslations`\n                         SET `subject` = '" . addslashes(str_replace($from, $to, $data['subject'])) . "',\n                             `content_text` = '" . addslashes(str_replace($from, $to, $data['content_text'])) . "',\n                             `content_html` = '" . addslashes(str_replace($from, $to, $data['content_html'])) . "'\n                         WHERE `id` = " . $data['id'] . "";
                    $DB->queryOrDie($query, "0.83 fix tags usage for multi users");
                }
            }
        }
    }
    $query = "SELECT *\n             FROM `glpi_notificationtemplates`\n             WHERE `name` = 'Problems'";
    if ($result = $DB->query($query)) {
        if ($DB->numrows($result) == 0) {
            $query = "INSERT INTO `glpi_notificationtemplates`\n                          (`name`, `itemtype`, `date_mod`)\n                   VALUES ('Problems', 'Problem', NOW())";
            $DB->queryOrDie($query, "0.83 add problem notification");
            $notid = $DB->insert_id();
            $query = "INSERT INTO `glpi_notificationtemplatetranslations`\n                          (`notificationtemplates_id`, `language`, `subject`,\n                           `content_text`,\n                           `content_html`)\n                   VALUES ({$notid}, '', '##problem.action## ##problem.title##',\n                          '##IFproblem.storestatus=solved##\n ##lang.problem.url## : ##problem.urlapprove##\n ##lang.problem.solvedate## : ##problem.solvedate##\n ##lang.problem.solution.type## : ##problem.solution.type##\n ##lang.problem.solution.description## : ##problem.solution.description## ##ENDIFproblem.storestatus##\n ##ELSEproblem.storestatus## ##lang.problem.url## : ##problem.url## ##ENDELSEproblem.storestatus##\n\n ##lang.problem.description##\n\n ##lang.problem.title## &#160;:##problem.title##\n ##lang.problem.authors## &#160;:##IFproblem.authors## ##problem.authors## ##ENDIFproblem.authors## ##ELSEproblem.authors##--##ENDELSEproblem.authors##\n ##lang.problem.creationdate## &#160;:##problem.creationdate##\n ##IFproblem.assigntousers## ##lang.problem.assigntousers## &#160;: ##problem.assigntousers## ##ENDIFproblem.assigntousers##\n ##lang.problem.status## &#160;: ##problem.status##\n ##IFproblem.assigntogroups## ##lang.problem.assigntogroups## &#160;: ##problem.assigntogroups## ##ENDIFproblem.assigntogroups##\n ##lang.problem.urgency## &#160;: ##problem.urgency##\n ##lang.problem.impact## &#160;: ##problem.impact##\n ##lang.problem.priority## : ##problem.priority##\n##IFproblem.category## ##lang.problem.category## &#160;:##problem.category## ##ENDIFproblem.category## ##ELSEproblem.category## ##lang.problem.nocategoryassigned## ##ENDELSEproblem.category##\n ##lang.problem.content## &#160;: ##problem.content##\n\n##IFproblem.storestatus=closed##\n ##lang.problem.solvedate## : ##problem.solvedate##\n ##lang.problem.solution.type## : ##problem.solution.type##\n ##lang.problem.solution.description## : ##problem.solution.description##\n##ENDIFproblem.storestatus##\n ##lang.problem.numberoftickets##&#160;: ##problem.numberoftickets##\n\n##FOREACHtickets##\n [##ticket.date##] ##lang.problem.title## : ##ticket.title##\n ##lang.problem.content## ##ticket.content##\n\n##ENDFOREACHtickets##\n ##lang.problem.numberoftasks##&#160;: ##problem.numberoftasks##\n\n##FOREACHtasks##\n [##task.date##]\n ##lang.task.author## ##task.author##\n ##lang.task.description## ##task.description##\n ##lang.task.time## ##task.time##\n ##lang.task.category## ##task.category##\n\n##ENDFOREACHtasks##\n',\n                          '&lt;p&gt;##IFproblem.storestatus=solved##&lt;/p&gt;\n&lt;div&gt;##lang.problem.url## : &lt;a href=\"##problem.urlapprove##\"&gt;##problem.urlapprove##&lt;/a&gt;&lt;/div&gt;\n&lt;div&gt;&lt;span style=\"color: #888888;\"&gt;&lt;strong&gt;&lt;span style=\"text-decoration: underline;\"&gt;##lang.problem.solvedate##&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; : ##problem.solvedate##&lt;br /&gt;&lt;span style=\"text-decoration: underline; color: #888888;\"&gt;&lt;strong&gt;##lang.problem.solution.type##&lt;/strong&gt;&lt;/span&gt; : ##problem.solution.type##&lt;br /&gt;&lt;span style=\"text-decoration: underline; color: #888888;\"&gt;&lt;strong&gt;##lang.problem.solution.description##&lt;/strong&gt;&lt;/span&gt; : ##problem.solution.description## ##ENDIFproblem.storestatus##&lt;/div&gt;\n&lt;div&gt;##ELSEproblem.storestatus## ##lang.problem.url## : &lt;a href=\"##problem.url##\"&gt;##problem.url##&lt;/a&gt; ##ENDELSEproblem.storestatus##&lt;/div&gt;\n&lt;p class=\"description b\"&gt;&lt;strong&gt;##lang.problem.description##&lt;/strong&gt;&lt;/p&gt;\n&lt;p&gt;&lt;span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"&gt; ##lang.problem.title##&lt;/span&gt;&#160;:##problem.title## &lt;br /&gt; &lt;span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"&gt; ##lang.problem.authors##&lt;/span&gt;&#160;:##IFproblem.authors## ##problem.authors## ##ENDIFproblem.authors##    ##ELSEproblem.authors##--##ENDELSEproblem.authors## &lt;br /&gt; &lt;span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"&gt; ##lang.problem.creationdate##&lt;/span&gt;&#160;:##problem.creationdate## &lt;br /&gt; ##IFproblem.assigntousers## &lt;span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"&gt; ##lang.problem.assigntousers##&lt;/span&gt;&#160;: ##problem.assigntousers## ##ENDIFproblem.assigntousers##&lt;br /&gt; &lt;span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"&gt;##lang.problem.status## &lt;/span&gt;&#160;: ##problem.status##&lt;br /&gt; ##IFproblem.assigntogroups## &lt;span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"&gt; ##lang.problem.assigntogroups##&lt;/span&gt;&#160;: ##problem.assigntogroups## ##ENDIFproblem.assigntogroups##&lt;br /&gt; &lt;span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"&gt; ##lang.problem.urgency##&lt;/span&gt;&#160;: ##problem.urgency##&lt;br /&gt; &lt;span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"&gt; ##lang.problem.impact##&lt;/span&gt;&#160;: ##problem.impact##&lt;br /&gt; &lt;span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"&gt; ##lang.problem.priority##&lt;/span&gt; : ##problem.priority## &lt;br /&gt;##IFproblem.category##&lt;span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"&gt;##lang.problem.category## &lt;/span&gt;&#160;:##problem.category##  ##ENDIFproblem.category## ##ELSEproblem.category##  ##lang.problem.nocategoryassigned## ##ENDELSEproblem.category##    &lt;br /&gt; &lt;span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"&gt; ##lang.problem.content##&lt;/span&gt;&#160;: ##problem.content##&lt;/p&gt;\n&lt;p&gt;##IFproblem.storestatus=closed##&lt;br /&gt;&lt;span style=\"text-decoration: underline;\"&gt;&lt;strong&gt;&lt;span style=\"color: #888888;\"&gt;##lang.problem.solvedate##&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; : ##problem.solvedate##&lt;br /&gt;&lt;span style=\"color: #888888;\"&gt;&lt;strong&gt;&lt;span style=\"text-decoration: underline;\"&gt;##lang.problem.solution.type##&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; : ##problem.solution.type##&lt;br /&gt;&lt;span style=\"text-decoration: underline; color: #888888;\"&gt;&lt;strong&gt;##lang.problem.solution.description##&lt;/strong&gt;&lt;/span&gt; : ##problem.solution.description##&lt;br /&gt;##ENDIFproblem.storestatus##&lt;/p&gt;\n&lt;div class=\"description b\"&gt;##lang.problem.numberoftickets##&#160;: ##problem.numberoftickets##&lt;/div&gt;\n&lt;p&gt;##FOREACHtickets##&lt;/p&gt;\n&lt;div&gt;&lt;strong&gt; [##ticket.date##] &lt;em&gt;##lang.problem.title## : &lt;a href=\"##ticket.url##\"&gt;##ticket.title## &lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt; &lt;span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"&gt; &lt;/span&gt;&lt;span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"&gt;##lang.problem.content## &lt;/span&gt; ##ticket.content##\n&lt;p&gt;##ENDFOREACHtickets##&lt;/p&gt;\n&lt;div class=\"description b\"&gt;##lang.problem.numberoftasks##&#160;: ##problem.numberoftasks##&lt;/div&gt;\n&lt;p&gt;##FOREACHtasks##&lt;/p&gt;\n&lt;div class=\"description b\"&gt;&lt;strong&gt;[##task.date##] &lt;/strong&gt;&lt;br /&gt; &lt;span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"&gt; ##lang.task.author##&lt;/span&gt; ##task.author##&lt;br /&gt; &lt;span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"&gt; ##lang.task.description##&lt;/span&gt; ##task.description##&lt;br /&gt; &lt;span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"&gt; ##lang.task.time##&lt;/span&gt; ##task.time##&lt;br /&gt; &lt;span style=\"color: #8b8c8f; font-weight: bold; text-decoration: underline;\"&gt; ##lang.task.category##&lt;/span&gt; ##task.category##&lt;/div&gt;\n&lt;p&gt;##ENDFOREACHtasks##&lt;/p&gt;\n&lt;/div&gt;')";
            $DB->queryOrDie($query, "0.83 add problem notification translation");
            $notifications = array('new' => array(), 'update' => array(Notification::ASSIGN_TECH, Notification::OLD_TECH_IN_CHARGE), 'solved' => array(), 'add_task' => array(), 'update_task' => array(), 'delete_task' => array(), 'closed' => array(), 'delete' => array());
            $notif_names = array('new' => 'New Problem', 'update' => 'Update Problem', 'solved' => 'Resolve Problem', 'add_task' => 'Add Task', 'update_task' => 'Update Task', 'delete_task' => 'Delete Task', 'closed' => 'Close Problem', 'delete' => 'Delete Problem');
            foreach ($notifications as $key => $val) {
                $notifications[$key][] = Notification::AUTHOR;
                $notifications[$key][] = Notification::GLOBAL_ADMINISTRATOR;
                $notifications[$key][] = Notification::OBSERVER;
            }
            foreach ($notifications as $type => $targets) {
                $query = "INSERT INTO `glpi_notifications`\n                             (`name`, `entities_id`, `itemtype`, `event`, `mode`,\n                              `notificationtemplates_id`, `comment`, `is_recursive`, `is_active`,\n                              `date_mod`)\n                      VALUES ('" . $notif_names[$type] . "', 0, 'Problem', '{$type}', 'mail',\n                              {$notid}, '', 1, 1, NOW())";
                $DB->queryOrDie($query, "0.83 add problem {$type} notification");
                $notifid = $DB->insert_id();
                foreach ($targets as $target) {
                    $query = "INSERT INTO `glpi_notificationtargets`\n                                (`id`, `notifications_id`, `type`, `items_id`)\n                         VALUES (NULL, {$notifid}, " . Notification::USER_TYPE . ", {$target});";
                    $DB->queryOrDie($query, "0.83 add problem {$type} notification target");
                }
            }
        }
    }
    $migration->displayMessage(sprintf(__('Data migration - %s'), 'Clean Vlans'));
    // Clean `glpi_networkports_vlans` datas (`networkports_id` whithout networkports)
    $query = "DELETE\n             FROM `glpi_networkports_vlans`\n             WHERE `networkports_id` NOT IN (SELECT `id`\n                                             FROM `glpi_networkports`)";
    $DB->queryOrDie($query, "0.83 clean networkports_vlans datas");
    $migration->displayMessage(sprintf(__('Change of the database layout - %s'), 'Rename Solution objects'));
    // rename glpi_ticketsolutiontypes to glpi_solutiontypes
    $migration->renameTable('glpi_ticketsolutiontypes', 'glpi_solutiontypes');
    // rename glpi_ticketsolutiontemplates to glpi_solutiontemplates
    $migration->renameTable('glpi_ticketsolutiontemplates', 'glpi_solutiontemplates');
    $migration->changeField('glpi_tickets', 'ticketsolutiontypes_id', 'solutiontypes_id', 'integer');
    $migration->changeField('glpi_solutiontemplates', 'ticketsolutiontypes_id', 'solutiontypes_id', 'integer');
    $migration->changeField('glpi_tickets_users', 'use_notification', 'use_notification', 'bool', array('value' => '1'));
    // to have correct name of key
    $migration->dropKey('glpi_tickets', 'ticketsolutiontypes_id');
    $migration->migrationOneTable('glpi_tickets');
    $migration->addKey('glpi_tickets', 'solutiontypes_id');
    $migration->dropKey('glpi_solutiontemplates', 'ticketsolutiontypes_id');
    $migration->migrationOneTable('glpi_solutiontemplates');
    $migration->addKey('glpi_solutiontemplates', 'solutiontypes_id');
    $migration->displayMessage(sprintf(__('Change of the database layout - %s'), 'Rename Category objects'));
    $migration->renameTable('glpi_ticketcategories', 'glpi_itilcategories');
    $migration->dropKey('glpi_itilcategories', 'ticketcategories_id');
    $migration->changeField('glpi_itilcategories', 'ticketcategories_id', 'itilcategories_id', 'integer');
    $migration->migrationOneTable('glpi_itilcategories');
    $migration->addKey('glpi_itilcategories', 'itilcategories_id');
    $migration->dropKey('glpi_tickets', 'ticketcategories_id');
    $migration->changeField('glpi_tickets', 'ticketcategories_id', 'itilcategories_id', 'integer');
    $migration->migrationOneTable('glpi_tickets');
    $migration->addKey('glpi_tickets', 'itilcategories_id');
    // Update Itemtype datas in tables
    $itemtype_tables = array("glpi_bookmarks", "glpi_bookmarks_users", "glpi_displaypreferences");
    $typestochange = array('TicketSolutionTemplate' => 'SolutionTemplate', 'TicketSolutionType' => 'SolutionType', 'TicketCategory' => 'ITILCategory');
    foreach ($itemtype_tables as $table) {
        foreach ($typestochange as $key => $val) {
            $query = "UPDATE `{$table}`\n                   SET `itemtype` = '{$val}'\n                   WHERE `itemtype` = '{$key}'";
            $DB->queryOrDie($query, "0.83 update itemtype of table {$table} for {$val}");
        }
    }
    $migration->displayMessage(sprintf(__('Change of the database layout - %s'), 'Add various fields'));
    $migration->addField("glpi_states", 'states_id', "integer");
    $migration->addField("glpi_states", 'completename', "text");
    $migration->addField("glpi_states", 'level', "integer");
    $migration->addField("glpi_states", 'ancestors_cache', "longtext");
    $migration->addField("glpi_states", 'sons_cache', "longtext");
    $migration->migrationOneTable('glpi_states');
    $migration->addKey("glpi_states", array('states_id', 'name'), 'unicity');
    regenerateTreeCompleteName("glpi_states");
    $migration->addField("glpi_knowbaseitemcategories", 'ancestors_cache', "longtext");
    $migration->addField("glpi_knowbaseitemcategories", 'sons_cache', "longtext");
    $migration->changeField("glpi_authldaps", 'group_condition', 'group_condition', "text");
    $migration->dropKey("glpi_groups", 'ldap_value');
    $migration->changeField("glpi_groups", 'ldap_value', 'ldap_value', "text");
    $migration->dropKey("glpi_groups", 'ldap_group_dn');
    $migration->changeField("glpi_groups", 'ldap_group_dn', 'ldap_group_dn', "text");
    $migration->addField("glpi_groups", 'groups_id', "integer");
    $migration->addField("glpi_groups", 'completename', "text");
    $migration->addField("glpi_groups", 'level', "integer");
    $migration->addField("glpi_groups", 'ancestors_cache', "longtext");
    $migration->addField("glpi_groups", 'sons_cache', "longtext");
    $migration->migrationOneTable('glpi_groups');
    $migration->addKey("glpi_groups", 'ldap_value', '', 'INDEX', 200);
    $migration->addKey("glpi_groups", 'ldap_group_dn', '', 'INDEX', 200);
    $migration->addKey("glpi_groups", 'groups_id');
    regenerateTreeCompleteName("glpi_groups");
    $migration->addField("glpi_entitydatas", 'notification_subject_tag', "string", array('after' => 'admin_reply_name'));
    $migration->addField("glpi_vlans", 'tag', "integer");
    $ADDTODISPLAYPREF['Vlan'] = array(11);
    $migration->addField("glpi_profiles", 'create_ticket_on_login', "bool");
    $migration->addField("glpi_reminders", 'begin_view_date', "datetime");
    $migration->addField("glpi_reminders", 'end_view_date', "datetime");
    // only to change latin1 to utf-8 if not done in update 0.68.3 to 0.71
    // because there is an index fulltext based on 2 fields (perhaps both are not in same encoding)
    $migration->changeField("glpi_knowbaseitems", 'answer', 'answer', "longtext");
    $migration->changeField("glpi_knowbaseitems", 'question', 'name', "text");
    $migration->addField("glpi_configs", "ajax_min_textsearch_load", "integer", array('after' => 'use_ajax'));
    $migration->addField("glpi_configs", "use_anonymous_followups", "bool", array('after' => 'use_anonymous_helpdesk'));
    $migration->addField("glpi_configs", "show_count_on_tabs", "bool", array('value' => '1'));
    $migration->addField("glpi_users", "show_count_on_tabs", "tinyint(1) NULL DEFAULT NULL");
    $migration->addField("glpi_configs", "refresh_ticket_list", "integer");
    $migration->addField("glpi_users", "refresh_ticket_list", "int(11) NULL DEFAULT NULL");
    $migration->addField("glpi_configs", "set_default_tech", "bool", array('value' => '1'));
    $migration->addField("glpi_users", "set_default_tech", "tinyint(1) NULL DEFAULT NULL");
    $migration->addField("glpi_reservations", "group", "integer");
    $migration->addKey("glpi_reservations", array('reservationitems_id', 'group'), "resagroup");
    /// Add document types
    $types = array('csv' => array('name' => 'Comma-Separated Values', 'icon' => 'csv-dist.png'), 'svg' => array('name' => 'Scalable Vector Graphics', 'icon' => 'svg-dist.png'));
    foreach ($types as $ext => $data) {
        $query = "SELECT *\n                FROM `glpi_documenttypes`\n                WHERE `ext` = '{$ext}'";
        if ($result = $DB->query($query)) {
            if ($DB->numrows($result) == 0) {
                $query = "INSERT INTO `glpi_documenttypes`\n                             (`name`, `ext`, `icon`, `is_uploadable`, `date_mod`)\n                      VALUES ('" . $data['name'] . "', '{$ext}', '" . $data['icon'] . "', '1', NOW())";
                $DB->queryOrDie($query, "0.83 add document type {$ext}");
            }
        }
    }
    /// Update icons
    $types = array('c' => 'c-dist.png', 'h' => 'h-dist.png', 'swf' => 'swf-dist.png', 'pas' => 'pas-dist.png', 'wmv' => 'wmv-dist.png', 'zip' => 'zip-dist.png');
    foreach ($types as $ext => $icon) {
        $query = "SELECT `id`\n                FROM `glpi_documenttypes`\n                WHERE `ext` = '{$ext}'";
        if ($result = $DB->query($query)) {
            if ($DB->numrows($result) == 1) {
                $query = "UPDATE `glpi_documenttypes`\n                      SET `icon` = '{$icon}', `date_mod` = NOW()\n                      WHERE `id` = '" . $DB->result($result, 0, 0) . "'";
                $DB->queryOrDie($query, "0.83 update icon for doc type {$ext}");
            }
        }
    }
    /// add missing indexes  for fields
    $migration->addKey("glpi_authldaps", "is_active");
    $migration->addKey("glpi_authmails", "is_active");
    $migration->addKey("glpi_ocsservers", "is_active");
    $migration->changeField("glpi_users", 'token', 'password_forget_token', "char(40) NULL DEFAULT NULL");
    $migration->changeField("glpi_users", 'tokendate', 'password_forget_token_date', "datetime");
    $migration->addField("glpi_users", "personal_token", 'string');
    $migration->addField("glpi_users", "personal_token_date", "datetime");
    $migration->addField("glpi_tickets", "is_deleted", "bool");
    $migration->addKey("glpi_tickets", "is_deleted");
    $migration->addField("glpi_contracts", "template_name", 'string');
    $migration->addField("glpi_contracts", "is_template", 'bool');
    $migration->displayMessage(sprintf(__('Change of the database layout - %s'), 'Give consumable to groups'));
    if ($migration->addField("glpi_consumables", "itemtype", "VARCHAR(100) DEFAULT NULL", array("after" => "date_out", "update" => "'User'"))) {
        $migration->dropKey("glpi_consumables", 'users_id');
        $migration->changeField("glpi_consumables", 'users_id', 'items_id', 'integer');
        $migration->addKey("glpi_consumables", array('itemtype', 'items_id'), 'item');
    }
    $migration->displayMessage(sprintf(__('Change of the database layout - %s'), 'Several emails for users'));
    // Several email per users
    if (!TableExists('glpi_useremails')) {
        $query = "CREATE TABLE `glpi_useremails` (\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\n                  `users_id` int(11) NOT NULL DEFAULT '0',\n                  `is_default` TINYINT( 1 ) NOT NULL DEFAULT 0,\n                  `is_dynamic` TINYINT( 1 ) NOT NULL DEFAULT 0,\n                  `email` varchar( 255 ) NULL DEFAULT NULL,\n                  PRIMARY KEY (`id`),\n                  UNIQUE KEY `unicity` (`users_id`,`email`),\n                  KEY `email` (`email`),\n                  KEY `is_default` (`is_default`),\n                  KEY `is_dynamic` (`is_dynamic`)\n                ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
        $DB->queryOrDie($query, "0.83 add table glpi_useremails");
    }
    // Manage migration : populate is_default=1
    // and is_dynamic depending of authldap config / authtype / auths_id
    if (FieldExists("glpi_users", 'email', false)) {
        $query = "SELECT *\n                FROM `glpi_users`\n                WHERE `email` <> '' AND `email` IS NOT NULL";
        if ($result = $DB->query($query)) {
            if ($DB->numrows($result) > 0) {
                while ($data = $DB->fetch_assoc($result)) {
                    $is_dynamic = 0;
                    $ldap_servers = array();
                    // manage is_dynamic :
                    if ($data['authtype'] == Auth::MAIL) {
                        $is_dynamic = 1;
                    } else {
                        if (Auth::isAlternateAuth($data["authtype"]) && $data['auths_id'] > 0 || $data['authtype'] == Auth::LDAP) {
                            if (!isset($ldap_servers[$data['auths_id']])) {
                                $ldap_servers[$data['auths_id']] = 0;
                                $ldap = new AuthLDAP();
                                if ($ldap->getFromDB($data['auths_id'])) {
                                    if (!empty($ldap->fields['email_field'])) {
                                        $ldap_servers[$data['auths_id']] = 1;
                                    }
                                }
                            }
                            $is_dynamic = $ldap_servers[$data['auths_id']];
                        }
                    }
                    $query2 = "INSERT INTO `glpi_useremails`\n                                 (`users_id`, `is_default`, `is_dynamic`, `email`)\n                          VALUES ('" . $data['id'] . "','1','{$is_dynamic}','" . addslashes($data['email']) . "')";
                    $DB->queryOrDie($query2, "0.83 move emails to  glpi_useremails");
                }
            }
        }
        // Drop email field from glpi_users
        $migration->dropField("glpi_users", 'email');
    }
    // check unicity for users email : unset rule and display warning
    foreach ($DB->request("glpi_fieldunicities", "`itemtype` = 'User' AND `fields` LIKE '%email%'") as $data) {
        $query = "UPDATE `glpi_fieldunicities`\n                SET `is_active` = '0'\n                WHERE `id` = '" . $data['id'] . "'";
        $DB->query($query);
        echo "<div class='red'><p>A unicity check use email for users. ";
        echo "Due to new feature permit several email per users, this rule have been disabled.</p></div>";
    }
    // multiple manager in groups
    $migration->changeField("glpi_authldaps", 'email_field', 'email1_field', 'string');
    $migration->addField("glpi_authldaps", 'email2_field', 'string');
    $migration->addField("glpi_authldaps", 'email3_field', 'string');
    $migration->addField("glpi_authldaps", 'email4_field', 'string');
    $migration->displayMessage(sprintf(__('Change of the database layout - %s'), 'Multiple managers for groups'));
    /// migration : multiple group managers
    $migration->addField("glpi_groups_users", "is_manager", 'bool');
    $migration->addKey("glpi_groups_users", "is_manager");
    $migration->migrationOneTable('glpi_groups_users');
    if (FieldExists("glpi_groups", 'users_id', false)) {
        $query = "SELECT *\n                FROM `glpi_groups`\n                WHERE `users_id` > 0";
        $user = new User();
        if ($result = $DB->query($query)) {
            if ($DB->numrows($result) > 0) {
                while ($data = $DB->fetch_assoc($result)) {
                    if ($user->getFromDB($data['users_id'])) {
                        $query = "SELECT `id`\n                            FROM `glpi_groups_users`\n                            WHERE `groups_id` = '" . $data['id'] . "'\n                                 AND `users_id` = '" . $data['users_id'] . "'";
                        if ($result2 = $DB->query($query)) {
                            // add manager to groups_users setting if not present
                            if ($DB->numrows($result2) == 0) {
                                $query2 = "INSERT INTO`glpi_groups_users`\n                                          (`users_id`, `groups_id`, `is_manager`)\n                                   VALUES ('" . $data['users_id'] . "' ,'" . $data['id'] . "', '1')";
                                $DB->queryOrDie($query2, "0.83 insert manager of groups");
                            } else {
                                // Update user as manager if presnet in groups_users
                                $query2 = "UPDATE `glpi_groups_users`\n                                   SET `is_manager` = '1'\n                                   WHERE `groups_id` = '" . $data['id'] . "'\n                                         AND `users_id` = '" . $data['users_id'] . "'";
                                $DB->queryOrDie($query2, "0.83 set manager of groups");
                            }
                        }
                    }
                }
            }
        }
        // Drop field glpi_groups
        $migration->dropField("glpi_groups", 'users_id');
    }
    $migration->displayMessage(sprintf(__('Change of the database layout - %s'), 'Add entities information on document links'));
    if ($migration->addField("glpi_documents_items", "entities_id", "integer")) {
        $migration->addField("glpi_documents_items", "is_recursive", "bool");
        $migration->migrationOneTable('glpi_documents_items');
        $query_doc_i = "UPDATE `glpi_documents_items` as `doc_i`\n                      INNER JOIN `glpi_documents` as `doc`\n                        ON  `doc`.`id` = `doc_i`.`documents_id`\n                      SET `doc_i`.`entities_id` = `doc`.`entities_id`,\n                         `doc_i`.`is_recursive` = `doc`.`is_recursive`";
        $DB->queryOrDie($query_doc_i, "0.83 update entities_id and is_recursive in glpi_documents_items");
        /// create index for search count on tab
        $migration->dropKey("glpi_documents_items", "item");
        $migration->migrationOneTable('glpi_documents_items');
        $migration->addKey("glpi_documents_items", array('itemtype', 'items_id', 'entities_id', 'is_recursive'), 'item');
    }
    $migration->displayMessage(sprintf(__('Data migration - %s'), 'RuleTicket'));
    $changes['RuleTicket'] = array('ticketcategories_id' => 'itilcategories_id');
    $DB->query("SET SESSION group_concat_max_len = 4194304;");
    foreach ($changes as $ruletype => $tab) {
        // Get rules
        $query = "SELECT GROUP_CONCAT(`id`)\n                FROM `glpi_rules`\n                WHERE `sub_type` = '" . $ruletype . "'\n                GROUP BY `sub_type`";
        if ($result = $DB->query($query)) {
            if ($DB->numrows($result) > 0) {
                // Get rule string
                $rules = $DB->result($result, 0, 0);
                // Update actions
                foreach ($tab as $old => $new) {
                    $query = "UPDATE `glpi_ruleactions`\n                         SET `field` = '{$new}'\n                         WHERE `field` = '{$old}'\n                               AND `rules_id` IN ({$rules})";
                    $DB->queryOrDie($query, "0.83 update datas for rules actions");
                }
                // Update criteria
                foreach ($tab as $old => $new) {
                    $query = "UPDATE `glpi_rulecriterias`\n                         SET `criteria` = '{$new}'\n                         WHERE `criteria` = '{$old}'\n                               AND `rules_id` IN ({$rules})";
                    $DB->queryOrDie($query, "0.83 update datas for rules criteria");
                }
            }
        }
    }
    $migration->displayMessage(sprintf(__('Data migration - %s'), 'Ticket templates'));
    $default_ticket_template = 0;
    if (!TableExists('glpi_tickettemplates')) {
        $query = "CREATE TABLE `glpi_tickettemplates` (\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\n                  `name` varchar( 255 ) NULL DEFAULT NULL,\n                  `entities_id` int(11) NOT NULL DEFAULT '0',\n                  `is_recursive` TINYINT( 1 ) NOT NULL DEFAULT 0,\n                  `comment` TEXT DEFAULT NULL,\n                  PRIMARY KEY (`id`),\n                  KEY `name` (`name`),\n                  KEY `entities_id` (`entities_id`),\n                  KEY `is_recursive` (`is_recursive`)\n                ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
        $DB->queryOrDie($query, "0.83 add table glpi_tickettemplates");
        $query = "INSERT INTO `glpi_tickettemplates`\n                       (`name`, `is_recursive`)\n                VALUES ('Default', 1)";
        $DB->queryOrDie($query, "0.83 add default ticket template");
        $default_ticket_template = $DB->insert_id();
    }
    $migration->addField('glpi_itilcategories', 'tickettemplates_id_incident', "integer");
    $migration->addKey('glpi_itilcategories', 'tickettemplates_id_incident');
    $migration->addField('glpi_itilcategories', 'tickettemplates_id_demand', "integer");
    $migration->addKey('glpi_itilcategories', 'tickettemplates_id_demand');
    $migration->addField('glpi_itilcategories', 'is_incident', "integer", array('value' => 1));
    $migration->addKey('glpi_itilcategories', 'is_incident');
    $migration->addField('glpi_itilcategories', 'is_request', "integer", array('value' => 1));
    $migration->addKey('glpi_itilcategories', 'is_request');
    $migration->addField('glpi_itilcategories', 'is_problem', "integer", array('value' => 1));
    $migration->addKey('glpi_itilcategories', 'is_problem');
    if (!TableExists('glpi_tickettemplatehiddenfields')) {
        $query = "CREATE TABLE `glpi_tickettemplatehiddenfields` (\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\n                  `tickettemplates_id` int(11) NOT NULL DEFAULT '0',\n                  `entities_id` int(11) NOT NULL DEFAULT '0',\n                  `is_recursive` TINYINT( 1 ) NOT NULL DEFAULT 0,\n                  `num` int(11) NOT NULL DEFAULT '0',\n                  PRIMARY KEY (`id`),\n                  KEY `entities_id` (`entities_id`),\n                  KEY `is_recursive` (`is_recursive`),\n                  KEY `unicity` (`tickettemplates_id`,`num`)\n                ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
        $DB->queryOrDie($query, "0.83 add table glpi_tickettemplatehiddenfields");
    }
    if (!TableExists('glpi_tickettemplatepredefinedfields')) {
        $query = "CREATE TABLE `glpi_tickettemplatepredefinedfields` (\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\n                  `tickettemplates_id` int(11) NOT NULL DEFAULT '0',\n                  `entities_id` int(11) NOT NULL DEFAULT '0',\n                  `is_recursive` TINYINT( 1 ) NOT NULL DEFAULT 0,\n                  `num` int(11) NOT NULL DEFAULT '0',\n                  `value` TEXT DEFAULT NULL,\n                  PRIMARY KEY (`id`),\n                  KEY `entities_id` (`entities_id`),\n                  KEY `is_recursive` (`is_recursive`),\n                  KEY `unicity` (`tickettemplates_id`,`num`)\n                ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
        $DB->queryOrDie($query, "0.83 add table glpi_tickettemplatepredefinedfields");
    }
    if (!TableExists('glpi_tickettemplatemandatoryfields')) {
        $query = "CREATE TABLE `glpi_tickettemplatemandatoryfields` (\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\n                  `tickettemplates_id` int(11) NOT NULL DEFAULT '0',\n                  `entities_id` int(11) NOT NULL DEFAULT '0',\n                  `is_recursive` TINYINT( 1 ) NOT NULL DEFAULT 0,\n                  `num` int(11) NOT NULL DEFAULT '0',\n                  PRIMARY KEY (`id`),\n                  KEY `entities_id` (`entities_id`),\n                  KEY `is_recursive` (`is_recursive`),\n                  KEY `unicity` (`tickettemplates_id`,`num`)\n                ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
        $DB->queryOrDie($query, "0.83 add table glpi_tickettemplatemandatoryfields");
        /// Add mandatory fields to default template
        if ($default_ticket_template > 0) {
            foreach ($DB->request('glpi_configs') as $data) {
                if (isset($data['is_ticket_title_mandatory']) && $data['is_ticket_title_mandatory']) {
                    $query = "INSERT INTO `glpi_tickettemplatemandatoryfields`\n                                (`tickettemplates_id`, `num`)\n                         VALUES ('{$default_ticket_template}', 1)";
                    $DB->queryOrDie($query, "0.83 add mandatory field for default ticket template");
                }
                if (isset($data['is_ticket_content_mandatory']) && $data['is_ticket_content_mandatory']) {
                    $query = "INSERT INTO `glpi_tickettemplatemandatoryfields`\n                                (`tickettemplates_id`, `num`)\n                         VALUES ('{$default_ticket_template}', 21)";
                    $DB->queryOrDie($query, "0.83 add mandatory field for default ticket template");
                }
                if (isset($data['is_ticket_category_mandatory']) && $data['is_ticket_category_mandatory']) {
                    $query = "INSERT INTO `glpi_tickettemplatemandatoryfields`\n                                (`tickettemplates_id`, `num`)\n                         VALUES ('{$default_ticket_template}', 7)";
                    $DB->queryOrDie($query, "0.83 add mandatory field for default ticket template");
                }
            }
            // Update itil categories
            $migration->migrationOneTable('glpi_itilcategories');
            $query = "UPDATE `glpi_itilcategories`\n                   SET `tickettemplates_id_incident` = '{$default_ticket_template}',\n                       `tickettemplates_id_demand` = '{$default_ticket_template}'";
            $DB->queryOrDie($query, "0.83 update default templates used by itil categories");
        }
    }
    // Drop global mandatory config
    $migration->dropField('glpi_configs', 'is_ticket_title_mandatory');
    $migration->dropField('glpi_configs', 'is_ticket_content_mandatory');
    $migration->dropField('glpi_configs', 'is_ticket_category_mandatory');
    $migration->addField('glpi_profiles', 'tickettemplate', "char", array('update' => '`sla`'));
    $migration->addField("glpi_entitydatas", "tickettemplates_id", 'integer', array('value' => '-2'));
    $migration->displayMessage(sprintf(__('Data migration - %s'), 'Tech Groups on items'));
    // Group of technicians in charge of Helpdesk items
    $migration->addField('glpi_computers', 'groups_id_tech', "integer", array('after' => "users_id_tech"));
    $migration->addKey('glpi_computers', 'groups_id_tech');
    $migration->addField('glpi_monitors', 'groups_id_tech', "integer", array('after' => "users_id_tech"));
    $migration->addKey('glpi_monitors', 'groups_id_tech');
    $migration->addField('glpi_networkequipments', 'groups_id_tech', "integer", array('after' => "users_id_tech"));
    $migration->addKey('glpi_networkequipments', 'groups_id_tech');
    $migration->addField('glpi_peripherals', 'groups_id_tech', "integer", array('after' => "users_id_tech"));
    $migration->addKey('glpi_peripherals', 'groups_id_tech');
    $migration->addField('glpi_phones', 'groups_id_tech', "integer", array('after' => "users_id_tech"));
    $migration->addKey('glpi_phones', 'groups_id_tech');
    $migration->addField('glpi_printers', 'groups_id_tech', "integer", array('after' => "users_id_tech"));
    $migration->addKey('glpi_printers', 'groups_id_tech');
    $migration->addField('glpi_softwares', 'groups_id_tech', "integer", array('after' => "users_id_tech"));
    $migration->addKey('glpi_softwares', 'groups_id_tech');
    $migration->addField('glpi_cartridgeitems', 'groups_id_tech', "integer", array('after' => "users_id_tech"));
    $migration->addKey('glpi_cartridgeitems', 'groups_id_tech');
    $migration->addField('glpi_consumableitems', 'groups_id_tech', "integer", array('after' => "users_id_tech"));
    $migration->addKey('glpi_consumableitems', 'groups_id_tech');
    $migration->addField('glpi_printers', 'last_pages_counter', 'integer', array('after' => 'init_pages_counter'));
    $migration->addKey('glpi_printers', 'last_pages_counter');
    $migration->displayMessage(sprintf(__('Data migration - %s'), 'various cleaning DB'));
    // Clean ticket satisfactions
    $query = "DELETE\n             FROM `glpi_ticketsatisfactions`\n             WHERE `glpi_ticketsatisfactions`.`tickets_id` NOT IN (SELECT `glpi_tickets`.`id`\n                                                                   FROM `glpi_tickets`)";
    $DB->queryOrDie($query, "0.83 clean glpi_ticketsatisfactions");
    // Clean unused slalevels
    $query = "DELETE\n             FROM `glpi_slalevels_tickets`\n             WHERE (`glpi_slalevels_tickets`.`tickets_id`, `glpi_slalevels_tickets`.`slalevels_id`)\n                  NOT IN (SELECT `glpi_tickets`.`id`, `glpi_tickets`.`slalevels_id`\n                          FROM `glpi_tickets`)";
    $DB->queryOrDie($query, "0.83 clean glpi_slalevels_tickets");
    $migration->displayMessage(sprintf(__('Data migration - %s'), 'recurrent tickets'));
    if (!TableExists('glpi_ticketrecurrents')) {
        $query = "CREATE TABLE `glpi_ticketrecurrents` (\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\n                  `name` varchar( 255 ) NULL DEFAULT NULL,\n                  `comment` TEXT DEFAULT NULL,\n                  `entities_id` int(11) NOT NULL DEFAULT '0',\n                  `is_recursive` TINYINT( 1 ) NOT NULL DEFAULT 0,\n                  `is_active` TINYINT( 1 ) NOT NULL DEFAULT 0,\n                  `tickettemplates_id` int(11) NOT NULL DEFAULT '0',\n                  `begin_date` datetime DEFAULT NULL,\n                  `periodicity` int(11) NOT NULL DEFAULT '0',\n                  `create_before` int(11) NOT NULL DEFAULT '0',\n                  `next_creation_date` datetime DEFAULT NULL,\n                  PRIMARY KEY (`id`),\n                  KEY `entities_id` (`entities_id`),\n                  KEY `is_recursive` (`is_recursive`),\n                  KEY `is_active` (`is_active`),\n                  KEY `tickettemplates_id` (`tickettemplates_id`),\n                  KEY `next_creation_date` (`next_creation_date`)\n                ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
        $DB->queryOrDie($query, "0.83 add table glpi_ticketrecurrents");
        $ADDTODISPLAYPREF['TicketRecurrent'] = array(11, 12, 13, 15, 14);
    }
    if (!countElementsInTable('glpi_crontasks', "`itemtype`='TicketRecurrent' AND `name`='ticketrecurrent'")) {
        $query = "INSERT INTO `glpi_crontasks`\n                       (`itemtype`, `name`, `frequency`, `param`, `state`, `mode`, `allowmode`,\n                        `hourmin`, `hourmax`, `logs_lifetime`, `lastrun`, `lastcode`, `comment`)\n                VALUES ('TicketRecurrent', 'ticketrecurrent', 3600, NULL, 1, 1, 3,\n                        0, 24, 30, NULL, NULL, NULL)";
        $DB->queryOrDie($query, "0.83 populate glpi_crontasks for ticketrecurrent");
    }
    $migration->addField('glpi_profiles', 'ticketrecurrent', "char", array('update' => '`sla`'));
    $migration->displayMessage(sprintf(__('Data migration - %s'), 'various fields add'));
    // Ticket delegation
    $migration->addField('glpi_groups_users', 'is_userdelegate', 'bool');
    $migration->addKey('glpi_groups_users', 'is_userdelegate');
    //Software dictionary update
    $migration->addField("glpi_rulecachesoftwares", "entities_id", "string");
    $migration->addField("glpi_rulecachesoftwares", "new_entities_id", "string");
    $migration->addField("glpi_entitydatas", "entities_id_software", 'integer', array('value' => '-2'));
    // Groups perm
    $migration->addField('glpi_groups', 'is_requester', 'bool', array('value' => '1'));
    $migration->addField('glpi_groups', 'is_assign', 'bool', array('value' => '1'));
    $migration->addField('glpi_groups', 'is_notify', 'bool', array('value' => '1'));
    $migration->addField('glpi_groups', 'is_itemgroup', 'bool', array('value' => '1'));
    $migration->addField('glpi_groups', 'is_usergroup', 'bool', array('value' => '1'));
    $migration->addKey('glpi_groups', 'is_requester');
    $migration->addKey('glpi_groups', 'is_assign');
    $migration->addKey('glpi_groups', 'is_notify');
    $migration->addKey('glpi_groups', 'is_itemgroup');
    $migration->addKey('glpi_groups', 'is_usergroup');
    // Ticket solution by entity
    $migration->addfield('glpi_solutiontypes', 'entities_id', 'integer');
    $migration->addfield('glpi_solutiontypes', 'is_recursive', 'bool', array('value' => '1'));
    $migration->addKey('glpi_solutiontypes', 'entities_id');
    $migration->addKey('glpi_solutiontypes', 'is_recursive');
    // Fix solution template index
    $migration->dropKey('glpi_solutiontemplates', 'unicity');
    $migration->addKey('glpi_solutiontemplates', 'entities_id');
    // New index for count on tab
    $migration->addKey('glpi_ruleactions', array('field', 'value'), '', 'INDEX', 50);
    $migration->displayMessage(sprintf(__('Data migration - %s'), 'Create new default profiles'));
    $profiles = array('hotliner' => array('name' => 'Hotliner', 'interface' => 'central', 'user' => 'r', 'import_externalauth_users' => 'w', 'create_ticket' => '1', 'assign_ticket' => '1', 'global_add_followups' => '1', 'add_followups' => '1', 'update_ticket' => '1', 'observe_ticket' => '1', 'show_all_ticket' => '1', 'show_full_ticket' => '1', 'show_all_problem' => '1', 'show_planning' => '1', 'statistic' => '1', 'tickettemplate' => 'r', 'password_update' => '1', 'helpdesk_hardware' => '3', 'helpdesk_item_type' => addslashes('["Computer", "Monitor", "NetworkEquipment",' . '"Peripheral", "Phone", "Printer",' . '"Software"]'), 'create_validation' => '1', 'update_own_followups' => '1', 'create_ticket_on_login' => '1'), 'technician' => array('name' => 'Technician', 'interface' => 'central', 'password_update' => '1', 'computer' => 'w', 'monitor' => 'w', 'software' => 'w', 'networking' => 'w', 'printer' => 'w', 'peripheral' => 'w', 'cartridge' => 'w', 'consumable' => 'w', 'phone' => 'w', 'notes' => 'w', 'document' => 'w', 'knowbase' => 'w', 'faq' => 'w', 'reservation_helpdesk' => '1', 'reservation_central' => 'w', 'reports' => 'r', 'view_ocsng' => 'r', 'sync_ocsng' => 'w', 'user' => 'w', 'group' => 'r', 'entity' => 'r', 'transfer' => 'r', 'reminder_public' => 'w', 'create_ticket' => '1', 'add_followups' => '1', 'global_add_followups' => '1', 'global_add_tasks' => '1', 'update_ticket' => '1', 'own_ticket' => '1', 'show_all_ticket' => '1', 'show_assign_ticket' => '1', 'show_full_ticket' => '1', 'observe_ticket' => '1', 'update_followups' => '1', 'update_tasks' => '1', 'show_planning' => '1', 'statistic' => '1', 'helpdesk_hardware' => '3', 'helpdesk_item_type' => addslashes('["Computer", "Monitor", "NetworkEquipment",' . '"Peripheral", "Phone", "Printer",' . '"Software"]'), 'import_externalauth_users' => 'w', 'create_validation' => '1', 'sla' => 'r', 'update_own_followups' => '1', 'show_my_problem' => '1', 'show_all_problem' => '1', 'tickettemplate' => 'r', 'ticketrecurrent' => 'r'), 'supervisor' => array('name' => 'Supervisor', 'interface' => 'central', 'password_update' => '1', 'computer' => 'w', 'monitor' => 'w', 'software' => 'w', 'networking' => 'w', 'printer' => 'w', 'peripheral' => 'w', 'cartridge' => 'w', 'consumable' => 'w', 'phone' => 'w', 'notes' => 'w', 'document' => 'w', 'knowbase' => 'w', 'faq' => 'w', 'reservation_helpdesk' => '1', 'reservation_central' => 'w', 'reports' => 'r', 'view_ocsng' => 'r', 'sync_ocsng' => 'w', 'entity_dropdown' => 'w', 'rule_ticket' => 'r', 'entity_rule_ticket' => 'w', 'user' => 'w', 'group' => 'r', 'entity' => 'r', 'transfer' => 'r', 'logs' => 'r', 'reminder_public' => 'w', 'create_ticket' => '1', 'delete_ticket' => '1', 'add_followups' => '1', 'global_add_followups' => '1', 'global_add_tasks' => '1', 'update_ticket' => '1', 'update_priority' => '1', 'own_ticket' => '1', 'steal_ticket' => '1', 'assign_ticket' => '1', 'show_all_ticket' => '1', 'show_assign_ticket' => '1', 'show_full_ticket' => '1', 'observe_ticket' => '1', 'update_followups' => '1', 'update_tasks' => '1', 'show_planning' => '1', 'show_all_planning' => '1', 'statistic' => '1', 'helpdesk_hardware' => '3', 'helpdesk_item_type' => addslashes('["Computer", "Monitor", "NetworkEquipment",' . '"Peripheral", "Phone", "Printer",' . '"Software"]'), 'import_externalauth_users' => 'w', 'rule_mailcollector' => 'w', 'validate_ticket' => '1', 'create_validation' => '1', 'calendar' => 'w', 'sla' => 'w', 'update_own_followups' => '1', 'delete_followups' => '1', 'show_my_problem' => '1', 'show_all_problem' => '1', 'edit_all_problem' => '1', 'tickettemplate' => 'w', 'ticketrecurrent' => 'w'));
    foreach ($profiles as $profile => $data) {
        $query = "INSERT INTO `glpi_profiles`\n                         (`" . implode("`, `", array_keys($data)) . "`)\n                  VALUES ('" . implode("', '", $data) . "')";
        $DB->queryOrDie($query, "0.83 create new profile {$profile}");
    }
    $migration->displayMessage(sprintf(__('Data migration - %s'), 'Reminder visibility'));
    if (!TableExists('glpi_reminders_users')) {
        $query = "CREATE TABLE `glpi_reminders_users` (\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\n                  `reminders_id` int(11) NOT NULL DEFAULT '0',\n                  `users_id` int(11) NOT NULL DEFAULT '0',\n                  PRIMARY KEY (`id`),\n                  KEY `reminders_id` (`reminders_id`),\n                  KEY `users_id` (`users_id`)\n                ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
        $DB->queryOrDie($query, "0.83 add table glpi_reminders_users");
    }
    if (!TableExists('glpi_groups_reminders')) {
        $query = "CREATE TABLE `glpi_groups_reminders` (\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\n                  `reminders_id` int(11) NOT NULL DEFAULT '0',\n                  `groups_id` int(11) NOT NULL DEFAULT '0',\n                  `entities_id` int(11) NOT NULL DEFAULT '-1',\n                  `is_recursive` TINYINT( 1 ) NOT NULL DEFAULT 0,\n                  PRIMARY KEY (`id`),\n                  KEY `reminders_id` (`reminders_id`),\n                  KEY `groups_id` (`groups_id`),\n                  KEY `entities_id` (`entities_id`),\n                  KEY `is_recursive` (`is_recursive`)\n\n                ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
        $DB->queryOrDie($query, "0.83 add table glpi_groups_reminders");
    }
    if (!TableExists('glpi_profiles_reminders')) {
        $query = "CREATE TABLE `glpi_profiles_reminders` (\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\n                  `reminders_id` int(11) NOT NULL DEFAULT '0',\n                  `profiles_id` int(11) NOT NULL DEFAULT '0',\n                  `entities_id` int(11) NOT NULL DEFAULT '-1',\n                  `is_recursive` TINYINT( 1 ) NOT NULL DEFAULT 0,\n                  PRIMARY KEY (`id`),\n                  KEY `reminders_id` (`reminders_id`),\n                  KEY `profiles_id` (`profiles_id`),\n                  KEY `entities_id` (`entities_id`),\n                  KEY `is_recursive` (`is_recursive`)\n                ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
        $DB->queryOrDie($query, "0.83 add table glpi_profiles_reminders");
    }
    if (!TableExists('glpi_entities_reminders')) {
        $query = "CREATE TABLE `glpi_entities_reminders` (\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\n                  `reminders_id` int(11) NOT NULL DEFAULT '0',\n                  `entities_id` int(11) NOT NULL DEFAULT '0',\n                  `is_recursive` TINYINT( 1 ) NOT NULL DEFAULT 0,\n                  PRIMARY KEY (`id`),\n                  KEY `reminders_id` (`reminders_id`),\n                  KEY `entities_id` (`entities_id`),\n                  KEY `is_recursive` (`is_recursive`)\n                ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
        $DB->queryOrDie($query, "0.83 add table glpi_entities_reminders");
    }
    /// Migrate datas for is_helpdesk_visible : add all helpdesk profiles / drop field is_helpdesk_visible
    if (FieldExists("glpi_reminders", 'is_helpdesk_visible', false)) {
        $query = "SELECT `id`\n                FROM `glpi_reminders`\n                WHERE `is_helpdesk_visible` = 1";
        if ($result = $DB->query($query)) {
            if ($DB->numrows($result) > 0) {
                // Grab helpdesk profiles
                $helpdesk_profiles = array();
                foreach ($DB->request("glpi_profiles", "`interface` = 'helpdesk' AND `reminder_public` = 'r'") as $data2) {
                    $helpdesk_profiles[$data2['id']] = $data2['id'];
                }
                if (count($helpdesk_profiles)) {
                    while ($data = $DB->fetch_assoc($result)) {
                        foreach ($helpdesk_profiles as $pid) {
                            $query = "INSERT INTO `glpi_profiles_reminders`\n                                      (`reminders_id`, `profiles_id`)\n                               VALUES ('" . $data['id'] . "', '{$pid}');";
                            $DB->queryOrDie($query, "0.83 migrate data for is_helpdesk_visible drop on glpi_reminders");
                        }
                    }
                }
            }
        }
        $migration->dropField("glpi_reminders", 'is_helpdesk_visible');
    }
    // Migrate datas for entities + drop fields : is_private / entities_id / is_recursive
    if (FieldExists("glpi_reminders", 'is_private', false)) {
        $query = "SELECT *\n                FROM `glpi_reminders`\n                WHERE `is_private` = 0";
        if ($result = $DB->query($query)) {
            if ($DB->numrows($result) > 0) {
                while ($data = $DB->fetch_assoc($result)) {
                    $query = "INSERT INTO `glpi_entities_reminders`\n                                (`reminders_id`, `entities_id`, `is_recursive`)\n                         VALUES ('" . $data['id'] . "', '" . $data['entities_id'] . "',\n                                 '" . $data['is_recursive'] . "');";
                    $DB->queryOrDie($query, "0.83 migrate data for public reminders");
                }
            }
        }
        $migration->dropField("glpi_reminders", 'is_private');
        $migration->dropField("glpi_reminders", 'entities_id');
        $migration->dropField("glpi_reminders", 'is_recursive');
    }
    $ADDTODISPLAYPREF['Reminder'] = array(2, 3, 4, 5, 6, 7);
    $migration->displayMessage(sprintf(__('Data migration - %s'), 'KnowbaseItem visibility'));
    if (!TableExists('glpi_knowbaseitems_users')) {
        $query = "CREATE TABLE `glpi_knowbaseitems_users` (\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\n                  `knowbaseitems_id` int(11) NOT NULL DEFAULT '0',\n                  `users_id` int(11) NOT NULL DEFAULT '0',\n                  PRIMARY KEY (`id`),\n                  KEY `knowbaseitems_id` (`knowbaseitems_id`),\n                  KEY `users_id` (`users_id`)\n                ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
        $DB->queryOrDie($query, "0.83 add table glpi_knowbaseitems_users");
    }
    if (!TableExists('glpi_groups_knowbaseitems')) {
        $query = "CREATE TABLE `glpi_groups_knowbaseitems` (\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\n                  `knowbaseitems_id` int(11) NOT NULL DEFAULT '0',\n                  `groups_id` int(11) NOT NULL DEFAULT '0',\n                  `entities_id` int(11) NOT NULL DEFAULT '-1',\n                  `is_recursive` TINYINT( 1 ) NOT NULL DEFAULT 0,\n                  PRIMARY KEY (`id`),\n                  KEY `knowbaseitems_id` (`knowbaseitems_id`),\n                  KEY `groups_id` (`groups_id`),\n                  KEY `entities_id` (`entities_id`),\n                  KEY `is_recursive` (`is_recursive`)\n\n                ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
        $DB->queryOrDie($query, "0.83 add table glpi_groups_knowbaseitems");
    }
    if (!TableExists('glpi_knowbaseitems_profiles')) {
        $query = "CREATE TABLE `glpi_knowbaseitems_profiles` (\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\n                  `knowbaseitems_id` int(11) NOT NULL DEFAULT '0',\n                  `profiles_id` int(11) NOT NULL DEFAULT '0',\n                  `entities_id` int(11) NOT NULL DEFAULT '-1',\n                  `is_recursive` TINYINT( 1 ) NOT NULL DEFAULT 0,\n                  PRIMARY KEY (`id`),\n                  KEY `knowbaseitems_id` (`knowbaseitems_id`),\n                  KEY `profiles_id` (`profiles_id`),\n                  KEY `entities_id` (`entities_id`),\n                  KEY `is_recursive` (`is_recursive`)\n                ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
        $DB->queryOrDie($query, "0.83 add table glpi_knowbaseitems_profiles");
    }
    if (!TableExists('glpi_entities_knowbaseitems')) {
        $query = "CREATE TABLE `glpi_entities_knowbaseitems` (\n                  `id` int(11) NOT NULL AUTO_INCREMENT,\n                  `knowbaseitems_id` int(11) NOT NULL DEFAULT '0',\n                  `entities_id` int(11) NOT NULL DEFAULT '0',\n                  `is_recursive` TINYINT( 1 ) NOT NULL DEFAULT 0,\n                  PRIMARY KEY (`id`),\n                  KEY `knowbaseitems_id` (`knowbaseitems_id`),\n                  KEY `entities_id` (`entities_id`),\n                  KEY `is_recursive` (`is_recursive`)\n                ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
        $DB->queryOrDie($query, "0.83 add table glpi_entities_knowbaseitems");
    }
    /// Migrate datas for entities_id / is_recursive
    if (FieldExists("glpi_knowbaseitems", 'entities_id', false)) {
        $query = "SELECT *\n                FROM `glpi_knowbaseitems`";
        if ($result = $DB->query($query)) {
            if ($DB->numrows($result) > 0) {
                while ($data = $DB->fetch_assoc($result)) {
                    $query = "INSERT INTO `glpi_entities_knowbaseitems`\n                                (`knowbaseitems_id`, `entities_id`, `is_recursive`)\n                         VALUES ('" . $data['id'] . "', '" . $data['entities_id'] . "',\n                                 '" . $data['is_recursive'] . "');";
                    $DB->queryOrDie($query, "0.83 migrate data for entities on glpi_entities_knowbaseitems");
                }
            }
        }
        $migration->dropField("glpi_knowbaseitems", 'entities_id');
        $migration->dropField("glpi_knowbaseitems", 'is_recursive');
    }
    // Plugins
    $migration->addField('glpi_plugins', 'license', 'string');
    $migration->migrationOneTable('glpi_entitydatas');
    $restore_root_entity_value = false;
    // create root entity if not exist with old default values
    if (countElementsInTable('glpi_entitydatas', 'entities_id=0') == 0) {
        $query = "INSERT INTO `glpi_entitydatas`\n                       (`entities_id`, `entities_id_software`,\n                        `autofill_order_date`, `autofill_delivery_date`, `autofill_buy_date`,\n                        `autofill_use_date`, `autofill_warranty_date`,\n                        `inquest_config`, `inquest_rate`, `inquest_delay`,\n                        `tickettype`, `calendars_id`, `tickettemplates_id`,\n                        `autoclose_delay`, `auto_assign_mode`,\n                        `cartridges_alert_repeat`, `consumables_alert_repeat`,\n                        `use_licenses_alert`, `use_infocoms_alert`, `notclosed_delay`,\n                        `use_contracts_alert`, `use_reservations_alert`)\n                VALUES (0, -10,\n                        0, 0, 0,\n                        0, 0,\n                        1, 0, 0,\n                        1, 0, '{$default_ticket_template}',\n                        -1, -1,\n                        -1, -1,\n                        -1, -1, -1,\n                        -1, -1)";
        // -1 to keep config value - see 1647
        $DB->queryOrDie($query, "0.83 add entities_id 0 in glpi_entitydatas");
        $restore_root_entity_value = true;
    } else {
        $query = "UPDATE `glpi_entitydatas`\n                SET `tickettemplates_id` = '{$default_ticket_template}'\n                WHERE `entities_id` = 0\n                      AND `tickettemplates_id` = -2";
        $DB->queryOrDie($query, "0.83 update tickettemplates_id for root entity in glpi_entitydatas");
        $query = "UPDATE `glpi_entitydatas`\n                SET `entities_id_software` = -10\n                WHERE `entities_id` = 0\n                      AND `entities_id_software` = -2";
        $DB->queryOrDie($query, "0.83 update entities_id_software for root entity in glpi_entitydatas");
        // For root entity already exists in entitydatas in 0.78
        $query = "UPDATE `glpi_entitydatas`\n                SET `tickettype` = 1\n                WHERE `entities_id` = 0\n                      AND `tickettype` = 0";
        $DB->queryOrDie($query, "0.83 update tickettype for root entity in glpi_entitydatas");
        $query = "UPDATE `glpi_entitydatas`\n                SET `inquest_config` = 1\n                WHERE `entities_id` = 0\n                      AND `inquest_config` = 0";
        $DB->queryOrDie($query, "0.83 update inquest_config for root entity in glpi_entitydatas ");
        $query = "UPDATE `glpi_entitydatas`\n                SET `inquest_rate` = 0\n                WHERE `entities_id` = 0\n                      AND `inquest_rate` = '-1'";
        $DB->queryOrDie($query, "0.83 update inquest_rate for root entity in glpi_entitydatas ");
        $query = "UPDATE `glpi_entitydatas`\n                SET `inquest_delay` = 0\n                WHERE `entities_id` = 0\n                      AND `inquest_delay` = '-1'";
        $DB->queryOrDie($query, "0.83 update inquest_delay for root entity in glpi_entitydatas ");
    }
    // migration to new values for inherit parent (0 => -2)
    $field0 = array('calendars_id', 'tickettype', 'inquest_config');
    foreach ($field0 as $field_0) {
        if (FieldExists("glpi_entitydatas", $field_0, false)) {
            $query = "UPDATE `glpi_entitydatas`\n                   SET `{$field_0}` = '-2'\n                   WHERE `{$field_0}` = '0'\n                         AND `entities_id` > 0";
            $DB->queryOrDie($query, "0.83 new value for inherit parent 0 in glpi_entitydatas");
        }
    }
    // new default value
    $migration->changeField("glpi_entitydatas", "calendars_id", "calendars_id", "int(11) NOT NULL DEFAULT '-2'");
    $migration->changeField("glpi_entitydatas", "tickettype", "tickettype", "int(11) NOT NULL DEFAULT '-2'");
    $migration->changeField("glpi_entitydatas", "inquest_config", "inquest_config", "int(11) NOT NULL DEFAULT '-2'");
    $migration->changeField("glpi_entitydatas", "inquest_rate", "inquest_rate", "int(11) NOT NULL DEFAULT '0'");
    $migration->changeField("glpi_entitydatas", "inquest_delay", "inquest_delay", "int(11) NOT NULL DEFAULT '-10'");
    // migration to new values for inherit parent (-1 => -2)
    $fieldparent = array('autofill_buy_date', 'autofill_delivery_date', 'autofill_warranty_date', 'autofill_order_date', 'autofill_use_date');
    foreach ($fieldparent as $field_parent) {
        if (FieldExists("glpi_entitydatas", $field_parent, false)) {
            $query = "UPDATE `glpi_entitydatas`\n                   SET `{$field_parent}` = '-2'\n                   WHERE `{$field_parent}` = '-1'";
            $DB->queryOrDie($query, "0.83 new value for inherit parent -1 in glpi_entitydatas");
        }
    }
    // new default value
    $migration->changeField("glpi_entitydatas", "autofill_buy_date", "autofill_buy_date", 'string', array('value' => '-2'));
    $migration->changeField("glpi_entitydatas", "autofill_delivery_date", "autofill_delivery_date", 'string', array('value' => '-2'));
    $migration->changeField("glpi_entitydatas", "autofill_warranty_date", "autofill_warranty_date", 'string', array('value' => '-2'));
    $migration->changeField("glpi_entitydatas", "autofill_order_date", "autofill_order_date", 'string', array('value' => '-2'));
    $migration->changeField("glpi_entitydatas", "autofill_use_date", "autofill_use_date", 'string', array('value' => '-2'));
    // migration to new values for inherit config
    $fieldconfig = array('auto_assign_mode', 'autoclose_delay', 'cartridges_alert_repeat', 'consumables_alert_repeat', 'notclosed_delay', 'use_contracts_alert', 'use_infocoms_alert', 'use_licenses_alert', 'use_reservations_alert');
    $query = "SELECT *\n             FROM `glpi_configs`";
    if ($result = $DB->query($query)) {
        if ($DB->numrows($result) > 0) {
            if ($data = $DB->fetch_assoc($result)) {
                foreach ($fieldconfig as $field_config) {
                    if (FieldExists("glpi_entitydatas", $field_config, false) && FieldExists("glpi_configs", $field_config, false)) {
                        // value of general config
                        $query = "UPDATE `glpi_entitydatas`\n                            SET `{$field_config}` = '" . $data[$field_config] . "'\n                            WHERE `{$field_config}` = -1";
                        $DB->queryOrDie($query, "0.83 migrate data from config to glpi_entitydatas");
                        $migration->changeField("glpi_entitydatas", "{$field_config}", "{$field_config}", "int(11) NOT NULL DEFAULT '-2'");
                        $migration->dropField("glpi_configs", $field_config);
                    }
                }
                if (FieldExists("glpi_entitydatas", "auto_assign_mode", false)) {
                    // new value for never
                    $query = "UPDATE `glpi_entitydatas`\n                         SET `auto_assign_mode` = -10\n                         WHERE `auto_assign_mode` = 0";
                    $DB->queryOrDie($query, "0.83 change value Never in glpi_entitydatas for auto_assign_mode");
                }
            }
        }
    }
    // value of config in each entity
    $fieldconfig = array('default_contract_alert', 'default_infocom_alert', 'default_alarm_threshold');
    $query = "SELECT *\n             FROM `glpi_configs`";
    if ($result = $DB->query($query)) {
        if ($DB->numrows($result) > 0) {
            if ($data = $DB->fetch_assoc($result)) {
                foreach ($fieldconfig as $field_config) {
                    if (FieldExists("glpi_configs", $field_config, false) && !FieldExists("glpi_entitydatas", $field_config, false)) {
                        // add config fields in entitydatas
                        $migration->addField("glpi_entitydatas", $field_config, 'integer', array('update' => $data[$field_config], 'value' => $field_config == "default_alarm_threshold" ? 10 : 0));
                        $migration->dropField("glpi_configs", $field_config);
                    }
                }
            }
        }
    }
    if ($restore_root_entity_value) {
        $query = "UPDATE `glpi_entitydatas`\n                SET `calendars_id` = 0\n                WHERE `entities_id` = 0;";
        $DB->queryOrDie($query, "0.83 restore root entity default value");
    }
    $migration->addKey('glpi_computervirtualmachines', 'computers_id');
    $migration->addKey('glpi_computervirtualmachines', 'entities_id');
    $migration->addKey('glpi_computervirtualmachines', 'name');
    $migration->addKey('glpi_computervirtualmachines', 'virtualmachinestates_id');
    $migration->addKey('glpi_computervirtualmachines', 'virtualmachinesystems_id');
    $migration->addKey('glpi_computervirtualmachines', 'vcpu');
    $migration->addKey('glpi_computervirtualmachines', 'ram');
    //   $ADDTODISPLAYPREF['KnowbaseItem'] = array(2,3,4,5,6,7);
    $renametables = array('TicketSolutionType' => 'SolutionType', 'TicketSolutionTemplate' => 'SolutionTemplate', 'TicketCategory' => 'ITILCategory');
    $itemtype_tables = array("glpi_bookmarks" => 'itemtype', "glpi_bookmarks_users" => 'itemtype', "glpi_displaypreferences" => 'itemtype', "glpi_logs" => 'itemtype', "glpi_events" => 'type');
    foreach ($itemtype_tables as $table => $field) {
        foreach ($renametables as $key => $val) {
            $query = "UPDATE `{$table}`\n                      SET `{$field}` = '" . $val . "'\n                      WHERE `{$field}` = '" . $key . "'";
            $DB->queryOrDie($query, "0.83 update itemtype of table {$table} for {$val}");
        }
    }
    // ************ Keep it at the end **************
    $migration->displayMessage(sprintf(__('Data migration - %s'), 'glpi_displaypreferences'));
    // Change is_recursive index
    $query = "UPDATE `glpi_displaypreferences`\n              SET `num` = '86'\n              WHERE `itemtype` = 'Group'\n                    AND `num` = '6'";
    $DB->query($query);
    foreach ($ADDTODISPLAYPREF as $type => $tab) {
        $query = "SELECT DISTINCT `users_id`\n                FROM `glpi_displaypreferences`\n                WHERE `itemtype` = '{$type}'";
        if ($result = $DB->query($query)) {
            if ($DB->numrows($result) > 0) {
                while ($data = $DB->fetch_assoc($result)) {
                    $query = "SELECT MAX(`rank`)\n                         FROM `glpi_displaypreferences`\n                         WHERE `users_id` = '" . $data['users_id'] . "'\n                               AND `itemtype` = '{$type}'";
                    $result = $DB->query($query);
                    $rank = $DB->result($result, 0, 0);
                    $rank++;
                    foreach ($tab as $newval) {
                        $query = "SELECT *\n                            FROM `glpi_displaypreferences`\n                            WHERE `users_id` = '" . $data['users_id'] . "'\n                                  AND `num` = '{$newval}'\n                                  AND `itemtype` = '{$type}'";
                        if ($result2 = $DB->query($query)) {
                            if ($DB->numrows($result2) == 0) {
                                $query = "INSERT INTO `glpi_displaypreferences`\n                                         (`itemtype` ,`num` ,`rank` ,`users_id`)\n                                  VALUES ('{$type}', '{$newval}', '" . $rank++ . "',\n                                          '" . $data['users_id'] . "')";
                                $DB->query($query);
                            }
                        }
                    }
                }
            } else {
                // Add for default user
                $rank = 1;
                foreach ($tab as $newval) {
                    $query = "INSERT INTO `glpi_displaypreferences`\n                                (`itemtype` ,`num` ,`rank` ,`users_id`)\n                         VALUES ('{$type}', '{$newval}', '" . $rank++ . "', '0')";
                    $DB->query($query);
                }
            }
        }
    }
    // must always be at the end
    $migration->executeMigration();
    return $updateresult;
}
 /**
  * Get the attributes needed for processing the rules
  *
  * @see RuleCollection::prepareInputDataForProcess()
  *
  * @param $input  input datas
  * @param $params extra parameters given
  *
  * @return an array of attributes
  **/
 function prepareInputDataForProcess($input, $params)
 {
     $rule_parameters = array();
     //LDAP type method
     if ($params["type"] == "LDAP") {
         //Get all the field to retrieve to be able to process rule matching
         $rule_fields = $this->getFieldsToLookFor();
         //Get all the datas we need from ldap to process the rules
         $sz = @ldap_read($params["connection"], $params["userdn"], "objectClass=*", $rule_fields);
         $rule_input = AuthLDAP::get_entries_clean($params["connection"], $sz);
         if (count($rule_input)) {
             if (isset($input)) {
                 $groups = $input;
             } else {
                 $groups = array();
             }
             $rule_input = $rule_input[0];
             //Get all the ldap fields
             $fields = $this->getFieldsForQuery();
             foreach ($fields as $field) {
                 switch (Toolbox::strtoupper($field)) {
                     case "LDAP_SERVER":
                         $rule_parameters["LDAP_SERVER"] = $params["ldap_server"];
                         break;
                     case "GROUPS":
                         foreach ($groups as $group) {
                             $rule_parameters["GROUPS"][] = $group;
                         }
                         break;
                     default:
                         if (isset($rule_input[$field])) {
                             if (!is_array($rule_input[$field])) {
                                 $rule_parameters[$field] = $rule_input[$field];
                             } else {
                                 if (count($rule_input[$field])) {
                                     foreach ($rule_input[$field] as $key => $val) {
                                         if ($key !== 'count') {
                                             $rule_parameters[$field][] = $val;
                                         }
                                     }
                                 }
                             }
                         }
                 }
             }
             return $rule_parameters;
         }
         return $rule_input;
     } else {
         if ($params["type"] == "SSO") {
             $rule_parameters["MAIL_EMAIL"] = $params["email"];
             $rule_parameters["LOGIN"] = $params["login"];
             return $rule_parameters;
         }
     }
     //IMAP/POP login method
     $rule_parameters["MAIL_SERVER"] = $params["mail_server"];
     $rule_parameters["MAIL_EMAIL"] = $params["email"];
     return $rule_parameters;
 }
コード例 #20
0
ファイル: ldap.import.php プロジェクト: gaforeror/glpi
if (!defined('GLPI_ROOT')) {
    include '../inc/includes.php';
}
Session::checkRight("import_externalauth_users", 'w');
// Need REQUEST to manage initial walues and posted ones
AuthLdap::manageValuesInSession($_REQUEST);
if (isset($_SESSION['ldap_import']['popup']) && $_SESSION['ldap_import']['popup']) {
    Html::popHeader(__('LDAP directory link'), $_SERVER['PHP_SELF']);
} else {
    Html::header(__('LDAP directory link'), $_SERVER['PHP_SELF'], "admin", "user", "ldap");
}
if (isset($_GET['start'])) {
    $_SESSION['ldap_import']['start'] = $_GET['start'];
}
if (isset($_GET['order'])) {
    $_SESSION['ldap_import']['order'] = $_GET['order'];
}
if ($_SESSION['ldap_import']['action'] == 'show') {
    $authldap = new AuthLDAP();
    $authldap->getFromDB($_SESSION['ldap_import']['authldaps_id']);
    AuthLdap::showUserImportForm($authldap);
    if (isset($_SESSION['ldap_import']['authldaps_id']) && $_SESSION['ldap_import']['authldaps_id'] != NOT_AVAILABLE && isset($_SESSION['ldap_import']['criterias']) && !empty($_SESSION['ldap_import']['criterias'])) {
        echo "<br />";
        AuthLdap::searchUser($authldap);
    }
}
if (isset($_SESSION['ldap_import']['popup']) && $_SESSION['ldap_import']['popup']) {
    Html::ajaxFooter();
} else {
    Html::footer();
}
コード例 #21
0
ファイル: authldap.form.php プロジェクト: gaforeror/glpi
GLPI 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 GLPI. If not, see <http://www.gnu.org/licenses/>.
--------------------------------------------------------------------------
*/
/** @file
* @brief
*/
include '../inc/includes.php';
Session::checkRight("config", "w");
$config = new Config();
$config_ldap = new AuthLDAP();
if (!isset($_GET['id'])) {
    $_GET['id'] = "";
}
//LDAP Server add/update/delete
if (isset($_POST["update"])) {
    $config_ldap->update($_POST);
    Html::back();
} else {
    if (isset($_POST["add"])) {
        //If no name has been given to this configuration, then go back to the page without adding
        if ($_POST["name"] != "") {
            if ($newID = $config_ldap->add($_POST)) {
                if (AuthLdap::testLDAPConnection($newID)) {
                    Session::addMessageAfterRedirect(__('Test successful'));
                } else {
コード例 #22
0
 /**
  * Display information from LDAP server for user
  **/
 private function showLdapDebug()
 {
     global $LANG;
     if ($this->fields['authtype'] != Auth::LDAP) {
         return false;
     }
     echo "<div class='spaced'>";
     echo "<table class='tab_cadre_fixe'>";
     echo "<tr><th colspan='4'>" . $LANG['setup'][137] . ' - ' . $LANG['login'][2] . "</th></tr>";
     echo "<tr class='tab_bg_2'><td>" . $LANG['ldap'][26] . "&nbsp;:</td>";
     echo "<td>" . $this->fields['user_dn'] . "</td></tr>\n";
     if ($this->fields['user_dn']) {
         echo "<tr class='tab_bg_2'><td>" . $LANG['title'][13] . "&nbsp;:</td><td>";
         $config_ldap = new AuthLDAP();
         $ds = false;
         if ($config_ldap->getFromDB($this->fields['auths_id'])) {
             $ds = $config_ldap->connect();
         }
         if ($ds) {
             $info = AuthLdap::getUserByDn($ds, $this->fields['user_dn'], array('*', 'createTimeStamp', 'modifyTimestamp'));
             if (is_array($info)) {
                 printCleanArray($info);
             } else {
                 echo $LANG['stats'][2];
             }
         } else {
             echo $LANG['log'][41];
         }
         echo "</td></tr>\n";
     }
     echo "</table></div>";
 }