initial
commit
4c9a0ad3f0
|
@ -0,0 +1,50 @@
|
||||||
|
# Define the line ending behavior of the different file extensions
|
||||||
|
# Set default behavior, in case users don't have core.autocrlf set.
|
||||||
|
* text=auto
|
||||||
|
* text eol=lf
|
||||||
|
|
||||||
|
# Explicitly declare text files we want to always be normalized and converted
|
||||||
|
# to native line endings on checkout.
|
||||||
|
*.php text
|
||||||
|
*.default text
|
||||||
|
*.ctp text
|
||||||
|
*.sql text
|
||||||
|
*.md text
|
||||||
|
*.po text
|
||||||
|
*.js text
|
||||||
|
*.css text
|
||||||
|
*.ini text
|
||||||
|
*.properties text
|
||||||
|
*.txt text
|
||||||
|
*.xml text
|
||||||
|
*.svg text
|
||||||
|
*.yml text
|
||||||
|
.htaccess text
|
||||||
|
|
||||||
|
# Declare files that will always have CRLF line endings on checkout.
|
||||||
|
*.bat eol=crlf
|
||||||
|
|
||||||
|
# Declare files that will always have LF line endings on checkout.
|
||||||
|
*.pem eol=lf
|
||||||
|
|
||||||
|
# Denote all files that are truly binary and should not be modified.
|
||||||
|
*.png binary
|
||||||
|
*.jpg binary
|
||||||
|
*.gif binary
|
||||||
|
*.webp binary
|
||||||
|
*.ico binary
|
||||||
|
*.mo binary
|
||||||
|
*.pdf binary
|
||||||
|
*.phar binary
|
||||||
|
*.woff binary
|
||||||
|
*.woff2 binary
|
||||||
|
*.ttf binary
|
||||||
|
*.otf binary
|
||||||
|
*.eot binary
|
||||||
|
*.gz binary
|
||||||
|
*.bz2 binary
|
||||||
|
*.7z binary
|
||||||
|
*.zip binary
|
||||||
|
*.webm binary
|
||||||
|
*.mp4 binary
|
||||||
|
*.ogv binary
|
|
@ -0,0 +1,41 @@
|
||||||
|
# CakePHP specific files #
|
||||||
|
##########################
|
||||||
|
/config/app.php
|
||||||
|
/config/.env
|
||||||
|
/logs/*
|
||||||
|
/tmp/*
|
||||||
|
/vendor/*
|
||||||
|
|
||||||
|
# OS generated files #
|
||||||
|
######################
|
||||||
|
.DS_Store
|
||||||
|
.DS_Store?
|
||||||
|
._*
|
||||||
|
.Spotlight-V100
|
||||||
|
.Trashes
|
||||||
|
Icon?
|
||||||
|
ehthumbs.db
|
||||||
|
Thumbs.db
|
||||||
|
.directory
|
||||||
|
|
||||||
|
# Tool specific files #
|
||||||
|
#######################
|
||||||
|
# vim
|
||||||
|
*~
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
# sublime text & textmate
|
||||||
|
*.sublime-*
|
||||||
|
*.stTheme.cache
|
||||||
|
*.tmlanguage.cache
|
||||||
|
*.tmPreferences.cache
|
||||||
|
# Eclipse
|
||||||
|
.settings/*
|
||||||
|
# JetBrains, aka PHPStorm, IntelliJ IDEA
|
||||||
|
.idea/*
|
||||||
|
# NetBeans
|
||||||
|
nbproject/*
|
||||||
|
# Visual Studio Code
|
||||||
|
.vscode
|
||||||
|
# Sass preprocessor
|
||||||
|
.sass-cache/
|
|
@ -0,0 +1,51 @@
|
||||||
|
# CakePHP Application Skeleton
|
||||||
|
|
||||||
|
[![Build Status](https://img.shields.io/travis/cakephp/app/master.svg?style=flat-square)](https://travis-ci.org/cakephp/app)
|
||||||
|
[![Total Downloads](https://img.shields.io/packagist/dt/cakephp/app.svg?style=flat-square)](https://packagist.org/packages/cakephp/app)
|
||||||
|
|
||||||
|
A skeleton for creating applications with [CakePHP](https://cakephp.org) 3.x.
|
||||||
|
|
||||||
|
The framework source code can be found here: [cakephp/cakephp](https://github.com/cakephp/cakephp).
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
1. Download [Composer](https://getcomposer.org/doc/00-intro.md) or update `composer self-update`.
|
||||||
|
2. Run `php composer.phar create-project --prefer-dist cakephp/app [app_name]`.
|
||||||
|
|
||||||
|
If Composer is installed globally, run
|
||||||
|
|
||||||
|
```bash
|
||||||
|
composer create-project --prefer-dist cakephp/app
|
||||||
|
```
|
||||||
|
|
||||||
|
In case you want to use a custom app dir name (e.g. `/myapp/`):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
composer create-project --prefer-dist cakephp/app myapp
|
||||||
|
```
|
||||||
|
|
||||||
|
You can now either use your machine's webserver to view the default home page, or start
|
||||||
|
up the built-in webserver with:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bin/cake server -p 8765
|
||||||
|
```
|
||||||
|
|
||||||
|
Then visit `http://localhost:8765` to see the welcome page.
|
||||||
|
|
||||||
|
## Update
|
||||||
|
|
||||||
|
Since this skeleton is a starting point for your application and various files
|
||||||
|
would have been modified as per your needs, there isn't a way to provide
|
||||||
|
automated upgrades, so you have to do any updates manually.
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
Read and edit `config/app.php` and setup the `'Datasources'` and any other
|
||||||
|
configuration relevant for your application.
|
||||||
|
|
||||||
|
## Layout
|
||||||
|
|
||||||
|
The app skeleton uses a subset of [Foundation](http://foundation.zurb.com/) (v5) CSS
|
||||||
|
framework by default. You can, however, replace it with any other library or
|
||||||
|
custom styles.
|
|
@ -0,0 +1,75 @@
|
||||||
|
#!/usr/bin/env sh
|
||||||
|
################################################################################
|
||||||
|
#
|
||||||
|
# Cake is a shell script for invoking CakePHP shell commands
|
||||||
|
#
|
||||||
|
# CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
# Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
#
|
||||||
|
# Licensed under The MIT License
|
||||||
|
# For full copyright and license information, please see the LICENSE.txt
|
||||||
|
# Redistributions of files must retain the above copyright notice.
|
||||||
|
#
|
||||||
|
# @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
# @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
# @since 1.2.0
|
||||||
|
# @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
#
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
# Canonicalize by following every symlink of the given name recursively
|
||||||
|
canonicalize() {
|
||||||
|
NAME="$1"
|
||||||
|
if [ -f "$NAME" ]
|
||||||
|
then
|
||||||
|
DIR=$(dirname -- "$NAME")
|
||||||
|
NAME=$(cd -P "$DIR" > /dev/null && pwd -P)/$(basename -- "$NAME")
|
||||||
|
fi
|
||||||
|
while [ -h "$NAME" ]; do
|
||||||
|
DIR=$(dirname -- "$NAME")
|
||||||
|
SYM=$(readlink "$NAME")
|
||||||
|
NAME=$(cd "$DIR" > /dev/null && cd "$(dirname -- "$SYM")" > /dev/null && pwd)/$(basename -- "$SYM")
|
||||||
|
done
|
||||||
|
echo "$NAME"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Find a CLI version of PHP
|
||||||
|
findCliPhp() {
|
||||||
|
for TESTEXEC in php php-cli /usr/local/bin/php
|
||||||
|
do
|
||||||
|
SAPI=$(echo "<?= PHP_SAPI ?>" | $TESTEXEC 2>/dev/null)
|
||||||
|
if [ "$SAPI" = "cli" ]
|
||||||
|
then
|
||||||
|
echo $TESTEXEC
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "Failed to find a CLI version of PHP; falling back to system standard php executable" >&2
|
||||||
|
echo "php";
|
||||||
|
}
|
||||||
|
|
||||||
|
# If current path is a symlink, resolve to real path
|
||||||
|
realname="$0"
|
||||||
|
if [ -L "$realname" ]
|
||||||
|
then
|
||||||
|
realname=$(readlink -f "$0")
|
||||||
|
fi
|
||||||
|
|
||||||
|
CONSOLE=$(dirname -- "$(canonicalize "$realname")")
|
||||||
|
APP=$(dirname "$CONSOLE")
|
||||||
|
|
||||||
|
# If your CLI PHP is somewhere that this doesn't find, you can define a PHP environment
|
||||||
|
# variable with the correct path in it.
|
||||||
|
if [ -z "$PHP" ]
|
||||||
|
then
|
||||||
|
PHP=$(findCliPhp)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$(basename "$realname")" != 'cake' ]
|
||||||
|
then
|
||||||
|
exec "$PHP" "$CONSOLE"/cake.php "$(basename "$realname")" "$@"
|
||||||
|
else
|
||||||
|
exec "$PHP" "$CONSOLE"/cake.php "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit
|
|
@ -0,0 +1,27 @@
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
::
|
||||||
|
:: Cake is a Windows batch script for invoking CakePHP shell commands
|
||||||
|
::
|
||||||
|
:: CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
:: Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
::
|
||||||
|
:: Licensed under The MIT License
|
||||||
|
:: Redistributions of files must retain the above copyright notice.
|
||||||
|
::
|
||||||
|
:: @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
:: @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
:: @since 2.0.0
|
||||||
|
:: @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
::
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
@echo off
|
||||||
|
|
||||||
|
SET app=%0
|
||||||
|
SET lib=%~dp0
|
||||||
|
|
||||||
|
php "%lib%cake.php" %*
|
||||||
|
|
||||||
|
echo.
|
||||||
|
|
||||||
|
exit /B %ERRORLEVEL%
|
|
@ -0,0 +1,12 @@
|
||||||
|
#!/usr/bin/php -q
|
||||||
|
<?php
|
||||||
|
// Check platform requirements
|
||||||
|
require dirname(__DIR__) . '/config/requirements.php';
|
||||||
|
require dirname(__DIR__) . '/vendor/autoload.php';
|
||||||
|
|
||||||
|
use App\Application;
|
||||||
|
use Cake\Console\CommandRunner;
|
||||||
|
|
||||||
|
// Build the runner with an application and root executable name.
|
||||||
|
$runner = new CommandRunner(new Application(dirname(__DIR__) . '/config'), 'cake');
|
||||||
|
exit($runner->run($argv));
|
|
@ -0,0 +1,53 @@
|
||||||
|
{
|
||||||
|
"name": "cakephp/app",
|
||||||
|
"description": "CakePHP skeleton app",
|
||||||
|
"homepage": "https://cakephp.org",
|
||||||
|
"type": "project",
|
||||||
|
"license": "MIT",
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.6",
|
||||||
|
"cakephp/cakephp": "3.8.*",
|
||||||
|
"cakephp/migrations": "^2.0.0",
|
||||||
|
"cakephp/plugin-installer": "^1.0",
|
||||||
|
"mobiledetect/mobiledetectlib": "2.*"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"cakephp/bake": "^1.9.0",
|
||||||
|
"cakephp/cakephp-codesniffer": "^3.0",
|
||||||
|
"cakephp/debug_kit": "^3.17.0",
|
||||||
|
"josegonzalez/dotenv": "3.*",
|
||||||
|
"phpunit/phpunit": "^5|^6",
|
||||||
|
"psy/psysh": "@stable"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"markstory/asset_compress": "An asset compression plugin which provides file concatenation and a flexible filter system for preprocessing and minification.",
|
||||||
|
"dereuromark/cakephp-ide-helper": "After baking your code, this keeps your annotations in sync with the code evolving from there on for maximum IDE and PHPStan compatibility."
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"App\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload-dev": {
|
||||||
|
"psr-4": {
|
||||||
|
"App\\Test\\": "tests/",
|
||||||
|
"Cake\\Test\\": "vendor/cakephp/cakephp/tests/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"post-install-cmd": "App\\Console\\Installer::postInstall",
|
||||||
|
"post-create-project-cmd": "App\\Console\\Installer::postInstall",
|
||||||
|
"post-autoload-dump": "Cake\\Composer\\Installer\\PluginInstaller::postAutoloadDump",
|
||||||
|
"check": [
|
||||||
|
"@test",
|
||||||
|
"@cs-check"
|
||||||
|
],
|
||||||
|
"cs-check": "phpcs --colors -p --standard=vendor/cakephp/cakephp-codesniffer/CakePHP src/ tests/",
|
||||||
|
"cs-fix": "phpcbf --colors --standard=vendor/cakephp/cakephp-codesniffer/CakePHP src/ tests/",
|
||||||
|
"test": "phpunit --colors=always"
|
||||||
|
},
|
||||||
|
"prefer-stable": true,
|
||||||
|
"config": {
|
||||||
|
"sort-packages": true
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,38 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# Used as a default to seed config/.env which
|
||||||
|
# enables you to use environment variables to configure
|
||||||
|
# the aspects of your application that vary by
|
||||||
|
# environment.
|
||||||
|
#
|
||||||
|
# Having this file in production is considered a **SECURITY RISK** and also decreases
|
||||||
|
# the boostrap performance of your application.
|
||||||
|
#
|
||||||
|
# To use this file, first copy it into `config/.env`. Also ensure the related
|
||||||
|
# code block for loading this file is uncommented in `config/boostrap.php`
|
||||||
|
#
|
||||||
|
# In development .env files are parsed by PHP
|
||||||
|
# and set into the environment. This provides a simpler
|
||||||
|
# development workflow over standard environment variables.
|
||||||
|
export APP_NAME="__APP_NAME__"
|
||||||
|
export DEBUG="true"
|
||||||
|
export APP_ENCODING="UTF-8"
|
||||||
|
export APP_DEFAULT_LOCALE="en_US"
|
||||||
|
export APP_DEFAULT_TIMEZONE="UTC"
|
||||||
|
export SECURITY_SALT="__SALT__"
|
||||||
|
|
||||||
|
# Uncomment these to define cache configuration via environment variables.
|
||||||
|
#export CACHE_DURATION="+2 minutes"
|
||||||
|
#export CACHE_DEFAULT_URL="file://tmp/cache/?prefix=${APP_NAME}_default&duration=${CACHE_DURATION}"
|
||||||
|
#export CACHE_CAKECORE_URL="file://tmp/cache/persistent?prefix=${APP_NAME}_cake_core&serialize=true&duration=${CACHE_DURATION}"
|
||||||
|
#export CACHE_CAKEMODEL_URL="file://tmp/cache/models?prefix=${APP_NAME}_cake_model&serialize=true&duration=${CACHE_DURATION}"
|
||||||
|
|
||||||
|
# Uncomment these to define email transport configuration via environment variables.
|
||||||
|
#export EMAIL_TRANSPORT_DEFAULT_URL=""
|
||||||
|
|
||||||
|
# Uncomment these to define database configuration via environment variables.
|
||||||
|
#export DATABASE_URL="mysql://my_app:secret@localhost/${APP_NAME}?encoding=utf8&timezone=UTC&cacheMetadata=true"eIdentifiers=false&persistent=false"
|
||||||
|
#export DATABASE_TEST_URL="mysql://my_app:secret@localhost/test_${APP_NAME}?encoding=utf8&timezone=UTC&cacheMetadata=true"eIdentifiers=false&persistent=false"
|
||||||
|
|
||||||
|
# Uncomment these to define logging configuration via environment variables.
|
||||||
|
#export LOG_DEBUG_URL="file://logs/?levels[]=notice&levels[]=info&levels[]=debug&file=debug"
|
||||||
|
#export LOG_ERROR_URL="file://logs/?levels[]=warning&levels[]=error&levels[]=critical&levels[]=alert&levels[]=emergency&file=error"
|
|
@ -0,0 +1,394 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Cake\Cache\Engine\FileEngine;
|
||||||
|
use Cake\Database\Connection;
|
||||||
|
use Cake\Database\Driver\Mysql;
|
||||||
|
use Cake\Error\ExceptionRenderer;
|
||||||
|
use Cake\Log\Engine\FileLog;
|
||||||
|
use Cake\Mailer\Transport\MailTransport;
|
||||||
|
|
||||||
|
return [
|
||||||
|
/**
|
||||||
|
* Debug Level:
|
||||||
|
*
|
||||||
|
* Production Mode:
|
||||||
|
* false: No error messages, errors, or warnings shown.
|
||||||
|
*
|
||||||
|
* Development Mode:
|
||||||
|
* true: Errors and warnings shown.
|
||||||
|
*/
|
||||||
|
'debug' => filter_var(env('DEBUG', true), FILTER_VALIDATE_BOOLEAN),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure basic information about the application.
|
||||||
|
*
|
||||||
|
* - namespace - The namespace to find app classes under.
|
||||||
|
* - defaultLocale - The default locale for translation, formatting currencies and numbers, date and time.
|
||||||
|
* - encoding - The encoding used for HTML + database connections.
|
||||||
|
* - base - The base directory the app resides in. If false this
|
||||||
|
* will be auto detected.
|
||||||
|
* - dir - Name of app directory.
|
||||||
|
* - webroot - The webroot directory.
|
||||||
|
* - wwwRoot - The file path to webroot.
|
||||||
|
* - baseUrl - To configure CakePHP to *not* use mod_rewrite and to
|
||||||
|
* use CakePHP pretty URLs, remove these .htaccess
|
||||||
|
* files:
|
||||||
|
* /.htaccess
|
||||||
|
* /webroot/.htaccess
|
||||||
|
* And uncomment the baseUrl key below.
|
||||||
|
* - fullBaseUrl - A base URL to use for absolute links. When set to false (default)
|
||||||
|
* CakePHP generates required value based on `HTTP_HOST` environment variable.
|
||||||
|
* However, you can define it manually to optimize performance or if you
|
||||||
|
* are concerned about people manipulating the `Host` header.
|
||||||
|
* - imageBaseUrl - Web path to the public images directory under webroot.
|
||||||
|
* - cssBaseUrl - Web path to the public css directory under webroot.
|
||||||
|
* - jsBaseUrl - Web path to the public js directory under webroot.
|
||||||
|
* - paths - Configure paths for non class based resources. Supports the
|
||||||
|
* `plugins`, `templates`, `locales` subkeys, which allow the definition of
|
||||||
|
* paths for plugins, view templates and locale files respectively.
|
||||||
|
*/
|
||||||
|
'App' => [
|
||||||
|
'namespace' => 'App',
|
||||||
|
'encoding' => env('APP_ENCODING', 'UTF-8'),
|
||||||
|
'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US'),
|
||||||
|
'defaultTimezone' => env('APP_DEFAULT_TIMEZONE', 'UTC'),
|
||||||
|
'base' => false,
|
||||||
|
'dir' => 'src',
|
||||||
|
'webroot' => 'webroot',
|
||||||
|
'wwwRoot' => WWW_ROOT,
|
||||||
|
//'baseUrl' => env('SCRIPT_NAME'),
|
||||||
|
'fullBaseUrl' => false,
|
||||||
|
'imageBaseUrl' => 'img/',
|
||||||
|
'cssBaseUrl' => 'css/',
|
||||||
|
'jsBaseUrl' => 'js/',
|
||||||
|
'paths' => [
|
||||||
|
'plugins' => [ROOT . DS . 'plugins' . DS],
|
||||||
|
'templates' => [APP . 'Template' . DS],
|
||||||
|
'locales' => [APP . 'Locale' . DS],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Security and encryption configuration
|
||||||
|
*
|
||||||
|
* - salt - A random string used in security hashing methods.
|
||||||
|
* The salt value is also used as the encryption key.
|
||||||
|
* You should treat it as extremely sensitive data.
|
||||||
|
*/
|
||||||
|
'Security' => [
|
||||||
|
'salt' => env('SECURITY_SALT', '__SALT__'),
|
||||||
|
],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apply timestamps with the last modified time to static assets (js, css, images).
|
||||||
|
* Will append a querystring parameter containing the time the file was modified.
|
||||||
|
* This is useful for busting browser caches.
|
||||||
|
*
|
||||||
|
* Set to true to apply timestamps when debug is true. Set to 'force' to always
|
||||||
|
* enable timestamping regardless of debug value.
|
||||||
|
*/
|
||||||
|
'Asset' => [
|
||||||
|
//'timestamp' => true,
|
||||||
|
// 'cacheTime' => '+1 year'
|
||||||
|
],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure the cache adapters.
|
||||||
|
*/
|
||||||
|
'Cache' => [
|
||||||
|
'default' => [
|
||||||
|
'className' => FileEngine::class,
|
||||||
|
'path' => CACHE,
|
||||||
|
'url' => env('CACHE_DEFAULT_URL', null),
|
||||||
|
],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure the cache used for general framework caching.
|
||||||
|
* Translation cache files are stored with this configuration.
|
||||||
|
* Duration will be set to '+2 minutes' in bootstrap.php when debug = true
|
||||||
|
* If you set 'className' => 'Null' core cache will be disabled.
|
||||||
|
*/
|
||||||
|
'_cake_core_' => [
|
||||||
|
'className' => FileEngine::class,
|
||||||
|
'prefix' => 'myapp_cake_core_',
|
||||||
|
'path' => CACHE . 'persistent/',
|
||||||
|
'serialize' => true,
|
||||||
|
'duration' => '+1 years',
|
||||||
|
'url' => env('CACHE_CAKECORE_URL', null),
|
||||||
|
],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure the cache for model and datasource caches. This cache
|
||||||
|
* configuration is used to store schema descriptions, and table listings
|
||||||
|
* in connections.
|
||||||
|
* Duration will be set to '+2 minutes' in bootstrap.php when debug = true
|
||||||
|
*/
|
||||||
|
'_cake_model_' => [
|
||||||
|
'className' => FileEngine::class,
|
||||||
|
'prefix' => 'myapp_cake_model_',
|
||||||
|
'path' => CACHE . 'models/',
|
||||||
|
'serialize' => true,
|
||||||
|
'duration' => '+1 years',
|
||||||
|
'url' => env('CACHE_CAKEMODEL_URL', null),
|
||||||
|
],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure the cache for routes. The cached routes collection is built the
|
||||||
|
* first time the routes are processed via `config/routes.php`.
|
||||||
|
* Duration will be set to '+2 seconds' in bootstrap.php when debug = true
|
||||||
|
*/
|
||||||
|
'_cake_routes_' => [
|
||||||
|
'className' => FileEngine::class,
|
||||||
|
'prefix' => 'myapp_cake_routes_',
|
||||||
|
'path' => CACHE,
|
||||||
|
'serialize' => true,
|
||||||
|
'duration' => '+1 years',
|
||||||
|
'url' => env('CACHE_CAKEROUTES_URL', null),
|
||||||
|
],
|
||||||
|
],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure the Error and Exception handlers used by your application.
|
||||||
|
*
|
||||||
|
* By default errors are displayed using Debugger, when debug is true and logged
|
||||||
|
* by Cake\Log\Log when debug is false.
|
||||||
|
*
|
||||||
|
* In CLI environments exceptions will be printed to stderr with a backtrace.
|
||||||
|
* In web environments an HTML page will be displayed for the exception.
|
||||||
|
* With debug true, framework errors like Missing Controller will be displayed.
|
||||||
|
* When debug is false, framework errors will be coerced into generic HTTP errors.
|
||||||
|
*
|
||||||
|
* Options:
|
||||||
|
*
|
||||||
|
* - `errorLevel` - int - The level of errors you are interested in capturing.
|
||||||
|
* - `trace` - boolean - Whether or not backtraces should be included in
|
||||||
|
* logged errors/exceptions.
|
||||||
|
* - `log` - boolean - Whether or not you want exceptions logged.
|
||||||
|
* - `exceptionRenderer` - string - The class responsible for rendering
|
||||||
|
* uncaught exceptions. If you choose a custom class you should place
|
||||||
|
* the file for that class in src/Error. This class needs to implement a
|
||||||
|
* render method.
|
||||||
|
* - `skipLog` - array - List of exceptions to skip for logging. Exceptions that
|
||||||
|
* extend one of the listed exceptions will also be skipped for logging.
|
||||||
|
* E.g.:
|
||||||
|
* `'skipLog' => ['Cake\Http\Exception\NotFoundException', 'Cake\Http\Exception\UnauthorizedException']`
|
||||||
|
* - `extraFatalErrorMemory` - int - The number of megabytes to increase
|
||||||
|
* the memory limit by when a fatal error is encountered. This allows
|
||||||
|
* breathing room to complete logging or error handling.
|
||||||
|
*/
|
||||||
|
'Error' => [
|
||||||
|
'errorLevel' => E_ALL,
|
||||||
|
'exceptionRenderer' => ExceptionRenderer::class,
|
||||||
|
'skipLog' => [],
|
||||||
|
'log' => true,
|
||||||
|
'trace' => true,
|
||||||
|
],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Email configuration.
|
||||||
|
*
|
||||||
|
* By defining transports separately from delivery profiles you can easily
|
||||||
|
* re-use transport configuration across multiple profiles.
|
||||||
|
*
|
||||||
|
* You can specify multiple configurations for production, development and
|
||||||
|
* testing.
|
||||||
|
*
|
||||||
|
* Each transport needs a `className`. Valid options are as follows:
|
||||||
|
*
|
||||||
|
* Mail - Send using PHP mail function
|
||||||
|
* Smtp - Send using SMTP
|
||||||
|
* Debug - Do not send the email, just return the result
|
||||||
|
*
|
||||||
|
* You can add custom transports (or override existing transports) by adding the
|
||||||
|
* appropriate file to src/Mailer/Transport. Transports should be named
|
||||||
|
* 'YourTransport.php', where 'Your' is the name of the transport.
|
||||||
|
*/
|
||||||
|
'EmailTransport' => [
|
||||||
|
'default' => [
|
||||||
|
'className' => MailTransport::class,
|
||||||
|
/*
|
||||||
|
* The following keys are used in SMTP transports:
|
||||||
|
*/
|
||||||
|
'host' => 'localhost',
|
||||||
|
'port' => 25,
|
||||||
|
'timeout' => 30,
|
||||||
|
'username' => null,
|
||||||
|
'password' => null,
|
||||||
|
'client' => null,
|
||||||
|
'tls' => null,
|
||||||
|
'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null),
|
||||||
|
],
|
||||||
|
],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Email delivery profiles
|
||||||
|
*
|
||||||
|
* Delivery profiles allow you to predefine various properties about email
|
||||||
|
* messages from your application and give the settings a name. This saves
|
||||||
|
* duplication across your application and makes maintenance and development
|
||||||
|
* easier. Each profile accepts a number of keys. See `Cake\Mailer\Email`
|
||||||
|
* for more information.
|
||||||
|
*/
|
||||||
|
'Email' => [
|
||||||
|
'default' => [
|
||||||
|
'transport' => 'default',
|
||||||
|
'from' => 'you@localhost',
|
||||||
|
//'charset' => 'utf-8',
|
||||||
|
//'headerCharset' => 'utf-8',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Connection information used by the ORM to connect
|
||||||
|
* to your application's datastores.
|
||||||
|
*
|
||||||
|
* ### Notes
|
||||||
|
* - Drivers include Mysql Postgres Sqlite Sqlserver
|
||||||
|
* See vendor\cakephp\cakephp\src\Database\Driver for complete list
|
||||||
|
* - Do not use periods in database name - it may lead to error.
|
||||||
|
* See https://github.com/cakephp/cakephp/issues/6471 for details.
|
||||||
|
* - 'encoding' is recommended to be set to full UTF-8 4-Byte support.
|
||||||
|
* E.g set it to 'utf8mb4' in MariaDB and MySQL and 'utf8' for any
|
||||||
|
* other RDBMS.
|
||||||
|
*/
|
||||||
|
'Datasources' => [
|
||||||
|
'default' => [
|
||||||
|
'className' => Connection::class,
|
||||||
|
'driver' => Mysql::class,
|
||||||
|
'persistent' => false,
|
||||||
|
'host' => 'localhost',
|
||||||
|
/*
|
||||||
|
* CakePHP will use the default DB port based on the driver selected
|
||||||
|
* MySQL on MAMP uses port 8889, MAMP users will want to uncomment
|
||||||
|
* the following line and set the port accordingly
|
||||||
|
*/
|
||||||
|
//'port' => 'non_standard_port_number',
|
||||||
|
'username' => 'my_app',
|
||||||
|
'password' => 'secret',
|
||||||
|
'database' => 'my_app',
|
||||||
|
/*
|
||||||
|
* You do not need to set this flag to use full utf-8 encoding (internal default since CakePHP 3.6).
|
||||||
|
*/
|
||||||
|
//'encoding' => 'utf8mb4',
|
||||||
|
'timezone' => 'UTC',
|
||||||
|
'flags' => [],
|
||||||
|
'cacheMetadata' => true,
|
||||||
|
'log' => false,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set identifier quoting to true if you are using reserved words or
|
||||||
|
* special characters in your table or column names. Enabling this
|
||||||
|
* setting will result in queries built using the Query Builder having
|
||||||
|
* identifiers quoted when creating SQL. It should be noted that this
|
||||||
|
* decreases performance because each query needs to be traversed and
|
||||||
|
* manipulated before being executed.
|
||||||
|
*/
|
||||||
|
'quoteIdentifiers' => false,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* During development, if using MySQL < 5.6, uncommenting the
|
||||||
|
* following line could boost the speed at which schema metadata is
|
||||||
|
* fetched from the database. It can also be set directly with the
|
||||||
|
* mysql configuration directive 'innodb_stats_on_metadata = 0'
|
||||||
|
* which is the recommended value in production environments
|
||||||
|
*/
|
||||||
|
//'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
|
||||||
|
|
||||||
|
'url' => env('DATABASE_URL', null),
|
||||||
|
],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The test connection is used during the test suite.
|
||||||
|
*/
|
||||||
|
'test' => [
|
||||||
|
'className' => Connection::class,
|
||||||
|
'driver' => Mysql::class,
|
||||||
|
'persistent' => false,
|
||||||
|
'host' => 'localhost',
|
||||||
|
//'port' => 'non_standard_port_number',
|
||||||
|
'username' => 'my_app',
|
||||||
|
'password' => 'secret',
|
||||||
|
'database' => 'test_myapp',
|
||||||
|
//'encoding' => 'utf8mb4',
|
||||||
|
'timezone' => 'UTC',
|
||||||
|
'cacheMetadata' => true,
|
||||||
|
'quoteIdentifiers' => false,
|
||||||
|
'log' => false,
|
||||||
|
//'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
|
||||||
|
'url' => env('DATABASE_TEST_URL', null),
|
||||||
|
],
|
||||||
|
],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures logging options
|
||||||
|
*/
|
||||||
|
'Log' => [
|
||||||
|
'debug' => [
|
||||||
|
'className' => FileLog::class,
|
||||||
|
'path' => LOGS,
|
||||||
|
'file' => 'debug',
|
||||||
|
'url' => env('LOG_DEBUG_URL', null),
|
||||||
|
'scopes' => false,
|
||||||
|
'levels' => ['notice', 'info', 'debug'],
|
||||||
|
],
|
||||||
|
'error' => [
|
||||||
|
'className' => FileLog::class,
|
||||||
|
'path' => LOGS,
|
||||||
|
'file' => 'error',
|
||||||
|
'url' => env('LOG_ERROR_URL', null),
|
||||||
|
'scopes' => false,
|
||||||
|
'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'],
|
||||||
|
],
|
||||||
|
// To enable this dedicated query log, you need set your datasource's log flag to true
|
||||||
|
'queries' => [
|
||||||
|
'className' => FileLog::class,
|
||||||
|
'path' => LOGS,
|
||||||
|
'file' => 'queries',
|
||||||
|
'url' => env('LOG_QUERIES_URL', null),
|
||||||
|
'scopes' => ['queriesLog'],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Session configuration.
|
||||||
|
*
|
||||||
|
* Contains an array of settings to use for session configuration. The
|
||||||
|
* `defaults` key is used to define a default preset to use for sessions, any
|
||||||
|
* settings declared here will override the settings of the default config.
|
||||||
|
*
|
||||||
|
* ## Options
|
||||||
|
*
|
||||||
|
* - `cookie` - The name of the cookie to use. Defaults to 'CAKEPHP'. Avoid using `.` in cookie names,
|
||||||
|
* as PHP will drop sessions from cookies with `.` in the name.
|
||||||
|
* - `cookiePath` - The url path for which session cookie is set. Maps to the
|
||||||
|
* `session.cookie_path` php.ini config. Defaults to base path of app.
|
||||||
|
* - `timeout` - The time in minutes the session should be valid for.
|
||||||
|
* Pass 0 to disable checking timeout.
|
||||||
|
* Please note that php.ini's session.gc_maxlifetime must be equal to or greater
|
||||||
|
* than the largest Session['timeout'] in all served websites for it to have the
|
||||||
|
* desired effect.
|
||||||
|
* - `defaults` - The default configuration set to use as a basis for your session.
|
||||||
|
* There are four built-in options: php, cake, cache, database.
|
||||||
|
* - `handler` - Can be used to enable a custom session handler. Expects an
|
||||||
|
* array with at least the `engine` key, being the name of the Session engine
|
||||||
|
* class to use for managing the session. CakePHP bundles the `CacheSession`
|
||||||
|
* and `DatabaseSession` engines.
|
||||||
|
* - `ini` - An associative array of additional ini values to set.
|
||||||
|
*
|
||||||
|
* The built-in `defaults` options are:
|
||||||
|
*
|
||||||
|
* - 'php' - Uses settings defined in your php.ini.
|
||||||
|
* - 'cake' - Saves session files in CakePHP's /tmp directory.
|
||||||
|
* - 'database' - Uses CakePHP's database sessions.
|
||||||
|
* - 'cache' - Use the Cache class to save sessions.
|
||||||
|
*
|
||||||
|
* To define a custom session handler, save it at src/Network/Session/<name>.php.
|
||||||
|
* Make sure the class implements PHP's `SessionHandlerInterface` and set
|
||||||
|
* Session.handler to <name>
|
||||||
|
*
|
||||||
|
* To use database sessions, load the SQL file located at config/schema/sessions.sql
|
||||||
|
*/
|
||||||
|
'Session' => [
|
||||||
|
'defaults' => 'php',
|
||||||
|
],
|
||||||
|
];
|
|
@ -0,0 +1,209 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 0.10.8
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Configure paths required to find CakePHP + general filepath constants
|
||||||
|
*/
|
||||||
|
require __DIR__ . '/paths.php';
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Bootstrap CakePHP.
|
||||||
|
*
|
||||||
|
* Does the various bits of setup that CakePHP needs to do.
|
||||||
|
* This includes:
|
||||||
|
*
|
||||||
|
* - Registering the CakePHP autoloader.
|
||||||
|
* - Setting the default application paths.
|
||||||
|
*/
|
||||||
|
require CORE_PATH . 'config' . DS . 'bootstrap.php';
|
||||||
|
|
||||||
|
use Cake\Cache\Cache;
|
||||||
|
use Cake\Console\ConsoleErrorHandler;
|
||||||
|
use Cake\Core\Configure;
|
||||||
|
use Cake\Core\Configure\Engine\PhpConfig;
|
||||||
|
use Cake\Core\Plugin;
|
||||||
|
use Cake\Database\Type;
|
||||||
|
use Cake\Datasource\ConnectionManager;
|
||||||
|
use Cake\Error\ErrorHandler;
|
||||||
|
use Cake\Http\ServerRequest;
|
||||||
|
use Cake\Log\Log;
|
||||||
|
use Cake\Mailer\Email;
|
||||||
|
use Cake\Mailer\TransportFactory;
|
||||||
|
use Cake\Utility\Inflector;
|
||||||
|
use Cake\Utility\Security;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uncomment block of code below if you want to use `.env` file during development.
|
||||||
|
* You should copy `config/.env.default to `config/.env` and set/modify the
|
||||||
|
* variables as required.
|
||||||
|
*
|
||||||
|
* It is HIGHLY discouraged to use a .env file in production, due to security risks
|
||||||
|
* and decreased performance on each request. The purpose of the .env file is to emulate
|
||||||
|
* the presence of the environment variables like they would be present in production.
|
||||||
|
*/
|
||||||
|
// if (!env('APP_NAME') && file_exists(CONFIG . '.env')) {
|
||||||
|
// $dotenv = new \josegonzalez\Dotenv\Loader([CONFIG . '.env']);
|
||||||
|
// $dotenv->parse()
|
||||||
|
// ->putenv()
|
||||||
|
// ->toEnv()
|
||||||
|
// ->toServer();
|
||||||
|
// }
|
||||||
|
|
||||||
|
Log::setConfig('default', [
|
||||||
|
'className' => 'File',
|
||||||
|
'path' => '/var/log/',
|
||||||
|
'file' => 'php_errors.log'
|
||||||
|
]);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Read configuration file and inject configuration into various
|
||||||
|
* CakePHP classes.
|
||||||
|
*
|
||||||
|
* By default there is only one configuration file. It is often a good
|
||||||
|
* idea to create multiple configuration files, and separate the configuration
|
||||||
|
* that changes from configuration that does not. This makes deployment simpler.
|
||||||
|
*/
|
||||||
|
try {
|
||||||
|
Configure::config('default', new PhpConfig());
|
||||||
|
Configure::load('app', 'default', false);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
exit($e->getMessage() . "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Load an environment local configuration file.
|
||||||
|
* You can use a file like app_local.php to provide local overrides to your
|
||||||
|
* shared configuration.
|
||||||
|
*/
|
||||||
|
//Configure::load('app_local', 'default');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When debug = true the metadata cache should only last
|
||||||
|
* for a short time.
|
||||||
|
*/
|
||||||
|
if (Configure::read('debug')) {
|
||||||
|
Configure::write('Cache._cake_model_.duration', '+2 minutes');
|
||||||
|
Configure::write('Cache._cake_core_.duration', '+2 minutes');
|
||||||
|
// disable router cache during development
|
||||||
|
Configure::write('Cache._cake_routes_.duration', '+2 seconds');
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the default server timezone. Using UTC makes time calculations / conversions easier.
|
||||||
|
* Check http://php.net/manual/en/timezones.php for list of valid timezone strings.
|
||||||
|
*/
|
||||||
|
date_default_timezone_set(Configure::read('App.defaultTimezone'));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Configure the mbstring extension to use the correct encoding.
|
||||||
|
*/
|
||||||
|
mb_internal_encoding(Configure::read('App.encoding'));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the default locale. This controls how dates, number and currency is
|
||||||
|
* formatted and sets the default language to use for translations.
|
||||||
|
*/
|
||||||
|
ini_set('intl.default_locale', Configure::read('App.defaultLocale'));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Register application error and exception handlers.
|
||||||
|
*/
|
||||||
|
$isCli = PHP_SAPI === 'cli';
|
||||||
|
if ($isCli) {
|
||||||
|
(new ConsoleErrorHandler(Configure::read('Error')))->register();
|
||||||
|
} else {
|
||||||
|
(new ErrorHandler(Configure::read('Error')))->register();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Include the CLI bootstrap overrides.
|
||||||
|
*/
|
||||||
|
if ($isCli) {
|
||||||
|
require __DIR__ . '/bootstrap_cli.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the full base URL.
|
||||||
|
* This URL is used as the base of all absolute links.
|
||||||
|
*
|
||||||
|
* If you define fullBaseUrl in your config file you can remove this.
|
||||||
|
*/
|
||||||
|
if (!Configure::read('App.fullBaseUrl')) {
|
||||||
|
$s = null;
|
||||||
|
if (env('HTTPS')) {
|
||||||
|
$s = 's';
|
||||||
|
}
|
||||||
|
|
||||||
|
$httpHost = env('HTTP_HOST');
|
||||||
|
if (isset($httpHost)) {
|
||||||
|
Configure::write('App.fullBaseUrl', 'http' . $s . '://' . $httpHost);
|
||||||
|
}
|
||||||
|
unset($httpHost, $s);
|
||||||
|
}
|
||||||
|
|
||||||
|
Cache::setConfig(Configure::consume('Cache'));
|
||||||
|
ConnectionManager::setConfig(Configure::consume('Datasources'));
|
||||||
|
TransportFactory::setConfig(Configure::consume('EmailTransport'));
|
||||||
|
Email::setConfig(Configure::consume('Email'));
|
||||||
|
Log::setConfig(Configure::consume('Log'));
|
||||||
|
Security::setSalt(Configure::consume('Security.salt'));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The default crypto extension in 3.0 is OpenSSL.
|
||||||
|
* If you are migrating from 2.x uncomment this code to
|
||||||
|
* use a more compatible Mcrypt based implementation
|
||||||
|
*/
|
||||||
|
//Security::engine(new \Cake\Utility\Crypto\Mcrypt());
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Setup detectors for mobile and tablet.
|
||||||
|
*/
|
||||||
|
ServerRequest::addDetector('mobile', function ($request) {
|
||||||
|
$detector = new \Detection\MobileDetect();
|
||||||
|
|
||||||
|
return $detector->isMobile();
|
||||||
|
});
|
||||||
|
ServerRequest::addDetector('tablet', function ($request) {
|
||||||
|
$detector = new \Detection\MobileDetect();
|
||||||
|
|
||||||
|
return $detector->isTablet();
|
||||||
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Enable immutable time objects in the ORM.
|
||||||
|
*
|
||||||
|
* You can enable default locale format parsing by adding calls
|
||||||
|
* to `useLocaleParser()`. This enables the automatic conversion of
|
||||||
|
* locale specific date formats. For details see
|
||||||
|
* @link https://book.cakephp.org/3.0/en/core-libraries/internationalization-and-localization.html#parsing-localized-datetime-data
|
||||||
|
*/
|
||||||
|
Type::build('time')
|
||||||
|
->useImmutable();
|
||||||
|
Type::build('date')
|
||||||
|
->useImmutable();
|
||||||
|
Type::build('datetime')
|
||||||
|
->useImmutable();
|
||||||
|
Type::build('timestamp')
|
||||||
|
->useImmutable();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Custom Inflector rules, can be set to correctly pluralize or singularize
|
||||||
|
* table, model, controller names or whatever other string is passed to the
|
||||||
|
* inflection functions.
|
||||||
|
*/
|
||||||
|
//Inflector::rules('plural', ['/^(inflect)or$/i' => '\1ables']);
|
||||||
|
//Inflector::rules('irregular', ['red' => 'redlings']);
|
||||||
|
//Inflector::rules('uninflected', ['dontinflectme']);
|
||||||
|
//Inflector::rules('transliteration', ['/å/' => 'aa']);
|
|
@ -0,0 +1,28 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 3.0.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
use Cake\Core\Configure;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Additional bootstrapping and configuration for CLI environments should
|
||||||
|
* be put here.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Set the fullBaseUrl to allow URLs to be generated in shell tasks.
|
||||||
|
// This is useful when sending email from shells.
|
||||||
|
//Configure::write('App.fullBaseUrl', php_uname('n'));
|
||||||
|
|
||||||
|
// Set logs to different files so they don't have permission conflicts.
|
||||||
|
Configure::write('Log.debug.file', 'cli-debug');
|
||||||
|
Configure::write('Log.error.file', 'cli-error');
|
|
@ -0,0 +1,89 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 3.0.0
|
||||||
|
* @license MIT License (https://opensource.org/licenses/mit-license.php)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use the DS to separate the directories in other defines
|
||||||
|
*/
|
||||||
|
if (!defined('DS')) {
|
||||||
|
define('DS', DIRECTORY_SEPARATOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* These defines should only be edited if you have cake installed in
|
||||||
|
* a directory layout other than the way it is distributed.
|
||||||
|
* When using custom settings be sure to use the DS and do not add a trailing DS.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The full path to the directory which holds "src", WITHOUT a trailing DS.
|
||||||
|
*/
|
||||||
|
define('ROOT', dirname(__DIR__));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The actual directory name for the application directory. Normally
|
||||||
|
* named 'src'.
|
||||||
|
*/
|
||||||
|
define('APP_DIR', 'src');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Path to the application's directory.
|
||||||
|
*/
|
||||||
|
define('APP', ROOT . DS . APP_DIR . DS);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Path to the config directory.
|
||||||
|
*/
|
||||||
|
define('CONFIG', ROOT . DS . 'config' . DS);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* File path to the webroot directory.
|
||||||
|
*
|
||||||
|
* To derive your webroot from your webserver change this to:
|
||||||
|
*
|
||||||
|
* `define('WWW_ROOT', rtrim($_SERVER['DOCUMENT_ROOT'], DS) . DS);`
|
||||||
|
*/
|
||||||
|
define('WWW_ROOT', ROOT . DS . 'webroot' . DS);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Path to the tests directory.
|
||||||
|
*/
|
||||||
|
define('TESTS', ROOT . DS . 'tests' . DS);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Path to the temporary files directory.
|
||||||
|
*/
|
||||||
|
define('TMP', ROOT . DS . 'tmp' . DS);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Path to the logs directory.
|
||||||
|
*/
|
||||||
|
define('LOGS', ROOT . DS . 'logs' . DS);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Path to the cache files directory. It can be shared between hosts in a multi-server setup.
|
||||||
|
*/
|
||||||
|
define('CACHE', TMP . 'cache' . DS);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The absolute path to the "cake" directory, WITHOUT a trailing DS.
|
||||||
|
*
|
||||||
|
* CakePHP should always be installed with composer, so look there.
|
||||||
|
*/
|
||||||
|
define('CAKE_CORE_INCLUDE_PATH', ROOT . DS . 'vendor' . DS . 'cakephp' . DS . 'cakephp');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Path to the cake directory.
|
||||||
|
*/
|
||||||
|
define('CORE_PATH', CAKE_CORE_INCLUDE_PATH . DS);
|
||||||
|
define('CAKE', CORE_PATH . 'src' . DS);
|
|
@ -0,0 +1,39 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 3.5.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* You can empty out this file, if you are certain that you match all requirements.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* You can remove this if you are confident that your PHP version is sufficient.
|
||||||
|
*/
|
||||||
|
if (version_compare(PHP_VERSION, '5.6.0') < 0) {
|
||||||
|
trigger_error('Your PHP version must be equal or higher than 5.6.0 to use CakePHP.' . PHP_EOL, E_USER_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* You can remove this if you are confident you have intl installed.
|
||||||
|
*/
|
||||||
|
if (!extension_loaded('intl')) {
|
||||||
|
trigger_error('You must enable the intl extension to use CakePHP.' . PHP_EOL, E_USER_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* You can remove this if you are confident you have mbstring installed.
|
||||||
|
*/
|
||||||
|
if (!extension_loaded('mbstring')) {
|
||||||
|
trigger_error('You must enable the mbstring extension to use CakePHP.' . PHP_EOL, E_USER_ERROR);
|
||||||
|
}
|
|
@ -0,0 +1,104 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Routes configuration
|
||||||
|
*
|
||||||
|
* In this file, you set up routes to your controllers and their actions.
|
||||||
|
* Routes are very important mechanism that allows you to freely connect
|
||||||
|
* different URLs to chosen controllers and their actions (functions).
|
||||||
|
*
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
use Cake\Http\Middleware\CsrfProtectionMiddleware;
|
||||||
|
use Cake\Routing\RouteBuilder;
|
||||||
|
use Cake\Routing\Router;
|
||||||
|
use Cake\Routing\Route\DashedRoute;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The default class to use for all routes
|
||||||
|
*
|
||||||
|
* The following route classes are supplied with CakePHP and are appropriate
|
||||||
|
* to set as the default:
|
||||||
|
*
|
||||||
|
* - Route
|
||||||
|
* - InflectedRoute
|
||||||
|
* - DashedRoute
|
||||||
|
*
|
||||||
|
* If no call is made to `Router::defaultRouteClass()`, the class used is
|
||||||
|
* `Route` (`Cake\Routing\Route\Route`)
|
||||||
|
*
|
||||||
|
* Note that `Route` does not do any inflections on URLs which will result in
|
||||||
|
* inconsistently cased URLs when used with `:plugin`, `:controller` and
|
||||||
|
* `:action` markers.
|
||||||
|
*
|
||||||
|
* Cache: Routes are cached to improve performance, check the RoutingMiddleware
|
||||||
|
* constructor in your `src/Application.php` file to change this behavior.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
Router::defaultRouteClass(DashedRoute::class);
|
||||||
|
|
||||||
|
Router::scope('/', function (RouteBuilder $routes) {
|
||||||
|
// Register scoped middleware for in scopes.
|
||||||
|
$routes->registerMiddleware('csrf', new CsrfProtectionMiddleware([
|
||||||
|
'httpOnly' => true
|
||||||
|
]));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apply a middleware to the current route scope.
|
||||||
|
* Requires middleware to be registered via `Application::routes()` with `registerMiddleware()`
|
||||||
|
*/
|
||||||
|
$routes->applyMiddleware('csrf');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Here, we are connecting '/' (base path) to a controller called 'Pages',
|
||||||
|
* its action called 'display', and we pass a param to select the view file
|
||||||
|
* to use (in this case, src/Template/Pages/home.ctp)...
|
||||||
|
*/
|
||||||
|
$routes->connect('/', ['controller' => 'Home', 'action' => 'display', 'home']);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ...and connect the rest of 'Pages' controller's URLs.
|
||||||
|
*/
|
||||||
|
$routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Connect catchall routes for all controllers.
|
||||||
|
*
|
||||||
|
* Using the argument `DashedRoute`, the `fallbacks` method is a shortcut for
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* $routes->connect('/:controller', ['action' => 'index'], ['routeClass' => 'DashedRoute']);
|
||||||
|
* $routes->connect('/:controller/:action/*', [], ['routeClass' => 'DashedRoute']);
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* Any route class can be used with this method, such as:
|
||||||
|
* - DashedRoute
|
||||||
|
* - InflectedRoute
|
||||||
|
* - Route
|
||||||
|
* - Or your own route class
|
||||||
|
*
|
||||||
|
* You can remove these routes once you've connected the
|
||||||
|
* routes you want in your application.
|
||||||
|
*/
|
||||||
|
$routes->fallbacks(DashedRoute::class);
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If you need a different set of middleware or none at all,
|
||||||
|
* open new scope and define routes there.
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* Router::scope('/api', function (RouteBuilder $routes) {
|
||||||
|
* // No $routes->applyMiddleware() here.
|
||||||
|
* // Connect API actions here.
|
||||||
|
* });
|
||||||
|
* ```
|
||||||
|
*/
|
|
@ -0,0 +1,18 @@
|
||||||
|
# Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
#
|
||||||
|
# Licensed under The MIT License
|
||||||
|
# For full copyright and license information, please see the LICENSE.txt
|
||||||
|
# Redistributions of files must retain the above copyright notice.
|
||||||
|
# MIT License (https://opensource.org/licenses/mit-license.php)
|
||||||
|
|
||||||
|
CREATE TABLE i18n (
|
||||||
|
id int NOT NULL auto_increment,
|
||||||
|
locale varchar(6) NOT NULL,
|
||||||
|
model varchar(255) NOT NULL,
|
||||||
|
foreign_key int(10) NOT NULL,
|
||||||
|
field varchar(255) NOT NULL,
|
||||||
|
content text,
|
||||||
|
PRIMARY KEY (id),
|
||||||
|
UNIQUE INDEX I18N_LOCALE_FIELD(locale, model, foreign_key, field),
|
||||||
|
INDEX I18N_FIELD(model, foreign_key, field)
|
||||||
|
);
|
|
@ -0,0 +1,15 @@
|
||||||
|
# Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
#
|
||||||
|
# Licensed under The MIT License
|
||||||
|
# For full copyright and license information, please see the LICENSE.txt
|
||||||
|
# Redistributions of files must retain the above copyright notice.
|
||||||
|
# MIT License (https://opensource.org/licenses/mit-license.php)
|
||||||
|
|
||||||
|
CREATE TABLE `sessions` (
|
||||||
|
`id` char(40) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
|
||||||
|
`created` datetime DEFAULT CURRENT_TIMESTAMP, -- optional, requires MySQL 5.6.5+
|
||||||
|
`modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- optional, requires MySQL 5.6.5+
|
||||||
|
`data` blob DEFAULT NULL, -- for PostgreSQL use bytea instead of blob
|
||||||
|
`expires` int(10) unsigned DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
|
@ -0,0 +1,16 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 0.10.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
require 'webroot' . DIRECTORY_SEPARATOR . 'index.php';
|
|
@ -0,0 +1,41 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<phpunit
|
||||||
|
colors="true"
|
||||||
|
processIsolation="false"
|
||||||
|
stopOnFailure="false"
|
||||||
|
bootstrap="tests/bootstrap.php"
|
||||||
|
>
|
||||||
|
<php>
|
||||||
|
<ini name="memory_limit" value="-1"/>
|
||||||
|
<ini name="apc.enable_cli" value="1"/>
|
||||||
|
</php>
|
||||||
|
|
||||||
|
<!-- Add any additional test suites you want to run here -->
|
||||||
|
<testsuites>
|
||||||
|
<testsuite name="app">
|
||||||
|
<directory>tests/TestCase/</directory>
|
||||||
|
</testsuite>
|
||||||
|
<!-- Add plugin test suites here. -->
|
||||||
|
</testsuites>
|
||||||
|
|
||||||
|
<!-- Setup a listener for fixtures -->
|
||||||
|
<listeners>
|
||||||
|
<listener
|
||||||
|
class="\Cake\TestSuite\Fixture\FixtureInjector">
|
||||||
|
<arguments>
|
||||||
|
<object class="\Cake\TestSuite\Fixture\FixtureManager" />
|
||||||
|
</arguments>
|
||||||
|
</listener>
|
||||||
|
</listeners>
|
||||||
|
|
||||||
|
<!-- Ignore vendor tests in code coverage reports -->
|
||||||
|
<filter>
|
||||||
|
<whitelist>
|
||||||
|
<directory suffix=".php">src/</directory>
|
||||||
|
<directory suffix=".php">plugins/*/src/</directory>
|
||||||
|
<exclude>
|
||||||
|
<file>src/Console/Installer.php</file>
|
||||||
|
</exclude>
|
||||||
|
</whitelist>
|
||||||
|
</filter>
|
||||||
|
</phpunit>
|
|
@ -0,0 +1,99 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 3.3.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
namespace App;
|
||||||
|
|
||||||
|
use Cake\Core\Configure;
|
||||||
|
use Cake\Core\Exception\MissingPluginException;
|
||||||
|
use Cake\Error\Middleware\ErrorHandlerMiddleware;
|
||||||
|
use Cake\Http\BaseApplication;
|
||||||
|
use Cake\Routing\Middleware\AssetMiddleware;
|
||||||
|
use Cake\Routing\Middleware\RoutingMiddleware;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Application setup class.
|
||||||
|
*
|
||||||
|
* This defines the bootstrapping logic and middleware layers you
|
||||||
|
* want to use in your application.
|
||||||
|
*/
|
||||||
|
class Application extends BaseApplication
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public function bootstrap()
|
||||||
|
{
|
||||||
|
// Call parent to load bootstrap from files.
|
||||||
|
parent::bootstrap();
|
||||||
|
|
||||||
|
if (PHP_SAPI === 'cli') {
|
||||||
|
$this->bootstrapCli();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Only try to load DebugKit in development mode
|
||||||
|
* Debug Kit should not be installed on a production system
|
||||||
|
*/
|
||||||
|
// if (Configure::read('debug')) {
|
||||||
|
// $this->addPlugin(\DebugKit\Plugin::class);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Load more plugins here
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup the middleware queue your application will use.
|
||||||
|
*
|
||||||
|
* @param \Cake\Http\MiddlewareQueue $middlewareQueue The middleware queue to setup.
|
||||||
|
* @return \Cake\Http\MiddlewareQueue The updated middleware queue.
|
||||||
|
*/
|
||||||
|
public function middleware($middlewareQueue)
|
||||||
|
{
|
||||||
|
$middlewareQueue
|
||||||
|
// Catch any exceptions in the lower layers,
|
||||||
|
// and make an error page/response
|
||||||
|
->add(new ErrorHandlerMiddleware(null, Configure::read('Error')))
|
||||||
|
|
||||||
|
// Handle plugin/theme assets like CakePHP normally does.
|
||||||
|
->add(new AssetMiddleware([
|
||||||
|
'cacheTime' => Configure::read('Asset.cacheTime')
|
||||||
|
]))
|
||||||
|
|
||||||
|
// Add routing middleware.
|
||||||
|
// If you have a large number of routes connected, turning on routes
|
||||||
|
// caching in production could improve performance. For that when
|
||||||
|
// creating the middleware instance specify the cache config name by
|
||||||
|
// using it's second constructor argument:
|
||||||
|
// `new RoutingMiddleware($this, '_cake_routes_')`
|
||||||
|
->add(new RoutingMiddleware($this));
|
||||||
|
|
||||||
|
return $middlewareQueue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function bootstrapCli()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$this->addPlugin('Bake');
|
||||||
|
} catch (MissingPluginException $e) {
|
||||||
|
// Do not halt if the plugin is missing
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->addPlugin('Migrations');
|
||||||
|
|
||||||
|
// Load more plugins here
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,246 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 3.0.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
namespace App\Console;
|
||||||
|
|
||||||
|
if (!defined('STDIN')) {
|
||||||
|
define('STDIN', fopen('php://stdin', 'r'));
|
||||||
|
}
|
||||||
|
|
||||||
|
use Cake\Utility\Security;
|
||||||
|
use Composer\Script\Event;
|
||||||
|
use Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides installation hooks for when this application is installed via
|
||||||
|
* composer. Customize this class to suit your needs.
|
||||||
|
*/
|
||||||
|
class Installer
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An array of directories to be made writable
|
||||||
|
*/
|
||||||
|
const WRITABLE_DIRS = [
|
||||||
|
'logs',
|
||||||
|
'tmp',
|
||||||
|
'tmp/cache',
|
||||||
|
'tmp/cache/models',
|
||||||
|
'tmp/cache/persistent',
|
||||||
|
'tmp/cache/views',
|
||||||
|
'tmp/sessions',
|
||||||
|
'tmp/tests'
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does some routine installation tasks so people don't have to.
|
||||||
|
*
|
||||||
|
* @param \Composer\Script\Event $event The composer event object.
|
||||||
|
* @throws \Exception Exception raised by validator.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function postInstall(Event $event)
|
||||||
|
{
|
||||||
|
$io = $event->getIO();
|
||||||
|
|
||||||
|
$rootDir = dirname(dirname(__DIR__));
|
||||||
|
|
||||||
|
static::createAppConfig($rootDir, $io);
|
||||||
|
static::createWritableDirectories($rootDir, $io);
|
||||||
|
|
||||||
|
// ask if the permissions should be changed
|
||||||
|
if ($io->isInteractive()) {
|
||||||
|
$validator = function ($arg) {
|
||||||
|
if (in_array($arg, ['Y', 'y', 'N', 'n'])) {
|
||||||
|
return $arg;
|
||||||
|
}
|
||||||
|
throw new Exception('This is not a valid answer. Please choose Y or n.');
|
||||||
|
};
|
||||||
|
$setFolderPermissions = $io->askAndValidate(
|
||||||
|
'<info>Set Folder Permissions ? (Default to Y)</info> [<comment>Y,n</comment>]? ',
|
||||||
|
$validator,
|
||||||
|
10,
|
||||||
|
'Y'
|
||||||
|
);
|
||||||
|
|
||||||
|
if (in_array($setFolderPermissions, ['Y', 'y'])) {
|
||||||
|
static::setFolderPermissions($rootDir, $io);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
static::setFolderPermissions($rootDir, $io);
|
||||||
|
}
|
||||||
|
|
||||||
|
static::setSecuritySalt($rootDir, $io);
|
||||||
|
|
||||||
|
$class = 'Cake\Codeception\Console\Installer';
|
||||||
|
if (class_exists($class)) {
|
||||||
|
$class::customizeCodeceptionBinary($event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create the config/app.php file if it does not exist.
|
||||||
|
*
|
||||||
|
* @param string $dir The application's root directory.
|
||||||
|
* @param \Composer\IO\IOInterface $io IO interface to write to console.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function createAppConfig($dir, $io)
|
||||||
|
{
|
||||||
|
$appConfig = $dir . '/config/app.php';
|
||||||
|
$defaultConfig = $dir . '/config/app.default.php';
|
||||||
|
if (!file_exists($appConfig)) {
|
||||||
|
copy($defaultConfig, $appConfig);
|
||||||
|
$io->write('Created `config/app.php` file');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create the `logs` and `tmp` directories.
|
||||||
|
*
|
||||||
|
* @param string $dir The application's root directory.
|
||||||
|
* @param \Composer\IO\IOInterface $io IO interface to write to console.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function createWritableDirectories($dir, $io)
|
||||||
|
{
|
||||||
|
foreach (static::WRITABLE_DIRS as $path) {
|
||||||
|
$path = $dir . '/' . $path;
|
||||||
|
if (!file_exists($path)) {
|
||||||
|
mkdir($path);
|
||||||
|
$io->write('Created `' . $path . '` directory');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set globally writable permissions on the "tmp" and "logs" directory.
|
||||||
|
*
|
||||||
|
* This is not the most secure default, but it gets people up and running quickly.
|
||||||
|
*
|
||||||
|
* @param string $dir The application's root directory.
|
||||||
|
* @param \Composer\IO\IOInterface $io IO interface to write to console.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function setFolderPermissions($dir, $io)
|
||||||
|
{
|
||||||
|
// Change the permissions on a path and output the results.
|
||||||
|
$changePerms = function ($path) use ($io) {
|
||||||
|
$currentPerms = fileperms($path) & 0777;
|
||||||
|
$worldWritable = $currentPerms | 0007;
|
||||||
|
if ($worldWritable == $currentPerms) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$res = chmod($path, $worldWritable);
|
||||||
|
if ($res) {
|
||||||
|
$io->write('Permissions set on ' . $path);
|
||||||
|
} else {
|
||||||
|
$io->write('Failed to set permissions on ' . $path);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$walker = function ($dir) use (&$walker, $changePerms) {
|
||||||
|
$files = array_diff(scandir($dir), ['.', '..']);
|
||||||
|
foreach ($files as $file) {
|
||||||
|
$path = $dir . '/' . $file;
|
||||||
|
|
||||||
|
if (!is_dir($path)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$changePerms($path);
|
||||||
|
$walker($path);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$walker($dir . '/tmp');
|
||||||
|
$changePerms($dir . '/tmp');
|
||||||
|
$changePerms($dir . '/logs');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the security.salt value in the application's config file.
|
||||||
|
*
|
||||||
|
* @param string $dir The application's root directory.
|
||||||
|
* @param \Composer\IO\IOInterface $io IO interface to write to console.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function setSecuritySalt($dir, $io)
|
||||||
|
{
|
||||||
|
$newKey = hash('sha256', Security::randomBytes(64));
|
||||||
|
static::setSecuritySaltInFile($dir, $io, $newKey, 'app.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the security.salt value in a given file
|
||||||
|
*
|
||||||
|
* @param string $dir The application's root directory.
|
||||||
|
* @param \Composer\IO\IOInterface $io IO interface to write to console.
|
||||||
|
* @param string $newKey key to set in the file
|
||||||
|
* @param string $file A path to a file relative to the application's root
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function setSecuritySaltInFile($dir, $io, $newKey, $file)
|
||||||
|
{
|
||||||
|
$config = $dir . '/config/' . $file;
|
||||||
|
$content = file_get_contents($config);
|
||||||
|
|
||||||
|
$content = str_replace('__SALT__', $newKey, $content, $count);
|
||||||
|
|
||||||
|
if ($count == 0) {
|
||||||
|
$io->write('No Security.salt placeholder to replace.');
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = file_put_contents($config, $content);
|
||||||
|
if ($result) {
|
||||||
|
$io->write('Updated Security.salt value in config/' . $file);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$io->write('Unable to update Security.salt value.');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the APP_NAME value in a given file
|
||||||
|
*
|
||||||
|
* @param string $dir The application's root directory.
|
||||||
|
* @param \Composer\IO\IOInterface $io IO interface to write to console.
|
||||||
|
* @param string $appName app name to set in the file
|
||||||
|
* @param string $file A path to a file relative to the application's root
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function setAppNameInFile($dir, $io, $appName, $file)
|
||||||
|
{
|
||||||
|
$config = $dir . '/config/' . $file;
|
||||||
|
$content = file_get_contents($config);
|
||||||
|
$content = str_replace('__APP_NAME__', $appName, $content, $count);
|
||||||
|
|
||||||
|
if ($count == 0) {
|
||||||
|
$io->write('No __APP_NAME__ placeholder to replace.');
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = file_put_contents($config, $content);
|
||||||
|
if ($result) {
|
||||||
|
$io->write('Updated __APP_NAME__ value in config/' . $file);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$io->write('Unable to update __APP_NAME__ value.');
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 0.2.9
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
namespace App\Controller;
|
||||||
|
|
||||||
|
use Cake\Controller\Controller;
|
||||||
|
use Cake\Event\Event;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Application Controller
|
||||||
|
*
|
||||||
|
* Add your application-wide methods in the class below, your controllers
|
||||||
|
* will inherit them.
|
||||||
|
*
|
||||||
|
* @link https://book.cakephp.org/3.0/en/controllers.html#the-app-controller
|
||||||
|
*/
|
||||||
|
class AppController extends Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialization hook method.
|
||||||
|
*
|
||||||
|
* Use this method to add common initialization code like loading components.
|
||||||
|
*
|
||||||
|
* e.g. `$this->loadComponent('Security');`
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function initialize()
|
||||||
|
{
|
||||||
|
parent::initialize();
|
||||||
|
|
||||||
|
$this->log('loaded');
|
||||||
|
|
||||||
|
$this->loadComponent('RequestHandler', [
|
||||||
|
'enableBeforeRedirect' => false,
|
||||||
|
]);
|
||||||
|
$this->loadComponent('Flash');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Enable the following component for recommended CakePHP security settings.
|
||||||
|
* see https://book.cakephp.org/3.0/en/controllers/components/security.html
|
||||||
|
*/
|
||||||
|
//$this->loadComponent('Security');
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,70 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 3.3.4
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
namespace App\Controller;
|
||||||
|
|
||||||
|
use Cake\Event\Event;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Error Handling Controller
|
||||||
|
*
|
||||||
|
* Controller used by ExceptionRenderer to render error responses.
|
||||||
|
*/
|
||||||
|
class ErrorController extends AppController
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Initialization hook method.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function initialize()
|
||||||
|
{
|
||||||
|
$this->loadComponent('RequestHandler', [
|
||||||
|
'enableBeforeRedirect' => false,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* beforeFilter callback.
|
||||||
|
*
|
||||||
|
* @param \Cake\Event\Event $event Event.
|
||||||
|
* @return \Cake\Http\Response|null|void
|
||||||
|
*/
|
||||||
|
public function beforeFilter(Event $event)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* beforeRender callback.
|
||||||
|
*
|
||||||
|
* @param \Cake\Event\Event $event Event.
|
||||||
|
* @return \Cake\Http\Response|null|void
|
||||||
|
*/
|
||||||
|
public function beforeRender(Event $event)
|
||||||
|
{
|
||||||
|
parent::beforeRender($event);
|
||||||
|
|
||||||
|
$this->viewBuilder()->setTemplatePath('Error');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* afterFilter callback.
|
||||||
|
*
|
||||||
|
* @param \Cake\Event\Event $event Event.
|
||||||
|
* @return \Cake\Http\Response|null|void
|
||||||
|
*/
|
||||||
|
public function afterFilter(Event $event)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 0.2.9
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
namespace App\Controller;
|
||||||
|
|
||||||
|
use Cake\Core\Configure;
|
||||||
|
use Cake\Http\Exception\ForbiddenException;
|
||||||
|
use Cake\Http\Exception\NotFoundException;
|
||||||
|
use Cake\View\Exception\MissingTemplateException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Static content controller
|
||||||
|
*
|
||||||
|
* This controller will render views from Template/Pages/
|
||||||
|
*
|
||||||
|
* @link https://book.cakephp.org/3.0/en/controllers/pages-controller.html
|
||||||
|
*/
|
||||||
|
class HomeController extends AppController
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays a view
|
||||||
|
*
|
||||||
|
* @param array ...$path Path segments.
|
||||||
|
* @return \Cake\Http\Response|null
|
||||||
|
* @throws \Cake\Http\Exception\ForbiddenException When a directory traversal attempt.
|
||||||
|
* @throws \Cake\Http\Exception\NotFoundException When the view file could not
|
||||||
|
* be found or \Cake\View\Exception\MissingTemplateException in debug mode.
|
||||||
|
*/
|
||||||
|
public function display(...$path)
|
||||||
|
{
|
||||||
|
$count = count($path);
|
||||||
|
if (!$count) {
|
||||||
|
return $this->redirect('/');
|
||||||
|
}
|
||||||
|
if (in_array('..', $path, true) || in_array('.', $path, true)) {
|
||||||
|
throw new ForbiddenException();
|
||||||
|
}
|
||||||
|
$page = $subpage = null;
|
||||||
|
|
||||||
|
if (!empty($path[0])) {
|
||||||
|
$page = $path[0];
|
||||||
|
}
|
||||||
|
if (!empty($path[1])) {
|
||||||
|
$subpage = $path[1];
|
||||||
|
}
|
||||||
|
$this->set(compact('page', 'subpage'));
|
||||||
|
|
||||||
|
try {
|
||||||
|
$this->render(implode('/', $path));
|
||||||
|
} catch (MissingTemplateException $exception) {
|
||||||
|
if (Configure::read('debug')) {
|
||||||
|
throw $exception;
|
||||||
|
}
|
||||||
|
throw new NotFoundException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 0.2.9
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
namespace App\Controller;
|
||||||
|
|
||||||
|
use Cake\Core\Configure;
|
||||||
|
use Cake\Http\Exception\ForbiddenException;
|
||||||
|
use Cake\Http\Exception\NotFoundException;
|
||||||
|
use Cake\View\Exception\MissingTemplateException;
|
||||||
|
use Cake\Log\Log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Static content controller
|
||||||
|
*
|
||||||
|
* This controller will render views from Template/Pages/
|
||||||
|
*
|
||||||
|
* @link https://book.cakephp.org/3.0/en/controllers/pages-controller.html
|
||||||
|
*/
|
||||||
|
class Oauth2Controller extends AppController
|
||||||
|
{
|
||||||
|
|
||||||
|
public function authorized($request) {
|
||||||
|
$this->log('authorized');
|
||||||
|
$this->log($request);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays a view
|
||||||
|
*
|
||||||
|
* @param array ...$path Path segments.
|
||||||
|
* @return \Cake\Http\Response|null
|
||||||
|
* @throws \Cake\Http\Exception\ForbiddenException When a directory traversal attempt.
|
||||||
|
* @throws \Cake\Http\Exception\NotFoundException When the view file could not
|
||||||
|
* be found or \Cake\View\Exception\MissingTemplateException in debug mode.
|
||||||
|
*/
|
||||||
|
public function display(...$path)
|
||||||
|
{
|
||||||
|
$count = count($path);
|
||||||
|
if (!$count) {
|
||||||
|
return $this->redirect('/');
|
||||||
|
}
|
||||||
|
if (in_array('..', $path, true) || in_array('.', $path, true)) {
|
||||||
|
throw new ForbiddenException();
|
||||||
|
}
|
||||||
|
$page = $subpage = null;
|
||||||
|
|
||||||
|
if (!empty($path[0])) {
|
||||||
|
$page = $path[0];
|
||||||
|
}
|
||||||
|
if (!empty($path[1])) {
|
||||||
|
$subpage = $path[1];
|
||||||
|
}
|
||||||
|
$this->set(compact('page', 'subpage'));
|
||||||
|
|
||||||
|
try {
|
||||||
|
$this->render(implode('/', $path));
|
||||||
|
} catch (MissingTemplateException $exception) {
|
||||||
|
if (Configure::read('debug')) {
|
||||||
|
throw $exception;
|
||||||
|
}
|
||||||
|
throw new NotFoundException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 0.2.9
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
namespace App\Controller;
|
||||||
|
|
||||||
|
use Cake\Core\Configure;
|
||||||
|
use Cake\Http\Exception\ForbiddenException;
|
||||||
|
use Cake\Http\Exception\NotFoundException;
|
||||||
|
use Cake\View\Exception\MissingTemplateException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Static content controller
|
||||||
|
*
|
||||||
|
* This controller will render views from Template/Pages/
|
||||||
|
*
|
||||||
|
* @link https://book.cakephp.org/3.0/en/controllers/pages-controller.html
|
||||||
|
*/
|
||||||
|
class PagesController extends AppController
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays a view
|
||||||
|
*
|
||||||
|
* @param array ...$path Path segments.
|
||||||
|
* @return \Cake\Http\Response|null
|
||||||
|
* @throws \Cake\Http\Exception\ForbiddenException When a directory traversal attempt.
|
||||||
|
* @throws \Cake\Http\Exception\NotFoundException When the view file could not
|
||||||
|
* be found or \Cake\View\Exception\MissingTemplateException in debug mode.
|
||||||
|
*/
|
||||||
|
public function display(...$path)
|
||||||
|
{
|
||||||
|
$count = count($path);
|
||||||
|
if (!$count) {
|
||||||
|
return $this->redirect('/');
|
||||||
|
}
|
||||||
|
if (in_array('..', $path, true) || in_array('.', $path, true)) {
|
||||||
|
throw new ForbiddenException();
|
||||||
|
}
|
||||||
|
$page = $subpage = null;
|
||||||
|
|
||||||
|
if (!empty($path[0])) {
|
||||||
|
$page = $path[0];
|
||||||
|
}
|
||||||
|
if (!empty($path[1])) {
|
||||||
|
$subpage = $path[1];
|
||||||
|
}
|
||||||
|
$this->set(compact('page', 'subpage'));
|
||||||
|
|
||||||
|
try {
|
||||||
|
$this->render(implode('/', $path));
|
||||||
|
} catch (MissingTemplateException $exception) {
|
||||||
|
if (Configure::read('debug')) {
|
||||||
|
throw $exception;
|
||||||
|
}
|
||||||
|
throw new NotFoundException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 3.0.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
namespace App\Shell;
|
||||||
|
|
||||||
|
use Cake\Console\ConsoleOptionParser;
|
||||||
|
use Cake\Console\Shell;
|
||||||
|
use Cake\Log\Log;
|
||||||
|
use Psy\Shell as PsyShell;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple console wrapper around Psy\Shell.
|
||||||
|
*/
|
||||||
|
class ConsoleShell extends Shell
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start the shell and interactive console.
|
||||||
|
*
|
||||||
|
* @return int|null
|
||||||
|
*/
|
||||||
|
public function main()
|
||||||
|
{
|
||||||
|
if (!class_exists('Psy\Shell')) {
|
||||||
|
$this->err('<error>Unable to load Psy\Shell.</error>');
|
||||||
|
$this->err('');
|
||||||
|
$this->err('Make sure you have installed psysh as a dependency,');
|
||||||
|
$this->err('and that Psy\Shell is registered in your autoloader.');
|
||||||
|
$this->err('');
|
||||||
|
$this->err('If you are using composer run');
|
||||||
|
$this->err('');
|
||||||
|
$this->err('<info>$ php composer.phar require --dev psy/psysh</info>');
|
||||||
|
$this->err('');
|
||||||
|
|
||||||
|
return self::CODE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->out("You can exit with <info>`CTRL-C`</info> or <info>`exit`</info>");
|
||||||
|
$this->out('');
|
||||||
|
|
||||||
|
Log::drop('debug');
|
||||||
|
Log::drop('error');
|
||||||
|
$this->_io->setLoggers(false);
|
||||||
|
restore_error_handler();
|
||||||
|
restore_exception_handler();
|
||||||
|
|
||||||
|
$psy = new PsyShell();
|
||||||
|
$psy->run();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display help for this console.
|
||||||
|
*
|
||||||
|
* @return \Cake\Console\ConsoleOptionParser
|
||||||
|
*/
|
||||||
|
public function getOptionParser()
|
||||||
|
{
|
||||||
|
$parser = new ConsoleOptionParser('console');
|
||||||
|
$parser->setDescription(
|
||||||
|
'This shell provides a REPL that you can use to interact with ' .
|
||||||
|
'your application in a command line designed to run PHP code. ' .
|
||||||
|
'You can use it to run adhoc queries with your models, or ' .
|
||||||
|
'explore the features of CakePHP and your application.' .
|
||||||
|
"\n\n" .
|
||||||
|
'You will need to have psysh installed for this Shell to work.'
|
||||||
|
);
|
||||||
|
|
||||||
|
return $parser;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
<?php
|
||||||
|
$class = 'message';
|
||||||
|
if (!empty($params['class'])) {
|
||||||
|
$class .= ' ' . $params['class'];
|
||||||
|
}
|
||||||
|
if (!isset($params['escape']) || $params['escape'] !== false) {
|
||||||
|
$message = h($message);
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<div class="<?= h($class) ?>" onclick="this.classList.add('hidden');"><?= $message ?></div>
|
|
@ -0,0 +1,6 @@
|
||||||
|
<?php
|
||||||
|
if (!isset($params['escape']) || $params['escape'] !== false) {
|
||||||
|
$message = h($message);
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<div class="message error" onclick="this.classList.add('hidden');"><?= $message ?></div>
|
|
@ -0,0 +1,6 @@
|
||||||
|
<?php
|
||||||
|
if (!isset($params['escape']) || $params['escape'] !== false) {
|
||||||
|
$message = h($message);
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<div class="message success" onclick="this.classList.add('hidden')"><?= $message ?></div>
|
|
@ -0,0 +1,20 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 0.10.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
$content = explode("\n", $content);
|
||||||
|
|
||||||
|
foreach ($content as $line) :
|
||||||
|
echo '<p> ' . $line . "</p>\n";
|
||||||
|
endforeach;
|
|
@ -0,0 +1,16 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 0.10.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
echo $content;
|
|
@ -0,0 +1,38 @@
|
||||||
|
<?php
|
||||||
|
use Cake\Core\Configure;
|
||||||
|
use Cake\Error\Debugger;
|
||||||
|
|
||||||
|
$this->layout = 'error';
|
||||||
|
|
||||||
|
if (Configure::read('debug')) :
|
||||||
|
$this->layout = 'dev_error';
|
||||||
|
|
||||||
|
$this->assign('title', $message);
|
||||||
|
$this->assign('templateName', 'error400.ctp');
|
||||||
|
|
||||||
|
$this->start('file');
|
||||||
|
?>
|
||||||
|
<?php if (!empty($error->queryString)) : ?>
|
||||||
|
<p class="notice">
|
||||||
|
<strong>SQL Query: </strong>
|
||||||
|
<?= h($error->queryString) ?>
|
||||||
|
</p>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if (!empty($error->params)) : ?>
|
||||||
|
<strong>SQL Query Params: </strong>
|
||||||
|
<?php Debugger::dump($error->params) ?>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?= $this->element('auto_table_warning') ?>
|
||||||
|
<?php
|
||||||
|
if (extension_loaded('xdebug')) :
|
||||||
|
xdebug_print_function_stack();
|
||||||
|
endif;
|
||||||
|
|
||||||
|
$this->end();
|
||||||
|
endif;
|
||||||
|
?>
|
||||||
|
<h2><?= h($message) ?></h2>
|
||||||
|
<p class="error">
|
||||||
|
<strong><?= __d('cake', 'Error') ?>: </strong>
|
||||||
|
<?= __d('cake', 'The requested address {0} was not found on this server.', "<strong>'{$url}'</strong>") ?>
|
||||||
|
</p>
|
|
@ -0,0 +1,43 @@
|
||||||
|
<?php
|
||||||
|
use Cake\Core\Configure;
|
||||||
|
use Cake\Error\Debugger;
|
||||||
|
|
||||||
|
$this->layout = 'error';
|
||||||
|
|
||||||
|
if (Configure::read('debug')) :
|
||||||
|
$this->layout = 'dev_error';
|
||||||
|
|
||||||
|
$this->assign('title', $message);
|
||||||
|
$this->assign('templateName', 'error500.ctp');
|
||||||
|
|
||||||
|
$this->start('file');
|
||||||
|
?>
|
||||||
|
<?php if (!empty($error->queryString)) : ?>
|
||||||
|
<p class="notice">
|
||||||
|
<strong>SQL Query: </strong>
|
||||||
|
<?= h($error->queryString) ?>
|
||||||
|
</p>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if (!empty($error->params)) : ?>
|
||||||
|
<strong>SQL Query Params: </strong>
|
||||||
|
<?php Debugger::dump($error->params) ?>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if ($error instanceof Error) : ?>
|
||||||
|
<strong>Error in: </strong>
|
||||||
|
<?= sprintf('%s, line %s', str_replace(ROOT, 'ROOT', $error->getFile()), $error->getLine()) ?>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php
|
||||||
|
echo $this->element('auto_table_warning');
|
||||||
|
|
||||||
|
if (extension_loaded('xdebug')) :
|
||||||
|
xdebug_print_function_stack();
|
||||||
|
endif;
|
||||||
|
|
||||||
|
$this->end();
|
||||||
|
endif;
|
||||||
|
?>
|
||||||
|
<h2><?= __d('cake', 'An Internal Error Has Occurred') ?></h2>
|
||||||
|
<p class="error">
|
||||||
|
<strong><?= __d('cake', 'Error') ?>: </strong>
|
||||||
|
<?= h($message) ?>
|
||||||
|
</p>
|
|
@ -0,0 +1,7 @@
|
||||||
|
<div class="container" style="padding-top:20px;text-align: center">
|
||||||
|
<div class="col-sm"><h4><?=__('3D Entity Component System based Engine for the Web - based on Three.js')?></h4></div>
|
||||||
|
<div class="col-sm"><?=__('Design - Create - Experience')?></div>
|
||||||
|
<div class="col-sm">-</div>
|
||||||
|
<div class="col-sm"><?=__('Choose a project from your list above or create a new one')?></div>
|
||||||
|
<div class="col-sm"><button style="margin-top: 20px; border-radius: 2px;" onclick=""><?=__('Create new Project')?></button></div>
|
||||||
|
</div>
|
|
@ -0,0 +1,24 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 0.10.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title><?= $this->fetch('title') ?></title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<?= $this->fetch('content') ?>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,16 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 0.10.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
echo $this->fetch('content');
|
|
@ -0,0 +1,16 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 0.10.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
echo $this->fetch('content');
|
|
@ -0,0 +1,173 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Cake\Utility\Inflector;
|
||||||
|
|
||||||
|
?>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
|
||||||
|
<meta name="google-signin-scope" content="profile email">
|
||||||
|
<meta name="google-signin-client_id" content="906972333574-e6ub0ckcdu4ejju66jvtco2moc3senib.apps.googleusercontent.com">
|
||||||
|
<script src="https://apis.google.com/js/platform.js" async defer></script>
|
||||||
|
|
||||||
|
<title>- ECS - Editor</title>
|
||||||
|
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||||
|
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-121323464-1"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
window.dataLayer = window.dataLayer || [];
|
||||||
|
function gtag(){dataLayer.push(arguments);}
|
||||||
|
gtag('js', new Date());
|
||||||
|
gtag('config', 'UA-141744867-1');
|
||||||
|
</script>
|
||||||
|
<?= $this->Html->charset() ?>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
|
||||||
|
<link rel="manifest" href="/manifest.webmanifest">
|
||||||
|
<meta name="msapplication-TileColor" content="#da532c">
|
||||||
|
<meta name="theme-color" content="#ffffff">
|
||||||
|
|
||||||
|
<?= $this->Html->css('style.css') ?>
|
||||||
|
<?= $this->Html->css('https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css') ?>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!-- Optional JavaScript -->
|
||||||
|
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
|
||||||
|
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
|
||||||
|
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
|
||||||
|
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
|
||||||
|
|
||||||
|
<script src="https://source.r3js.org/build/r3.js" type="text/javascript"></script>
|
||||||
|
<script src="js/config.js" type="text/javascript"></script>
|
||||||
|
|
||||||
|
<script src="https://unpkg.com/gijgo@1.9.13/js/gijgo.min.js" type="text/javascript"></script>
|
||||||
|
<link href="https://unpkg.com/gijgo@1.9.13/css/gijgo.min.css" rel="stylesheet" type="text/css" />
|
||||||
|
|
||||||
|
<?= $this->Flash->render() ?>
|
||||||
|
<div id="divBackground" class="sticky">
|
||||||
|
</div>
|
||||||
|
<nav class="navbar navbar-expand-lg navbar-light bg-light">
|
||||||
|
<a class="navbar-brand" href="/">r3.js - editor</a>
|
||||||
|
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
<div class="collapse navbar-collapse" id="navbarNav">
|
||||||
|
<ul class="navbar-nav">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="/menu"><?=__('Menu') ?></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<select id="selectProject" class="nav-link"><option><?=__('Select Project') ?></option></select>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<select id="selectEntity" class="nav-link"><option><?=__('Select Entity') ?></option></select>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<select id="selectComponent" class="nav-link"><option><?=__('Select Component') ?></option></select>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<select id="selectCreateComponent" class="nav-link"><option><?=__('Create Component') ?></option></select>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="/create"><?=__('Create')?></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<select id="selectCustomCodeComponent" class="nav-link"><option><?=__('Select Code') ?></option></select>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="/code-editor"><?=__('Code Editor')?></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<select id="selectMode" class="nav-link"><option><?=__('Edit Mode')?></option><option><?=__('Run Mode')?></option></select>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="/action/start"><?=__('Start')?></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="/action/pause"><?=__('Pause')?></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="/action/restart"><?=__('Restart')?></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="navbar-nav ml-auto">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link disabled" id="aSave" href="/action/save"><?=__('Save')?></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link disabled" id="aDelete" href="/action/delete"><?=__('Delete')?></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link disabled" id="aUpload" href="/action/upload"><?=__('Upload')?></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<div id="divSignOut"></div>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<div class="g-signin2" data-onsuccess="onSignIn" data-theme="dark"></div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
<div class="content">
|
||||||
|
<?= $this->fetch('content') ?>
|
||||||
|
</div>
|
||||||
|
<footer>
|
||||||
|
<a href="http://www.icondrawer.com/"></a>
|
||||||
|
</footer>
|
||||||
|
<script>
|
||||||
|
function onSignIn(googleUser) {
|
||||||
|
// Useful data for your client-side scripts:
|
||||||
|
var profile = googleUser.getBasicProfile();
|
||||||
|
console.log("ID: " + profile.getId()); // Don't send this directly to your server!
|
||||||
|
console.log('Full Name: ' + profile.getName());
|
||||||
|
console.log('Given Name: ' + profile.getGivenName());
|
||||||
|
console.log('Family Name: ' + profile.getFamilyName());
|
||||||
|
console.log("Image URL: " + profile.getImageUrl());
|
||||||
|
console.log("Email: " + profile.getEmail());
|
||||||
|
|
||||||
|
// The ID token you need to pass to your backend:
|
||||||
|
var id_token = googleUser.getAuthResponse().id_token;
|
||||||
|
console.log("ID Token: " + id_token);
|
||||||
|
|
||||||
|
document.getElementById('divSignOut').innerHTML = '';
|
||||||
|
var a = document.createElement('a');
|
||||||
|
a.innerText = 'Sign Out';
|
||||||
|
a.setAttribute('class', 'nav-link');
|
||||||
|
a.addEventListener('click', signOut);
|
||||||
|
document.getElementById('divSignOut').appendChild(a);
|
||||||
|
|
||||||
|
document.getElementById('aSave').setAttribute('class', 'nav-link');
|
||||||
|
document.getElementById('aDelete').setAttribute('class', 'nav-link');
|
||||||
|
document.getElementById('aUpload').setAttribute('class', 'nav-link');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Now send the token to our API
|
||||||
|
*/
|
||||||
|
var xhr = new XMLHttpRequest();
|
||||||
|
xhr.open('POST', 'https://api.r3js.org/signin');
|
||||||
|
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||||
|
xhr.onload = function() {
|
||||||
|
console.log('Signed in as: ' + xhr.responseText);
|
||||||
|
};
|
||||||
|
xhr.send('idtoken=' + id_token);
|
||||||
|
}
|
||||||
|
|
||||||
|
function signOut() {
|
||||||
|
var auth2 = gapi.auth2.getAuthInstance();
|
||||||
|
auth2.signOut().then(function () {
|
||||||
|
console.log('User signed out.');
|
||||||
|
document.getElementById('divSignOut').innerHTML = '';
|
||||||
|
document.getElementById('aSave').setAttribute('class', 'nav-link disabled');
|
||||||
|
document.getElementById('aDelete').setAttribute('class', 'nav-link disabled');
|
||||||
|
document.getElementById('aUpload').setAttribute('class', 'nav-link disabled');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,47 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 0.10.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
?>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<?= $this->Html->charset() ?>
|
||||||
|
<title>
|
||||||
|
<?= $this->fetch('title') ?>
|
||||||
|
</title>
|
||||||
|
<?= $this->Html->meta('icon') ?>
|
||||||
|
|
||||||
|
<?= $this->Html->css('base.css') ?>
|
||||||
|
<?= $this->Html->css('style.css') ?>
|
||||||
|
|
||||||
|
<?= $this->fetch('meta') ?>
|
||||||
|
<?= $this->fetch('css') ?>
|
||||||
|
<?= $this->fetch('script') ?>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="container">
|
||||||
|
<div id="header">
|
||||||
|
<h1><?= __('Error') ?></h1>
|
||||||
|
</div>
|
||||||
|
<div id="content">
|
||||||
|
<?= $this->Flash->render() ?>
|
||||||
|
|
||||||
|
<?= $this->fetch('content') ?>
|
||||||
|
</div>
|
||||||
|
<div id="footer">
|
||||||
|
<?= $this->Html->link(__('Back'), 'javascript:history.back()') ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,11 @@
|
||||||
|
<?php
|
||||||
|
if (!isset($channel)) :
|
||||||
|
$channel = [];
|
||||||
|
endif;
|
||||||
|
if (!isset($channel['title'])) :
|
||||||
|
$channel['title'] = $this->fetch('title');
|
||||||
|
endif;
|
||||||
|
|
||||||
|
echo $this->Rss->document(
|
||||||
|
$this->Rss->channel([], $channel, $this->fetch('content'))
|
||||||
|
);
|
|
@ -0,0 +1,276 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 0.10.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
use Cake\Cache\Cache;
|
||||||
|
use Cake\Core\Configure;
|
||||||
|
use Cake\Core\Plugin;
|
||||||
|
use Cake\Datasource\ConnectionManager;
|
||||||
|
use Cake\Error\Debugger;
|
||||||
|
use Cake\Http\Exception\NotFoundException;
|
||||||
|
|
||||||
|
$this->layout = false;
|
||||||
|
|
||||||
|
if (!Configure::read('debug')) :
|
||||||
|
throw new NotFoundException(
|
||||||
|
'Please replace src/Template/Pages/home.ctp with your own version or re-enable debug mode.'
|
||||||
|
);
|
||||||
|
endif;
|
||||||
|
|
||||||
|
$cakeDescription = 'CakePHP: the rapid development PHP framework';
|
||||||
|
?>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<?= $this->Html->charset() ?>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>
|
||||||
|
<?= $cakeDescription ?>
|
||||||
|
</title>
|
||||||
|
|
||||||
|
<?= $this->Html->meta('icon') ?>
|
||||||
|
<?= $this->Html->css('base.css') ?>
|
||||||
|
<?= $this->Html->css('style.css') ?>
|
||||||
|
<?= $this->Html->css('home.css') ?>
|
||||||
|
<link href="https://fonts.googleapis.com/css?family=Raleway:500i|Roboto:300,400,700|Roboto+Mono" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
<body class="home">
|
||||||
|
|
||||||
|
<header class="row">
|
||||||
|
<div class="header-image"><?= $this->Html->image('cake.logo.svg') ?></div>
|
||||||
|
<div class="header-title">
|
||||||
|
<h1>Welcome to CakePHP <?= Configure::version() ?> Red Velvet. Build fast. Grow solid.</h1>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="columns large-12">
|
||||||
|
<div class="ctp-warning alert text-center">
|
||||||
|
<p>Please be aware that this page will not be shown if you turn off debug mode unless you replace src/Template/Pages/home.ctp with your own version.</p>
|
||||||
|
</div>
|
||||||
|
<div id="url-rewriting-warning" class="alert url-rewriting">
|
||||||
|
<ul>
|
||||||
|
<li class="bullet problem">
|
||||||
|
URL rewriting is not properly configured on your server.<br />
|
||||||
|
1) <a target="_blank" href="https://book.cakephp.org/3.0/en/installation.html#url-rewriting">Help me configure it</a><br />
|
||||||
|
2) <a target="_blank" href="https://book.cakephp.org/3.0/en/development/configuration.html#general-configuration">I don't / can't use URL rewriting</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<?php Debugger::checkSecurityKeys(); ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="columns large-6">
|
||||||
|
<h4>Environment</h4>
|
||||||
|
<ul>
|
||||||
|
<?php if (version_compare(PHP_VERSION, '5.6.0', '>=')) : ?>
|
||||||
|
<li class="bullet success">Your version of PHP is 5.6.0 or higher (detected <?= PHP_VERSION ?>).</li>
|
||||||
|
<?php else : ?>
|
||||||
|
<li class="bullet problem">Your version of PHP is too low. You need PHP 5.6.0 or higher to use CakePHP (detected <?= PHP_VERSION ?>).</li>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<?php if (extension_loaded('mbstring')) : ?>
|
||||||
|
<li class="bullet success">Your version of PHP has the mbstring extension loaded.</li>
|
||||||
|
<?php else : ?>
|
||||||
|
<li class="bullet problem">Your version of PHP does NOT have the mbstring extension loaded.</li>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<?php if (extension_loaded('openssl')) : ?>
|
||||||
|
<li class="bullet success">Your version of PHP has the openssl extension loaded.</li>
|
||||||
|
<?php elseif (extension_loaded('mcrypt')) : ?>
|
||||||
|
<li class="bullet success">Your version of PHP has the mcrypt extension loaded.</li>
|
||||||
|
<?php else : ?>
|
||||||
|
<li class="bullet problem">Your version of PHP does NOT have the openssl or mcrypt extension loaded.</li>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<?php if (extension_loaded('intl')) : ?>
|
||||||
|
<li class="bullet success">Your version of PHP has the intl extension loaded.</li>
|
||||||
|
<?php else : ?>
|
||||||
|
<li class="bullet problem">Your version of PHP does NOT have the intl extension loaded.</li>
|
||||||
|
<?php endif; ?>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="columns large-6">
|
||||||
|
<h4>Filesystem</h4>
|
||||||
|
<ul>
|
||||||
|
<?php if (is_writable(TMP)) : ?>
|
||||||
|
<li class="bullet success">Your tmp directory is writable.</li>
|
||||||
|
<?php else : ?>
|
||||||
|
<li class="bullet problem">Your tmp directory is NOT writable.</li>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<?php if (is_writable(LOGS)) : ?>
|
||||||
|
<li class="bullet success">Your logs directory is writable.</li>
|
||||||
|
<?php else : ?>
|
||||||
|
<li class="bullet problem">Your logs directory is NOT writable.</li>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<?php $settings = Cache::getConfig('_cake_core_'); ?>
|
||||||
|
<?php if (!empty($settings)) : ?>
|
||||||
|
<li class="bullet success">The <em><?= $settings['className'] ?>Engine</em> is being used for core caching. To change the config edit config/app.php</li>
|
||||||
|
<?php else : ?>
|
||||||
|
<li class="bullet problem">Your cache is NOT working. Please check the settings in config/app.php</li>
|
||||||
|
<?php endif; ?>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<hr />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="columns large-6">
|
||||||
|
<h4>Database</h4>
|
||||||
|
<?php
|
||||||
|
try {
|
||||||
|
$connection = ConnectionManager::get('default');
|
||||||
|
$connected = $connection->connect();
|
||||||
|
} catch (Exception $connectionError) {
|
||||||
|
$connected = false;
|
||||||
|
$errorMsg = $connectionError->getMessage();
|
||||||
|
if (method_exists($connectionError, 'getAttributes')) :
|
||||||
|
$attributes = $connectionError->getAttributes();
|
||||||
|
if (isset($errorMsg['message'])) :
|
||||||
|
$errorMsg .= '<br />' . $attributes['message'];
|
||||||
|
endif;
|
||||||
|
endif;
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<ul>
|
||||||
|
<?php if ($connected) : ?>
|
||||||
|
<li class="bullet success">CakePHP is able to connect to the database.</li>
|
||||||
|
<?php else : ?>
|
||||||
|
<li class="bullet problem">CakePHP is NOT able to connect to the database.<br /><?= $errorMsg ?></li>
|
||||||
|
<?php endif; ?>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="columns large-6">
|
||||||
|
<h4>DebugKit</h4>
|
||||||
|
<ul>
|
||||||
|
<?php if (Plugin::isLoaded('DebugKit')) : ?>
|
||||||
|
<li class="bullet success">DebugKit is loaded.</li>
|
||||||
|
<?php else : ?>
|
||||||
|
<li class="bullet problem">DebugKit is NOT loaded. You need to either install pdo_sqlite, or define the "debug_kit" connection name.</li>
|
||||||
|
<?php endif; ?>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<hr />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="columns large-6">
|
||||||
|
<h3>Editing this Page</h3>
|
||||||
|
<ul>
|
||||||
|
<li class="bullet cutlery">To change the content of this page, edit: src/Template/Pages/home.ctp.</li>
|
||||||
|
<li class="bullet cutlery">You can also add some CSS styles for your pages at: webroot/css/.</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="columns large-6">
|
||||||
|
<h3>Getting Started</h3>
|
||||||
|
<ul>
|
||||||
|
<li class="bullet book"><a target="_blank" href="https://book.cakephp.org/3.0/en/">CakePHP 3.0 Docs</a></li>
|
||||||
|
<li class="bullet book"><a target="_blank" href="https://book.cakephp.org/3.0/en/tutorials-and-examples/cms/installation.html">The 20 min CMS Tutorial</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="columns large-12 text-center">
|
||||||
|
<h3 class="more">More about Cake</h3>
|
||||||
|
<p>
|
||||||
|
CakePHP is a rapid development framework for PHP which uses commonly known design patterns like Front Controller and MVC.<br />
|
||||||
|
Our primary goal is to provide a structured framework that enables PHP users at all levels to rapidly develop robust web applications, without any loss to flexibility.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<hr/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="columns large-4">
|
||||||
|
<i class="icon support">P</i>
|
||||||
|
<h3>Help and Bug Reports</h3>
|
||||||
|
<ul>
|
||||||
|
<li class="bullet cutlery">
|
||||||
|
<a href="irc://irc.freenode.net/cakephp">irc.freenode.net #cakephp</a>
|
||||||
|
<ul><li>Live chat about CakePHP</li></ul>
|
||||||
|
</li>
|
||||||
|
<li class="bullet cutlery">
|
||||||
|
<a href="http://cakesf.herokuapp.com/">Slack</a>
|
||||||
|
<ul><li>CakePHP Slack support</li></ul>
|
||||||
|
</li>
|
||||||
|
<li class="bullet cutlery">
|
||||||
|
<a href="https://github.com/cakephp/cakephp/issues">CakePHP Issues</a>
|
||||||
|
<ul><li>CakePHP issues and pull requests</li></ul>
|
||||||
|
</li>
|
||||||
|
<li class="bullet cutlery">
|
||||||
|
<a href="http://discourse.cakephp.org/">CakePHP Forum</a>
|
||||||
|
<ul><li>CakePHP official discussion forum</li></ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="columns large-4">
|
||||||
|
<i class="icon docs">r</i>
|
||||||
|
<h3>Docs and Downloads</h3>
|
||||||
|
<ul>
|
||||||
|
<li class="bullet cutlery">
|
||||||
|
<a href="https://api.cakephp.org/3.0/">CakePHP API</a>
|
||||||
|
<ul><li>Quick Reference</li></ul>
|
||||||
|
</li>
|
||||||
|
<li class="bullet cutlery">
|
||||||
|
<a href="https://book.cakephp.org/3.0/en/">CakePHP Documentation</a>
|
||||||
|
<ul><li>Your Rapid Development Cookbook</li></ul>
|
||||||
|
</li>
|
||||||
|
<li class="bullet cutlery">
|
||||||
|
<a href="https://bakery.cakephp.org">The Bakery</a>
|
||||||
|
<ul><li>Everything CakePHP</li></ul>
|
||||||
|
</li>
|
||||||
|
<li class="bullet cutlery">
|
||||||
|
<a href="https://plugins.cakephp.org">CakePHP plugins repo</a>
|
||||||
|
<ul><li>A comprehensive list of all CakePHP plugins created by the community</li></ul>
|
||||||
|
</li>
|
||||||
|
<li class="bullet cutlery">
|
||||||
|
<a href="https://github.com/cakephp/">CakePHP Code</a>
|
||||||
|
<ul><li>For the Development of CakePHP Git repository, Downloads</li></ul>
|
||||||
|
</li>
|
||||||
|
<li class="bullet cutlery">
|
||||||
|
<a href="https://github.com/FriendsOfCake/awesome-cakephp">CakePHP Awesome List</a>
|
||||||
|
<ul><li>A curated list of amazingly awesome CakePHP plugins, resources and shiny things.</li></ul>
|
||||||
|
</li>
|
||||||
|
<li class="bullet cutlery">
|
||||||
|
<a href="https://www.cakephp.org">CakePHP</a>
|
||||||
|
<ul><li>The Rapid Development Framework</li></ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="columns large-4">
|
||||||
|
<i class="icon training">s</i>
|
||||||
|
<h3>Training and Certification</h3>
|
||||||
|
<ul>
|
||||||
|
<li class="bullet cutlery">
|
||||||
|
<a href="https://cakefoundation.org/">Cake Software Foundation</a>
|
||||||
|
<ul><li>Promoting development related to CakePHP</li></ul>
|
||||||
|
</li>
|
||||||
|
<li class="bullet cutlery">
|
||||||
|
<a href="https://training.cakephp.org/">CakePHP Training</a>
|
||||||
|
<ul><li>Learn to use the CakePHP framework</li></ul>
|
||||||
|
</li>
|
||||||
|
<li class="bullet cutlery">
|
||||||
|
<a href="https://certification.cakephp.org/">CakePHP Certification</a>
|
||||||
|
<ul><li>Become a certified CakePHP developer</li></ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,49 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 3.0.4
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
namespace App\View;
|
||||||
|
|
||||||
|
use Cake\Event\EventManager;
|
||||||
|
use Cake\Http\Response;
|
||||||
|
use Cake\Http\ServerRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A view class that is used for AJAX responses.
|
||||||
|
* Currently only switches the default layout and sets the response type -
|
||||||
|
* which just maps to text/html by default.
|
||||||
|
*/
|
||||||
|
class AjaxView extends AppView
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the layout file to render the view inside of. The name
|
||||||
|
* specified is the filename of the layout in /src/Template/Layout without
|
||||||
|
* the .ctp extension.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
public $layout = 'ajax';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialization hook method.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function initialize()
|
||||||
|
{
|
||||||
|
parent::initialize();
|
||||||
|
|
||||||
|
$this->response = $this->response->withType('ajax');
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 3.0.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
namespace App\View;
|
||||||
|
|
||||||
|
use Cake\View\View;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Application View
|
||||||
|
*
|
||||||
|
* Your application's default view class
|
||||||
|
*
|
||||||
|
* @link https://book.cakephp.org/3.0/en/views.html#the-app-view
|
||||||
|
*/
|
||||||
|
class AppView extends View
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialization hook method.
|
||||||
|
*
|
||||||
|
* Use this method to add common initialization code like loading helpers.
|
||||||
|
*
|
||||||
|
* e.g. `$this->loadHelper('Html');`
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function initialize()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,99 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 3.3.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
namespace App;
|
||||||
|
|
||||||
|
use Cake\Core\Configure;
|
||||||
|
use Cake\Core\Exception\MissingPluginException;
|
||||||
|
use Cake\Error\Middleware\ErrorHandlerMiddleware;
|
||||||
|
use Cake\Http\BaseApplication;
|
||||||
|
use Cake\Routing\Middleware\AssetMiddleware;
|
||||||
|
use Cake\Routing\Middleware\RoutingMiddleware;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Application setup class.
|
||||||
|
*
|
||||||
|
* This defines the bootstrapping logic and middleware layers you
|
||||||
|
* want to use in your application.
|
||||||
|
*/
|
||||||
|
class Application extends BaseApplication
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public function bootstrap()
|
||||||
|
{
|
||||||
|
// Call parent to load bootstrap from files.
|
||||||
|
parent::bootstrap();
|
||||||
|
|
||||||
|
if (PHP_SAPI === 'cli') {
|
||||||
|
$this->bootstrapCli();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Only try to load DebugKit in development mode
|
||||||
|
* Debug Kit should not be installed on a production system
|
||||||
|
*/
|
||||||
|
// if (Configure::read('debug')) {
|
||||||
|
// $this->addPlugin(\DebugKit\Plugin::class);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Load more plugins here
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup the middleware queue your application will use.
|
||||||
|
*
|
||||||
|
* @param \Cake\Http\MiddlewareQueue $middlewareQueue The middleware queue to setup.
|
||||||
|
* @return \Cake\Http\MiddlewareQueue The updated middleware queue.
|
||||||
|
*/
|
||||||
|
public function middleware($middlewareQueue)
|
||||||
|
{
|
||||||
|
$middlewareQueue
|
||||||
|
// Catch any exceptions in the lower layers,
|
||||||
|
// and make an error page/response
|
||||||
|
->add(new ErrorHandlerMiddleware(null, Configure::read('Error')))
|
||||||
|
|
||||||
|
// Handle plugin/theme assets like CakePHP normally does.
|
||||||
|
->add(new AssetMiddleware([
|
||||||
|
'cacheTime' => Configure::read('Asset.cacheTime')
|
||||||
|
]))
|
||||||
|
|
||||||
|
// Add routing middleware.
|
||||||
|
// If you have a large number of routes connected, turning on routes
|
||||||
|
// caching in production could improve performance. For that when
|
||||||
|
// creating the middleware instance specify the cache config name by
|
||||||
|
// using it's second constructor argument:
|
||||||
|
// `new RoutingMiddleware($this, '_cake_routes_')`
|
||||||
|
->add(new RoutingMiddleware($this));
|
||||||
|
|
||||||
|
return $middlewareQueue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function bootstrapCli()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$this->addPlugin('Bake');
|
||||||
|
} catch (MissingPluginException $e) {
|
||||||
|
// Do not halt if the plugin is missing
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->addPlugin('Migrations');
|
||||||
|
|
||||||
|
// Load more plugins here
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,246 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 3.0.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
namespace App\Console;
|
||||||
|
|
||||||
|
if (!defined('STDIN')) {
|
||||||
|
define('STDIN', fopen('php://stdin', 'r'));
|
||||||
|
}
|
||||||
|
|
||||||
|
use Cake\Utility\Security;
|
||||||
|
use Composer\Script\Event;
|
||||||
|
use Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides installation hooks for when this application is installed via
|
||||||
|
* composer. Customize this class to suit your needs.
|
||||||
|
*/
|
||||||
|
class Installer
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An array of directories to be made writable
|
||||||
|
*/
|
||||||
|
const WRITABLE_DIRS = [
|
||||||
|
'logs',
|
||||||
|
'tmp',
|
||||||
|
'tmp/cache',
|
||||||
|
'tmp/cache/models',
|
||||||
|
'tmp/cache/persistent',
|
||||||
|
'tmp/cache/views',
|
||||||
|
'tmp/sessions',
|
||||||
|
'tmp/tests'
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does some routine installation tasks so people don't have to.
|
||||||
|
*
|
||||||
|
* @param \Composer\Script\Event $event The composer event object.
|
||||||
|
* @throws \Exception Exception raised by validator.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function postInstall(Event $event)
|
||||||
|
{
|
||||||
|
$io = $event->getIO();
|
||||||
|
|
||||||
|
$rootDir = dirname(dirname(__DIR__));
|
||||||
|
|
||||||
|
static::createAppConfig($rootDir, $io);
|
||||||
|
static::createWritableDirectories($rootDir, $io);
|
||||||
|
|
||||||
|
// ask if the permissions should be changed
|
||||||
|
if ($io->isInteractive()) {
|
||||||
|
$validator = function ($arg) {
|
||||||
|
if (in_array($arg, ['Y', 'y', 'N', 'n'])) {
|
||||||
|
return $arg;
|
||||||
|
}
|
||||||
|
throw new Exception('This is not a valid answer. Please choose Y or n.');
|
||||||
|
};
|
||||||
|
$setFolderPermissions = $io->askAndValidate(
|
||||||
|
'<info>Set Folder Permissions ? (Default to Y)</info> [<comment>Y,n</comment>]? ',
|
||||||
|
$validator,
|
||||||
|
10,
|
||||||
|
'Y'
|
||||||
|
);
|
||||||
|
|
||||||
|
if (in_array($setFolderPermissions, ['Y', 'y'])) {
|
||||||
|
static::setFolderPermissions($rootDir, $io);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
static::setFolderPermissions($rootDir, $io);
|
||||||
|
}
|
||||||
|
|
||||||
|
static::setSecuritySalt($rootDir, $io);
|
||||||
|
|
||||||
|
$class = 'Cake\Codeception\Console\Installer';
|
||||||
|
if (class_exists($class)) {
|
||||||
|
$class::customizeCodeceptionBinary($event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create the config/app.php file if it does not exist.
|
||||||
|
*
|
||||||
|
* @param string $dir The application's root directory.
|
||||||
|
* @param \Composer\IO\IOInterface $io IO interface to write to console.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function createAppConfig($dir, $io)
|
||||||
|
{
|
||||||
|
$appConfig = $dir . '/config/app.php';
|
||||||
|
$defaultConfig = $dir . '/config/app.default.php';
|
||||||
|
if (!file_exists($appConfig)) {
|
||||||
|
copy($defaultConfig, $appConfig);
|
||||||
|
$io->write('Created `config/app.php` file');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create the `logs` and `tmp` directories.
|
||||||
|
*
|
||||||
|
* @param string $dir The application's root directory.
|
||||||
|
* @param \Composer\IO\IOInterface $io IO interface to write to console.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function createWritableDirectories($dir, $io)
|
||||||
|
{
|
||||||
|
foreach (static::WRITABLE_DIRS as $path) {
|
||||||
|
$path = $dir . '/' . $path;
|
||||||
|
if (!file_exists($path)) {
|
||||||
|
mkdir($path);
|
||||||
|
$io->write('Created `' . $path . '` directory');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set globally writable permissions on the "tmp" and "logs" directory.
|
||||||
|
*
|
||||||
|
* This is not the most secure default, but it gets people up and running quickly.
|
||||||
|
*
|
||||||
|
* @param string $dir The application's root directory.
|
||||||
|
* @param \Composer\IO\IOInterface $io IO interface to write to console.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function setFolderPermissions($dir, $io)
|
||||||
|
{
|
||||||
|
// Change the permissions on a path and output the results.
|
||||||
|
$changePerms = function ($path) use ($io) {
|
||||||
|
$currentPerms = fileperms($path) & 0777;
|
||||||
|
$worldWritable = $currentPerms | 0007;
|
||||||
|
if ($worldWritable == $currentPerms) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$res = chmod($path, $worldWritable);
|
||||||
|
if ($res) {
|
||||||
|
$io->write('Permissions set on ' . $path);
|
||||||
|
} else {
|
||||||
|
$io->write('Failed to set permissions on ' . $path);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$walker = function ($dir) use (&$walker, $changePerms) {
|
||||||
|
$files = array_diff(scandir($dir), ['.', '..']);
|
||||||
|
foreach ($files as $file) {
|
||||||
|
$path = $dir . '/' . $file;
|
||||||
|
|
||||||
|
if (!is_dir($path)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$changePerms($path);
|
||||||
|
$walker($path);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$walker($dir . '/tmp');
|
||||||
|
$changePerms($dir . '/tmp');
|
||||||
|
$changePerms($dir . '/logs');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the security.salt value in the application's config file.
|
||||||
|
*
|
||||||
|
* @param string $dir The application's root directory.
|
||||||
|
* @param \Composer\IO\IOInterface $io IO interface to write to console.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function setSecuritySalt($dir, $io)
|
||||||
|
{
|
||||||
|
$newKey = hash('sha256', Security::randomBytes(64));
|
||||||
|
static::setSecuritySaltInFile($dir, $io, $newKey, 'app.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the security.salt value in a given file
|
||||||
|
*
|
||||||
|
* @param string $dir The application's root directory.
|
||||||
|
* @param \Composer\IO\IOInterface $io IO interface to write to console.
|
||||||
|
* @param string $newKey key to set in the file
|
||||||
|
* @param string $file A path to a file relative to the application's root
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function setSecuritySaltInFile($dir, $io, $newKey, $file)
|
||||||
|
{
|
||||||
|
$config = $dir . '/config/' . $file;
|
||||||
|
$content = file_get_contents($config);
|
||||||
|
|
||||||
|
$content = str_replace('__SALT__', $newKey, $content, $count);
|
||||||
|
|
||||||
|
if ($count == 0) {
|
||||||
|
$io->write('No Security.salt placeholder to replace.');
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = file_put_contents($config, $content);
|
||||||
|
if ($result) {
|
||||||
|
$io->write('Updated Security.salt value in config/' . $file);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$io->write('Unable to update Security.salt value.');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the APP_NAME value in a given file
|
||||||
|
*
|
||||||
|
* @param string $dir The application's root directory.
|
||||||
|
* @param \Composer\IO\IOInterface $io IO interface to write to console.
|
||||||
|
* @param string $appName app name to set in the file
|
||||||
|
* @param string $file A path to a file relative to the application's root
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function setAppNameInFile($dir, $io, $appName, $file)
|
||||||
|
{
|
||||||
|
$config = $dir . '/config/' . $file;
|
||||||
|
$content = file_get_contents($config);
|
||||||
|
$content = str_replace('__APP_NAME__', $appName, $content, $count);
|
||||||
|
|
||||||
|
if ($count == 0) {
|
||||||
|
$io->write('No __APP_NAME__ placeholder to replace.');
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = file_put_contents($config, $content);
|
||||||
|
if ($result) {
|
||||||
|
$io->write('Updated __APP_NAME__ value in config/' . $file);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$io->write('Unable to update __APP_NAME__ value.');
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 0.2.9
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
namespace App\Controller;
|
||||||
|
|
||||||
|
use Cake\Controller\Controller;
|
||||||
|
use Cake\Event\Event;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Application Controller
|
||||||
|
*
|
||||||
|
* Add your application-wide methods in the class below, your controllers
|
||||||
|
* will inherit them.
|
||||||
|
*
|
||||||
|
* @link https://book.cakephp.org/3.0/en/controllers.html#the-app-controller
|
||||||
|
*/
|
||||||
|
class AppController extends Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialization hook method.
|
||||||
|
*
|
||||||
|
* Use this method to add common initialization code like loading components.
|
||||||
|
*
|
||||||
|
* e.g. `$this->loadComponent('Security');`
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function initialize()
|
||||||
|
{
|
||||||
|
parent::initialize();
|
||||||
|
|
||||||
|
$this->log('loaded');
|
||||||
|
|
||||||
|
$this->loadComponent('RequestHandler', [
|
||||||
|
'enableBeforeRedirect' => false,
|
||||||
|
]);
|
||||||
|
$this->loadComponent('Flash');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Enable the following component for recommended CakePHP security settings.
|
||||||
|
* see https://book.cakephp.org/3.0/en/controllers/components/security.html
|
||||||
|
*/
|
||||||
|
//$this->loadComponent('Security');
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,70 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 3.3.4
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
namespace App\Controller;
|
||||||
|
|
||||||
|
use Cake\Event\Event;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Error Handling Controller
|
||||||
|
*
|
||||||
|
* Controller used by ExceptionRenderer to render error responses.
|
||||||
|
*/
|
||||||
|
class ErrorController extends AppController
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Initialization hook method.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function initialize()
|
||||||
|
{
|
||||||
|
$this->loadComponent('RequestHandler', [
|
||||||
|
'enableBeforeRedirect' => false,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* beforeFilter callback.
|
||||||
|
*
|
||||||
|
* @param \Cake\Event\Event $event Event.
|
||||||
|
* @return \Cake\Http\Response|null|void
|
||||||
|
*/
|
||||||
|
public function beforeFilter(Event $event)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* beforeRender callback.
|
||||||
|
*
|
||||||
|
* @param \Cake\Event\Event $event Event.
|
||||||
|
* @return \Cake\Http\Response|null|void
|
||||||
|
*/
|
||||||
|
public function beforeRender(Event $event)
|
||||||
|
{
|
||||||
|
parent::beforeRender($event);
|
||||||
|
|
||||||
|
$this->viewBuilder()->setTemplatePath('Error');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* afterFilter callback.
|
||||||
|
*
|
||||||
|
* @param \Cake\Event\Event $event Event.
|
||||||
|
* @return \Cake\Http\Response|null|void
|
||||||
|
*/
|
||||||
|
public function afterFilter(Event $event)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 0.2.9
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
namespace App\Controller;
|
||||||
|
|
||||||
|
use Cake\Core\Configure;
|
||||||
|
use Cake\Http\Exception\ForbiddenException;
|
||||||
|
use Cake\Http\Exception\NotFoundException;
|
||||||
|
use Cake\View\Exception\MissingTemplateException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Static content controller
|
||||||
|
*
|
||||||
|
* This controller will render views from Template/Pages/
|
||||||
|
*
|
||||||
|
* @link https://book.cakephp.org/3.0/en/controllers/pages-controller.html
|
||||||
|
*/
|
||||||
|
class HomeController extends AppController
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays a view
|
||||||
|
*
|
||||||
|
* @param array ...$path Path segments.
|
||||||
|
* @return \Cake\Http\Response|null
|
||||||
|
* @throws \Cake\Http\Exception\ForbiddenException When a directory traversal attempt.
|
||||||
|
* @throws \Cake\Http\Exception\NotFoundException When the view file could not
|
||||||
|
* be found or \Cake\View\Exception\MissingTemplateException in debug mode.
|
||||||
|
*/
|
||||||
|
public function display(...$path)
|
||||||
|
{
|
||||||
|
$count = count($path);
|
||||||
|
if (!$count) {
|
||||||
|
return $this->redirect('/');
|
||||||
|
}
|
||||||
|
if (in_array('..', $path, true) || in_array('.', $path, true)) {
|
||||||
|
throw new ForbiddenException();
|
||||||
|
}
|
||||||
|
$page = $subpage = null;
|
||||||
|
|
||||||
|
if (!empty($path[0])) {
|
||||||
|
$page = $path[0];
|
||||||
|
}
|
||||||
|
if (!empty($path[1])) {
|
||||||
|
$subpage = $path[1];
|
||||||
|
}
|
||||||
|
$this->set(compact('page', 'subpage'));
|
||||||
|
|
||||||
|
try {
|
||||||
|
$this->render(implode('/', $path));
|
||||||
|
} catch (MissingTemplateException $exception) {
|
||||||
|
if (Configure::read('debug')) {
|
||||||
|
throw $exception;
|
||||||
|
}
|
||||||
|
throw new NotFoundException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 0.2.9
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
namespace App\Controller;
|
||||||
|
|
||||||
|
use Cake\Core\Configure;
|
||||||
|
use Cake\Http\Exception\ForbiddenException;
|
||||||
|
use Cake\Http\Exception\NotFoundException;
|
||||||
|
use Cake\View\Exception\MissingTemplateException;
|
||||||
|
use Cake\Log\Log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Static content controller
|
||||||
|
*
|
||||||
|
* This controller will render views from Template/Pages/
|
||||||
|
*
|
||||||
|
* @link https://book.cakephp.org/3.0/en/controllers/pages-controller.html
|
||||||
|
*/
|
||||||
|
class Oauth2Controller extends AppController
|
||||||
|
{
|
||||||
|
|
||||||
|
public function authorized($request) {
|
||||||
|
$this->log('authorized');
|
||||||
|
$this->log($request);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays a view
|
||||||
|
*
|
||||||
|
* @param array ...$path Path segments.
|
||||||
|
* @return \Cake\Http\Response|null
|
||||||
|
* @throws \Cake\Http\Exception\ForbiddenException When a directory traversal attempt.
|
||||||
|
* @throws \Cake\Http\Exception\NotFoundException When the view file could not
|
||||||
|
* be found or \Cake\View\Exception\MissingTemplateException in debug mode.
|
||||||
|
*/
|
||||||
|
public function display(...$path)
|
||||||
|
{
|
||||||
|
$count = count($path);
|
||||||
|
if (!$count) {
|
||||||
|
return $this->redirect('/');
|
||||||
|
}
|
||||||
|
if (in_array('..', $path, true) || in_array('.', $path, true)) {
|
||||||
|
throw new ForbiddenException();
|
||||||
|
}
|
||||||
|
$page = $subpage = null;
|
||||||
|
|
||||||
|
if (!empty($path[0])) {
|
||||||
|
$page = $path[0];
|
||||||
|
}
|
||||||
|
if (!empty($path[1])) {
|
||||||
|
$subpage = $path[1];
|
||||||
|
}
|
||||||
|
$this->set(compact('page', 'subpage'));
|
||||||
|
|
||||||
|
try {
|
||||||
|
$this->render(implode('/', $path));
|
||||||
|
} catch (MissingTemplateException $exception) {
|
||||||
|
if (Configure::read('debug')) {
|
||||||
|
throw $exception;
|
||||||
|
}
|
||||||
|
throw new NotFoundException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 3.0.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
namespace App\Shell;
|
||||||
|
|
||||||
|
use Cake\Console\ConsoleOptionParser;
|
||||||
|
use Cake\Console\Shell;
|
||||||
|
use Cake\Log\Log;
|
||||||
|
use Psy\Shell as PsyShell;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple console wrapper around Psy\Shell.
|
||||||
|
*/
|
||||||
|
class ConsoleShell extends Shell
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start the shell and interactive console.
|
||||||
|
*
|
||||||
|
* @return int|null
|
||||||
|
*/
|
||||||
|
public function main()
|
||||||
|
{
|
||||||
|
if (!class_exists('Psy\Shell')) {
|
||||||
|
$this->err('<error>Unable to load Psy\Shell.</error>');
|
||||||
|
$this->err('');
|
||||||
|
$this->err('Make sure you have installed psysh as a dependency,');
|
||||||
|
$this->err('and that Psy\Shell is registered in your autoloader.');
|
||||||
|
$this->err('');
|
||||||
|
$this->err('If you are using composer run');
|
||||||
|
$this->err('');
|
||||||
|
$this->err('<info>$ php composer.phar require --dev psy/psysh</info>');
|
||||||
|
$this->err('');
|
||||||
|
|
||||||
|
return self::CODE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->out("You can exit with <info>`CTRL-C`</info> or <info>`exit`</info>");
|
||||||
|
$this->out('');
|
||||||
|
|
||||||
|
Log::drop('debug');
|
||||||
|
Log::drop('error');
|
||||||
|
$this->_io->setLoggers(false);
|
||||||
|
restore_error_handler();
|
||||||
|
restore_exception_handler();
|
||||||
|
|
||||||
|
$psy = new PsyShell();
|
||||||
|
$psy->run();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display help for this console.
|
||||||
|
*
|
||||||
|
* @return \Cake\Console\ConsoleOptionParser
|
||||||
|
*/
|
||||||
|
public function getOptionParser()
|
||||||
|
{
|
||||||
|
$parser = new ConsoleOptionParser('console');
|
||||||
|
$parser->setDescription(
|
||||||
|
'This shell provides a REPL that you can use to interact with ' .
|
||||||
|
'your application in a command line designed to run PHP code. ' .
|
||||||
|
'You can use it to run adhoc queries with your models, or ' .
|
||||||
|
'explore the features of CakePHP and your application.' .
|
||||||
|
"\n\n" .
|
||||||
|
'You will need to have psysh installed for this Shell to work.'
|
||||||
|
);
|
||||||
|
|
||||||
|
return $parser;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
<?php
|
||||||
|
$class = 'message';
|
||||||
|
if (!empty($params['class'])) {
|
||||||
|
$class .= ' ' . $params['class'];
|
||||||
|
}
|
||||||
|
if (!isset($params['escape']) || $params['escape'] !== false) {
|
||||||
|
$message = h($message);
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<div class="<?= h($class) ?>" onclick="this.classList.add('hidden');"><?= $message ?></div>
|
|
@ -0,0 +1,6 @@
|
||||||
|
<?php
|
||||||
|
if (!isset($params['escape']) || $params['escape'] !== false) {
|
||||||
|
$message = h($message);
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<div class="message error" onclick="this.classList.add('hidden');"><?= $message ?></div>
|
|
@ -0,0 +1,6 @@
|
||||||
|
<?php
|
||||||
|
if (!isset($params['escape']) || $params['escape'] !== false) {
|
||||||
|
$message = h($message);
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<div class="message success" onclick="this.classList.add('hidden')"><?= $message ?></div>
|
|
@ -0,0 +1,20 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 0.10.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
$content = explode("\n", $content);
|
||||||
|
|
||||||
|
foreach ($content as $line) :
|
||||||
|
echo '<p> ' . $line . "</p>\n";
|
||||||
|
endforeach;
|
|
@ -0,0 +1,16 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 0.10.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
echo $content;
|
|
@ -0,0 +1,38 @@
|
||||||
|
<?php
|
||||||
|
use Cake\Core\Configure;
|
||||||
|
use Cake\Error\Debugger;
|
||||||
|
|
||||||
|
$this->layout = 'error';
|
||||||
|
|
||||||
|
if (Configure::read('debug')) :
|
||||||
|
$this->layout = 'dev_error';
|
||||||
|
|
||||||
|
$this->assign('title', $message);
|
||||||
|
$this->assign('templateName', 'error400.ctp');
|
||||||
|
|
||||||
|
$this->start('file');
|
||||||
|
?>
|
||||||
|
<?php if (!empty($error->queryString)) : ?>
|
||||||
|
<p class="notice">
|
||||||
|
<strong>SQL Query: </strong>
|
||||||
|
<?= h($error->queryString) ?>
|
||||||
|
</p>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if (!empty($error->params)) : ?>
|
||||||
|
<strong>SQL Query Params: </strong>
|
||||||
|
<?php Debugger::dump($error->params) ?>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?= $this->element('auto_table_warning') ?>
|
||||||
|
<?php
|
||||||
|
if (extension_loaded('xdebug')) :
|
||||||
|
xdebug_print_function_stack();
|
||||||
|
endif;
|
||||||
|
|
||||||
|
$this->end();
|
||||||
|
endif;
|
||||||
|
?>
|
||||||
|
<h2><?= h($message) ?></h2>
|
||||||
|
<p class="error">
|
||||||
|
<strong><?= __d('cake', 'Error') ?>: </strong>
|
||||||
|
<?= __d('cake', 'The requested address {0} was not found on this server.', "<strong>'{$url}'</strong>") ?>
|
||||||
|
</p>
|
|
@ -0,0 +1,43 @@
|
||||||
|
<?php
|
||||||
|
use Cake\Core\Configure;
|
||||||
|
use Cake\Error\Debugger;
|
||||||
|
|
||||||
|
$this->layout = 'error';
|
||||||
|
|
||||||
|
if (Configure::read('debug')) :
|
||||||
|
$this->layout = 'dev_error';
|
||||||
|
|
||||||
|
$this->assign('title', $message);
|
||||||
|
$this->assign('templateName', 'error500.ctp');
|
||||||
|
|
||||||
|
$this->start('file');
|
||||||
|
?>
|
||||||
|
<?php if (!empty($error->queryString)) : ?>
|
||||||
|
<p class="notice">
|
||||||
|
<strong>SQL Query: </strong>
|
||||||
|
<?= h($error->queryString) ?>
|
||||||
|
</p>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if (!empty($error->params)) : ?>
|
||||||
|
<strong>SQL Query Params: </strong>
|
||||||
|
<?php Debugger::dump($error->params) ?>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if ($error instanceof Error) : ?>
|
||||||
|
<strong>Error in: </strong>
|
||||||
|
<?= sprintf('%s, line %s', str_replace(ROOT, 'ROOT', $error->getFile()), $error->getLine()) ?>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php
|
||||||
|
echo $this->element('auto_table_warning');
|
||||||
|
|
||||||
|
if (extension_loaded('xdebug')) :
|
||||||
|
xdebug_print_function_stack();
|
||||||
|
endif;
|
||||||
|
|
||||||
|
$this->end();
|
||||||
|
endif;
|
||||||
|
?>
|
||||||
|
<h2><?= __d('cake', 'An Internal Error Has Occurred') ?></h2>
|
||||||
|
<p class="error">
|
||||||
|
<strong><?= __d('cake', 'Error') ?>: </strong>
|
||||||
|
<?= h($message) ?>
|
||||||
|
</p>
|
|
@ -0,0 +1,7 @@
|
||||||
|
<div class="container" style="padding-top:20px;text-align: center">
|
||||||
|
<div class="col-sm"><h4><?=__('3D Entity Component System based Engine for the Web - based on Three.js')?></h4></div>
|
||||||
|
<div class="col-sm"><?=__('Design - Create - Experience')?></div>
|
||||||
|
<div class="col-sm">-</div>
|
||||||
|
<div class="col-sm"><?=__('Choose a project from your list above or create a new one')?></div>
|
||||||
|
<div class="col-sm"><button style="margin-top: 20px; border-radius: 2px;" onclick=""><?=__('Create new Project')?></button></div>
|
||||||
|
</div>
|
|
@ -0,0 +1,24 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 0.10.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title><?= $this->fetch('title') ?></title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<?= $this->fetch('content') ?>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,16 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 0.10.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
echo $this->fetch('content');
|
|
@ -0,0 +1,16 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 0.10.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
echo $this->fetch('content');
|
|
@ -0,0 +1,173 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Cake\Utility\Inflector;
|
||||||
|
|
||||||
|
?>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
|
||||||
|
<meta name="google-signin-scope" content="profile email">
|
||||||
|
<meta name="google-signin-client_id" content="906972333574-e6ub0ckcdu4ejju66jvtco2moc3senib.apps.googleusercontent.com">
|
||||||
|
<script src="https://apis.google.com/js/platform.js" async defer></script>
|
||||||
|
|
||||||
|
<title>- ECS - Editor</title>
|
||||||
|
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||||
|
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-121323464-1"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
window.dataLayer = window.dataLayer || [];
|
||||||
|
function gtag(){dataLayer.push(arguments);}
|
||||||
|
gtag('js', new Date());
|
||||||
|
gtag('config', 'UA-141744867-1');
|
||||||
|
</script>
|
||||||
|
<?= $this->Html->charset() ?>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
|
||||||
|
<link rel="manifest" href="/manifest.webmanifest">
|
||||||
|
<meta name="msapplication-TileColor" content="#da532c">
|
||||||
|
<meta name="theme-color" content="#ffffff">
|
||||||
|
|
||||||
|
<?= $this->Html->css('style.css') ?>
|
||||||
|
<?= $this->Html->css('https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css') ?>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!-- Optional JavaScript -->
|
||||||
|
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
|
||||||
|
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
|
||||||
|
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
|
||||||
|
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
|
||||||
|
|
||||||
|
<script src="https://source.r3js.org/build/r3.js" type="text/javascript"></script>
|
||||||
|
<script src="js/config.js" type="text/javascript"></script>
|
||||||
|
|
||||||
|
<script src="https://unpkg.com/gijgo@1.9.13/js/gijgo.min.js" type="text/javascript"></script>
|
||||||
|
<link href="https://unpkg.com/gijgo@1.9.13/css/gijgo.min.css" rel="stylesheet" type="text/css" />
|
||||||
|
|
||||||
|
<?= $this->Flash->render() ?>
|
||||||
|
<div id="divBackground" class="sticky">
|
||||||
|
</div>
|
||||||
|
<nav class="navbar navbar-expand-lg navbar-light bg-light">
|
||||||
|
<a class="navbar-brand" href="/">r3.js - editor</a>
|
||||||
|
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
<div class="collapse navbar-collapse" id="navbarNav">
|
||||||
|
<ul class="navbar-nav">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="/menu"><?=__('Menu') ?></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<select id="selectProject" class="nav-link"><option><?=__('Select Project') ?></option></select>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<select id="selectEntity" class="nav-link"><option><?=__('Select Entity') ?></option></select>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<select id="selectComponent" class="nav-link"><option><?=__('Select Component') ?></option></select>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<select id="selectCreateComponent" class="nav-link"><option><?=__('Create Component') ?></option></select>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="/create"><?=__('Create')?></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<select id="selectCustomCodeComponent" class="nav-link"><option><?=__('Select Code') ?></option></select>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="/code-editor"><?=__('Code Editor')?></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<select id="selectMode" class="nav-link"><option><?=__('Edit Mode')?></option><option><?=__('Run Mode')?></option></select>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="/action/start"><?=__('Start')?></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="/action/pause"><?=__('Pause')?></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="/action/restart"><?=__('Restart')?></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="navbar-nav ml-auto">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link disabled" id="aSave" href="/action/save"><?=__('Save')?></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link disabled" id="aDelete" href="/action/delete"><?=__('Delete')?></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link disabled" id="aUpload" href="/action/upload"><?=__('Upload')?></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<div id="divSignOut"></div>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<div class="g-signin2" data-onsuccess="onSignIn" data-theme="dark"></div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
<div class="content">
|
||||||
|
<?= $this->fetch('content') ?>
|
||||||
|
</div>
|
||||||
|
<footer>
|
||||||
|
<a href="http://www.icondrawer.com/"></a>
|
||||||
|
</footer>
|
||||||
|
<script>
|
||||||
|
function onSignIn(googleUser) {
|
||||||
|
// Useful data for your client-side scripts:
|
||||||
|
var profile = googleUser.getBasicProfile();
|
||||||
|
console.log("ID: " + profile.getId()); // Don't send this directly to your server!
|
||||||
|
console.log('Full Name: ' + profile.getName());
|
||||||
|
console.log('Given Name: ' + profile.getGivenName());
|
||||||
|
console.log('Family Name: ' + profile.getFamilyName());
|
||||||
|
console.log("Image URL: " + profile.getImageUrl());
|
||||||
|
console.log("Email: " + profile.getEmail());
|
||||||
|
|
||||||
|
// The ID token you need to pass to your backend:
|
||||||
|
var id_token = googleUser.getAuthResponse().id_token;
|
||||||
|
console.log("ID Token: " + id_token);
|
||||||
|
|
||||||
|
document.getElementById('divSignOut').innerHTML = '';
|
||||||
|
var a = document.createElement('a');
|
||||||
|
a.innerText = 'Sign Out';
|
||||||
|
a.setAttribute('class', 'nav-link');
|
||||||
|
a.addEventListener('click', signOut);
|
||||||
|
document.getElementById('divSignOut').appendChild(a);
|
||||||
|
|
||||||
|
document.getElementById('aSave').setAttribute('class', 'nav-link');
|
||||||
|
document.getElementById('aDelete').setAttribute('class', 'nav-link');
|
||||||
|
document.getElementById('aUpload').setAttribute('class', 'nav-link');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Now send the token to our API
|
||||||
|
*/
|
||||||
|
var xhr = new XMLHttpRequest();
|
||||||
|
xhr.open('POST', 'https://api.r3js.org/signin');
|
||||||
|
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||||
|
xhr.onload = function() {
|
||||||
|
console.log('Signed in as: ' + xhr.responseText);
|
||||||
|
};
|
||||||
|
xhr.send('idtoken=' + id_token);
|
||||||
|
}
|
||||||
|
|
||||||
|
function signOut() {
|
||||||
|
var auth2 = gapi.auth2.getAuthInstance();
|
||||||
|
auth2.signOut().then(function () {
|
||||||
|
console.log('User signed out.');
|
||||||
|
document.getElementById('divSignOut').innerHTML = '';
|
||||||
|
document.getElementById('aSave').setAttribute('class', 'nav-link disabled');
|
||||||
|
document.getElementById('aDelete').setAttribute('class', 'nav-link disabled');
|
||||||
|
document.getElementById('aUpload').setAttribute('class', 'nav-link disabled');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,47 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 0.10.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
?>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<?= $this->Html->charset() ?>
|
||||||
|
<title>
|
||||||
|
<?= $this->fetch('title') ?>
|
||||||
|
</title>
|
||||||
|
<?= $this->Html->meta('icon') ?>
|
||||||
|
|
||||||
|
<?= $this->Html->css('base.css') ?>
|
||||||
|
<?= $this->Html->css('style.css') ?>
|
||||||
|
|
||||||
|
<?= $this->fetch('meta') ?>
|
||||||
|
<?= $this->fetch('css') ?>
|
||||||
|
<?= $this->fetch('script') ?>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="container">
|
||||||
|
<div id="header">
|
||||||
|
<h1><?= __('Error') ?></h1>
|
||||||
|
</div>
|
||||||
|
<div id="content">
|
||||||
|
<?= $this->Flash->render() ?>
|
||||||
|
|
||||||
|
<?= $this->fetch('content') ?>
|
||||||
|
</div>
|
||||||
|
<div id="footer">
|
||||||
|
<?= $this->Html->link(__('Back'), 'javascript:history.back()') ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,11 @@
|
||||||
|
<?php
|
||||||
|
if (!isset($channel)) :
|
||||||
|
$channel = [];
|
||||||
|
endif;
|
||||||
|
if (!isset($channel['title'])) :
|
||||||
|
$channel['title'] = $this->fetch('title');
|
||||||
|
endif;
|
||||||
|
|
||||||
|
echo $this->Rss->document(
|
||||||
|
$this->Rss->channel([], $channel, $this->fetch('content'))
|
||||||
|
);
|
|
@ -0,0 +1,49 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 3.0.4
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
namespace App\View;
|
||||||
|
|
||||||
|
use Cake\Event\EventManager;
|
||||||
|
use Cake\Http\Response;
|
||||||
|
use Cake\Http\ServerRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A view class that is used for AJAX responses.
|
||||||
|
* Currently only switches the default layout and sets the response type -
|
||||||
|
* which just maps to text/html by default.
|
||||||
|
*/
|
||||||
|
class AjaxView extends AppView
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the layout file to render the view inside of. The name
|
||||||
|
* specified is the filename of the layout in /src/Template/Layout without
|
||||||
|
* the .ctp extension.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
public $layout = 'ajax';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialization hook method.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function initialize()
|
||||||
|
{
|
||||||
|
parent::initialize();
|
||||||
|
|
||||||
|
$this->response = $this->response->withType('ajax');
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* Redistributions of files must retain the above copyright notice.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 3.0.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
namespace App\View;
|
||||||
|
|
||||||
|
use Cake\View\View;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Application View
|
||||||
|
*
|
||||||
|
* Your application's default view class
|
||||||
|
*
|
||||||
|
* @link https://book.cakephp.org/3.0/en/views.html#the-app-view
|
||||||
|
*/
|
||||||
|
class AppView extends View
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialization hook method.
|
||||||
|
*
|
||||||
|
* Use this method to add common initialization code like loading helpers.
|
||||||
|
*
|
||||||
|
* e.g. `$this->loadHelper('Html');`
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function initialize()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,84 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 3.3.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
namespace App\Test\TestCase;
|
||||||
|
|
||||||
|
use App\Application;
|
||||||
|
use Cake\Error\Middleware\ErrorHandlerMiddleware;
|
||||||
|
use Cake\Http\MiddlewareQueue;
|
||||||
|
use Cake\Routing\Middleware\AssetMiddleware;
|
||||||
|
use Cake\Routing\Middleware\RoutingMiddleware;
|
||||||
|
use Cake\TestSuite\IntegrationTestCase;
|
||||||
|
use InvalidArgumentException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ApplicationTest class
|
||||||
|
*/
|
||||||
|
class ApplicationTest extends IntegrationTestCase
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* testBootstrap
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testBootstrap()
|
||||||
|
{
|
||||||
|
$app = new Application(dirname(dirname(__DIR__)) . '/config');
|
||||||
|
$app->bootstrap();
|
||||||
|
$plugins = $app->getPlugins();
|
||||||
|
|
||||||
|
$this->assertCount(3, $plugins);
|
||||||
|
$this->assertSame('Bake', $plugins->get('Bake')->getName());
|
||||||
|
$this->assertSame('Migrations', $plugins->get('Migrations')->getName());
|
||||||
|
$this->assertSame('DebugKit', $plugins->get('DebugKit')->getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* testBootstrapPluginWitoutHalt
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testBootstrapPluginWithoutHalt()
|
||||||
|
{
|
||||||
|
$this->expectException(InvalidArgumentException::class);
|
||||||
|
|
||||||
|
$app = $this->getMockBuilder(Application::class)
|
||||||
|
->setConstructorArgs([dirname(dirname(__DIR__)) . '/config'])
|
||||||
|
->setMethods(['addPlugin'])
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$app->method('addPlugin')
|
||||||
|
->will($this->throwException(new InvalidArgumentException('test exception.')));
|
||||||
|
|
||||||
|
$app->bootstrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* testMiddleware
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMiddleware()
|
||||||
|
{
|
||||||
|
$app = new Application(dirname(dirname(__DIR__)) . '/config');
|
||||||
|
$middleware = new MiddlewareQueue();
|
||||||
|
|
||||||
|
$middleware = $app->middleware($middleware);
|
||||||
|
|
||||||
|
$this->assertInstanceOf(ErrorHandlerMiddleware::class, $middleware->get(0));
|
||||||
|
$this->assertInstanceOf(AssetMiddleware::class, $middleware->get(1));
|
||||||
|
$this->assertInstanceOf(RoutingMiddleware::class, $middleware->get(2));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,97 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
||||||
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
*
|
||||||
|
* Licensed under The MIT License
|
||||||
|
* For full copyright and license information, please see the LICENSE.txt
|
||||||
|
* Redistributions of files must retain the above copyright notice
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
||||||
|
* @link https://cakephp.org CakePHP(tm) Project
|
||||||
|
* @since 1.2.0
|
||||||
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
||||||
|
*/
|
||||||
|
namespace App\Test\TestCase\Controller;
|
||||||
|
|
||||||
|
use App\Controller\PagesController;
|
||||||
|
use Cake\Core\App;
|
||||||
|
use Cake\Core\Configure;
|
||||||
|
use Cake\Http\Response;
|
||||||
|
use Cake\Http\ServerRequest;
|
||||||
|
use Cake\TestSuite\IntegrationTestCase;
|
||||||
|
use Cake\View\Exception\MissingTemplateException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PagesControllerTest class
|
||||||
|
*/
|
||||||
|
class PagesControllerTest extends IntegrationTestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* testMultipleGet method
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMultipleGet()
|
||||||
|
{
|
||||||
|
$this->get('/');
|
||||||
|
$this->assertResponseOk();
|
||||||
|
$this->get('/');
|
||||||
|
$this->assertResponseOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* testDisplay method
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testDisplay()
|
||||||
|
{
|
||||||
|
$this->get('/pages/home');
|
||||||
|
$this->assertResponseOk();
|
||||||
|
$this->assertResponseContains('CakePHP');
|
||||||
|
$this->assertResponseContains('<html>');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test that missing template renders 404 page in production
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMissingTemplate()
|
||||||
|
{
|
||||||
|
Configure::write('debug', false);
|
||||||
|
$this->get('/pages/not_existing');
|
||||||
|
|
||||||
|
$this->assertResponseError();
|
||||||
|
$this->assertResponseContains('Error');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test that missing template in debug mode renders missing_template error page
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMissingTemplateInDebug()
|
||||||
|
{
|
||||||
|
Configure::write('debug', true);
|
||||||
|
$this->get('/pages/not_existing');
|
||||||
|
|
||||||
|
$this->assertResponseFailure();
|
||||||
|
$this->assertResponseContains('Missing Template');
|
||||||
|
$this->assertResponseContains('Stacktrace');
|
||||||
|
$this->assertResponseContains('not_existing.ctp');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test directory traversal protection
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testDirectoryTraversalProtection()
|
||||||
|
{
|
||||||
|
$this->get('/pages/../Layout/ajax');
|
||||||
|
$this->assertResponseCode(403);
|
||||||
|
$this->assertResponseContains('Forbidden');
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Test runner bootstrap.
|
||||||
|
*
|
||||||
|
* Add additional configuration/setup your application needs when running
|
||||||
|
* unit tests in this file.
|
||||||
|
*/
|
||||||
|
require dirname(__DIR__) . '/vendor/autoload.php';
|
||||||
|
|
||||||
|
require dirname(__DIR__) . '/config/bootstrap.php';
|
||||||
|
|
||||||
|
$_SERVER['PHP_SELF'] = '/';
|
|
@ -0,0 +1,5 @@
|
||||||
|
<IfModule mod_rewrite.c>
|
||||||
|
RewriteEngine On
|
||||||
|
RewriteCond %{REQUEST_FILENAME} !-f
|
||||||
|
RewriteRule ^ index.php [L]
|
||||||
|
</IfModule>
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,240 @@
|
||||||
|
@font-face {
|
||||||
|
font-family: 'cakefont';
|
||||||
|
src: url('../font/cakedingbats-webfont.eot');
|
||||||
|
src: url('../font/cakedingbats-webfont.eot?#iefix') format('embedded-opentype'),
|
||||||
|
url('../font/cakedingbats-webfont.woff2') format('woff2'),
|
||||||
|
url('../font/cakedingbats-webfont.woff') format('woff'),
|
||||||
|
url('../font/cakedingbats-webfont.ttf') format('truetype'),
|
||||||
|
url('../font/cakedingbats-webfont.svg#cake_dingbatsregular') format('svg');
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.home {
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 27px;
|
||||||
|
color: #404041;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #0071BC;
|
||||||
|
-webkit-transition: all 0.2s;
|
||||||
|
-moz-transition: all 0.2s;
|
||||||
|
-ms-transition: all 0.2s;
|
||||||
|
-o-transition: all 0.2s;
|
||||||
|
transition: all 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover, a:active {
|
||||||
|
color: #d33d44;
|
||||||
|
-webkit-transition: all 0.2s;
|
||||||
|
-moz-transition: all 0.2s;
|
||||||
|
-ms-transition: all 0.2s;
|
||||||
|
-o-transition: all 0.2s;
|
||||||
|
transition: all 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul, ol, dl, p {
|
||||||
|
font-size: 0.85rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
line-height: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
height: auto;
|
||||||
|
line-height: 1em;
|
||||||
|
padding: 0;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
header.row {
|
||||||
|
margin-bottom: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
header .header-image {
|
||||||
|
text-align: center;
|
||||||
|
padding: 64px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
header .header-title {
|
||||||
|
padding: 0;
|
||||||
|
display: block;
|
||||||
|
background: #404041;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
header .header-title h1 {
|
||||||
|
font-family: 'Raleway', sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
font-style: italic;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 500;
|
||||||
|
padding: 18px 30px;
|
||||||
|
color: #DEDED5;
|
||||||
|
}
|
||||||
|
|
||||||
|
header h1 {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3, h4 {
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
|
font-size: 27px;
|
||||||
|
line-height: 30px;
|
||||||
|
font-weight: 300;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.more {
|
||||||
|
color: #ffffff;
|
||||||
|
background-color: #d33d44;
|
||||||
|
padding: 15px;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.row {
|
||||||
|
max-width: 1000px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert {
|
||||||
|
background-color: #fff9e1;
|
||||||
|
font-size: 12px;
|
||||||
|
text-align: center;
|
||||||
|
display: block;
|
||||||
|
padding: 12px;
|
||||||
|
border-bottom: 2px solid #ffcf06;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert {
|
||||||
|
background-color: #fff9e1;
|
||||||
|
font-size: 12px;
|
||||||
|
display: block;
|
||||||
|
padding: 12px;
|
||||||
|
border-bottom: 2px solid #ffcf06;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
color: #404041;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert p {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 1.4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert p:before {
|
||||||
|
color: #ffcf06;
|
||||||
|
content: "\0055";
|
||||||
|
font-family: 'cakefont', sans-serif;
|
||||||
|
font-size: 21px;
|
||||||
|
margin-left: -0.8em;
|
||||||
|
width: 2.3em;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
padding: 0 10px 0 15px;
|
||||||
|
vertical-align: -2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert ul {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert.url-rewriting {
|
||||||
|
background-color: #F0F0F0;
|
||||||
|
border-color: #cccccc;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
list-style-type: none;
|
||||||
|
margin: 0 0 30px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
padding-left: 1.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul li ul, ul li ul li {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bullet:before {
|
||||||
|
font-family: 'cakefont', sans-serif;
|
||||||
|
font-size: 18px;
|
||||||
|
display: inline-block;
|
||||||
|
margin-left: -1.3em;
|
||||||
|
width: 1.2em;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
vertical-align: -1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.success:before {
|
||||||
|
color: #88c671;
|
||||||
|
content: "\0056";
|
||||||
|
}
|
||||||
|
|
||||||
|
.problem:before {
|
||||||
|
color: #d33d44;
|
||||||
|
content: "\0057";
|
||||||
|
}
|
||||||
|
|
||||||
|
.cutlery:before {
|
||||||
|
color: #404041;
|
||||||
|
content: "\0059";
|
||||||
|
}
|
||||||
|
|
||||||
|
.book:before {
|
||||||
|
color: #404041;
|
||||||
|
content: "\0042";
|
||||||
|
width: 1.7em;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr {
|
||||||
|
border-bottom: 1px solid #e7e7e7;
|
||||||
|
border-top: 0;
|
||||||
|
margin-bottom: 35px;
|
||||||
|
margin-left: 30px;
|
||||||
|
margin-right: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.icon {
|
||||||
|
color: #404041;
|
||||||
|
font-style: normal;
|
||||||
|
font-family: 'cakefont', sans-serif;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
||||||
|
.icon.support {
|
||||||
|
font-size: 60px;
|
||||||
|
}
|
||||||
|
.icon.docs {
|
||||||
|
font-size: 57px;
|
||||||
|
}
|
||||||
|
.icon.training {
|
||||||
|
font-size: 39px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.columns {
|
||||||
|
padding-left: 30px;
|
||||||
|
padding-right: 30px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 992px) {
|
||||||
|
header.row {
|
||||||
|
max-width: 940px;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
body {
|
||||||
|
color:#666666;
|
||||||
|
background-color:#000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sticky {
|
||||||
|
position:fixed;
|
||||||
|
height: 100%;
|
||||||
|
width:100%;
|
||||||
|
background-color:#111111;
|
||||||
|
z-index:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.centered {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
canvas {
|
||||||
|
bottom:0;
|
||||||
|
width:100%;
|
||||||
|
height:100%;
|
||||||
|
z-index:1;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.content {
|
||||||
|
z-index:2;
|
||||||
|
color:#fff;
|
||||||
|
padding-top:10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
margin-right:10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
button.round {
|
||||||
|
border-radius:5px;
|
||||||
|
}
|
Binary file not shown.
After Width: | Height: | Size: 496 B |
Binary file not shown.
After Width: | Height: | Size: 991 B |
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
Binary file not shown.
After Width: | Height: | Size: 9.4 KiB |
Binary file not shown.
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 106 KiB |
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue