diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index a8a67238fd..429510b8cf 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -12261,24 +12261,6 @@ parameters: count: 1 path: src/Plugins/Export/ExportMediawiki.php - - - message: '#^Binary operation "\.\=" between mixed and ''\ - - - - @@ -13217,12 +13212,6 @@ - - - - - - diff --git a/psalm.xml b/psalm.xml index ed8bf5c3b1..df8e45f7a6 100644 --- a/psalm.xml +++ b/psalm.xml @@ -78,8 +78,6 @@ maxsize: string, memory_limit: int, message: PhpMyAdmin\Message, - ods_buffer: string, - odt_buffer: string, offset: int, old_tz: string, onfly_compression: bool, diff --git a/src/Plugins/Export/ExportOds.php b/src/Plugins/Export/ExportOds.php index 05180c8eb1..0c34419ed8 100644 --- a/src/Plugins/Export/ExportOds.php +++ b/src/Plugins/Export/ExportOds.php @@ -32,9 +32,11 @@ use function strtotime; */ class ExportOds extends ExportPlugin { + public string $buffer = ''; + protected function init(): void { - $GLOBALS['ods_buffer'] = ''; + $this->buffer = ''; } /** @psalm-return non-empty-lowercase-string */ @@ -86,7 +88,7 @@ class ExportOds extends ExportPlugin */ public function exportHeader(): bool { - $GLOBALS['ods_buffer'] .= '' + $this->buffer .= '' . '' . '' @@ -140,12 +142,12 @@ class ExportOds extends ExportPlugin */ public function exportFooter(): bool { - $GLOBALS['ods_buffer'] .= ''; + $this->buffer .= ''; return $this->export->outputHandler( OpenDocument::create( 'application/vnd.oasis.opendocument.spreadsheet', - $GLOBALS['ods_buffer'], + $this->buffer, ), ); } @@ -205,30 +207,30 @@ class ExportOds extends ExportPlugin $fieldsCnt = $result->numFields(); $fieldsMeta = $dbi->getFieldsMeta($result); - $GLOBALS['ods_buffer'] .= ''; + $this->buffer .= ''; // If required, get fields name at the first line if (isset($GLOBALS['ods_columns'])) { - $GLOBALS['ods_buffer'] .= ''; + $this->buffer .= ''; foreach ($fieldsMeta as $field) { $colAs = $field->name; if (! empty($aliases[$db]['tables'][$table]['columns'][$colAs])) { $colAs = $aliases[$db]['tables'][$table]['columns'][$colAs]; } - $GLOBALS['ods_buffer'] .= '' + $this->buffer .= '' . '' . htmlspecialchars($colAs) . '' . ''; } - $GLOBALS['ods_buffer'] .= ''; + $this->buffer .= ''; } // Format the data while ($row = $result->fetchRow()) { - $GLOBALS['ods_buffer'] .= ''; + $this->buffer .= ''; /** @infection-ignore-all */ for ($j = 0; $j < $fieldsCnt; $j++) { if ($fieldsMeta[$j]->isMappedTypeGeometry) { @@ -237,18 +239,18 @@ class ExportOds extends ExportPlugin } if (! isset($row[$j])) { - $GLOBALS['ods_buffer'] .= '' + $this->buffer .= '' . '' . htmlspecialchars($GLOBALS['ods_null']) . '' . ''; } elseif ($fieldsMeta[$j]->isBinary && $fieldsMeta[$j]->isBlob) { // ignore BLOB - $GLOBALS['ods_buffer'] .= '' + $this->buffer .= '' . '' . ''; } elseif ($fieldsMeta[$j]->isType(FieldMetadata::TYPE_DATE)) { - $GLOBALS['ods_buffer'] .= 'buffer .= '' @@ -257,7 +259,7 @@ class ExportOds extends ExportPlugin . '' . ''; } elseif ($fieldsMeta[$j]->isType(FieldMetadata::TYPE_TIME)) { - $GLOBALS['ods_buffer'] .= 'buffer .= '' @@ -266,7 +268,7 @@ class ExportOds extends ExportPlugin . '' . ''; } elseif ($fieldsMeta[$j]->isType(FieldMetadata::TYPE_DATETIME)) { - $GLOBALS['ods_buffer'] .= 'buffer .= '' @@ -277,14 +279,14 @@ class ExportOds extends ExportPlugin } elseif ( $fieldsMeta[$j]->isNumeric ) { - $GLOBALS['ods_buffer'] .= 'buffer .= '' . '' . htmlspecialchars($row[$j]) . '' . ''; } else { - $GLOBALS['ods_buffer'] .= '' + $this->buffer .= '' . '' . htmlspecialchars($row[$j]) . '' @@ -292,10 +294,10 @@ class ExportOds extends ExportPlugin } } - $GLOBALS['ods_buffer'] .= ''; + $this->buffer .= ''; } - $GLOBALS['ods_buffer'] .= ''; + $this->buffer .= ''; return true; } diff --git a/src/Plugins/Export/ExportOdt.php b/src/Plugins/Export/ExportOdt.php index 635f2cd552..69af06e373 100644 --- a/src/Plugins/Export/ExportOdt.php +++ b/src/Plugins/Export/ExportOdt.php @@ -35,15 +35,14 @@ use function str_replace; */ class ExportOdt extends ExportPlugin { + public string $buffer = ''; private bool $doRelation = false; - private bool $doMime = false; - private bool $doComments = false; protected function init(): void { - $GLOBALS['odt_buffer'] = ''; + $this->buffer = ''; } /** @psalm-return non-empty-lowercase-string */ @@ -150,7 +149,7 @@ class ExportOdt extends ExportPlugin */ public function exportHeader(): bool { - $GLOBALS['odt_buffer'] .= '' + $this->buffer .= '' . '' . '' @@ -164,11 +163,11 @@ class ExportOdt extends ExportPlugin */ public function exportFooter(): bool { - $GLOBALS['odt_buffer'] .= ''; + $this->buffer .= ''; return $this->export->outputHandler(OpenDocument::create( 'application/vnd.oasis.opendocument.text', - $GLOBALS['odt_buffer'], + $this->buffer, )); } @@ -184,7 +183,7 @@ class ExportOdt extends ExportPlugin $dbAlias = $db; } - $GLOBALS['odt_buffer'] .= 'buffer .= '' . __('Database') . ' ' . htmlspecialchars($dbAlias) . ''; @@ -236,12 +235,12 @@ class ExportOdt extends ExportPlugin $fieldsCnt = $result->numFields(); $fieldsMeta = $dbi->getFieldsMeta($result); - $GLOBALS['odt_buffer'] .= 'buffer .= ''; $tableAlias != '' - ? $GLOBALS['odt_buffer'] .= __('Dumping data for table') . ' ' . htmlspecialchars($tableAlias) - : $GLOBALS['odt_buffer'] .= __('Dumping data for query result'); - $GLOBALS['odt_buffer'] .= '' + ? $this->buffer .= __('Dumping data for table') . ' ' . htmlspecialchars($tableAlias) + : $this->buffer .= __('Dumping data for query result'); + $this->buffer .= '' . '' . 'buffer .= ''; foreach ($fieldsMeta as $field) { $colAs = $field->name; if (! empty($aliases[$db]['tables'][$table]['columns'][$colAs])) { $colAs = $aliases[$db]['tables'][$table]['columns'][$colAs]; } - $GLOBALS['odt_buffer'] .= '' + $this->buffer .= '' . '' . htmlspecialchars($colAs) . '' . ''; } - $GLOBALS['odt_buffer'] .= ''; + $this->buffer .= ''; } // Format the data while ($row = $result->fetchRow()) { - $GLOBALS['odt_buffer'] .= ''; + $this->buffer .= ''; /** @infection-ignore-all */ for ($j = 0; $j < $fieldsCnt; $j++) { if ($fieldsMeta[$j]->isMappedTypeGeometry) { @@ -277,27 +276,27 @@ class ExportOdt extends ExportPlugin } if (! isset($row[$j])) { - $GLOBALS['odt_buffer'] .= '' + $this->buffer .= '' . '' . htmlspecialchars($GLOBALS['odt_null']) . '' . ''; } elseif ($fieldsMeta[$j]->isBinary && $fieldsMeta[$j]->isBlob) { // ignore BLOB - $GLOBALS['odt_buffer'] .= '' + $this->buffer .= '' . '' . ''; } elseif ( $fieldsMeta[$j]->isNumeric ) { - $GLOBALS['odt_buffer'] .= 'buffer .= '' . '' . htmlspecialchars($row[$j]) . '' . ''; } else { - $GLOBALS['odt_buffer'] .= '' + $this->buffer .= '' . '' . htmlspecialchars($row[$j]) . '' @@ -305,10 +304,10 @@ class ExportOdt extends ExportPlugin } } - $GLOBALS['odt_buffer'] .= ''; + $this->buffer .= ''; } - $GLOBALS['odt_buffer'] .= ''; + $this->buffer .= ''; return true; } @@ -351,13 +350,13 @@ class ExportOdt extends ExportPlugin /** * Displays the table structure */ - $GLOBALS['odt_buffer'] .= ''; $columnsCnt = 4; - $GLOBALS['odt_buffer'] .= 'buffer .= ''; /* Header */ - $GLOBALS['odt_buffer'] .= '' + $this->buffer .= '' . '' . '' . __('Column') . '' . '' @@ -379,11 +378,11 @@ class ExportOdt extends ExportPlugin $colAs = $aliases[$db]['tables'][$view]['columns'][$colAs]; } - $GLOBALS['odt_buffer'] .= $this->formatOneColumnDefinition($column, $colAs); - $GLOBALS['odt_buffer'] .= ''; + $this->buffer .= $this->formatOneColumnDefinition($column, $colAs); + $this->buffer .= ''; } - $GLOBALS['odt_buffer'] .= ''; + $this->buffer .= ''; return ''; } @@ -416,7 +415,7 @@ class ExportOdt extends ExportPlugin /** * Displays the table structure */ - $GLOBALS['odt_buffer'] .= ''; $columnsCnt = 4; if ($this->doRelation && $foreigners !== []) { @@ -431,10 +430,10 @@ class ExportOdt extends ExportPlugin $columnsCnt++; } - $GLOBALS['odt_buffer'] .= 'buffer .= ''; /* Header */ - $GLOBALS['odt_buffer'] .= '' + $this->buffer .= '' . '' . '' . __('Column') . '' . '' @@ -448,26 +447,26 @@ class ExportOdt extends ExportPlugin . '' . __('Default') . '' . ''; if ($this->doRelation && $foreigners !== []) { - $GLOBALS['odt_buffer'] .= '' + $this->buffer .= '' . '' . __('Links to') . '' . ''; } if ($this->doComments) { - $GLOBALS['odt_buffer'] .= '' + $this->buffer .= '' . '' . __('Comments') . '' . ''; $comments = $this->relation->getComments($db, $table); } if ($this->doMime && $relationParameters->browserTransformationFeature !== null) { - $GLOBALS['odt_buffer'] .= '' + $this->buffer .= '' . '' . __('Media type') . '' . ''; $mimeMap = $this->transformations->getMime($db, $table, true); } - $GLOBALS['odt_buffer'] .= ''; + $this->buffer .= ''; $columns = $dbi->getColumns($db, $table); foreach ($columns as $column) { @@ -476,7 +475,7 @@ class ExportOdt extends ExportPlugin $colAs = $aliases[$db]['tables'][$table]['columns'][$colAs]; } - $GLOBALS['odt_buffer'] .= $this->formatOneColumnDefinition($column, $colAs); + $this->buffer .= $this->formatOneColumnDefinition($column, $colAs); if ($this->doRelation && $foreigners !== []) { $foreigner = $this->relation->searchColumnInForeigners($foreigners, $fieldName); if ($foreigner) { @@ -491,7 +490,7 @@ class ExportOdt extends ExportPlugin } $relation = htmlspecialchars($rtable . ' (' . $rfield . ')'); - $GLOBALS['odt_buffer'] .= '' + $this->buffer .= '' . '' . htmlspecialchars($relation) . '' @@ -501,13 +500,13 @@ class ExportOdt extends ExportPlugin if ($this->doComments) { if (isset($comments[$fieldName])) { - $GLOBALS['odt_buffer'] .= '' + $this->buffer .= '' . '' . htmlspecialchars($comments[$fieldName]) . '' . ''; } else { - $GLOBALS['odt_buffer'] .= '' + $this->buffer .= '' . '' . ''; } @@ -515,7 +514,7 @@ class ExportOdt extends ExportPlugin if ($this->doMime && $relationParameters->browserTransformationFeature !== null) { if (isset($mimeMap[$fieldName])) { - $GLOBALS['odt_buffer'] .= '' + $this->buffer .= '' . '' . htmlspecialchars( str_replace('_', '/', $mimeMap[$fieldName]['mimetype']), @@ -523,16 +522,16 @@ class ExportOdt extends ExportPlugin . '' . ''; } else { - $GLOBALS['odt_buffer'] .= '' + $this->buffer .= '' . '' . ''; } } - $GLOBALS['odt_buffer'] .= ''; + $this->buffer .= ''; } - $GLOBALS['odt_buffer'] .= ''; + $this->buffer .= ''; return true; } @@ -545,7 +544,7 @@ class ExportOdt extends ExportPlugin */ protected function getTriggers(string $table, array $triggers): string { - $GLOBALS['odt_buffer'] .= 'buffer .= '' . '' @@ -565,33 +564,33 @@ class ExportOdt extends ExportPlugin . ''; foreach ($triggers as $trigger) { - $GLOBALS['odt_buffer'] .= ''; - $GLOBALS['odt_buffer'] .= '' + $this->buffer .= ''; + $this->buffer .= '' . '' . htmlspecialchars($trigger->name->getName()) . '' . ''; - $GLOBALS['odt_buffer'] .= '' + $this->buffer .= '' . '' . htmlspecialchars($trigger->timing->value) . '' . ''; - $GLOBALS['odt_buffer'] .= '' + $this->buffer .= '' . '' . htmlspecialchars($trigger->event->value) . '' . ''; - $GLOBALS['odt_buffer'] .= '' + $this->buffer .= '' . '' . htmlspecialchars($trigger->statement) . '' . ''; - $GLOBALS['odt_buffer'] .= ''; + $this->buffer .= ''; } - $GLOBALS['odt_buffer'] .= ''; + $this->buffer .= ''; - return $GLOBALS['odt_buffer']; + return $this->buffer; } /** @@ -609,7 +608,7 @@ class ExportOdt extends ExportPlugin $this->initAlias($aliases, $dbAlias, $tableAlias); switch ($exportMode) { case 'create_table': - $GLOBALS['odt_buffer'] .= 'buffer .= '' . __('Table structure for table') . ' ' . htmlspecialchars($tableAlias) @@ -619,7 +618,7 @@ class ExportOdt extends ExportPlugin case 'triggers': $triggers = Triggers::getDetails(DatabaseInterface::getInstance(), $db, $table); if ($triggers !== []) { - $GLOBALS['odt_buffer'] .= 'buffer .= '' . __('Triggers') . ' ' . htmlspecialchars($tableAlias) @@ -629,7 +628,7 @@ class ExportOdt extends ExportPlugin break; case 'create_view': - $GLOBALS['odt_buffer'] .= 'buffer .= '' . __('Structure for view') . ' ' . htmlspecialchars($tableAlias) @@ -637,7 +636,7 @@ class ExportOdt extends ExportPlugin $this->getTableDef($db, $table, $aliases); break; case 'stand_in': - $GLOBALS['odt_buffer'] .= 'buffer .= '' . __('Stand-in structure for view') . ' ' . htmlspecialchars($tableAlias) diff --git a/tests/unit/Plugins/Export/ExportOdsTest.php b/tests/unit/Plugins/Export/ExportOdsTest.php index a2dd492aa2..8c7ac551a7 100644 --- a/tests/unit/Plugins/Export/ExportOdsTest.php +++ b/tests/unit/Plugins/Export/ExportOdsTest.php @@ -171,23 +171,24 @@ class ExportOdsTest extends AbstractTestCase public function testExportHeader(): void { - self::assertArrayHasKey('ods_buffer', $GLOBALS); - - self::assertTrue( - $this->object->exportHeader(), + $this->object->buffer = ''; + self::assertTrue($this->object->exportHeader()); + self::assertStringStartsWith( + 'object->buffer, ); } public function testExportFooter(): void { - $GLOBALS['ods_buffer'] = 'header'; + $this->object->buffer = 'header'; self::assertTrue($this->object->exportFooter()); $output = $this->getActualOutputForAssertion(); self::assertMatchesRegularExpression('/^504b.*636f6e74656e742e786d6c/', bin2hex($output)); - self::assertStringContainsString('header', $GLOBALS['ods_buffer']); - self::assertStringContainsString('', $GLOBALS['ods_buffer']); - self::assertStringContainsString('', $GLOBALS['ods_buffer']); - self::assertStringContainsString('', $GLOBALS['ods_buffer']); + self::assertStringContainsString('header', $this->object->buffer); + self::assertStringContainsString('', $this->object->buffer); + self::assertStringContainsString('', $this->object->buffer); + self::assertStringContainsString('', $this->object->buffer); } public function testExportDBHeader(): void @@ -284,7 +285,7 @@ class ExportOdsTest extends AbstractTestCase 'office:value="a&b" >a&b' . '<' . '', - $GLOBALS['ods_buffer'], + $this->object->buffer, ); } @@ -347,7 +348,7 @@ class ExportOdsTest extends AbstractTestCase '-cell>' . 'fnam/<e2' . '', - $GLOBALS['ods_buffer'], + $this->object->buffer, ); // with no row count @@ -381,7 +382,7 @@ class ExportOdsTest extends AbstractTestCase $GLOBALS['mediawiki_caption'] = true; $GLOBALS['mediawiki_headers'] = true; $GLOBALS['ods_null'] = '&'; - $GLOBALS['ods_buffer'] = ''; + $this->object->buffer = ''; self::assertTrue( $this->object->exportData( @@ -393,7 +394,7 @@ class ExportOdsTest extends AbstractTestCase self::assertSame( '', - $GLOBALS['ods_buffer'], + $this->object->buffer, ); } } diff --git a/tests/unit/Plugins/Export/ExportOdtTest.php b/tests/unit/Plugins/Export/ExportOdtTest.php index ed9fe592a9..b9a1fe0229 100644 --- a/tests/unit/Plugins/Export/ExportOdtTest.php +++ b/tests/unit/Plugins/Export/ExportOdtTest.php @@ -312,34 +312,34 @@ class ExportOdtTest extends AbstractTestCase $this->object->exportHeader(), ); - self::assertStringContainsString('object->buffer); + self::assertStringContainsString('office:version', $this->object->buffer); } public function testExportFooter(): void { - $GLOBALS['odt_buffer'] = 'header'; + $this->object->buffer = 'header'; self::assertTrue($this->object->exportFooter()); $output = $this->getActualOutputForAssertion(); self::assertMatchesRegularExpression('/^504b.*636f6e74656e742e786d6c/', bin2hex($output)); - self::assertStringContainsString('header', $GLOBALS['odt_buffer']); + self::assertStringContainsString('header', $this->object->buffer); self::assertStringContainsString( '', - $GLOBALS['odt_buffer'], + $this->object->buffer, ); } public function testExportDBHeader(): void { - $GLOBALS['odt_buffer'] = 'header'; + $this->object->buffer = 'header'; self::assertTrue( $this->object->exportDBHeader('d&b'), ); - self::assertStringContainsString('header', $GLOBALS['odt_buffer']); + self::assertStringContainsString('header', $this->object->buffer); - self::assertStringContainsString('Database d&b', $GLOBALS['odt_buffer']); + self::assertStringContainsString('Database d&b', $this->object->buffer); } public function testExportDBFooter(): void @@ -416,7 +416,7 @@ class ExportOdtTest extends AbstractTestCase '' . 'a&b' . '', - $GLOBALS['odt_buffer'], + $this->object->buffer, ); } @@ -479,7 +479,7 @@ class ExportOdtTest extends AbstractTestCase 'value-type="string">fna\"me' . 'fnam/<e2' . '', - $GLOBALS['odt_buffer'], + $this->object->buffer, ); // with no row count @@ -513,7 +513,7 @@ class ExportOdtTest extends AbstractTestCase $GLOBALS['mediawiki_caption'] = true; $GLOBALS['mediawiki_headers'] = true; $GLOBALS['odt_null'] = '&'; - $GLOBALS['odt_buffer'] = ''; + $this->object->buffer = ''; self::assertTrue( $this->object->exportData( @@ -529,7 +529,7 @@ class ExportOdtTest extends AbstractTestCase '' . '', - $GLOBALS['odt_buffer'], + $this->object->buffer, ); } @@ -565,7 +565,7 @@ class ExportOdtTest extends AbstractTestCase . 'No' . 'NULL' . '', - $GLOBALS['odt_buffer'], + $this->object->buffer, ); } @@ -636,17 +636,17 @@ class ExportOdtTest extends AbstractTestCase self::assertStringContainsString( '', - $GLOBALS['odt_buffer'], + $this->object->buffer, ); self::assertStringContainsString( 'Comments', - $GLOBALS['odt_buffer'], + $this->object->buffer, ); self::assertStringContainsString( 'Media type', - $GLOBALS['odt_buffer'], + $this->object->buffer, ); self::assertStringContainsString( @@ -654,7 +654,7 @@ class ExportOdtTest extends AbstractTestCase 'Test<' . '', - $GLOBALS['odt_buffer'], + $this->object->buffer, ); // case 2 @@ -692,7 +692,7 @@ class ExportOdtTest extends AbstractTestCase DatabaseInterface::$instance = $dbi; $this->object->relation = new Relation($dbi); - $GLOBALS['odt_buffer'] = ''; + $this->object->buffer = ''; $relationParameters = RelationParameters::fromArray([ 'relwork' => true, 'commwork' => true, @@ -705,7 +705,7 @@ class ExportOdtTest extends AbstractTestCase self::assertTrue($this->object->getTableDef('database', '')); - self::assertStringContainsString('ftable (ffield)', $GLOBALS['odt_buffer']); + self::assertStringContainsString('ftable (ffield)', $this->object->buffer); } public function testGetTriggers(): void @@ -724,7 +724,7 @@ class ExportOdtTest extends AbstractTestCase $method = new ReflectionMethod(ExportOdt::class, 'getTriggers'); $result = $method->invoke($this->object, 'taobject->buffer); self::assertStringContainsString('', $result); @@ -768,11 +768,11 @@ class ExportOdtTest extends AbstractTestCase . 'No' . 'NULL' . '', - $GLOBALS['odt_buffer'], + $this->object->buffer, ); // case 2 - $GLOBALS['odt_buffer'] = ''; + $this->object->buffer = ''; self::assertTrue($this->object->exportStructure('test_db', 'test_table', 'triggers')); @@ -790,11 +790,11 @@ class ExportOdtTest extends AbstractTestCase . 'INSERT' . 'BEGIN END' . '', - $GLOBALS['odt_buffer'], + $this->object->buffer, ); // case 3 - $GLOBALS['odt_buffer'] = ''; + $this->object->buffer = ''; $this->dummyDbi->addSelectDb('test_db'); self::assertTrue($this->object->exportStructure('test_db', 'test_table', 'create_view')); @@ -824,12 +824,12 @@ class ExportOdtTest extends AbstractTestCase . 'No' . 'NULL' . '', - $GLOBALS['odt_buffer'], + $this->object->buffer, ); // case 4 $this->dummyDbi->addSelectDb('test_db'); - $GLOBALS['odt_buffer'] = ''; + $this->object->buffer = ''; self::assertTrue($this->object->exportStructure('test_db', 'test_table', 'stand_in')); $this->dummyDbi->assertAllSelectsConsumed(); @@ -857,7 +857,7 @@ class ExportOdtTest extends AbstractTestCase . 'No' . 'NULL' . '', - $GLOBALS['odt_buffer'], + $this->object->buffer, ); }