CodeIgniter4: Bug: a tilde (~) in the path, such as within iCloud local storage, will cause CodeIgniter to fail
PHP Version
8.2
CodeIgniter4 Version
4.2.11
CodeIgniter4 Installation Method
Composer (using codeigniter4/appstarter
)
Which operating systems have you tested for this bug?
macOS
Which server did you use?
cli-server (PHP built-in webserver)
Database
none
What happened?
When a fresh composer-created CodeIgniter 4 application has a tilde(~) in its path, it crashes when staring with “php spark serve”.
This is a critical failure, because on MacOS in all filesystem areas synced to iCloud, tildes are present, like so:
/Users/moo/Library/Mobile Documents/com~apple~CloudDocs/Documents/development/swapper/vendor/codeigniter4
I moved the fresh new app out of the com~apple~CloudDocs directory tree to /Users/shared/dev/swapper, and it immediately starts up fine with “php spark serve”.
After renaming the directory from “/Users/shared/dev/swapper” to “/Users/shared/dev/~swapper”, the application immediately fails when started with “php spark serve”.
CodeIgniter_4.2.11_tilde_bug.pdf
Steps to Reproduce
- cd to directory that does not include a tilde(~), such as /Users/shared/ on MacOS.
- composer create-project codeigniter4/appstarter newApp
- cd ./newApp
- php spark serve
- newApp works as expected
- cd …/
- mv ./newApp ./~newApp
- cd ./~newApp
- php spark serve
- newApp fails due to the tilde-intolerance bug
- cd …/
- mv ./~newApp ./newApp
- cd newApp
- php spark serve now works as expected
Expected Output
php spark serve should start the application, no matter what characters are present in the path name. And ESPECIALLY tildes should be accounted for, because all MacOS users should be using iCloud to sync their files.
Anything else?
The test log on my machine:
{23-01-05 23:51}MoosacreM1ProMax:/Users/Shared/dev moo% cd swapper
{23-01-05 23:51}MoosacreM1ProMax:/Users/Shared/dev/swapper moo% php spark serve
CodeIgniter v4.2.11 Command Line Tool - Server Time: 2023-01-05 23:51:41 UTC-06:00
CodeIgniter development server started on http://localhost:8080
Press Control-C to stop.
[Thu Jan 5 23:51:41 2023] PHP 8.2.1 Development Server (http://localhost:8080) started
^C
{23-01-05 23:51}MoosacreM1ProMax:/Users/Shared/dev/swapper moo% cd ..
{23-01-05 23:51}MoosacreM1ProMax:/Users/Shared/dev moo% mv swapper \~swapper
{23-01-05 23:52}MoosacreM1ProMax:/Users/Shared/dev moo% cd \~swapper
{23-01-05 23:52}MoosacreM1ProMax:/Users/Shared/dev/~swapper moo% php spark serve
PHP Fatal error: Uncaught Error: Class "Config\App" not found in /Users/Shared/dev/~swapper/vendor/codeigniter4/framework/system/Config/Factories.php:129
Stack trace:
#0 /Users/Shared/dev/~swapper/vendor/codeigniter4/framework/system/Common.php(204): CodeIgniter\Config\Factories::__callStatic('config', Array)
#1 /Users/Shared/dev/~swapper/vendor/codeigniter4/framework/system/Config/Services.php(146): config('App')
#2 /Users/Shared/dev/~swapper/vendor/codeigniter4/framework/system/Config/BaseService.php(253): CodeIgniter\Config\Services::codeigniter(NULL, false)
#3 /Users/Shared/dev/~swapper/vendor/codeigniter4/framework/system/Config/BaseService.php(194): CodeIgniter\Config\BaseService::__callStatic('codeigniter', Array)
#4 /Users/Shared/dev/~swapper/vendor/codeigniter4/framework/system/Config/Services.php(143): CodeIgniter\Config\BaseService::getSharedInstance('codeigniter', NULL)
#5 /Users/Shared/dev/~swapper/vendor/codeigniter4/framework/system/Config/BaseService.php(253): CodeIgniter\Config\Services::codeigniter()
#6 /Users/Shared/dev/~swapper/spark(82): CodeIgniter\Config\BaseService::__callStatic('codeigniter', Array)
#7 {main}
thrown in /Users/Shared/dev/~swapper/vendor/codeigniter4/framework/system/Config/Factories.php on line 129
Fatal error: Uncaught Error: Class "Config\App" not found in /Users/Shared/dev/~swapper/vendor/codeigniter4/framework/system/Config/Factories.php:129
Stack trace:
#0 /Users/Shared/dev/~swapper/vendor/codeigniter4/framework/system/Common.php(204): CodeIgniter\Config\Factories::__callStatic('config', Array)
#1 /Users/Shared/dev/~swapper/vendor/codeigniter4/framework/system/Config/Services.php(146): config('App')
#2 /Users/Shared/dev/~swapper/vendor/codeigniter4/framework/system/Config/BaseService.php(253): CodeIgniter\Config\Services::codeigniter(NULL, false)
#3 /Users/Shared/dev/~swapper/vendor/codeigniter4/framework/system/Config/BaseService.php(194): CodeIgniter\Config\BaseService::__callStatic('codeigniter', Array)
#4 /Users/Shared/dev/~swapper/vendor/codeigniter4/framework/system/Config/Services.php(143): CodeIgniter\Config\BaseService::getSharedInstance('codeigniter', NULL)
#5 /Users/Shared/dev/~swapper/vendor/codeigniter4/framework/system/Config/BaseService.php(253): CodeIgniter\Config\Services::codeigniter()
#6 /Users/Shared/dev/~swapper/spark(82): CodeIgniter\Config\BaseService::__callStatic('codeigniter', Array)
#7 {main}
thrown in /Users/Shared/dev/~swapper/vendor/codeigniter4/framework/system/Config/Factories.php on line 129
{23-01-05 23:52}MoosacreM1ProMax:/Users/Shared/dev/~swapper moo% composer create-project codeigniter4/appstarter swapper
About this issue
- Original URL
- State: closed
- Created a year ago
- Comments: 17 (14 by maintainers)
This is not the case of URI. This is an issue in Autoloading.
I vote +1 to deprecate Autoloader->sanitizeFilename() and do not use it.
I think add
~
is the safer, In Laminas, there is~
in URI check as well as unreserved char https://github.com/laminas/laminas-uri/blob/663b050294945c7345cc3a61f3ca661d5f9e1f80/src/Uri.php#L45I forgot that we have improved the error message since v4.3.