diff --git a/.gitignore b/.gitignore index da248e548..01b701cf8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ # Composer -composer.lock .composer vendor/ diff --git a/.htaccess b/.htaccess index ecf1097c0..203e2dd8d 100644 --- a/.htaccess +++ b/.htaccess @@ -44,7 +44,7 @@ RewriteRule .* index.php [L] ## Begin - Security # Block all direct access for these folders -RewriteRule ^(cache|bin|logs|backup)/(.*) error [L] +RewriteRule ^(.git|cache|bin|logs|backup)/(.*) error [L] # Block access to specific file types for these folders RewriteRule ^(system|user|vendor)/(.*)\.(txt|md|html|yaml|php|twig|sh|bat)$ error [L] ## End - Security diff --git a/CHANGELOG.md b/CHANGELOG.md index e2d2c54ef..5f4e4c03e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ +# v0.9.40 +## 08/31/2015 + +1. [](#new) + * Added some new Twig filers: `defined`, `rtrim`, `ltrim` + * Admin support for customizable page file name + template override +1. [](#improved) + * Better message for incompatible/unsupported Twig template + * Improved User blueprints with better help + * Switched to composer **install** rather than **update** by default + * Admin autofocus on page title + * `.htaccess` hardening (`.htaccess` & `htaccess.txt`) + * Cache safety checks for missing folders +1. [](#bugfix) + * Fixed issue with unescaped `o` character in date formats + # v0.9.39 ## 08/25/2015 diff --git a/composer.lock b/composer.lock new file mode 100644 index 000000000..b45ddfc5e --- /dev/null +++ b/composer.lock @@ -0,0 +1,1012 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "5b11715e8220f84c86c9004fe463c0db", + "packages": [ + { + "name": "doctrine/cache", + "version": "v1.4.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "c9eadeb743ac6199f7eec423cb9426bc518b7b03" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/c9eadeb743ac6199f7eec423cb9426bc518b7b03", + "reference": "c9eadeb743ac6199f7eec423cb9426bc518b7b03", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "phpunit/phpunit": ">=3.7", + "predis/predis": "~1.0", + "satooshi/php-coveralls": "~0.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Cache\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Caching library offering an object-oriented API for many cache backends", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "cache", + "caching" + ], + "time": "2015-04-15 00:11:59" + }, + { + "name": "donatj/phpuseragentparser", + "version": "v0.4.0", + "source": { + "type": "git", + "url": "https://github.com/donatj/PhpUserAgent.git", + "reference": "6392753c32f3d162897c02bd72c41e356b002a57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/donatj/PhpUserAgent/zipball/6392753c32f3d162897c02bd72c41e356b002a57", + "reference": "6392753c32f3d162897c02bd72c41e356b002a57", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "camspiers/json-pretty": "0.1.*", + "donatj/drop": "*", + "phpunit/phpunit": "4.*" + }, + "type": "library", + "autoload": { + "files": [ + "Source/UserAgentParser.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jesse G. Donat", + "email": "donatj@gmail.com", + "homepage": "http://donatstudios.com", + "role": "Developer" + } + ], + "description": "Simple, streamlined PHP user-agent parser", + "homepage": "http://donatstudios.com/PHP-Parser-HTTP_USER_AGENT", + "keywords": [ + "browser", + "browser detection", + "parser", + "user agent", + "useragent" + ], + "time": "2015-08-25 16:30:11" + }, + { + "name": "erusev/parsedown", + "version": "1.5.4", + "source": { + "type": "git", + "url": "https://github.com/erusev/parsedown.git", + "reference": "0e89e3714bda18973184d30646306bb0a482bd96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/erusev/parsedown/zipball/0e89e3714bda18973184d30646306bb0a482bd96", + "reference": "0e89e3714bda18973184d30646306bb0a482bd96", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-0": { + "Parsedown": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Emanuil Rusev", + "email": "hello@erusev.com", + "homepage": "http://erusev.com" + } + ], + "description": "Parser for Markdown.", + "homepage": "http://parsedown.org", + "keywords": [ + "markdown", + "parser" + ], + "time": "2015-08-03 09:24:05" + }, + { + "name": "erusev/parsedown-extra", + "version": "0.7.0", + "source": { + "type": "git", + "url": "https://github.com/erusev/parsedown-extra.git", + "reference": "11a44e076d02ffcc4021713398a60cd73f78b6f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/erusev/parsedown-extra/zipball/11a44e076d02ffcc4021713398a60cd73f78b6f5", + "reference": "11a44e076d02ffcc4021713398a60cd73f78b6f5", + "shasum": "" + }, + "require": { + "erusev/parsedown": "~1.4" + }, + "type": "library", + "autoload": { + "psr-0": { + "ParsedownExtra": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Emanuil Rusev", + "email": "hello@erusev.com", + "homepage": "http://erusev.com" + } + ], + "description": "An extension of Parsedown that adds support for Markdown Extra.", + "homepage": "https://github.com/erusev/parsedown-extra", + "keywords": [ + "markdown", + "markdown extra", + "parsedown", + "parser" + ], + "time": "2015-01-25 14:52:34" + }, + { + "name": "filp/whoops", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "cfe9ce209d2705fece1743f0af45f58fec840458" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/cfe9ce209d2705fece1743f0af45f58fec840458", + "reference": "cfe9ce209d2705fece1743f0af45f58fec840458", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "mockery/mockery": "0.9.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-0": { + "Whoops": "src/" + }, + "classmap": [ + "src/deprecated" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://github.com/filp/whoops", + "keywords": [ + "error", + "exception", + "handling", + "library", + "silex-provider", + "whoops", + "zf2" + ], + "time": "2015-07-23 15:48:15" + }, + { + "name": "gregwar/cache", + "version": "v1.0.10", + "target-dir": "Gregwar/Cache", + "source": { + "type": "git", + "url": "https://github.com/Gregwar/Cache.git", + "reference": "0a1a02e4943e95f491b3d2395609247385975622" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Gregwar/Cache/zipball/0a1a02e4943e95f491b3d2395609247385975622", + "reference": "0a1a02e4943e95f491b3d2395609247385975622", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "type": "library", + "autoload": { + "psr-0": { + "Gregwar\\Cache": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gregwar", + "email": "g.passault@gmail.com" + } + ], + "description": "A lightweight file-system cache system", + "keywords": [ + "cache", + "caching", + "file-system", + "system" + ], + "time": "2014-09-24 11:23:30" + }, + { + "name": "gregwar/image", + "version": "v2.0.20", + "target-dir": "Gregwar/Image", + "source": { + "type": "git", + "url": "https://github.com/Gregwar/Image.git", + "reference": "2c6bf2fb3b0eb844f0568d6ee55eeb86fc799414" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Gregwar/Image/zipball/2c6bf2fb3b0eb844f0568d6ee55eeb86fc799414", + "reference": "2c6bf2fb3b0eb844f0568d6ee55eeb86fc799414", + "shasum": "" + }, + "require": { + "ext-gd": "*", + "gregwar/cache": "1.*", + "php": ">=5.3.0" + }, + "suggest": { + "behat/transliterator": "Transliterator provides ability to set non-latin1 pretty names" + }, + "type": "library", + "autoload": { + "psr-0": { + "Gregwar\\Image": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Passault", + "email": "g.passault@gmail.com", + "homepage": "http://www.gregwar.com/" + } + ], + "description": "Image handling", + "homepage": "https://github.com/Gregwar/Image", + "keywords": [ + "gd", + "image" + ], + "time": "2015-05-30 19:24:37" + }, + { + "name": "ircmaxell/password-compat", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/ircmaxell/password_compat.git", + "reference": "5c5cde8822a69545767f7c7f3058cb15ff84614c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ircmaxell/password_compat/zipball/5c5cde8822a69545767f7c7f3058cb15ff84614c", + "reference": "5c5cde8822a69545767f7c7f3058cb15ff84614c", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": "4.*" + }, + "type": "library", + "autoload": { + "files": [ + "lib/password.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anthony Ferrara", + "email": "ircmaxell@php.net", + "homepage": "http://blog.ircmaxell.com" + } + ], + "description": "A compatibility library for the proposed simplified password hashing algorithm: https://wiki.php.net/rfc/password_hash", + "homepage": "https://github.com/ircmaxell/password_compat", + "keywords": [ + "hashing", + "password" + ], + "time": "2014-11-20 16:49:30" + }, + { + "name": "maximebf/debugbar", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/maximebf/php-debugbar.git", + "reference": "ab12b6f57dd33b1fffa875046fd17c34d88388b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/ab12b6f57dd33b1fffa875046fd17c34d88388b9", + "reference": "ab12b6f57dd33b1fffa875046fd17c34d88388b9", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "~1.0", + "symfony/var-dumper": "~2.6" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "kriswallsmith/assetic": "The best way to manage assets", + "monolog/monolog": "Log using Monolog", + "predis/predis": "Redis storage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-0": { + "DebugBar": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maxime Bouroumeau-Fuseau", + "email": "maxime.bouroumeau@gmail.com", + "homepage": "http://maximebf.com" + } + ], + "description": "Debug bar in the browser for php application", + "homepage": "https://github.com/maximebf/php-debugbar", + "keywords": [ + "debug" + ], + "time": "2015-07-09 18:15:09" + }, + { + "name": "monolog/monolog", + "version": "1.16.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "c0c0b4bee3aabce7182876b0d912ef2595563db7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c0c0b4bee3aabce7182876b0d912ef2595563db7", + "reference": "c0c0b4bee3aabce7182876b0d912ef2595563db7", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "~1.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9", + "doctrine/couchdb": "~1.0@dev", + "graylog2/gelf-php": "~1.0", + "php-console/php-console": "^3.1.3", + "phpunit/phpunit": "~4.5", + "phpunit/phpunit-mock-objects": "2.3.0", + "raven/raven": "~0.8", + "ruflin/elastica": ">=0.90 <3.0", + "swiftmailer/swiftmailer": "~5.3", + "videlalvaro/php-amqplib": "~2.4" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mongo": "Allow sending log messages to a MongoDB server", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "raven/raven": "Allow sending log messages to a Sentry server", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server", + "videlalvaro/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.16.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "time": "2015-08-09 17:44:44" + }, + { + "name": "mrclay/minify", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/mrclay/minify.git", + "reference": "3c11ba8232a2155a1a29552aafc528be5fb0a662" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mrclay/minify/zipball/3c11ba8232a2155a1a29552aafc528be5fb0a662", + "reference": "3c11ba8232a2155a1a29552aafc528be5fb0a662", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "php": ">=5.2.1" + }, + "require-dev": { + "tubalmartin/cssmin": "~2.4.8" + }, + "suggest": { + "tubalmartin/cssmin": "Support minify with CSSMin (YUI PHP port)" + }, + "type": "library", + "autoload": { + "classmap": [ + "min/lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Stephen Clay", + "email": "steve@mrclay.org", + "role": "Developer" + } + ], + "description": "Minify is a PHP5 app that helps you follow several rules for client-side performance. It combines multiple CSS or Javascript files, removes unnecessary whitespace and comments, and serves them with gzip encoding and optimal client-side cache headers", + "homepage": "http://code.google.com/p/minify/", + "time": "2014-10-30 22:58:02" + }, + { + "name": "pimple/pimple", + "version": "v3.0.1", + "source": { + "type": "git", + "url": "https://github.com/silexphp/Pimple.git", + "reference": "3313af5935dbc560fab845b76a1ca351b47855af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/3313af5935dbc560fab845b76a1ca351b47855af", + "reference": "3313af5935dbc560fab845b76a1ca351b47855af", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Pimple": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Pimple is a simple Dependency Injection Container for PHP 5.3", + "homepage": "http://pimple.sensiolabs.org", + "keywords": [ + "container", + "dependency injection" + ], + "time": "2015-07-30 09:57:46" + }, + { + "name": "psr/log", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b", + "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-0": { + "Psr\\Log\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2012-12-21 11:40:51" + }, + { + "name": "rockettheme/toolbox", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/rockettheme/toolbox.git", + "reference": "fed1e4d60c80f2f247d1f9fb9e59cecff914aa61" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rockettheme/toolbox/zipball/fed1e4d60c80f2f247d1f9fb9e59cecff914aa61", + "reference": "fed1e4d60c80f2f247d1f9fb9e59cecff914aa61", + "shasum": "" + }, + "require": { + "ircmaxell/password-compat": "1.0.*", + "php": ">=5.4.0", + "pimple/pimple": "~3.0", + "symfony/event-dispatcher": "~2.5", + "symfony/yaml": "~2.5" + }, + "require-dev": { + "phpunit/phpunit": "4.0.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "RocketTheme\\Toolbox\\ArrayTraits\\": "ArrayTraits/src", + "RocketTheme\\Toolbox\\Blueprints\\": "Blueprints/src", + "RocketTheme\\Toolbox\\DI\\": "DI/src", + "RocketTheme\\Toolbox\\Event\\": "Event/src", + "RocketTheme\\Toolbox\\File\\": "File/src", + "RocketTheme\\Toolbox\\ResourceLocator\\": "ResourceLocator/src", + "RocketTheme\\Toolbox\\Session\\": "Session/src", + "RocketTheme\\Toolbox\\StreamWrapper\\": "StreamWrapper/src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "RocketTheme Toolbox Library", + "homepage": "http://www.rockettheme.com", + "keywords": [ + "php", + "rockettheme" + ], + "time": "2015-08-27 18:36:50" + }, + { + "name": "symfony/console", + "version": "v2.7.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/Console.git", + "reference": "d6cf02fe73634c96677e428f840704bfbcaec29e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Console/zipball/d6cf02fe73634c96677e428f840704bfbcaec29e", + "reference": "d6cf02fe73634c96677e428f840704bfbcaec29e", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/event-dispatcher": "~2.1", + "symfony/phpunit-bridge": "~2.7", + "symfony/process": "~2.1" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2015-07-28 15:18:12" + }, + { + "name": "symfony/event-dispatcher", + "version": "v2.7.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/EventDispatcher.git", + "reference": "9310b5f9a87ec2ea75d20fec0b0017c77c66dac3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/9310b5f9a87ec2ea75d20fec0b0017c77c66dac3", + "reference": "9310b5f9a87ec2ea75d20fec0b0017c77c66dac3", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.0,>=2.0.5", + "symfony/dependency-injection": "~2.6", + "symfony/expression-language": "~2.6", + "symfony/phpunit-bridge": "~2.7", + "symfony/stopwatch": "~2.3" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "time": "2015-06-18 19:21:56" + }, + { + "name": "symfony/var-dumper", + "version": "v2.7.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "e8903ebba5eb019f5886ffce739ea9e3b7519579" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e8903ebba5eb019f5886ffce739ea9e3b7519579", + "reference": "e8903ebba5eb019f5886ffce739ea9e3b7519579", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, + "suggest": { + "ext-symfony_debug": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony mechanism for exploring and dumping PHP variables", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "time": "2015-07-28 15:18:12" + }, + { + "name": "symfony/yaml", + "version": "v2.7.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/Yaml.git", + "reference": "71340e996171474a53f3d29111d046be4ad8a0ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/71340e996171474a53f3d29111d046be4ad8a0ff", + "reference": "71340e996171474a53f3d29111d046be4ad8a0ff", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "time": "2015-07-28 14:07:07" + }, + { + "name": "twig/twig", + "version": "v1.21.1", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "ca8d3aa90b6a01c82e07909fe815d6b443e75a23" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/ca8d3aa90b6a01c82e07909fe815d6b443e75a23", + "reference": "ca8d3aa90b6a01c82e07909fe815d6b443e75a23", + "shasum": "" + }, + "require": { + "php": ">=5.2.7" + }, + "require-dev": { + "symfony/debug": "~2.7", + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.21-dev" + } + }, + "autoload": { + "psr-0": { + "Twig_": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + }, + { + "name": "Twig Team", + "homepage": "http://twig.sensiolabs.org/contributors", + "role": "Contributors" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "http://twig.sensiolabs.org", + "keywords": [ + "templating" + ], + "time": "2015-08-26 08:58:31" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "maximebf/debugbar": 20, + "filp/whoops": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=5.4.0" + }, + "platform-dev": [] +} diff --git a/htaccess.txt b/htaccess.txt index ce48b2674..203e2dd8d 100644 --- a/htaccess.txt +++ b/htaccess.txt @@ -44,7 +44,7 @@ RewriteRule .* index.php [L] ## Begin - Security # Block all direct access for these folders -RewriteRule ^(cache|bin|logs)/(.*) error [L] +RewriteRule ^(.git|cache|bin|logs|backup)/(.*) error [L] # Block access to specific file types for these folders RewriteRule ^(system|user|vendor)/(.*)\.(txt|md|html|yaml|php|twig|sh|bat)$ error [L] ## End - Security diff --git a/system/blueprints/config/site.yaml b/system/blueprints/config/site.yaml index 06967ede6..0586c31a2 100644 --- a/system/blueprints/config/site.yaml +++ b/system/blueprints/config/site.yaml @@ -60,9 +60,9 @@ form: label: PLUGIN_ADMIN.SUMMARY_SIZE help: PLUGIN_ADMIN.SUMMARY_SIZE_HELP validate: - type: int - min: 0 - max: 65536 + type: int + min: 0 + max: 65536 summary.format: type: toggle diff --git a/system/blueprints/config/system.yaml b/system/blueprints/config/system.yaml index cfb8121a1..feb0b039a 100644 --- a/system/blueprints/config/system.yaml +++ b/system/blueprints/config/system.yaml @@ -58,7 +58,7 @@ form: default: "jS M Y" options: "F jS \\a\\t g:ia": Date1 - "l jS of F g:i A": Date2 + "l jS \\of F g:i A": Date2 "D, m M Y G:i:s": Date3 "d-m-y G:i": Date4 "jS M Y": Date5 @@ -71,14 +71,14 @@ form: help: PLUGIN_ADMIN.LONG_DATE_FORMAT_HELP options: "F jS \\a\\t g:ia": Date1 - "l jS of F g:i A": Date2 + "l jS \\of F g:i A": Date2 "D, m M Y G:i:s": Date3 "d-m-y G:i": Date4 "jS M Y": Date5 pages.order.by: type: select - size: medium + size: long classes: fancy label: PLUGIN_ADMIN.DEFAULT_ORDERING help: PLUGIN_ADMIN.DEFAULT_ORDERING_HELP @@ -324,7 +324,7 @@ form: size: small classes: fancy label: PLUGIN_ADMIN.CACHE_CHECK_METHOD - help: PLUGIN_ADMIN.CACHE_CHECK_METHOD + help: PLUGIN_ADMIN.CACHE_CHECK_METHOD_HELP options: file: File folder: Folder diff --git a/system/blueprints/pages/default.yaml b/system/blueprints/pages/default.yaml index 061ddd7b1..04ee6e753 100644 --- a/system/blueprints/pages/default.yaml +++ b/system/blueprints/pages/default.yaml @@ -23,6 +23,7 @@ form: fields: header.title: type: text + autofocus: true style: vertical label: PLUGIN_ADMIN.TITLE @@ -144,10 +145,11 @@ form: options: '/': PLUGIN_ADMIN.DEFAULT_OPTION_ROOT - type: - type: templates + name: + type: select classes: fancy - label: PLUGIN_ADMIN.DISPLAY_TEMPLATE + label: PLUGIN_ADMIN.PAGE_FILE + help: PLUGIN_ADMIN.PAGE_FILE_HELP default: default @data-options: '\Grav\Common\Page\Pages::types' @@ -248,6 +250,14 @@ form: validate: type: bool + header.template: + type: select + toggleable: true + classes: fancy + label: PLUGIN_ADMIN.DISPLAY_TEMPLATE + default: default + @data-options: '\Grav\Common\Page\Pages::types' + header.order_by: type: hidden diff --git a/system/blueprints/pages/modular_new.yaml b/system/blueprints/pages/modular_new.yaml index e3772d366..11fc4bf5c 100644 --- a/system/blueprints/pages/modular_new.yaml +++ b/system/blueprints/pages/modular_new.yaml @@ -36,10 +36,11 @@ form: validate: required: true - type: + name: type: select classes: fancy label: PLUGIN_ADMIN.MODULAR_TEMPLATE + help: PLUGIN_ADMIN.PAGE_FILE_HELP default: default @data-options: '\Grav\Common\Page\Pages::modularTypes' validate: diff --git a/system/blueprints/pages/modular_raw.yaml b/system/blueprints/pages/modular_raw.yaml index 5bace3077..f3c308bea 100644 --- a/system/blueprints/pages/modular_raw.yaml +++ b/system/blueprints/pages/modular_raw.yaml @@ -76,7 +76,7 @@ form: validate: required: true - type: + name: type: select classes: fancy label: PLUGIN_ADMIN.MODULAR_TEMPLATE diff --git a/system/blueprints/pages/new.yaml b/system/blueprints/pages/new.yaml index bdfa340fb..255a2ea98 100644 --- a/system/blueprints/pages/new.yaml +++ b/system/blueprints/pages/new.yaml @@ -38,11 +38,11 @@ form: validate: required: true - type: + name: type: select - label: PLUGIN_ADMIN.DISPLAY_TEMPLATE - help: PLUGIN_ADMIN.DISPLAY_TEMPLATE_HELP classes: fancy + label: PLUGIN_ADMIN.PAGE_FILE + help: PLUGIN_ADMIN.PAGE_FILE_HELP default: default @data-options: '\Grav\Common\Page\Pages::types' validate: diff --git a/system/blueprints/pages/raw.yaml b/system/blueprints/pages/raw.yaml index 00f69bdeb..55d06e72d 100644 --- a/system/blueprints/pages/raw.yaml +++ b/system/blueprints/pages/raw.yaml @@ -73,7 +73,7 @@ form: options: '/': PLUGIN_ADMIN.DEFAULT_OPTION_ROOT - type: + name: type: select classes: fancy label: PLUGIN_ADMIN.DISPLAY_TEMPLATE diff --git a/system/blueprints/user/account_new.yaml b/system/blueprints/user/account_new.yaml index 202f68814..6c6505bdb 100644 --- a/system/blueprints/user/account_new.yaml +++ b/system/blueprints/user/account_new.yaml @@ -11,5 +11,6 @@ form: username: type: text label: PLUGIN_ADMIN.USERNAME + help: PLUGIN_ADMIN.USERNAME_HELP validate: required: true diff --git a/system/defines.php b/system/defines.php index f628f0737..8773bbed3 100644 --- a/system/defines.php +++ b/system/defines.php @@ -2,7 +2,7 @@ // Some standard defines define('GRAV', true); -define('GRAV_VERSION', '0.9.39'); +define('GRAV_VERSION', '0.9.40'); define('DS', '/'); // Directories and Paths diff --git a/system/src/Grav/Common/Cache.php b/system/src/Grav/Common/Cache.php index 0aefc0727..2511de461 100644 --- a/system/src/Grav/Common/Cache.php +++ b/system/src/Grav/Common/Cache.php @@ -239,19 +239,20 @@ class Cache extends Getters $anything = false; $files = glob(ROOT_DIR . $path . '*'); - foreach ($files as $file) { - if (is_file($file)) { - if (@unlink($file)) { - $anything = true; - } - } elseif (is_dir($file)) { - if (@Folder::delete($file)) { - $anything = true; + if (is_array($files)) { + foreach ($files as $file) { + if (is_file($file)) { + if (@unlink($file)) { + $anything = true; + } + } elseif (is_dir($file)) { + if (@Folder::delete($file)) { + $anything = true; + } } } } - if ($anything) { $output[] = 'Cleared: ' . $path . '*'; } diff --git a/system/src/Grav/Common/Errors/Resources/error.css b/system/src/Grav/Common/Errors/Resources/error.css index 065f7b624..11ce3fd97 100644 --- a/system/src/Grav/Common/Errors/Resources/error.css +++ b/system/src/Grav/Common/Errors/Resources/error.css @@ -48,4 +48,5 @@ h6 { code { font-weight: bold; + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; } diff --git a/system/src/Grav/Common/Errors/Resources/layout.html.php b/system/src/Grav/Common/Errors/Resources/layout.html.php index 598332eea..66999592a 100644 --- a/system/src/Grav/Common/Errors/Resources/layout.html.php +++ b/system/src/Grav/Common/Errors/Resources/layout.html.php @@ -16,10 +16,14 @@
Server Error
-

We're sorry! The server has encountered an internal error and was unable to complete your request. - Please contact the system administrator for more information.

-
For further details please review your logs/ folder, or enable displaying of errors in your system configuration.
-
Error Code:
+ + + +

Sorry, something went terribly wrong!

+ +

-

+ +
For further details please review your logs/ folder, or enable displaying of errors in your system configuration.
diff --git a/system/src/Grav/Common/Errors/SimplePageHandler.php b/system/src/Grav/Common/Errors/SimplePageHandler.php index d03222df3..16d0a8829 100644 --- a/system/src/Grav/Common/Errors/SimplePageHandler.php +++ b/system/src/Grav/Common/Errors/SimplePageHandler.php @@ -28,6 +28,7 @@ class SimplePageHandler extends Handler $cssFile = $this->getResource("error.css"); $code = $inspector->getException()->getCode(); + $message = $inspector->getException()->getMessage(); if ($inspector->getException() instanceof \ErrorException) { $code = Misc::translateErrorCode($code); @@ -36,6 +37,7 @@ class SimplePageHandler extends Handler $vars = array( "stylesheet" => file_get_contents($cssFile), "code" => $code, + "message" => $message, ); $helper->setVariables($vars); diff --git a/system/src/Grav/Common/Page/Page.php b/system/src/Grav/Common/Page/Page.php index 4e88ce5a0..5f88af978 100644 --- a/system/src/Grav/Common/Page/Page.php +++ b/system/src/Grav/Common/Page/Page.php @@ -623,8 +623,12 @@ class Page $regex = '/^[0-9]+\./u'; return preg_replace($regex, '', $this->folder); } - if ($name == 'type') { - return $this->template(); + if ($name == 'name') { + $name_val = str_replace('.md', '', $this->name()); + if ($this->modular()) { + return 'modular/' . $name_val; + } + return $name_val; } if ($name == 'media') { return $this->media()->all(); @@ -1657,7 +1661,10 @@ class Page public function isFirst() { $collection = $this->parent()->collection('content', false); - return $collection->isFirst($this->path()); + if ($collection instanceof Collection) { + return $collection->isFirst($this->path()); + } + return true; } /** @@ -1668,7 +1675,10 @@ class Page public function isLast() { $collection = $this->parent()->collection('content', false); - return $collection->isLast($this->path()); + if ($collection instanceof Collection) { + return $collection->isLast($this->path()); + } + return true; } /** @@ -1700,7 +1710,10 @@ class Page public function adjacentSibling($direction = 1) { $collection = $this->parent()->collection('content', false); - return $collection->adjacentSibling($this->path(), $direction); + if ($collection instanceof Collection) { + return $collection->adjacentSibling($this->path(), $direction); + } + return false; } /** @@ -1737,7 +1750,7 @@ class Page if (isset($routes[$uri_path])) { $child_page = $pages->dispatch($uri->route())->parent(); - while (!$child_page->root()) { + if ($child_page) while (!$child_page->root()) { if ($this->path() == $child_page->path()) { return true; } @@ -1830,7 +1843,7 @@ class Page } foreach ($items as $item) { if (empty($page->taxonomy[$taxonomy]) - || !in_array($item, $page->taxonomy[$taxonomy])) { + || !in_array(htmlspecialchars_decode($item, ENT_QUOTES), $page->taxonomy[$taxonomy])) { $collection->remove(); } } diff --git a/system/src/Grav/Common/Twig/Twig.php b/system/src/Grav/Common/Twig/Twig.php index 8b54ab2aa..b2615ffc9 100644 --- a/system/src/Grav/Common/Twig/Twig.php +++ b/system/src/Grav/Common/Twig/Twig.php @@ -4,6 +4,7 @@ namespace Grav\Common\Twig; use Grav\Common\Grav; use Grav\Common\Config\Config; use Grav\Common\Page\Page; +use Grav\Common\Inflector; use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator; /** @@ -303,6 +304,7 @@ class Twig $pages = $this->grav['pages']; $page = $this->grav['page']; $content = $page->content(); + $config = $this->grav['config']; $twig_vars = $this->twig_vars; @@ -325,14 +327,16 @@ class Twig $output = $this->twig->render($template, $twig_vars); } catch (\Twig_Error_Loader $e) { // If loader error, and not .html.twig, try it as fallback + $inflector = new Inflector(); + $error_msg = 'The template file for this page: "' . $page->template().'.html'.TWIG_EXT.'" is not provided by the theme: "'. $inflector->titleize($config->get('system.pages.theme')) .'"'; if ($ext != '.html'.TWIG_EXT) { try { $output = $this->twig->render($page->template().'.html'.TWIG_EXT, $twig_vars); } catch (\Twig_Error_Loader $e) { - throw new \RuntimeException($e->getRawMessage(), 404, $e); + throw new \RuntimeException($error_msg, 400, $e); } } else { - throw new \RuntimeException($e->getRawMessage(), 404, $e); + throw new \RuntimeException($error_msg, 400, $e); } } diff --git a/system/src/Grav/Common/Twig/TwigExtension.php b/system/src/Grav/Common/Twig/TwigExtension.php index 7addcc223..c003c5c30 100644 --- a/system/src/Grav/Common/Twig/TwigExtension.php +++ b/system/src/Grav/Common/Twig/TwigExtension.php @@ -55,9 +55,12 @@ class TwigExtension extends \Twig_Extension new \Twig_SimpleFilter('ksort', [$this,'ksortFilter']), new \Twig_SimpleFilter('contains', [$this, 'containsFilter']), new \Twig_SimpleFilter('nicetime', [$this, 'nicetimeFilter']), + new \Twig_SimpleFilter('defined', [$this, 'definedDefaultFilter']), new \Twig_SimpleFilter('absolute_url', [$this, 'absoluteUrlFilter']), new \Twig_SimpleFilter('markdown', [$this, 'markdownFilter']), new \Twig_SimpleFilter('starts_with', [$this, 'startsWithFilter']), + new \Twig_SimpleFilter('rtrim', [$this, 'rtrimFilter']), + new \Twig_SimpleFilter('ltrim', [$this, 'ltrimFilter']), new \Twig_SimpleFilter('ends_with', [$this, 'endsWithFilter']), new \Twig_SimpleFilter('t', [$this, 'translate']), new \Twig_SimpleFilter('ta', [$this, 'translateArray']) @@ -370,6 +373,25 @@ class TwigExtension extends \Twig_Extension return Utils::endsWith($haystack, $needle); } + public function definedDefaultFilter($value, $default = null) + { + if (isset($value)) { + return $value; + } else { + return $default; + } + } + + public function rtrimFilter($value, $chars = null) + { + return rtrim($value, $chars); + } + + public function ltrimFilter($value, $chars = null) + { + return ltrim($value, $chars); + } + public function translate() { return $this->grav['language']->translate(func_get_args()); @@ -381,6 +403,8 @@ class TwigExtension extends \Twig_Extension } + + /** * Repeat given string x times. * diff --git a/system/src/Grav/Console/Cli/ComposerCommand.php b/system/src/Grav/Console/Cli/ComposerCommand.php index 2688b78c1..843df5c76 100644 --- a/system/src/Grav/Console/Cli/ComposerCommand.php +++ b/system/src/Grav/Console/Cli/ComposerCommand.php @@ -54,8 +54,8 @@ class ComposerCommand extends Command InputOption::VALUE_NONE, 'update the dependencies' ) - ->setDescription("Updates the composer vendordependencies needed by Grav.") - ->setHelp('The composer command updates the composer vendordependencies needed by Grav'); + ->setDescription("Updates the composer vendor dependencies needed by Grav.") + ->setHelp('The composer command updates the composer vendor dependencies needed by Grav'); } /** @@ -68,7 +68,7 @@ class ComposerCommand extends Command { $this->setupConsole($input, $output); - $action = 'update'; + $action = $input->getOption('install') ? 'install' : ($input->getOption('update') ? 'update' : 'install'); if ($input->getOption('install')) { $action = 'install'; diff --git a/system/src/Grav/Console/Cli/NewUserCommand.php b/system/src/Grav/Console/Cli/NewUserCommand.php index cbab7804d..2e3da7db8 100644 --- a/system/src/Grav/Console/Cli/NewUserCommand.php +++ b/system/src/Grav/Console/Cli/NewUserCommand.php @@ -53,7 +53,7 @@ class NewUserCommand extends Command $question->setValidator(function ($value) { if (!preg_match('/^[a-z0-9_-]{3,16}$/', $value)) { throw new RuntimeException( - 'Username should be between 3 and 16 comprised of lowercase letters, numbers, underscores and hyphens' + 'Username should be between 3 and 16 characters, including lowercase letters, numbers, underscores, and hyphens. Uppercase letters, spaces, and special characters are not allowed' ); } if (file_exists(self::getGrav()['locator']->findResource('user://accounts/' . $value . YAML_EXT))) {