Browse Source

[php] Fix Codeigniter & update to v4.4.1 (#8412)

* [php] Fix Codeigniter & update to v4.4.1

* Delete Workerman WIP
Joan Miquel 1 year ago
parent
commit
c7f4a6ab72
43 changed files with 731 additions and 782 deletions
  1. 0 1
      frameworks/PHP/codeigniter/.env-dev
  2. 1 1
      frameworks/PHP/codeigniter/app/Common.php
  3. 37 325
      frameworks/PHP/codeigniter/app/Config/App.php
  4. 28 13
      frameworks/PHP/codeigniter/app/Config/Autoload.php
  5. 1 3
      frameworks/PHP/codeigniter/app/Config/CURLRequest.php
  6. 20 29
      frameworks/PHP/codeigniter/app/Config/Cache.php
  7. 7 19
      frameworks/PHP/codeigniter/app/Config/ContentSecurityPolicy.php
  8. 8 20
      frameworks/PHP/codeigniter/app/Config/Cookie.php
  9. 24 30
      frameworks/PHP/codeigniter/app/Config/Database.php
  10. 14 1
      frameworks/PHP/codeigniter/app/Config/DocTypes.php
  11. 28 77
      frameworks/PHP/codeigniter/app/Config/Email.php
  12. 36 11
      frameworks/PHP/codeigniter/app/Config/Encryption.php
  13. 7 0
      frameworks/PHP/codeigniter/app/Config/Events.php
  14. 55 11
      frameworks/PHP/codeigniter/app/Config/Exceptions.php
  15. 1 3
      frameworks/PHP/codeigniter/app/Config/Feature.php
  16. 9 11
      frameworks/PHP/codeigniter/app/Config/Filters.php
  17. 3 0
      frameworks/PHP/codeigniter/app/Config/ForeignCharacters.php
  18. 3 3
      frameworks/PHP/codeigniter/app/Config/Format.php
  19. 3 1
      frameworks/PHP/codeigniter/app/Config/Generators.php
  20. 13 14
      frameworks/PHP/codeigniter/app/Config/Honeypot.php
  21. 3 7
      frameworks/PHP/codeigniter/app/Config/Images.php
  22. 29 11
      frameworks/PHP/codeigniter/app/Config/Kint.php
  23. 12 18
      frameworks/PHP/codeigniter/app/Config/Logger.php
  24. 8 11
      frameworks/PHP/codeigniter/app/Config/Migrations.php
  25. 5 3
      frameworks/PHP/codeigniter/app/Config/Mimes.php
  26. 31 0
      frameworks/PHP/codeigniter/app/Config/Modules.php
  27. 2 4
      frameworks/PHP/codeigniter/app/Config/Pager.php
  28. 5 15
      frameworks/PHP/codeigniter/app/Config/Paths.php
  29. 4 46
      frameworks/PHP/codeigniter/app/Config/Routes.php
  30. 113 0
      frameworks/PHP/codeigniter/app/Config/Routing.php
  31. 9 25
      frameworks/PHP/codeigniter/app/Config/Security.php
  32. 102 0
      frameworks/PHP/codeigniter/app/Config/Session.php
  33. 32 13
      frameworks/PHP/codeigniter/app/Config/Toolbar.php
  34. 4 4
      frameworks/PHP/codeigniter/app/Config/UserAgents.php
  35. 6 6
      frameworks/PHP/codeigniter/app/Config/Validation.php
  36. 7 2
      frameworks/PHP/codeigniter/app/Controllers/BaseController.php
  37. 1 1
      frameworks/PHP/codeigniter/app/Controllers/Home.php
  38. 3 3
      frameworks/PHP/codeigniter/app/Views/errors/html/error_404.php
  39. 21 26
      frameworks/PHP/codeigniter/app/Views/errors/html/error_exception.php
  40. 4 4
      frameworks/PHP/codeigniter/app/Views/errors/html/production.php
  41. 2 2
      frameworks/PHP/codeigniter/app/Views/welcome_message.php
  42. 7 6
      frameworks/PHP/codeigniter/codeigniter.dockerfile
  43. 23 2
      frameworks/PHP/codeigniter/public/index.php

+ 0 - 1
frameworks/PHP/codeigniter/.env-dev

@@ -1 +0,0 @@
-CI_ENVIRONMENT = development

+ 1 - 1
frameworks/PHP/codeigniter/app/Common.php

@@ -11,5 +11,5 @@
  * loaded early on, and may also contain additional functions
  * that you'd like to use throughout your entire application
  *
- * @see: https://codeigniter4.github.io/CodeIgniter4/
+ * @see: https://codeigniter.com/user_guide/extending/common.html
  */

+ 37 - 325
frameworks/PHP/codeigniter/app/Config/App.php

@@ -3,7 +3,6 @@
 namespace Config;
 
 use CodeIgniter\Config\BaseConfig;
-use CodeIgniter\Session\Handlers\FileHandler;
 
 class App extends BaseConfig
 {
@@ -12,19 +11,26 @@ class App extends BaseConfig
      * Base Site URL
      * --------------------------------------------------------------------------
      *
-     * URL to your CodeIgniter root. Typically this will be your base URL,
+     * URL to your CodeIgniter root. Typically, this will be your base URL,
      * WITH a trailing slash:
      *
      *    http://example.com/
+     */
+    public string $baseURL = 'http://localhost:8080/';
+
+    /**
+     * Allowed Hostnames in the Site URL other than the hostname in the baseURL.
+     * If you want to accept multiple Hostnames, set this.
      *
-     * If this is not set then CodeIgniter will try guess the protocol, domain
-     * and path to your installation. However, you should always configure this
-     * explicitly and never rely on auto-guessing, especially in production
-     * environments.
+     * E.g. When your site URL ($baseURL) is 'http://example.com/', and your site
+     *      also accepts 'http://media.example.com/' and
+     *      'http://accounts.example.com/':
+     *          ['media.example.com', 'accounts.example.com']
      *
-     * @var string
+     * @var string[]
+     * @phpstan-var list<string>
      */
-    public $baseURL = 'http://localhost:8080/';
+    public array $allowedHostnames = [];
 
     /**
      * --------------------------------------------------------------------------
@@ -34,10 +40,8 @@ class App extends BaseConfig
      * Typically this will be your index.php file, unless you've renamed it to
      * something else. If you are using mod_rewrite to remove the page set this
      * variable so that it is blank.
-     *
-     * @var string
      */
-    public $indexPage = '';
+    public string $indexPage = 'index.php';
 
     /**
      * --------------------------------------------------------------------------
@@ -53,10 +57,8 @@ class App extends BaseConfig
      * 'PATH_INFO'      Uses $_SERVER['PATH_INFO']
      *
      * WARNING: If you set this to 'PATH_INFO', URIs will always be URL-decoded!
-     *
-     * @var string
      */
-    public $uriProtocol = 'REQUEST_URI';
+    public string $uriProtocol = 'REQUEST_URI';
 
     /**
      * --------------------------------------------------------------------------
@@ -67,10 +69,8 @@ class App extends BaseConfig
      * is viewing the site from. It affects the language strings and other
      * strings (like currency markers, numbers, etc), that your program
      * should run under for this request.
-     *
-     * @var string
      */
-    public $defaultLocale = 'en';
+    public string $defaultLocale = 'en';
 
     /**
      * --------------------------------------------------------------------------
@@ -81,10 +81,8 @@ class App extends BaseConfig
      * language to use based on the value of the Accept-Language header.
      *
      * If false, no automatic detection will be performed.
-     *
-     * @var bool
      */
-    public $negotiateLocale = false;
+    public bool $negotiateLocale = false;
 
     /**
      * --------------------------------------------------------------------------
@@ -95,9 +93,11 @@ class App extends BaseConfig
      * by the application in descending order of priority. If no match is
      * found, the first locale will be used.
      *
+     * IncomingRequest::setLocale() also uses this list.
+     *
      * @var string[]
      */
-    public $supportedLocales = ['en'];
+    public array $supportedLocales = ['en'];
 
     /**
      * --------------------------------------------------------------------------
@@ -107,9 +107,9 @@ class App extends BaseConfig
      * The default timezone that will be used in your application to display
      * dates with the date helper, and can be retrieved through app_timezone()
      *
-     * @var string
+     * @see https://www.php.net/manual/en/timezones.php for list of timezones supported by PHP.
      */
-    public $appTimezone = 'America/Chicago';
+    public string $appTimezone = 'America/Chicago';
 
     /**
      * --------------------------------------------------------------------------
@@ -120,210 +120,20 @@ class App extends BaseConfig
      * that require a character set to be provided.
      *
      * @see http://php.net/htmlspecialchars for a list of supported charsets.
-     *
-     * @var string
      */
-    public $charset = 'UTF-8';
+    public string $charset = 'UTF-8';
 
     /**
      * --------------------------------------------------------------------------
-     * URI PROTOCOL
+     * Force Global Secure Requests
      * --------------------------------------------------------------------------
      *
      * If true, this will force every request made to this application to be
      * made via a secure connection (HTTPS). If the incoming request is not
      * secure, the user will be redirected to a secure version of the page
      * and the HTTP Strict Transport Security header will be set.
-     *
-     * @var bool
-     */
-    public $forceGlobalSecureRequests = false;
-
-    /**
-     * --------------------------------------------------------------------------
-     * Session Driver
-     * --------------------------------------------------------------------------
-     *
-     * The session storage driver to use:
-     * - `CodeIgniter\Session\Handlers\FileHandler`
-     * - `CodeIgniter\Session\Handlers\DatabaseHandler`
-     * - `CodeIgniter\Session\Handlers\MemcachedHandler`
-     * - `CodeIgniter\Session\Handlers\RedisHandler`
-     *
-     * @var string
-     */
-    public $sessionDriver = FileHandler::class;
-
-    /**
-     * --------------------------------------------------------------------------
-     * Session Cookie Name
-     * --------------------------------------------------------------------------
-     *
-     * The session cookie name, must contain only [0-9a-z_-] characters
-     *
-     * @var string
-     */
-    public $sessionCookieName = 'ci_session';
-
-    /**
-     * --------------------------------------------------------------------------
-     * Session Expiration
-     * --------------------------------------------------------------------------
-     *
-     * The number of SECONDS you want the session to last.
-     * Setting to 0 (zero) means expire when the browser is closed.
-     *
-     * @var int
-     */
-    public $sessionExpiration = 7200;
-
-    /**
-     * --------------------------------------------------------------------------
-     * Session Save Path
-     * --------------------------------------------------------------------------
-     *
-     * The location to save sessions to and is driver dependent.
-     *
-     * For the 'files' driver, it's a path to a writable directory.
-     * WARNING: Only absolute paths are supported!
-     *
-     * For the 'database' driver, it's a table name.
-     * Please read up the manual for the format with other session drivers.
-     *
-     * IMPORTANT: You are REQUIRED to set a valid save path!
-     *
-     * @var string
-     */
-    public $sessionSavePath = WRITEPATH . 'session';
-
-    /**
-     * --------------------------------------------------------------------------
-     * Session Match IP
-     * --------------------------------------------------------------------------
-     *
-     * Whether to match the user's IP address when reading the session data.
-     *
-     * WARNING: If you're using the database driver, don't forget to update
-     *          your session table's PRIMARY KEY when changing this setting.
-     *
-     * @var bool
-     */
-    public $sessionMatchIP = false;
-
-    /**
-     * --------------------------------------------------------------------------
-     * Session Time to Update
-     * --------------------------------------------------------------------------
-     *
-     * How many seconds between CI regenerating the session ID.
-     *
-     * @var int
-     */
-    public $sessionTimeToUpdate = 300;
-
-    /**
-     * --------------------------------------------------------------------------
-     * Session Regenerate Destroy
-     * --------------------------------------------------------------------------
-     *
-     * Whether to destroy session data associated with the old session ID
-     * when auto-regenerating the session ID. When set to FALSE, the data
-     * will be later deleted by the garbage collector.
-     *
-     * @var bool
-     */
-    public $sessionRegenerateDestroy = false;
-
-    /**
-     * --------------------------------------------------------------------------
-     * Cookie Prefix
-     * --------------------------------------------------------------------------
-     *
-     * Set a cookie name prefix if you need to avoid collisions.
-     *
-     * @var string
-     *
-     * @deprecated use Config\Cookie::$prefix property instead.
-     */
-    public $cookiePrefix = '';
-
-    /**
-     * --------------------------------------------------------------------------
-     * Cookie Domain
-     * --------------------------------------------------------------------------
-     *
-     * Set to `.your-domain.com` for site-wide cookies.
-     *
-     * @var string
-     *
-     * @deprecated use Config\Cookie::$domain property instead.
-     */
-    public $cookieDomain = '';
-
-    /**
-     * --------------------------------------------------------------------------
-     * Cookie Path
-     * --------------------------------------------------------------------------
-     *
-     * Typically will be a forward slash.
-     *
-     * @var string
-     *
-     * @deprecated use Config\Cookie::$path property instead.
-     */
-    public $cookiePath = '/';
-
-    /**
-     * --------------------------------------------------------------------------
-     * Cookie Secure
-     * --------------------------------------------------------------------------
-     *
-     * Cookie will only be set if a secure HTTPS connection exists.
-     *
-     * @var bool
-     *
-     * @deprecated use Config\Cookie::$secure property instead.
-     */
-    public $cookieSecure = false;
-
-    /**
-     * --------------------------------------------------------------------------
-     * Cookie HttpOnly
-     * --------------------------------------------------------------------------
-     *
-     * Cookie will only be accessible via HTTP(S) (no JavaScript).
-     *
-     * @var bool
-     *
-     * @deprecated use Config\Cookie::$httponly property instead.
-     */
-    public $cookieHTTPOnly = true;
-
-    /**
-     * --------------------------------------------------------------------------
-     * Cookie SameSite
-     * --------------------------------------------------------------------------
-     *
-     * Configure cookie SameSite setting. Allowed values are:
-     * - None
-     * - Lax
-     * - Strict
-     * - ''
-     *
-     * Alternatively, you can use the constant names:
-     * - `Cookie::SAMESITE_NONE`
-     * - `Cookie::SAMESITE_LAX`
-     * - `Cookie::SAMESITE_STRICT`
-     *
-     * Defaults to `Lax` for compatibility with modern browsers. Setting `''`
-     * (empty string) means default SameSite attribute set by browsers (`Lax`)
-     * will be set on cookies. If set to `None`, `$cookieSecure` must also be set.
-     *
-     * @var string|null
-     *
-     * @deprecated use Config\Cookie::$samesite property instead.
      */
-    public $cookieSameSite = 'Lax';
+    public bool $forceGlobalSecureRequests = false;
 
     /**
      * --------------------------------------------------------------------------
@@ -332,117 +142,21 @@ class App extends BaseConfig
      *
      * If your server is behind a reverse proxy, you must whitelist the proxy
      * IP addresses from which CodeIgniter should trust headers such as
-     * HTTP_X_FORWARDED_FOR and HTTP_CLIENT_IP in order to properly identify
+     * X-Forwarded-For or Client-IP in order to properly identify
      * the visitor's IP address.
      *
-     * You can use both an array or a comma-separated list of proxy addresses,
-     * as well as specifying whole subnets. Here are a few examples:
-     *
-     * Comma-separated:	'10.0.1.200,192.168.5.0/24'
-     * Array: ['10.0.1.200', '192.168.5.0/24']
-     *
-     * @var string|string[]
-     */
-    public $proxyIPs = '';
-
-    /**
-     * --------------------------------------------------------------------------
-     * CSRF Token Name
-     * --------------------------------------------------------------------------
-     *
-     * The token name.
-     *
-     * @deprecated Use `Config\Security` $tokenName property instead of using this property.
-     *
-     * @var string
-     */
-    public $CSRFTokenName = 'csrf_test_name';
-
-    /**
-     * --------------------------------------------------------------------------
-     * CSRF Header Name
-     * --------------------------------------------------------------------------
-     *
-     * The header name.
+     * You need to set a proxy IP address or IP address with subnets and
+     * the HTTP header for the client IP address.
      *
-     * @deprecated Use `Config\Security` $headerName property instead of using this property.
+     * Here are some examples:
+     *     [
+     *         '10.0.1.200'     => 'X-Forwarded-For',
+     *         '192.168.5.0/24' => 'X-Real-IP',
+     *     ]
      *
-     * @var string
+     * @var array<string, string>
      */
-    public $CSRFHeaderName = 'X-CSRF-TOKEN';
-
-    /**
-     * --------------------------------------------------------------------------
-     * CSRF Cookie Name
-     * --------------------------------------------------------------------------
-     *
-     * The cookie name.
-     *
-     * @deprecated Use `Config\Security` $cookieName property instead of using this property.
-     *
-     * @var string
-     */
-    public $CSRFCookieName = 'csrf_cookie_name';
-
-    /**
-     * --------------------------------------------------------------------------
-     * CSRF Expire
-     * --------------------------------------------------------------------------
-     *
-     * The number in seconds the token should expire.
-     *
-     * @deprecated Use `Config\Security` $expire property instead of using this property.
-     *
-     * @var int
-     */
-    public $CSRFExpire = 7200;
-
-    /**
-     * --------------------------------------------------------------------------
-     * CSRF Regenerate
-     * --------------------------------------------------------------------------
-     *
-     * Regenerate token on every submission?
-     *
-     * @deprecated Use `Config\Security` $regenerate property instead of using this property.
-     *
-     * @var bool
-     */
-    public $CSRFRegenerate = true;
-
-    /**
-     * --------------------------------------------------------------------------
-     * CSRF Redirect
-     * --------------------------------------------------------------------------
-     *
-     * Redirect to previous page with error on failure?
-     *
-     * @deprecated Use `Config\Security` $redirect property instead of using this property.
-     *
-     * @var bool
-     */
-    public $CSRFRedirect = true;
-
-    /**
-     * --------------------------------------------------------------------------
-     * CSRF SameSite
-     * --------------------------------------------------------------------------
-     *
-     * Setting for CSRF SameSite cookie token. Allowed values are:
-     * - None
-     * - Lax
-     * - Strict
-     * - ''
-     *
-     * Defaults to `Lax` as recommended in this link:
-     *
-     * @see https://portswigger.net/web-security/csrf/samesite-cookies
-     *
-     * @deprecated `Config\Cookie` $samesite property is used.
-     *
-     * @var string
-     */
-    public $CSRFSameSite = 'Lax';
+    public array $proxyIPs = [];
 
     /**
      * --------------------------------------------------------------------------
@@ -459,8 +173,6 @@ class App extends BaseConfig
      *
      * @see http://www.html5rocks.com/en/tutorials/security/content-security-policy/
      * @see http://www.w3.org/TR/CSP/
-     *
-     * @var bool
      */
-    public $CSPEnabled = false;
+    public bool $CSPEnabled = false;
 }

+ 28 - 13
frameworks/PHP/codeigniter/app/Config/Autoload.php

@@ -13,7 +13,12 @@ use CodeIgniter\Config\AutoloadConfig;
  * can find the files as needed.
  *
  * NOTE: If you use an identical key in $psr4 or $classmap, then
- * the values in this file will overwrite the framework's values.
+ *       the values in this file will overwrite the framework's values.
+ *
+ * NOTE: This class is required prior to Autoloader instantiation,
+ *       and does not extend BaseConfig.
+ *
+ * @immutable
  */
 class Autoload extends AutoloadConfig
 {
@@ -31,14 +36,13 @@ class Autoload extends AutoloadConfig
      * else you will need to modify all of those classes for this to work.
      *
      * Prototype:
-     *```
      *   $psr4 = [
      *       'CodeIgniter' => SYSTEMPATH,
-     *       'App'	       => APPPATH
+     *       'App'         => APPPATH
      *   ];
-     *```
      *
-     * @var array<string, string>
+     * @var array<string, array<int, string>|string>
+     * @phpstan-var array<string, string|list<string>>
      */
     public $psr4 = [
         APP_NAMESPACE => APPPATH, // For custom app namespace
@@ -56,11 +60,9 @@ class Autoload extends AutoloadConfig
      * were being autoloaded through a namespace.
      *
      * Prototype:
-     *```
      *   $classmap = [
      *       'MyClass'   => '/path/to/class/file.php'
      *   ];
-     *```
      *
      * @var array<string, string>
      */
@@ -75,13 +77,26 @@ class Autoload extends AutoloadConfig
      * or for loading functions.
      *
      * Prototype:
-     * ```
-     *	  $files = [
-     *	 	   '/path/to/my/file.php',
-     *    ];
-     * ```
+     *   $files = [
+     *       '/path/to/my/file.php',
+     *   ];
      *
-     * @var array<int, string>
+     * @var string[]
+     * @phpstan-var list<string>
      */
     public $files = [];
+
+    /**
+     * -------------------------------------------------------------------
+     * Helpers
+     * -------------------------------------------------------------------
+     * Prototype:
+     *   $helpers = [
+     *       'form',
+     *   ];
+     *
+     * @var string[]
+     * @phpstan-var list<string>
+     */
+    public $helpers = [];
 }

+ 1 - 3
frameworks/PHP/codeigniter/app/Config/CURLRequest.php

@@ -15,8 +15,6 @@ class CURLRequest extends BaseConfig
      *
      * If true, all the options won't be reset between requests.
      * It may cause an error request with unnecessary headers.
-     *
-     * @var bool
      */
-    public $shareOptions = true;
+    public bool $shareOptions = false;
 }

+ 20 - 29
frameworks/PHP/codeigniter/app/Config/Cache.php

@@ -2,6 +2,7 @@
 
 namespace Config;
 
+use CodeIgniter\Cache\CacheInterface;
 use CodeIgniter\Cache\Handlers\DummyHandler;
 use CodeIgniter\Cache\Handlers\FileHandler;
 use CodeIgniter\Cache\Handlers\MemcachedHandler;
@@ -19,10 +20,8 @@ class Cache extends BaseConfig
      *
      * The name of the preferred handler that should be used. If for some reason
      * it is not available, the $backupHandler will be used in its place.
-     *
-     * @var string
      */
-    public $handler = 'file';
+    public string $handler = 'file';
 
     /**
      * --------------------------------------------------------------------------
@@ -32,10 +31,8 @@ class Cache extends BaseConfig
      * The name of the handler that will be used in case the first one is
      * unreachable. Often, 'file' is used here since the filesystem is
      * always available, though that's not always practical for the app.
-     *
-     * @var string
      */
-    public $backupHandler = 'dummy';
+    public string $backupHandler = 'dummy';
 
     /**
      * --------------------------------------------------------------------------
@@ -45,11 +42,9 @@ class Cache extends BaseConfig
      * The path to where cache files should be stored, if using a file-based
      * system.
      *
-     * @var string
-     *
      * @deprecated Use the driver-specific variant under $file
      */
-    public $storePath = WRITEPATH . 'cache/';
+    public string $storePath = WRITEPATH . 'cache/';
 
     /**
      * --------------------------------------------------------------------------
@@ -59,12 +54,12 @@ class Cache extends BaseConfig
      * Whether to take the URL query string into consideration when generating
      * output cache files. Valid options are:
      *
-     *    false      = Disabled
-     *    true       = Enabled, take all query parameters into account.
-     *                 Please be aware that this may result in numerous cache
-     *                 files generated for the same page over and over again.
-     *    array('q') = Enabled, but only take into account the specified list
-     *                 of query parameters.
+     *    false = Disabled
+     *    true  = Enabled, take all query parameters into account.
+     *            Please be aware that this may result in numerous cache
+     *            files generated for the same page over and over again.
+     *    ['q'] = Enabled, but only take into account the specified list
+     *            of query parameters.
      *
      * @var bool|string[]
      */
@@ -77,10 +72,8 @@ class Cache extends BaseConfig
      *
      * This string is added to all cache item names to help avoid collisions
      * if you run multiple applications with the same cache engine.
-     *
-     * @var string
      */
-    public $prefix = '';
+    public string $prefix = '';
 
     /**
      * --------------------------------------------------------------------------
@@ -92,10 +85,8 @@ class Cache extends BaseConfig
      * WARNING: This is not used by framework handlers where 60 seconds is
      * hard-coded, but may be useful to projects and modules. This will replace
      * the hard-coded value in a future release.
-     *
-     * @var int
      */
-    public $ttl = 60;
+    public int $ttl = 60;
 
     /**
      * --------------------------------------------------------------------------
@@ -105,11 +96,10 @@ class Cache extends BaseConfig
      * A string of reserved characters that will not be allowed in keys or tags.
      * Strings that violate this restriction will cause handlers to throw.
      * Default: {}()/\@:
-     * Note: The default set is required for PSR-6 compliance.
      *
-     * @var string
+     * NOTE: The default set is required for PSR-6 compliance.
      */
-    public $reservedCharacters = '{}()/\@:';
+    public string $reservedCharacters = '{}()/\@:';
 
     /**
      * --------------------------------------------------------------------------
@@ -120,7 +110,7 @@ class Cache extends BaseConfig
      *
      * @var array<string, int|string|null>
      */
-    public $file = [
+    public array $file = [
         'storePath' => WRITEPATH . 'cache/',
         'mode'      => 0640,
     ];
@@ -134,9 +124,9 @@ class Cache extends BaseConfig
      *
      * @see https://codeigniter.com/user_guide/libraries/caching.html#memcached
      *
-     * @var array<string, boolean|int|string>
+     * @var array<string, bool|int|string>
      */
-    public $memcached = [
+    public array $memcached = [
         'host'   => '127.0.0.1',
         'port'   => 11211,
         'weight' => 1,
@@ -152,7 +142,7 @@ class Cache extends BaseConfig
      *
      * @var array<string, int|string|null>
      */
-    public $redis = [
+    public array $redis = [
         'host'     => '127.0.0.1',
         'password' => null,
         'port'     => 6379,
@@ -169,8 +159,9 @@ class Cache extends BaseConfig
      * that are listed here are allowed to be used.
      *
      * @var array<string, string>
+     * @phpstan-var array<string, class-string<CacheInterface>>
      */
-    public $validHandlers = [
+    public array $validHandlers = [
         'dummy'     => DummyHandler::class,
         'file'      => FileHandler::class,
         'memcached' => MemcachedHandler::class,

+ 7 - 19
frameworks/PHP/codeigniter/app/Config/ContentSecurityPolicy.php

@@ -21,31 +21,25 @@ class ContentSecurityPolicy extends BaseConfig
 
     /**
      * Default CSP report context
-     *
-     * @var bool
      */
-    public $reportOnly = false;
+    public bool $reportOnly = false;
 
     /**
      * Specifies a URL where a browser will send reports
      * when a content security policy is violated.
-     *
-     * @var string|null
      */
-    public $reportURI;
+    public ?string $reportURI = null;
 
     /**
      * Instructs user agents to rewrite URL schemes, changing
      * HTTP to HTTPS. This directive is for websites with
      * large numbers of old URLs that need to be rewritten.
-     *
-     * @var bool
      */
-    public $upgradeInsecureRequests = false;
+    public bool $upgradeInsecureRequests = false;
 
     // -------------------------------------------------------------------------
     // Sources allowed
-    // Note: once you set a policy to 'none', it cannot be further restricted
+    // NOTE: once you set a policy to 'none', it cannot be further restricted
     // -------------------------------------------------------------------------
 
     /**
@@ -167,22 +161,16 @@ class ContentSecurityPolicy extends BaseConfig
 
     /**
      * Nonce tag for style
-     *
-     * @var string
      */
-    public $styleNonceTag = '{csp-style-nonce}';
+    public string $styleNonceTag = '{csp-style-nonce}';
 
     /**
      * Nonce tag for script
-     *
-     * @var string
      */
-    public $scriptNonceTag = '{csp-script-nonce}';
+    public string $scriptNonceTag = '{csp-script-nonce}';
 
     /**
      * Replace nonce tag automatically
-     *
-     * @var bool
      */
-    public $autoNonce = true;
+    public bool $autoNonce = true;
 }

+ 8 - 20
frameworks/PHP/codeigniter/app/Config/Cookie.php

@@ -13,10 +13,8 @@ class Cookie extends BaseConfig
      * --------------------------------------------------------------------------
      *
      * Set a cookie name prefix if you need to avoid collisions.
-     *
-     * @var string
      */
-    public $prefix = '';
+    public string $prefix = '';
 
     /**
      * --------------------------------------------------------------------------
@@ -37,10 +35,8 @@ class Cookie extends BaseConfig
      * --------------------------------------------------------------------------
      *
      * Typically will be a forward slash.
-     *
-     * @var string
      */
-    public $path = '/';
+    public string $path = '/';
 
     /**
      * --------------------------------------------------------------------------
@@ -48,10 +44,8 @@ class Cookie extends BaseConfig
      * --------------------------------------------------------------------------
      *
      * Set to `.your-domain.com` for site-wide cookies.
-     *
-     * @var string
      */
-    public $domain = '';
+    public string $domain = '';
 
     /**
      * --------------------------------------------------------------------------
@@ -59,10 +53,8 @@ class Cookie extends BaseConfig
      * --------------------------------------------------------------------------
      *
      * Cookie will only be set if a secure HTTPS connection exists.
-     *
-     * @var bool
      */
-    public $secure = false;
+    public bool $secure = false;
 
     /**
      * --------------------------------------------------------------------------
@@ -70,10 +62,8 @@ class Cookie extends BaseConfig
      * --------------------------------------------------------------------------
      *
      * Cookie will only be accessible via HTTP(S) (no JavaScript).
-     *
-     * @var bool
      */
-    public $httponly = true;
+    public bool $httponly = true;
 
     /**
      * --------------------------------------------------------------------------
@@ -95,9 +85,9 @@ class Cookie extends BaseConfig
      * (empty string) means default SameSite attribute set by browsers (`Lax`)
      * will be set on cookies. If set to `None`, `$secure` must also be set.
      *
-     * @var string
+     * @phpstan-var 'None'|'Lax'|'Strict'|''
      */
-    public $samesite = 'Lax';
+    public string $samesite = 'Lax';
 
     /**
      * --------------------------------------------------------------------------
@@ -110,10 +100,8 @@ class Cookie extends BaseConfig
      * If this is set to `true`, cookie names should be compliant of RFC 2616's
      * list of allowed characters.
      *
-     * @var bool
-     *
      * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#attributes
      * @see https://tools.ietf.org/html/rfc2616#section-2.2
      */
-    public $raw = false;
+    public bool $raw = false;
 }

+ 24 - 30
frameworks/PHP/codeigniter/app/Config/Database.php

@@ -12,51 +12,44 @@ class Database extends Config
     /**
      * The directory that holds the Migrations
      * and Seeds directories.
-     *
-     * @var string
      */
-    public $filesPath = APPPATH . 'Database' . DIRECTORY_SEPARATOR;
+    public string $filesPath = APPPATH . 'Database' . DIRECTORY_SEPARATOR;
 
     /**
      * Lets you choose which connection group to
      * use if no other is specified.
-     *
-     * @var string
      */
-    public $defaultGroup = 'default';
+    public string $defaultGroup = 'default';
 
     /**
      * The default database connection.
-     *
-     * @var array
      */
-    public $default = [
-        'DSN'      => '',
-        'hostname' => 'tfb-database',
-        'username' => 'benchmarkdbuser',
-        'password' => 'benchmarkdbpass',
-        'database' => 'hello_world',
-        'DBDriver' => 'MySQLi',
-        'DBPrefix' => '',
-        'pConnect' => true,
-        'DBDebug'  => (ENVIRONMENT !== 'production'),
-        'charset'  => 'utf8',
-        'DBCollat' => 'utf8_general_ci',
-        'swapPre'  => '',
-        'encrypt'  => false,
-        'compress' => false,
-        'strictOn' => false,
-        'failover' => [],
-        'port'     => 3306,
+    public array $default = [
+        'DSN'          => '',
+        'hostname'     => 'tfb-database',
+        'username'     => 'benchmarkdbuser',
+        'password'     => 'benchmarkdbpass',
+        'database'     => 'hello_world',
+        'DBDriver'     => 'MySQLi',
+        'DBPrefix'     => '',
+        'pConnect'     => true,
+        'DBDebug'      => false,
+        'charset'      => 'utf8',
+        'DBCollat'     => 'utf8_general_ci',
+        'swapPre'      => '',
+        'encrypt'      => false,
+        'compress'     => false,
+        'strictOn'     => false,
+        'failover'     => [],
+        'port'         => 3306,
+        'numberNative' => false,
     ];
 
     /**
      * This database connection is used when
      * running PHPUnit database tests.
-     *
-     * @var array
      */
-    public $tests = [
+    public array $tests = [
         'DSN'         => '',
         'hostname'    => '127.0.0.1',
         'username'    => '',
@@ -65,7 +58,7 @@ class Database extends Config
         'DBDriver'    => 'SQLite3',
         'DBPrefix'    => 'db_',  // Needed to ensure we're working correctly with prefixes live. DO NOT REMOVE FOR CI DEVS
         'pConnect'    => false,
-        'DBDebug'     => (ENVIRONMENT !== 'production'),
+        'DBDebug'     => true,
         'charset'     => 'utf8',
         'DBCollat'    => 'utf8_general_ci',
         'swapPre'     => '',
@@ -75,6 +68,7 @@ class Database extends Config
         'failover'    => [],
         'port'        => 3306,
         'foreignKeys' => true,
+        'busyTimeout' => 1000,
     ];
 
     public function __construct()

+ 14 - 1
frameworks/PHP/codeigniter/app/Config/DocTypes.php

@@ -2,6 +2,9 @@
 
 namespace Config;
 
+/**
+ * @immutable
+ */
 class DocTypes
 {
     /**
@@ -9,7 +12,7 @@ class DocTypes
      *
      * @var array<string, string>
      */
-    public $list = [
+    public array $list = [
         'xhtml11'           => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">',
         'xhtml1-strict'     => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">',
         'xhtml1-trans'      => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',
@@ -30,4 +33,14 @@ class DocTypes
         'xhtml-rdfa-1'      => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">',
         'xhtml-rdfa-2'      => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.1//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-2.dtd">',
     ];
+
+    /**
+     * Whether to remove the solidus (`/`) character for void HTML elements (e.g. `<input>`)
+     * for HTML5 compatibility.
+     *
+     * Set to:
+     *    `true` - to be HTML5 compatible
+     *    `false` - to be XHTML compatible
+     */
+    public bool $html5 = true;
 }

+ 28 - 77
frameworks/PHP/codeigniter/app/Config/Email.php

@@ -6,165 +6,116 @@ use CodeIgniter\Config\BaseConfig;
 
 class Email extends BaseConfig
 {
-    /**
-     * @var string
-     */
-    public $fromEmail;
-
-    /**
-     * @var string
-     */
-    public $fromName;
-
-    /**
-     * @var string
-     */
-    public $recipients;
+    public string $fromEmail  = '';
+    public string $fromName   = '';
+    public string $recipients = '';
 
     /**
      * The "user agent"
-     *
-     * @var string
      */
-    public $userAgent = 'CodeIgniter';
+    public string $userAgent = 'CodeIgniter';
 
     /**
      * The mail sending protocol: mail, sendmail, smtp
-     *
-     * @var string
      */
-    public $protocol = 'mail';
+    public string $protocol = 'mail';
 
     /**
      * The server path to Sendmail.
-     *
-     * @var string
      */
-    public $mailPath = '/usr/sbin/sendmail';
+    public string $mailPath = '/usr/sbin/sendmail';
 
     /**
      * SMTP Server Address
-     *
-     * @var string
      */
-    public $SMTPHost;
+    public string $SMTPHost = '';
 
     /**
      * SMTP Username
-     *
-     * @var string
      */
-    public $SMTPUser;
+    public string $SMTPUser = '';
 
     /**
      * SMTP Password
-     *
-     * @var string
      */
-    public $SMTPPass;
+    public string $SMTPPass = '';
 
     /**
      * SMTP Port
-     *
-     * @var int
      */
-    public $SMTPPort = 25;
+    public int $SMTPPort = 25;
 
     /**
      * SMTP Timeout (in seconds)
-     *
-     * @var int
      */
-    public $SMTPTimeout = 5;
+    public int $SMTPTimeout = 5;
 
     /**
      * Enable persistent SMTP connections
-     *
-     * @var bool
      */
-    public $SMTPKeepAlive = false;
+    public bool $SMTPKeepAlive = false;
 
     /**
-     * SMTP Encryption. Either tls or ssl
+     * SMTP Encryption.
      *
-     * @var string
+     * @var string '', 'tls' or 'ssl'. 'tls' will issue a STARTTLS command
+     *             to the server. 'ssl' means implicit SSL. Connection on port
+     *             465 should set this to ''.
      */
-    public $SMTPCrypto = 'tls';
+    public string $SMTPCrypto = 'tls';
 
     /**
      * Enable word-wrap
-     *
-     * @var bool
      */
-    public $wordWrap = true;
+    public bool $wordWrap = true;
 
     /**
      * Character count to wrap at
-     *
-     * @var int
      */
-    public $wrapChars = 76;
+    public int $wrapChars = 76;
 
     /**
      * Type of mail, either 'text' or 'html'
-     *
-     * @var string
      */
-    public $mailType = 'text';
+    public string $mailType = 'text';
 
     /**
      * Character set (utf-8, iso-8859-1, etc.)
-     *
-     * @var string
      */
-    public $charset = 'UTF-8';
+    public string $charset = 'UTF-8';
 
     /**
      * Whether to validate the email address
-     *
-     * @var bool
      */
-    public $validate = false;
+    public bool $validate = false;
 
     /**
      * Email Priority. 1 = highest. 5 = lowest. 3 = normal
-     *
-     * @var int
      */
-    public $priority = 3;
+    public int $priority = 3;
 
     /**
      * Newline character. (Use “\r\n” to comply with RFC 822)
-     *
-     * @var string
      */
-    public $CRLF = "\r\n";
+    public string $CRLF = "\r\n";
 
     /**
      * Newline character. (Use “\r\n” to comply with RFC 822)
-     *
-     * @var string
      */
-    public $newline = "\r\n";
+    public string $newline = "\r\n";
 
     /**
      * Enable BCC Batch Mode.
-     *
-     * @var bool
      */
-    public $BCCBatchMode = false;
+    public bool $BCCBatchMode = false;
 
     /**
      * Number of emails in each BCC batch
-     *
-     * @var int
      */
-    public $BCCBatchSize = 200;
+    public int $BCCBatchSize = 200;
 
     /**
      * Enable notify message from server
-     *
-     * @var bool
      */
-    public $DSN = false;
+    public bool $DSN = false;
 }

+ 36 - 11
frameworks/PHP/codeigniter/app/Config/Encryption.php

@@ -20,10 +20,8 @@ class Encryption extends BaseConfig
      * If you use the Encryption class you must set an encryption key (seed).
      * You need to ensure it is long enough for the cipher and mode you plan to use.
      * See the user guide for more info.
-     *
-     * @var string
      */
-    public $key = '';
+    public string $key = '';
 
     /**
      * --------------------------------------------------------------------------
@@ -35,10 +33,8 @@ class Encryption extends BaseConfig
      * Available drivers:
      * - OpenSSL
      * - Sodium
-     *
-     * @var string
      */
-    public $driver = 'OpenSSL';
+    public string $driver = 'OpenSSL';
 
     /**
      * --------------------------------------------------------------------------
@@ -49,10 +45,8 @@ class Encryption extends BaseConfig
      * before it is encrypted. This value should be greater than zero.
      *
      * See the user guide for more information on padding.
-     *
-     * @var int
      */
-    public $blockSize = 16;
+    public int $blockSize = 16;
 
     /**
      * --------------------------------------------------------------------------
@@ -60,8 +54,39 @@ class Encryption extends BaseConfig
      * --------------------------------------------------------------------------
      *
      * HMAC digest to use, e.g. 'SHA512' or 'SHA256'. Default value is 'SHA512'.
+     */
+    public string $digest = 'SHA512';
+
+    /**
+     * Whether the cipher-text should be raw. If set to false, then it will be base64 encoded.
+     * This setting is only used by OpenSSLHandler.
+     *
+     * Set to false for CI3 Encryption compatibility.
+     */
+    public bool $rawData = true;
+
+    /**
+     * Encryption key info.
+     * This setting is only used by OpenSSLHandler.
+     *
+     * Set to 'encryption' for CI3 Encryption compatibility.
+     */
+    public string $encryptKeyInfo = '';
+
+    /**
+     * Authentication key info.
+     * This setting is only used by OpenSSLHandler.
+     *
+     * Set to 'authentication' for CI3 Encryption compatibility.
+     */
+    public string $authKeyInfo = '';
+
+    /**
+     * Cipher to use.
+     * This setting is only used by OpenSSLHandler.
      *
-     * @var string
+     * Set to 'AES-128-CBC' to decrypt encrypted data that encrypted
+     * by CI3 Encryption default configuration.
      */
-    public $digest = 'SHA512';
+    public string $cipher = 'AES-256-CTR';
 }

+ 7 - 0
frameworks/PHP/codeigniter/app/Config/Events.php

@@ -4,6 +4,7 @@ namespace Config;
 
 use CodeIgniter\Events\Events;
 use CodeIgniter\Exceptions\FrameworkException;
+use CodeIgniter\HotReloader\HotReloader;
 
 /*
  * --------------------------------------------------------------------
@@ -44,5 +45,11 @@ Events::on('pre_system', static function () {
     if (CI_DEBUG && ! is_cli()) {
         Events::on('DBQuery', 'CodeIgniter\Debug\Toolbar\Collectors\Database::collect');
         Services::toolbar()->respond();
+        // Hot Reload route - for framework use on the hot reloader.
+        if (ENVIRONMENT === 'development') {
+            Services::routes()->get('__hot-reload', static function () {
+                (new HotReloader())->run();
+            });
+        }
     }
 });

+ 55 - 11
frameworks/PHP/codeigniter/app/Config/Exceptions.php

@@ -3,6 +3,10 @@
 namespace Config;
 
 use CodeIgniter\Config\BaseConfig;
+use CodeIgniter\Debug\ExceptionHandler;
+use CodeIgniter\Debug\ExceptionHandlerInterface;
+use Psr\Log\LogLevel;
+use Throwable;
 
 /**
  * Setup how the exception handler works.
@@ -17,10 +21,8 @@ class Exceptions extends BaseConfig
      * through Services::Log.
      *
      * Default: true
-     *
-     * @var bool
      */
-    public $log = true;
+    public bool $log = true;
 
     /**
      * --------------------------------------------------------------------------
@@ -28,10 +30,8 @@ class Exceptions extends BaseConfig
      * --------------------------------------------------------------------------
      * Any status codes here will NOT be logged if logging is turned on.
      * By default, only 404 (Page Not Found) exceptions are ignored.
-     *
-     * @var array
      */
-    public $ignoreCodes = [404];
+    public array $ignoreCodes = [404];
 
     /**
      * --------------------------------------------------------------------------
@@ -41,10 +41,8 @@ class Exceptions extends BaseConfig
      * directories that hold the views used to generate errors.
      *
      * Default: APPPATH.'Views/errors'
-     *
-     * @var string
      */
-    public $errorViewPath = APPPATH . 'Views/errors';
+    public string $errorViewPath = APPPATH . 'Views/errors';
 
     /**
      * --------------------------------------------------------------------------
@@ -53,8 +51,54 @@ class Exceptions extends BaseConfig
      * Any data that you would like to hide from the debug trace.
      * In order to specify 2 levels, use "/" to separate.
      * ex. ['server', 'setup/password', 'secret_token']
+     */
+    public array $sensitiveDataInTrace = [];
+
+    /**
+     * --------------------------------------------------------------------------
+     * LOG DEPRECATIONS INSTEAD OF THROWING?
+     * --------------------------------------------------------------------------
+     * By default, CodeIgniter converts deprecations into exceptions. Also,
+     * starting in PHP 8.1 will cause a lot of deprecated usage warnings.
+     * Use this option to temporarily cease the warnings and instead log those.
+     * This option also works for user deprecations.
+     */
+    public bool $logDeprecations = true;
+
+    /**
+     * --------------------------------------------------------------------------
+     * LOG LEVEL THRESHOLD FOR DEPRECATIONS
+     * --------------------------------------------------------------------------
+     * If `$logDeprecations` is set to `true`, this sets the log level
+     * to which the deprecation will be logged. This should be one of the log
+     * levels recognized by PSR-3.
+     *
+     * The related `Config\Logger::$threshold` should be adjusted, if needed,
+     * to capture logging the deprecations.
+     */
+    public string $deprecationLogLevel = LogLevel::WARNING;
+
+    /*
+     * DEFINE THE HANDLERS USED
+     * --------------------------------------------------------------------------
+     * Given the HTTP status code, returns exception handler that
+     * should be used to deal with this error. By default, it will run CodeIgniter's
+     * default handler and display the error information in the expected format
+     * for CLI, HTTP, or AJAX requests, as determined by is_cli() and the expected
+     * response format.
+     *
+     * Custom handlers can be returned if you want to handle one or more specific
+     * error codes yourself like:
      *
-     * @var array
+     *      if (in_array($statusCode, [400, 404, 500])) {
+     *          return new \App\Libraries\MyExceptionHandler();
+     *      }
+     *      if ($exception instanceOf PageNotFoundException) {
+     *          return new \App\Libraries\MyExceptionHandler();
+     *      }
      */
-    public $sensitiveDataInTrace = [];
+    public function handler(int $statusCode, Throwable $exception): ExceptionHandlerInterface
+    {
+        return new ExceptionHandler($this);
+    }
 }

+ 1 - 3
frameworks/PHP/codeigniter/app/Config/Feature.php

@@ -20,10 +20,8 @@ class Feature extends BaseConfig
      *   - CodeIgniter\Router\Router::handle() uses:
      *     - property $filtersInfo, instead of $filterInfo
      *     - CodeIgniter\Router\RouteCollection::getFiltersForRoute(), instead of getFilterForRoute()
-     *
-     * @var bool
      */
-    public $multipleFilters = false;
+    public bool $multipleFilters = false;
 
     /**
      * Use improved new auto routing instead of the default legacy version.

+ 9 - 11
frameworks/PHP/codeigniter/app/Config/Filters.php

@@ -15,9 +15,10 @@ class Filters extends BaseConfig
      * Configures aliases for Filter classes to
      * make reading things nicer and simpler.
      *
-     * @var array
+     * @var array<string, string>
+     * @phpstan-var array<string, class-string>
      */
-    public $aliases = [
+    public array $aliases = [
         'csrf'          => CSRF::class,
         'toolbar'       => DebugToolbar::class,
         'honeypot'      => Honeypot::class,
@@ -29,9 +30,10 @@ class Filters extends BaseConfig
      * List of filter aliases that are always
      * applied before and after every request.
      *
-     * @var array
+     * @var array<string, array<string, array<string, string>>>|array<string, array<string>>
+     * @phpstan-var array<string, list<string>>|array<string, array<string, array<string, string>>>
      */
-    public $globals = [
+    public array $globals = [
         'before' => [
             // 'honeypot',
             // 'csrf',
@@ -53,11 +55,9 @@ class Filters extends BaseConfig
      *
      * If you use this, you should disable auto-routing because auto-routing
      * permits any HTTP method to access a controller. Accessing the controller
-     * with a method you don’t expect could bypass the filter.
-     *
-     * @var array
+     * with a method you don't expect could bypass the filter.
      */
-    public $methods = [];
+    public array $methods = [];
 
     /**
      * List of filter aliases that should run on any
@@ -65,8 +65,6 @@ class Filters extends BaseConfig
      *
      * Example:
      * 'isLoggedIn' => ['before' => ['account/*', 'profiles/*']]
-     *
-     * @var array
      */
-    public $filters = [];
+    public array $filters = [];
 }

+ 3 - 0
frameworks/PHP/codeigniter/app/Config/ForeignCharacters.php

@@ -4,6 +4,9 @@ namespace Config;
 
 use CodeIgniter\Config\ForeignCharacters as BaseForeignCharacters;
 
+/**
+ * @immutable
+ */
 class ForeignCharacters extends BaseForeignCharacters
 {
 }

+ 3 - 3
frameworks/PHP/codeigniter/app/Config/Format.php

@@ -24,7 +24,7 @@ class Format extends BaseConfig
      *
      * @var string[]
      */
-    public $supportedResponseFormats = [
+    public array $supportedResponseFormats = [
         'application/json',
         'application/xml', // machine-readable XML
         'text/xml', // human-readable XML
@@ -41,7 +41,7 @@ class Format extends BaseConfig
      *
      * @var array<string, string>
      */
-    public $formatters = [
+    public array $formatters = [
         'application/json' => JSONFormatter::class,
         'application/xml'  => XMLFormatter::class,
         'text/xml'         => XMLFormatter::class,
@@ -57,7 +57,7 @@ class Format extends BaseConfig
      *
      * @var array<string, int>
      */
-    public $formatterOptions = [
+    public array $formatterOptions = [
         'application/json' => JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES,
         'application/xml'  => 0,
         'text/xml'         => 0,

+ 3 - 1
frameworks/PHP/codeigniter/app/Config/Generators.php

@@ -25,7 +25,9 @@ class Generators extends BaseConfig
      *
      * @var array<string, string>
      */
-    public $views = [
+    public array $views = [
+        'make:cell'         => 'CodeIgniter\Commands\Generators\Views\cell.tpl.php',
+        'make:cell_view'    => 'CodeIgniter\Commands\Generators\Views\cell_view.tpl.php',
         'make:command'      => 'CodeIgniter\Commands\Generators\Views\command.tpl.php',
         'make:config'       => 'CodeIgniter\Commands\Generators\Views\config.tpl.php',
         'make:controller'   => 'CodeIgniter\Commands\Generators\Views\controller.tpl.php',

+ 13 - 14
frameworks/PHP/codeigniter/app/Config/Honeypot.php

@@ -8,36 +8,35 @@ class Honeypot extends BaseConfig
 {
     /**
      * Makes Honeypot visible or not to human
-     *
-     * @var bool
      */
-    public $hidden = true;
+    public bool $hidden = true;
 
     /**
      * Honeypot Label Content
-     *
-     * @var string
      */
-    public $label = 'Fill This Field';
+    public string $label = 'Fill This Field';
 
     /**
      * Honeypot Field Name
-     *
-     * @var string
      */
-    public $name = 'honeypot';
+    public string $name = 'honeypot';
 
     /**
      * Honeypot HTML Template
-     *
-     * @var string
      */
-    public $template = '<label>{label}</label><input type="text" name="{name}" value=""/>';
+    public string $template = '<label>{label}</label><input type="text" name="{name}" value="">';
 
     /**
      * Honeypot container
      *
-     * @var string
+     * If you enabled CSP, you can remove `style="display:none"`.
+     */
+    public string $container = '<div style="display:none">{template}</div>';
+
+    /**
+     * The id attribute for Honeypot container tag
+     *
+     * Used when CSP is enabled.
      */
-    public $container = '<div style="display:none">{template}</div>';
+    public string $containerId = 'hpc';
 }

+ 3 - 7
frameworks/PHP/codeigniter/app/Config/Images.php

@@ -10,25 +10,21 @@ class Images extends BaseConfig
 {
     /**
      * Default handler used if no other handler is specified.
-     *
-     * @var string
      */
-    public $defaultHandler = 'gd';
+    public string $defaultHandler = 'gd';
 
     /**
      * The path to the image library.
      * Required for ImageMagick, GraphicsMagick, or NetPBM.
-     *
-     * @var string
      */
-    public $libraryPath = '/usr/local/bin/convert';
+    public string $libraryPath = '/usr/local/bin/convert';
 
     /**
      * The available handler classes.
      *
      * @var array<string, string>
      */
-    public $handlers = [
+    public array $handlers = [
         'gd'      => GDHandler::class,
         'imagick' => ImageMagickHandler::class,
     ];

+ 29 - 11
frameworks/PHP/codeigniter/app/Config/Kint.php

@@ -3,7 +3,10 @@
 namespace Config;
 
 use CodeIgniter\Config\BaseConfig;
-use Kint\Renderer\Renderer;
+use Kint\Parser\ConstructablePluginInterface;
+use Kint\Renderer\AbstractRenderer;
+use Kint\Renderer\Rich\TabPluginInterface;
+use Kint\Renderer\Rich\ValuePluginInterface;
 
 /**
  * --------------------------------------------------------------------------
@@ -23,20 +26,35 @@ class Kint extends BaseConfig
     |--------------------------------------------------------------------------
     */
 
+    /**
+     * @var array<int, ConstructablePluginInterface|string>
+     * @phpstan-var list<class-string<ConstructablePluginInterface>|ConstructablePluginInterface>
+     */
     public $plugins;
-    public $maxDepth          = 6;
-    public $displayCalledFrom = true;
-    public $expanded          = false;
+
+    public int $maxDepth           = 6;
+    public bool $displayCalledFrom = true;
+    public bool $expanded          = false;
 
     /*
     |--------------------------------------------------------------------------
     | RichRenderer Settings
     |--------------------------------------------------------------------------
     */
-    public $richTheme  = 'aante-light.css';
-    public $richFolder = false;
-    public $richSort   = Renderer::SORT_FULL;
+    public string $richTheme = 'aante-light.css';
+    public bool $richFolder  = false;
+    public int $richSort     = AbstractRenderer::SORT_FULL;
+
+    /**
+     * @var array<string, string>
+     * @phpstan-var array<string, class-string<ValuePluginInterface>>
+     */
     public $richObjectPlugins;
+
+    /**
+     * @var array<string, string>
+     * @phpstan-var array<string, class-string<TabPluginInterface>>
+     */
     public $richTabPlugins;
 
     /*
@@ -44,8 +62,8 @@ class Kint extends BaseConfig
     | CLI Settings
     |--------------------------------------------------------------------------
     */
-    public $cliColors      = true;
-    public $cliForceUTF8   = false;
-    public $cliDetectWidth = true;
-    public $cliMinWidth    = 40;
+    public bool $cliColors      = true;
+    public bool $cliForceUTF8   = false;
+    public bool $cliDetectWidth = true;
+    public int $cliMinWidth     = 40;
 }

+ 12 - 18
frameworks/PHP/codeigniter/app/Config/Logger.php

@@ -38,7 +38,7 @@ class Logger extends BaseConfig
      *
      * @var array|int
      */
-    public $threshold = 4;
+    public $threshold = (ENVIRONMENT === 'production') ? 4 : 9;
 
     /**
      * --------------------------------------------------------------------------
@@ -47,10 +47,8 @@ class Logger extends BaseConfig
      *
      * Each item that is logged has an associated date. You can use PHP date
      * codes to set your own date formatting
-     *
-     * @var string
      */
-    public $dateFormat = 'Y-m-d H:i:s';
+    public string $dateFormat = 'Y-m-d H:i:s';
 
     /**
      * --------------------------------------------------------------------------
@@ -60,7 +58,7 @@ class Logger extends BaseConfig
      * The logging system supports multiple actions to be taken when something
      * is logged. This is done by allowing for multiple Handlers, special classes
      * designed to write the log to their chosen destinations, whether that is
-     * a file on the server, a cloud-based service, or even taking actions such
+     * a file on the getServer, a cloud-based service, or even taking actions such
      * as emailing the dev team.
      *
      * Each handler is defined by the class name used for that handler, and it
@@ -74,18 +72,14 @@ class Logger extends BaseConfig
      *
      * Handlers are executed in the order defined in this array, starting with
      * the handler on top and continuing down.
-     *
-     * @var array
      */
-    public $handlers = [
-
+    public array $handlers = [
         /*
          * --------------------------------------------------------------------
          * File Handler
          * --------------------------------------------------------------------
          */
         FileHandler::class => [
-
             // The log levels that this handler will handle.
             'handles' => [
                 'critical',
@@ -103,7 +97,7 @@ class Logger extends BaseConfig
              * An extension of 'php' allows for protecting the log files via basic
              * scripting, when they are to be stored under a publicly accessible directory.
              *
-             * Note: Leaving it blank will default to 'log'.
+             * NOTE: Leaving it blank will default to 'log'.
              */
             'fileExtension' => '',
 
@@ -141,14 +135,14 @@ class Logger extends BaseConfig
          * Uncomment this block to use it.
          */
         // 'CodeIgniter\Log\Handlers\ErrorlogHandler' => [
-        // 		/* The log levels this handler can handle. */
-        // 		'handles' => ['critical', 'alert', 'emergency', 'debug', 'error', 'info', 'notice', 'warning'],
+        //     /* The log levels this handler can handle. */
+        //     'handles' => ['critical', 'alert', 'emergency', 'debug', 'error', 'info', 'notice', 'warning'],
         //
-        // 		/*
-        // 		 * The message type where the error should go. Can be 0 or 4, or use the
-        // 		 * class constants: `ErrorlogHandler::TYPE_OS` (0) or `ErrorlogHandler::TYPE_SAPI` (4)
-        // 		 */
-        // 		'messageType' => 0,
+        //     /*
+        //     * The message type where the error should go. Can be 0 or 4, or use the
+        //     * class constants: `ErrorlogHandler::TYPE_OS` (0) or `ErrorlogHandler::TYPE_SAPI` (4)
+        //     */
+        //     'messageType' => 0,
         // ],
     ];
 }

+ 8 - 11
frameworks/PHP/codeigniter/app/Config/Migrations.php

@@ -15,10 +15,8 @@ class Migrations extends BaseConfig
      *
      * You should enable migrations whenever you intend to do a schema migration
      * and disable it back when you're done.
-     *
-     * @var bool
      */
-    public $enabled = true;
+    public bool $enabled = true;
 
     /**
      * --------------------------------------------------------------------------
@@ -30,10 +28,8 @@ class Migrations extends BaseConfig
      * level the system is at. It then compares the migration level in this
      * table to the $config['migration_version'] if they are not the same it
      * will migrate up. This must be set.
-     *
-     * @var string
      */
-    public $table = 'migrations';
+    public string $table = 'migrations';
 
     /**
      * --------------------------------------------------------------------------
@@ -42,14 +38,15 @@ class Migrations extends BaseConfig
      *
      * This is the format that will be used when creating new migrations
      * using the CLI command:
-     *   > php spark migrate:create
+     *   > php spark make:migration
      *
-     * Typical formats:
+     * NOTE: if you set an unsupported format, migration runner will not find
+     *       your migration files.
+     *
+     * Supported formats:
      * - YmdHis_
      * - Y-m-d-His_
      * - Y_m_d_His_
-     *
-     * @var string
      */
-    public $timestampFormat = 'Y-m-d-His_';
+    public string $timestampFormat = 'Y-m-d-His_';
 }

+ 5 - 3
frameworks/PHP/codeigniter/app/Config/Mimes.php

@@ -15,15 +15,15 @@ namespace Config;
  *
  * When working with mime types, please make sure you have the ´fileinfo´
  * extension enabled to reliably detect the media types.
+ *
+ * @immutable
  */
 class Mimes
 {
     /**
      * Map of extensions to mime types.
-     *
-     * @var array
      */
-    public static $mimes = [
+    public static array $mimes = [
         'hqx' => [
             'application/mac-binhex40',
             'application/mac-binhex',
@@ -55,6 +55,8 @@ class Mimes
         'lzh' => 'application/octet-stream',
         'exe' => [
             'application/octet-stream',
+            'application/vnd.microsoft.portable-executable',
+            'application/x-dosexec',
             'application/x-msdownload',
         ],
         'class' => 'application/octet-stream',

+ 31 - 0
frameworks/PHP/codeigniter/app/Config/Modules.php

@@ -4,6 +4,14 @@ namespace Config;
 
 use CodeIgniter\Modules\Modules as BaseModules;
 
+/**
+ * Modules Configuration.
+ *
+ * NOTE: This class is required prior to Autoloader instantiation,
+ *       and does not extend BaseConfig.
+ *
+ * @immutable
+ */
 class Modules extends BaseModules
 {
     /**
@@ -31,6 +39,29 @@ class Modules extends BaseModules
      */
     public $discoverInComposer = true;
 
+    /**
+     * The Composer package list for Auto-Discovery
+     * This setting is optional.
+     *
+     * E.g.:
+     *   [
+     *       'only' => [
+     *           // List up all packages to auto-discover
+     *           'codeigniter4/shield',
+     *       ],
+     *   ]
+     *   or
+     *   [
+     *       'exclude' => [
+     *           // List up packages to exclude.
+     *           'pestphp/pest',
+     *       ],
+     *   ]
+     *
+     * @var array
+     */
+    public $composerPackages = [];
+
     /**
      * --------------------------------------------------------------------------
      * Auto-Discovery Rules

+ 2 - 4
frameworks/PHP/codeigniter/app/Config/Pager.php

@@ -20,7 +20,7 @@ class Pager extends BaseConfig
      *
      * @var array<string, string>
      */
-    public $templates = [
+    public array $templates = [
         'default_full'   => 'CodeIgniter\Pager\Views\default_full',
         'default_simple' => 'CodeIgniter\Pager\Views\default_simple',
         'default_head'   => 'CodeIgniter\Pager\Views\default_head',
@@ -32,8 +32,6 @@ class Pager extends BaseConfig
      * --------------------------------------------------------------------------
      *
      * The default number of results shown in a single page.
-     *
-     * @var int
      */
-    public $perPage = 20;
+    public int $perPage = 20;
 }

+ 5 - 15
frameworks/PHP/codeigniter/app/Config/Paths.php

@@ -22,10 +22,8 @@ class Paths
      *
      * This must contain the name of your "system" folder. Include
      * the path if the folder is not in the same directory as this file.
-     *
-     * @var string
      */
-    public $systemDirectory = __DIR__ . '/../../vendor/codeigniter4/framework/system';
+    public string $systemDirectory = __DIR__ . '/../../vendor/codeigniter4/framework/system';
 
     /**
      * ---------------------------------------------------------------
@@ -38,10 +36,8 @@ class Paths
      * you do, use a full server path.
      *
      * @see http://codeigniter.com/user_guide/general/managing_apps.html
-     *
-     * @var string
      */
-    public $appDirectory = __DIR__ . '/..';
+    public string $appDirectory = __DIR__ . '/..';
 
     /**
      * ---------------------------------------------------------------
@@ -53,10 +49,8 @@ class Paths
      * need write permission to a single place that can be tucked away
      * for maximum security, keeping it out of the app and/or
      * system directories.
-     *
-     * @var string
      */
-    public $writableDirectory = __DIR__ . '/../../writable';
+    public string $writableDirectory = __DIR__ . '/../../writable';
 
     /**
      * ---------------------------------------------------------------
@@ -64,10 +58,8 @@ class Paths
      * ---------------------------------------------------------------
      *
      * This variable must contain the name of your "tests" directory.
-     *
-     * @var string
      */
-    public $testsDirectory = __DIR__ . '/../../tests';
+    public string $testsDirectory = __DIR__ . '/../../tests';
 
     /**
      * ---------------------------------------------------------------
@@ -78,8 +70,6 @@ class Paths
      * contains the view files used by your application. By
      * default this is in `app/Views`. This value
      * is used when no value is provided to `Services::renderer()`.
-     *
-     * @var string
      */
-    public $viewDirectory = __DIR__ . '/../Views';
+    public string $viewDirectory = __DIR__ . '/../Views';
 }

+ 4 - 46
frameworks/PHP/codeigniter/app/Config/Routes.php

@@ -1,36 +1,9 @@
 <?php
 
-namespace Config;
+use CodeIgniter\Router\RouteCollection;
 
-// Create a new instance of our RouteCollection class.
-$routes = Services::routes();
-
-// Load the system's routing file first, so that the app and ENVIRONMENT
-// can override as needed.
-if (is_file(SYSTEMPATH . 'Config/Routes.php')) {
-    require SYSTEMPATH . 'Config/Routes.php';
-}
-
-/*
- * --------------------------------------------------------------------
- * Router Setup
- * --------------------------------------------------------------------
- */
-$routes->setDefaultNamespace('App\Controllers');
-$routes->setDefaultController('Home');
-$routes->setDefaultMethod('index');
-$routes->setTranslateURIDashes(false);
-$routes->set404Override();
-// The Auto Routing (Legacy) is very dangerous. It is easy to create vulnerable apps
-// where controller filters or CSRF protection are bypassed.
-// If you don't want to define all routes, please use the Auto Routing (Improved).
-// Set `$autoRoutesImproved` to true in `app/Config/Feature.php` and set the following to true.
-// $routes->setAutoRoute(false);
-
-/*
- * --------------------------------------------------------------------
- * Route Definitions
- * --------------------------------------------------------------------
+/**
+ * @var RouteCollection $routes
  */
 
 // We get a performance increase by specifying the default
@@ -45,19 +18,4 @@ $routes->get('queries/', 'Bench::queries/1');
 $routes->get('update/(:alphanum)', 'Bench::update/$1');
 $routes->get('update/', 'Bench::update/1');
 
-/*
- * --------------------------------------------------------------------
- * Additional Routing
- * --------------------------------------------------------------------
- *
- * There will often be times that you need additional routing and you
- * need it to be able to override any defaults in this file. Environment
- * based routes is one such time. require() additional route files here
- * to make that happen.
- *
- * You will have access to the $routes object within that file without
- * needing to reload it.
- */
-if (is_file(APPPATH . 'Config/' . ENVIRONMENT . '/Routes.php')) {
-    require APPPATH . 'Config/' . ENVIRONMENT . '/Routes.php';
-}
+

+ 113 - 0
frameworks/PHP/codeigniter/app/Config/Routing.php

@@ -0,0 +1,113 @@
+<?php
+
+/**
+ * This file is part of CodeIgniter 4 framework.
+ *
+ * (c) CodeIgniter Foundation <[email protected]>
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE file that was distributed with this source code.
+ */
+
+namespace Config;
+
+use CodeIgniter\Config\Routing as BaseRouting;
+
+/**
+ * Routing configuration
+ */
+class Routing extends BaseRouting
+{
+    /**
+     * An array of files that contain route definitions.
+     * Route files are read in order, with the first match
+     * found taking precedence.
+     *
+     * Default: APPPATH . 'Config/Routes.php'
+     */
+    public array $routeFiles = [
+        APPPATH . 'Config/Routes.php',
+    ];
+
+    /**
+     * The default namespace to use for Controllers when no other
+     * namespace has been specified.
+     *
+     * Default: 'App\Controllers'
+     */
+    public string $defaultNamespace = 'App\Controllers';
+
+    /**
+     * The default controller to use when no other controller has been
+     * specified.
+     *
+     * Default: 'Home'
+     */
+    public string $defaultController = 'Home';
+
+    /**
+     * The default method to call on the controller when no other
+     * method has been set in the route.
+     *
+     * Default: 'index'
+     */
+    public string $defaultMethod = 'index';
+
+    /**
+     * Whether to translate dashes in URIs to underscores.
+     * Primarily useful when using the auto-routing.
+     *
+     * Default: false
+     */
+    public bool $translateURIDashes = false;
+
+    /**
+     * Sets the class/method that should be called if routing doesn't
+     * find a match. It can be either a closure or the controller/method
+     * name exactly like a route is defined: Users::index
+     *
+     * This setting is passed to the Router class and handled there.
+     *
+     * If you want to use a closure, you will have to set it in the
+     * class constructor or the routes file by calling:
+     *
+     * $routes->set404Override(function() {
+     *    // Do something here
+     * });
+     *
+     * Example:
+     *  public $override404 = 'App\Errors::show404';
+     */
+    public ?string $override404 = null;
+
+    /**
+     * If TRUE, the system will attempt to match the URI against
+     * Controllers by matching each segment against folders/files
+     * in APPPATH/Controllers, when a match wasn't found against
+     * defined routes.
+     *
+     * If FALSE, will stop searching and do NO automatic routing.
+     */
+    public bool $autoRoute = false;
+
+    /**
+     * If TRUE, will enable the use of the 'prioritize' option
+     * when defining routes.
+     *
+     * Default: false
+     */
+    public bool $prioritize = false;
+
+    /**
+     * Map of URI segments and namespaces. For Auto Routing (Improved).
+     *
+     * The key is the first URI segment. The value is the controller namespace.
+     * E.g.,
+     *   [
+     *       'blog' => 'Acme\Blog\Controllers',
+     *   ]
+     *
+     * @var array [ uri_segment => namespace ]
+     */
+    public array $moduleRoutes = [];
+}

+ 9 - 25
frameworks/PHP/codeigniter/app/Config/Security.php

@@ -15,7 +15,7 @@ class Security extends BaseConfig
      *
      * @var string 'cookie' or 'session'
      */
-    public $csrfProtection = 'cookie';
+    public string $csrfProtection = 'cookie';
 
     /**
      * --------------------------------------------------------------------------
@@ -23,10 +23,8 @@ class Security extends BaseConfig
      * --------------------------------------------------------------------------
      *
      * Randomize the CSRF Token for added security.
-     *
-     * @var bool
      */
-    public $tokenRandomize = false;
+    public bool $tokenRandomize = false;
 
     /**
      * --------------------------------------------------------------------------
@@ -34,10 +32,8 @@ class Security extends BaseConfig
      * --------------------------------------------------------------------------
      *
      * Token name for Cross Site Request Forgery protection.
-     *
-     * @var string
      */
-    public $tokenName = 'csrf_test_name';
+    public string $tokenName = 'csrf_test_name';
 
     /**
      * --------------------------------------------------------------------------
@@ -45,10 +41,8 @@ class Security extends BaseConfig
      * --------------------------------------------------------------------------
      *
      * Header name for Cross Site Request Forgery protection.
-     *
-     * @var string
      */
-    public $headerName = 'X-CSRF-TOKEN';
+    public string $headerName = 'X-CSRF-TOKEN';
 
     /**
      * --------------------------------------------------------------------------
@@ -56,10 +50,8 @@ class Security extends BaseConfig
      * --------------------------------------------------------------------------
      *
      * Cookie name for Cross Site Request Forgery protection.
-     *
-     * @var string
      */
-    public $cookieName = 'csrf_cookie_name';
+    public string $cookieName = 'csrf_cookie_name';
 
     /**
      * --------------------------------------------------------------------------
@@ -69,10 +61,8 @@ class Security extends BaseConfig
      * Expiration time for Cross Site Request Forgery protection cookie.
      *
      * Defaults to two hours (in seconds).
-     *
-     * @var int
      */
-    public $expires = 7200;
+    public int $expires = 7200;
 
     /**
      * --------------------------------------------------------------------------
@@ -80,10 +70,8 @@ class Security extends BaseConfig
      * --------------------------------------------------------------------------
      *
      * Regenerate CSRF Token on every submission.
-     *
-     * @var bool
      */
-    public $regenerate = true;
+    public bool $regenerate = true;
 
     /**
      * --------------------------------------------------------------------------
@@ -91,10 +79,8 @@ class Security extends BaseConfig
      * --------------------------------------------------------------------------
      *
      * Redirect to previous page with error on failure.
-     *
-     * @var bool
      */
-    public $redirect = true;
+    public bool $redirect = false;
 
     /**
      * --------------------------------------------------------------------------
@@ -109,9 +95,7 @@ class Security extends BaseConfig
      *
      * @see https://portswigger.net/web-security/csrf/samesite-cookies
      *
-     * @var string
-     *
      * @deprecated `Config\Cookie` $samesite property is used.
      */
-    public $samesite = 'Lax';
+    public string $samesite = 'Lax';
 }

+ 102 - 0
frameworks/PHP/codeigniter/app/Config/Session.php

@@ -0,0 +1,102 @@
+<?php
+
+namespace Config;
+
+use CodeIgniter\Config\BaseConfig;
+use CodeIgniter\Session\Handlers\BaseHandler;
+use CodeIgniter\Session\Handlers\FileHandler;
+
+class Session extends BaseConfig
+{
+    /**
+     * --------------------------------------------------------------------------
+     * Session Driver
+     * --------------------------------------------------------------------------
+     *
+     * The session storage driver to use:
+     * - `CodeIgniter\Session\Handlers\FileHandler`
+     * - `CodeIgniter\Session\Handlers\DatabaseHandler`
+     * - `CodeIgniter\Session\Handlers\MemcachedHandler`
+     * - `CodeIgniter\Session\Handlers\RedisHandler`
+     *
+     * @phpstan-var class-string<BaseHandler>
+     */
+    public string $driver = FileHandler::class;
+
+    /**
+     * --------------------------------------------------------------------------
+     * Session Cookie Name
+     * --------------------------------------------------------------------------
+     *
+     * The session cookie name, must contain only [0-9a-z_-] characters
+     */
+    public string $cookieName = 'ci_session';
+
+    /**
+     * --------------------------------------------------------------------------
+     * Session Expiration
+     * --------------------------------------------------------------------------
+     *
+     * The number of SECONDS you want the session to last.
+     * Setting to 0 (zero) means expire when the browser is closed.
+     */
+    public int $expiration = 7200;
+
+    /**
+     * --------------------------------------------------------------------------
+     * Session Save Path
+     * --------------------------------------------------------------------------
+     *
+     * The location to save sessions to and is driver dependent.
+     *
+     * For the 'files' driver, it's a path to a writable directory.
+     * WARNING: Only absolute paths are supported!
+     *
+     * For the 'database' driver, it's a table name.
+     * Please read up the manual for the format with other session drivers.
+     *
+     * IMPORTANT: You are REQUIRED to set a valid save path!
+     */
+    public string $savePath = WRITEPATH . 'session';
+
+    /**
+     * --------------------------------------------------------------------------
+     * Session Match IP
+     * --------------------------------------------------------------------------
+     *
+     * Whether to match the user's IP address when reading the session data.
+     *
+     * WARNING: If you're using the database driver, don't forget to update
+     *          your session table's PRIMARY KEY when changing this setting.
+     */
+    public bool $matchIP = false;
+
+    /**
+     * --------------------------------------------------------------------------
+     * Session Time to Update
+     * --------------------------------------------------------------------------
+     *
+     * How many seconds between CI regenerating the session ID.
+     */
+    public int $timeToUpdate = 300;
+
+    /**
+     * --------------------------------------------------------------------------
+     * Session Regenerate Destroy
+     * --------------------------------------------------------------------------
+     *
+     * Whether to destroy session data associated with the old session ID
+     * when auto-regenerating the session ID. When set to FALSE, the data
+     * will be later deleted by the garbage collector.
+     */
+    public bool $regenerateDestroy = false;
+
+    /**
+     * --------------------------------------------------------------------------
+     * Session Database Group
+     * --------------------------------------------------------------------------
+     *
+     * DB Group for the database session.
+     */
+    public ?string $DBGroup = null;
+}

+ 32 - 13
frameworks/PHP/codeigniter/app/Config/Toolbar.php

@@ -33,7 +33,7 @@ class Toolbar extends BaseConfig
      *
      * @var string[]
      */
-    public $collectors = [
+    public array $collectors = [
         Timers::class,
         Database::class,
         Logs::class,
@@ -49,12 +49,10 @@ class Toolbar extends BaseConfig
      * Collect Var Data
      * --------------------------------------------------------------------------
      *
-     * If set to false var data from the views will not be colleted. Usefull to
+     * If set to false var data from the views will not be colleted. Useful to
      * avoid high memory usage when there are lots of data passed to the view.
-     *
-     * @var bool
      */
-    public $collectVarData = true;
+    public bool $collectVarData = true;
 
     /**
      * --------------------------------------------------------------------------
@@ -64,10 +62,8 @@ class Toolbar extends BaseConfig
      * `$maxHistory` sets a limit on the number of past requests that are stored,
      * helping to conserve file space used to store them. You can set it to
      * 0 (zero) to not have any history stored, or -1 for unlimited history.
-     *
-     * @var int
      */
-    public $maxHistory = 20;
+    public int $maxHistory = 20;
 
     /**
      * --------------------------------------------------------------------------
@@ -76,10 +72,8 @@ class Toolbar extends BaseConfig
      *
      * The full path to the the views that are used by the toolbar.
      * This MUST have a trailing slash.
-     *
-     * @var string
      */
-    public $viewsPath = SYSTEMPATH . 'Debug/Toolbar/Views/';
+    public string $viewsPath = SYSTEMPATH . 'Debug/Toolbar/Views/';
 
     /**
      * --------------------------------------------------------------------------
@@ -92,8 +86,33 @@ class Toolbar extends BaseConfig
      * with hundreds of queries.
      *
      * `$maxQueries` defines the maximum amount of queries that will be stored.
+     */
+    public int $maxQueries = 100;
+
+    /**
+     * --------------------------------------------------------------------------
+     * Watched Directories
+     * --------------------------------------------------------------------------
+     *
+     * Contains an array of directories that will be watched for changes and
+     * used to determine if the hot-reload feature should reload the page or not.
+     * We restrict the values to keep performance as high as possible.
      *
-     * @var int
+     * NOTE: The ROOTPATH will be prepended to all values.
      */
-    public $maxQueries = 100;
+    public array $watchedDirectories = [
+        'app',
+    ];
+
+    /**
+     * --------------------------------------------------------------------------
+     * Watched File Extensions
+     * --------------------------------------------------------------------------
+     *
+     * Contains an array of file extensions that will be watched for changes and
+     * used to determine if the hot-reload feature should reload the page or not.
+     */
+    public array $watchedExtensions = [
+        'php', 'css', 'js', 'html', 'svg', 'json', 'env',
+    ];
 }

+ 4 - 4
frameworks/PHP/codeigniter/app/Config/UserAgents.php

@@ -23,7 +23,7 @@ class UserAgents extends BaseConfig
      *
      * @var array<string, string>
      */
-    public $platforms = [
+    public array $platforms = [
         'windows nt 10.0' => 'Windows 10',
         'windows nt 6.3'  => 'Windows 8.1',
         'windows nt 6.2'  => 'Windows 8',
@@ -78,7 +78,7 @@ class UserAgents extends BaseConfig
      *
      * @var array<string, string>
      */
-    public $browsers = [
+    public array $browsers = [
         'OPR'    => 'Opera',
         'Flock'  => 'Flock',
         'Edge'   => 'Spartan',
@@ -119,7 +119,7 @@ class UserAgents extends BaseConfig
      *
      * @var array<string, string>
      */
-    public $mobiles = [
+    public array $mobiles = [
         // legacy array, old values commented out
         'mobileexplorer' => 'Mobile Explorer',
         // 'openwave'             => 'Open Wave',
@@ -228,7 +228,7 @@ class UserAgents extends BaseConfig
      *
      * @var array<string, string>
      */
-    public $robots = [
+    public array $robots = [
         'googlebot'            => 'Googlebot',
         'msnbot'               => 'MSNBot',
         'baiduspider'          => 'Baiduspider',

+ 6 - 6
frameworks/PHP/codeigniter/app/Config/Validation.php

@@ -3,10 +3,10 @@
 namespace Config;
 
 use CodeIgniter\Config\BaseConfig;
-use CodeIgniter\Validation\CreditCardRules;
-use CodeIgniter\Validation\FileRules;
-use CodeIgniter\Validation\FormatRules;
-use CodeIgniter\Validation\Rules;
+use CodeIgniter\Validation\StrictRules\CreditCardRules;
+use CodeIgniter\Validation\StrictRules\FileRules;
+use CodeIgniter\Validation\StrictRules\FormatRules;
+use CodeIgniter\Validation\StrictRules\Rules;
 
 class Validation extends BaseConfig
 {
@@ -20,7 +20,7 @@ class Validation extends BaseConfig
      *
      * @var string[]
      */
-    public $ruleSets = [
+    public array $ruleSets = [
         Rules::class,
         FormatRules::class,
         FileRules::class,
@@ -33,7 +33,7 @@ class Validation extends BaseConfig
      *
      * @var array<string, string>
      */
-    public $templates = [
+    public array $templates = [
         'list'   => 'CodeIgniter\Validation\Views\list',
         'single' => 'CodeIgniter\Validation\Views\single',
     ];

+ 7 - 2
frameworks/PHP/codeigniter/app/Controllers/BaseController.php

@@ -38,7 +38,13 @@ abstract class BaseController extends Controller
     protected $helpers = [];
 
     /**
-     * Constructor.
+     * Be sure to declare properties for any property fetch you initialized.
+     * The creation of dynamic property is deprecated in PHP 8.2.
+     */
+    // protected $session;
+
+    /**
+     * @return void
      */
     public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
     {
@@ -48,6 +54,5 @@ abstract class BaseController extends Controller
         // Preload any models, libraries, etc, here.
 
         // E.g.: $this->session = \Config\Services::session();
-        
     }
 }

+ 1 - 1
frameworks/PHP/codeigniter/app/Controllers/Home.php

@@ -4,7 +4,7 @@ namespace App\Controllers;
 
 class Home extends BaseController
 {
-    public function index()
+    public function index(): string
     {
         return view('welcome_message');
     }

+ 3 - 3
frameworks/PHP/codeigniter/app/Views/errors/html/error_404.php

@@ -2,7 +2,7 @@
 <html lang="en">
 <head>
     <meta charset="utf-8">
-    <title>404 Page Not Found</title>
+    <title><?= lang('Errors.pageNotFound') ?></title>
 
     <style>
         div.logo {
@@ -70,13 +70,13 @@
 </head>
 <body>
     <div class="wrap">
-        <h1>404 - File Not Found</h1>
+        <h1>404</h1>
 
         <p>
             <?php if (ENVIRONMENT !== 'production') : ?>
                 <?= nl2br(esc($message)) ?>
             <?php else : ?>
-                Sorry! Cannot seem to find the page you were looking for.
+                <?= lang('Errors.sorryCannotFind') ?>
             <?php endif ?>
         </p>
     </div>

+ 21 - 26
frameworks/PHP/codeigniter/app/Views/errors/html/error_exception.php

@@ -1,4 +1,9 @@
-<?php $error_id = uniqid('error', true); ?>
+<?php
+use Config\Services;
+use CodeIgniter\CodeIgniter;
+
+$errorId = uniqid('error', true);
+?>
 <!doctype html>
 <html>
 <head>
@@ -6,11 +11,11 @@
     <meta name="robots" content="noindex">
 
     <title><?= esc($title) ?></title>
-    <style type="text/css">
+    <style>
         <?= preg_replace('#[\r\n\t ]+#', ' ', file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.css')) ?>
     </style>
 
-    <script type="text/javascript">
+    <script>
         <?= file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.js') ?>
     </script>
 </head>
@@ -77,16 +82,16 @@
                             <?php if (isset($row['class'])) : ?>
                                 &nbsp;&nbsp;&mdash;&nbsp;&nbsp;<?= esc($row['class'] . $row['type'] . $row['function']) ?>
                                 <?php if (! empty($row['args'])) : ?>
-                                    <?php $args_id = $error_id . 'args' . $index ?>
-                                    ( <a href="#" onclick="return toggle('<?= esc($args_id, 'attr') ?>');">arguments</a> )
-                                    <div class="args" id="<?= esc($args_id, 'attr') ?>">
+                                    <?php $argsId = $errorId . 'args' . $index ?>
+                                    ( <a href="#" onclick="return toggle('<?= esc($argsId, 'attr') ?>');">arguments</a> )
+                                    <div class="args" id="<?= esc($argsId, 'attr') ?>">
                                         <table cellspacing="0">
 
                                         <?php
                                         $params = null;
                                         // Reflection by name is not available for closure function
                                         if (substr($row['function'], -1) !== '}') {
-                                            $mirror = isset($row['class']) ? new \ReflectionMethod($row['class'], $row['function']) : new \ReflectionFunction($row['function']);
+                                            $mirror = isset($row['class']) ? new ReflectionMethod($row['class'], $row['function']) : new ReflectionFunction($row['function']);
                                             $params = $mirror->getParameters();
                                         }
 
@@ -189,7 +194,7 @@
 
             <!-- Request -->
             <div class="content" id="request">
-                <?php $request = \Config\Services::request(); ?>
+                <?php $request = Services::request(); ?>
 
                 <table>
                     <tbody>
@@ -283,21 +288,11 @@
                             </tr>
                         </thead>
                         <tbody>
-                        <?php foreach ($headers as $value) : ?>
-                            <?php
-                            if (empty($value)) {
-                                continue;
-                            }
-
-                            if (! is_array($value)) {
-                                $value = [$value];
-                            } ?>
-                            <?php foreach ($value as $h) : ?>
-                                <tr>
-                                    <td><?= esc($h->getName(), 'html') ?></td>
-                                    <td><?= esc($h->getValueLine(), 'html') ?></td>
-                                </tr>
-                            <?php endforeach; ?>
+                        <?php foreach ($headers as $header) : ?>
+                            <tr>
+                                <td><?= esc($header->getName(), 'html') ?></td>
+                                <td><?= esc($header->getValueLine(), 'html') ?></td>
+                            </tr>
                         <?php endforeach; ?>
                         </tbody>
                     </table>
@@ -307,7 +302,7 @@
 
             <!-- Response -->
             <?php
-                $response = \Config\Services::response();
+                $response = Services::response();
                 $response->setStatusCode(http_response_code());
             ?>
             <div class="content" id="response">
@@ -332,7 +327,7 @@
                             </tr>
                         </thead>
                         <tbody>
-                        <?php foreach ($headers as $name => $value) : ?>
+                        <?php foreach (array_keys($headers) as $name) : ?>
                             <tr>
                                 <td><?= esc($name, 'html') ?></td>
                                 <td><?= esc($response->getHeaderLine($name), 'html') ?></td>
@@ -387,7 +382,7 @@
             <p>
                 Displayed at <?= esc(date('H:i:sa')) ?> &mdash;
                 PHP: <?= esc(PHP_VERSION) ?>  &mdash;
-                CodeIgniter: <?= esc(\CodeIgniter\CodeIgniter::CI_VERSION) ?>
+                CodeIgniter: <?= esc(CodeIgniter::CI_VERSION) ?>
             </p>
 
         </div>

+ 4 - 4
frameworks/PHP/codeigniter/app/Views/errors/html/production.php

@@ -4,9 +4,9 @@
     <meta charset="UTF-8">
     <meta name="robots" content="noindex">
 
-    <title>Whoops!</title>
+    <title><?= lang('Errors.whoops') ?></title>
 
-    <style type="text/css">
+    <style>
         <?= preg_replace('#[\r\n\t ]+#', ' ', file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.css')) ?>
     </style>
 </head>
@@ -14,9 +14,9 @@
 
     <div class="container text-center">
 
-        <h1 class="headline">Whoops!</h1>
+        <h1 class="headline"><?= lang('Errors.whoops') ?></h1>
 
-        <p class="lead">We seem to have hit a snag. Please try again later...</p>
+        <p class="lead"><?= lang('Errors.weHitASnag') ?></p>
 
     </div>
 

+ 2 - 2
frameworks/PHP/codeigniter/app/Views/welcome_message.php

@@ -5,7 +5,7 @@
     <title>Welcome to CodeIgniter 4!</title>
     <meta name="description" content="The small framework with powerful features">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <link rel="shortcut icon" type="image/png" href="/favicon.ico"/>
+    <link rel="shortcut icon" type="image/png" href="/favicon.ico">
 
     <!-- STYLES -->
 
@@ -270,7 +270,7 @@
         <p>CodeIgniter is a community-developed open source project, with several
              venues for the community members to gather and exchange ideas. View all
              the threads on <a href="https://forum.codeigniter.com/"
-             target="_blank">CodeIgniter's forum</a>, or <a href="https://codeigniterchat.slack.com/"
+             target="_blank">CodeIgniter's forum</a>, or <a href="https://join.slack.com/t/codeigniterchat/shared_invite/zt-rl30zw00-obL1Hr1q1ATvkzVkFp8S0Q"
              target="_blank">chat on Slack</a> !</p>
 
         <h2>

+ 7 - 6
frameworks/PHP/codeigniter/codeigniter.dockerfile

@@ -6,23 +6,24 @@ RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /de
 RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \
     apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null
 
-RUN apt-get install -yqq nginx git unzip \
-    php8.1-cli php8.1-fpm php8.1-mysql php8.1-mbstring php8.1-intl php8.1-curl > /dev/null
+RUN apt-get update > /dev/null && apt-get install -yqq nginx git unzip \
+    php8.2-cli php8.2-fpm php8.2-mysql php8.2-mbstring php8.2-intl php8.2-curl > /dev/null
 
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
-COPY deploy/conf/* /etc/php/8.1/fpm/
+COPY deploy/conf/* /etc/php/8.2/fpm/
 
 ADD ./ /codeigniter
 WORKDIR /codeigniter
 
-RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.1/fpm/php-fpm.conf ; fi;
+RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi;
 
-RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet
+RUN composer install --optimize-autoloader --classmap-authoritative --no-dev 
+#--quiet
 
 RUN chmod -R 777 writable
 
 EXPOSE 8080
 
-CMD service php8.1-fpm start && \
+CMD service php8.2-fpm start && \
     nginx -c /codeigniter/deploy/nginx.conf

+ 23 - 2
frameworks/PHP/codeigniter/public/index.php

@@ -14,6 +14,9 @@ chdir(FCPATH);
  * and fires up an environment-specific bootstrapping.
  */
 
+// const CI_ENVIRONMENT = "development";
+// const CI_DEBUG = true;
+
 // Load our paths config file
 // This is the line that might need to be changed, depending on your folder structure.
 require FCPATH . '../app/Config/Paths.php';
@@ -28,13 +31,23 @@ require rtrim($paths->systemDirectory, '\\/ ') . DIRECTORY_SEPARATOR . 'bootstra
 require_once SYSTEMPATH . 'Config/DotEnv.php';
 (new CodeIgniter\Config\DotEnv(ROOTPATH))->load();
 
+// Define ENVIRONMENT
+if (! defined('ENVIRONMENT')) {
+    define('ENVIRONMENT', env('CI_ENVIRONMENT', 'production'));
+}
+
+// Load Config Cache
+// $factoriesCache = new \CodeIgniter\Cache\FactoriesCache();
+// $factoriesCache->load('config');
+// ^^^ Uncomment these lines if you want to use Config Caching.
+
 /*
  * ---------------------------------------------------------------
  * GRAB OUR CODEIGNITER INSTANCE
  * ---------------------------------------------------------------
  *
  * The CodeIgniter class contains the core functionality to make
- * the application run, and does all of the dirty work to get
+ * the application run, and does all the dirty work to get
  * the pieces all working together.
  */
 
@@ -47,8 +60,16 @@ $app->setContext('web');
  *---------------------------------------------------------------
  * LAUNCH THE APPLICATION
  *---------------------------------------------------------------
- * Now that everything is setup, it's time to actually fire
+ * Now that everything is set up, it's time to actually fire
  * up the engines and make this app do its thang.
  */
 
 $app->run();
+
+// Save Config Cache
+// $factoriesCache->save('config');
+// ^^^ Uncomment this line if you want to use Config Caching.
+
+// Exits the application, setting the exit code for CLI-based applications
+// that might be watching.
+exit(EXIT_SUCCESS);