include GLPI_ROOT . "/inc/includes.php"; if (!isset($_SESSION["glpicookietest"]) || $_SESSION["glpicookietest"] != 'testcookie') { if (!is_writable(GLPI_SESSION_DIR)) { glpi_header($CFG_GLPI['root_doc'] . "/index.php?error=2"); } else { glpi_header($CFG_GLPI['root_doc'] . "/index.php?error=1"); } } $_POST = array_map('stripslashes', $_POST); //Do login and checks //$user_present = 1; if (!isset($_POST['login_name'])) { $_POST['login_name'] = ''; } if (isset($_POST['login_password'])) { $_POST['login_password'] = unclean_cross_side_scripting_deep($_POST['login_password']); } else { $_POST['login_password'] = ''; } // Redirect management $REDIRECT = ""; if (isset($_POST['redirect']) && strlen($_POST['redirect']) > 0) { $REDIRECT = "?redirect=" . $_POST['redirect']; } else { if (isset($_GET['redirect']) && strlen($_GET['redirect']) > 0) { $REDIRECT = "?redirect=" . $_GET['redirect']; } } $auth = new Auth(); // now we can continue with the process... if ($auth->Login($_POST['login_name'], $_POST['login_password'], isset($_REQUEST["noAUTO"]) ? $_REQUEST["noAUTO"] : false)) {
/** * Form to add a solution to a ticket * * @param $knowbase_id_toload integer load a kb article as solution (0 = no load) **/ function showSolutionForm($knowbase_id_toload = 0) { global $LANG, $CFG_GLPI; $this->check($this->getField('id'), 'r'); $canedit = $this->canSolve(); $options = array(); if ($knowbase_id_toload > 0) { $kb = new KnowbaseItem(); if ($kb->getFromDB($knowbase_id_toload)) { $this->fields['solution'] = $kb->getField('answer'); } } $this->showFormHeader($options); $show_template = $canedit; // && $this->getField('ticketsolutiontypes_id') == 0 // && empty($this->fields['solution']); $rand_template = mt_rand(); $rand_text = $rand_type = 0; if ($canedit) { $rand_text = mt_rand(); $rand_type = mt_rand(); } if ($show_template) { echo "<tr class='tab_bg_2'>"; echo "<td>" . $LANG['jobresolution'][6] . " : </td><td>"; Dropdown::show('TicketSolutionTemplate', array('value' => 0, 'entity' => $this->getEntityID(), 'rand' => $rand_template, 'toupdate' => array('value_fieldname' => 'value', 'to_update' => 'solution' . $rand_text, 'url' => $CFG_GLPI["root_doc"] . "/ajax/solution.php", 'moreparams' => array('type_id' => 'dropdown_ticketsolutiontypes_id' . $rand_type)))); echo "</td><td colspan='2'>"; echo "<a title\"" . $LANG['job'][23] . "\"\n href='" . $CFG_GLPI['root_doc'] . "/front/knowbaseitem.php?tickets_id=" . $this->getField('id') . "'>" . $LANG['job'][23] . "</a>"; echo "</td></tr>"; } echo "<tr class='tab_bg_2'>"; echo "<td>" . $LANG['job'][48] . " : </td><td>"; $current = $this->fields['status']; // Settings a solution will set status to solved if ($canedit) { Dropdown::show('TicketSolutionType', array('value' => $this->getField('ticketsolutiontypes_id'), 'rand' => $rand_type)); } else { echo Dropdown::getDropdownName('glpi_ticketsolutiontypes', $this->getField('ticketsolutiontypes_id')); } echo "</td><td>" . $LANG['job'][25] . "</td><td>"; Dropdown::showYesNo('_sol_to_kb', false); echo "</td></tr>"; echo "<tr class='tab_bg_2'>"; echo "<td>" . $LANG['joblist'][6] . " : </td><td colspan='3'>"; if ($canedit) { initEditorSystem("solution"); echo "<div id='solution{$rand_text}'>"; echo "<textarea id='solution' name='solution' rows='12' cols='80'>"; echo $this->getField('solution'); echo "</textarea></div>"; } else { echo unclean_cross_side_scripting_deep($this->getField('solution')); } echo "</td></tr>"; $options['candel'] = false; $options['canedit'] = $canedit; $this->showFormButtons($options); }
/** * Create SQL search condition * * @param $val string: value to search * @param $not boolean: is a negative search ? * * @return search string **/ function makeTextSearch($val, $not = false) { $NOT = ""; if ($not) { $NOT = "NOT"; } // Unclean to permit < and > search $val = unclean_cross_side_scripting_deep($val); if ($val == 'NULL' || $val == 'null') { $SEARCH = " IS {$NOT} NULL "; } else { $begin = 0; $end = 0; if (($length = strlen($val)) > 0) { if ($val[0] == '^') { $begin = 1; } if ($val[$length - 1] == '$') { $end = 1; } } if ($begin || $end) { // no utf8_substr, to be consistent with strlen result $val = substr($val, $begin, $length - $end - $begin); } $SEARCH = " {$NOT} LIKE '" . (!$begin ? "%" : "") . $val . (!$end ? "%" : "") . "' "; } return $SEARCH; }
static function cleanContentHtml($input) { if (!$input['content_text']) { $input['content_text'] = html_clean(unclean_cross_side_scripting_deep($input['content_html'])); } return $input; }
/** * Get all data needed for template processing **/ function getDatasForTemplate($event, $options = array()) { global $LANG, $CFG_GLPI; //----------- Ticket infos -------------- // if ($event != 'alertnotclosed') { $fields = array('ticket.title' => 'name', 'ticket.content' => 'content', 'ticket.description' => 'content', 'ticket.costfixed' => 'cost_fixed', 'ticket.costmaterial' => 'cost_material'); foreach ($fields as $tag => $table_field) { $this->datas['##' . $tag . '##'] = $this->obj->getField($table_field); } $this->datas['##ticket.id##'] = sprintf("%07d", $this->obj->getField("id")); $this->datas['##ticket.url##'] = urldecode($CFG_GLPI["url_base"] . "/index.php?redirect=ticket_" . $this->obj->getField("id")); $this->datas['##ticket.urlapprove##'] = urldecode($CFG_GLPI["url_base"] . "/index.php?redirect=ticket_" . $this->obj->getField("id") . "_4"); $this->datas['##ticket.urlvalidation##'] = urldecode($CFG_GLPI["url_base"] . "/index.php?redirect=ticket_" . $this->obj->getField("id") . "_7"); $this->datas['##ticket.entity##'] = Dropdown::getDropdownName('glpi_entities', $this->getEntity()); $events = $this->getAllEvents(); if ($event == 'validation' && isset($options['validation_status'])) { $this->datas['##ticket.action##'] = $LANG['validation'][0] . ' - ' . TicketValidation::getStatus($options['validation_status']); } else { $this->datas['##ticket.action##'] = $events[$event]; } $this->datas['##ticket.storestatus##'] = $this->obj->getField('status'); $this->datas['##ticket.status##'] = Ticket::getStatus($this->obj->getField('status')); $this->datas['##ticket.globalvalidation##'] = TicketValidation::getStatus($this->obj->getField('global_validation')); $this->datas['##ticket.type##'] = Ticket::getTicketTypeName($this->obj->getField('type')); $this->datas['##ticket.requesttype##'] = Dropdown::getDropdownName('glpi_requesttypes', $this->obj->getField('requesttypes_id')); $this->datas['##ticket.urgency##'] = Ticket::getUrgencyName($this->obj->getField('urgency')); $this->datas['##ticket.impact##'] = Ticket::getImpactName($this->obj->getField('impact')); $this->datas['##ticket.priority##'] = Ticket::getPriorityName($this->obj->getField('priority')); $this->datas['##ticket.time##'] = Ticket::getActionTime($this->obj->getField('actiontime')); $this->datas['##ticket.costtime##'] = $this->obj->getField('cost_time'); $this->datas['##ticket.creationdate##'] = convDateTime($this->obj->getField('date')); $this->datas['##ticket.closedate##'] = convDateTime($this->obj->getField('closedate')); $this->datas['##ticket.solvedate##'] = convDateTime($this->obj->getField('solvedate')); $this->datas['##ticket.duedate##'] = convDateTime($this->obj->getField('due_date')); $entitydata = new EntityData(); $autoclose_value = $CFG_GLPI['autoclose_delay']; if ($entitydata->getFromDB($this->getEntity())) { $autoclose_value = $entitydata->getField('autoclose_delay'); // Set global config value if ($autoclose_value == -1) { $autoclose_value = $CFG_GLPI['autoclose_delay']; } } if ($autoclose_value > 0) { $this->datas['##ticket.autoclose##'] = $autoclose_value; $this->datas['##lang.ticket.autoclosewarning##'] = $LANG['job'][54] . " " . $autoclose_value . " " . $LANG['stats'][31]; } else { $this->datas['##ticket.autoclose##'] = $LANG['setup'][307]; $this->datas['##lang.ticket.autoclosewarning##'] = ""; } if ($this->obj->getField('ticketcategories_id')) { $this->datas['##ticket.category##'] = Dropdown::getDropdownName('glpi_ticketcategories', $this->obj->getField('ticketcategories_id')); } else { $this->datas['##ticket.category##'] = ''; } if ($this->obj->getField('slas_id')) { $this->datas['##ticket.sla##'] = Dropdown::getDropdownName('glpi_slas', $this->obj->getField('slas_id')); } else { $this->datas['##ticket.sla##'] = ''; } if ($this->obj->countUsers(Ticket::REQUESTER)) { $users = array(); foreach ($this->obj->getUsers(Ticket::REQUESTER) as $uid => $tmp) { $user_tmp = new User(); $user_tmp->getFromDB($uid); $users[$uid] = $user_tmp->getName(); $tmp = array(); $tmp['##author.id##'] = $uid; $tmp['##author.name##'] = $user_tmp->getName(); if ($user_tmp->getField('locations_id')) { $tmp['##author.location##'] = Dropdown::getDropdownName('glpi_locations', $user_tmp->getField('locations_id')); } else { $tmp['##author.location##'] = ''; } $tmp['##author.phone##'] = $user_tmp->getField('phone'); $tmp['##author.phone2##'] = $user_tmp->getField('phone2'); $this->datas['authors'][] = $tmp; } $this->datas['##ticket.authors##'] = implode(', ', $users); } else { $this->datas['##ticket.authors##'] = ''; } if ($this->obj->getField('users_id_recipient')) { $user_tmp = new User(); $user_tmp->getFromDB($this->obj->getField('users_id_recipient')); $this->datas['##ticket.openbyuser##'] = $user_tmp->getName(); } else { $this->datas['##ticket.openbyuser##'] = ''; } if ($this->obj->countUsers(Ticket::ASSIGN)) { $users = array(); foreach ($this->obj->getUsers(Ticket::ASSIGN) as $uid => $tmp) { $user_tmp = new User(); $user_tmp->getFromDB($uid); $users[$uid] = $user_tmp->getName(); } $this->datas['##ticket.assigntousers##'] = implode(', ', $users); } else { $this->datas['##ticket.assigntousers##'] = ''; } if ($this->obj->countUsers(Ticket::OBSERVER)) { $users = array(); foreach ($this->obj->getUsers(Ticket::OBSERVER) as $uid => $tmp) { $user_tmp = new User(); $user_tmp->getFromDB($uid); $users[$uid] = $user_tmp->getName(); } $this->datas['##ticket.observerusers##'] = implode(', ', $users); } else { $this->datas['##ticket.observerusers##'] = ''; } if ($this->obj->getField('suppliers_id_assign')) { $this->datas['##ticket.assigntosupplier##'] = Dropdown::getDropdownName('glpi_suppliers', $this->obj->getField('suppliers_id_assign')); } else { $this->datas['##ticket.assigntosupplier##'] = ''; } if ($this->obj->countGroups(Ticket::REQUESTER)) { $groups = array(); foreach ($this->obj->getUsers(Ticket::REQUESTER) as $gid => $tmp) { $groups[$gid] = Dropdown::getDropdownName('glpi_groups', $gid); } $this->datas['##ticket.groups##'] = implode(', ', $groups); } else { $this->datas['##ticket.groups##'] = ''; } if ($this->obj->countGroups(Ticket::OBSERVER)) { $groups = array(); foreach ($this->obj->getGroups(Ticket::OBSERVER) as $gid => $tmp) { $groups[$gid] = Dropdown::getDropdownName('glpi_groups', $gid); } $this->datas['##ticket.observergroups##'] = implode(', ', $groups); } else { $this->datas['##ticket.observergroups##'] = ''; } if ($this->obj->countGroups(Ticket::ASSIGN)) { $groups = array(); foreach ($this->obj->getGroups(Ticket::ASSIGN) as $gid => $tmp) { $groups[$gid] = Dropdown::getDropdownName('glpi_groups', $gid); } $this->datas['##ticket.assigntogroups##'] = implode(', ', $groups); } else { $this->datas['##ticket.assigntogroups##'] = ''; } //Tags associated with the object linked to the ticket if ($this->target_object != null) { //Object type $this->datas['##ticket.itemtype##'] = $this->target_object->getTypeName(); //Object name $this->datas['##ticket.item.name##'] = $this->target_object->getField('name'); //Object serial if ($this->target_object->isField('serial')) { $this->datas['##ticket.item.serial##'] = $this->target_object->getField('serial'); } else { $this->datas['##ticket.item.serial##'] = ''; } //Object contact if ($this->target_object->isField('contact')) { $this->datas['##ticket.item.contact##'] = $this->target_object->getField('contact'); } else { $this->datas['##ticket.item.contact##'] = ''; } //Object contact num if ($this->target_object->isField('contact_num')) { $this->datas['##ticket.item.contactnumber##'] = $this->target_object->getField('contact_num'); } else { $this->datas['##ticket.item.contactnumber##'] = ''; } //Object otherserial if ($this->target_object->isField('otherserial')) { $this->datas['##ticket.item.otherserial##'] = $this->target_object->getField('otherserial'); } else { $this->datas['##ticket.item.otherserial##'] = ''; } //Object location if ($this->target_object->isField('locations_id')) { $this->datas['##ticket.item.location##'] = Dropdown::getDropdownName('glpi_locations', $this->target_object->getField('locations_id')); } else { $this->datas['##ticket.item.location##'] = ''; } //Object user $this->datas['##ticket.item.user##'] = ''; if ($this->obj->getField('users_id')) { $user_tmp = new User(); if ($user_tmp->getFromDB($this->target_object->getField('users_id'))) { $this->datas['##ticket.item.user##'] = $user_tmp->getName(); } } //Object group if ($this->obj->getField('groups_id')) { $this->datas['##ticket.item.group##'] = Dropdown::getDropdownName('glpi_groups', $this->target_object->getField('groups_id')); } else { $this->datas['##ticket.item.group##'] = ''; } $modeltable = getSingular($this->getTable()) . "models"; $modelfield = getForeignKeyFieldForTable($modeltable); if ($this->target_object->isField($modelfield)) { $this->datas['##ticket.item.model##'] = $this->target_object->getField($modelfield); } else { $this->datas['##ticket.item.model##'] = ''; } } else { $this->datas['##ticket.itemtype##'] = ''; $this->datas['##ticket.item.name##'] = ''; $this->datas['##ticket.item.serial##'] = ''; $this->datas['##ticket.item.otherserial##'] = ''; $this->datas['##ticket.item.location##'] = ''; } if ($this->obj->getField('ticketsolutiontypes_id')) { $this->datas['##ticket.solution.type##'] = Dropdown::getDropdownName('glpi_ticketsolutiontypes', $this->obj->getField('ticketsolutiontypes_id')); } else { $this->datas['##ticket.solution.type##'] = ''; } $this->datas['##ticket.solution.description##'] = unclean_cross_side_scripting_deep($this->obj->getField('solution')); // Linked tickets $linked_tickets = Ticket_Ticket::getLinkedTicketsTo($this->obj->getField('id')); if (count($linked_tickets)) { $linkedticket = new Ticket(); foreach ($linked_tickets as $data) { if ($linkedticket->getFromDB($data['tickets_id'])) { $tmp = array(); $tmp['##linkedticket.id##'] = $data['tickets_id']; $tmp['##linkedticket.link##'] = Ticket_Ticket::getLinkName($data['link']); $tmp['##linkedticket.url##'] = urldecode($CFG_GLPI["url_base"] . "/index.php" . "?redirect=ticket_" . $data['tickets_id']); $tmp['##linkedticket.title##'] = $linkedticket->getField('name'); $tmp['##linkedticket.content##'] = $linkedticket->getField('content'); $this->datas['linkedtickets'][] = $tmp; } } } if (!empty($this->datas['linkedtickets'])) { $this->datas['##ticket.numberoflinkedtickets##'] = count($this->datas['linkedtickets']); } else { $this->datas['##ticket.numberoflinkedtickets##'] = 0; } $restrict = "`tickets_id`='" . $this->obj->getField('id') . "'"; if (!isset($options['additionnaloption']) || !$options['additionnaloption']) { $restrict .= " AND `is_private` = '0'"; } $restrict .= " ORDER BY `date` DESC, `id` ASC"; //Task infos $tasks = getAllDatasFromTable('glpi_tickettasks', $restrict); foreach ($tasks as $task) { $tmp = array(); $tmp['##task.isprivate##'] = Dropdown::getYesNo($task['is_private']); $tmp['##task.author##'] = html_clean(getUserName($task['users_id'])); $tmp['##task.category##'] = Dropdown::getDropdownName('glpi_taskcategories', $task['taskcategories_id']); $tmp['##task.date##'] = convDateTime($task['date']); $tmp['##task.description##'] = $task['content']; $tmp['##task.time##'] = Ticket::getActionTime($task['actiontime']); $plan = new TicketPlanning(); if ($plan->getFromDBbyTask($task['id'])) { $tmp['##task.planning.user##'] = html_clean(getUserName($plan->fields['users_id'])); $tmp['##task.planning.begin##'] = convDateTime($plan->fields['begin']); $tmp['##task.planning.end##'] = convDateTime($plan->fields['end']); $tmp['##task.planning.status##'] = Planning::getState($plan->fields['state']); } else { $tmp['##task.planning.user##'] = ""; $tmp['##task.planning.begin##'] = ""; $tmp['##task.planning.end##'] = ""; $tmp['##task.planning.status##'] = ""; } $this->datas['tasks'][] = $tmp; } if (!empty($this->datas['tasks'])) { $this->datas['##ticket.numberoftasks##'] = count($this->datas['tasks']); } else { $this->datas['##ticket.numberoftasks##'] = 0; } //Followup infos $followups = getAllDatasFromTable('glpi_ticketfollowups', $restrict); foreach ($followups as $followup) { $tmp = array(); $tmp['##followup.isprivate##'] = Dropdown::getYesNo($followup['is_private']); $tmp['##followup.author##'] = html_clean(getUserName($followup['users_id'])); $tmp['##followup.requesttype##'] = Dropdown::getDropdownName('glpi_requesttypes', $followup['requesttypes_id']); $tmp['##followup.date##'] = convDateTime($followup['date']); $tmp['##followup.description##'] = $followup['content']; $this->datas['followups'][] = $tmp; } if (isset($this->datas['followups'])) { $this->datas['##ticket.numberoffollowups##'] = count($this->datas['followups']); } else { $this->datas['##ticket.numberoffollowups##'] = 0; } //Validation infos $restrict = "`tickets_id`='" . $this->obj->getField('id') . "'"; if (isset($options['validation_id']) && $options['validation_id']) { $restrict .= " AND `glpi_ticketvalidations`.`id` = '" . $options['validation_id'] . "'"; } $restrict .= " ORDER BY `submission_date` DESC, `id` ASC"; $validations = getAllDatasFromTable('glpi_ticketvalidations', $restrict); foreach ($validations as $validation) { $tmp = array(); $tmp['##validation.submission.title##'] = $LANG['validation'][27] . " (" . $LANG['job'][4] . " " . html_clean(getUserName($validation['users_id'])) . ")"; $tmp['##validation.answer.title##'] = $LANG['validation'][32] . " (" . $LANG['validation'][21] . " " . html_clean(getUserName($validation['users_id_validate'])) . ")"; $tmp['##validation.author##'] = html_clean(getUserName($validation['users_id'])); $tmp['##validation.status##'] = TicketValidation::getStatus($validation['status']); $tmp['##validation.storestatus##'] = $validation['status']; $tmp['##validation.submissiondate##'] = convDateTime($validation['submission_date']); $tmp['##validation.commentsubmission##'] = $validation['comment_submission']; $tmp['##validation.validationdate##'] = convDateTime($validation['validation_date']); $tmp['##validation.validator##'] = html_clean(getUserName($validation['users_id_validate'])); $tmp['##validation.commentvalidation##'] = $validation['comment_validation']; $this->datas['validations'][] = $tmp; } // Ticket Satisfaction $inquest = new TicketSatisfaction(); if ($inquest->getFromDB($this->obj->getField('id'))) { // internal inquest if ($inquest->fields['type'] == 1) { $this->datas['##ticket.urlsatisfaction##'] = urldecode($CFG_GLPI["url_base"] . "/index.php?redirect=ticket_" . $this->obj->getField("id") . "_10"); // external inquest } else { if ($inquest->fields['type'] == 2) { $this->datas['##ticket.urlsatisfaction##'] = EntityData::generateLinkSatisfaction($this->obj); } } $this->datas['##satisfaction.type##'] = $inquest->getTypeInquestName($inquest->getfield('type')); $this->datas['##satisfaction.datebegin##'] = convDateTime($inquest->fields['date_begin']); $this->datas['##satisfaction.dateanswered##'] = convDateTime($inquest->fields['date_answered']); $this->datas['##satisfaction.satisfaction##'] = $inquest->fields['satisfaction']; $this->datas['##satisfaction.description##'] = $inquest->fields['comment']; } else { $this->datas['##satisfaction.type##'] = ''; $this->datas['##satisfaction.datebegin##'] = ''; $this->datas['##satisfaction.dateanswered##'] = ''; $this->datas['##satisfaction.satisfaction##'] = ''; $this->datas['##satisfaction.description##'] = ''; } // Use list_limit_max or load the full history ? foreach (Log::getHistoryData($this->obj, 0, $CFG_GLPI['list_limit_max']) as $data) { $tmp = array(); $tmp['##ticket.log.date##'] = $data['date_mod']; $tmp['##ticket.log.user##'] = $data['user_name']; $tmp['##ticket.log.field##'] = $data['field']; $tmp['##ticket.log.content##'] = $data['change']; $this->datas['log'][] = $tmp; } if (isset($this->datas['log'])) { $this->datas['##ticket.numberoflogs##'] = count($this->datas['log']); } else { $this->datas['##ticket.numberoflogs##'] = 0; } } else { if (isset($options['entities_id']) && isset($options['tickets'])) { $this->datas['##ticket.entity##'] = Dropdown::getDropdownName('glpi_entities', $options['entities_id']); $this->datas['##ticket.action##'] = $LANG['crontask'][15]; $t = new Ticket(); foreach ($options['tickets'] as $ticket) { $tmp = array(); $t->getFromDB($ticket['id']); $tmp['##ticket.id##'] = sprintf("%07d", $ticket['id']); $tmp['##ticket.url##'] = urldecode($CFG_GLPI["url_base"] . "/index.php?redirect=ticket_" . $ticket['id']); $tmp['##ticket.title##'] = $ticket['name']; $tmp['##ticket.status##'] = Ticket::getStatus($ticket['status']); $tmp['##ticket.globalvalidation##'] = TicketValidation::getStatus($ticket['global_validation']); $tmp['##ticket.requesttype##'] = Dropdown::getDropdownName('glpi_requesttypes', $ticket['requesttypes_id']); $tmp['##ticket.urgency##'] = Ticket::getUrgencyName($ticket['urgency']); $tmp['##ticket.impact##'] = Ticket::getImpactName($ticket['impact']); $tmp['##ticket.priority##'] = Ticket::getPriorityName($ticket['priority']); $tmp['##ticket.time##'] = Ticket::getActionTime($ticket['actiontime']); $tmp['##ticket.costtime##'] = $ticket['cost_time']; $tmp['##ticket.creationdate##'] = convDateTime($ticket['date']); $tmp['##ticket.content##'] = $ticket['content']; if ($t->getField('ticketsolutiontypes_id')) { $tmp['##ticket.solution.type##'] = Dropdown::getDropdownName('glpi_ticketsolutiontypes', $t->getField('ticketsolutiontypes_id')); } else { $this->datas['##ticket.solution.type##'] = ''; } $tmp['##ticket.solution.description##'] = unclean_cross_side_scripting_deep($t->getField('solution')); if ($t->countUsers(Ticket::REQUESTER)) { $users = array(); foreach ($t->getUsers(Ticket::REQUESTER) as $uid => $val) { $user_tmp = new User(); $user_tmp->getFromDB($uid); $users[$uid] = $user_tmp->getName(); $tmp2 = array(); $tmp2['##author.id##'] = $uid; $tmp2['##author.name##'] = $user_tmp->getName(); if ($user_tmp->getField('locations_id')) { $tmp2['##author.location##'] = Dropdown::getDropdownName('glpi_locations', $user_tmp->getField('locations_id')); } else { $tmp2['##author.location##'] = ''; } $tmp2['##author.phone##'] = $user_tmp->getField('phone'); $tmp2['##author.phone2##'] = $user_tmp->getField('phone2'); $tmp['authors'][] = $tmp2; } $tmp['##ticket.authors##'] = implode(', ', $users); } else { $tmp['##ticket.authors##'] = ''; } if ($t->countUsers(Ticket::ASSIGN)) { $users = array(); foreach ($t->getUsers(Ticket::ASSIGN) as $uid => $val) { $user_tmp = new User(); $user_tmp->getFromDB($uid); $users[$uid] = $user_tmp->getName(); } $tmp['##ticket.assigntousers##'] = implode(', ', $users); } else { $tmp['##ticket.assigntousers##'] = ''; } if ($t->countGroups(Ticket::ASSIGN)) { $groups = array(); foreach ($t->getGroups(Ticket::ASSIGN) as $gid => $val) { $groups[$gid] = Dropdown::getDropdownName('glpi_groups', $gid); } $tmp['##ticket.assigntogroups##'] = implode(', ', $groups); } else { $tmp['##ticket.assigntogroups##'] = ''; } if ($t->countGroups(Ticket::REQUESTER)) { $groups = array(); foreach ($t->getGroups(Ticket::REQUESTER) as $gid => $val) { $groups[$gid] = Dropdown::getDropdownName('glpi_groups', $gid); } $tmp['##ticket.groups##'] = implode(', ', $groups); } else { $tmp['##ticket.groups##'] = ''; } if ($t->countUsers(Ticket::OBSERVER)) { $users = array(); foreach ($t->getUsers(Ticket::OBSERVER) as $uid => $tmp) { $user_tmp = new User(); $user_tmp->getFromDB($uid); $users[$uid] = $user_tmp->getName(); } $tmp['##ticket.observerusers##'] = implode(', ', $users); } else { $tmp['##ticket.observerusers##'] = ''; } if ($t->countGroups(Ticket::OBSERVER)) { $groups = array(); foreach ($t->getGroups(Ticket::OBSERVER) as $gid => $tmp) { $groups[$gid] = Dropdown::getDropdownName('glpi_groups', $gid); } $tmp['##ticket.observergroups##'] = implode(', ', $groups); } else { $tmp['##ticket.observergroups##'] = ''; } if ($ticket['suppliers_id_assign']) { $tmp['##ticket.assigntosupplier##'] = Dropdown::getDropdownName('glpi_suppliers', $ticket['suppliers_id_assign']); } else { $tmp['##ticket.assigntosupplier##'] = ''; } $this->datas['tickets'][] = $tmp; } } } $this->getTags(); foreach ($this->tag_descriptions[NotificationTarget::TAG_LANGUAGE] as $tag => $values) { if (!isset($this->datas[$tag])) { $this->datas[$tag] = $values['label']; } } }
/** * Generic Function to display Items * * @param $itemtype item type * @param $ID ID of the SEARCH_OPTION item * @param $data array containing data results * @param $num item num in the request * @param $meta is a meta item ? * * @return string to print **/ static function giveItem($itemtype, $ID, $data, $num, $meta = 0) { global $CFG_GLPI, $LANG; $searchopt =& self::getOptions($itemtype); if (isset($CFG_GLPI["union_search_type"][$itemtype]) && $CFG_GLPI["union_search_type"][$itemtype] == $searchopt[$ID]["table"]) { return self::giveItem($data["TYPE"], $ID, $data, $num, $meta); } // Plugin can override core definition for its type if ($plug = isPluginItemType($itemtype)) { $function = 'plugin_' . $plug['plugin'] . '_giveItem'; if (function_exists($function)) { $out = $function($itemtype, $ID, $data, $num); if (!empty($out)) { return $out; } } } $NAME = "ITEM_"; if ($meta) { $NAME = "META_"; } $table = $searchopt[$ID]["table"]; $field = $searchopt[$ID]["field"]; $linkfield = $searchopt[$ID]["linkfield"]; switch ($table . '.' . $field) { case "glpi_users.name": // USER search case if ($itemtype != 'User' && isset($searchopt[$ID]["forcegroupby"]) && $searchopt[$ID]["forcegroupby"]) { $out = ""; $split = explode("\$\$\$\$", $data[$NAME . $num]); $count_display = 0; $added = array(); for ($k = 0; $k < count($split); $k++) { if ($split[$k] > 0) { if ($count_display) { $out .= "<br>"; } $count_display++; if ($itemtype == 'Ticket') { $userdata = getUserName($split[$k], 2); $out .= $userdata['name'] . " " . showToolTip($userdata["comment"], array('link' => $userdata["link"], 'display' => false)); } else { $out .= getUserName($split[$k], 1); } } } // Manage alternative_email for tickets_users if ($itemtype == 'Ticket' && isset($data[$NAME . $num . '_2'])) { $split = explode("\$\$\$\$", $data[$NAME . $num . '_2']); for ($k = 0; $k < count($split); $k++) { $split2 = explode(" ", $split[$k]); if (count($split2) == 2 && $split2[0] == 0 && !empty($split2[1])) { if ($count_display) { $out .= "<br>"; } $count_display++; $out .= "<a href='mailto:" . $split2[1] . "'>" . $split2[1] . "</a>"; } } } return $out; } if ($itemtype != 'User') { $toadd = ''; if ($itemtype == 'Ticket' && $data[$NAME . $num . "_3"] > 0) { $userdata = getUserName($data[$NAME . $num . "_3"], 2); $toadd = " " . showToolTip($userdata["comment"], array('link' => $userdata["link"], 'display' => false)); } return formatUserName($data[$NAME . $num . "_3"], $data[$NAME . $num], $data[$NAME . $num . "_2"], $data[$NAME . $num . "_4"], 1) . $toadd; } break; case "glpi_profiles.interface": return Profile::getInterfaceName($data[$NAME . $num]); case "glpi_profiles.name": if ($itemtype == 'User' && $ID == 20) { $out = ""; $split = explode("\$\$\$\$", $data[$NAME . $num]); $split2 = explode("\$\$\$\$", $data[$NAME . $num . "_2"]); $split3 = explode("\$\$\$\$", $data[$NAME . $num . "_3"]); $count_display = 0; $added = array(); for ($k = 0; $k < count($split); $k++) { if (strlen(trim($split[$k])) > 0) { $text = $split[$k] . " - " . Dropdown::getDropdownName('glpi_entities', $split2[$k]); if ($split3[$k]) { $text .= " (R)"; } if (!in_array($text, $added)) { if ($count_display) { $out .= "<br>"; } $count_display++; $out .= $text; $added[] = $text; } } } return $out; } break; case "glpi_complete_entities.completename": if ($itemtype == 'User') { $out = ""; $split = explode("\$\$\$\$", $data[$NAME . $num]); $split2 = explode("\$\$\$\$", $data[$NAME . $num . "_2"]); $split3 = explode("\$\$\$\$", $data[$NAME . $num . "_3"]); $added = array(); $count_display = 0; for ($k = 0; $k < count($split); $k++) { if (strlen(trim($split[$k])) > 0) { $text = $split[$k] . " - " . Dropdown::getDropdownName('glpi_profiles', $split2[$k]); if ($split3[$k]) { $text .= " (R)"; } if (!in_array($text, $added)) { if ($count_display) { $out .= "<br>"; } $count_display++; $out .= $text; $added[] = $text; } } } return $out; } break; case "glpi_entities.completename": if ($data[$NAME . $num . "_2"] == 0) { // Set name for Root entity $data[$NAME . $num] = $LANG['entity'][2]; } break; case "glpi_documenttypes.icon": if (!empty($data[$NAME . $num])) { return "<img class='middle' alt='' src='" . $CFG_GLPI["typedoc_icon_dir"] . "/" . $data[$NAME . $num] . "'>"; } return " "; case "glpi_documents.filename": $doc = new Document(); if ($doc->getFromDB($data['id'])) { return $doc->getDownloadLink(); } return NOT_AVAILABLE; case "glpi_deviceharddrives.specificity": case "glpi_devicememories.specificity": case "glpi_deviceprocessors.specificity": return $data[$NAME . $num]; case "glpi_networkports.mac": $out = ""; if ($itemtype == 'Computer') { $displayed = array(); if (!empty($data[$NAME . $num . "_2"])) { $split = explode("\$\$\$\$", $data[$NAME . $num . "_2"]); $count_display = 0; for ($k = 0; $k < count($split); $k++) { $lowstr = utf8_strtolower($split[$k]); if (strlen(trim($split[$k])) > 0 && !in_array($lowstr, $displayed)) { if ($count_display) { $out .= "<br>"; } $count_display++; $out .= $split[$k]; $displayed[] = $lowstr; } } if (!empty($data[$NAME . $num])) { $out .= "<br>"; } } if (!empty($data[$NAME . $num])) { $split = explode("\$\$\$\$", $data[$NAME . $num]); $count_display = 0; for ($k = 0; $k < count($split); $k++) { $lowstr = utf8_strtolower($split[$k]); if (strlen(trim($split[$k])) > 0 && !in_array($lowstr, $displayed)) { if ($count_display) { $out .= "<br>"; } $count_display++; $out .= $split[$k]; $displayed[] = $lowstr; } } } return $out; } break; case "glpi_contracts.duration": case "glpi_contracts.notice": case "glpi_contracts.periodicity": case "glpi_contracts.billing": if (!empty($data[$NAME . $num])) { $split = explode('$$$$', $data[$NAME . $num]); $output = ""; foreach ($split as $duration) { $output .= (empty($output) ? '' : '<br>') . $duration . " " . $LANG['financial'][57]; } return $output; } return " "; case "glpi_contracts.renewal": return Contract::getContractRenewalName($data[$NAME . $num]); case "glpi_infocoms.sink_time": if (!empty($data[$NAME . $num])) { $split = explode("\$\$\$\$", $data[$NAME . $num]); $out = ''; foreach ($split as $val) { $out .= empty($out) ? '' : '<br>'; if ($val > 0) { $out .= $val . " " . $LANG['financial'][9]; } } return $out; } return " "; case "glpi_infocoms.warranty_duration": if (!empty($data[$NAME . $num])) { $split = explode("\$\$\$\$", $data[$NAME . $num]); $out = ''; foreach ($split as $val) { $out .= empty($out) ? '' : '<br>'; if ($val > 0) { $out .= $val . " " . $LANG['financial'][57]; } if ($val < 0) { $out .= $LANG['financial'][2]; } } return $out; } return " "; case "glpi_infocoms.sink_type": $split = explode("\$\$\$\$", $data[$NAME . $num]); $out = ''; foreach ($split as $val) { $out .= (empty($out) ? '' : '<br>') . Infocom::getAmortTypeName($val); } return $out; case "glpi_infocoms.alert": if ($data[$NAME . $num] == pow(2, Alert::END)) { return $LANG['financial'][80]; } return ""; case "glpi_contracts.alert": switch ($data[$NAME . $num]) { case pow(2, Alert::END): return $LANG['buttons'][32]; case pow(2, Alert::NOTICE): return $LANG['financial'][10]; case pow(2, Alert::END) + pow(2, Alert::NOTICE): return $LANG['buttons'][32] . " + " . $LANG['financial'][10]; } return ""; case "glpi_tickets_tickets.tickets_id_1": $out = ""; $split = explode("\$\$\$\$", $data[$NAME . $num]); $split2 = explode("\$\$\$\$", $data[$NAME . $num . "_2"]); $displayed = array(); for ($k = 0; $k < count($split); $k++) { $linkid = $split[$k] == $data['id'] ? $split2[$k] : $split[$k]; if ($linkid > 0 && !isset($displayed[$linkid])) { $text = $linkid . " - " . Dropdown::getDropdownName('glpi_tickets', $linkid); if (count($displayed)) { $out .= "<br>"; } $displayed[$linkid] = $linkid; $out .= $text; } } return $out; case "glpi_tickets.count": if ($data[$NAME . $num] > 0 && haveRight("show_all_ticket", "1")) { if ($itemtype == 'User') { $options['field'][0] = 4; $options['searchtype'][0] = 'equals'; $options['contains'][0] = $data['id']; $options['link'][0] = 'AND'; $options['field'][1] = 22; $options['searchtype'][1] = 'equals'; $options['contains'][1] = $data['id']; $options['link'][1] = 'OR'; $options['field'][2] = 5; $options['searchtype'][2] = 'equals'; $options['contains'][2] = $data['id']; $options['link'][2] = 'OR'; } else { $options['field'][0] = 12; $options['searchtype'][0] = 'equals'; $options['contains'][0] = 'all'; $options['link'][0] = 'AND'; $options['itemtype2'][0] = $itemtype; $options['field2'][0] = self::getOptionNumber($itemtype, 'name'); $options['searchtype2'][0] = 'equals'; $options['contains2'][0] = $data['id']; $options['link2'][0] = 'AND'; } $options['reset'] = 'reset'; $out = "<a id='ticket{$itemtype}" . $data['id'] . "' "; $out .= "href=\"" . $CFG_GLPI["root_doc"] . "/front/ticket.php?" . append_params($options, '&') . "\">"; $out .= $data[$NAME . $num] . "</a>"; } else { $out = $data[$NAME . $num]; } return $out; case "glpi_softwarelicenses.number": if ($data[$NAME . $num . "_2"] == -1) { return $LANG['software'][4]; } if (empty($data[$NAME . $num])) { return 0; } return $data[$NAME . $num]; case "glpi_auth_tables.name": return Auth::getMethodName($data[$NAME . $num], $data[$NAME . $num . "_2"], 1, $data[$NAME . $num . "_3"] . $data[$NAME . $num . "_4"]); case "glpi_reservationitems.comment": if (empty($data[$NAME . $num])) { return "<a title=\"" . $LANG['reservation'][22] . "\"\n href='" . $CFG_GLPI["root_doc"] . "/front/reservationitem.form.php?id=" . $data["refID"] . "' >" . $LANG['common'][49] . "</a>"; } return "<a title=\"" . $LANG['reservation'][22] . "\"\n href='" . $CFG_GLPI["root_doc"] . "/front/reservationitem.form.php?id=" . $data['refID'] . "' >" . resume_text($data[$NAME . $num]) . "</a>"; case 'glpi_notifications.mode': return Notification::getMode($data[$NAME . $num]); case 'glpi_notifications.event': $item = NotificationTarget::getInstanceByType($data['itemtype']); if ($item) { $events = $item->getAllEvents(); return $events[$data[$NAME . $num]]; } return ''; case 'glpi_crontasks.description': $tmp = new CronTask(); return $tmp->getDescription($data['id']); case 'glpi_crontasks.state': return CronTask::getStateName($data[$NAME . $num]); case 'glpi_crontasks.mode': return CronTask::getModeName($data[$NAME . $num]); case 'glpi_crontasks.itemtype': if ($plug = isPluginItemType($data[$NAME . $num])) { return $plug['plugin']; } return ''; case 'glpi_tickets.status': $status = Ticket::getStatus($data[$NAME . $num]); return "<img src=\"" . $CFG_GLPI["root_doc"] . "/pics/" . $data[$NAME . $num] . ".png\"\n alt=\"{$status}\" title=\"{$status}\"> {$status}"; case 'glpi_tickets.type': return Ticket::getTicketTypeName($data[$NAME . $num]); case 'glpi_tickets.priority': return Ticket::getPriorityName($data[$NAME . $num]); case 'glpi_tickets.urgency': return Ticket::getUrgencyName($data[$NAME . $num]); case 'glpi_tickets.impact': return Ticket::getImpactName($data[$NAME . $num]); case 'glpi_tickets.items_id': if (!empty($data[$NAME . $num . "_2"]) && class_exists($data[$NAME . $num . "_2"])) { $item = new $data[$NAME . $num . "_2"](); if ($item->getFromDB($data[$NAME . $num])) { return $item->getLink(true); } } return ' '; case 'glpi_tickets.name': $link = getItemTypeFormURL('Ticket'); $out = "<a id='ticket" . $data[$NAME . $num . "_2"] . "' href=\"" . $link; $out .= strstr($link, '?') ? '&' : '?'; $out .= 'id=' . $data[$NAME . $num . "_2"]; // Force solution tab if solved if ($data[$NAME . $num . "_4"] == 'solved') { $out .= "&forcetab=4"; } $out .= "\">" . $data[$NAME . $num]; if ($_SESSION["glpiis_ids_visible"] || empty($data[$NAME . $num])) { $out .= " (" . $data[$NAME . $num . "_2"] . ")"; } $out .= "</a>"; $out .= showToolTip(nl2br($data[$NAME . $num . "_3"]), array('applyto' => 'ticket' . $data[$NAME . $num . "_2"], 'display' => false)); return $out; case "glpi_tickets.due_date": // No due date in waiting status if ($data[$NAME . $num . '_2'] == 'waiting') { $data[$NAME . $num] = ""; } break; case 'glpi_ticketvalidations.status': case "glpi_tickets.global_validation": $split = explode("\$\$\$\$", $data[$NAME . $num]); $out = ''; foreach ($split as $val) { $status = TicketValidation::getStatus($val); $bgcolor = TicketValidation::getStatusColor($val); $out .= (empty($out) ? '' : '<br>') . "<div style=\"background-color:" . $bgcolor . ";\">" . $status . '</div>'; } return $out; case 'glpi_ticketsatisfactions.type': return TicketSatisfaction::getTypeInquestName($data[$NAME . $num]); case 'glpi_ticketsatisfactions.satisfaction': return TicketSatisfaction::displaySatisfaction($data[$NAME . $num]); case 'glpi_notimportedemails.reason': return NotImportedEmail::getReason($data[$NAME . $num]); case 'glpi_notimportedemails.messageid': $clean = array('<' => '', '>' => ''); return strtr($data[$NAME . $num], $clean); case 'glpi_fieldunicities.fields': $values = explode(',', $data[$NAME . $num]); $item = new $data['ITEMTYPE'](); $message = array(); foreach ($values as $field) { $table = getTableNameForForeignKeyField($field); if ($table != '') { $searchOption = $item->getSearchOptionByField('field', 'name', $table); } else { $searchOption = $item->getSearchOptionByField('field', $field); } $message[] = $searchOption['name']; } return implode(',', $message); } //// Default case // Link with plugin tables : need to know left join structure if (preg_match("/^glpi_plugin_([a-z0-9]+)/", $table . '.' . $field, $matches)) { if (count($matches) == 2) { $plug = $matches[1]; $function = 'plugin_' . $plug . '_giveItem'; if (function_exists($function)) { $out = $function($itemtype, $ID, $data, $num); if (!empty($out)) { return $out; } } } } $unit = ''; if (isset($searchopt[$ID]['unit'])) { $unit = $searchopt[$ID]['unit']; } // Preformat items if (isset($searchopt[$ID]["datatype"])) { switch ($searchopt[$ID]["datatype"]) { case "itemlink": if (!empty($data[$NAME . $num . "_2"])) { if (isset($searchopt[$ID]["itemlink_type"])) { $link = getItemTypeFormURL($searchopt[$ID]["itemlink_type"]); } else { $link = getItemTypeFormURL($itemtype); } $out = "<a id='" . $itemtype . "_" . $data[$NAME . $num . "_2"] . "' href=\"" . $link; $out .= strstr($link, '?') ? '&' : '?'; $out .= 'id=' . $data[$NAME . $num . "_2"] . "\">" . $data[$NAME . $num] . $unit; if ($_SESSION["glpiis_ids_visible"] || empty($data[$NAME . $num])) { $out .= " (" . $data[$NAME . $num . "_2"] . ")"; } $out .= "</a>"; return $out; } if (isset($searchopt[$ID]["itemlink_type"])) { $out = ""; $split = explode("\$\$\$\$", $data[$NAME . $num]); $count_display = 0; $separate = '<br>'; if (isset($searchopt[$ID]['splititems']) && $searchopt[$ID]['splititems']) { $separate = '<hr>'; } for ($k = 0; $k < count($split); $k++) { if (strlen(trim($split[$k])) > 0) { $split2 = explode("\$\$", $split[$k]); if (isset($split2[1]) && $split2[1] > 0) { if ($count_display) { $out .= $separate; } $count_display++; $page = getItemTypeFormURL($searchopt[$ID]["itemlink_type"]); $page .= strpos($page, '?') ? '&id' : '?id'; $out .= "<a id='" . $searchopt[$ID]["itemlink_type"] . "_" . $data['id'] . "_" . $split2[1] . "' href='{$page}=" . $split2[1] . "'>" . $split2[0] . $unit; if ($_SESSION["glpiis_ids_visible"] || empty($split2[0])) { $out .= " (" . $split2[1] . ")"; } $out .= "</a>"; } } } return $out; } break; case "text": $separate = '<br>'; if (isset($searchopt[$ID]['splititems']) && $searchopt[$ID]['splititems']) { $separate = '<hr>'; } $text = str_replace('$$$$', $separate, nl2br($data[$NAME . $num])); if (isset($searchopt[$ID]['htmltext']) && $searchopt[$ID]['htmltext']) { $text = html_clean(unclean_cross_side_scripting_deep($text)); } return $text; case "date": $split = explode("\$\$\$\$", $data[$NAME . $num]); $out = ''; foreach ($split as $val) { $out .= (empty($out) ? '' : '<br>') . convDate($val); } return $out; case "datetime": $split = explode("\$\$\$\$", $data[$NAME . $num]); $out = ''; foreach ($split as $val) { $out .= (empty($out) ? '' : '<br>') . convDateTime($val); } return $out; case "timestamp": $withseconds = false; if (isset($searchopt[$ID]['withseconds'])) { $withseconds = $searchopt[$ID]['withseconds']; } return timestampToString($data[$NAME . $num], $withseconds); case "date_delay": $split = explode('$$$$', $data[$NAME . $num]); $out = ''; foreach ($split as $val) { if (strpos($val, ',')) { list($dat, $dur) = explode(',', $val); if (!empty($dat)) { $out .= (empty($out) ? '' : '<br>') . getWarrantyExpir($dat, $dur); } } } return empty($out) ? " " : $out; case "email": $email = trim($data[$NAME . $num]); if (!empty($email)) { return "<a href='mailto:{$email}'>{$email}</a>"; } return " "; case "weblink": $orig_link = trim($data[$NAME . $num]); if (!empty($orig_link)) { // strip begin of link $link = preg_replace('/https?:\\/\\/(www[^\\.]*\\.)?/', '', $orig_link); $link = preg_replace('/\\/$/', '', $link); if (utf8_strlen($link) > $CFG_GLPI["url_maxlength"]) { $link = utf8_substr($link, 0, $CFG_GLPI["url_maxlength"]) . "..."; } return "<a href=\"" . formatOutputWebLink($orig_link) . "\" target='_blank'>{$link}</a>"; } return " "; case "number": if (isset($searchopt[$ID]['forcegroupby']) && $searchopt[$ID]['forcegroupby']) { $out = ""; $split = explode("\$\$\$\$", $data[$NAME . $num]); $count_display = 0; for ($k = 0; $k < count($split); $k++) { if (strlen(trim($split[$k])) > 0) { if ($count_display) { $out .= "<br>"; } $count_display++; $out .= str_replace(' ', ' ', formatNumber($split[$k], false, 0)) . $unit; } } return $out; } return str_replace(' ', ' ', formatNumber($data[$NAME . $num], false, 0)) . $unit; case "decimal": if (isset($searchopt[$ID]['forcegroupby']) && $searchopt[$ID]['forcegroupby']) { $out = ""; $split = explode("\$\$\$\$", $data[$NAME . $num]); $count_display = 0; for ($k = 0; $k < count($split); $k++) { if (strlen(trim($split[$k])) > 0) { if ($count_display) { $out .= "<br>"; } $count_display++; $out .= str_replace(' ', ' ', formatNumber($split[$k])) . $unit; } } return $out; } return str_replace(' ', ' ', formatNumber($data[$NAME . $num])) . $unit; case "bool": return Dropdown::getYesNo($data[$NAME . $num]) . $unit; case "right": return Profile::getRightValue($data[$NAME . $num]); case "itemtypename": if (class_exists($data[$NAME . $num])) { $obj = new $data[$NAME . $num](); return $obj->getTypeName(); } return ""; case "language": if (isset($CFG_GLPI['languages'][$data[$NAME . $num]])) { return $CFG_GLPI['languages'][$data[$NAME . $num]][0]; } return $LANG['setup'][46]; } } // Manage items with need group by / group_concat if (isset($searchopt[$ID]['forcegroupby']) && $searchopt[$ID]['forcegroupby']) { $out = ""; $split = explode("\$\$\$\$", $data[$NAME . $num]); $count_display = 0; $separate = '<br>'; if (isset($searchopt[$ID]['splititems']) && $searchopt[$ID]['splititems']) { $separate = '<hr>'; } for ($k = 0; $k < count($split); $k++) { if (strlen(trim($split[$k])) > 0) { if ($count_display) { $out .= $separate; } $count_display++; $out .= $split[$k] . $unit; } } return $out; } return $data[$NAME . $num] . $unit; }
/** * Try to match a definied rule * * @param $criterion RuleCriteria object * @param $field the field to match * @param $criterias_results * @param $regex_result * * @return true if the field match the rule, false if it doesn't match **/ static function match(RuleCriteria &$criterion, $field, &$criterias_results, &$regex_result) { $condition = $criterion->fields['condition']; $pattern = $criterion->fields['pattern']; $criteria = $criterion->fields['criteria']; //If pattern is wildcard, don't check the rule and return true //or if the condition is "already present in GLPI" : will be processed later if ($pattern == Rule::RULE_WILDCARD || $pattern == Rule::PATTERN_FIND) { return true; } // Input are slashed protected, not output. if (is_array($field)) { $field = stripslashes_deep($field); } else { // Trim for remove keyboard errors $field = stripslashes(trim($field)); } $pattern = trim($pattern); if ($condition != Rule::REGEX_MATCH && $condition != Rule::REGEX_NOT_MATCH) { //Perform comparison with fields in lower case $field = utf8_strtolower($field); $pattern = utf8_strtolower($pattern); } switch ($condition) { case Rule::PATTERN_EXISTS: return $field != ''; case Rule::PATTERN_DOES_NOT_EXISTS: return $field == ''; case Rule::PATTERN_IS: if (is_array($field)) { // Special case (used only by UNIQUE_PROFILE, for now) if (in_array($pattern, $field)) { $criterias_results[$criteria] = $pattern; return true; } } else { if ($field == $pattern) { $criterias_results[$criteria] = $pattern; return true; } } return false; case Rule::PATTERN_IS_NOT: if ($field != $pattern) { $criterias_results[$criteria] = $pattern; return true; } return false; case Rule::PATTERN_END: $value = "/" . $pattern . "\$/"; if (preg_match($value, $field) > 0) { $criterias_results[$criteria] = $pattern; return true; } return false; case Rule::PATTERN_BEGIN: if (empty($pattern)) { return false; } $value = strpos($field, $pattern); if ($value !== false && $value == 0) { $criterias_results[$criteria] = $pattern; return true; } return false; case Rule::PATTERN_CONTAIN: if (empty($pattern)) { return false; } $value = strpos($field, $pattern); if ($value !== false && $value >= 0) { $criterias_results[$criteria] = $pattern; return true; } return false; case Rule::PATTERN_NOT_CONTAIN: if (empty($pattern)) { return false; } $value = strpos($field, $pattern); if ($value === false) { $criterias_results[$criteria] = $pattern; return true; } return false; case Rule::REGEX_MATCH: $results = array(); // Permit use < and > $pattern = unclean_cross_side_scripting_deep($pattern); if (preg_match($pattern . "i", $field, $results) > 0) { // Drop $result[0] : complete match result array_shift($results); // And add to $regex_result array $regex_result[] = $results; $criterias_results[$criteria] = $pattern; return true; } return false; case Rule::REGEX_NOT_MATCH: // Permit use < and > $pattern = unclean_cross_side_scripting_deep($pattern); if (preg_match($pattern . "i", $field) == 0) { $criterias_results[$criteria] = $pattern; return true; } return false; case Rule::PATTERN_FIND: return true; } return false; }
static function process($string, $data) { $offset = $new_offset = 0; //Template processed $output = ""; //Remove all $string = unclean_cross_side_scripting_deep($string); //First of all process the FOREACH tag if (preg_match_all("/##FOREACH[ ]?(FIRST|LAST)?[ ]?([0-9]*)?[ ]?([a-zA-Z-0-9\\.]*)##/i", $string, $out)) { foreach ($out[3] as $id => $tag_infos) { $regex = "/" . $out[0][$id] . "(.*)##ENDFOREACH" . $tag_infos . "##/Uis"; if (preg_match($regex, $string, $tag_out) && isset($data[$tag_infos]) && is_array($data[$tag_infos])) { $data_lang_foreach = $data; unset($data_lang_foreach[$tag_infos]); //Manage FIRST & LAST statement $foreachvalues = $data[$tag_infos]; if (!empty($foreachvalues)) { if (isset($out[1][$id]) && $out[1][$id] != '') { if ($out[1][$id] == 'FIRST') { $foreachvalues = array_reverse($foreachvalues); } if (isset($out[2][$id]) && $out[2][$id]) { $foreachvalues = array_slice($foreachvalues, 0, $out[2][$id]); } else { $foreachvalues = array_slice($foreachvalues, 0, 1); } } } $output_foreach_string = ""; foreach ($foreachvalues as $line) { foreach ($line as $field => $value) { if (!is_array($value)) { $data_lang_foreach[$field] = $value; } } $tmp = self::processIf($tag_out[1], $data_lang_foreach); $output_foreach_string .= strtr($tmp, $data_lang_foreach); } $string = str_replace($tag_out[0], $output_foreach_string, $string); } else { $string = str_replace($tag_out, '', $string); } } } foreach ($data as $field => $value) { if (is_array($value)) { unset($data[$field]); } } //Now process IF statements $string = self::processIf($string, $data); $string = strtr($string, $data); return $string; }
echo '<head><title>GLPI - ' . $LANG['login'][10] . '</title>' . "\n"; echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>' . "\n"; echo '<meta http-equiv="Content-Script-Type" content="text/javascript"/>' . "\n"; echo '<link rel="shortcut icon" type="images/x-icon" href="' . $CFG_GLPI["root_doc"] . '/pics/favicon.ico" />'; // Appel CSS echo '<link rel="stylesheet" href="' . $CFG_GLPI["root_doc"] . '/css/styles.css" type="text/css" ' . 'media="screen" />'; // surcharge CSS hack for IE echo "<!--[if lte IE 6]>"; echo "<link rel='stylesheet' href='" . $CFG_GLPI["root_doc"] . "/css/styles_ie.css' type='text/css' " . "media='screen' >\n"; echo "<![endif]-->"; echo "<script type='text/javascript'><!--document.getElementById('var_login_name').focus();-->" . "</script>"; echo "</head>"; echo "<body>"; echo "<div id='contenulogin'>"; echo "<div id='logo-login'>"; echo nl2br(unclean_cross_side_scripting_deep($CFG_GLPI['text_login'])); echo "</div>"; echo "<div id='boxlogin'>"; echo "<form action='" . $CFG_GLPI["root_doc"] . "/login.php' method='post'>"; // Other CAS if (isset($_GET["noAUTO"])) { echo "<input type='hidden' name='noAUTO' value='1'/>"; } // redirect to ticket if (isset($_GET["redirect"])) { manageRedirect($_GET["redirect"]); echo '<input type="hidden" name="redirect" value="' . $_GET['redirect'] . '">'; } echo "<fieldset>"; echo '<legend>' . $LANG['login'][10] . '</legend>'; echo '<div class="row"><span class="label"><label>' . $LANG['login'][6] . ' : </label></span>';
/** *Print out list kb item * * @param $options : $_GET * @param $faq display on faq ? **/ static function showList($options, $faq = 0) { global $DB, $LANG, $CFG_GLPI; // Default values of parameters $params["start"] = "0"; $params["knowbaseitemcategories_id"] = "0"; $params["contains"] = ""; $params["target"] = $_SERVER['PHP_SELF']; if (is_array($options) && count($options)) { foreach ($options as $key => $val) { $params[$key] = $val; } } // Lists kb Items $where = ""; $order = ""; $score = ""; // Build query if (getLoginUserID()) { $where = getEntitiesRestrictRequest("", "glpi_knowbaseitems", "", "", true) . " AND "; } else { // Anonymous access if (isMultiEntitiesMode()) { $where = " (`glpi_knowbaseitems`.`entities_id` = '0'\n AND `glpi_knowbaseitems`.`is_recursive` = '1')\n AND "; } } if ($faq) { // helpdesk $where .= " (`glpi_knowbaseitems`.`is_faq` = '1')\n AND "; } // a search with $contains if (strlen($params["contains"]) > 0) { $search = unclean_cross_side_scripting_deep($params["contains"]); $score = " ,MATCH(glpi_knowbaseitems.question, glpi_knowbaseitems.answer)\n AGAINST('{$search}' IN BOOLEAN MODE) AS SCORE "; $where_1 = $where . " MATCH(glpi_knowbaseitems.question, glpi_knowbaseitems.answer)\n AGAINST('{$search}' IN BOOLEAN MODE) "; $order = "ORDER BY `SCORE` DESC"; // preliminar query to allow alternate search if no result with fulltext $query_1 = "SELECT COUNT(`id`)\n FROM `glpi_knowbaseitems`\n WHERE {$where_1}"; $result_1 = $DB->query($query_1); $numrows_1 = $DB->result($result_1, 0, 0); if ($numrows_1 <= 0) { // not result this fulltext try with alternate search $search1 = array('/\\\\"/', "/\\+/", "/\\*/", "/~/", "/</", "/>/", "/\\(/", "/\\)/", "/\\-/"); $contains = preg_replace($search1, "", $params["contains"]); $where .= " (`glpi_knowbaseitems`.`question` " . makeTextSearch($contains) . "\n OR `glpi_knowbaseitems`.`answer` " . makeTextSearch($contains) . ")"; } else { $where = $where_1; } } else { // no search -> browse by category $where .= " (`glpi_knowbaseitems`.`knowbaseitemcategories_id`\n = '" . $params["knowbaseitemcategories_id"] . "')"; $order = " ORDER BY `glpi_knowbaseitems`.`question` ASC"; } if (!$params["start"]) { $params["start"] = 0; } $query = "SELECT `glpi_knowbaseitems`.*,\n `glpi_knowbaseitemcategories`.`completename` AS category\n {$score}\n FROM `glpi_knowbaseitems`\n LEFT JOIN `glpi_knowbaseitemcategories`\n ON (`glpi_knowbaseitemcategories`.`id`\n = `glpi_knowbaseitems`.`knowbaseitemcategories_id`)\n WHERE {$where}\n {$order}"; // Get it from database if ($result = $DB->query($query)) { $KbCategory = new KnowbaseItemCategory(); $title = ""; if ($KbCategory->getFromDB($params["knowbaseitemcategories_id"])) { $title = $LANG['common'][36] . " = " . (empty($KbCategory->fields['name']) ? "(" . $params['knowbaseitemcategories_id'] . ")" : $KbCategory->fields['name']); } initNavigateListItems('KnowbaseItem', $title); $numrows = $DB->numrows($result); $list_limit = $_SESSION['glpilist_limit']; // Limit the result, if no limit applies, use prior result if ($numrows > $list_limit && !isset($_GET['export_all'])) { $query_limit = $query . " LIMIT " . intval($params["start"]) . ", " . intval($list_limit) . " "; $result_limit = $DB->query($query_limit); $numrows_limit = $DB->numrows($result_limit); } else { $numrows_limit = $numrows; $result_limit = $result; } if ($numrows_limit > 0) { // Set display type for export if define $output_type = HTML_OUTPUT; if (isset($_GET["display_type"])) { $output_type = $_GET["display_type"]; } // Pager $parameters = "start=" . $params["start"] . "&knowbaseitemcategories_id=" . $params['knowbaseitemcategories_id'] . "&contains=" . $params["contains"] . "&is_faq={$faq}"; if (isset($options['tickets_id'])) { $parameters .= "&tickets_id=" . $options['tickets_id']; } if ($output_type == HTML_OUTPUT) { printPager($params['start'], $numrows, getItemTypeSearchURL('KnowbaseItem'), $parameters, 'KnowbaseItem'); } $nbcols = 1; // Display List Header echo Search::showHeader($output_type, $numrows_limit + 1, $nbcols); $header_num = 1; echo Search::showHeaderItem($output_type, $LANG['knowbase'][14], $header_num); if ($output_type != HTML_OUTPUT) { echo Search::showHeaderItem($output_type, $LANG['knowbase'][15], $header_num); } echo Search::showHeaderItem($output_type, $LANG['common'][36], $header_num); if (isset($options['tickets_id']) && $output_type == HTML_OUTPUT) { echo Search::showHeaderItem($output_type, ' ', $header_num); } // Num of the row (1=header_line) $row_num = 1; for ($i = 0; $i < $numrows_limit; $i++) { $data = $DB->fetch_array($result_limit); addToNavigateListItems('KnowbaseItem', $data["id"]); // Column num $item_num = 1; $row_num++; echo Search::showNewLine($output_type, $i % 2); if ($output_type == HTML_OUTPUT) { if (isset($options['tickets_id'])) { $href = " href='#' onClick=\"var w = window.open('" . $CFG_GLPI["root_doc"] . "/front/popup.php?popup=show_kb&id=" . $data['id'] . "' ,'glpipopup', " . "'height=400, width=1000, top=100, left=100, scrollbars=yes' );w.focus();\""; } else { $href = " href=\"" . $params['target'] . "?id=" . $data["id"] . "\" "; } echo Search::showItem($output_type, "<div class='kb'><a " . ($data['is_faq'] ? " class='pubfaq' " : " class='knowbase' ") . " {$href}>" . resume_text($data["question"], 80) . "</a></div>\n <div class='kb_resume'>" . resume_text(html_clean(unclean_cross_side_scripting_deep($data["answer"])), 600) . "</div>", $item_num, $row_num); } else { echo Search::showItem($output_type, $data["question"], $item_num, $row_num); echo Search::showItem($output_type, html_clean(unclean_cross_side_scripting_deep(html_entity_decode($data["answer"], ENT_QUOTES, "UTF-8"))), $item_num, $row_num); } echo Search::showItem($output_type, $data["category"], $item_num, $row_num); if (isset($options['tickets_id']) && $output_type == HTML_OUTPUT) { $content = "<a href='" . $CFG_GLPI['root_doc'] . "/front/ticket.form.php?load_kb_sol=" . $data['id'] . "&id=" . $options['tickets_id'] . "&forcetab=4'>" . $LANG['job'][24] . "</a>"; echo Search::showItem($output_type, $content, $item_num, $row_num); } // End Line echo Search::showEndLine($output_type); } // Display footer if ($output_type == PDF_OUTPUT_LANDSCAPE || $output_type == PDF_OUTPUT_PORTRAIT) { echo Search::showFooter($output_type, Dropdown::getDropdownName("glpi_knowbaseitemcategories", $params['knowbaseitemcategories_id'])); } else { echo Search::showFooter($output_type); } echo "<br>"; if ($output_type == HTML_OUTPUT) { printPager($params['start'], $numrows, getItemTypeSearchURL('KnowbaseItem'), $parameters, 'KnowbaseItem'); } } else { if ($params["knowbaseitemcategories_id"] != 0) { echo "<div class='center b'>" . $LANG['search'][15] . "</div>"; } } } }
function prepareInputForUpdate($input) { global $LANG, $CFG_GLPI; if (isset($input["password2"])) { // Empty : do not update if (empty($input["password"])) { unset($input["password"]); } else { if ($input["password"] == $input["password2"]) { // Check right : my password of user with lesser rights if (isset($input['id']) && ($input['id'] == getLoginUserID() || $this->currentUserHaveMoreRightThan($input['id']) || $input['token'] == $this->fields['token'] && abs(strtotime($_SESSION["glpi_currenttime"]) - strtotime($this->fields['tokendate'])) < DAY_TIMESTAMP && $input['email'] == $this->fields['email'])) { $input["password"] = sha1(unclean_cross_side_scripting_deep(stripslashes($input["password"]))); } else { unset($input["password"]); } unset($input["password2"]); } else { addMessageAfterRedirect($LANG['setup'][21], false, ERROR); return false; } } } else { if (isset($input["password"])) { // From login unset($input["password"]); } } // change email_form to email (not to have a problem with preselected email) if (isset($input["email_form"])) { $input["email"] = $input["email_form"]; unset($input["email_form"]); } // Update User in the database if (!isset($input["id"]) && isset($input["name"])) { if ($this->getFromDBbyName($input["name"])) { $input["id"] = $this->fields["id"]; } } if (isset($input["entities_id"]) && getLoginUserID() === $input['id']) { $_SESSION["glpidefault_entity"] = $input["entities_id"]; } // Security on default profile update if (isset($input['profiles_id'])) { if (!in_array($input['profiles_id'], Profile_User::getUserProfiles($input['id']))) { unset($input['profiles_id']); } } // Security on default entity update if (isset($input['entities_id'])) { if (!in_array($input['entities_id'], Profile_User::getUserEntities($input['id']))) { unset($input['entities_id']); } } // Manage preferences fields if (getLoginUserID() === $input['id']) { if (isset($input['use_mode']) && $_SESSION['glpi_use_mode'] != $input['use_mode']) { $_SESSION['glpi_use_mode'] = $input['use_mode']; //loadLanguage(); } } foreach ($CFG_GLPI['user_pref_field'] as $f) { if (isset($input[$f])) { if (getLoginUserID() === $input['id']) { if ($_SESSION["glpi{$f}"] != $input[$f]) { $_SESSION["glpi{$f}"] = $input[$f]; } } if ($input[$f] == $CFG_GLPI[$f]) { $input[$f] = "NULL"; } } } return $input; }