diff --git a/.github/workflows/mutation-tests.yml b/.github/workflows/mutation-tests.yml index 9fcfd6793d..0047a065b2 100644 --- a/.github/workflows/mutation-tests.yml +++ b/.github/workflows/mutation-tests.yml @@ -13,6 +13,7 @@ on: - master paths: - '*/classes/**.php' + workflow_dispatch: schedule: - cron: '0 0 * * *' @@ -52,7 +53,6 @@ jobs: with: php-version: ${{ matrix.php-version }} coverage: pcov - ini-values: memory_limit=-1 tools: composer:v2, infection - name: Install Composer dependencies @@ -70,8 +70,7 @@ jobs: --logger-github --ignore-msi-with-no-mutations --only-covered --no-interaction --no-progress - name: Run Infection for all files - if: github.event_name == 'schedule' - timeout-minutes: 360 + if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' env: INFECTION_BADGE_API_KEY: ${{ secrets.INFECTION_BADGE_API_KEY }} - run: infection --threads=max --no-interaction --no-progress --only-covering-test-cases + run: infection --threads=max --no-interaction --log-verbosity=none --logger-github=false diff --git a/.gitignore b/.gitignore index d6df2f224c..e5ecf31b2e 100644 --- a/.gitignore +++ b/.gitignore @@ -60,8 +60,7 @@ composer.lock /node_modules/ phpstan.neon # Infection -infection.json -infection.log +infection.json5 /public/build/ /js/dist/ /setup/ diff --git a/infection.json.dist b/infection.json5.dist similarity index 86% rename from infection.json.dist rename to infection.json5.dist index e48567f45b..eedf933bc2 100644 --- a/infection.json.dist +++ b/infection.json5.dist @@ -13,6 +13,6 @@ "mutators": { "@default": true }, - "minMsi": 33, - "minCoveredMsi": 59 + "minMsi": 29, + "minCoveredMsi": 51 } diff --git a/libraries/classes/Bookmark.php b/libraries/classes/Bookmark.php index 95b68c52eb..048b7a219c 100644 --- a/libraries/classes/Bookmark.php +++ b/libraries/classes/Bookmark.php @@ -228,6 +228,8 @@ class Bookmark * @param string|false $db the current database name or false * * @return Bookmark[] the bookmarks list + * + * @infection-ignore-all */ public static function getList( BookmarkFeature $bookmarkFeature, diff --git a/libraries/classes/Command/TwigLintCommand.php b/libraries/classes/Command/TwigLintCommand.php index 8d00248ed8..6476b95acd 100644 --- a/libraries/classes/Command/TwigLintCommand.php +++ b/libraries/classes/Command/TwigLintCommand.php @@ -78,6 +78,7 @@ class TwigLintCommand extends Command $foundFiles = []; + /** @infection-ignore-all */ while (($file = readdir($handle)) !== false) { if ($file === '.' || $file === '..') { continue; @@ -262,6 +263,7 @@ class TwigLintCommand extends Command $result = []; while ($position < $max) { $result[$position + 1] = $lines[$position]; + /** @infection-ignore-all */ ++$position; } diff --git a/libraries/classes/Config/ConfigFile.php b/libraries/classes/Config/ConfigFile.php index 3f79eacbf9..3b614631aa 100644 --- a/libraries/classes/Config/ConfigFile.php +++ b/libraries/classes/Config/ConfigFile.php @@ -430,6 +430,7 @@ class ConfigFile $lastServer = $this->getServerCount(); + /** @infection-ignore-all */ for ($i = $server; $i < $lastServer; $i++) { $_SESSION[$this->id]['Servers'][$i] = $_SESSION[$this->id]['Servers'][$i + 1]; } diff --git a/libraries/classes/Config/ServerConfigChecks.php b/libraries/classes/Config/ServerConfigChecks.php index d9a73eed17..a033998e80 100644 --- a/libraries/classes/Config/ServerConfigChecks.php +++ b/libraries/classes/Config/ServerConfigChecks.php @@ -120,6 +120,7 @@ class ServerConfigChecks $serverCnt = $this->cfg->getServerCount(); $isCookieAuthUsed = 0; + /** @infection-ignore-all */ for ($i = 1; $i <= $serverCnt; $i++) { $cookieAuthServer = ($this->cfg->getValue('Servers/' . $i . '/auth_type') === 'cookie'); $isCookieAuthUsed |= (int) $cookieAuthServer; diff --git a/libraries/classes/Config/Settings/Server.php b/libraries/classes/Config/Settings/Server.php index aeeae6a935..f5d79c8907 100644 --- a/libraries/classes/Config/Settings/Server.php +++ b/libraries/classes/Config/Settings/Server.php @@ -1247,6 +1247,7 @@ final class Server */ private function setAuthType(array $server): string { + /** @infection-ignore-all */ if (isset($server['auth_type']) && in_array($server['auth_type'], ['config', 'http', 'signon'], true)) { return $server['auth_type']; } diff --git a/libraries/classes/ConfigStorage/Relation.php b/libraries/classes/ConfigStorage/Relation.php index ab64d457a2..3dbec0741f 100644 --- a/libraries/classes/ConfigStorage/Relation.php +++ b/libraries/classes/ConfigStorage/Relation.php @@ -379,6 +379,7 @@ class Relation ); $this->dbi->tryMultiQuery($query, Connection::TYPE_CONTROL); // skips result sets of query as we are not interested in it + /** @infection-ignore-all */ do { $hasResult = ( $this->dbi->moreResults(Connection::TYPE_CONTROL) diff --git a/libraries/classes/Controllers/Table/Structure/SaveController.php b/libraries/classes/Controllers/Table/Structure/SaveController.php index eaa4d5d624..a789fad59f 100644 --- a/libraries/classes/Controllers/Table/Structure/SaveController.php +++ b/libraries/classes/Controllers/Table/Structure/SaveController.php @@ -157,6 +157,7 @@ final class SaveController extends AbstractController $changedToBlob = []; // While changing the Column Collation // First change to BLOB + /** @infection-ignore-all */ for ($i = 0; $i < $fieldCnt; $i++) { if ( isset($_POST['field_collation'][$i], $_POST['field_collation_orig'][$i]) diff --git a/libraries/classes/Controllers/Table/ZoomSearchController.php b/libraries/classes/Controllers/Table/ZoomSearchController.php index 375ba4a977..b9bfb12e24 100644 --- a/libraries/classes/Controllers/Table/ZoomSearchController.php +++ b/libraries/classes/Controllers/Table/ZoomSearchController.php @@ -214,6 +214,7 @@ class ZoomSearchController extends AbstractController $criteriaColumnNames = $_POST['criteriaColumnNames'] ?? null; $keys = []; + /** @infection-ignore-all */ for ($i = 0; $i < 4; $i++) { if (! isset($criteriaColumnNames[$i])) { continue; diff --git a/libraries/classes/Core.php b/libraries/classes/Core.php index 77ed9e173f..defd39b246 100644 --- a/libraries/classes/Core.php +++ b/libraries/classes/Core.php @@ -474,6 +474,7 @@ class Core } // remove empty nested arrays + /** @infection-ignore-all */ for (; $depth >= 0; $depth--) { if (isset($path[$depth + 1]) && count($path[$depth + 1]) !== 0) { break; @@ -700,6 +701,7 @@ class Core public static function sanitizeMySQLHost(string $name): string { while (strtolower(substr($name, 0, 2)) === 'p:') { + /** @infection-ignore-all */ $name = substr($name, 2); } diff --git a/libraries/classes/Display/Results.php b/libraries/classes/Display/Results.php index 1c46154c58..1d6bb7d877 100644 --- a/libraries/classes/Display/Results.php +++ b/libraries/classes/Display/Results.php @@ -513,6 +513,7 @@ class Results $deleteLink = $displayParts->deleteLink; $hasPrintLink = $displayParts->hasPrintLink; + /** @infection-ignore-all */ for ($i = 0; $i < $numberOfColumns; $i++) { $isLink = $hasEditLink || $deleteLink !== DeleteLinkEnum::NO_DELETE || $displayParts->hasSortLink; @@ -2159,6 +2160,7 @@ class Results $added = []; $relationParameters = $this->relation->getRelationParameters(); + /** @infection-ignore-all */ for ($currentColumn = 0; $currentColumn < $this->properties['fields_cnt']; ++$currentColumn) { $meta = $fieldsMeta[$currentColumn]; $orgFullTableName = $this->properties['db'] . '.' . $meta->orgtable; diff --git a/libraries/classes/Error.php b/libraries/classes/Error.php index f55ced6b06..425041bf36 100644 --- a/libraries/classes/Error.php +++ b/libraries/classes/Error.php @@ -408,6 +408,8 @@ class Error extends Message * * @param mixed $arg argument to process * @param string $function function name + * + * @infection-ignore-all */ public static function getArg(mixed $arg, string $function): string { @@ -499,6 +501,7 @@ class Error extends Message $destParts = explode(DIRECTORY_SEPARATOR, $dest); $result = '.'; + /** @infection-ignore-all */ while (implode(DIRECTORY_SEPARATOR, $destParts) !== implode(DIRECTORY_SEPARATOR, $hereParts)) { if (count($hereParts) > count($destParts)) { array_pop($hereParts); diff --git a/libraries/classes/Gis/GisGeometryCollection.php b/libraries/classes/Gis/GisGeometryCollection.php index cfdde03a61..fdc7738f33 100644 --- a/libraries/classes/Gis/GisGeometryCollection.php +++ b/libraries/classes/Gis/GisGeometryCollection.php @@ -277,6 +277,7 @@ class GisGeometryCollection extends GisGeometry { $geomCount = $gisData['GEOMETRYCOLLECTION']['geom_count'] ?? 1; $wkt = 'GEOMETRYCOLLECTION('; + /** @infection-ignore-all */ for ($i = 0; $i < $geomCount; $i++) { if (! isset($gisData[$i]['gis_type'])) { continue; diff --git a/libraries/classes/Gis/GisLineString.php b/libraries/classes/Gis/GisLineString.php index 1269478cc1..ccd6354cb9 100644 --- a/libraries/classes/Gis/GisLineString.php +++ b/libraries/classes/Gis/GisLineString.php @@ -242,6 +242,7 @@ class GisLineString extends GisGeometry } $wkt = 'LINESTRING('; + /** @infection-ignore-all */ for ($i = 0; $i < $noOfPoints; $i++) { $wkt .= (isset($gisData[$index]['LINESTRING'][$i]['x']) && trim((string) $gisData[$index]['LINESTRING'][$i]['x']) != '' @@ -271,6 +272,7 @@ class GisLineString extends GisGeometry $noOfPoints = count($pointsArr); $coords = ['no_of_points' => $noOfPoints]; + /** @infection-ignore-all */ for ($i = 0; $i < $noOfPoints; $i++) { $coords[$i] = ['x' => $pointsArr[$i][0], 'y' => $pointsArr[$i][1]]; } diff --git a/libraries/classes/Gis/GisMultiLineString.php b/libraries/classes/Gis/GisMultiLineString.php index 3b06a5158f..a43416683d 100644 --- a/libraries/classes/Gis/GisMultiLineString.php +++ b/libraries/classes/Gis/GisMultiLineString.php @@ -275,6 +275,7 @@ class GisMultiLineString extends GisGeometry } $wkt = 'MULTILINESTRING('; + /** @infection-ignore-all */ for ($i = 0; $i < $noOfLines; $i++) { $noOfPoints = $dataRow[$i]['no_of_points'] ?? 2; if ($noOfPoints < 2) { @@ -310,6 +311,7 @@ class GisMultiLineString extends GisGeometry public function getShape(array $rowData): string { $wkt = 'MULTILINESTRING('; + /** @infection-ignore-all */ for ($i = 0; $i < $rowData['numparts']; $i++) { $wkt .= '('; foreach ($rowData['parts'][$i]['points'] as $point) { @@ -343,6 +345,7 @@ class GisMultiLineString extends GisGeometry $points = $this->extractPoints1d($wktLinestring, null); $noOfPoints = count($points); $coords[$j] = ['no_of_points' => $noOfPoints]; + /** @infection-ignore-all */ for ($i = 0; $i < $noOfPoints; $i++) { $coords[$j][$i] = ['x' => $points[$i][0], 'y' => $points[$i][1]]; } diff --git a/libraries/classes/Gis/GisMultiPoint.php b/libraries/classes/Gis/GisMultiPoint.php index 3db9157d5e..56d550ecc3 100644 --- a/libraries/classes/Gis/GisMultiPoint.php +++ b/libraries/classes/Gis/GisMultiPoint.php @@ -260,6 +260,7 @@ class GisMultiPoint extends GisGeometry } $wkt = 'MULTIPOINT('; + /** @infection-ignore-all */ for ($i = 0; $i < $noOfPoints; $i++) { $wkt .= (isset($gisData[$index]['MULTIPOINT'][$i]['x']) && trim((string) $gisData[$index]['MULTIPOINT'][$i]['x']) != '' @@ -284,6 +285,7 @@ class GisMultiPoint extends GisGeometry public function getShape(array $rowData): string { $wkt = 'MULTIPOINT('; + /** @infection-ignore-all */ for ($i = 0; $i < $rowData['numpoints']; $i++) { $wkt .= $rowData['points'][$i]['x'] . ' ' . $rowData['points'][$i]['y'] . ','; @@ -309,6 +311,7 @@ class GisMultiPoint extends GisGeometry $noOfPoints = count($points); $coords = ['no_of_points' => $noOfPoints]; + /** @infection-ignore-all */ for ($i = 0; $i < $noOfPoints; $i++) { $coords[$i] = ['x' => $points[$i][0], 'y' => $points[$i][1]]; } diff --git a/libraries/classes/Gis/GisMultiPolygon.php b/libraries/classes/Gis/GisMultiPolygon.php index 0e06e6245c..9217091863 100644 --- a/libraries/classes/Gis/GisMultiPolygon.php +++ b/libraries/classes/Gis/GisMultiPolygon.php @@ -305,6 +305,7 @@ class GisMultiPolygon extends GisGeometry } $wkt = 'MULTIPOLYGON('; + /** @infection-ignore-all */ for ($k = 0; $k < $noOfPolygons; $k++) { $noOfLines = $dataRow[$k]['no_of_lines'] ?? 1; if ($noOfLines < 1) { @@ -452,6 +453,7 @@ class GisMultiPolygon extends GisGeometry $points = $this->extractPoints1d($wktRing, null); $noOfPoints = count($points); $coords[$k][$j] = ['no_of_points' => $noOfPoints]; + /** @infection-ignore-all */ for ($i = 0; $i < $noOfPoints; $i++) { $coords[$k][$j][$i] = ['x' => $points[$i][0], 'y' => $points[$i][1]]; } diff --git a/libraries/classes/Gis/GisPolygon.php b/libraries/classes/Gis/GisPolygon.php index 51dc9ad9d9..ed1aafadeb 100644 --- a/libraries/classes/Gis/GisPolygon.php +++ b/libraries/classes/Gis/GisPolygon.php @@ -266,6 +266,7 @@ class GisPolygon extends GisGeometry } $wkt = 'POLYGON('; + /** @infection-ignore-all */ for ($i = 0; $i < $noOfLines; $i++) { $noOfPoints = $gisData[$index]['POLYGON'][$i]['no_of_points'] ?? 4; if ($noOfPoints < 4) { @@ -309,6 +310,7 @@ class GisPolygon extends GisGeometry $points = $this->extractPoints1d($wktRing, null); $noOfPoints = count($points); $coords[$j] = ['no_of_points' => $noOfPoints]; + /** @infection-ignore-all */ for ($i = 0; $i < $noOfPoints; $i++) { $coords[$j][$i] = ['x' => $points[$i][0], 'y' => $points[$i][1]]; } diff --git a/libraries/classes/Import/Import.php b/libraries/classes/Import/Import.php index 9371ff435e..b482f434b2 100644 --- a/libraries/classes/Import/Import.php +++ b/libraries/classes/Import/Import.php @@ -443,6 +443,7 @@ class Import $capitalA = 65; // ASCII value for capital "A" $colName = ''; + /** @infection-ignore-all */ if ($num > 26) { $div = (int) ($num / 26); $remain = $num % 26; diff --git a/libraries/classes/IpAllowDeny.php b/libraries/classes/IpAllowDeny.php index 779216d1f1..9a7bc14eb4 100644 --- a/libraries/classes/IpAllowDeny.php +++ b/libraries/classes/IpAllowDeny.php @@ -73,6 +73,7 @@ class IpAllowDeny $maskl = 0; + /** @infection-ignore-all */ for ($i = 0; $i < 31; $i++) { if ($i >= $regs[5] - 1) { continue; @@ -194,6 +195,7 @@ class IpAllowDeny $lastHex = substr_replace($lastHex, $new, $pos, 1); // We processed one nibble, move to previous position + /** @infection-ignore-all */ $flexbits -= 4; --$pos; } diff --git a/libraries/classes/LanguageManager.php b/libraries/classes/LanguageManager.php index af3feae48d..aaa185051c 100644 --- a/libraries/classes/LanguageManager.php +++ b/libraries/classes/LanguageManager.php @@ -756,6 +756,7 @@ class LanguageManager } /* Process all files */ + /** @infection-ignore-all */ while (($file = readdir($handle)) !== false) { $path = LOCALE_PATH . '/' . $file diff --git a/libraries/classes/Linter.php b/libraries/classes/Linter.php index 71bdf00142..54847ba5de 100644 --- a/libraries/classes/Linter.php +++ b/libraries/classes/Linter.php @@ -53,6 +53,7 @@ class Linter $len = $str->length(); $lines = [0]; + /** @infection-ignore-all */ for ($i = 0; $i < $len; ++$i) { if ($str[$i] !== "\n") { continue; diff --git a/libraries/classes/Message.php b/libraries/classes/Message.php index e839adf1b6..5314b7d230 100644 --- a/libraries/classes/Message.php +++ b/libraries/classes/Message.php @@ -612,6 +612,7 @@ class Message implements Stringable $message = $this->getString(); } + /** @infection-ignore-all */ if ($this->isDisplayed()) { $message = $this->getMessageWithIcon($message); } @@ -695,6 +696,8 @@ class Message implements Stringable * sets and returns whether the message was displayed or not * * @param bool $isDisplayed whether to set displayed flag + * + * @infection-ignore-all */ public function isDisplayed(bool $isDisplayed = false): bool { diff --git a/libraries/classes/Normalization.php b/libraries/classes/Normalization.php index e439a0e8d4..33d0dd04fe 100644 --- a/libraries/classes/Normalization.php +++ b/libraries/classes/Normalization.php @@ -124,6 +124,7 @@ class Normalization } $commentsMap = $this->relation->getComments($db, $table); + /** @infection-ignore-all */ for ($columnNumber = 0; $columnNumber < $numFields; $columnNumber++) { $contentCells[$columnNumber] = [ 'column_number' => $columnNumber, diff --git a/libraries/classes/Partitioning/TablePartitionDefinition.php b/libraries/classes/Partitioning/TablePartitionDefinition.php index b00c566925..9511f4889b 100644 --- a/libraries/classes/Partitioning/TablePartitionDefinition.php +++ b/libraries/classes/Partitioning/TablePartitionDefinition.php @@ -95,6 +95,7 @@ final class TablePartitionDefinition // when number of partitions have been reduced array_splice($partitions, $partitionCount); + /** @infection-ignore-all */ for ($i = 0; $i < $partitionCount; $i++) { if (! isset($partitions[$i])) { // Newly added partition $partitions[$i] = [ @@ -151,6 +152,7 @@ final class TablePartitionDefinition // when number of subpartitions have been reduced array_splice($subpartitions, $subpartitionCount); + /** @infection-ignore-all */ for ($j = 0; $j < $subpartitionCount; $j++) { if (! isset($subpartitions[$j])) { // Newly added subpartition $subpartitions[$j] = [ diff --git a/libraries/classes/Pdf.php b/libraries/classes/Pdf.php index 6842999a5b..b4fc4c28bd 100644 --- a/libraries/classes/Pdf.php +++ b/libraries/classes/Pdf.php @@ -43,6 +43,8 @@ class Pdf extends TCPDF * @param false|int $pdfa If not false, set the document to PDF/A mode and the good version (1 or 3) * * @throws Exception + * + * @infection-ignore-all */ public function __construct( string $orientation = 'P', diff --git a/libraries/classes/Plugins/Export/ExportJson.php b/libraries/classes/Plugins/Export/ExportJson.php index 957ae9122d..0cda7f3aa9 100644 --- a/libraries/classes/Plugins/Export/ExportJson.php +++ b/libraries/classes/Plugins/Export/ExportJson.php @@ -263,6 +263,7 @@ class ExportJson extends ExportPlugin $data = []; + /** @infection-ignore-all */ for ($i = 0; $i < $columnsCnt; $i++) { // 63 is the binary charset, see: https://dev.mysql.com/doc/internals/en/charsets.html $isBlobAndIsBinaryCharset = isset($fieldsMeta[$i]) diff --git a/libraries/classes/Plugins/Export/ExportLatex.php b/libraries/classes/Plugins/Export/ExportLatex.php index 0dc867edfa..951c872208 100644 --- a/libraries/classes/Plugins/Export/ExportLatex.php +++ b/libraries/classes/Plugins/Export/ExportLatex.php @@ -366,6 +366,7 @@ class ExportLatex extends ExportPlugin while ($record = $result->fetchAssoc()) { $buffer = ''; // print each row + /** @infection-ignore-all */ for ($i = 0; $i < $columnsCnt; $i++) { if ($record[$columns[$i]] !== null) { $columnValue = self::texEscape($record[$columns[$i]]); diff --git a/libraries/classes/Plugins/Export/ExportMediawiki.php b/libraries/classes/Plugins/Export/ExportMediawiki.php index 422dd3e9c7..550231418e 100644 --- a/libraries/classes/Plugins/Export/ExportMediawiki.php +++ b/libraries/classes/Plugins/Export/ExportMediawiki.php @@ -156,6 +156,8 @@ class ExportMediawiki extends ExportPlugin * @param bool $doMime whether to include mime comments * @param bool $dates whether to include creation/update/check dates * @param mixed[] $aliases Aliases of db/table/columns + * + * @infection-ignore-all */ public function exportStructure( string $db, @@ -307,6 +309,7 @@ class ExportMediawiki extends ExportPlugin $output .= '|-' . $this->exportCRLF(); // Use '|' for separating table columns + /** @infection-ignore-all */ for ($i = 0; $i < $fieldsCnt; ++$i) { $output .= ' | ' . $row[$i] . $this->exportCRLF(); } diff --git a/libraries/classes/Plugins/Export/ExportOds.php b/libraries/classes/Plugins/Export/ExportOds.php index 3161f68ee0..1910b80131 100644 --- a/libraries/classes/Plugins/Export/ExportOds.php +++ b/libraries/classes/Plugins/Export/ExportOds.php @@ -232,6 +232,7 @@ class ExportOds extends ExportPlugin // Format the data while ($row = $result->fetchRow()) { $GLOBALS['ods_buffer'] .= ''; + /** @infection-ignore-all */ for ($j = 0; $j < $fieldsCnt; $j++) { if ($fieldsMeta[$j]->isMappedTypeGeometry) { // export GIS types as hex diff --git a/libraries/classes/Plugins/Export/ExportOdt.php b/libraries/classes/Plugins/Export/ExportOdt.php index 92654200b0..fdeba77fea 100644 --- a/libraries/classes/Plugins/Export/ExportOdt.php +++ b/libraries/classes/Plugins/Export/ExportOdt.php @@ -266,6 +266,7 @@ class ExportOdt extends ExportPlugin // Format the data while ($row = $result->fetchRow()) { $GLOBALS['odt_buffer'] .= ''; + /** @infection-ignore-all */ for ($j = 0; $j < $fieldsCnt; $j++) { if ($fieldsMeta[$j]->isMappedTypeGeometry) { // export GIS types as hex diff --git a/libraries/classes/Plugins/Export/ExportPhparray.php b/libraries/classes/Plugins/Export/ExportPhparray.php index c6e09f9d6c..cad81c38fc 100644 --- a/libraries/classes/Plugins/Export/ExportPhparray.php +++ b/libraries/classes/Plugins/Export/ExportPhparray.php @@ -207,6 +207,7 @@ class ExportPhparray extends ExportPlugin $buffer .= ',' . "\n" . ' array('; } + /** @infection-ignore-all */ for ($i = 0; $i < $columnsCnt; $i++) { $buffer .= var_export($columns[$i], true) . ' => ' . var_export($record[$i], true) diff --git a/libraries/classes/Plugins/Export/ExportSql.php b/libraries/classes/Plugins/Export/ExportSql.php index 71220d059c..e4921324bb 100644 --- a/libraries/classes/Plugins/Export/ExportSql.php +++ b/libraries/classes/Plugins/Export/ExportSql.php @@ -2070,6 +2070,7 @@ class ExportSql extends ExportPlugin $fieldsMeta = $GLOBALS['dbi']->getFieldsMeta($result); $fieldSet = []; + /** @infection-ignore-all */ for ($j = 0; $j < $fieldsCnt; $j++) { $colAs = $fieldsMeta[$j]->name; if (! empty($aliases[$db]['tables'][$table]['columns'][$colAs])) { @@ -2233,6 +2234,7 @@ class ExportSql extends ExportPlugin // should we make update? if (isset($GLOBALS['sql_type']) && $GLOBALS['sql_type'] === 'UPDATE') { $insertLine = $schemaInsert; + /** @infection-ignore-all */ for ($i = 0; $i < $fieldsCnt; $i++) { if ($i == 0) { $insertLine .= ' '; @@ -2557,6 +2559,7 @@ class ExportSql extends ExportPlugin || $statement->options->has('VIEW') ) { // Replacing the body. + /** @infection-ignore-all */ for ($i = 0, $count = count((array) $statement->body); $i < $count; ++$i) { /** diff --git a/libraries/classes/Plugins/Export/ExportYaml.php b/libraries/classes/Plugins/Export/ExportYaml.php index f3767d6df2..f91517c058 100644 --- a/libraries/classes/Plugins/Export/ExportYaml.php +++ b/libraries/classes/Plugins/Export/ExportYaml.php @@ -159,6 +159,7 @@ class ExportYaml extends ExportPlugin $buffer = '-' . "\n"; } + /** @infection-ignore-all */ for ($i = 0; $i < $columnsCnt; $i++) { if (! array_key_exists($i, $record)) { continue; diff --git a/libraries/classes/Plugins/Import/ImportCsv.php b/libraries/classes/Plugins/Import/ImportCsv.php index 0824d805e2..eb5b06426e 100644 --- a/libraries/classes/Plugins/Import/ImportCsv.php +++ b/libraries/classes/Plugins/Import/ImportCsv.php @@ -151,6 +151,8 @@ class ImportCsv extends AbstractImportCsv * Handles the whole import logic * * @return string[] + * + * @infection-ignore-all */ public function doImport(File|null $importHandle = null): array { @@ -747,6 +749,7 @@ class ImportCsv extends AbstractImportCsv if ((isset($columnNames) && count($columnNames) != $maxCols) || ! isset($columnNames)) { // Fill out column names + /** @infection-ignore-all */ for ($i = 0; $i < $maxCols; ++$i) { $columnNames[] = 'COL ' . ($i + 1); } diff --git a/libraries/classes/Plugins/Import/ImportMediawiki.php b/libraries/classes/Plugins/Import/ImportMediawiki.php index b367dfb606..0f66c8b9de 100644 --- a/libraries/classes/Plugins/Import/ImportMediawiki.php +++ b/libraries/classes/Plugins/Import/ImportMediawiki.php @@ -97,6 +97,7 @@ class ImportMediawiki extends ImportPlugin $inTableHeader = false; + /** @infection-ignore-all */ while (! $GLOBALS['finished'] && ! $GLOBALS['error'] && ! $GLOBALS['timeout_passed']) { $data = $this->import->getNextChunk($importHandle); @@ -402,6 +403,7 @@ class ImportMediawiki extends ImportPlugin $partialSeparator = false; // Parse text char by char + /** @infection-ignore-all */ for ($i = 0, $iMax = strlen($subject); $i < $iMax; $i++) { $curChar = $subject[$i]; // Check for separators diff --git a/libraries/classes/Plugins/Import/ImportOds.php b/libraries/classes/Plugins/Import/ImportOds.php index d5cca3a3e0..684e7dc3d5 100644 --- a/libraries/classes/Plugins/Import/ImportOds.php +++ b/libraries/classes/Plugins/Import/ImportOds.php @@ -419,12 +419,14 @@ class ImportOds extends ImportPlugin */ /* Fill out column names */ + /** @infection-ignore-all */ for ($i = count($colNames); $i < $maxCols; ++$i) { $colNames[] = $this->import->getColumnAlphaName($i + 1); } /* Fill out all rows */ $numRows = count($tempRows); + /** @infection-ignore-all */ for ($i = 0; $i < $numRows; ++$i) { for ($j = count($tempRows[$i]); $j < $maxCols; ++$j) { $tempRows[$i][] = 'NULL'; diff --git a/libraries/classes/Plugins/Import/ImportSql.php b/libraries/classes/Plugins/Import/ImportSql.php index 0a8042922b..cc9b87d572 100644 --- a/libraries/classes/Plugins/Import/ImportSql.php +++ b/libraries/classes/Plugins/Import/ImportSql.php @@ -128,6 +128,7 @@ class ImportSql extends ImportPlugin // Checking if the input buffer has finished. if ($newData === true) { $GLOBALS['finished'] = true; + /** @infection-ignore-all */ break; } @@ -143,6 +144,7 @@ class ImportSql extends ImportPlugin } // Extracting remaining statements. + /** @infection-ignore-all */ while (! $GLOBALS['error'] && ! $GLOBALS['timeout_passed'] && ! empty($bq->query)) { $statement = $bq->extract(true); if ($statement === false || $statement === '') { diff --git a/libraries/classes/Plugins/Import/ImportXml.php b/libraries/classes/Plugins/Import/ImportXml.php index a238c5b417..751c5798c2 100644 --- a/libraries/classes/Plugins/Import/ImportXml.php +++ b/libraries/classes/Plugins/Import/ImportXml.php @@ -66,6 +66,7 @@ class ImportXml extends ImportPlugin * Read in the file via Import::getNextChunk so that * it can process compressed files */ + /** @infection-ignore-all */ while (! $GLOBALS['finished'] && ! $GLOBALS['error'] && ! $GLOBALS['timeout_passed']) { $data = $this->import->getNextChunk($importHandle); if ($data === false) { diff --git a/libraries/classes/Plugins/Schema/Pdf/PdfRelationSchema.php b/libraries/classes/Plugins/Schema/Pdf/PdfRelationSchema.php index b7903bc0a2..3949852748 100644 --- a/libraries/classes/Plugins/Schema/Pdf/PdfRelationSchema.php +++ b/libraries/classes/Plugins/Schema/Pdf/PdfRelationSchema.php @@ -392,6 +392,7 @@ class PdfRelationSchema extends ExportRelationSchema $this->diagram->setDrawColor(200, 200, 200); // Draws horizontal lines $innerHeight = $this->diagram->getPageHeight() - $topSpace - $bottomSpace; + /** @infection-ignore-all */ for ($l = 0, $size = intval($innerHeight / $gridSize); $l <= $size; $l++) { $this->diagram->line( 0, @@ -410,6 +411,7 @@ class PdfRelationSchema extends ExportRelationSchema } // Draws vertical lines + /** @infection-ignore-all */ for ($j = 0, $size = intval($this->diagram->getPageWidth() / $gridSize); $j <= $size; $j++) { $this->diagram->line( $j * $gridSize, diff --git a/libraries/classes/Server/Privileges.php b/libraries/classes/Server/Privileges.php index bc8371379f..c24e1e4e87 100644 --- a/libraries/classes/Server/Privileges.php +++ b/libraries/classes/Server/Privileges.php @@ -1820,6 +1820,7 @@ class Privileges public function getHtmlForInitials(array $arrayInitials): string { // initialize to false the letters A-Z + /** @infection-ignore-all */ for ($letterCounter = 1; $letterCounter < 27; $letterCounter++) { if (isset($arrayInitials[mb_chr($letterCounter + 64)])) { continue; diff --git a/libraries/classes/Setup/ConfigGenerator.php b/libraries/classes/Setup/ConfigGenerator.php index 87a26e04bf..a3d2c39e38 100644 --- a/libraries/classes/Setup/ConfigGenerator.php +++ b/libraries/classes/Setup/ConfigGenerator.php @@ -159,6 +159,7 @@ class ConfigGenerator // more than 4 values - value per line $imax = count($retv); + /** @infection-ignore-all */ for ($i = 0; $i < $imax; $i++) { $ret .= ($i > 0 ? ',' : '') . $eol . ' ' . $retv[$i]; } diff --git a/libraries/classes/SystemDatabase.php b/libraries/classes/SystemDatabase.php index 6a1a6166fa..908d2042ed 100644 --- a/libraries/classes/SystemDatabase.php +++ b/libraries/classes/SystemDatabase.php @@ -85,6 +85,7 @@ class SystemDatabase $columnCount = 0; $addComma = false; + /** @infection-ignore-all */ while ($dataRow = $transformationData->fetchAssoc()) { foreach ($columnMap as $column) { if ( diff --git a/libraries/classes/Table/ColumnsDefinition.php b/libraries/classes/Table/ColumnsDefinition.php index 4f72621dea..02fd3e136c 100644 --- a/libraries/classes/Table/ColumnsDefinition.php +++ b/libraries/classes/Table/ColumnsDefinition.php @@ -137,6 +137,7 @@ final class ColumnsDefinition $childReferences = $this->relation->getChildReferences($GLOBALS['db'], $GLOBALS['table']); } + /** @infection-ignore-all */ for ($columnNumber = 0; $columnNumber < $numFields; $columnNumber++) { $type = ''; $length = ''; diff --git a/libraries/classes/Tracking/Tracker.php b/libraries/classes/Tracking/Tracker.php index ee1ae5998d..c1594166cf 100644 --- a/libraries/classes/Tracking/Tracker.php +++ b/libraries/classes/Tracking/Tracker.php @@ -183,6 +183,7 @@ class Tracker // int indices to reduce size $columns = array_values($columns); // remove Privileges to reduce size + /** @infection-ignore-all */ for ($i = 0, $nb = count($columns); $i < $nb; $i++) { unset($columns[$i]['Privileges']); } diff --git a/libraries/classes/Transformations.php b/libraries/classes/Transformations.php index c534f4c2d2..1dfab0f407 100644 --- a/libraries/classes/Transformations.php +++ b/libraries/classes/Transformations.php @@ -85,6 +85,7 @@ class Transformations // '..., $trimmed = ltrim($option); $rtrimmed = ''; + /** @infection-ignore-all */ while (($option = array_shift($transformOptions)) !== null) { // ..., $trimmed .= ',' . $option; diff --git a/libraries/classes/Util.php b/libraries/classes/Util.php index 29cdd64e07..6e20da6443 100644 --- a/libraries/classes/Util.php +++ b/libraries/classes/Util.php @@ -317,6 +317,7 @@ class Util $li = 10 ** $limes; $unit = $byteUnits[0]; + /** @infection-ignore-all */ for ($d = 6, $ex = 15; $d >= 1; $d--, $ex -= 3) { $unitSize = $li * 10 ** $ex; if (isset($byteUnits[$d]) && $value >= $unitSize) { @@ -720,6 +721,7 @@ class Util $uniqueKeyArray = []; $nonPrimaryConditionArray = []; + /** @infection-ignore-all */ for ($i = 0; $i < $fieldsCount; ++$i) { $meta = $fieldsMeta[$i]; @@ -1635,6 +1637,7 @@ class Util $inString = false; $buffer = ''; + /** @infection-ignore-all */ for ($i = 0, $length = mb_strlen($valuesString); $i < $length; $i++) { $curr = mb_substr($valuesString, $i, 1); $next = $i == mb_strlen($valuesString) - 1 @@ -2136,6 +2139,7 @@ class Util { $result = ''; + /** @infection-ignore-all */ while (strlen($result) < $length) { // Get random byte and strip highest bit // to get ASCII only range diff --git a/libraries/classes/VersionInformation.php b/libraries/classes/VersionInformation.php index db53a82359..7d5c8feccd 100644 --- a/libraries/classes/VersionInformation.php +++ b/libraries/classes/VersionInformation.php @@ -155,6 +155,7 @@ class VersionInformation $phpConditions = explode(',', $phpVersions); foreach ($phpConditions as $phpCondition) { if (! $this->evaluateVersionCondition('PHP', $phpCondition)) { + /** @infection-ignore-all */ continue 2; } } diff --git a/libraries/classes/WebAuthn/CBORDecoder.php b/libraries/classes/WebAuthn/CBORDecoder.php index 016821b1a2..397815e600 100644 --- a/libraries/classes/WebAuthn/CBORDecoder.php +++ b/libraries/classes/WebAuthn/CBORDecoder.php @@ -126,6 +126,7 @@ final class CBORDecoder private function getList(DataStream $stream, int $value): array { $list = []; + /** @infection-ignore-all */ for ($i = 0; $i < $value; $i++) { /** @psalm-suppress MixedAssignment */ $list[] = $this->wellFormed($stream); @@ -142,6 +143,7 @@ final class CBORDecoder private function getMap(DataStream $stream, int $value): array { $map = []; + /** @infection-ignore-all */ for ($i = 0; $i < $value; $i++) { /** @psalm-suppress MixedAssignment, MixedArrayOffset */ $map[$this->wellFormed($stream)] = $this->wellFormed($stream); diff --git a/libraries/classes/WebAuthn/WebauthnLibServer.php b/libraries/classes/WebAuthn/WebauthnLibServer.php index 597727bafd..ef64da876e 100644 --- a/libraries/classes/WebAuthn/WebauthnLibServer.php +++ b/libraries/classes/WebAuthn/WebauthnLibServer.php @@ -191,6 +191,7 @@ final class WebauthnLibServer implements Server return $publicKeyCredentialSource->jsonSerialize(); } + /** @infection-ignore-all */ private function createPublicKeyCredentialSourceRepository(): PublicKeyCredentialSourceRepository { return new class ($this->twofactor) implements PublicKeyCredentialSourceRepository {