Commit 981aa912 authored by Cédric Anne's avatar Cédric Anne Committed by Johan Cwiklinski

Fix bad usage of \d in MySQL regexp; fixes #5457

parent 503c1d1d
......@@ -846,7 +846,7 @@ class Document extends CommonDBTM {
* @return string
*/
private function getSelfUrlRegexPattern() {
return 'document\\\.send\\\.php\\\?docid=' . $this->fields['id'] . '[^\\\d]+';
return 'document\\\.send\\\.php\\\?docid=' . $this->fields['id'] . '[^0-9]+';
}
static function rawSearchOptionsToAdd($itemtype = null) {
......
......@@ -57,6 +57,11 @@ function update940to941() {
));
/** Fix URL of images inside ITIL objects contents */
// There is an exact copy of this process in "update941to942()".
// First version of this migration was working
// on MariaDB but not on MySQL due to usage of "\d" in a REGEXP expression.
// It has been fixed here for people who had not yet updated to 9.4.1 but have been put there
// for people already having updated to 9.4.1.
$migration->displayMessage(sprintf(__('Fix URL of images in ITIL tasks, followups ans solutions.')));
// Search for contents that does not contains the itil object parameter after the docid parameter
......@@ -64,7 +69,7 @@ function update940to941() {
// 1st capturing group is the end of href attribute value
// 2nd capturing group is the href attribute ending quote
$quotes_possible_exp = ['\'', ''', ''', ''', '"', '&quot', '"', '"'];
$missing_param_pattern = '(document\.send\.php\?docid=\d+)(' . implode('|', $quotes_possible_exp) . ')';
$missing_param_pattern = '(document\.send\.php\?docid=[0-9]+)(' . implode('|', $quotes_possible_exp) . ')';
$itil_mappings = [
'Change' => [
......
......@@ -61,6 +61,86 @@ function update941to942() {
);
/* /Remove trailing slash from 'url_base' config */
/** Fix URL of images inside ITIL objects contents */
// This is an exact copy of the same process used in "update940to941()" which was working
// on MariaDB but not on MySQL due to usage of "\d" in a REGEXP expression.
// It has been fixed there for people who had not yet updated to 9.4.1 but have to
// be put back here for people already having updated to 9.4.1.
$migration->displayMessage(sprintf(__('Fix URL of images in ITIL tasks, followups ans solutions.')));
// Search for contents that does not contains the itil object parameter after the docid parameter
// (i.e. having a quote that ends the href just after the docid param value).
// 1st capturing group is the end of href attribute value
// 2nd capturing group is the href attribute ending quote
$quotes_possible_exp = ['\'', ''', ''', ''', '"', '&quot', '"', '"'];
$missing_param_pattern = '(document\.send\.php\?docid=[0-9]+)(' . implode('|', $quotes_possible_exp) . ')';
$itil_mappings = [
'Change' => [
'itil_table' => 'glpi_changes',
'itil_fkey' => 'changes_id',
'task_table' => 'glpi_changetasks',
],
'Problem' => [
'itil_table' => 'glpi_problems',
'itil_fkey' => 'problems_id',
'task_table' => 'glpi_problemtasks',
],
'Ticket' => [
'itil_table' => 'glpi_tickets',
'itil_fkey' => 'tickets_id',
'task_table' => 'glpi_tickettasks',
],
];
$fix_content_fct = function($content, $itil_id, $itil_fkey) use ($missing_param_pattern) {
// Add itil object param between docid param ($1) and ending quote ($2)
return preg_replace(
'/' . $missing_param_pattern . '/',
'$1&' . http_build_query([$itil_fkey => $itil_id]) . '$2',
$content
);
};
foreach ($itil_mappings as $itil_type => $itil_specs) {
$itil_fkey = $itil_specs['itil_fkey'];
$task_table = $itil_specs['task_table'];
// Fix followups and solutions
foreach (['glpi_itilfollowups', 'glpi_itilsolutions'] as $itil_element_table) {
$elements_to_fix = $DB->request(
[
'SELECT' => ['id', 'items_id', 'content'],
'FROM' => $itil_element_table,
'WHERE' => [
'itemtype' => $itil_type,
'content' => ['REGEXP', $DB->escape($missing_param_pattern)],
]
]
);
foreach ($elements_to_fix as $data) {
$data['content'] = $fix_content_fct($data['content'], $data['items_id'], $itil_fkey);
$DB->update($itil_element_table, $data, ['id' => $data['id']]);
}
}
// Fix tasks
$tasks_to_fix = $DB->request(
[
'SELECT' => ['id', $itil_fkey, 'content'],
'FROM' => $task_table,
'WHERE' => [
'content' => ['REGEXP', $DB->escape($missing_param_pattern)],
]
]
);
foreach ($tasks_to_fix as $data) {
$data['content'] = $fix_content_fct($data['content'], $data[$itil_fkey], $itil_fkey);
$DB->update($task_table, $data, ['id' => $data['id']]);
}
}
/** /Fix URL of images inside ITIL objects contents */
// ************ Keep it at the end **************
$migration->executeMigration();
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment