Passed
Push — 1.0.x ( 8353d5...3a2c37 )
by Julien
21:28
created

Config::defineConst()   C

Complexity

Conditions 9
Paths 256

Size

Total Lines 10
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 9

Importance

Changes 0
Metric Value
cc 9
eloc 8
c 0
b 0
f 0
nc 256
nop 0
dl 0
loc 10
ccs 9
cts 9
cp 1
crap 9
rs 6.5222
1
<?php
2
3
/**
4
 * This file is part of the Zemit Framework.
5
 *
6
 * (c) Zemit Team <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE.txt
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Zemit\Bootstrap;
13
14
use PDO;
15
use Phalcon\Config\Config as PhalconConfig;
16
use Phalcon\Db\Column;
17
use Phalcon\Encryption\Security;
18
use Phalcon\Support\Version as PhalconVersion;
19
use Zemit\Bootstrap\Permissions\TableConfig;
20
use Zemit\Bootstrap\Permissions\WorkspaceConfig;
21
use Zemit\Locale;
22
use Zemit\Models;
23
use Zemit\Modules\Frontend;
24
use Zemit\Modules\Api;
25
use Zemit\Modules\Cli;
26
use Zemit\Mvc\Controller\Behavior;
27
use Zemit\Provider;
28
use Zemit\Support\Env;
29
use Zemit\Support\Version;
30
31
/**
32
 * Global Zemit Configuration
33
 *
34
 * @property PhalconConfig $phalcon
35
 * @property PhalconConfig $core
36
 * @property PhalconConfig $app
37
 * @property PhalconConfig $php
38
 * @property PhalconConfig $debug
39
 * @property PhalconConfig $response
40
 * @property PhalconConfig $identity
41
 * @property PhalconConfig $models
42
 * @property PhalconConfig $providers
43
 * @property PhalconConfig $logger
44
 * @property PhalconConfig $filters
45
 * @property PhalconConfig $modules
46
 * @property PhalconConfig $router
47
 * @property PhalconConfig $gravatar
48
 * @property PhalconConfig $reCaptcha
49
 * @property PhalconConfig $aws
50
 * @property PhalconConfig $locale
51
 * @property PhalconConfig $translate
52
 * @property PhalconConfig $session
53
 * @property PhalconConfig $module
54
 * @property PhalconConfig $security
55
 * @property PhalconConfig $cache
56
 * @property PhalconConfig $metadata
57
 * @property PhalconConfig $annotations
58
 * @property PhalconConfig $mailer
59
 * @property PhalconConfig $cookies
60
 * @property PhalconConfig $oauth2
61
 * @property PhalconConfig $dotenv
62
 * @property PhalconConfig $client
63
 * @property PhalconConfig $permissions
64
 */
65
class Config extends \Zemit\Config\Config
66
{
67 24
    public function defineConst(): void
68
    {
69 24
        defined('ROOT_PATH') || define('ROOT_PATH', Env::get('ROOT_PATH', getcwd()));
70 24
        defined('VENDOR_PATH') || define('VENDOR_PATH', Env::get('ROOT_PATH', 'vendor/'));
71 24
        defined('CORE_PATH') || define('CORE_PATH', Env::get('CORE_PATH', mb_substr(__DIR__, 0, mb_strlen(basename(__DIR__)) * -1)));
72 24
        defined('APP_PATH') || define('APP_PATH', Env::get('APP_PATH'));
73 24
        defined('APP_ENV') || define('APP_ENV', Env::get('APP_ENV'));
74 24
        defined('PUBLIC_PATH') || define('PUBLIC_PATH', Env::get('PUBLIC_PATH', ROOT_PATH . 'public/'));
75 24
        defined('STORAGE_PATH') || define('STORAGE_PATH', Env::get('STORAGE_PATH', ROOT_PATH . 'storage/'));
76 24
        defined('RESOURCES_PATH') || define('RESOURCES_PATH', Env::get('RESOURCES_PATH', ROOT_PATH . 'resources/'));
77
    }
78
    
79
    /**
80
     * Config Constructor
81
     * {@inheritDoc}
82
     */
83 24
    public function __construct(array $data = [], bool $insensitive = false)
84
    {
85 24
        $this->defineConst();
86 24
        $now = new \DateTimeImmutable();
87 24
        $data = $this->internalMergeAppend([
88
            
89
            /**
90
             * Phalcon settings
91
             */
92 24
            'phalcon' => [
93 24
                'name' => 'Phalcon Framework',
94 24
                'version' => (new PhalconVersion())->get(),
95 24
            ],
96
            
97
            /**
98
             * Core settings
99
             */
100 24
            'core' => [
101 24
                'name' => 'Zemit Core',
102 24
                'version' => (new Version())->get(),
103 24
                'package' => 'zemit-cms',
104 24
                'modules' => [
105 24
                    'zemit-' . \Zemit\Mvc\Module::NAME_FRONTEND => [
106 24
                        'className' => \Zemit\Modules\Frontend\Module::class,
107 24
                        'path' => CORE_PATH . 'Modules/Frontend/Module.php',
108 24
                    ],
109 24
                    'zemit-' . \Zemit\Mvc\Module::NAME_ADMIN => [
110 24
                        'className' => \Zemit\Modules\Admin\Module::class,
111 24
                        'path' => CORE_PATH . 'Modules/Admin/Module.php',
112 24
                    ],
113 24
                    'zemit-' . \Zemit\Mvc\Module::NAME_API => [
114 24
                        'className' => \Zemit\Modules\Api\Module::class,
115 24
                        'path' => CORE_PATH . 'Modules/Api/Module.php',
116 24
                    ],
117 24
                    'zemit-' . \Zemit\Mvc\Module::NAME_OAUTH2 => [
118 24
                        'className' => \Zemit\Modules\Oauth2\Module::class,
119 24
                        'path' => CORE_PATH . 'Modules/Oauth2/Module.php',
120 24
                    ],
121 24
                    'zemit-' . \Zemit\Cli\Module::NAME_CLI => [
122 24
                        'className' => \Zemit\Modules\Cli\Module::class,
123 24
                        'path' => CORE_PATH . 'Modules/Cli/Module.php',
124 24
                    ],
125 24
                ],
126 24
                'dir' => [
127 24
                    'base' => CORE_PATH,
128 24
                    'locales' => CORE_PATH . 'Locales',
129 24
                    'modules' => CORE_PATH . 'Modules',
130 24
                ],
131 24
            ],
132
            
133
            /**
134
             * Application configuration
135
             */
136 24
            'app' => [
137 24
                'name' => Env::get('APP_NAME', 'Zemit'), // Name of your application
138 24
                'namespace' => Env::get('APP_NAMESPACE', 'Zemit'), // Namespace of your application
139 24
                'version' => Env::get('APP_VERSION', date('Ymd')), // allow to set and force a specific version
140 24
                'maintenance' => Env::get('APP_MAINTENANCE', false), // Set true to force the maintenance page
141 24
                'env' => Env::get('APP_ENV', 'prod'), // Set the current environment
142 24
                'debug' => Env::get('APP_DEBUG', false), // Set true to display debug
143 24
                'cache' => Env::get('APP_CACHE', false), // Set true to activate the cache
144 24
                'minify' => Env::get('APP_MINIFY', false), // Set true to activate minifying
145 24
                'copyright' => Env::get('APP_COPYRIGHT', false), // Set true to activate the copyright
146 24
                'profiler' => Env::get('APP_PROFILER', false), // Set true to return the profiler
147 24
                'logger' => Env::get('APP_LOGGER', false), // Set true to enable logging
148 24
                'uri' => Env::get('APP_URI', '/'), // Base URI of your application
149 24
                'staticUri' => Env::get('APP_STATIC_URI', '/'), // Base URI of your application
150 24
                'encoding' => Env::get('APP_ENCODING', 'UTF-8'), // allow to set encoding to use with the application
151 24
                'timezone' => Env::get('APP_TIMEZONE', 'America/Montreal'), // allow to set timezone to use with the application
152 24
                'timeoutLimit' => Env::get('APP_TIMEOUT_LIMIT', 60), // allow to set timeout limit to use with the application
153 24
                'memoryLimit' => Env::get('APP_MEMORY_LIMIT', '256M'), // allow to set timeout limit to use with the application
154 24
                'sendEmail' => Env::get('APP_SEND_EMAIL', false), // allow to send real email or not
155
                
156 24
                'dir' => [
157
                    // project
158 24
                    'app' => Env::get('APP_PATH', APP_PATH),
159 24
                    'core' => Env::get('CORE_PATH', CORE_PATH),
160 24
                    'root' => Env::get('ROOT_PATH', ROOT_PATH),
161 24
                    'vendor' => Env::get('VENDOR_PATH', VENDOR_PATH),
162 24
                    'public' => Env::get('PUBLIC_PATH', PUBLIC_PATH),
163 24
                    'resources' => Env::get('RESOURCES_PATH', RESOURCES_PATH),
164 24
                    'storage' => Env::get('STORAGE_PATH', STORAGE_PATH),
165
                    
166
                    // app
167 24
                    'bootstrap' => Env::get('APP_BOOTSTRAP_PATH', APP_PATH . 'Bootstrap/'),
168 24
                    'common' => Env::get('APP_COMMON_PATH', APP_PATH . 'Common/'),
169 24
                    'config' => Env::get('APP_CONFIG_PATH', APP_PATH . 'Config/'),
170 24
                    'modules' => Env::get('APP_MODULES_PATH', APP_PATH . 'Modules/'),
171 24
                    'plugins' => Env::get('APP_PLUGINS_PATH', APP_PATH . 'Plugins/'),
172
                    
173
                    // storage
174 24
                    'cache' => Env::get('CACHE_PATH', STORAGE_PATH . 'cache/'),
175 24
                    'log' => Env::get('LOG_PATH', STORAGE_PATH . 'log/'),
176 24
                    'files' => Env::get('FILE_PATH', STORAGE_PATH . 'files/'),
177 24
                    'trash' => Env::get('TRASH_PATH', STORAGE_PATH . 'trash/'),
178 24
                    'tmp' => Env::get('TMP_PATH', STORAGE_PATH . 'tmp/'),
179
                    
180
                    // resources
181 24
                    'migrations' => Env::get('MIGRATIONS_PATH', RESOURCES_PATH . 'migrations/'),
182 24
                ],
183 24
            ],
184
            
185 24
            'url' => [
186 24
                'staticBaseUri' => Env::get('URL_STATIC_BASE_URI', null),
187 24
                'baseUri' => Env::get('URL_BASE_URI', '/'),
188 24
                'basePath' => Env::get('URL_BASE_PATH', '/'),
189 24
            ],
190
            
191 24
            'php' => [
192 24
                'locale' => [
193 24
                    'category' => Env::get('PHP_LOCALE_CATEGORY', LC_ALL),
194 24
                    'rest' => explode(',', Env::get('PHP_LOCALE_REST', 'fr_CA.UTF-8,French_Canada.1252')),
195 24
                ],
196 24
                'date' => [
197 24
                    'timezone' => Env::get('PHP_DATE_TIMEZONE', 'America/Montreal'),
198 24
                ],
199 24
                'ini' => [
200 24
                    'zend.exception_ignore_args' => Env::get('PHP_INI_ZEND_EXCEPTION_IGNORE_ARGS', 'On'),
201 24
                ],
202 24
            ],
203
            
204
            /**
205
             * Debug Configuration
206
             */
207 24
            'debug' => [
208 24
                'enable' => Env::get('DEBUG_ENABLE', false),
209 24
                'exception' => Env::get('DEBUG_EXCEPTION', true),
210 24
                'lowSeverity' => Env::get('DEBUG_LOW_SEVERITY', false),
211 24
                'showFiles' => Env::get('DEBUG_SHOW_FILES', true),
212 24
                'showBackTrace' => Env::get('DEBUG_SHOW_BACKTRACE', true),
213 24
                'showFileFragment' => Env::get('DEBUG_SHOW_FRAGMENT', true),
214 24
                'uri' => Env::get('DEBUG_URI'),
215 24
                'blacklist' => [
216 24
                    'server' => [
217 24
                        'PWD',
218 24
                        'PASS',
219 24
                        'PASSWD',
220 24
                        'PASSWORD',
221 24
                        'TOKEN',
222 24
                        'HASH',
223 24
                        'DB_PWD',
224 24
                        'DB_PASS',
225 24
                        'DB_PASSWD',
226 24
                        'DB_PASSWORD',
227 24
                        'DATABASE_PWD',
228 24
                        'DATABASE_PASS',
229 24
                        'DATABASE_PASSWD',
230 24
                        'DATABASE_PASSWORD',
231 24
                        'SECURITY_WORK_FACTOR',
232 24
                        'SECURITY_SALT',
233 24
                        'PASSPHRASE',
234 24
                        'SECRET',
235 24
                        'API_SECRET',
236 24
                        'API_KEY',
237 24
                    ],
238 24
                ],
239 24
            ],
240
            
241
            /**
242
             * Response Provider Configuration
243
             * - Set default security headers
244
             */
245 24
            'response' => [
246 24
                'headers' => [
247 24
                    'Content-Security-Policy-Report-Only' => Env::get('RESPONSE_HEADER_CSP_REPORT_ONLY', ''),
248 24
                    'Strict-Transport-Security' => Env::get('RESPONSE_HEADER_STRICT_TRANSPORT_SECURITY', 'max-age=63072000; includeSubDomains; preload'),
249 24
                    'X-Content-Type-Options' => Env::get('RESPONSE_HEADER_CONTENT_TYPE_OPTIONS', 'nosniff'),
250 24
                    'X-Frame-Options' => Env::get('RESPONSE_HEADER_FRAME_OPTIONS', 'Deny'),
251 24
                    'X-XSS-Protection' => Env::get('RESPONSE_HEADER_XSS_PROTECTION', 0),
252 24
                ],
253 24
                'corsHeaders' => [
254 24
                    'Access-Control-Allow-Origin' => Env::get('RESPONSE_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN', '*'),
255 24
                    'Access-Control-Allow-Methods' => Env::get('RESPONSE_HEADER_ACCESS_CONTROL_ALLOW_METHODS', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'),
256 24
                    'Access-Control-Allow-Headers' => Env::get('RESPONSE_HEADER_ACCESS_CONTROL_ALLOW_HEADERS', 'Origin, X-Requested-With, Content-Range, Content-Disposition, Content-Type, Authorization'),
257 24
                    'Access-Control-Allow-Credentials' => Env::get('RESPONSE_HEADER_ACCESS_CONTROL_ALLOW_CREDENTIALS', 'true'),
258 24
                    'Access-Control-Max-Age' => Env::get('RESPONSE_HEADER_ACCESS_CONTROL_MAX_AGE', '600'),
259 24
//                    'Access-Control-Expose-Headers' => Env::get('RESPONSE_HEADER_ACCESS_CONTROL_EXPOSE_HEADERS', '*'),
260 24
//                    'Access-Control-Request-Headers' => Env::get('RESPONSE_HEADER_ACCESS_CONTROL_REQUEST_HEADERS', ''),
261 24
//                    'Access-Control-Request-Method' => Env::get('RESPONSE_HEADER_ACCESS_CONTROL_REQUEST_METHOD', ''),
262 24
                ],
263 24
            ],
264
            
265
            /**
266
             * Identity Provider Configuration
267
             */
268 24
            'identity' => [
269 24
                'authorizationHeader' => Env::get('IDENTITY_AUTHORIZATION_HEADER', 'Authorization'),
270 24
                'adapter' => Env::get('IDENTITY_ADAPTER', 'session'), // session | database
271 24
                'mode' => Env::get('IDENTITY_SESSION_MODE', 'jwt'), // jwt | string
272 24
                'sessionKey' => Env::get('IDENTITY_SESSION_KEY', 'zemit-identity'),
273 24
                'sessionFallback' => Env::get('IDENTITY_SESSION_FALLBACK', false),
274 24
                'token' => [
275 24
                    'expiration' => $now->modify(Env::get('IDENTITY_TOKEN_EXPIRATION', '+1 day'))->getTimestamp(),
276 24
                ],
277 24
                'refreshToken' => [
278 24
                    'expiration' => $now->modify(Env::get('IDENTITY_REFRESH_TOKEN_EXPIRATION', '+7 day'))->getTimestamp(),
279 24
                ],
280 24
            ],
281
            
282
            /**
283
             *
284
             */
285 24
            'models' => [
286
                
287
                // Base system
288 24
                Models\Backup::class => Models\Backup::class,
289 24
                Models\Audit::class => Models\Audit::class,
290 24
                Models\AuditDetail::class => Models\AuditDetail::class,
291 24
                Models\Log::class => Models\Log::class,
292 24
                Models\Email::class => Models\Email::class,
293 24
                Models\Job::class => Models\Job::class,
294 24
                Models\File::class => Models\File::class,
295 24
                Models\Session::class => Models\Session::class,
296 24
                Models\Flag::class => Models\Flag::class,
297 24
                Models\Setting::class => Models\Setting::class,
298
                
299
                // Translate
300 24
                Models\Lang::class => Models\Lang::class,
301 24
                Models\Translate::class => Models\Translate::class,
302 24
                Models\TranslateField::class => Models\TranslateField::class,
303 24
                Models\TranslateTable::class => Models\TranslateTable::class,
304
                
305
                // Site & CMS
306 24
                Models\Workspace::class => Models\Workspace::class,
307 24
                Models\WorkspaceLang::class => Models\WorkspaceLang::class,
308 24
                Models\Page::class => Models\Page::class,
309 24
                Models\Post::class => Models\Post::class,
310 24
                Models\Template::class => Models\Template::class,
311 24
                Models\Table::class => Models\Table::class,
312 24
                Models\Field::class => Models\Field::class,
313
                
314
                // User & Permissions
315 24
                Models\Oauth2::class => Models\Oauth2::class,
316 24
                Models\Profile::class => Models\Profile::class,
317 24
                Models\User::class => Models\User::class,
318 24
                Models\UserType::class => Models\UserType::class,
319 24
                Models\UserGroup::class => Models\UserGroup::class,
320 24
                Models\UserRole::class => Models\UserRole::class,
321 24
                Models\UserFeature::class => Models\UserFeature::class,
322
                
323
                // Role
324 24
                Models\Role::class => Models\Role::class,
325 24
                Models\RoleRole::class => Models\RoleRole::class,
326 24
                Models\RoleFeature::class => Models\RoleFeature::class,
327
                
328
                // Group
329 24
                Models\Group::class => Models\Group::class,
330 24
                Models\GroupRole::class => Models\GroupRole::class,
331 24
                Models\GroupType::class => Models\GroupType::class,
332 24
                Models\GroupFeature::class => Models\GroupFeature::class,
333
                
334
                // Type
335 24
                Models\Type::class => Models\Type::class,
336
                
337
                // Feature
338 24
                Models\Feature::class => Models\Feature::class,
339 24
            ],
340
            
341 24
            'dataLifeCycle' => [
342 24
                'models' => [
343 24
                    Models\Log::class => Env::get('DATA_LIFE_CYCLE_LOG', 'triennially'),
344 24
                    Models\Email::class => Env::get('DATA_LIFE_CYCLE_EMAIL', 'triennially'),
345 24
                    Models\Session::class => Env::get('DATA_LIFE_CYCLE_SESSION', 'monthly'),
346 24
                    Models\Audit::class => Env::get('DATA_LIFE_CYCLE_AUDIT', 'quarterly'),
347 24
                    Models\AuditDetail::class => Env::get('DATA_LIFE_CYCLE_AUDIT_DETAIL', 'quarterly'),
348 24
                ],
349 24
                'policies' => [
350 24
                    'monthly' => [
351 24
                        'query' => [
352 24
                            'conditions' => 'createdAt < :createdAt:',
353 24
                            'bind' => ['createdAt' => $now->modify('-1 month')->format('Y-m-01 00:00:00')],
354 24
                            'bindTypes' => ['createdAt' => Column::BIND_PARAM_STR],
355 24
                        ],
356 24
                    ],
357 24
                    'quarterly' => [
358 24
                        'query' => [
359 24
                            'conditions' => 'createdAt < :createdAt:',
360 24
                            'bind' => ['createdAt' => $now->modify('-3 months')->format('Y-m-01 00:00:00')],
361 24
                            'bindTypes' => ['createdAt' => Column::BIND_PARAM_STR],
362 24
                        ],
363 24
                    ],
364 24
                    'yearly' => [
365 24
                        'query' => [
366 24
                            'conditions' => 'createdAt < :createdAt:',
367 24
                            'bind' => ['createdAt' => $now->modify('-1 year')->format('Y-01-01 00:00:00')],
368 24
                            'bindTypes' => ['createdAt' => Column::BIND_PARAM_STR],
369 24
                        ],
370 24
                    ],
371 24
                    'biennially' => [
372 24
                        'query' => [
373 24
                            'conditions' => 'createdAt < :createdAt:',
374 24
                            'bind' => ['createdAt' => $now->modify('-2 year')->format('Y-01-01 00:00:00')],
375 24
                            'bindTypes' => ['createdAt' => Column::BIND_PARAM_STR],
376 24
                        ],
377 24
                    ],
378 24
                    'triennially' => [
379 24
                        'query' => [
380 24
                            'conditions' => 'createdAt < :createdAt:',
381 24
                            'bind' => ['createdAt' => $now->modify('-3 year')->format('Y-01-01 00:00:00')],
382 24
                            'bindTypes' => ['createdAt' => Column::BIND_PARAM_STR],
383 24
                        ],
384 24
                    ],
385 24
                ],
386 24
            ],
387
            
388
            /**
389
             * Service Provider Configuration
390
             * expected => actual
391
             */
392 24
            'providers' => [
393
                // Application
394 24
                Provider\Application\ServiceProvider::class => Env::get('PROVIDER_APPLICATION', Provider\Application\ServiceProvider::class),
395 24
                Provider\Console\ServiceProvider::class => Env::get('PROVIDER_CONSOLE', Provider\Console\ServiceProvider::class),
396 24
                Provider\Debug\ServiceProvider::class => Env::get('PROVIDER_CONSOLE', Provider\Debug\ServiceProvider::class),
397 24
                Provider\Env\ServiceProvider::class => Env::get('PROVIDER_ENVIRONMENT', Provider\Env\ServiceProvider::class),
398 24
                Provider\Router\ServiceProvider::class => Env::get('PROVIDER_ROUTER', Provider\Router\ServiceProvider::class),
399 24
                Provider\Dispatcher\ServiceProvider::class => Env::get('PROVIDER_DISPATCHER', Provider\Dispatcher\ServiceProvider::class),
400 24
                Provider\Request\ServiceProvider::class => Env::get('PROVIDER_REQUEST', Provider\Request\ServiceProvider::class),
401 24
                Provider\Response\ServiceProvider::class => Env::get('PROVIDER_RESPONSE', Provider\Response\ServiceProvider::class),
402 24
                Provider\Models\ServiceProvider::class => Env::get('PROVIDER_MODELS', Provider\Models\ServiceProvider::class),
403
                
404
                // Security
405 24
                Provider\Acl\ServiceProvider::class => Env::get('PROVIDER_ACL', Provider\Acl\ServiceProvider::class),
406 24
                Provider\Security\ServiceProvider::class => Env::get('PROVIDER_SECURITY', Provider\Security\ServiceProvider::class),
407 24
                Provider\Session\ServiceProvider::class => Env::get('PROVIDER_SESSION', Provider\Session\ServiceProvider::class),
408 24
                Provider\Cookies\ServiceProvider::class => Env::get('PROVIDER_COOKIES', Provider\Cookies\ServiceProvider::class),
409 24
                Provider\Crypt\ServiceProvider::class => Env::get('PROVIDER_CRYPT', Provider\Crypt\ServiceProvider::class),
410 24
                Provider\Filter\ServiceProvider::class => Env::get('PROVIDER_FILTER', Provider\Filter\ServiceProvider::class),
411 24
                Provider\Jwt\ServiceProvider::class => Env::get('PROVIDER_JWT', Provider\Jwt\ServiceProvider::class),
412 24
                Provider\ReCaptcha\ServiceProvider::class => Env::get('PROVIDER_CAPTCHA', Provider\ReCaptcha\ServiceProvider::class),
413
                
414
                // Language
415 24
                Provider\Locale\ServiceProvider::class => Env::get('PROVIDER_LOCALE', Provider\Locale\ServiceProvider::class),
416 24
                Provider\Translate\ServiceProvider::class => Env::get('PROVIDER_TRANSLATE', Provider\Translate\ServiceProvider::class),
417
                
418
                // View
419 24
                Provider\View\ServiceProvider::class => Env::get('PROVIDER_VIEW', Provider\View\ServiceProvider::class),
420 24
                Provider\Url\ServiceProvider::class => Env::get('PROVIDER_URL', Provider\Url\ServiceProvider::class),
421 24
                Provider\Volt\ServiceProvider::class => Env::get('PROVIDER_VOLT', Provider\Volt\ServiceProvider::class),
422 24
                Provider\Tag\ServiceProvider::class => Env::get('PROVIDER_TAG', Provider\Tag\ServiceProvider::class),
423 24
                Provider\Assets\ServiceProvider::class => Env::get('PROVIDER_ASSETS', Provider\Assets\ServiceProvider::class),
424 24
                Provider\Flash\ServiceProvider::class => Env::get('PROVIDER_FLASH', Provider\Flash\ServiceProvider::class),
425 24
                Provider\Escaper\ServiceProvider::class => Env::get('PROVIDER_ESCAPER', Provider\Escaper\ServiceProvider::class),
426
                
427
                // Database & Models
428 24
                Provider\Database\ServiceProvider::class => Env::get('PROVIDER_DATABASE', Provider\Database\ServiceProvider::class),
429 24
                Provider\DatabaseReadOnly\ServiceProvider::class => Env::get('PROVIDER_DATABASE_READ_ONLY', Provider\DatabaseReadOnly\ServiceProvider::class),
430 24
                Provider\ModelsManager\ServiceProvider::class => Env::get('PROVIDER_MODELS_MANAGER', Provider\ModelsManager\ServiceProvider::class),
431
                
432
                // Profiling & Logging
433 24
                Provider\Profiler\ServiceProvider::class => Env::get('PROVIDER_PROFILER', Provider\Profiler\ServiceProvider::class),
434 24
                Provider\Logger\ServiceProvider::class => Env::get('PROVIDER_LOGGER', Provider\Logger\ServiceProvider::class),
435
                
436
                // Caching
437 24
                Provider\Annotations\ServiceProvider::class => Env::get('PROVIDER_ANNOTATIONS', Provider\Annotations\ServiceProvider::class),
438 24
                Provider\ModelsMetadata\ServiceProvider::class => Env::get('PROVIDER_MODELS_METADATA', Provider\ModelsMetadata\ServiceProvider::class),
439 24
                Provider\ModelsCache\ServiceProvider::class => Env::get('PROVIDER_MODELS_CACHE', Provider\ModelsCache\ServiceProvider::class),
440 24
                Provider\Cache\ServiceProvider::class => Env::get('PROVIDER_CACHE', Provider\Cache\ServiceProvider::class),
441
                
442
                // Identity & Auth
443 24
                Provider\Identity\ServiceProvider::class => Env::get('PROVIDER_IDENTITY', Provider\Identity\ServiceProvider::class),
444 24
                Provider\Oauth2Client\ServiceProvider::class => Env::get('PROVIDER_OAUTH_2_FACEBOOK', Provider\Oauth2Client\ServiceProvider::class),
445 24
                Provider\Oauth2Facebook\ServiceProvider::class => Env::get('PROVIDER_OAUTH_2_FACEBOOK', Provider\Oauth2Facebook\ServiceProvider::class),
446 24
                Provider\Oauth2Google\ServiceProvider::class => Env::get('PROVIDER_OAUTH_2_GOOGLE', Provider\Oauth2Google\ServiceProvider::class),
447
    
448
                // Mailing
449 24
                Provider\Mailer\ServiceProvider::class => Env::get('PROVIDER_MAILER', Provider\Mailer\ServiceProvider::class),
450 24
                Provider\Imap\ServiceProvider::class => Env::get('PROVIDER_IMAP', Provider\Imap\ServiceProvider::class),
451
                
452
                // Others
453 24
                Provider\Version\ServiceProvider::class => Env::get('PROVIDER_VERSION', Provider\Version\ServiceProvider::class),
454 24
                Provider\Helper\ServiceProvider::class => Env::get('PROVIDER_HELPER', Provider\Helper\ServiceProvider::class),
455 24
                Provider\FileSystem\ServiceProvider::class => Env::get('PROVIDER_FILE_SYSTEM', Provider\FileSystem\ServiceProvider::class),
456 24
                Provider\Utils\ServiceProvider::class => Env::get('PROVIDER_UTILS', Provider\Utils\ServiceProvider::class),
457 24
                Provider\Aws\ServiceProvider::class => Env::get('PROVIDER_AWS', Provider\Aws\ServiceProvider::class),
458 24
                Provider\OCR\ServiceProvider::class => Env::get('PROVIDER_OCR', Provider\OCR\ServiceProvider::class),
459 24
                Provider\Gravatar\ServiceProvider::class => Env::get('PROVIDER_GRAVATAR', Provider\Gravatar\ServiceProvider::class),
460 24
                Provider\Clamav\ServiceProvider::class => Env::get('PROVIDER_CLAMAV', Provider\Clamav\ServiceProvider::class),
461 24
                Provider\OpenAi\ServiceProvider::class => Env::get('PROVIDER_OPENAI', Provider\OpenAi\ServiceProvider::class),
462 24
                Provider\LoremIpsum\ServiceProvider::class => Env::get('PROVIDER_LOREM_IPSUM', Provider\LoremIpsum\ServiceProvider::class),
463 24
            ],
464
            
465
            /**
466
             * Helper Services
467
             */
468 24
            'helpers' => [
469 24
            ],
470
            
471
            /**
472
             * Filter Services
473
             */
474 24
            'filters' => [
475 24
            ],
476
            
477
            /**
478
             * Logger Configuration
479
             */
480 24
            'logger' => [
481 24
                'enable' => Env::get('LOGGER_ENABLE', false),
482
                
483 24
                'error' => Env::get('LOGGER_ERROR', false),
484 24
                'database' => Env::get('LOGGER_DATABASE', false),
485 24
                'dispatcher' => Env::get('LOGGER_DISPATCHER', false),
486 24
                'profiler' => Env::get('LOGGER_PROFILER', false),
487 24
                'mailer' => Env::get('LOGGER_MAILER', false),
488 24
                'cron' => Env::get('LOGGER_CRON', false),
489 24
                'auth' => Env::get('LOGGER_AUTH', false),
490
                
491 24
                'driver' => explode(',', Env::get('LOGGER_DRIVER', 'noop')),
492 24
                'drivers' => [
493 24
                    'noop' => [
494 24
                        'adapter' => \Phalcon\Logger\Adapter\Noop::class,
495 24
                    ],
496 24
                    'stream' => [
497 24
                        'adapter' => \Phalcon\Logger\Adapter\Stream::class,
498 24
                    ],
499 24
                    'syslog' => [
500 24
                        'adapter' => \Phalcon\Logger\Adapter\Syslog::class,
501 24
                    ],
502 24
                ],
503 24
                'default' => [
504 24
                    'path' => Env::get('LOGGER_PATH', STORAGE_PATH . '/log/'),
505 24
                    'format' => Env::get('LOGGER_FORMAT', '[%date%][%type%] %message%'),
506 24
                    'date' => Env::get('LOGGER_DATE', 'Y-m-d H:i:s'),
507 24
                    'filename' => Env::get('LOGGER_DEFAULT_FILENAME', 'zemit'),
508 24
                ],
509 24
            ],
510
            
511
            /**
512
             * Default modules
513
             */
514 24
            'modules' => [
515 24
                \Zemit\Mvc\Module::NAME_FRONTEND => [
516 24
                    'className' => \Zemit\Modules\Frontend\Module::class,
517 24
                    'path' => CORE_PATH . 'Modules/Frontend/Module.php',
518 24
                ],
519 24
                \Zemit\Mvc\Module::NAME_ADMIN => [
520 24
                    'className' => \Zemit\Modules\Admin\Module::class,
521 24
                    'path' => CORE_PATH . 'Modules/Admin/Module.php',
522 24
                ],
523 24
                \Zemit\Mvc\Module::NAME_API => [
524 24
                    'className' => \Zemit\Modules\Api\Module::class,
525 24
                    'path' => CORE_PATH . 'Modules/Api/Module.php',
526 24
                ],
527 24
                \Zemit\Mvc\Module::NAME_OAUTH2 => [
528 24
                    'className' => \Zemit\Modules\Oauth2\Module::class,
529 24
                    'path' => CORE_PATH . 'Modules/Oauth2/Module.php',
530 24
                ],
531 24
                \Zemit\Cli\Module::NAME_CLI => [
532 24
                    'className' => \Zemit\Modules\Cli\Module::class,
533 24
                    'path' => CORE_PATH . 'Modules/Cli/Module.php',
534 24
                ],
535 24
            ],
536
            
537
            /**
538
             * Default router settings
539
             */
540 24
            'router' => [
541 24
                'hostnames' => [],
542 24
                'defaults' => [
543 24
                    'namespace' => Env::get('ROUTER_DEFAULT_NAMESPACE', 'Zemit\\Modules\\Frontend\\Controllers'),
544 24
                    'module' => Env::get('ROUTER_DEFAULT_MODULE', 'frontend'),
545 24
                    'controller' => Env::get('ROUTER_DEFAULT_CONTROLLER', 'index'),
546 24
                    'action' => Env::get('ROUTER_DEFAULT_ACTION', 'index'),
547 24
                ],
548 24
                'cli' => [
549 24
                    'namespace' => Env::get('ROUTER_CLI_DEFAULT_NAMESPACE', 'Zemit\\Modules\\Cli\\Tasks'),
550 24
                    'module' => Env::get('ROUTER_CLI_DEFAULT_MODULE', 'cli'),
551 24
                    'task' => Env::get('ROUTER_CLI_DEFAULT_TASK', 'help'),
552 24
                    'action' => Env::get('ROUTER_CLI_DEFAULT_ACTION', 'main'),
553 24
                ],
554 24
                'notFound' => [
555 24
                    'namespace' => Env::get('ROUTER_NOTFOUND_NAMESPACE', ''),
556 24
                    'module' => Env::get('ROUTER_NOTFOUND_MODULE', ''),
557 24
                    'controller' => Env::get('ROUTER_NOTFOUND_CONTROLLER', 'error'),
558 24
                    'task' => Env::get('ROUTER_NOTFOUND_TASK', 'error'),
559 24
                    'action' => Env::get('ROUTER_NOTFOUND_ACTION', 'notFound'),
560 24
                ],
561 24
                'fatal' => [
562 24
                    'namespace' => Env::get('ROUTER_FATAL_NAMESPACE', ''),
563 24
                    'module' => Env::get('ROUTER_FATAL_MODULE', ''),
564 24
                    'controller' => Env::get('ROUTER_FATAL_CONTROLLER', 'error'),
565 24
                    'task' => Env::get('ROUTER_FATAL_TASK', 'error'),
566 24
                    'action' => Env::get('ROUTER_FATAL_ACTION', 'fatal'),
567 24
                ],
568 24
                'forbidden' => [
569 24
                    'namespace' => Env::get('ROUTER_FORBIDDEN_NAMESPACE', ''),
570 24
                    'module' => Env::get('ROUTER_FORBIDDEN_MODULE', ''),
571 24
                    'controller' => Env::get('ROUTER_FORBIDDEN_CONTROLLER', 'error'),
572 24
                    'task' => Env::get('ROUTER_FORBIDDEN_TASK', 'error'),
573 24
                    'action' => Env::get('ROUTER_FORBIDDEN_ACTION', 'forbidden'),
574 24
                ],
575 24
                'unauthorized' => [
576 24
                    'namespace' => Env::get('ROUTER_UNAUTHORIZED_NAMESPACE', ''),
577 24
                    'module' => Env::get('ROUTER_UNAUTHORIZED_MODULE', ''),
578 24
                    'controller' => Env::get('ROUTER_UNAUTHORIZED_CONTROLLER', 'error'),
579 24
                    'task' => Env::get('ROUTER_UNAUTHORIZED_TASK', 'error'),
580 24
                    'action' => Env::get('ROUTER_UNAUTHORIZED_ACTION', 'unauthorized'),
581 24
                ],
582 24
                'maintenance' => [
583 24
                    'namespace' => Env::get('ROUTER_MAINTENANCE_NAMESPACE', ''),
584 24
                    'module' => Env::get('ROUTER_MAINTENANCE_MODULE', ''),
585 24
                    'controller' => Env::get('ROUTER_MAINTENANCE_CONTROLLER', 'error'),
586 24
                    'task' => Env::get('ROUTER_MAINTENANCE_TASK', 'error'),
587 24
                    'action' => Env::get('ROUTER_MAINTENANCE_ACTION', 'maintenance'),
588 24
                ],
589 24
                'error' => [
590 24
                    'namespace' => Env::get('ROUTER_ERROR_NAMESPACE', ''),
591 24
                    'module' => Env::get('ROUTER_ERROR_MODULE', ''),
592 24
                    'controller' => Env::get('ROUTER_ERROR_CONTROLLER', 'error'),
593 24
                    'task' => Env::get('ROUTER_ERROR_TASK', 'error'),
594 24
                    'action' => Env::get('ROUTER_ERROR_ACTION', 'index'),
595 24
                ],
596 24
            ],
597
    
598
            /**
599
             * View Configuration
600
             */
601 24
            'view' => [
602 24
                'minify' => Env::get('VIEW_MINIFY', false),
603 24
                'engines' => Env::get('VIEW_ENGINES', [
604 24
                    '.phtml' => \Phalcon\Mvc\View\Engine\Php::class,
605 24
                    '.volt' => \Phalcon\Mvc\View\Engine\Volt::class,
606 24
//                    '.mhtml' => \Phalcon\Mvc\View\Engine\Mustache::class,
607 24
//                    '.twig' => \Phalcon\Mvc\View\Engine\Twig::class,
608 24
//                    '.tpl' => \Phalcon\Mvc\View\Engine\Smarty::class
609 24
                ]),
610 24
            ],
611
    
612
            /**
613
             * Volt Configuration
614
             */
615 24
            'volt' => [
616 24
                'autoescape' => Env::get('VOLT_AUTOESCAPE', false),
617 24
                'always' => Env::get('VOLT_ALWAYS', false),
618 24
                'extension' => Env::get('VOLT_EXTENSION', '.php'),
619 24
                'separator' => Env::get('VOLT_SEPARATOR', '%%'),
620 24
                'path' => Env::get('VOLT_PATH', './'),
621 24
                'prefix' => Env::get('VOLT_PREFIX', null),
622 24
                'stat' => Env::get('VOLT_STAT', true), // Whether Phalcon must check if there are differences between the template file and its compiled path
623 24
            ],
624
            
625
            /**
626
             * Gravatar Configuration
627
             */
628 24
            'gravatar' => [
629 24
                'default_image' => Env::get('GRAVATAR_DEFAULT_IMAGE', 'identicon'),
630 24
                'size' => Env::get('GRAVATAR_SIZE', 24),
631 24
                'rating' => Env::get('GRAVATAR_RATING', 'pg'),
632 24
                'use_https' => Env::get('GRAVATAR_USE_HTTPS', true),
633 24
            ],
634
            
635
            /**
636
             * reCaptcha Configuration
637
             */
638 24
            'reCaptcha' => [
639 24
                'siteKey' => Env::get('RECAPTCHA_KEY'),
640 24
                'secret' => Env::get('RECAPTCHA_SECRET'),
641 24
                'expectedHostname' => Env::get('RECAPTCHA_EXPECTED_HOSTNAME'),
642 24
                'expectedApkPackageName' => Env::get('RECAPTCHA_EXPECTED_APK_PACKAGE_NAME'),
643 24
                'expectedAction' => Env::get('RECAPTCHA_EXPECTED_ACTION', null),
644 24
                'scoreThreshold' => Env::get('RECAPTCHA_SCORE_THRESHOLD', 0.5),
645 24
            ],
646
            
647
            /**
648
             * Locale Service Settings
649
             */
650 24
            'locale' => [
651 24
                'default' => Env::get('LOCALE_DEFAULT', 'en'),
652 24
                'sessionKey' => Env::get('LOCALE_SESSION_KEY', 'zemit-locale'),
653 24
                'mode' => Env::get('LOCALE_MODE', Locale::MODE_DEFAULT),
654 24
                'allowed' => explode(',', Env::get('LOCALE_ALLOWED', 'en')),
655 24
            ],
656
            
657
            /**
658
             * Translate Service Settings
659
             */
660 24
            'translate' => [
661 24
                'locale' => explode(',', Env::get('TRANSLATE_LOCALE', 'en_US.utf8')),
662 24
                'defaultDomain' => Env::get('TRANSLATE_DEFAULT_DOMAIN', 'messages'),
663 24
                'category' => Env::get('TRANSLATE_CATEGORY', defined('LC_MESSAGES')? LC_MESSAGES : 5),
664 24
                'directory' => [
665 24
                    Env::get('TRANSLATE_DEFAULT_DOMAIN', 'messages') => Env::get('TRANSLATE_DEFAULT_PATH', CORE_PATH . 'Locales'),
666 24
                ],
667 24
            ],
668
            
669
            /**
670
             * Default Session Configuration
671
             */
672 24
            'session' => [
673 24
                'driver' => Env::get('SESSION_DRIVER', 'stream'),
674 24
                'drivers' => [
675 24
                    'stream' => [
676 24
                        'adapter' => Env::get('SESSION_STREAM_ADAPTER', \Phalcon\Session\Adapter\Stream::class),
677 24
                        'savePath' => Env::get('SESSION_STREAM_SAVE_PATH', '/tmp'),
678 24
                    ],
679 24
                    'memcached' => [
680 24
                        'adapter' => Env::get('SESSION_MEMCACHED_ADAPTER', \Phalcon\Session\Adapter\Libmemcached::class),
681 24
                        'servers' => [
682 24
                            [
683 24
                                'host' => Env::get('SESSION_MEMCACHED_HOST', Env::get('MEMCACHED_HOST', '127.0.0.1')),
684 24
                                'port' => Env::get('SESSION_MEMCACHED_PORT', Env::get('MEMCACHED_PORT', 11211)),
685 24
                                'weight' => Env::get('SESSION_MEMCACHED_WEIGHT', Env::get('MEMCACHED_WEIGHT', 100)),
686 24
                            ],
687 24
                        ],
688 24
                        'client' => [],
689 24
                    ],
690 24
                    'redis' => [
691 24
                        'adapter' => Env::get('SESSION_REDIS_ADAPTER', \Phalcon\Session\Adapter\Redis::class),
692 24
                        'defaultSerializer' => Env::get('SESSION_REDIS_DEFAULT_SERIALIZER', Env::get('REDIS_DEFAULT_SERIALIZER', 'php')),
693 24
                        'lifetime' => Env::get('SESSION_REDIS_LIFETIME', Env::get('REDIS_LIFETIME', 3600)),
694 24
                        'serializer' => Env::get('SESSION_REDIS_SERIALIZER', Env::get('REDIS_SERIALIZER', null)),
695 24
                        'host' => Env::get('SESSION_REDIS_HOST', Env::get('REDIS_HOST', '127.0.0.1')),
696 24
                        'port' => Env::get('SESSION_REDIS_PORT', Env::get('REDIS_PORT', 6379)),
697 24
                        'index' => Env::get('SESSION_REDIS_INDEX', Env::get('REDIS_INDEX', 1)),
698 24
                        'auth' => Env::get('SESSION_REDIS_AUTH', Env::get('REDIS_AUTH', null)),
699 24
                        'persistent' => Env::get('SESSION_REDIS_PERSISTENT', Env::get('REDIS_PERSISTENT', 0)),
700 24
                        'socket' => Env::get('SESSION_REDIS_SOCKET', Env::get('REDIS_SOCKET', null)),
701 24
                    ],
702 24
                    'noop' => [
703 24
                        'adapter' => Env::get('SESSION_NOOP_ADAPTER', \Phalcon\Session\Adapter\Noop::class),
704 24
                    ],
705 24
                ],
706 24
                'default' => [
707 24
                    'prefix' => Env::get('SESSION_PREFIX', Env::get('GLOBAL_PREFIX', 'zemit_') . 'session_'),
708 24
                    'uniqueId' => Env::get('SESSION_UNIQUE_ID', Env::get('GLOBAL_PREFIX', 'zemit_')),
709 24
                    'lifetime' => Env::get('SESSION_LIFETIME', 3600),
710 24
                ],
711 24
                'ini' => [
712 24
                    'session.save_path' => Env::get('SESSION_SAVE_PATH', ''),
713 24
                    'session.name' => Env::get('SESSION_NAME', 'PHPSESSID'),
714 24
                    'session.save_handler' => Env::get('SESSION_SAVE_HANDLER', 'files'),
715 24
                    'session.auto_start' => Env::get('SESSION_AUTO_START', '0'),
716 24
                    'session.gc_probability' => Env::get('SESSION_GC_PROBABILITY', '1'),
717 24
                    'session.gc_divisor' => Env::get('SESSION_GC_DIVISOR', '100'),
718 24
                    'session.gc_maxlifetime' => Env::get('SESSION_GC_MAXLIFETIME', '1440'),
719 24
                    'session.serialize_handler' => Env::get('SESSION_SERIALIZE_HANDLER', 'php'),
720 24
                    'session.cookie_lifetime' => Env::get('SESSION_COOKIE_LIFETIME', '0'),
721 24
                    'session.cookie_path' => Env::get('SESSION_COOKIE_PATH', '/'),
722 24
                    'session.cookie_domain' => Env::get('SESSION_COOKIE_DOMAIN', ''),
723 24
                    'session.cookie_secure' => Env::get('SESSION_COOKIE_SECURE', '1'),
724 24
                    'session.cookie_httponly' => Env::get('SESSION_COOKIE_HTTPONLY', '1'),
725 24
                    'session.cookie_samesite' => Env::get('SESSION_COOKIE_SAMESITE', ''),
726 24
                    'session.use_strict_mode' => Env::get('SESSION_USE_STRICT_MODE', '0'),
727 24
                    'session.use_cookies' => Env::get('SESSION_USE_COOKIES', '1'),
728 24
                    'session.use_only_cookies' => Env::get('SESSION_USE_ONLY_COOKIES', '1'),
729 24
                    'session.referer_check' => Env::get('SESSION_REFERER_CHECK', ''),
730 24
                    'session.cache_limiter' => Env::get('SESSION_CACHE_LIMITER', 'nocache'),
731 24
                    'session.cache_expire' => Env::get('SESSION_CACHE_EXPIRE', '180'),
732 24
                    'session.use_trans_sid' => Env::get('SESSION_USE_TRANS_SID', '0'),
733 24
                    'session.trans_sid_tags' => Env::get('SESSION_TRANS_SID_TAGS', 'a=href,area=href,frame=src,form='),
734 24
                    'session.trans_sid_hosts' => Env::get('SESSION_TRANS_SID_HOSTS', $_SERVER['HTTP_HOST'] ?? ''),
735 24
                    'session.sid_length' => Env::get('SESSION_SID_LENGTH', '32'),
736 24
                    'session.sid_bits_per_character' => Env::get('SESSION_SID_BITS_PER_CHARACTER', '4'),
737 24
                    'session.upload_progress.enabled' => Env::get('SESSION_UPLOAD_PROGRESS_ENABLED', '1'),
738 24
                    'session.upload_progress.cleanup' => Env::get('SESSION_UPLOAD_PROGRESS_CLEANUP', '1'),
739 24
                    'session.upload_progress.prefix' => Env::get('SESSION_UPLOAD_PROGRESS_PREFIX', Env::get('GLOBAL_PREFIX', 'zemit_') . 'upload_progress_'),
740 24
                    'session.upload_progress.name' => Env::get('SESSION_UPLOAD_PROGRESS_NAME', 'PHP_SESSION_UPLOAD_PROGRESS'),
741 24
                    'session.upload_progress.freq' => Env::get('SESSION_UPLOAD_PROGRESS_FREQ', '1%'),
742 24
                    'session.upload_progress.min_freq' => Env::get('SESSION_UPLOAD_PROGRESS_MIN_FREQ', '1'),
743 24
                    'session.lazy_write' => Env::get('SESSION_LAZY_WRITE', '1'),
744 24
                    'session.hash_function' => Env::get('SESSION_HASH_FUNCTION', '0'),
745 24
                    'session.hash_bits_per_character' => Env::get('SESSION_HASH_BITS_PER_CHARACTER', '4'),
746 24
                    'session.entropy_file' => Env::get('SESSION_ENTROPY_FILE', ''),
747 24
                    'session.entropy_length' => Env::get('SESSION_ENTROPY_LENGTH', '0'),
748 24
                ],
749 24
            ],
750
            
751
            /**
752
             * Default module/plugin structure
753
             */
754 24
            'module' => [
755 24
                'dir' => [
756
                    // default
757 24
                    'modules' => Env::get('MODULE_DIR_MODULES', 'Modules/'),
758 24
                    'controllers' => Env::get('MODULE_DIR_CONTROLLER', 'Controllers/'),
759 24
                    'tasks' => Env::get('MODULE_DIR_TASKS', 'Tasks/'),
760 24
                    'models' => Env::get('MODULE_DIR_MODELS', 'Models/'),
761 24
                    'views' => Env::get('MODULE_DIR_VIEWS', 'Views/'),
762 24
                    'bootstrap' => Env::get('MODULE_DIR_BOOTSTRAP', 'Bootstrap/'),
763 24
                    'locales' => Env::get('MODULE_DIR_LOCALES', 'Locales/'),
764 24
                    'config' => Env::get('MODULE_DIR_CONFIG', 'Config/'),
765
                    
766
                    // private
767 24
                    'migrations' => Env::get('MODULE_DIR_MIGRATION', 'Private/migrations/'),
768 24
                    'cache' => Env::get('MODULE_DIR_MIGRATION', 'Private/migrations/'),
769 24
                    'logs' => Env::get('MODULE_DIR_LOGS', 'Private/migrations/'),
770 24
                    'backups' => Env::get('MODULE_DIR_BACKUPS', 'Private/backups/'),
771 24
                    'files' => Env::get('MODULE_DIR_FILES', 'Private/files/'),
772 24
                    'trash' => Env::get('MODULE_DIR_TRASH', 'Private/trash/'),
773 24
                ],
774 24
            ],
775
            
776
            /**
777
             * Default security settings
778
             */
779 24
            'security' => [ // phalcon security config
780 24
                'workFactor' => Env::get('SECURITY_WORK_FACTOR', 12), // workfactor for the phalcon security service
781 24
                'hash' => Env::get('SECURITY_HASH', Security::CRYPT_ARGON2ID), // set default hash to sha512
782 24
                'salt' => Env::get('SECURITY_SALT', '>mY.Db5fR?k%~<ZWf\}Zh35_IFC]#0Xx'), // salt for the phalcon security service
783 24
                'argon2' => [
784 24
                    'memoryCost' => Env::get('SECURITY_ARGON2_MEMORY_COST', PASSWORD_ARGON2_DEFAULT_MEMORY_COST),
785 24
                    'timeCost' => Env::get('SECURITY_ARGON2_TIME_COST', PASSWORD_ARGON2_DEFAULT_TIME_COST),
786 24
                    'threads' => Env::get('SECURITY_ARGON2_THREADS', PASSWORD_ARGON2_DEFAULT_THREADS),
787 24
                ],
788 24
                'jwt' => [
789 24
                    'signer' => Env::get('SECURITY_JWT_SIGNER', \Phalcon\Encryption\Security\JWT\Signer\Hmac::class),
790 24
                    'algo' => Env::get('SECURITY_JWT_ALGO', 'sha512'),
791 24
                    'contentType' => Env::get('SECURITY_JWT_CONTENT_TYPE', 'application/json'),
792 24
                    'expiration' => $now->modify(Env::get('SECURITY_JWT_EXPIRATION', '+1 day'))->getTimestamp(),
793 24
                    'notBefore' => $now->modify(Env::get('SECURITY_JWT_NOT_BEFORE', '-1 minute'))->getTimestamp(),
794 24
                    'issuedAt' => $now->modify(Env::get('SECURITY_JWT_ISSUED_AT', 'now'))->getTimestamp(),
795 24
                    'issuer' => Env::get('SECURITY_JWT_ISSUER', 'ZEMIT_CORE_DEFAULT_ISSUER'),
796 24
                    'audience' => Env::get('SECURITY_JWT_AUDIENCE', 'ZEMIT_CORE_DEFAULT_AUDIENCE'),
797 24
                    'id' => Env::get('SECURITY_JWT_ID', 'ZEMIT_CORE_DEFAULT_ID'),
798 24
                    'subject' => Env::get('SECURITY_JWT_SUBJECT', 'ZEMIT_CORE_DEFAULT_SUBJECT'),
799 24
                    'passphrase' => Env::get('SECURITY_JWT_PASSPHRASE', 'Tf0PHY/^yDdJs*~)?x#xCNj_N[jW/`c*'),
800 24
                ],
801 24
            ],
802
    
803
            /**
804
             * Default crypt settings
805
             * @todo
806
             */
807 24
            'crypt' => [
808 24
                'cipher' => Env::get('CRYPT_CIPHER', 'aes-256-cfb'),
809 24
                'hash' => Env::get('CRYPT_HASH', 'sha256'),
810 24
                'useSigning' => Env::get('CRYPT_USE_SIGNING', false),
811 24
            ],
812
            
813
            /**
814
             * Cache drivers configs
815
             */
816 24
            'cache' => [
817 24
                'cli' => Env::get('CACHE_DRIVER_CLI', 'memory'),
818 24
                'driver' => Env::get('CACHE_DRIVER', 'memory'),
819 24
                'drivers' => [
820 24
                    'memory' => [
821 24
                        'adapter' => Env::get('CACHE_MEMORY_ADAPTER', \Phalcon\Cache\Adapter\Memory::class),
822 24
                    ],
823 24
                    'apcu' => [
824 24
                        'adapter' => Env::get('CACHE_APCU_ADAPTER', \Phalcon\Cache\Adapter\Apcu::class),
825 24
                    ],
826 24
                    'stream' => [
827 24
                        'adapter' => Env::get('CACHE_STREAM_ADAPTER', \Phalcon\Cache\Adapter\Stream::class),
828 24
                        'cacheDir' => Env::get('CACHE_STREAM_DIR', STORAGE_PATH . '/cache/data/'),
829 24
                    ],
830 24
                    'memcached' => [
831 24
                        'adapter' => Env::get('CACHE_MEMCACHED_ADAPTER', \Phalcon\Cache\Adapter\Libmemcached::class),
832 24
                        'servers' => [
833 24
                            [
834 24
                                'host' => Env::get('CACHE_MEMCACHED_HOST', Env::get('MEMCACHED_HOST', '127.0.0.1')),
835 24
                                'port' => Env::get('CACHE_MEMCACHED_PORT', Env::get('MEMCACHED_PORT', 11211)),
836 24
                                'weight' => Env::get('CACHE_MEMCACHED_WEIGHT', Env::get('MEMCACHED_WEIGHT', 100)),
837 24
                            ],
838 24
                        ],
839 24
                    ],
840 24
                    'redis' => [
841 24
                        'adapter' => Env::get('CACHE_REDIS_ADAPTER', \Phalcon\Cache\Adapter\Redis::class),
842 24
                        'defaultSerializer' => Env::get('CACHE_REDIS_DEFAULT_SERIALIZER', Env::get('REDIS_DEFAULT_SERIALIZER', 'php')),
843 24
                        'lifetime' => Env::get('CACHE_REDIS_LIFETIME', Env::get('REDIS_LIFETIME', 3600)),
844 24
                        'serializer' => Env::get('CACHE_REDIS_SERIALIZER', Env::get('REDIS_SERIALIZER', null)),
845 24
                        'host' => Env::get('CACHE_REDIS_HOST', Env::get('REDIS_HOST', '127.0.0.1')),
846 24
                        'port' => Env::get('CACHE_REDIS_PORT', Env::get('REDIS_PORT', 6379)),
847 24
                        'index' => Env::get('CACHE_REDIS_INDEX', Env::get('REDIS_INDEX', 1)),
848 24
                        'auth' => Env::get('CACHE_REDIS_AUTH', Env::get('REDIS_AUTH', null)),
849 24
                        'persistent' => Env::get('CACHE_REDIS_PERSISTENT', Env::get('REDIS_PERSISTENT', null)),
850 24
                        'socket' => Env::get('CACHE_REDIS_SOCKET', Env::get('REDIS_SOCKET', null)),
851 24
                    ],
852 24
                ],
853 24
                'default' => [
854 24
                    'prefix' => Env::get('CACHE_PREFIX', Env::get('GLOBAL_PREFIX', 'zemit_') . 'cache_'),
855 24
                    'lifetime' => Env::get('CACHE_LIFETIME', 86400),
856 24
                    'defaultSerializer' => Env::get('CACHE_DEFAULT_SERIALIZER', 'Php'),
857 24
                ],
858 24
            ],
859
            
860
            /**
861
             * Metadata Configuration
862
             */
863 24
            'metadata' => [
864 24
                'driverCli' => Env::get('METADATA_DRIVER_CLI', 'memory'),
865 24
                'driver' => Env::get('METADATA_DRIVER', 'memory'),
866 24
                'drivers' => [
867 24
                    'apcu' => [
868 24
                        'adapter' => Env::get('METADATA_APCU_ADAPTER', \Phalcon\Mvc\Model\MetaData\Apcu::class),
869 24
                    ],
870 24
                    'memory' => [
871 24
                        'adapter' => Env::get('METADATA_MEMORY_ADAPTER', \Phalcon\Mvc\Model\MetaData\Memory::class),
872 24
                    ],
873 24
                    'stream' => [
874 24
                        'adapter' => Env::get('METADATA_STREAM_ADAPTER', \Phalcon\Mvc\Model\MetaData\Stream::class),
875 24
                        'metaDataDir' => Env::get('METADATA_STREAM_DIR', STORAGE_PATH . '/cache/metadata/'),
876 24
                    ],
877 24
                    'memcached' => [
878 24
                        'adapter' => Env::get('METADATA_MEMCACHED_ADAPTER', \Phalcon\Mvc\Model\MetaData\Libmemcached::class),
879 24
                        'servers' => [
880 24
                            [
881 24
                                'host' => Env::get('METADATA_MEMCACHED_HOST', Env::get('MEMCACHED_HOST', '127.0.0.1')),
882 24
                                'port' => Env::get('METADATA_MEMCACHED_PORT', Env::get('MEMCACHED_PORT', 11211)),
883 24
                                'weight' => Env::get('METADATA_MEMCACHED_WEIGHT', Env::get('MEMCACHED_WEIGHT', 100)),
884 24
                            ],
885 24
                        ],
886 24
                    ],
887 24
                    'redis' => [
888 24
                        'adapter' => Env::get('METADATA_REDIS_ADAPTER', \Phalcon\Mvc\Model\MetaData\Redis::class),
889 24
                        'defaultSerializer' => Env::get('METADATA_REDIS_DEFAULT_SERIALIZER', Env::get('REDIS_DEFAULT_SERIALIZER', 'php')),
890 24
                        'lifetime' => Env::get('METADATA_REDIS_LIFETIME', Env::get('REDIS_LIFETIME', 3600)),
891 24
                        'serializer' => Env::get('METADATA_REDIS_SERIALIZER', Env::get('REDIS_SERIALIZER', null)),
892 24
                        'host' => Env::get('METADATA_REDIS_HOST', Env::get('REDIS_HOST', '127.0.0.1')),
893 24
                        'port' => Env::get('METADATA_REDIS_PORT', Env::get('REDIS_PORT', 6379)),
894 24
                        'index' => Env::get('METADATA_REDIS_INDEX', Env::get('REDIS_INDEX', 1)),
895 24
                        'auth' => Env::get('METADATA_REDIS_AUTH', Env::get('REDIS_AUTH', null)),
896 24
                        'persistent' => Env::get('METADATA_REDIS_PERSISTENT', Env::get('REDIS_PERSISTENT', null)),
897 24
                        'socket' => Env::get('METADATA_REDIS_SOCKET', Env::get('REDIS_SOCKET', null)),
898 24
                    ],
899 24
                ],
900 24
                'default' => [
901 24
                    'lifetime' => Env::get('METADATA_LIFETIME', 172800),
902 24
                    'prefix' => Env::get('METADATA_PREFIX', Env::get('GLOBAL_PREFIX', 'zemit_') . 'metadata_'),
903 24
                ],
904 24
            ],
905
            
906
            /**
907
             * Annotations Configuration
908
             * - Memory
909
             * - Apcu
910
             * - Stream
911
             */
912 24
            'annotations' => [
913 24
                'driver' => Env::get('ANNOTATIONS_DRIVER', 'memory'),
914 24
                'drivers' => [
915 24
                    'memory' => [
916 24
                        'adapter' => Env::get('ANNOTATIONS_MEMORY_ADAPTER', \Phalcon\Annotations\Adapter\Memory::class),
917 24
                    ],
918 24
                    'apcu' => [
919 24
                        'adapter' => Env::get('ANNOTATIONS_APCU_ADAPTER', \Phalcon\Annotations\Adapter\Apcu::class),
920 24
                    ],
921 24
                    'file' => [
922 24
                        'adapter' => Env::get('ANNOTATIONS_STREAM_ADAPTER', \Phalcon\Annotations\Adapter\Stream::class),
923 24
                        'annotationsDir' => Env::get('ANNOTATIONS_STREAM_DIR', STORAGE_PATH . '/cache/annotations'),
924 24
                    ],
925 24
                ],
926 24
                'default' => [
927 24
                    'prefix' => Env::get('ANNOTATIONS_PREFIX', Env::get('GLOBAL_PREFIX', 'zemit_') . 'annotations_'),
928 24
                    'lifetime' => Env::get('ANNOTATIONS_LIFETIME', 86400),
929 24
                ],
930 24
            ],
931
            
932
            /**
933
             * Database configuration
934
             */
935 24
            'database' => [
936 24
                'default' => Env::get('DATABASE_ADAPTER', 'mysql'),
937 24
                'drivers' => [
938 24
                    'mysql' => [
939 24
                        'adapter' => Env::get('DATABASE_MYSQL_ADAPTER', \Zemit\Db\Adapter\Pdo\Mysql::class),
940 24
                        'dialectClass' => Env::get('DATABASE_DIALECT_CLASS', \Zemit\Db\Dialect\Mysql::class),
941 24
                        'host' => Env::get('DATABASE_HOST', 'localhost'),
942 24
                        'port' => Env::get('DATABASE_PORT', 3306),
943 24
                        'dbname' => Env::get('DATABASE_DBNAME', ''),
944 24
                        'username' => Env::get('DATABASE_USERNAME', 'root'),
945 24
                        'password' => Env::get('DATABASE_PASSWORD', ''),
946 24
                        'charset' => Env::get('DATABASE_CHARSET', 'utf8'),
947 24
                        'options' => [
948 24
                            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES ' . Env::get('DATABASE_CHARSET', 'utf8') .
949 24
                            ', sql_mode = \'' . Env::get('DATABASE_SQL_MODE', 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION') . '\'',
950 24
                            PDO::ATTR_EMULATE_PREPARES => Env::get('DATABASE_PDO_EMULATE_PREPARES', false), // https://stackoverflow.com/questions/10113562/pdo-mysql-use-pdoattr-emulate-prepares-or-not
951 24
                            PDO::ATTR_STRINGIFY_FETCHES => Env::get('DATABASE_PDO_STRINGIFY_FETCHES', false),
952 24
                            PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => Env::get('MYSQL_ATTR_SSL_VERIFY_SERVER_CERT', true),
953 24
                            PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => Env::get('MYSQL_ATTR_USE_BUFFERED_QUERY', true),
954 24
                        ],
955
                        /**
956
                         * Readonly Configuration
957
                         */
958 24
                        'readonly' => [
959 24
                            'enable' => Env::get('DATABASE_READONLY_ENABLE', false),
960 24
                            'host' => Env::get('DATABASE_READONLY_HOST'),
961 24
                            'port' => Env::get('DATABASE_READONLY_PORT'),
962 24
                            'dbname' => Env::get('DATABASE_READONLY_DBNAME'),
963 24
                            'username' => Env::get('DATABASE_READONLY_USERNAME'),
964 24
                            'password' => Env::get('DATABASE_READONLY_PASSWORD'),
965 24
                            'charset' => Env::get('DATABASE_READONLY_CHARSET'),
966 24
                        ],
967 24
                    ],
968 24
                ],
969 24
            ],
970
            
971
            /**
972
             * Mailer configuration
973
             */
974 24
            'mailer' => [
975 24
                'driver' => Env::get('MAILER_DRIVER', 'sendmail'),
976 24
                'drivers' => [
977 24
                    'mail' => [
978 24
                        'driver' => 'mail',
979 24
                    ],
980 24
                    'sendmail' => [
981 24
                        'driver' => 'sendmail',
982 24
                        'sendmail' => Env::get('MAILER_SENDMAIL', '/usr/sbin/sendmail -bs'),
983 24
                    ],
984 24
                    'smtp' => [
985 24
                        'driver' => 'smtp',
986 24
                        'host' => Env::get('MAILER_SMTP_HOST', 'localhost'),
987 24
                        'port' => Env::get('MAILER_SMTP_PORT', 25),
988 24
                        'encryption' => Env::get('MAILER_SMTP_ENCRYPTION', ''),
989 24
                        'username' => Env::get('MAILER_SMTP_USERNAME', ''),
990 24
                        'password' => Env::get('MAILER_SMTP_PASSWORD', ''),
991 24
                    ],
992 24
                ],
993 24
                'default' => [
994 24
                    'charset' => Env::get('MAILER_CHARSET', 'utf-8'),
995 24
                    'viewsDir' => Env::get('MAILER_VIEWS_DIR', APP_PATH . '/Modules/Frontend/Views/'),
996 24
                    'baseUri' => Env::get('MAILER_BASE_URI', null),
997 24
                ],
998 24
                'from' => [
999 24
                    'email' => Env::get('MAILER_FROM_EMAIL', 'zemit@localhost'),
1000 24
                    'name' => Env::get('MAILER_FROM_NAME', 'Zemit'),
1001 24
                ],
1002 24
                'to' => [...explode(',', Env::get('MAILER_TO_EMAIL', ''))],
1003 24
                'cc' => [...explode(',', Env::get('MAILER_CC_EMAIL', ''))],
1004 24
                'bcc' => [...explode(',', Env::get('MAILER_BCC_EMAIL', ''))],
1005 24
            ],
1006
            
1007
            /**
1008
             * FileSystem
1009
             * https://flysystem.thephpleague.com/docs/
1010
             */
1011 24
            'fileSystem' => [
1012 24
                'driver' => Env::get('FILE_SYSTEM_DRIVER', 'local'),
1013 24
                'drivers' => [
1014 24
                    'local' => [
1015 24
                        'rootDirectory' => Env::get('FILE_SYSTEM_LOCAL_ROOT_DIRECTORY', ROOT_PATH)
1016 24
                    ],
1017 24
                    'ftp' => [
1018 24
                        'host' => Env::get('FILE_SYSTEM_FTP_HOST'), // required
1019 24
                        'root' => Env::get('FILE_SYSTEM_FTP_ROOT'), // required
1020 24
                        'username' => Env::get('FILE_SYSTEM_FTP_USERNAME'), // required
1021 24
                        'password' => Env::get('FILE_SYSTEM_FTP_PASSWORD'), // required
1022 24
                        'port' => Env::get('FILE_SYSTEM_FTP_PORT', 21),
1023 24
                        'ssl' => Env::get('FILE_SYSTEM_FTP_SSL', false),
1024 24
                        'timeout' => Env::get('FILE_SYSTEM_FTP_TIMEOUT', 10),
1025 24
                        'utf8' => Env::get('FILE_SYSTEM_FTP_UTF8', false),
1026 24
                        'passive' => Env::get('FILE_SYSTEM_FTP_PASSIVE', true),
1027 24
                        'transferMode' => Env::get('FILE_SYSTEM_FTP_TRANSFER_MODE', defined('FTP_BINARY')? FTP_BINARY : 2),
1028 24
                        'systemType' => Env::get('FILE_SYSTEM_FTP_SYSTEM_TYPE'), // windows or unix
1029 24
                        'ignorePassiveAddress' => Env::get('FILE_SYSTEM_FTP_SYSTEM_IGNORE_PASSIVE_ADDRESS'), // true or false
1030 24
                        'timestampsOnUnixListingsEnabled' => Env::get('FILE_SYSTEM_FTP_TIMESTAMPS_ON_UNIX_LISTING_ENABLED', false), // true or false
1031 24
                        'recurseManually' => Env::get('FILE_SYSTEM_FTP_RECURSE_MANUALLY', true), // true or false
1032 24
                    ],
1033 24
                    'sftp' => [
1034 24
                        'host' => Env::get('FILE_SYSTEM_SFTP_HOST'), // required
1035 24
                        'username' => Env::get('FILE_SYSTEM_SFTP_USERNAME'), // required
1036 24
                        'password' => Env::get('FILE_SYSTEM_SFTP_PASSWORD'), // set to null if privateKey is used
1037 24
                        'privateKey' => Env::get('FILE_SYSTEM_SFTP_STORAGE_KEY'), // can be used instead of password, set to null if password is set
1038 24
                        'passphrase' => Env::get('FILE_SYSTEM_SFTP_PASSPHRASE'), //  set to null if privateKey is not used or has no passphrase
1039 24
                        'port' => Env::get('FILE_SYSTEM_SFTP_PORT', 22),
1040 24
                        'useAgent' => Env::get('FILE_SYSTEM_SFTP_USE_AGENT', false),
1041 24
                        'timeout' => Env::get('FILE_SYSTEM_SFTP_TIMEOUT', 10),
1042 24
                        'maxTries' => Env::get('FILE_SYSTEM_SFTP_MAX_TRIES', 4),
1043 24
                        'hostFingerprint' => Env::get('FILE_SYSTEM_SFTP_HOST_FINGERPRINT'),
1044 24
                        'connectivityChecker' => Env::get('FILE_SYSTEM_SFTP_CONNECTIVITY_CHECKER'),
1045 24
                    ],
1046 24
                    'memory' => [
1047 24
                        // nothing
1048 24
                    ],
1049 24
                    'readOnly' => [
1050 24
                        // nothing
1051 24
                    ],
1052 24
                    'awsS3' => [
1053 24
                        'bucketName' => Env::get('FILE_SYSTEM_AWS_S3_BUCKET_NAME'),
1054 24
                        'pathPrefix' => Env::get('FILE_SYSTEM_AWS_S3_PATH_PREFIX')
1055 24
                    ],
1056 24
                    'googleCloudStorage' => [
1057 24
                        'bucketName' => Env::get('FILE_SYSTEM_GOOGLE_CLOUD_STORAGE_BUCKET_NAME'),
1058 24
                        'pathPrefix' => Env::get('FILE_SYSTEM_GOOGLE_CLOUD_STORAGE_PATH_PREFIX')
1059 24
                    ],
1060 24
                    'azureBlobStorage' => [
1061 24
                        'containerName' => Env::get('FILE_SYSTEM_AZURE_BLOB_STORAGE_CONTAINER_NAME'),
1062 24
                        'pathPrefix' => Env::get('FILE_SYSTEM_AZURE_BLOB_STORAGE_PATH_PREFIX')
1063 24
                    ],
1064 24
                    'webdav' => [
1065 24
                        'baseUri' => Env::get('FILE_SYSTEM_WEBDAV_BASE_URI'),
1066 24
                        'userName' => Env::get('FILE_SYSTEM_WEBDAV_USERNAME'),
1067 24
                        'password' => Env::get('FILE_SYSTEM_WEBDAV_PASSWORD'),
1068 24
                    ],
1069 24
                    'zipArchive' => [
1070 24
                        'path' => Env::get('FILE_SYSTEM_ZIP_ARCHIVE_PATH')
1071 24
                    ],
1072 24
                ],
1073 24
            ],
1074
            
1075
            /**
1076
             * Cookies
1077
             */
1078 24
            'cookies' => [
1079 24
                'useEncryption' => Env::get('COOKIES_USE_ENCRYPTION', true),
1080 24
                'signKey' => Env::get('COOKIES_SIGN_KEY', ''),
1081 24
            ],
1082
            
1083
            /**
1084
             * AWS - Amazon Web Service
1085
             */
1086 24
            'aws' => [
1087 24
                'region' => Env::get('AWS_REGION', 'ca-central-1'),
1088 24
                'version' => Env::get('AWS_VERSION', 'latest'),
1089 24
                'credentials' => [
1090 24
                    'key' => Env::get('AWS_CREDENTIALS_KEY', ''),
1091 24
                    'secret' => Env::get('AWS_CREDENTIALS_SECRET', ''),
1092 24
                ],
1093 24
            ],
1094
            
1095
            /**
1096
             * Oauth2
1097
             */
1098 24
            'oauth2' => [
1099 24
                'client' => [
1100 24
                    'clientId' => Env::get('OAUTH2_CLIENT_ID'),
1101 24
                    'clientSecret' => Env::get('OAUTH2_CLIENT_SECRET'),
1102 24
                    'redirectUri' => Env::get('OAUTH2_CLIENT_REDIRECT_URI', '/oauth2/client/redirect'),
1103 24
                    'urlAuthorize' => Env::get('OAUTH2_CLIENT_URL_AUTHORIZE', '/oauth2/client/authorize'),
1104 24
                    'urlAccessToken' => Env::get('OAUTH2_CLIENT_URL_ACCESS_TOKEN', '/oauth2/client/token'),
1105 24
                    'urlResourceOwnerDetails' => Env::get('OAUTH2_CLIENT_URL_RESOURCE', '/oauth2/client/resource'),
1106 24
                    'proxy' => Env::get('OAUTH2_CLIENT_PROXY', null),
1107 24
                    'verify' => Env::get('OAUTH2_CLIENT_VERIFY', true),
1108 24
                ],
1109 24
                'facebook' => [
1110 24
                    'clientId' => Env::get('OAUTH2_FACEBOOK_CLIENT_ID'),
1111 24
                    'clientSecret' => Env::get('OAUTH2_FACEBOOK_CLIENT_SECRET'),
1112 24
                    'redirectUri' => Env::get('OAUTH2_FACEBOOK_CLIENT_REDIRECT_URI', '/oauth2/facebook/callback'),
1113 24
                    'graphApiVersion' => Env::get('OAUTH2_FACEBOOK_GRAPH_API_VERSION', 'v2.10'),
1114 24
                ],
1115 24
                'google' => [
1116 24
                    'clientId' => Env::get('OAUTH2_GOOGLE_CLIENT_ID'),
1117 24
                    'clientSecret' => Env::get('OAUTH2_GOOGLE_CLIENT_SECRET'),
1118 24
                    'redirectUri' => Env::get('OAUTH2_GOOGLE_CLIENT_REDIRECT_URI', '/oauth2/google/callback'),
1119 24
                    'hostedDomain' => Env::get('OAUTH2_GOOGLE_CLIENT_HOSTED_DOMAIN', null), // optional; used to restrict access to users on your G Suite/Google Apps for Business accounts
1120 24
                ],
1121 24
                'instagram' => [
1122
                
1123 24
                ],
1124 24
                'linked' => [
1125
                
1126 24
                ],
1127 24
                'twitter' => [
1128
                
1129 24
                ],
1130 24
                'github' => [
1131
                
1132 24
                ],
1133 24
                'apple' => [
1134
                
1135 24
                ],
1136 24
            ],
1137
            
1138 24
            'openai' => [
1139 24
                'secretKey' => Env::get('OPENAI_SECRET_KEY'),
1140 24
                'organizationId' => Env::get('OPENAI_ORGANIZATION_ID'),
1141 24
            ],
1142
            
1143
            /**
1144
             * Imap
1145
             * https://packagist.org/packages/php-imap/php-imap
1146
             */
1147 24
            'imap' => [
1148 24
                'path' => Env::get('IMAP_PATH'), // IMAP server and mailbox folder
1149 24
                'login' => Env::get('IMAP_LOGIN'), // Username for the before configured mailbox
1150 24
                'password' => Env::get('IMAP_PASSWORD'), // Password for the before configured username
1151 24
                'attachmentsDir' => Env::get('IMAP_ATTACHMENTS_DIR'), // Server encoding (optional)
1152 24
                'serverEncoding' => Env::get('IMAP_SERVER_ENCODING', 'UTF-8'), // Directory, where attachments will be saved (optional)
1153 24
                'trimImapPath' => Env::get('IMAP_TRIM_IMAP_PATH', true),   // Trim leading/ending whitespaces of IMAP path (optional)
1154 24
                'attachmentFilenameMode' => Env::get('IMAP_ATTACHMENT_FILENAME_MODE', false), // Attachment filename mode (optional; false = random filename; true = original filename)
1155 24
            ],
1156
            
1157 24
            'clamav' => [
1158 24
                'address' => Env::get('CLAMAV_ADDRESS', 'unix:///run/clamd.scan/clamd.sock'),
1159 24
                'timeout' => Env::get('CLAMAV_TIMEOUT', 30),
1160 24
            ],
1161
            
1162
            /**
1163
             * Dotenv
1164
             */
1165 24
            'dotenv' => [
1166 24
                'filePath' => '',
1167 24
            ],
1168
            
1169
            /**
1170
             * Client config to pass to front-end
1171
             */
1172 24
            'client' => [],
1173
            
1174
            /**
1175
             * Access Control List (ACL) options
1176
             */
1177 24
            'acl' => [],
1178
            
1179
            /**
1180
             * Application permissions
1181
             */
1182 24
            'permissions' => [
1183
                
1184
                /**
1185
                 * Feature permissions
1186
                 */
1187 24
                'features' => [
1188
                    
1189 24
                    'test' => [
1190 24
                        'components' => [
1191 24
                            Api\Controllers\TestController::class => ['*'],
1192 24
                        ],
1193 24
                    ],
1194
                    
1195 24
                    'base' => [
1196 24
                        'components' => [
1197 24
                            Api\Controllers\AuthController::class => ['get'],
1198 24
                            Models\Audit::class => ['create'],
1199 24
                            Models\AuditDetail::class => ['create'],
1200 24
                            Models\Session::class => ['*'],
1201 24
                        ],
1202 24
                    ],
1203
                    
1204 24
                    'login' => [
1205 24
                        'components' => [
1206 24
                            Api\Controllers\AuthController::class => ['login'],
1207 24
                            Models\User::class => ['find'],
1208 24
                        ],
1209 24
                    ],
1210
                    
1211 24
                    'logout' => [
1212 24
                        'components' => [
1213 24
                            Api\Controllers\AuthController::class => ['logout'],
1214 24
                        ],
1215 24
                    ],
1216
                    
1217 24
                    'register' => [
1218 24
                        'components' => [
1219 24
                            Api\Controllers\AuthController::class => ['register'],
1220 24
                            Models\User::class => ['find', 'create'],
1221 24
                        ],
1222 24
                    ],
1223
                    
1224 24
                    'cron' => [
1225 24
                        'components' => [
1226 24
                            Cli\Tasks\CronTask::class => ['*'],
1227 24
                        ],
1228 24
                    ],
1229
                    
1230 24
                    'manageRoleList' => [
1231 24
                        'components' => [
1232 24
                            Api\Controllers\RoleController::class => ['*'],
1233 24
                            Models\Role::class => ['*'],
1234 24
                            Models\UserRole::class => ['*'],
1235 24
                        ],
1236 24
                        'behaviors' => [
1237 24
                            Api\Controllers\RoleController::class => [
1238 24
                                Behavior\Skip\SkipIdentityCondition::class,
1239 24
                                Behavior\Skip\SkipSoftDeleteCondition::class,
1240 24
                            ],
1241 24
                        ],
1242 24
                    ],
1243
                    
1244 24
                    'manageGroupList' => [
1245 24
                        'components' => [
1246 24
                            Api\Controllers\GroupController::class => ['*'],
1247 24
                            Models\Group::class => ['*'],
1248 24
                        ],
1249 24
                        'behaviors' => [
1250 24
                            Api\Controllers\GroupController::class => [
1251 24
                                Behavior\Skip\SkipIdentityCondition::class,
1252 24
                                Behavior\Skip\SkipSoftDeleteCondition::class,
1253 24
                            ],
1254 24
                        ],
1255 24
                    ],
1256
                    
1257 24
                    'manageTypeList' => [
1258 24
                        'components' => [
1259 24
                            Api\Controllers\TypeController::class => ['*'],
1260 24
                            Models\Group::class => ['*'],
1261 24
                        ],
1262 24
                        'behaviors' => [
1263 24
                            Api\Controllers\TypeController::class => [
1264 24
                                Behavior\Skip\SkipIdentityCondition::class,
1265 24
                                Behavior\Skip\SkipSoftDeleteCondition::class,
1266 24
                            ],
1267 24
                        ],
1268 24
                    ],
1269
                    
1270 24
                    'manageLangList' => [
1271 24
                        'components' => [
1272 24
                            Api\Controllers\LangController::class => ['*'],
1273 24
                            Models\Lang::class => ['*'],
1274 24
                        ],
1275 24
                        'behaviors' => [
1276 24
                            Api\Controllers\LangController::class => [
1277 24
                                Behavior\Skip\SkipIdentityCondition::class,
1278 24
                                Behavior\Skip\SkipSoftDeleteCondition::class,
1279 24
                            ],
1280 24
                        ],
1281 24
                    ],
1282
                    
1283 24
                    'manageUserList' => [
1284 24
                        'components' => [
1285 24
                            Api\Controllers\UserController::class => ['*'],
1286 24
                            Models\User::class => ['*'],
1287 24
                        ],
1288 24
                        'behaviors' => [
1289 24
                            Api\Controllers\UserController::class => [
1290 24
                                Behavior\Skip\SkipIdentityCondition::class,
1291 24
                                Behavior\Skip\SkipSoftDeleteCondition::class,
1292 24
                            ],
1293 24
                        ],
1294 24
                    ],
1295
                    
1296 24
                    'manageTemplateList' => [
1297 24
                        'components' => [
1298 24
                            Api\Controllers\TemplateController::class => ['*'],
1299 24
                            Models\Template::class => ['*'],
1300 24
                        ],
1301 24
                        'behaviors' => [
1302 24
                            Api\Controllers\TemplateController::class => [
1303 24
                                Behavior\Skip\SkipIdentityCondition::class,
1304 24
                                Behavior\Skip\SkipSoftDeleteCondition::class,
1305 24
                            ],
1306 24
                        ],
1307 24
                    ],
1308
                    
1309 24
                    'manageAuditList' => [
1310 24
                        'components' => [
1311 24
                            Api\Controllers\AuditController::class => ['*'],
1312 24
                            Models\Audit::class => ['*'],
1313 24
                        ],
1314 24
                        'behaviors' => [
1315 24
                            Api\Controllers\AuditController::class => [
1316 24
                                Behavior\Skip\SkipIdentityCondition::class,
1317 24
                                Behavior\Skip\SkipSoftDeleteCondition::class,
1318 24
                            ],
1319 24
                        ],
1320 24
                    ],
1321
                    
1322 24
                    'manageSiteList' => [
1323 24
                        'components' => [
1324 24
                            Api\Controllers\WorkspaceController::class => ['*'],
1325 24
                            Models\Workspace::class => ['*'],
1326 24
                            Models\WorkspaceLang::class => ['*'],
1327 24
                        ],
1328 24
                        'behaviors' => [
1329 24
                            Api\Controllers\WorkspaceController::class => [
1330 24
                                Behavior\Skip\SkipIdentityCondition::class,
1331 24
                                Behavior\Skip\SkipSoftDeleteCondition::class,
1332 24
                            ],
1333 24
                        ],
1334 24
                    ],
1335
                    
1336 24
                    'managePageList' => [
1337 24
                        'components' => [
1338 24
                            Api\Controllers\PageController::class => ['*'],
1339 24
                            Models\Page::class => ['*'],
1340 24
                        ],
1341 24
                        'behaviors' => [
1342 24
                            Api\Controllers\PageController::class => [
1343 24
                                Behavior\Skip\SkipIdentityCondition::class,
1344 24
                                Behavior\Skip\SkipSoftDeleteCondition::class,
1345 24
                            ],
1346 24
                        ],
1347 24
                    ],
1348
                    
1349 24
                    'managePostList' => [
1350 24
                        'components' => [
1351 24
                            Api\Controllers\PostController::class => ['*'],
1352 24
                            Models\Post::class => ['*'],
1353 24
                        ],
1354 24
                        'behaviors' => [
1355 24
                            Api\Controllers\PostController::class => [
1356 24
                                Behavior\Skip\SkipIdentityCondition::class,
1357 24
                                Behavior\Skip\SkipSoftDeleteCondition::class,
1358 24
                            ],
1359 24
                        ],
1360 24
                    ],
1361
                    
1362 24
                    'managePhalconMigrationsList' => [
1363 24
                        'components' => [
1364 24
                            Api\Controllers\PhalconMigrationsController::class => ['*'],
1365 24
                            Models\PhalconMigrations::class => ['*'],
1366 24
                        ],
1367 24
                        'behaviors' => [
1368 24
                            Api\Controllers\PhalconMigrationsController::class => [
1369 24
                                Behavior\Skip\SkipIdentityCondition::class,
1370 24
                                Behavior\Skip\SkipSoftDeleteCondition::class,
1371 24
                            ],
1372 24
                        ],
1373 24
                    ],
1374 24
                ],
1375
                
1376
                /**
1377
                 * Roles permissions
1378
                 */
1379 24
                'roles' => [
1380
                    
1381
                    // Console (CLI)
1382 24
                    'cli' => [
1383 24
                        'components' => [
1384 24
                            Cli\Tasks\CacheTask::class => ['*'],
1385 24
                            Cli\Tasks\CronTask::class => ['*'],
1386 24
                            Cli\Tasks\ErrorTask::class => ['*'],
1387 24
                            Cli\Tasks\DatabaseTask::class => ['*'],
1388 24
                            Cli\Tasks\DataLifeCycleTask::class => ['*'],
1389 24
                            Cli\Tasks\HelpTask::class => ['*'],
1390 24
                            Cli\Tasks\ScaffoldTask::class => ['*'],
1391 24
                            Cli\Tasks\TsScaffoldTask::class => ['*'],
1392 24
                            Cli\Tasks\TestTask::class => ['*'],
1393 24
                            Cli\Tasks\UserTask::class => ['*'],
1394 24
                        ],
1395 24
                    ],
1396
                    
1397
                    // Everyone with or without role
1398 24
                    'everyone' => [
1399 24
                        'features' => [
1400 24
                            'base',
1401 24
                        ],
1402 24
                        'components' => [
1403 24
                            Api\Controllers\ClamavController::class => ['*'],
1404 24
                            Frontend\Controllers\CheckController::class => ['*'],
1405 24
                        ],
1406 24
                    ],
1407
                    
1408
                    // Everyone without role
1409 24
                    'guest' => [
1410 24
                        'features' => [
1411 24
                            'login',
1412 24
                            'logout',
1413 24
                            'register',
1414 24
                        ],
1415 24
                    ],
1416
                    
1417
                    // User
1418 24
                    'user' => [
1419 24
                        'features' => [
1420 24
                            'logout',
1421 24
                        ],
1422 24
                    ],
1423
                    
1424
                    // Admin
1425 24
                    'admin' => [
1426 24
                        'features' => [
1427 24
                            'manageUserList',
1428 24
                            'manageLangList',
1429 24
                            'manageSiteList',
1430 24
                            'managePageList',
1431 24
                            'managePostList',
1432 24
                            'manageTemplateList',
1433 24
                            'managePhalconMigrationsList',
1434 24
                        ],
1435 24
                        'inherit' => [
1436 24
                            'user',
1437 24
                        ],
1438 24
                        'behaviors' => [
1439 24
                        ],
1440 24
                    ],
1441
                    
1442
                    // Dev
1443 24
                    'dev' => [
1444 24
                        'features' => [
1445 24
                            'manageRoleList',
1446 24
                            'manageGroupList',
1447 24
                            'manageTypeList',
1448 24
                            'manageAuditList',
1449 24
                        ],
1450 24
                        'inherit' => [
1451 24
                            'user',
1452 24
                            'admin',
1453 24
                        ],
1454 24
                    ],
1455 24
                ],
1456 24
            ],
1457 24
        ], $data);
1458
        
1459 24
        $data = $this->internalMergeAppend($data, (new WorkspaceConfig())->toArray());
1460 24
        $data = $this->internalMergeAppend($data, (new TableConfig())->toArray());
1461
        
1462 24
        parent::__construct($data, $insensitive);
1463
    }
1464
}
1465