Skip to content

Commit 195c0da

Browse files
authored
Merge pull request #9416 from codeigniter4/develop
4.5.8 Ready code
2 parents daf65f9 + 3abaf4b commit 195c0da

File tree

332 files changed

+1593
-1442
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

332 files changed

+1593
-1442
lines changed

.github/mergeable.yml

+22-29
Original file line numberDiff line numberDiff line change
@@ -2,40 +2,33 @@
22

33
version: 2
44
mergeable:
5-
- when: issues.opened
5+
- when: issues.opened, issues.reopened
66
validate:
7-
- do: description
8-
and:
9-
- must_include:
10-
regex: '^### PHP Version'
11-
- must_include:
12-
regex: '^### CodeIgniter4 Version'
13-
- do: author
14-
and:
15-
- must_exclude:
16-
regex: 'kenjis'
17-
- must_exclude:
18-
regex: 'lonnieezell'
19-
- must_exclude:
20-
regex: 'MGatner'
21-
- must_exclude:
22-
regex: 'michalsn'
23-
- must_exclude:
24-
regex: 'paulbalandan'
25-
- must_exclude:
26-
regex: 'samsonasik'
7+
- do: or
8+
validate:
9+
- do: and
10+
validate:
11+
- do: description
12+
must_include:
13+
regex: '### PHP Version'
14+
- do: description
15+
must_include:
16+
regex: '### CodeIgniter4 Version'
17+
- do: author
18+
must_include:
19+
regex: ^kenjis|lonnieezell|MGatner|michalsn|paulbalandan|samsonasik$
2720
fail:
2821
- do: comment
29-
payload: |
30-
Hi there! :wave:
22+
payload:
23+
body: |
24+
Hi there, @@author! :wave:
3125
32-
It looks like you opened an issue without following the bug report template:
26+
It looks like you opened an issue without following the bug report template:
3327
34-
Bug report ([open an issue](https://github.com/codeigniter4/CodeIgniter4/issues/new?assignees=&labels=bug&projects=&template=bug_report.yml&title=Bug%3A+))
28+
* Bug report ([open an issue](https://github.com/codeigniter4/CodeIgniter4/issues/new?assignees=&labels=bug&projects=&template=bug_report.yml&title=Bug%3A+))
29+
* For feature request or support question, please use the [forums](https://forum.codeigniter.com/forum-30.html).
3530
36-
If you are opening a feature request or support question, please do so in the [forums](https://forum.codeigniter.com/forum-30.html).
31+
The current issue will be closed. This is a precaution to save maintainers' time, I hope you'll understand.
3732
38-
The current issue will be closed. This is a precaution to save maintainers' time, I hope you'll understand.
39-
40-
Sincerely, the mergeable bot 🤖
33+
Sincerely, the mergeable bot 🤖
4134
- do: close

.php-cs-fixer.dist.php

+4-2
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@
3939
__DIR__ . '/spark',
4040
]);
4141

42-
$overrides = [];
42+
$overrides = [
43+
'modernize_strpos' => ['modernize_stripos' => true],
44+
];
4345

4446
$options = [
4547
'cacheFile' => 'build/.php-cs-fixer.cache',
@@ -53,5 +55,5 @@
5355
return Factory::create(new CodeIgniter4(), $overrides, $options)->forLibrary(
5456
'CodeIgniter 4 framework',
5557
'CodeIgniter Foundation',
56-
58+
5759
);

CHANGELOG.md

+27
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,32 @@
11
# Changelog
22

3+
## [v4.5.8](https://github.com/codeigniter4/CodeIgniter4/tree/v4.5.8) (2025-01-19)
4+
[Full Changelog](https://github.com/codeigniter4/CodeIgniter4/compare/v4.5.7...v4.5.8)
5+
6+
### Security
7+
8+
* **HTTP** *Validation of header name and value*: Fixed a potential vulnerability on lack of proper header validation
9+
for its name and value. See the [security advisory](https://github.com/codeigniter4/CodeIgniter4/security/advisories/GHSA-x5mq-jjr3-vmx6)
10+
for more information. Credits to @neznaika0 for reporting.
11+
* **Security** fix: ensure csrf token is string by @datlechin in https://github.com/codeigniter4/CodeIgniter4/pull/9365
12+
13+
### Fixed Bugs
14+
15+
* fix: gather affected rows after query call failed by @michalsn in https://github.com/codeigniter4/CodeIgniter4/pull/9363
16+
17+
### Refactoring
18+
19+
* refactor: use more strict result check on preg_match_all() result by @samsonasik in https://github.com/codeigniter4/CodeIgniter4/pull/9361
20+
* refactor: Fix phpstan if.condNotBoolean by @neznaika0 in https://github.com/codeigniter4/CodeIgniter4/pull/9368
21+
* refactor: Fix phpstan when delete string key by @neznaika0 in https://github.com/codeigniter4/CodeIgniter4/pull/9369
22+
* refactor: Fix phpstan greaterOrEqual.invalid by @neznaika0 in https://github.com/codeigniter4/CodeIgniter4/pull/9370
23+
* refactor: Fix phpstan nullCoalesce by @neznaika0 in https://github.com/codeigniter4/CodeIgniter4/pull/9374
24+
* refactor: Fix phpstan isset offset by @neznaika0 in https://github.com/codeigniter4/CodeIgniter4/pull/9383
25+
* refactor: Fix phpstan return.missing by @neznaika0 in https://github.com/codeigniter4/CodeIgniter4/pull/9382
26+
* refactor: Fix phpstan booleanAnd.rightAlwaysTrue by @neznaika0 in https://github.com/codeigniter4/CodeIgniter4/pull/9367
27+
* refactor: Fix phpstan codeigniter.configArgumentInstanceof by @neznaika0 in https://github.com/codeigniter4/CodeIgniter4/pull/9390
28+
* refactor: Use `strtolower` with `str_contains`/`str_**_with` as replacement for `stripos` by @paulbalandan in https://github.com/codeigniter4/CodeIgniter4/pull/9414
29+
330
## [v4.5.7](https://github.com/codeigniter4/CodeIgniter4/tree/v4.5.7) (2024-12-31)
431
[Full Changelog](https://github.com/codeigniter4/CodeIgniter4/compare/v4.5.6...v4.5.7)
532

LICENSE

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
The MIT License (MIT)
22

33
Copyright (c) 2014-2019 British Columbia Institute of Technology
4-
Copyright (c) 2019-2024 CodeIgniter Foundation
4+
Copyright (c) 2019-present CodeIgniter Foundation
55

66
Permission is hereby granted, free of charge, to any person obtaining a copy
77
of this software and associated documentation files (the "Software"), to deal

admin/create-new-changelog.php

+5-5
Original file line numberDiff line numberDiff line change
@@ -47,20 +47,20 @@ function replace_file_content(string $path, string $pattern, string $replace): v
4747
replace_file_content(
4848
$changelogIndex,
4949
'/\.\. toctree::\n :titlesonly:\n/u',
50-
".. toctree::\n :titlesonly:\n\n v{$version}"
50+
".. toctree::\n :titlesonly:\n\n v{$version}",
5151
);
5252
// Replace {version}
5353
$length = mb_strlen("Version {$version}");
5454
$underline = str_repeat('#', $length);
5555
replace_file_content(
5656
$changelog,
5757
'/#################\nVersion {version}\n#################/u',
58-
"{$underline}\nVersion {$version}\n{$underline}"
58+
"{$underline}\nVersion {$version}\n{$underline}",
5959
);
6060
replace_file_content(
6161
$changelog,
6262
'/{version}/u',
63-
"{$version}"
63+
"{$version}",
6464
);
6565

6666
// Copy upgrading
@@ -72,15 +72,15 @@ function replace_file_content(string $path, string $pattern, string $replace): v
7272
replace_file_content(
7373
$upgradingIndex,
7474
'/ backward_compatibility_notes\n/u',
75-
" backward_compatibility_notes\n\n upgrade_{$versionWithoutDots}"
75+
" backward_compatibility_notes\n\n upgrade_{$versionWithoutDots}",
7676
);
7777
// Replace {version}
7878
$length = mb_strlen("Upgrading from {$versionCurrent} to {$version}");
7979
$underline = str_repeat('#', $length);
8080
replace_file_content(
8181
$upgrading,
8282
'/##############################\nUpgrading from {version} to {version}\n##############################/u',
83-
"{$underline}\nUpgrading from {$versionCurrent} to {$version}\n{$underline}"
83+
"{$underline}\nUpgrading from {$versionCurrent} to {$version}\n{$underline}",
8484
);
8585

8686
// Commits

admin/prepare-release.php

+6-6
Original file line numberDiff line numberDiff line change
@@ -33,39 +33,39 @@ function replace_file_content(string $path, string $pattern, string $replace): v
3333
replace_file_content(
3434
'./system/CodeIgniter.php',
3535
'/public const CI_VERSION = \'.*?\';/u',
36-
"public const CI_VERSION = '{$version}';"
36+
"public const CI_VERSION = '{$version}';",
3737
);
3838

3939
// Updates version number in "conf.py".
4040
replace_file_content(
4141
'./user_guide_src/source/conf.py',
4242
'/^version = \'.*?\'/mu',
43-
"version = '{$minor}'"
43+
"version = '{$minor}'",
4444
);
4545
replace_file_content(
4646
'./user_guide_src/source/conf.py',
4747
'/^release = \'.*?\'/mu',
48-
"release = '{$version}'"
48+
"release = '{$version}'",
4949
);
5050

5151
// Updates version number in "phpdoc.dist.xml".
5252
replace_file_content(
5353
'./phpdoc.dist.xml',
5454
'!<title>CodeIgniter v.*? API</title>!mu',
55-
"<title>CodeIgniter v{$minor} API</title>"
55+
"<title>CodeIgniter v{$minor} API</title>",
5656
);
5757
replace_file_content(
5858
'./phpdoc.dist.xml',
5959
'/<version number=".*?">/mu',
60-
"<version number=\"{$version}\">"
60+
"<version number=\"{$version}\">",
6161
);
6262

6363
// Updates release date in changelogs.
6464
$date = date('F j, Y');
6565
replace_file_content(
6666
"./user_guide_src/source/changelogs/v{$version}.rst",
6767
'/^Release Date: .*/mu',
68-
"Release Date: {$date}"
68+
"Release Date: {$date}",
6969
);
7070

7171
// Commits

admin/starter/tests/unit/HealthTest.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public function testBaseUrlHasBeenSet(): void
3232
$config = new App();
3333
$this->assertTrue(
3434
$validation->check($config->baseURL, 'valid_url'),
35-
'baseURL "' . $config->baseURL . '" in .env is not valid URL'
35+
'baseURL "' . $config->baseURL . '" in .env is not valid URL',
3636
);
3737
}
3838

@@ -43,7 +43,7 @@ public function testBaseUrlHasBeenSet(): void
4343
// BaseURL in app/Config/App.php is a valid URL?
4444
$this->assertTrue(
4545
$validation->check($reader->baseURL, 'valid_url'),
46-
'baseURL "' . $reader->baseURL . '" in app/Config/App.php is not valid URL'
46+
'baseURL "' . $reader->baseURL . '" in app/Config/App.php is not valid URL',
4747
);
4848
}
4949
}

composer.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
"phpunit/phpcov": "^9.0.2 || ^10.0",
2929
"phpunit/phpunit": "^10.5.16 || ^11.2",
3030
"predis/predis": "^1.1 || ^2.0",
31-
"rector/rector": "2.0.4",
31+
"rector/rector": "2.0.6",
3232
"shipmonk/phpstan-baseline-per-identifier": "^2.0"
3333
},
3434
"replace": {

phpdoc.dist.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<output>api/build/</output>
1111
<cache>api/cache/</cache>
1212
</paths>
13-
<version number="4.5.7">
13+
<version number="4.5.8">
1414
<api format="php">
1515
<source dsn=".">
1616
<path>system</path>

phpunit.xml.dist

-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
failOnWarning="true"
1212
cacheDirectory="build/.phpunit.cache">
1313
<coverage
14-
includeUncoveredFiles="true"
1514
pathCoverage="false"
1615
ignoreDeprecatedCodeUnits="true"
1716
disableCodeCoverageIgnore="true">

preload.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public function load(): void
8686
$phpFiles = new RegexIterator(
8787
$fullTree,
8888
'/.+((?<!Test)+\.php$)/i',
89-
RecursiveRegexIterator::GET_MATCH
89+
RecursiveRegexIterator::GET_MATCH,
9090
);
9191

9292
foreach ($phpFiles as $key => $file) {

public/index.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
$message = sprintf(
1212
'Your PHP version must be %s or higher to run CodeIgniter. Current version: %s',
1313
$minPhpVersion,
14-
PHP_VERSION
14+
PHP_VERSION,
1515
);
1616

1717
header('HTTP/1.1 503 Service Unavailable.', true, 503);

rector.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
->withCache(
6363
// Github action cache or local
6464
is_dir('/tmp') ? '/tmp/rector' : null,
65-
FileCacheStorage::class
65+
FileCacheStorage::class,
6666
)
6767
// paths to refactor; solid alternative to CLI arguments
6868
->withPaths([

spark

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ if (version_compare(PHP_VERSION, $minPhpVersion, '<')) {
4040
$message = sprintf(
4141
'Your PHP version must be %s or higher to run CodeIgniter. Current version: %s',
4242
$minPhpVersion,
43-
PHP_VERSION
43+
PHP_VERSION,
4444
);
4545

4646
exit($message);

system/API/ResponseTrait.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ protected function format($data = null)
319319
$mime = $this->request->negotiate(
320320
'media',
321321
$format->getConfig()->supportedResponseFormats,
322-
false
322+
false,
323323
);
324324
}
325325

system/Autoloader/Autoloader.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ public function sanitizeFilename(string $filename): string
347347

348348
throw new InvalidArgumentException(
349349
'The file path contains special characters "' . $chars
350-
. '" that are not allowed: "' . $filename . '"'
350+
. '" that are not allowed: "' . $filename . '"',
351351
);
352352
}
353353
if ($result === false) {
@@ -386,7 +386,7 @@ private function loadComposerNamespaces(ClassLoader $composer, array $composerPa
386386
throw new RuntimeException(
387387
'Your Composer version is too old.'
388388
. ' Please update Composer (run `composer self-update`) to v2.0.14 or later'
389-
. ' and remove your vendor/ directory, and run `composer update`.'
389+
. ' and remove your vendor/ directory, and run `composer update`.',
390390
);
391391
}
392392
// This method requires Composer 2.0.14 or later.

system/Autoloader/FileLocator.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -295,9 +295,9 @@ public function findQualifiedNameFromPath(string $path)
295295
str_replace(
296296
'/',
297297
'\\',
298-
mb_substr($path, mb_strlen($namespace['path']))
298+
mb_substr($path, mb_strlen($namespace['path'])),
299299
),
300-
'\\'
300+
'\\',
301301
);
302302
// Remove the file extension (.php)
303303
$className = mb_substr($className, 0, -4);

system/BaseModel.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ protected function createDataConverter(): void
379379
$this->converter = new DataConverter(
380380
$this->casts,
381381
$this->castHandlers,
382-
$this->db
382+
$this->db,
383383
);
384384
}
385385
}
@@ -1081,7 +1081,7 @@ public function updateBatch(?array $set = null, ?string $index = null, int $batc
10811081
if ($updateIndex === null) {
10821082
throw new InvalidArgumentException(
10831083
'The index ("' . $index . '") for updateBatch() is missing in the data: '
1084-
. json_encode($row)
1084+
. json_encode($row),
10851085
);
10861086
}
10871087

system/Boot.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ protected static function checkMissingExtensions(): void
288288

289289
$message = sprintf(
290290
'The framework needs the following extension(s) installed and loaded: %s.',
291-
implode(', ', $missingExtensions)
291+
implode(', ', $missingExtensions),
292292
);
293293

294294
header('HTTP/1.1 503 Service Unavailable.', true, 503);

system/CLI/CLI.php

+4-4
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ public static function promptByKey($text, array $options, $validation = null): s
289289

290290
CLI::isZeroOptions($options);
291291

292-
if ($line = array_shift($text)) {
292+
if (($line = array_shift($text)) !== null) {
293293
CLI::write($line);
294294
}
295295

@@ -348,7 +348,7 @@ public static function promptByMultipleKeys(string $text, array $options): array
348348
// return the prompt again if $input contain(s) non-numeric character, except a comma.
349349
// And if max from $options less than max from input,
350350
// it means user tried to access null value in $options
351-
if ($pattern === 0 || $maxOptions < $maxInput) {
351+
if ($pattern < 1 || $maxOptions < $maxInput) {
352352
static::error('Please select correctly.');
353353
CLI::newLine();
354354

@@ -610,11 +610,11 @@ public static function color(string $text, string $foreground, ?string $backgrou
610610
$nonColoredText = preg_replace(
611611
$pattern,
612612
'<<__colored_string__>>',
613-
$text
613+
$text,
614614
);
615615
$nonColoredChunks = preg_split(
616616
'/<<__colored_string__>>/u',
617-
$nonColoredText
617+
$nonColoredText,
618618
);
619619

620620
foreach ($nonColoredChunks as $i => $chunk) {

system/CLI/Console.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public function showHeader(bool $suppress = false)
6363
'CodeIgniter v%s Command Line Tool - Server Time: %s UTC%s',
6464
CodeIgniter::CI_VERSION,
6565
date('Y-m-d H:i:s'),
66-
date('P')
66+
date('P'),
6767
), 'green');
6868
CLI::newLine();
6969
}

0 commit comments

Comments
 (0)