Blob Blame History Raw
From b2d2842fdadf4983900462fd2179b95bb9c7f6d6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9dric=20Anne?= <cedric.anne@gmail.com>
Date: Tue, 7 Jan 2020 20:53:19 +0100
Subject: [PATCH 01/10] Run test suite on PHP 7.4

---
 .circleci/config.yml     | 24 ++++++++++++++++--------
 .github/workflows/ci.yml |  3 ++-
 .travis.yml              |  3 +--
 3 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/.circleci/config.yml b/.circleci/config.yml
index 6d14f4aa76..329b41723c 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -36,7 +36,7 @@ shared: &shared
         command: vendor/bin/security-checker security:check
     - run:
         name: Coding standards
-        command: if [[ $(php --version|grep "7\.3") ]]; then vendor/bin/phpcs -d memory_limit=512M -p -n vendor/bin/phpcs -d memory_limit=512M -p --standard=vendor/glpi-project/coding-standard/GlpiStandard/ --ignore=/vendor/,/plugins/,/files/,/lib/,/config/,/tests/config,/css/tiny_mce,/.git ./; else echo "No CS for this version"; fi
+        command: if [[ $(php --version|grep "7\.4") ]]; then vendor/bin/phpcs -d memory_limit=512M -p -n vendor/bin/phpcs -d memory_limit=512M -p --standard=vendor/glpi-project/coding-standard/GlpiStandard/ --ignore=/vendor/,/plugins/,/files/,/lib/,/config/,/tests/config,/css/tiny_mce,/.git ./; else echo "No CS for this version"; fi
     - run:
         name: Update DB
         command: |
@@ -110,25 +110,25 @@ jobs:
     docker:
       - image: glpi/circleci-env-core:php_7.3_fpm-node
       - image: circleci/mariadb:10.3-ram
-  php_latest_test_suite:
+  php_7_4_test_suite:
     <<: *shared
     docker:
-      - image: glpi/circleci-env-core:php_latest_fpm-node
-      - image: circleci/mariadb:10.3-ram
+      - image: glpi/circleci-env-core:php_7.4_fpm-node
+      - image: circleci/mariadb:10.4-ram
   mysql_5_6_test_suite:
     <<: *shared
     docker:
-      - image: glpi/circleci-env-core:php_7.3_fpm-node
+      - image: glpi/circleci-env-core:php_7.4_fpm-node
       - image: circleci/mysql:5.6-ram
   mysql_5_7_test_suite:
     <<: *shared
     docker:
-      - image: glpi/circleci-env-core:php_7.3_fpm-node
+      - image: glpi/circleci-env-core:php_7.4_fpm-node
       - image: circleci/mysql:5.7-ram
   mysql_8_0_test_suite:
     <<: *shared
     docker:
-      - image: glpi/circleci-env-core:php_7.3_fpm-node
+      - image: glpi/circleci-env-core:php_7.4_fpm-node
       - image: circleci/mysql:8.0-ram
         command: [--default-authentication-plugin=mysql_native_password] # Fix "Authentication plugin 'caching_sha2_password' cannot be loaded"
 
@@ -177,6 +177,14 @@ workflows:
           filters:
             tags:
               only: /.*/ # run also on tag creation
+            branches:
+              ignore: /.*/ # do not run on branch update
+      - php_7_4_test_suite:
+          requires:
+            - checkout
+          filters:
+            tags:
+              only: /.*/ # run also on tag creation
       - mysql_5_6_test_suite:
           requires:
             - checkout
@@ -227,7 +235,7 @@ workflows:
       - php_7_3_test_suite:
           requires:
             - checkout
-      - php_latest_test_suite:
+      - php_7_4_test_suite:
           requires:
             - checkout
       - mysql_5_6_test_suite:
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 020d909411..811315fb67 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -53,7 +53,8 @@ jobs:
           #- "7.0"
           #- "7.1"
           #- "7.2"
-          - "7.3"
+          #- "7.3"
+          - "7.4"
     services:
       app:
         image: "glpi/githubactions-php:${{ matrix.php-version }}"
diff --git a/.travis.yml b/.travis.yml
index ce6b588b17..1d5491bab5 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -65,7 +65,7 @@ matrix:
             - slapd
         hosts:
           - openldap
-    - php: 7.4snapshot
+    - php: 7.4
       addons:
         apt:
           packages:
@@ -83,7 +83,6 @@ matrix:
           - openldap
   allow_failures:
     - php: nightly
-    - php: 7.4snapshot
 
 cache:
   directories:

From 30079c3c9ff790f35a3727ad4029944249d42d5e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9dric=20Anne?= <cedric.anne@gmail.com>
Date: Mon, 30 Sep 2019 16:01:15 +0200
Subject: [PATCH 02/10] Fix notice trigerred when ticket has no followup

==> Error E_NOTICE in /var/glpi/tests/functionnal/NotificationTargetTicket.php on line 115, generated by file /var/glpi/inc/notificationtargetticket.class.php on line 462:
Trying to access array offset on value of type bool
---
 inc/notificationtargetticket.class.php | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/inc/notificationtargetticket.class.php b/inc/notificationtargetticket.class.php
index 115c601838..d39f4ade7b 100644
--- a/inc/notificationtargetticket.class.php
+++ b/inc/notificationtargetticket.class.php
@@ -452,9 +452,9 @@ function getDataForObject(CommonDBTM $item, array $options, $simple = false) {
          ];
          $replysolved = getAllDatasFromTable('glpi_itilfollowups', $solution_restrict, false, ['date_mod DESC', 'id ASC']);
          $current = current($replysolved);
-         $data['##ticket.solution.approval.description##'] = $current['content'];
-         $data['##ticket.solution.approval.date##']        = Html::convDateTime($current['date']);
-         $data['##ticket.solution.approval.author##']      = Html::clean(getUserName($current['users_id']));
+         $data['##ticket.solution.approval.description##'] = $current ? $current['content'] : '';
+         $data['##ticket.solution.approval.date##']        = $current ? Html::convDateTime($current['date']) : '';
+         $data['##ticket.solution.approval.author##']      = $current ? Html::clean(getUserName($current['users_id'])) : '';
 
          //Validation infos
          $restrict = ['tickets_id' => $item->getField('id')];

From f2e9da2e979d5f7be8d0a68919e00346220e7170 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9dric=20Anne?= <cedric.anne@gmail.com>
Date: Mon, 30 Sep 2019 16:00:48 +0200
Subject: [PATCH 03/10] Fix parsing of classes on Search::testSearchOptions()

==> Error E_NOTICE in /var/glpi/tests/functionnal/Search.php on line 558, generated by file /var/glpi/tests/functionnal/Search.php on line 95:
file_get_contents(): read of 8192 bytes failed with errno=21 Is a directory
---
 tests/functionnal/Search.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/functionnal/Search.php b/tests/functionnal/Search.php
index 3b830d3bd3..6432c18fea 100644
--- a/tests/functionnal/Search.php
+++ b/tests/functionnal/Search.php
@@ -88,7 +88,7 @@ private function doSearch($itemtype, $params, array $forcedisplay = []) {
    private function getClasses($function = false, array $excludes = []) {
       $classes = [];
       foreach (new \DirectoryIterator('inc/') as $fileInfo) {
-         if ($fileInfo->isDot()) {
+         if (!$fileInfo->isFile()) {
             continue;
          }
 

From c7920bcd3b19757bb824bb52733715ac2d3ea6cf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9dric=20Anne?= <cedric.anne@gmail.com>
Date: Mon, 30 Sep 2019 15:22:02 +0200
Subject: [PATCH 04/10] Fix error handling in unit tests

---
 inc/toolbox.class.php | 16 +++-------------
 tests/bootstrap.php   |  1 +
 2 files changed, 4 insertions(+), 13 deletions(-)

diff --git a/inc/toolbox.class.php b/inc/toolbox.class.php
index 0df3d82045..0f12616723 100644
--- a/inc/toolbox.class.php
+++ b/inc/toolbox.class.php
@@ -713,26 +713,16 @@ static function setDebugMode($mode = null, $debug_sql = null, $debug_vars = null
 
       // If debug mode activated : display some information
       if ($_SESSION['glpi_use_mode'] == Session::DEBUG_MODE) {
-         // display_errors only need for for E_ERROR, E_PARSE, ... which cannot be catched
          // Recommended development settings
          ini_set('display_errors', 'On');
-         error_reporting(E_ALL | E_STRICT);
+         error_reporting(E_ALL);
          set_error_handler(['Toolbox','userErrorHandlerDebug']);
-
-      } else {
+      } else if (!defined('TU_USER')) {
          // Recommended production settings
          ini_set('display_errors', 'Off');
-         if (defined('TU_USER')) {
-            //do not set error_reporting to a low level for unit tests
-            error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT);
-         }
+         error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT);
          set_error_handler(['Toolbox', 'userErrorHandlerNormal']);
       }
-
-      if (defined('TU_USER')) {
-         //user default error handler from tests
-         set_error_handler(null);
-      }
    }
 
 
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
index 8308d0a750..6575169bf6 100644
--- a/tests/bootstrap.php
+++ b/tests/bootstrap.php
@@ -30,6 +30,7 @@
  * ---------------------------------------------------------------------
  */
 
+ini_set('display_errors', 'On');
 error_reporting(E_ALL);
 
 define('GLPI_CACHE_DIR', __DIR__ . '/files/_cache');

From dff20cd35417ba596247192dfb8f78964d1a62a2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9dric=20Anne?= <cedric.anne@gmail.com>
Date: Mon, 30 Sep 2019 12:53:47 +0200
Subject: [PATCH 05/10] Fix Iterator mock in Migration::addConfig() test

---
 tests/units/Migration.php | 24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/tests/units/Migration.php b/tests/units/Migration.php
index 68a57b63ed..6b34b20980 100644
--- a/tests/units/Migration.php
+++ b/tests/units/Migration.php
@@ -152,14 +152,22 @@ function () {
 
       //test with one existing value => only new key should be inserted
       $this->queries = [];
-      $dbresult = [[
-         'id'        => '42',
-         'context'   => 'core',
-         'name'      => 'one',
-         'value'     => 'setted value'
-      ]];
-      $it = new \ArrayIterator($dbresult);
-      $this->calling($this->db)->request = $it;
+      $this->calling($this->db)->request = function ($table) {
+         // Call using 'glpi_configs' value for first parameter
+         // corresponds to the call made to retrieve exisintg values
+         // -> returns a value for config 'one'
+         if ('glpi_configs' === $table) {
+            $dbresult = [[
+               'id'        => '42',
+               'context'   => 'core',
+               'name'      => 'one',
+               'value'     => 'setted value'
+            ]];
+            return new \ArrayIterator($dbresult);
+         }
+         // Other calls corresponds to call made in Config::setConfigurationValues()
+         return new \ArrayIterator();
+      };
 
       $DB = $this->db;
 

From b7e216e928853f2d9cadb5a3fbc4d5386ce137ef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9dric=20Anne?= <cedric.anne@gmail.com>
Date: Tue, 7 Jan 2020 21:23:18 +0100
Subject: [PATCH 06/10] Update dependencies that fixed issues with PHP 7.4

---
 composer.lock | 115 ++++++++++++++++++++++++++++----------------------
 1 file changed, 64 insertions(+), 51 deletions(-)

diff --git a/composer.lock b/composer.lock
index b0552ded8b..cea7521baf 100644
--- a/composer.lock
+++ b/composer.lock
@@ -162,21 +162,24 @@
         },
         {
             "name": "michelf/php-markdown",
-            "version": "1.8.0",
+            "version": "1.9.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/michelf/php-markdown.git",
-                "reference": "01ab082b355bf188d907b9929cd99b2923053495"
+                "reference": "c83178d49e372ca967d1a8c77ae4e051b3a3c75c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/michelf/php-markdown/zipball/01ab082b355bf188d907b9929cd99b2923053495",
-                "reference": "01ab082b355bf188d907b9929cd99b2923053495",
+                "url": "https://api.github.com/repos/michelf/php-markdown/zipball/c83178d49e372ca967d1a8c77ae4e051b3a3c75c",
+                "reference": "c83178d49e372ca967d1a8c77ae4e051b3a3c75c",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.0"
             },
+            "require-dev": {
+                "phpunit/phpunit": ">=4.3 <5.8"
+            },
             "type": "library",
             "autoload": {
                 "psr-4": {
@@ -204,7 +207,7 @@
             "keywords": [
                 "markdown"
             ],
-            "time": "2018-01-15T00:49:33+00:00"
+            "time": "2019-12-02T02:32:27+00:00"
         },
         {
             "name": "monolog/monolog",
@@ -642,16 +645,16 @@
         },
         {
             "name": "sabre/vobject",
-            "version": "4.2.0",
+            "version": "4.2.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sabre-io/vobject.git",
-                "reference": "bd500019764e434ff65872d426f523e7882a0739"
+                "reference": "6d7476fbd227ae285029c19ad518cd451336038c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sabre-io/vobject/zipball/bd500019764e434ff65872d426f523e7882a0739",
-                "reference": "bd500019764e434ff65872d426f523e7882a0739",
+                "url": "https://api.github.com/repos/sabre-io/vobject/zipball/6d7476fbd227ae285029c19ad518cd451336038c",
+                "reference": "6d7476fbd227ae285029c19ad518cd451336038c",
                 "shasum": ""
             },
             "require": {
@@ -734,7 +737,7 @@
                 "xCal",
                 "xCard"
             ],
-            "time": "2019-02-19T13:05:37+00:00"
+            "time": "2019-12-18T19:29:43+00:00"
         },
         {
             "name": "sabre/xml",
@@ -853,16 +856,16 @@
         },
         {
             "name": "simplepie/simplepie",
-            "version": "1.5.2",
+            "version": "1.5.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/simplepie/simplepie.git",
-                "reference": "0e8fe72132dad765d25db4cabc69a91139af1263"
+                "reference": "f4c8246511a38fc9d99a59fb42f61eeeafb31663"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/simplepie/simplepie/zipball/0e8fe72132dad765d25db4cabc69a91139af1263",
-                "reference": "0e8fe72132dad765d25db4cabc69a91139af1263",
+                "url": "https://api.github.com/repos/simplepie/simplepie/zipball/f4c8246511a38fc9d99a59fb42f61eeeafb31663",
+                "reference": "f4c8246511a38fc9d99a59fb42f61eeeafb31663",
                 "shasum": ""
             },
             "require": {
@@ -916,20 +919,20 @@
                 "feeds",
                 "rss"
             ],
-            "time": "2018-08-02T05:43:58+00:00"
+            "time": "2019-11-23T07:05:15+00:00"
         },
         {
             "name": "symfony/console",
-            "version": "v3.4.22",
+            "version": "v3.4.36",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/console.git",
-                "reference": "069bf3f0e8f871a2169a06e43d9f3f03f355e9be"
+                "reference": "1ee23b3b659b06c622f2bd2492a229e416eb4586"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/console/zipball/069bf3f0e8f871a2169a06e43d9f3f03f355e9be",
-                "reference": "069bf3f0e8f871a2169a06e43d9f3f03f355e9be",
+                "url": "https://api.github.com/repos/symfony/console/zipball/1ee23b3b659b06c622f2bd2492a229e416eb4586",
+                "reference": "1ee23b3b659b06c622f2bd2492a229e416eb4586",
                 "shasum": ""
             },
             "require": {
@@ -988,7 +991,7 @@
             ],
             "description": "Symfony Console Component",
             "homepage": "https://symfony.com",
-            "time": "2019-01-25T10:42:12+00:00"
+            "time": "2019-12-01T10:04:45+00:00"
         },
         {
             "name": "symfony/debug",
@@ -1107,16 +1110,16 @@
         },
         {
             "name": "tecnickcom/tcpdf",
-            "version": "6.2.26",
+            "version": "6.3.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/tecnickcom/TCPDF.git",
-                "reference": "367241059ca166e3a76490f4448c284e0a161f15"
+                "reference": "9fde7bb9b404b945e7ea88fb7eccd23d9a4e324b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/367241059ca166e3a76490f4448c284e0a161f15",
-                "reference": "367241059ca166e3a76490f4448c284e0a161f15",
+                "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/9fde7bb9b404b945e7ea88fb7eccd23d9a4e324b",
+                "reference": "9fde7bb9b404b945e7ea88fb7eccd23d9a4e324b",
                 "shasum": ""
             },
             "require": {
@@ -1165,7 +1168,7 @@
                 "pdf417",
                 "qrcode"
             ],
-            "time": "2018-10-16T17:24:05+00:00"
+            "time": "2019-09-20T09:35:01+00:00"
         },
         {
             "name": "true/punycode",
@@ -1294,6 +1297,7 @@
                 "psr-6",
                 "zf"
             ],
+            "abandoned": "laminas/laminas-cache",
             "time": "2018-05-01T21:58:00+00:00"
         },
         {
@@ -1348,28 +1352,33 @@
                 "events",
                 "zf2"
             ],
+            "abandoned": "laminas/laminas-eventmanager",
             "time": "2018-04-25T15:33:34+00:00"
         },
         {
             "name": "zendframework/zend-i18n",
-            "version": "2.9.0",
+            "version": "2.10.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/zendframework/zend-i18n.git",
-                "reference": "6d69af5a04e1a4de7250043cb1322f077a0cdb7f"
+                "reference": "84038e6a1838b611dcc491b1c40321fa4c3a123c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/zendframework/zend-i18n/zipball/6d69af5a04e1a4de7250043cb1322f077a0cdb7f",
-                "reference": "6d69af5a04e1a4de7250043cb1322f077a0cdb7f",
+                "url": "https://api.github.com/repos/zendframework/zend-i18n/zipball/84038e6a1838b611dcc491b1c40321fa4c3a123c",
+                "reference": "84038e6a1838b611dcc491b1c40321fa4c3a123c",
                 "shasum": ""
             },
             "require": {
+                "ext-intl": "*",
                 "php": "^5.6 || ^7.0",
                 "zendframework/zend-stdlib": "^2.7 || ^3.0"
             },
+            "conflict": {
+                "phpspec/prophecy": "<1.9.0"
+            },
             "require-dev": {
-                "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2",
+                "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.5.16",
                 "zendframework/zend-cache": "^2.6.1",
                 "zendframework/zend-coding-standard": "~1.0.0",
                 "zendframework/zend-config": "^2.6",
@@ -1380,7 +1389,6 @@
                 "zendframework/zend-view": "^2.6.3"
             },
             "suggest": {
-                "ext-intl": "Required for most features of Zend\\I18n; included in default builds of PHP",
                 "zendframework/zend-cache": "Zend\\Cache component",
                 "zendframework/zend-config": "Zend\\Config component",
                 "zendframework/zend-eventmanager": "You should install this package to use the events in the translator",
@@ -1393,8 +1401,8 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.9.x-dev",
-                    "dev-develop": "2.10.x-dev"
+                    "dev-master": "2.10.x-dev",
+                    "dev-develop": "2.11.x-dev"
                 },
                 "zf": {
                     "component": "Zend\\I18n",
@@ -1416,7 +1424,8 @@
                 "i18n",
                 "zf"
             ],
-            "time": "2018-05-16T16:39:13+00:00"
+            "abandoned": "laminas/laminas-i18n",
+            "time": "2019-12-12T14:08:22+00:00"
         },
         {
             "name": "zendframework/zend-json",
@@ -1466,6 +1475,7 @@
                 "json",
                 "zf"
             ],
+            "abandoned": "laminas/laminas-json",
             "time": "2018-01-04T17:51:34+00:00"
         },
         {
@@ -1523,6 +1533,7 @@
                 "serializer",
                 "zf"
             ],
+            "abandoned": "laminas/laminas-serializer",
             "time": "2018-05-14T18:45:18+00:00"
         },
         {
@@ -1591,6 +1602,7 @@
                 "servicemanager",
                 "zf"
             ],
+            "abandoned": "laminas/laminas-servicemanager",
             "time": "2018-12-22T06:05:09+00:00"
         },
         {
@@ -1637,6 +1649,7 @@
                 "stdlib",
                 "zf"
             ],
+            "abandoned": "laminas/laminas-stdlib",
             "time": "2018-08-28T21:34:05+00:00"
         }
     ],
@@ -1647,12 +1660,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/atoum/atoum.git",
-                "reference": "be412c0d5c01a4d9d64f7422a510b5a5a9611c9f"
+                "reference": "b6c93433a7b0b92b54c2bb9b0731d71ddc03b365"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/atoum/atoum/zipball/be412c0d5c01a4d9d64f7422a510b5a5a9611c9f",
-                "reference": "be412c0d5c01a4d9d64f7422a510b5a5a9611c9f",
+                "url": "https://api.github.com/repos/atoum/atoum/zipball/b6c93433a7b0b92b54c2bb9b0731d71ddc03b365",
+                "reference": "b6c93433a7b0b92b54c2bb9b0731d71ddc03b365",
                 "shasum": ""
             },
             "require": {
@@ -1722,7 +1735,7 @@
                 "test",
                 "unit testing"
             ],
-            "time": "2019-06-08T11:00:07+00:00"
+            "time": "2019-10-04T19:45:12+00:00"
         },
         {
             "name": "atoum/telemetry-extension",
@@ -2383,16 +2396,16 @@
         },
         {
             "name": "fzaninotto/faker",
-            "version": "v1.8.0",
+            "version": "v1.9.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/fzaninotto/Faker.git",
-                "reference": "f72816b43e74063c8b10357394b6bba8cb1c10de"
+                "reference": "fc10d778e4b84d5bd315dad194661e091d307c6f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/f72816b43e74063c8b10357394b6bba8cb1c10de",
-                "reference": "f72816b43e74063c8b10357394b6bba8cb1c10de",
+                "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/fc10d778e4b84d5bd315dad194661e091d307c6f",
+                "reference": "fc10d778e4b84d5bd315dad194661e091d307c6f",
                 "shasum": ""
             },
             "require": {
@@ -2401,12 +2414,12 @@
             "require-dev": {
                 "ext-intl": "*",
                 "phpunit/phpunit": "^4.8.35 || ^5.7",
-                "squizlabs/php_codesniffer": "^1.5"
+                "squizlabs/php_codesniffer": "^2.9.2"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.8-dev"
+                    "dev-master": "1.9-dev"
                 }
             },
             "autoload": {
@@ -2429,7 +2442,7 @@
                 "faker",
                 "fixtures"
             ],
-            "time": "2018-07-12T10:23:15+00:00"
+            "time": "2019-12-12T13:22:17+00:00"
         },
         {
             "name": "glpi-project/coding-standard",
@@ -2861,23 +2874,23 @@
         },
         {
             "name": "mikey179/vfsstream",
-            "version": "v1.6.5",
+            "version": "v1.6.8",
             "source": {
                 "type": "git",
                 "url": "https://github.com/bovigo/vfsStream.git",
-                "reference": "d5fec95f541d4d71c4823bb5e30cf9b9e5b96145"
+                "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/d5fec95f541d4d71c4823bb5e30cf9b9e5b96145",
-                "reference": "d5fec95f541d4d71c4823bb5e30cf9b9e5b96145",
+                "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/231c73783ebb7dd9ec77916c10037eff5a2b6efe",
+                "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "~4.5"
+                "phpunit/phpunit": "^4.5|^5.0"
             },
             "type": "library",
             "extra": {
@@ -2903,7 +2916,7 @@
             ],
             "description": "Virtual file system to mock the real file system in unit tests.",
             "homepage": "http://vfs.bovigo.org/",
-            "time": "2017-08-01T08:02:14+00:00"
+            "time": "2019-10-30T15:31:00+00:00"
         },
         {
             "name": "natxet/CssMin",

From 4ff0c081d9d3388ac39e89c8531d4c1fd74472c6 Mon Sep 17 00:00:00 2001
From: Johan Cwiklinski <jcwiklinski@teclib.com>
Date: Thu, 21 Nov 2019 10:33:19 +0100
Subject: [PATCH 07/10] ldap_control_paged* are deprecated in PHP 7.4 (#6570)

---
 inc/authldap.class.php | 84 +++++++++++++++++++++++++++++++++---------
 1 file changed, 66 insertions(+), 18 deletions(-)

diff --git a/inc/authldap.class.php b/inc/authldap.class.php
index ede72d82b1..10f58b0efb 100644
--- a/inc/authldap.class.php
+++ b/inc/authldap.class.php
@@ -1654,18 +1654,45 @@ static function searchForUsers($ds, $values, $filter, $attrs, &$limitexceeded, &
       $count    = 0;  //Store the number of results ldap_search
 
       do {
+         $filter = Toolbox::unclean_cross_side_scripting_deep(Toolbox::stripslashes_deep($filter));
          if (self::isLdapPageSizeAvailable($config_ldap)) {
-            ldap_control_paged_result($ds, $config_ldap->fields['pagesize'], true, $cookie);
+            if (version_compare(PHP_VERSION, '7.3') < 0) {
+               //prior to PHP 7.3, use ldap_control_paged_result
+               ldap_control_paged_result($ds, $config_ldap->fields['pagesize'], true, $cookie);
+               $sr = @ldap_search($ds, $values['basedn'], $filter, $attrs);
+            } else {
+               //since PHP 7.3, send serverctrls to ldap_search
+               $controls = [
+                  [
+                     'oid'       =>LDAP_CONTROL_PAGEDRESULTS,
+                     'iscritical' => true,
+                     'value'     => [
+                        'size'   => $config_ldap->fields['pagesize'],
+                        'cookie' => $cookie
+                     ]
+                  ]
+               ];
+               $sr = @ldap_search($ds, $values['basedn'], $filter, $attrs, 0, -1, -1, LDAP_DEREF_NEVER, $controls);
+               ldap_parse_result($ds, $sr, $errcode, $matcheddn, $errmsg, $referrals, $controls);
+               if (isset($controls[LDAP_CONTROL_PAGEDRESULTS]['value']['cookie'])) {
+                  $cookie = $controls[LDAP_CONTROL_PAGEDRESULTS]['value']['cookie'];
+               } else {
+                  $cookie = '';
+               }
+            }
+         } else {
+            $sr = @ldap_search($ds, $values['basedn'], $filter, $attrs);
          }
-         $filter = Toolbox::unclean_cross_side_scripting_deep(Toolbox::stripslashes_deep($filter));
-         $sr     = @ldap_search($ds, $values['basedn'], $filter, $attrs);
+
          if ($sr) {
             if (in_array(ldap_errno($ds), [4,11])) {
                // openldap return 4 for Size limit exceeded
                $limitexceeded = true;
             }
+
             $info = self::get_entries_clean($ds, $sr);
             if (in_array(ldap_errno($ds), [4,11])) {
+               // openldap return 4 for Size limit exceeded
                $limitexceeded = true;
             }
 
@@ -1718,7 +1745,7 @@ static function searchForUsers($ds, $values, $filter, $attrs, &$limitexceeded, &
          } else {
             return false;
          }
-         if (self::isLdapPageSizeAvailable($config_ldap)) {
+         if (self::isLdapPageSizeAvailable($config_ldap) && version_compare(PHP_VERSION, '7.3') < 0) {
             ldap_control_paged_result_response($ds, $sr, $cookie);
          }
 
@@ -2208,25 +2235,48 @@ static function getGroupsFromLDAP($ldap_connection, $config_ldap, $filter,
       $cookie = '';
       $count  = 0;
       do {
+         $filter = Toolbox::unclean_cross_side_scripting_deep(Toolbox::stripslashes_deep($filter));
          if (self::isLdapPageSizeAvailable($config_ldap)) {
-            ldap_control_paged_result($ldap_connection, $config_ldap->fields['pagesize'],
-                                      true, $cookie);
+            if (version_compare(PHP_VERSION, '7.3') < 0) {
+               //prior to PHP 7.3, use ldap_control_paged_result
+               ldap_control_paged_result($ldap_connection, $config_ldap->fields['pagesize'], true, $cookie);
+               $sr = @ldap_search($ldap_connection, $config_ldap->fields['basedn'], $filter, $attrs);
+            } else {
+               //since PHP 7.3, send serverctrls to ldap_search
+               $controls = [
+                  [
+                     'oid'       =>LDAP_CONTROL_PAGEDRESULTS,
+                     'iscritical' => true,
+                     'value'     => [
+                        'size'   => $config_ldap->fields['pagesize'],
+                        'cookie' => $cookie
+                     ]
+                  ]
+               ];
+               $sr = @ldap_search($ldap_connection, $config_ldap->fields['basedn'], $filter, $attrs, 0, -1, -1, LDAP_DEREF_NEVER, $controls);
+               ldap_parse_result($ldap_connection, $sr, $errcode, $matcheddn, $errmsg, $referrals, $controls);
+               if (isset($controls[LDAP_CONTROL_PAGEDRESULTS]['value']['cookie'])) {
+                  $cookie = $controls[LDAP_CONTROL_PAGEDRESULTS]['value']['cookie'];
+               } else {
+                  $cookie = '';
+               }
+            }
+         } else {
+            $sr = @ldap_search($ldap_connection, $config_ldap->fields['basedn'], $filter, $attrs);
          }
 
-         $filter = Toolbox::unclean_cross_side_scripting_deep($filter);
-         $sr     = @ldap_search($ldap_connection, $config_ldap->fields['basedn'], $filter,
-                                $attrs);
-
          if ($sr) {
             if (in_array(ldap_errno($ldap_connection), [4,11])) {
                // openldap return 4 for Size limit exceeded
                $limitexceeded = true;
             }
+
             $infos  = self::get_entries_clean($ldap_connection, $sr);
             if (in_array(ldap_errno($ldap_connection), [4,11])) {
                // openldap return 4 for Size limit exceeded
                $limitexceeded = true;
             }
+
             $count += $infos['count'];
             //If page results are enabled and the number of results is greater than the maximum allowed
             //warn user that limit is exceeded and stop search
@@ -2286,7 +2336,7 @@ static function getGroupsFromLDAP($ldap_connection, $config_ldap, $filter,
                }
             }
          }
-         if (self::isLdapPageSizeAvailable($config_ldap)) {
+         if (self::isLdapPageSizeAvailable($config_ldap) && version_compare(PHP_VERSION, '7.3') < 0) {
             ldap_control_paged_result_response($ldap_connection, $sr, $cookie);
          }
       } while (($cookie !== null) && ($cookie != ''));
@@ -3189,7 +3239,7 @@ static function showUserImportForm(AuthLDAP $authldap) {
                     "<td colspan='3'>";
                Entity::dropdown(['value'       => $_SESSION['ldap_import']['entities_id'],
                                       'entity'      => $_SESSION['glpiactiveentities'],
-                                      'on_change'    => 'submit()']);
+                                      'on_change'    => 'this.form.submit()']);
                echo "</td></tr>";
             } else {
                //Only one entity is active, store it
@@ -3666,16 +3716,14 @@ static function getAllReplicateForAMaster($master_id) {
     *
     * @since 0.84
     *
-    * @param object  $config_ldap        LDAP configuration
-    * @param boolean $check_config_value Whether to check config values
+    * @param object   $config_ldap        LDAP configuration
+    * @param boolean  $check_config_value Whether to check config values
     *
     * @return boolean true if maxPageSize can be used, false otherwise
     */
    static function isLdapPageSizeAvailable($config_ldap, $check_config_value = true) {
-      return ((!$check_config_value
-               || ($check_config_value && $config_ldap->fields['can_support_pagesize']))
-                  && function_exists('ldap_control_paged_result')
-                     && function_exists('ldap_control_paged_result_response'));
+      return (extension_loaded('ldap') && (!$check_config_value
+         || ($check_config_value && $config_ldap->fields['can_support_pagesize'])));
    }
 
    /**

From efc9a72fa17d738def91444233475dda57c533cc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9dric=20Anne?= <cedric.anne@gmail.com>
Date: Tue, 7 Jan 2020 21:41:39 +0100
Subject: [PATCH 08/10] Update blueimp-file-upload PHP handler

---
 .../server/php/UploadHandler.php              | 126 +++++++++---------
 1 file changed, 66 insertions(+), 60 deletions(-)

diff --git a/lib/jqueryplugins/jquery-file-upload/server/php/UploadHandler.php b/lib/jqueryplugins/jquery-file-upload/server/php/UploadHandler.php
index 5215e4c0fe..62f65a51f4 100755
--- a/lib/jqueryplugins/jquery-file-upload/server/php/UploadHandler.php
+++ b/lib/jqueryplugins/jquery-file-upload/server/php/UploadHandler.php
@@ -16,7 +16,7 @@ class UploadHandler
     protected $options;
 
     // PHP File Upload error message codes:
-    // http://php.net/manual/en/features.file-upload.errors.php
+    // https://php.net/manual/en/features.file-upload.errors.php
     protected $error_messages = array(
         1 => 'The uploaded file exceeds the upload_max_filesize directive in php.ini',
         2 => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form',
@@ -43,9 +43,9 @@ class UploadHandler
     const IMAGETYPE_PNG = 3;
 
     protected $image_objects = array();
+    protected $response = array();
 
     public function __construct($options = null, $initialize = true, $error_messages = null) {
-        $this->response = array();
         $this->options = array(
             'script_url' => $this->get_full_url().'/'.$this->basename($this->get_server_var('SCRIPT_NAME')),
             'upload_dir' => dirname($this->get_server_var('SCRIPT_FILENAME')).'/files/',
@@ -75,12 +75,12 @@ public function __construct($options = null, $initialize = true, $error_messages
             ),
             // By default, allow redirects to the referer protocol+host:
             'redirect_allow_target' => '/^'.preg_quote(
-              parse_url($this->get_server_var('HTTP_REFERER'), PHP_URL_SCHEME)
-                .'://'
-                .parse_url($this->get_server_var('HTTP_REFERER'), PHP_URL_HOST)
-                .'/', // Trailing slash to not match subdomains by mistake
-              '/' // preg_quote delimiter param
-            ).'/',
+                    parse_url($this->get_server_var('HTTP_REFERER'), PHP_URL_SCHEME)
+                    .'://'
+                    .parse_url($this->get_server_var('HTTP_REFERER'), PHP_URL_HOST)
+                    .'/', // Trailing slash to not match subdomains by mistake
+                    '/' // preg_quote delimiter param
+                ).'/',
             // Enable to provide file downloads via GET requests to the PHP script:
             //     1. Set to 1 to download files via readfile method through PHP
             //     2. Set to 2 to send a X-Sendfile header for lighttpd/Apache
@@ -151,21 +151,21 @@ public function __construct($options = null, $initialize = true, $error_messages
             'identify_bin' => 'identify',
             'image_versions' => array(
                 // The empty image version key defines options for the original image.
-                // Keep in mind: these image manipulations are inherited by all other image versions from this point onwards. 
+                // Keep in mind: these image manipulations are inherited by all other image versions from this point onwards.
                 // Also note that the property 'no_cache' is not inherited, since it's not a manipulation.
                 '' => array(
                     // Automatically rotate images based on EXIF meta data:
                     'auto_orient' => true
                 ),
                 // You can add arrays to generate different versions.
-                // The name of the key is the name of the version (example: 'medium'). 
+                // The name of the key is the name of the version (example: 'medium').
                 // the array contains the options to apply.
                 /*
                 'medium' => array(
                     'max_width' => 800,
                     'max_height' => 600
                 ),
-		        */
+                */
                 'thumbnail' => array(
                     // Uncomment the following to use a defined directory for the thumbnails
                     // instead of a subdirectory based on the version identifier.
@@ -223,13 +223,13 @@ protected function initialize() {
     protected function get_full_url() {
         $https = !empty($_SERVER['HTTPS']) && strcasecmp($_SERVER['HTTPS'], 'on') === 0 ||
             !empty($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
-                strcasecmp($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') === 0;
+            strcasecmp($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') === 0;
         return
             ($https ? 'https://' : 'http://').
             (!empty($_SERVER['REMOTE_USER']) ? $_SERVER['REMOTE_USER'].'@' : '').
             (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ($_SERVER['SERVER_NAME'].
-            ($https && $_SERVER['SERVER_PORT'] === 443 ||
-            $_SERVER['SERVER_PORT'] === 80 ? '' : ':'.$_SERVER['SERVER_PORT']))).
+                ($https && $_SERVER['SERVER_PORT'] === 443 ||
+                $_SERVER['SERVER_PORT'] === 80 ? '' : ':'.$_SERVER['SERVER_PORT']))).
             substr($_SERVER['SCRIPT_NAME'],0, strrpos($_SERVER['SCRIPT_NAME'], '/'));
     }
 
@@ -324,7 +324,7 @@ protected function get_file_size($file_path, $clear_stat_cache = false) {
 
     protected function is_valid_file_object($file_name) {
         $file_path = $this->get_upload_path($file_name);
-        if (is_file($file_path) && $file_name[0] !== '.') {
+        if (strlen($file_name) > 0 && $file_name[0] !== '.' && is_file($file_path)) {
             return true;
         }
         return false;
@@ -377,7 +377,11 @@ protected function get_error_message($error) {
     public function get_config_bytes($val) {
         $val = trim($val);
         $last = strtolower($val[strlen($val)-1]);
-        $val = (int)$val;
+        if (is_numeric($val)) {
+            $val = (int)$val;
+        } else {
+            $val = (int)substr($val, 0, -1);
+        }
         switch ($last) {
             case 'g':
                 $val *= 1024;
@@ -414,7 +418,7 @@ protected function validate($uploaded_file, $file, $error, $index) {
         if ($this->options['max_file_size'] && (
                 $file_size > $this->options['max_file_size'] ||
                 $file->size > $this->options['max_file_size'])
-            ) {
+        ) {
             $file->error = $this->get_error_message('max_file_size');
             return false;
         }
@@ -424,9 +428,9 @@ protected function validate($uploaded_file, $file, $error, $index) {
             return false;
         }
         if (is_int($this->options['max_number_of_files']) &&
-                ($this->count_file_objects() >= $this->options['max_number_of_files']) &&
-                // Ignore additional chunks of existing files:
-                !is_file($this->get_upload_path($file->name))) {
+            ($this->count_file_objects() >= $this->options['max_number_of_files']) &&
+            // Ignore additional chunks of existing files:
+            !is_file($this->get_upload_path($file->name))) {
             $file->error = $this->get_error_message('max_number_of_files');
             return false;
         }
@@ -451,7 +455,7 @@ function_exists('exif_read_data') &&
                 unset($tmp);
             }
         }
-        if (!empty($img_width)) {
+        if (!empty($img_width) && !empty($img_height)) {
             if ($max_width && $img_width > $max_width) {
                 $file->error = $this->get_error_message('max_width');
                 return false;
@@ -488,12 +492,12 @@ protected function upcount_name($name) {
     }
 
     protected function get_unique_filename($file_path, $name, $size, $type, $error,
-            $index, $content_range) {
+        $index, $content_range) {
         while(is_dir($this->get_upload_path($name))) {
             $name = $this->upcount_name($name);
         }
         // Keep an existing filename if this is part of a chunked upload:
-        $uploaded_bytes = $this->fix_integer_overflow((int)$content_range[1]);
+        $uploaded_bytes = $this->fix_integer_overflow((int)@$content_range[1]);
         while (is_file($this->get_upload_path($name))) {
             if ($uploaded_bytes === $this->get_file_size(
                     $this->get_upload_path($name))) {
@@ -505,10 +509,10 @@ protected function get_unique_filename($file_path, $name, $size, $type, $error,
     }
 
     protected function fix_file_extension($file_path, $name, $size, $type, $error,
-            $index, $content_range) {
+        $index, $content_range) {
         // Add missing file extension for known image types:
         if (strpos($name, '.') === false &&
-                preg_match('/^image\/(gif|jpe?g|png)/', $type, $matches)) {
+            preg_match('/^image\/(gif|jpe?g|png)/', $type, $matches)) {
             $name .= '.'.$matches[1];
         }
         if ($this->options['correct_image_extensions']) {
@@ -538,7 +542,7 @@ protected function fix_file_extension($file_path, $name, $size, $type, $error,
     }
 
     protected function trim_file_name($file_path, $name, $size, $type, $error,
-            $index, $content_range) {
+        $index, $content_range) {
         // Remove path information and dots around the filename, to prevent uploading
         // into different directories or replacing hidden system files.
         // Also remove control characters and spaces (\x00..\x20) around the filename:
@@ -561,7 +565,7 @@ protected function trim_file_name($file_path, $name, $size, $type, $error,
     }
 
     protected function get_file_name($file_path, $name, $size, $type, $error,
-            $index, $content_range) {
+        $index, $content_range) {
         $name = $this->trim_file_name($file_path, $name, $size, $type, $error,
             $index, $content_range);
         return $this->get_unique_filename(
@@ -795,25 +799,26 @@ protected function gd_create_scaled_image($file_name, $version, $options) {
         // Handle transparency in GIF and PNG images:
         switch ($type) {
             case 'gif':
-            case 'png':
                 imagecolortransparent($new_img, imagecolorallocate($new_img, 0, 0, 0));
+                break;
             case 'png':
+                imagecolortransparent($new_img, imagecolorallocate($new_img, 0, 0, 0));
                 imagealphablending($new_img, false);
                 imagesavealpha($new_img, true);
                 break;
         }
         $success = imagecopyresampled(
-            $new_img,
-            $src_img,
-            $dst_x,
-            $dst_y,
-            0,
-            0,
-            $new_width,
-            $new_height,
-            $img_width,
-            $img_height
-        ) && $write_func($new_img, $new_file_path, $image_quality);
+                $new_img,
+                $src_img,
+                $dst_x,
+                $dst_y,
+                0,
+                0,
+                $new_width,
+                $new_height,
+                $img_width,
+                $img_height
+            ) && $write_func($new_img, $new_file_path, $image_quality);
         $this->gd_set_image_object($file_path, $new_img);
         return $success;
     }
@@ -827,7 +832,12 @@ protected function imagick_get_image_object($file_path, $no_cache = false) {
                     $image->setResourceLimit($type, $limit);
                 }
             }
-            $image->readImage($file_path);
+            try {
+                $image->readImage($file_path);
+            } catch (ImagickException $e) {
+                error_log($e->getMessage());
+                return null;
+            }
             $this->image_objects[$file_path] = $image;
         }
         return $this->image_objects[$file_path];
@@ -884,6 +894,7 @@ protected function imagick_create_scaled_image($file_name, $version, $options) {
             $file_path,
             !empty($options['crop']) || !empty($options['no_cache'])
         );
+        if (is_null($image)) return false;
         if ($image->getImageFormat() === 'GIF') {
             // Handle animated GIFs:
             $images = $image->coalesceImages();
@@ -896,32 +907,28 @@ protected function imagick_create_scaled_image($file_name, $version, $options) {
         $image_oriented = false;
         if (!empty($options['auto_orient'])) {
             $image_oriented = $this->imagick_orient_image($image);
-        } 
-	    
-        $image_resize = false; 
+        }
+        $image_resize = false;
         $new_width = $max_width = $img_width = $image->getImageWidth();
-        $new_height = $max_height = $img_height = $image->getImageHeight(); 
-		  
+        $new_height = $max_height = $img_height = $image->getImageHeight();
         // use isset(). User might be setting max_width = 0 (auto in regular resizing). Value 0 would be considered empty when you use empty()
         if (isset($options['max_width'])) {
-            $image_resize = true; 
-            $new_width = $max_width = $options['max_width']; 
+            $image_resize = true;
+            $new_width = $max_width = $options['max_width'];
         }
         if (isset($options['max_height'])) {
             $image_resize = true;
             $new_height = $max_height = $options['max_height'];
         }
-        
         $image_strip = (isset($options['strip']) ? $options['strip'] : false);
- 
-        if ( !$image_oriented && ($max_width >= $img_width) && ($max_height >= $img_height) && !$image_strip && empty($options["jpeg_quality"]) ) {        
+        if ( !$image_oriented && ($max_width >= $img_width) && ($max_height >= $img_height) && !$image_strip && empty($options["jpeg_quality"]) ) {
             if ($file_path !== $new_file_path) {
                 return copy($file_path, $new_file_path);
             }
             return true;
         }
         $crop = (isset($options['crop']) ? $options['crop'] : false);
-        
+
         if ($crop) {
             $x = 0;
             $y = 0;
@@ -1111,14 +1118,14 @@ protected function handle_image_file($file_path, $file) {
         }
         if (count($failed_versions)) {
             $file->error = $this->get_error_message('image_resize')
-                    .' ('.implode($failed_versions, ', ').')';
+                .' ('.implode(', ', $failed_versions).')';
         }
         // Free memory:
         $this->destroy_image_object($file_path);
     }
 
     protected function handle_file_upload($uploaded_file, $name, $size, $type, $error,
-            $index = null, $content_range = null) {
+        $index = null, $content_range = null) {
         $file = new \stdClass();
         $file->name = $this->get_file_name($uploaded_file, $name, $size, $type, $error,
             $index, $content_range);
@@ -1319,8 +1326,7 @@ public function generate_response($content, $print_response = true) {
             $json = json_encode($content);
             $redirect = stripslashes($this->get_post_param('redirect'));
             if ($redirect && preg_match($this->options['redirect_allow_target'], $redirect)) {
-                $this->header('Location: '.sprintf($redirect, rawurlencode($json)));
-                return;
+                return $this->header('Location: '.sprintf($redirect, rawurlencode($json)));
             }
             $this->head();
             if ($this->get_server_var('HTTP_CONTENT_RANGE')) {
@@ -1388,7 +1394,7 @@ public function post($print_response = true) {
         $content_range_header = $this->get_server_var('HTTP_CONTENT_RANGE');
         $content_range = $content_range_header ?
             preg_split('/[^0-9]+/', $content_range_header) : null;
-        $size =  $content_range ? $content_range[3] : null;
+        $size =  @$content_range[3];
         $files = array();
         if ($upload) {
             if (is_array($upload['tmp_name'])) {
@@ -1411,11 +1417,11 @@ public function post($print_response = true) {
                 $files[] = $this->handle_file_upload(
                     isset($upload['tmp_name']) ? $upload['tmp_name'] : null,
                     $file_name ? $file_name : (isset($upload['name']) ?
-                            $upload['name'] : null),
+                        $upload['name'] : null),
                     $size ? $size : (isset($upload['size']) ?
-                            $upload['size'] : $this->get_server_var('CONTENT_LENGTH')),
+                        $upload['size'] : $this->get_server_var('CONTENT_LENGTH')),
                     isset($upload['type']) ?
-                            $upload['type'] : $this->get_server_var('CONTENT_TYPE'),
+                        $upload['type'] : $this->get_server_var('CONTENT_TYPE'),
                     isset($upload['error']) ? $upload['error'] : null,
                     null,
                     $content_range
@@ -1434,7 +1440,7 @@ public function delete($print_response = true) {
         $response = array();
         foreach ($file_names as $file_name) {
             $file_path = $this->get_upload_path($file_name);
-            $success = is_file($file_path) && $file_name[0] !== '.' && unlink($file_path);
+            $success = strlen($file_name) > 0 && $file_name[0] !== '.' && is_file($file_path) && unlink($file_path);
             if ($success) {
                 foreach ($this->options['image_versions'] as $version => $options) {
                     if (!empty($version)) {

From 53627ec1e7e11e7a38bcdc1273ec9ddd6ab591b7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9dric=20Anne?= <cedric.anne@gmail.com>
Date: Tue, 7 Jan 2020 21:47:38 +0100
Subject: [PATCH 09/10] Fix travis configuration

---
 .travis.yml | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 1d5491bab5..02c470e615 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,16 +1,15 @@
 language: php
 sudo: required
-dist: trusty
 
-env:
-  - DB=mysql
+services:
+  - mysql
 
 before_script:
   - phpenv config-rm xdebug.ini || true
   - ./tests/LDAP/ldap_run.sh
   - composer self-update
-  - sed -e '/"php":/d' -i composer.json
   - rm -f composer.lock
+  - composer config --unset platform
   - composer install --optimize-autoloader
   - mysql -u root -e 'create database glpitest;'
   - bin/console glpi:database:install --config-dir=./tests --no-interaction --db-name=glpitest --db-user=root
@@ -20,10 +19,10 @@ script:
   - mysql -u root -e 'select version();'
   - composer testldap
 
-#note: default maria version is 5.5 for all main php versions list exept nightly
 matrix:
   include:
     - php: 5.6
+      dist: trusty
       addons:
         apt:
           packages:
@@ -32,8 +31,8 @@ matrix:
         hosts:
           - openldap
     - php: 7.0
+      dist: xenial
       addons:
-        mariadb: 10.2
         apt:
           packages:
             - ldap-utils
@@ -41,8 +40,8 @@ matrix:
         hosts:
           - openldap
     - php: 7.1
+      dist: xenial
       addons:
-        mariadb: 10.1
         apt:
           packages:
             - ldap-utils
@@ -50,6 +49,7 @@ matrix:
         hosts:
           - openldap
     - php: 7.2
+      dist: bionic
       addons:
         apt:
           packages:
@@ -58,6 +58,7 @@ matrix:
         hosts:
           - openldap
     - php: 7.3
+      dist: bionic
       addons:
         apt:
           packages:
@@ -66,6 +67,7 @@ matrix:
         hosts:
           - openldap
     - php: 7.4
+      dist: bionic
       addons:
         apt:
           packages:
@@ -74,6 +76,7 @@ matrix:
         hosts:
           - openldap
     - php: nightly
+      dist: bionic
       addons:
         apt:
           packages:

From 0cc11eef00dc1ff7f2fe6988ff1fb471479e9a8a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9dric=20Anne?= <cedric.anne@gmail.com>
Date: Thu, 3 Oct 2019 13:51:54 +0200
Subject: [PATCH 10/10] Fix 'Trying to access array offset on value of type
 bool' on LDAP sync

---
 inc/authldap.class.php | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/inc/authldap.class.php b/inc/authldap.class.php
index 10f58b0efb..245b6519ae 100644
--- a/inc/authldap.class.php
+++ b/inc/authldap.class.php
@@ -2490,12 +2490,13 @@ static function ldapImportUserByServerId(array $params, $action, $ldap_server,
 
          try {
             $infos = self::searchUserDn($ds, $attribs);
-            $login   = self::getFieldValue($infos, $search_parameters['fields'][$search_parameters['method']]);
 
             if ($infos && $infos['dn']) {
                $user_dn = $infos['dn'];
                $user    = new User();
 
+               $login   = self::getFieldValue($infos, $search_parameters['fields'][$search_parameters['method']]);
+
                //Get information from LDAP
                if ($user->getFromLDAP($ds, $config_ldap->fields, $user_dn, addslashes($login),
                                     ($action == self::ACTION_IMPORT))) {