diff --git a/app/SymfonyRequirements.php b/app/SymfonyRequirements.php
index a630af0..cfd55a7 100644
--- a/app/SymfonyRequirements.php
+++ b/app/SymfonyRequirements.php
@@ -429,11 +429,11 @@ class SymfonyRequirements extends RequirementCollection
);
if (version_compare($installedPhpVersion, self::REQUIRED_PHP_VERSION, '>=')) {
- $this->addRequirement(
- (in_array(date_default_timezone_get(), DateTimeZone::listIdentifiers())),
- sprintf('Default timezone is deprecated (%s)', date_default_timezone_get()),
- 'Fix your php.ini file (list of deprecated timezones http://us.php.net/manual/en/timezones.others.php).'
- );
+ $this->addRequirement(
+ (in_array(date_default_timezone_get(), DateTimeZone::listIdentifiers())),
+ sprintf('Default timezone "%s" is not supported by your installation of PHP', date_default_timezone_get()),
+ 'Fix your php.ini file (check for typos and have a look at the list of deprecated timezones http://php.net/manual/en/timezones.others.php).'
+ );
}
$this->addRequirement(
@@ -492,6 +492,12 @@ class SymfonyRequirements extends RequirementCollection
/* optional recommendations follow */
+ $this->addRecommendation(
+ version_compare($installedPhpVersion, '5.3.4', '>='),
+ sprintf('Your project might not work properly ("Notice: Trying to get property of non-object") due to the PHP bug #52083 before PHP 5.3.4 (%s installed)', $installedPhpVersion),
+ 'Install PHP 5.3.4 or newer'
+ );
+
$this->addRecommendation(
version_compare($installedPhpVersion, '5.3.8', '>='),
sprintf('Annotations might not work properly due to the PHP bug #55156 before PHP 5.3.8 (%s installed)', $installedPhpVersion),
diff --git a/app/bootstrap.php.cache b/app/bootstrap.php.cache
index 5be374c..cea92ba 100644
--- a/app/bootstrap.php.cache
+++ b/app/bootstrap.php.cache
@@ -13,7 +13,7 @@ namespace Symfony\Component\DependencyInjection
interface ContainerAwareInterface
{
- function setContainer(ContainerInterface $container = null);
+ public function setContainer(ContainerInterface $container = null);
}
}
@@ -35,37 +35,37 @@ interface ContainerInterface
const SCOPE_PROTOTYPE = 'prototype';
- function set($id, $service, $scope = self::SCOPE_CONTAINER);
+ public function set($id, $service, $scope = self::SCOPE_CONTAINER);
- function get($id, $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE);
+ public function get($id, $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE);
- function has($id);
+ public function has($id);
- function getParameter($name);
+ public function getParameter($name);
- function hasParameter($name);
+ public function hasParameter($name);
- function setParameter($name, $value);
+ public function setParameter($name, $value);
- function enterScope($name);
+ public function enterScope($name);
- function leaveScope($name);
+ public function leaveScope($name);
- function addScope(ScopeInterface $scope);
+ public function addScope(ScopeInterface $scope);
- function hasScope($name);
+ public function hasScope($name);
- function isScopeActive($name);
+ public function isScopeActive($name);
}
}
@@ -79,7 +79,7 @@ namespace Symfony\Component\DependencyInjection
interface IntrospectableContainerInterface extends ContainerInterface
{
- function initialized($id);
+ public function initialized($id);
}
}
@@ -340,13 +340,13 @@ class Container implements IntrospectableContainerInterface
}
- static public function camelize($id)
+ public static function camelize($id)
{
return preg_replace_callback('/(^|_|\.)+(.)/', function ($match) { return ('.' === $match[1] ? '_' : '').strtoupper($match[2]); }, $id);
}
- static public function underscore($id)
+ public static function underscore($id)
{
return strtolower(preg_replace(array('/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'), array('\\1_\\2', '\\1_\\2'), strtr($id, '_', '.')));
}
@@ -356,23 +356,6 @@ class Container implements IntrospectableContainerInterface
-namespace Symfony\Component\HttpKernel
-{
-
-use Symfony\Component\HttpFoundation\Request;
-use Symfony\Component\HttpFoundation\Response;
-
-
-interface TerminableInterface
-{
-
- function terminate(Request $request, Response $response);
-}
-}
-
-
-
-
namespace Symfony\Component\HttpKernel
{
@@ -386,7 +369,7 @@ interface HttpKernelInterface
const SUB_REQUEST = 2;
- function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true);
+ public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true);
}
}
@@ -405,55 +388,72 @@ use Symfony\Component\Config\Loader\LoaderInterface;
interface KernelInterface extends HttpKernelInterface, \Serializable
{
- function registerBundles();
+ public function registerBundles();
- function registerContainerConfiguration(LoaderInterface $loader);
+ public function registerContainerConfiguration(LoaderInterface $loader);
- function boot();
+ public function boot();
- function shutdown();
+ public function shutdown();
- function getBundles();
+ public function getBundles();
- function isClassInActiveBundle($class);
+ public function isClassInActiveBundle($class);
- function getBundle($name, $first = true);
+ public function getBundle($name, $first = true);
- function locateResource($name, $dir = null, $first = true);
+ public function locateResource($name, $dir = null, $first = true);
- function getName();
+ public function getName();
- function getEnvironment();
+ public function getEnvironment();
- function isDebug();
+ public function isDebug();
- function getRootDir();
+ public function getRootDir();
- function getContainer();
+ public function getContainer();
- function getStartTime();
+ public function getStartTime();
- function getCacheDir();
+ public function getCacheDir();
- function getLogDir();
+ public function getLogDir();
- function getCharset();
+ public function getCharset();
+}
+}
+
+
+
+
+namespace Symfony\Component\HttpKernel
+{
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+
+interface TerminableInterface
+{
+
+ public function terminate(Request $request, Response $response);
}
}
@@ -502,12 +502,12 @@ abstract class Kernel implements KernelInterface, TerminableInterface
protected $classes;
protected $errorReportingLevel;
- const VERSION = '2.1.0-BETA2';
+ const VERSION = '2.1.0-DEV';
const VERSION_ID = '20100';
const MAJOR_VERSION = '2';
const MINOR_VERSION = '1';
const RELEASE_VERSION = '0';
- const EXTRA_VERSION = 'BETA';
+ const EXTRA_VERSION = 'DEV';
public function __construct($environment, $debug)
@@ -516,7 +516,7 @@ abstract class Kernel implements KernelInterface, TerminableInterface
$this->debug = (Boolean) $debug;
$this->booted = false;
$this->rootDir = $this->getRootDir();
- $this->name = preg_replace('/[^a-zA-Z0-9_]+/', '', basename($this->rootDir));
+ $this->name = $this->getName();
$this->classes = array();
if ($this->debug) {
@@ -706,6 +706,10 @@ abstract class Kernel implements KernelInterface, TerminableInterface
public function getName()
{
+ if (null === $this->name) {
+ $this->name = preg_replace('/[^a-zA-Z0-9_]+/', '', basename($this->rootDir));
+ }
+
return $this->name;
}
@@ -975,7 +979,7 @@ abstract class Kernel implements KernelInterface, TerminableInterface
}
- static public function stripComments($source)
+ public static function stripComments($source)
{
if (!function_exists('token_get_all')) {
return $source;
@@ -1084,28 +1088,28 @@ use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
interface BundleInterface extends ContainerAwareInterface
{
- function boot();
+ public function boot();
- function shutdown();
+ public function shutdown();
- function build(ContainerBuilder $container);
+ public function build(ContainerBuilder $container);
- function getContainerExtension();
+ public function getContainerExtension();
- function getParent();
+ public function getParent();
- function getName();
+ public function getName();
- function getNamespace();
+ public function getNamespace();
- function getPath();
+ public function getPath();
}
}
@@ -1348,6 +1352,7 @@ namespace Symfony\Component\HttpKernel
use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
@@ -1450,14 +1455,27 @@ class HttpKernel implements HttpKernelInterface, TerminableInterface
$event = new GetResponseForExceptionEvent($this, $request, $type, $e);
$this->dispatcher->dispatch(KernelEvents::EXCEPTION, $event);
+ $e = $event->getException();
+
if (!$event->hasResponse()) {
throw $e;
}
+ $response = $event->getResponse();
+
+ if (!$response->isClientError() && !$response->isServerError() && !$response->isRedirect()) {
+ if ($e instanceof HttpExceptionInterface) {
+ $response->setStatusCode($e->getStatusCode());
+ $response->headers->add($e->getHeaders());
+ } else {
+ $response->setStatusCode(500);
+ }
+ }
+
try {
- return $this->filterResponse($event->getResponse(), $request, $type);
+ return $this->filterResponse($response, $request, $type);
} catch (\Exception $e) {
- return $event->getResponse();
+ return $response;
}
}
diff --git a/composer.json b/composer.json
index b6aa797..cde69ec 100644
--- a/composer.json
+++ b/composer.json
@@ -17,7 +17,8 @@
"sensio/framework-extra-bundle": "dev-master",
"sensio/generator-bundle": "dev-master",
"jms/security-extra-bundle": "1.1.*",
- "jms/di-extra-bundle": "1.0.*"
+ "jms/di-extra-bundle": "1.0.*",
+ "egeloen/ckeditor-bundle": "2.0.*"
},
"scripts": {
"post-install-cmd": [
diff --git a/composer.lock b/composer.lock
index e374eb9..3938730 100644
--- a/composer.lock
+++ b/composer.lock
@@ -1,5 +1,5 @@
{
- "hash": "ab7ccf177098603cace942212179431f",
+ "hash": "0890891a613a13d9980307e458190353",
"packages": [
{
"package": "doctrine/common",
@@ -8,20 +8,23 @@
{
"package": "doctrine/dbal",
"version": "2.2.x-dev",
- "source-reference": "b961a3fce6bf220f1dca47d7d747b9074bea4730",
- "commit-date": "1341779435"
+ "source-reference": "b961a3fce6bf220f1dca47d7d747b9074bea4730"
},
{
"package": "doctrine/doctrine-bundle",
"version": "dev-master",
- "source-reference": "c9ea46d1f0c48bb88bb87b44214fe44e03c0c692",
- "commit-date": "1341405737"
+ "source-reference": "c9ea46d1f0c48bb88bb87b44214fe44e03c0c692"
},
{
"package": "doctrine/orm",
"version": "2.2.x-dev",
- "source-reference": "5d2a3bcb3b467f41ee58575764f3ba84937f76e4",
- "commit-date": "1341676080"
+ "source-reference": "5d2a3bcb3b467f41ee58575764f3ba84937f76e4"
+ },
+ {
+ "package": "egeloen/ckeditor-bundle",
+ "version": "2.0.x-dev",
+ "source-reference": "ca9d4a631577d7195c6517dd89ae8a3cc02b85ba",
+ "commit-date": "1337272707"
},
{
"package": "jms/aop-bundle",
@@ -52,8 +55,7 @@
{
"package": "kriswallsmith/assetic",
"version": "dev-master",
- "source-reference": "d6f89a3170c5280ad554347dc113eb25fdf00ad7",
- "commit-date": "1339515714"
+ "source-reference": "d6f89a3170c5280ad554347dc113eb25fdf00ad7"
},
{
"package": "monolog/monolog",
@@ -62,20 +64,20 @@
{
"package": "sensio/distribution-bundle",
"version": "dev-master",
- "source-reference": "9a7dbd867fd5061e4bfd660a175aa66122f53d25",
- "commit-date": "1341741741"
+ "source-reference": "5886adae1613c0a72fbb95259a83ae798e86c0d3",
+ "commit-date": "1342347850"
},
{
"package": "sensio/framework-extra-bundle",
"version": "dev-master",
- "source-reference": "4f54e5d5fb3b54fb107892684018f3704934c48d",
- "commit-date": "1341126219"
+ "source-reference": "e9ac8f1a911ed29e30296c7f1549f53d4c94eddf",
+ "commit-date": "1342084432"
},
{
"package": "sensio/generator-bundle",
"version": "dev-master",
- "source-reference": "43ed45c48db18e4a0e48aec0c098f42e56e22d36",
- "commit-date": "1340138445"
+ "source-reference": "c17dbddefe517e3adfcbeaa1ab7cef3e572d29c6",
+ "commit-date": "1342195488"
},
{
"package": "swiftmailer/swiftmailer",
@@ -86,25 +88,25 @@
{
"package": "swiftmailer/swiftmailer",
"version": "dev-master",
- "source-reference": "f51b5f33c83b48faea75f1285f99a2e8f1c66f75",
- "commit-date": "1341746460"
+ "source-reference": "8b2aa953f87da228ba413e8fb1372e49c1374050",
+ "commit-date": "1342198037"
},
{
"package": "symfony/assetic-bundle",
"version": "dev-master",
- "source-reference": "8fe7b898b08103c1d6fce64c3e279a7afd61adfc",
- "commit-date": "1340234971"
+ "source-reference": "ed933dcfa45f00b6bc6d7727007403f3ff429e5a",
+ "commit-date": "1342126277"
},
{
"package": "symfony/monolog-bundle",
"version": "dev-master",
- "source-reference": "7fe7f711bb04b86ad7f45a9e11a7f8cbaf9bc1a5",
+ "source-reference": "v2.1.0-BETA3",
"commit-date": "1341078487"
},
{
"package": "symfony/swiftmailer-bundle",
"version": "dev-master",
- "source-reference": "e1d413ce27fd1696bdc82ad9525f1b874664530e",
+ "source-reference": "v2.1.0-BETA3",
"commit-date": "1341509614"
},
{
@@ -116,14 +118,13 @@
{
"package": "symfony/symfony",
"version": "dev-master",
- "source-reference": "v2.1.0-BETA2",
- "commit-date": "1341820358"
+ "source-reference": "151b79a6ce3f459e2fa8815cd9f2786eef750993",
+ "commit-date": "1342376835"
},
{
"package": "twig/extensions",
"version": "dev-master",
- "source-reference": "feb6d3f10c411e2631997c0a905aa581c80305c1",
- "commit-date": "1337599699"
+ "source-reference": "feb6d3f10c411e2631997c0a905aa581c80305c1"
},
{
"package": "twig/twig",
@@ -134,13 +135,11 @@
{
"package": "twig/twig",
"version": "dev-master",
- "source-reference": "26eb0a2653eade50dffdd31b11ca454232dea8cf",
- "commit-date": "1341423205"
+ "source-reference": "d45664045194ef62573c153c424508527105041e",
+ "commit-date": "1342424564"
}
],
- "packages-dev": [
-
- ],
+ "packages-dev": null,
"aliases": [
],
diff --git a/composer.phar b/composer.phar
new file mode 100755
index 0000000..6a0974f
Binary files /dev/null and b/composer.phar differ
diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php
index 4c57928..82172a6 100644
--- a/vendor/composer/autoload_namespaces.php
+++ b/vendor/composer/autoload_namespaces.php
@@ -21,6 +21,7 @@ return array(
'JMS\\SecurityExtraBundle' => $vendorDir . '/jms/security-extra-bundle/',
'JMS\\DiExtraBundle' => $vendorDir . '/jms/di-extra-bundle/',
'JMS\\AopBundle' => $vendorDir . '/jms/aop-bundle/',
+ 'Ivory\\CKEditorBundle' => $vendorDir . '/egeloen/ckeditor-bundle/',
'Doctrine\\ORM' => $vendorDir . '/doctrine/orm/lib/',
'Doctrine\\DBAL' => $vendorDir . '/doctrine/dbal/lib/',
'Doctrine\\Common' => $vendorDir . '/doctrine/common/lib/',
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 007338d..be67e88 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -3,7 +3,7 @@
"name": "jms/metadata",
"version": "1.1.1",
"version_normalized": "1.1.1.0",
- "time": "2011-12-30 10:32:49",
+ "time": "2011-12-29 22:32:49",
"source": {
"type": "git",
"url": "https://github.com/schmittjoh/metadata",
@@ -47,7 +47,7 @@
"name": "jms/cg",
"version": "1.0.0",
"version_normalized": "1.0.0.0",
- "time": "2011-12-30 09:40:52",
+ "time": "2011-12-29 21:40:52",
"source": {
"type": "git",
"url": "git://github.com/schmittjoh/cg-library.git",
@@ -89,7 +89,7 @@
"version": "1.0.0",
"version_normalized": "1.0.0.0",
"target-dir": "JMS/AopBundle",
- "time": "2011-12-30 09:50:26",
+ "time": "2011-12-29 21:50:26",
"source": {
"type": "git",
"url": "https://github.com/schmittjoh/JMSAopBundle",
@@ -133,7 +133,7 @@
"version": "1.1.0",
"version_normalized": "1.1.0.0",
"target-dir": "JMS/SecurityExtraBundle",
- "time": "2011-12-30 13:38:12",
+ "time": "2011-12-30 01:38:12",
"source": {
"type": "git",
"url": "https://github.com/schmittjoh/JMSSecurityExtraBundle",
@@ -178,7 +178,7 @@
"version": "1.0.1",
"version_normalized": "1.0.1.0",
"target-dir": "JMS/DiExtraBundle",
- "time": "2012-02-25 05:01:54",
+ "time": "2012-02-24 17:01:54",
"source": {
"type": "git",
"url": "https://github.com/schmittjoh/JMSDiExtraBundle",
@@ -221,7 +221,7 @@
"name": "doctrine/common",
"version": "2.2.2",
"version_normalized": "2.2.2.0",
- "time": "2012-04-08 03:46:44",
+ "time": "2012-04-07 03:46:44",
"source": {
"type": "git",
"url": "https://github.com/doctrine/common",
@@ -287,7 +287,7 @@
"name": "monolog/monolog",
"version": "1.1.0",
"version_normalized": "1.1.0.0",
- "time": "2012-04-18 14:27:40",
+ "time": "2012-04-17 14:27:40",
"source": {
"type": "git",
"url": "https://github.com/Seldaek/monolog.git",
@@ -337,7 +337,7 @@
"name": "twig/extensions",
"version": "dev-master",
"version_normalized": "9999999-dev",
- "time": "2012-05-16 21:28:19",
+ "time": "2012-05-15 21:28:19",
"source": {
"type": "git",
"url": "https://github.com/fabpot/Twig-extensions",
@@ -382,7 +382,7 @@
"name": "kriswallsmith/assetic",
"version": "dev-master",
"version_normalized": "9999999-dev",
- "time": "2012-06-08 01:41:54",
+ "time": "2012-06-07 01:41:54",
"source": {
"type": "git",
"url": "http://github.com/kriswallsmith/assetic.git",
@@ -437,285 +437,12 @@
}
}
},
- {
- "name": "sensio/generator-bundle",
- "version": "dev-master",
- "version_normalized": "9999999-dev",
- "target-dir": "Sensio/Bundle/GeneratorBundle",
- "time": "2012-06-15 18:40:45",
- "source": {
- "type": "git",
- "url": "https://github.com/sensio/SensioGeneratorBundle",
- "reference": "43ed45c48db18e4a0e48aec0c098f42e56e22d36"
- },
- "dist": {
- "type": "zip",
- "url": "https://github.com/sensio/SensioGeneratorBundle/zipball/43ed45c48db18e4a0e48aec0c098f42e56e22d36",
- "reference": "43ed45c48db18e4a0e48aec0c098f42e56e22d36",
- "shasum": ""
- },
- "require": {
- "symfony/framework-bundle": "2.1.*"
- },
- "require-dev": {
- "symfony/doctrine-bridge": "2.1.*",
- "doctrine/orm": ">=2.1,<2.4-dev",
- "twig/twig": ">=1.8,<2.0-dev"
- },
- "suggest": {
- "doctrine/doctrine-bundle": "to generate entities and their crud controller"
- },
- "type": "symfony-bundle",
- "extra": {
- "branch-alias": {
- "dev-master": "2.1.x-dev"
- }
- },
- "installation-source": "source",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com",
- "homepage": null,
- "role": null
- }
- ],
- "description": "This bundle generates code for you",
- "autoload": {
- "psr-0": {
- "Sensio\\Bundle\\GeneratorBundle": ""
- }
- }
- },
- {
- "name": "symfony/assetic-bundle",
- "version": "dev-master",
- "version_normalized": "9999999-dev",
- "target-dir": "Symfony/Bundle/AsseticBundle",
- "time": "2012-06-16 23:29:31",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/AsseticBundle",
- "reference": "8fe7b898b08103c1d6fce64c3e279a7afd61adfc"
- },
- "dist": {
- "type": "zip",
- "url": "https://github.com/symfony/AsseticBundle/zipball/8fe7b898b08103c1d6fce64c3e279a7afd61adfc",
- "reference": "8fe7b898b08103c1d6fce64c3e279a7afd61adfc",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0",
- "symfony/framework-bundle": "2.1.*",
- "kriswallsmith/assetic": "1.1.*"
- },
- "suggest": {
- "symfony/twig-bundle": "2.1.*"
- },
- "type": "symfony-bundle",
- "extra": {
- "branch-alias": {
- "dev-master": "2.1.x-dev"
- }
- },
- "installation-source": "source",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Kris Wallsmith",
- "email": "kris.wallsmith@gmail.com",
- "homepage": "http://kriswallsmith.net/",
- "role": null
- }
- ],
- "description": "Integrates Assetic into Symfony2",
- "homepage": "https://github.com/symfony/AsseticBundle",
- "keywords": [
- "assets",
- "compression",
- "minification"
- ],
- "autoload": {
- "psr-0": {
- "Symfony\\Bundle\\AsseticBundle": ""
- }
- }
- },
- {
- "name": "symfony/monolog-bundle",
- "version": "dev-master",
- "version_normalized": "9999999-dev",
- "target-dir": "Symfony/Bundle/MonologBundle",
- "time": "2012-06-28 15:48:07",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/MonologBundle",
- "reference": "7fe7f711bb04b86ad7f45a9e11a7f8cbaf9bc1a5"
- },
- "dist": {
- "type": "zip",
- "url": "https://github.com/symfony/MonologBundle/zipball/7fe7f711bb04b86ad7f45a9e11a7f8cbaf9bc1a5",
- "reference": "7fe7f711bb04b86ad7f45a9e11a7f8cbaf9bc1a5",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.2",
- "monolog/monolog": "1.*",
- "symfony/monolog-bridge": "2.1.*",
- "symfony/dependency-injection": "2.1.*",
- "symfony/config": "2.1.*"
- },
- "require-dev": {
- "symfony/yaml": "2.1.*",
- "symfony/config": "2.1.*"
- },
- "type": "symfony-bundle",
- "extra": {
- "branch-alias": {
- "dev-master": "2.1.x-dev"
- }
- },
- "installation-source": "source",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com",
- "homepage": null,
- "role": null
- },
- {
- "name": "Symfony Community",
- "email": null,
- "homepage": "http://symfony.com/contributors",
- "role": null
- }
- ],
- "description": "Symfony MonologBundle",
- "homepage": "http://symfony.com",
- "autoload": {
- "psr-0": {
- "Symfony\\Bundle\\MonologBundle": ""
- }
- }
- },
- {
- "name": "sensio/framework-extra-bundle",
- "version": "dev-master",
- "version_normalized": "9999999-dev",
- "target-dir": "Sensio/Bundle/FrameworkExtraBundle",
- "time": "2012-06-29 05:03:39",
- "source": {
- "type": "git",
- "url": "https://github.com/sensio/SensioFrameworkExtraBundle",
- "reference": "4f54e5d5fb3b54fb107892684018f3704934c48d"
- },
- "dist": {
- "type": "zip",
- "url": "https://github.com/sensio/SensioFrameworkExtraBundle/zipball/4f54e5d5fb3b54fb107892684018f3704934c48d",
- "reference": "4f54e5d5fb3b54fb107892684018f3704934c48d",
- "shasum": ""
- },
- "require": {
- "doctrine/common": ">=2.1,<2.4-dev",
- "symfony/framework-bundle": "2.1.*"
- },
- "type": "symfony-bundle",
- "extra": {
- "branch-alias": {
- "dev-master": "2.1.x-dev"
- }
- },
- "installation-source": "source",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com",
- "homepage": null,
- "role": null
- }
- ],
- "description": "This bundle provides a way to configure your controllers with annotations",
- "keywords": [
- "annotations",
- "controllers"
- ],
- "autoload": {
- "psr-0": {
- "Sensio\\Bundle\\FrameworkExtraBundle": ""
- }
- }
- },
- {
- "name": "twig/twig",
- "version": "dev-master",
- "version_normalized": "9999999-dev",
- "time": "2012-07-03 15:33:25",
- "source": {
- "type": "git",
- "url": "git://github.com/fabpot/Twig.git",
- "reference": "26eb0a2653eade50dffdd31b11ca454232dea8cf"
- },
- "dist": {
- "type": "zip",
- "url": "https://github.com/fabpot/Twig/zipball/26eb0a2653eade50dffdd31b11ca454232dea8cf",
- "reference": "26eb0a2653eade50dffdd31b11ca454232dea8cf",
- "shasum": ""
- },
- "require": {
- "php": ">=5.2.4"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.9-dev"
- }
- },
- "installation-source": "source",
- "license": [
- "BSD-3"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com",
- "homepage": null,
- "role": null
- },
- {
- "name": "Armin Ronacher",
- "email": "armin.ronacher@active-4.com",
- "homepage": null,
- "role": null
- }
- ],
- "description": "Twig, the flexible, fast, and secure template language for PHP",
- "homepage": "http://twig.sensiolabs.org",
- "keywords": [
- "templating"
- ],
- "autoload": {
- "psr-0": {
- "Twig_": "lib/"
- }
- }
- },
{
"name": "doctrine/doctrine-bundle",
"version": "dev-master",
"version_normalized": "9999999-dev",
"target-dir": "Doctrine/Bundle/DoctrineBundle",
- "time": "2012-07-03 10:42:17",
+ "time": "2012-07-02 10:42:17",
"source": {
"type": "git",
"url": "git://github.com/doctrine/DoctrineBundle.git",
@@ -785,70 +512,11 @@
}
}
},
- {
- "name": "symfony/swiftmailer-bundle",
- "version": "dev-master",
- "version_normalized": "9999999-dev",
- "target-dir": "Symfony/Bundle/SwiftmailerBundle",
- "time": "2012-07-04 15:33:34",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/SwiftmailerBundle",
- "reference": "e1d413ce27fd1696bdc82ad9525f1b874664530e"
- },
- "dist": {
- "type": "zip",
- "url": "https://github.com/symfony/SwiftmailerBundle/zipball/e1d413ce27fd1696bdc82ad9525f1b874664530e",
- "reference": "e1d413ce27fd1696bdc82ad9525f1b874664530e",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.2",
- "symfony/swiftmailer-bridge": "2.1.*",
- "swiftmailer/swiftmailer": ">=4.2.0,<4.3-dev"
- },
- "require-dev": {
- "symfony/dependency-injection": "2.1.*",
- "symfony/http-kernel": "2.1.*",
- "symfony/config": "2.1.*"
- },
- "type": "symfony-bundle",
- "extra": {
- "branch-alias": {
- "dev-master": "2.1-dev"
- }
- },
- "installation-source": "source",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com",
- "homepage": null,
- "role": null
- },
- {
- "name": "Symfony Community",
- "email": null,
- "homepage": "http://symfony.com/contributors",
- "role": null
- }
- ],
- "description": "Symfony SwiftmailerBundle",
- "homepage": "http://symfony.com",
- "autoload": {
- "psr-0": {
- "Symfony\\Bundle\\SwiftmailerBundle": ""
- }
- }
- },
{
"name": "doctrine/orm",
"version": "2.2.x-dev",
"version_normalized": "2.2.9999999.9999999-dev",
- "time": "2012-07-07 07:48:00",
+ "time": "2012-07-06 07:48:00",
"source": {
"type": "git",
"url": "git://github.com/doctrine/doctrine2.git",
@@ -909,66 +577,11 @@
}
}
},
- {
- "name": "swiftmailer/swiftmailer",
- "version": "dev-master",
- "version_normalized": "9999999-dev",
- "time": "2012-07-08 09:21:00",
- "source": {
- "type": "git",
- "url": "git://github.com/swiftmailer/swiftmailer.git",
- "reference": "f51b5f33c83b48faea75f1285f99a2e8f1c66f75"
- },
- "dist": {
- "type": "zip",
- "url": "https://github.com/swiftmailer/swiftmailer/zipball/f51b5f33c83b48faea75f1285f99a2e8f1c66f75",
- "reference": "f51b5f33c83b48faea75f1285f99a2e8f1c66f75",
- "shasum": ""
- },
- "require": {
- "php": ">=5.2.4"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "4.2-dev"
- }
- },
- "installation-source": "source",
- "license": [
- "LGPL"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com",
- "homepage": null,
- "role": null
- },
- {
- "name": "Chris Corbyn",
- "email": "",
- "homepage": null,
- "role": null
- }
- ],
- "description": "Swiftmailer, free feature-rich PHP mailer",
- "homepage": "http://swiftmailer.org",
- "keywords": [
- "mail",
- "mailer"
- ],
- "autoload": {
- "files": [
- "lib/swift_required.php"
- ]
- }
- },
{
"name": "doctrine/dbal",
"version": "2.2.x-dev",
"version_normalized": "2.2.9999999.9999999-dev",
- "time": "2012-07-08 18:30:35",
+ "time": "2012-07-07 18:30:35",
"source": {
"type": "git",
"url": "https://github.com/doctrine/dbal",
@@ -1030,25 +643,456 @@
}
},
{
- "name": "symfony/symfony",
- "version": "dev-master",
- "version_normalized": "9999999-dev",
- "time": "2012-07-09 05:52:38",
+ "name": "egeloen/ckeditor-bundle",
+ "version": "2.0.x-dev",
+ "version_normalized": "2.0.9999999.9999999-dev",
+ "target-dir": "Ivory/CKEditorBundle",
+ "time": "2012-05-16 18:38:27",
"source": {
"type": "git",
- "url": "git://github.com/symfony/symfony.git",
- "reference": "v2.1.0-BETA2"
+ "url": "https://github.com/egeloen/IvoryCKEditorBundle",
+ "reference": "ca9d4a631577d7195c6517dd89ae8a3cc02b85ba"
},
"dist": {
"type": "zip",
- "url": "https://github.com/symfony/symfony/zipball/v2.1.0-BETA2",
- "reference": "v2.1.0-BETA2",
+ "url": "https://github.com/egeloen/IvoryCKEditorBundle/zipball/ca9d4a631577d7195c6517dd89ae8a3cc02b85ba",
+ "reference": "ca9d4a631577d7195c6517dd89ae8a3cc02b85ba",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0",
+ "symfony/framework-bundle": "2.*"
+ },
+ "type": "symfony-bundle",
+ "installation-source": "source",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Eric GELOEN",
+ "email": "geloen.eric@gmail.com",
+ "homepage": null,
+ "role": null
+ }
+ ],
+ "description": "Provides a CKEditor integration for your Symfony2 Project.",
+ "keywords": [
+ "CKEditor"
+ ],
+ "autoload": {
+ "psr-0": {
+ "Ivory\\CKEditorBundle": ""
+ }
+ }
+ },
+ {
+ "name": "sensio/generator-bundle",
+ "version": "dev-master",
+ "version_normalized": "9999999-dev",
+ "target-dir": "Sensio/Bundle/GeneratorBundle",
+ "time": "2012-07-13 00:04:48",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sensio/SensioGeneratorBundle",
+ "reference": "c17dbddefe517e3adfcbeaa1ab7cef3e572d29c6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/sensio/SensioGeneratorBundle/zipball/c17dbddefe517e3adfcbeaa1ab7cef3e572d29c6",
+ "reference": "c17dbddefe517e3adfcbeaa1ab7cef3e572d29c6",
+ "shasum": ""
+ },
+ "require": {
+ "symfony/framework-bundle": "2.1.*"
+ },
+ "require-dev": {
+ "symfony/doctrine-bridge": "2.1.*",
+ "doctrine/orm": ">=2.1,<2.4-dev",
+ "twig/twig": ">=1.8,<2.0-dev"
+ },
+ "suggest": {
+ "doctrine/doctrine-bundle": "to generate entities and their crud controller"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1.x-dev"
+ }
+ },
+ "installation-source": "source",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com",
+ "homepage": null,
+ "role": null
+ }
+ ],
+ "description": "This bundle generates code for you",
+ "autoload": {
+ "psr-0": {
+ "Sensio\\Bundle\\GeneratorBundle": ""
+ }
+ }
+ },
+ {
+ "name": "symfony/assetic-bundle",
+ "version": "dev-master",
+ "version_normalized": "9999999-dev",
+ "target-dir": "Symfony/Bundle/AsseticBundle",
+ "time": "2012-07-12 06:51:17",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/AsseticBundle",
+ "reference": "ed933dcfa45f00b6bc6d7727007403f3ff429e5a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/symfony/AsseticBundle/zipball/ed933dcfa45f00b6bc6d7727007403f3ff429e5a",
+ "reference": "ed933dcfa45f00b6bc6d7727007403f3ff429e5a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0",
+ "symfony/framework-bundle": "2.1.*",
+ "kriswallsmith/assetic": "1.1.*"
+ },
+ "suggest": {
+ "symfony/twig-bundle": "2.1.*"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1.x-dev"
+ }
+ },
+ "installation-source": "source",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kris Wallsmith",
+ "email": "kris.wallsmith@gmail.com",
+ "homepage": "http://kriswallsmith.net/",
+ "role": null
+ }
+ ],
+ "description": "Integrates Assetic into Symfony2",
+ "homepage": "https://github.com/symfony/AsseticBundle",
+ "keywords": [
+ "assets",
+ "compression",
+ "minification"
+ ],
+ "autoload": {
+ "psr-0": {
+ "Symfony\\Bundle\\AsseticBundle": ""
+ }
+ }
+ },
+ {
+ "name": "symfony/monolog-bundle",
+ "version": "dev-master",
+ "version_normalized": "9999999-dev",
+ "target-dir": "Symfony/Bundle/MonologBundle",
+ "time": "2012-06-30 05:48:07",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/MonologBundle",
+ "reference": "v2.1.0-BETA3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/symfony/MonologBundle/zipball/v2.1.0-BETA3",
+ "reference": "v2.1.0-BETA3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2",
+ "monolog/monolog": "1.*",
+ "symfony/monolog-bridge": "2.1.*",
+ "symfony/dependency-injection": "2.1.*",
+ "symfony/config": "2.1.*"
+ },
+ "require-dev": {
+ "symfony/yaml": "2.1.*",
+ "symfony/config": "2.1.*"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1.x-dev"
+ }
+ },
+ "installation-source": "source",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com",
+ "homepage": null,
+ "role": null
+ },
+ {
+ "name": "Symfony Community",
+ "email": null,
+ "homepage": "http://symfony.com/contributors",
+ "role": null
+ }
+ ],
+ "description": "Symfony MonologBundle",
+ "homepage": "http://symfony.com",
+ "autoload": {
+ "psr-0": {
+ "Symfony\\Bundle\\MonologBundle": ""
+ }
+ }
+ },
+ {
+ "name": "sensio/framework-extra-bundle",
+ "version": "dev-master",
+ "version_normalized": "9999999-dev",
+ "target-dir": "Sensio/Bundle/FrameworkExtraBundle",
+ "time": "2012-07-11 23:13:52",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sensio/SensioFrameworkExtraBundle",
+ "reference": "e9ac8f1a911ed29e30296c7f1549f53d4c94eddf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/sensio/SensioFrameworkExtraBundle/zipball/e9ac8f1a911ed29e30296c7f1549f53d4c94eddf",
+ "reference": "e9ac8f1a911ed29e30296c7f1549f53d4c94eddf",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/common": ">=2.1,<2.4-dev",
+ "symfony/framework-bundle": "2.1.*"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1.x-dev"
+ }
+ },
+ "installation-source": "source",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com",
+ "homepage": null,
+ "role": null
+ }
+ ],
+ "description": "This bundle provides a way to configure your controllers with annotations",
+ "keywords": [
+ "annotations",
+ "controllers"
+ ],
+ "autoload": {
+ "psr-0": {
+ "Sensio\\Bundle\\FrameworkExtraBundle": ""
+ }
+ }
+ },
+ {
+ "name": "twig/twig",
+ "version": "dev-master",
+ "version_normalized": "9999999-dev",
+ "time": "2012-07-15 23:42:44",
+ "source": {
+ "type": "git",
+ "url": "git://github.com/fabpot/Twig.git",
+ "reference": "d45664045194ef62573c153c424508527105041e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/fabpot/Twig/zipball/d45664045194ef62573c153c424508527105041e",
+ "reference": "d45664045194ef62573c153c424508527105041e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.2.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.9-dev"
+ }
+ },
+ "installation-source": "source",
+ "license": [
+ "BSD-3"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com",
+ "homepage": null,
+ "role": null
+ },
+ {
+ "name": "Armin Ronacher",
+ "email": "armin.ronacher@active-4.com",
+ "homepage": null,
+ "role": null
+ }
+ ],
+ "description": "Twig, the flexible, fast, and secure template language for PHP",
+ "homepage": "http://twig.sensiolabs.org",
+ "keywords": [
+ "templating"
+ ],
+ "autoload": {
+ "psr-0": {
+ "Twig_": "lib/"
+ }
+ }
+ },
+ {
+ "name": "symfony/swiftmailer-bundle",
+ "version": "dev-master",
+ "version_normalized": "9999999-dev",
+ "target-dir": "Symfony/Bundle/SwiftmailerBundle",
+ "time": "2012-07-05 11:33:34",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/SwiftmailerBundle",
+ "reference": "v2.1.0-BETA3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/symfony/SwiftmailerBundle/zipball/v2.1.0-BETA3",
+ "reference": "v2.1.0-BETA3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2",
+ "symfony/swiftmailer-bridge": "2.1.*",
+ "swiftmailer/swiftmailer": ">=4.2.0,<4.3-dev"
+ },
+ "require-dev": {
+ "symfony/dependency-injection": "2.1.*",
+ "symfony/http-kernel": "2.1.*",
+ "symfony/config": "2.1.*"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1-dev"
+ }
+ },
+ "installation-source": "source",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com",
+ "homepage": null,
+ "role": null
+ },
+ {
+ "name": "Symfony Community",
+ "email": null,
+ "homepage": "http://symfony.com/contributors",
+ "role": null
+ }
+ ],
+ "description": "Symfony SwiftmailerBundle",
+ "homepage": "http://symfony.com",
+ "autoload": {
+ "psr-0": {
+ "Symfony\\Bundle\\SwiftmailerBundle": ""
+ }
+ }
+ },
+ {
+ "name": "swiftmailer/swiftmailer",
+ "version": "dev-master",
+ "version_normalized": "9999999-dev",
+ "time": "2012-07-13 12:47:17",
+ "source": {
+ "type": "git",
+ "url": "git://github.com/swiftmailer/swiftmailer.git",
+ "reference": "8b2aa953f87da228ba413e8fb1372e49c1374050"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/swiftmailer/swiftmailer/zipball/8b2aa953f87da228ba413e8fb1372e49c1374050",
+ "reference": "8b2aa953f87da228ba413e8fb1372e49c1374050",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.2.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.2-dev"
+ }
+ },
+ "installation-source": "source",
+ "license": [
+ "LGPL"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com",
+ "homepage": null,
+ "role": null
+ },
+ {
+ "name": "Chris Corbyn",
+ "email": "",
+ "homepage": null,
+ "role": null
+ }
+ ],
+ "description": "Swiftmailer, free feature-rich PHP mailer",
+ "homepage": "http://swiftmailer.org",
+ "keywords": [
+ "mail",
+ "mailer"
+ ],
+ "autoload": {
+ "files": [
+ "lib/swift_required.php"
+ ]
+ }
+ },
+ {
+ "name": "symfony/symfony",
+ "version": "dev-master",
+ "version_normalized": "9999999-dev",
+ "time": "2012-07-15 16:27:15",
+ "source": {
+ "type": "git",
+ "url": "git://github.com/symfony/symfony.git",
+ "reference": "151b79a6ce3f459e2fa8815cd9f2786eef750993"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/symfony/symfony/zipball/151b79a6ce3f459e2fa8815cd9f2786eef750993",
+ "reference": "151b79a6ce3f459e2fa8815cd9f2786eef750993",
"shasum": ""
},
"require": {
- "php": ">=5.3.3",
"twig/twig": ">=1.8,<2.0-dev",
- "doctrine/common": ">2.2,<2.4-dev"
+ "doctrine/common": ">2.2,<2.4-dev",
+ "php": ">=5.3.3"
},
"replace": {
"symfony/doctrine-bridge": "self.version",
@@ -1135,16 +1179,16 @@
"version": "dev-master",
"version_normalized": "9999999-dev",
"target-dir": "Sensio/Bundle/DistributionBundle",
- "time": "2012-07-08 08:02:21",
+ "time": "2012-07-15 10:24:10",
"source": {
"type": "git",
"url": "https://github.com/sensio/SensioDistributionBundle",
- "reference": "9a7dbd867fd5061e4bfd660a175aa66122f53d25"
+ "reference": "5886adae1613c0a72fbb95259a83ae798e86c0d3"
},
"dist": {
"type": "zip",
- "url": "https://github.com/sensio/SensioDistributionBundle/zipball/9a7dbd867fd5061e4bfd660a175aa66122f53d25",
- "reference": "9a7dbd867fd5061e4bfd660a175aa66122f53d25",
+ "url": "https://github.com/sensio/SensioDistributionBundle/zipball/5886adae1613c0a72fbb95259a83ae798e86c0d3",
+ "reference": "5886adae1613c0a72fbb95259a83ae798e86c0d3",
"shasum": ""
},
"require": {
diff --git a/vendor/egeloen/ckeditor-bundle/Ivory/CKEditorBundle b/vendor/egeloen/ckeditor-bundle/Ivory/CKEditorBundle
new file mode 160000
index 0000000..ca9d4a6
--- /dev/null
+++ b/vendor/egeloen/ckeditor-bundle/Ivory/CKEditorBundle
@@ -0,0 +1 @@
+Subproject commit ca9d4a631577d7195c6517dd89ae8a3cc02b85ba
diff --git a/vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle/Composer/ScriptHandler.php b/vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle/Composer/ScriptHandler.php
index d2b2323..2e0e96d 100644
--- a/vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle/Composer/ScriptHandler.php
+++ b/vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle/Composer/ScriptHandler.php
@@ -31,7 +31,7 @@ class ScriptHandler
return;
}
- static::executeBuildBootstrap($appDir);
+ static::executeBuildBootstrap($appDir, $options['process-timeout']);
}
public static function clearCache($event)
@@ -45,7 +45,7 @@ class ScriptHandler
return;
}
- static::executeCommand($event, $appDir, 'cache:clear --no-warmup');
+ static::executeCommand($event, $appDir, 'cache:clear --no-warmup', $options['process-timeout']);
}
public static function installAssets($event)
@@ -123,7 +123,7 @@ namespace { return \$loader; }
", substr(file_get_contents($file), 5)));
}
- protected static function executeCommand($event, $appDir, $cmd)
+ protected static function executeCommand($event, $appDir, $cmd, $timeout = 300)
{
$php = escapeshellarg(self::getPhp());
$console = escapeshellarg($appDir.'/console');
@@ -131,17 +131,17 @@ namespace { return \$loader; }
$console.= ' --ansi';
}
- $process = new Process($php.' '.$console.' '.$cmd, null, null, null, 300);
+ $process = new Process($php.' '.$console.' '.$cmd, null, null, null, $timeout);
$process->run(function ($type, $buffer) { echo $buffer; });
}
- protected static function executeBuildBootstrap($appDir)
+ protected static function executeBuildBootstrap($appDir, $timeout = 300)
{
$php = escapeshellarg(self::getPhp());
$cmd = escapeshellarg(__DIR__.'/../Resources/bin/build_bootstrap.php');
$appDir = escapeshellarg($appDir);
- $process = new Process($php.' '.$cmd.' '.$appDir, null, null, null, 300);
+ $process = new Process($php.' '.$cmd.' '.$appDir, null, null, null, $timeout);
$process->run(function ($type, $buffer) { echo $buffer; });
}
@@ -155,6 +155,8 @@ namespace { return \$loader; }
$options['symfony-assets-install'] = getenv('SYMFONY_ASSETS_INSTALL') ?: $options['symfony-assets-install'];
+ $options['process-timeout'] = $event->getComposer()->getConfig()->get('process-timeout');
+
return $options;
}
diff --git a/vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle/Diff/Diff.php b/vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle/Diff/Diff.php
deleted file mode 100644
index f825209..0000000
--- a/vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle/Diff/Diff.php
+++ /dev/null
@@ -1,91 +0,0 @@
-
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Sensio\Bundle\DistributionBundle\Diff;
-
-/**
- * Computes a Diff between files (line by line).
- *
- * Implements the Longest common subsequence problem algorithm.
- *
- * @see http://en.wikipedia.org/wiki/Longest_common_subsequence_problem
- *
- * @author Fabien Potencier
- */
-class Diff
-{
- private $diff;
-
- public function __construct($str1, $str2)
- {
- $lines1 = explode("\n", $str1);
- $lines2 = explode("\n", $str2);
-
- $this->diff = $this->computeDiff($this->computeLcs($lines1, $lines2), $lines1, $lines2, count($lines1) - 1, count($lines2) - 1);
- }
-
- public function getDiff()
- {
- $diff = array();
- for ($i = 0, $max = count($this->diff); $i < $max; $i++) {
- if ('' != $this->diff[$i][0]) {
- $diff[] = array('@', sprintf(' Line %s', $this->diff[$i][2]));
-
- do {
- $diff[] = $this->diff[$i++];
- } while ('' != $this->diff[$i][0]);
- }
- }
-
- return $diff;
- }
-
- public function computeDiff(array $c, array $lines1, array $lines2, $i, $j)
- {
- $diff = array();
-
- if ($i > -1 && $j > -1 && $lines1[$i] == $lines2[$j]) {
- $diff = array_merge($diff, $this->computeDiff($c, $lines1, $lines2, $i - 1, $j - 1));
- $diff[] = array('', $lines1[$i], $i, $j);
- } else {
- if ($j > -1 && ($i == -1 || $c[$i][$j - 1] >= $c[$i - 1][$j])) {
- $diff = array_merge($diff, $this->computeDiff($c, $lines1, $lines2, $i, $j - 1));
- $diff[] = array('+', $lines2[$j], $i, $j);
- } elseif ($i > -1 && ($j == -1 || $c[$i][$j - 1] < $c[$i - 1][$j])) {
- $diff = array_merge($diff, $this->computeDiff($c, $lines1, $lines2, $i - 1, $j));
- $diff[] = array('-', $lines1[$i], $i, $j);
- }
- }
-
- return $diff;
- }
-
- private function computeLcs(array $lines1, array $lines2)
- {
- for ($i = -1, $len1 = count($lines1); $i < $len1; $i++) {
- for ($j = -1, $len2 = count($lines2); $j < $len2; $j++) {
- $c[$i][$j] = 0;
- }
- }
-
- for ($i = 0; $i < $len1; $i++) {
- for ($j = 0; $j < $len2; $j++) {
- if ($lines1[$i] == $lines2[$j]) {
- $c[$i][$j] = $c[$i - 1][$j - 1] + 1;
- } else {
- $c[$i][$j] = max($c[$i][$j - 1], $c[$i - 1][$j]);
- }
- }
- }
-
- return $c;
- }
-}
diff --git a/vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle/Resources/skeleton/app/SymfonyRequirements.php b/vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle/Resources/skeleton/app/SymfonyRequirements.php
index a630af0..cfd55a7 100644
--- a/vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle/Resources/skeleton/app/SymfonyRequirements.php
+++ b/vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle/Resources/skeleton/app/SymfonyRequirements.php
@@ -429,11 +429,11 @@ class SymfonyRequirements extends RequirementCollection
);
if (version_compare($installedPhpVersion, self::REQUIRED_PHP_VERSION, '>=')) {
- $this->addRequirement(
- (in_array(date_default_timezone_get(), DateTimeZone::listIdentifiers())),
- sprintf('Default timezone is deprecated (%s)', date_default_timezone_get()),
- 'Fix your php.ini file (list of deprecated timezones http://us.php.net/manual/en/timezones.others.php).'
- );
+ $this->addRequirement(
+ (in_array(date_default_timezone_get(), DateTimeZone::listIdentifiers())),
+ sprintf('Default timezone "%s" is not supported by your installation of PHP', date_default_timezone_get()),
+ 'Fix your php.ini file (check for typos and have a look at the list of deprecated timezones http://php.net/manual/en/timezones.others.php).'
+ );
}
$this->addRequirement(
@@ -492,6 +492,12 @@ class SymfonyRequirements extends RequirementCollection
/* optional recommendations follow */
+ $this->addRecommendation(
+ version_compare($installedPhpVersion, '5.3.4', '>='),
+ sprintf('Your project might not work properly ("Notice: Trying to get property of non-object") due to the PHP bug #52083 before PHP 5.3.4 (%s installed)', $installedPhpVersion),
+ 'Install PHP 5.3.4 or newer'
+ );
+
$this->addRecommendation(
version_compare($installedPhpVersion, '5.3.8', '>='),
sprintf('Annotations might not work properly due to the PHP bug #55156 before PHP 5.3.8 (%s installed)', $installedPhpVersion),
diff --git a/vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle/Upgrader/Upgrader.php b/vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle/Upgrader/Upgrader.php
deleted file mode 100644
index 76b5393..0000000
--- a/vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle/Upgrader/Upgrader.php
+++ /dev/null
@@ -1,59 +0,0 @@
-
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Sensio\Bundle\DistributionBundle\Upgrade;
-
-use Sensio\Bundle\DistributionBundle\Diff\Diff;
-use Symfony\Component\Console\Output\OutputInterface;
-
-/**
- * Upgrade class.
- *
- * @author Fabien Potencier
- */
-class Upgrade
-{
- public function outputConsoleDiff(OutputInterface $output, $file1, $file2)
- {
- if (is_file($file1)) {
- $file1 = realpath($file1);
- $str1 = file_get_contents($file1);
- } else {
- $str1 = '';
- }
-
- if (!is_file($file2)) {
- throw new \RuntimeException(sprintf('The skeleton file "%s" does not exist.', $file2));
- }
- $file2 = realpath($file2);
- $str2 = file_get_contents($file2);
-
- $diff = new Diff($str1, $str2);
-
- $output->writeln(sprintf('--- %s', $file1));
- $output->writeln(sprintf('+++ %s', $file2));
- foreach ($diff->getDiff() as $line) {
- if ('+' == $line[0]) {
- $format = '+%s>';
- } elseif ('-' == $line[0]) {
- $format = '-%s>';
- } elseif ('@' == $line[0]) {
- $format = '@%s>';
- } else {
- $format = ' %s';
- }
-
- $output->writeln(sprintf($format, $line[1]));
- }
-
- $output->writeln('');
- }
-}
diff --git a/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/.gitignore b/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/.gitignore
new file mode 100644
index 0000000..1f83134
--- /dev/null
+++ b/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/.gitignore
@@ -0,0 +1,4 @@
+coverage
+phpunit.xml
+vendor
+composer.lock
diff --git a/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/CHANGELOG-2.1.md b/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/CHANGELOG-2.1.md
new file mode 100644
index 0000000..165e0f9
--- /dev/null
+++ b/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/CHANGELOG-2.1.md
@@ -0,0 +1,6 @@
+CHANGELOG for 2.1.x
+===================
+
+ * added the possibility to configure the id name for the Doctrine converter via the id option
+ * [BC break] The ParamConverterInterface::apply() method now must return a
+ Boolean value indicating if a conversion was done.
diff --git a/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/Resources/doc/annotations/converters.rst b/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/Resources/doc/annotations/converters.rst
index 93fd80d..ca4cfe4 100644
--- a/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/Resources/doc/annotations/converters.rst
+++ b/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/Resources/doc/annotations/converters.rst
@@ -74,6 +74,19 @@ option::
{
}
+This also allows you to have multiple converters in one action::
+
+ /**
+ * @Route("/blog/{id}/comments/{comment_id}")
+ * @ParamConverter("comment", class="SensioBlogBundle:Comment", options={"id" = "comment_id"})
+ */
+ public function showAction(Post $post, Comment $comment)
+ {
+ }
+
+In the example above, the post parameter is handled automatically, but the comment is
+configured with the annotation since they can not both follow the default convention.
+
Creating a Converter
--------------------
diff --git a/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/Tests/Configuration/ConfigurationAnnotationTest.php b/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/Tests/Configuration/ConfigurationAnnotationTest.php
new file mode 100644
index 0000000..2725d6b
--- /dev/null
+++ b/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/Tests/Configuration/ConfigurationAnnotationTest.php
@@ -0,0 +1,18 @@
+getMockForAbstractClass('Sensio\Bundle\FrameworkExtraBundle\Configuration\ConfigurationAnnotation', array(
+ array(
+ 'doesNotExists' => true,
+ ),
+ ));
+ }
+}
diff --git a/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/Tests/EventListener/CacheListenerTest.php b/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/Tests/EventListener/CacheListenerTest.php
new file mode 100644
index 0000000..c7d5072
--- /dev/null
+++ b/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/Tests/EventListener/CacheListenerTest.php
@@ -0,0 +1,101 @@
+listener = new CacheListener();
+ $this->response = new Response();
+ $this->cache = new Cache(array());
+ $this->request = $this->createRequest($this->cache);
+ $this->event = $this->createEventMock($this->request, $this->response);
+ }
+
+ public function testWontReassignResponseWhenResponseIsUnsuccessful()
+ {
+ $this->event
+ ->expects($this->never())
+ ->method('setResponse')
+ ;
+
+ $this->response->setStatusCode(404);
+
+ $this->assertInternalType('null', $this->listener->onKernelResponse($this->event));
+ }
+
+ public function testWontReassignResponseWhenNoConfigurationIsPresent()
+ {
+ $this->event
+ ->expects($this->never())
+ ->method('setResponse')
+ ;
+
+ $this->request->attributes->remove('_cache');
+
+ $this->assertInternalType('null', $this->listener->onKernelResponse($this->event));
+ }
+
+ public function testResponseIsPublicIfConfigurationIsPublic()
+ {
+ $request = $this->createRequest(new Cache(array(
+ 'public' => true,
+ )));
+
+ $this->listener->onKernelResponse($this->createEventMock($request, $this->response));
+
+ $this->assertTrue($this->response->headers->hasCacheControlDirective('public'));
+ $this->assertFalse($this->response->headers->hasCacheControlDirective('private'));
+ }
+
+ public function testConfigurationAttributesAreSetOnResponse()
+ {
+ $this->assertInternalType('null', $this->response->getMaxAge());
+ $this->assertInternalType('null', $this->response->getExpires());
+ $this->assertFalse($this->response->headers->hasCacheControlDirective('s-maxage'));
+
+ $this->request->attributes->set('_cache', new Cache(array(
+ 'expires' => 'tomorrow',
+ 'smaxage' => '15',
+ 'maxage' => '15',
+ )));
+
+ $this->listener->onKernelResponse($this->event);
+
+ $this->assertEquals('15', $this->response->getMaxAge());
+ $this->assertEquals('15', $this->response->headers->getCacheControlDirective('s-maxage'));
+ $this->assertInstanceOf('DateTime', $this->response->getExpires());
+ }
+
+ protected function createRequest(Cache $cache = null)
+ {
+ return new Request(array(), array(), array(
+ '_cache' => $cache,
+ ));
+ }
+
+ protected function createEventMock(Request $request, Response $response)
+ {
+ $event = $this->getMock('Symfony\Component\HttpKernel\Event\FilterResponseEvent', array(), array(), '', null);
+ $event
+ ->expects($this->any())
+ ->method('getRequest')
+ ->will($this->returnValue($request))
+ ;
+
+ $event
+ ->expects($this->any())
+ ->method('getResponse')
+ ->will($this->returnValue($response))
+ ;
+
+ return $event;
+ }
+}
diff --git a/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/Tests/EventListener/ControllerListenerTest.php b/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/Tests/EventListener/ControllerListenerTest.php
new file mode 100644
index 0000000..712832f
--- /dev/null
+++ b/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/Tests/EventListener/ControllerListenerTest.php
@@ -0,0 +1,85 @@
+listener = new ControllerListener(new AnnotationReader());
+ $this->request = $this->createRequest();
+ }
+
+ public function tearDown()
+ {
+ $this->listener = null;
+ $this->request = null;
+ }
+
+ public function testCacheAnnotationAtMethod()
+ {
+ $controller = new FooControllerCacheAtMethod();
+
+ $this->event = $this->getFilterControllerEvent(array($controller, 'barAction'), $this->request);
+ $this->listener->onKernelController($this->event);
+
+ $this->assertNotNull($this->getReadedCache());
+ $this->assertEquals(FooControllerCacheAtMethod::METHOD_SMAXAGE, $this->getReadedCache()->getSMaxAge());
+ }
+
+ public function testCacheAnnotationAtClass()
+ {
+ $controller = new FooControllerCacheAtClass();
+ $this->event = $this->getFilterControllerEvent(array($controller, 'barAction'), $this->request);
+ $this->listener->onKernelController($this->event);
+
+ $this->assertNotNull($this->getReadedCache());
+ $this->assertEquals(FooControllerCacheAtClass::CLASS_SMAXAGE, $this->getReadedCache()->getSMaxAge());
+ }
+
+ public function testCacheAnnotationAtClassAndMethod()
+ {
+ $controller = new FooControllerCacheAtClassAndMethod();
+ $this->event = $this->getFilterControllerEvent(array($controller, 'barAction'), $this->request);
+ $this->listener->onKernelController($this->event);
+
+ $this->assertNotNull($this->getReadedCache());
+ $this->assertEquals(FooControllerCacheAtClassAndMethod::METHOD_SMAXAGE, $this->getReadedCache()->getSMaxAge());
+
+ $this->event = $this->getFilterControllerEvent(array($controller, 'bar2Action'), $this->request);
+ $this->listener->onKernelController($this->event);
+
+ $this->assertNotNull($this->getReadedCache());
+ $this->assertEquals(FooControllerCacheAtClassAndMethod::CLASS_SMAXAGE, $this->getReadedCache()->getSMaxAge());
+ }
+
+ protected function createRequest(Cache $cache = null)
+ {
+ return new Request(array(), array(), array(
+ '_cache' => $cache,
+ ));
+ }
+
+ protected function getFilterControllerEvent($controller, Request $request)
+ {
+ $mockKernel = $this->getMockForAbstractClass('Symfony\Component\HttpKernel\Kernel', array('', ''));
+
+ return new FilterControllerEvent($mockKernel, $controller, $request, HttpKernelInterface::MASTER_REQUEST);
+ }
+
+ protected function getReadedCache()
+ {
+ return $this->request->attributes->get('_cache');
+ }
+}
diff --git a/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/Tests/EventListener/Fixture/FooControllerCacheAtClass.php b/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/Tests/EventListener/Fixture/FooControllerCacheAtClass.php
new file mode 100644
index 0000000..619f7fc
--- /dev/null
+++ b/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/Tests/EventListener/Fixture/FooControllerCacheAtClass.php
@@ -0,0 +1,17 @@
+markTestSkipped();
+ }
+
+ $this->manager = $this->getMock('Doctrine\Common\Persistence\ManagerRegistry');
+ $this->converter = new DoctrineParamConverter($this->manager);
+ }
+
+ public function createConfiguration($class = null, array $options = null)
+ {
+ $config = $this->getMock(
+ 'Sensio\Bundle\FrameworkExtraBundle\Configuration\ConfigurationInterface', array(
+ 'getClass', 'getAliasName', 'getOptions'
+ ));
+ if ($options !== null) {
+ $config->expects($this->once())
+ ->method('getOptions')
+ ->will($this->returnValue($options));
+ }
+ if ($class !== null) {
+ $config->expects($this->any())
+ ->method('getClass')
+ ->will($this->returnValue($class));
+ }
+
+ return $config;
+ }
+
+ public function testApplyWithNoIdAndData()
+ {
+ $request = new Request();
+ $config = $this->createConfiguration(null, array());
+ $objectManager = $this->getMock('Doctrine\Common\Persistence\ObjectManager');
+
+ $this->manager->expects($this->never())->method('find');
+ $this->manager->expects($this->once())
+ ->method('getManager')
+ ->will($this->returnValue($objectManager));
+
+ $this->setExpectedException('LogicException');
+ $this->converter->apply($request, $config);
+ }
+
+ public function testSupports()
+ {
+ $config = $this->createConfiguration('stdClass', array());
+ $metadataFactory = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadataFactory');
+ $metadataFactory->expects($this->once())
+ ->method('isTransient')
+ ->with($this->equalTo('stdClass'))
+ ->will($this->returnValue( false ));
+
+ $objectManager = $this->getMock('Doctrine\Common\Persistence\ObjectManager');
+ $objectManager->expects($this->once())
+ ->method('getMetadataFactory')
+ ->will($this->returnValue($metadataFactory));
+
+ $this->manager->expects($this->once())
+ ->method('getManager')
+ ->will($this->returnValue($objectManager));
+
+ $ret = $this->converter->supports($config);
+
+ $this->assertTrue($ret, "Should be supported");
+ }
+}
diff --git a/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/Tests/Request/ParamConverter/ParamConverterManagerTest.php b/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/Tests/Request/ParamConverter/ParamConverterManagerTest.php
new file mode 100644
index 0000000..ef623ae
--- /dev/null
+++ b/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/Tests/Request/ParamConverter/ParamConverterManagerTest.php
@@ -0,0 +1,99 @@
+manager = new ParamConverterManager();
+ }
+
+ public function testPriorities()
+ {
+ $this->assertEquals(array(), $this->manager->all());
+
+ $high = $this->createParamConverterMock();
+ $low = $this->createParamConverterMock();
+
+ $this->manager->add($low);
+ $this->manager->add($high, 10);
+
+ $this->assertEquals(array(
+ $high,
+ $low,
+ ), $this->manager->all());
+ }
+
+ public function testApply()
+ {
+ $supported = $this->createParamConverterMock();
+ $supported
+ ->expects($this->once())
+ ->method('supports')
+ ->will($this->returnValue(true))
+ ;
+ $supported
+ ->expects($this->once())
+ ->method('apply')
+ ->will($this->returnValue(false))
+ ;
+
+ $invalid = $this->createParamConverterMock();
+ $invalid
+ ->expects($this->once())
+ ->method('supports')
+ ->will($this->returnValue(false))
+ ;
+ $invalid
+ ->expects($this->never())
+ ->method('apply')
+ ;
+
+ $configurations = array(
+ new Configuration\ParamConverter(array(
+ 'name' => 'var',
+ )),
+ );
+
+ $this->manager->add($supported);
+ $this->manager->add($invalid);
+ $this->manager->apply(new Request(), $configurations);
+ }
+
+ public function testApplyNotCalledOnAlreadyConvertedObjects()
+ {
+
+ $converter = $this->createParamConverterMock();
+ $converter
+ ->expects($this->never())
+ ->method('supports')
+ ;
+
+ $converter
+ ->expects($this->never())
+ ->method('apply')
+ ;
+
+ $this->manager->add($converter);
+
+ $request = new Request();
+ $request->attributes->set('converted', new \stdClass);
+
+ $configuration = new Configuration\ParamConverter(array(
+ 'name' => 'converted',
+ 'class' => 'stdClass',
+ ));
+
+ $this->manager->apply($request, array($configuration));
+ }
+
+ protected function createParamConverterMock()
+ {
+ return $this->getMock('Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter\ParamConverterInterface');
+ }
+}
diff --git a/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/phpunit.xml.dist b/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/phpunit.xml.dist
new file mode 100644
index 0000000..cfa0dd3
--- /dev/null
+++ b/vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/phpunit.xml.dist
@@ -0,0 +1,20 @@
+
+
+
+
+
+ ./Tests
+
+
+
+
+
+ ./
+
+ ./Resources
+ ./Tests
+ ./vendor
+
+
+
+
diff --git a/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/.gitignore b/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/.gitignore
new file mode 100644
index 0000000..6852100
--- /dev/null
+++ b/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/.gitignore
@@ -0,0 +1,3 @@
+phpunit.xml
+vendor
+composer.lock
diff --git a/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Command/GenerateBundleCommand.php b/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Command/GenerateBundleCommand.php
index 9aa79ee..f40468d 100644
--- a/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Command/GenerateBundleCommand.php
+++ b/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Command/GenerateBundleCommand.php
@@ -55,7 +55,7 @@ conventions):
php app/console generate:bundle --namespace=Acme/BlogBundle
-Note that you can use / instead of \\ for the namespace delimiter to avoid any
+Note that you can use / instead of \\ for the namespace delimiter to avoid any
problem.
If you want to disable any user interaction, use --no-interaction but don't forget to pass all needed options:
diff --git a/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Tests/Command/GenerateBundleCommandTest.php b/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Tests/Command/GenerateBundleCommandTest.php
new file mode 100644
index 0000000..35decd7
--- /dev/null
+++ b/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Tests/Command/GenerateBundleCommandTest.php
@@ -0,0 +1,101 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Sensio\Bundle\GeneratorBundle\Tests\Command;
+
+use Symfony\Component\Console\Tester\CommandTester;
+use Sensio\Bundle\GeneratorBundle\Command\GenerateBundleCommand;
+
+class GenerateBundleCommandTest extends GenerateCommandTest
+{
+ /**
+ * @dataProvider getInteractiveCommandData
+ */
+ public function testInteractiveCommand($options, $input, $expected)
+ {
+ list($namespace, $bundle, $dir, $format, $structure) = $expected;
+
+ $generator = $this->getGenerator();
+ $generator
+ ->expects($this->once())
+ ->method('generate')
+ ->with($namespace, $bundle, $dir, $format, $structure)
+ ;
+
+ $tester = new CommandTester($this->getCommand($generator, $input));
+ $tester->execute($options);
+ }
+
+ public function getInteractiveCommandData()
+ {
+ $tmp = sys_get_temp_dir();
+
+ return array(
+ array(array('--dir' => $tmp), "Foo/BarBundle\n", array('Foo\BarBundle', 'FooBarBundle', $tmp.'/', 'annotation', false)),
+ array(array('--dir' => $tmp), "Foo/BarBundle\nBarBundle\nfoo\nyml\nn", array('Foo\BarBundle', 'BarBundle', 'foo/', 'yml', false)),
+ array(array('--dir' => $tmp, '--format' => 'yml', '--bundle-name' => 'BarBundle', '--structure' => true), "Foo/BarBundle\n", array('Foo\BarBundle', 'BarBundle', $tmp.'/', 'yml', true)),
+ );
+ }
+
+ /**
+ * @dataProvider getNonInteractiveCommandData
+ */
+ public function testNonInteractiveCommand($options, $expected)
+ {
+ list($namespace, $bundle, $dir, $format, $structure) = $expected;
+
+ $generator = $this->getGenerator();
+ $generator
+ ->expects($this->once())
+ ->method('generate')
+ ->with($namespace, $bundle, $dir, $format, $structure)
+ ;
+
+ $tester = new CommandTester($this->getCommand($generator, ''));
+ $tester->execute($options, array('interactive' => false));
+ }
+
+ public function getNonInteractiveCommandData()
+ {
+ $tmp = sys_get_temp_dir();
+
+ return array(
+ array(array('--dir' => $tmp, '--namespace' => 'Foo/BarBundle'), array('Foo\BarBundle', 'FooBarBundle', $tmp.'/', 'annotation', false)),
+ array(array('--dir' => $tmp, '--namespace' => 'Foo/BarBundle', '--format' => 'yml', '--bundle-name' => 'BarBundle', '--structure' => true), array('Foo\BarBundle', 'BarBundle', $tmp.'/', 'yml', true)),
+ );
+ }
+
+ protected function getCommand($generator, $input)
+ {
+ $command = $this
+ ->getMockBuilder('Sensio\Bundle\GeneratorBundle\Command\GenerateBundleCommand')
+ ->setMethods(array('checkAutoloader', 'updateKernel', 'updateRouting'))
+ ->getMock()
+ ;
+
+ $command->setContainer($this->getContainer());
+ $command->setHelperSet($this->getHelperSet($input));
+ $command->setGenerator($generator);
+
+ return $command;
+ }
+
+ protected function getGenerator()
+ {
+ // get a noop generator
+ return $this
+ ->getMockBuilder('Sensio\Bundle\GeneratorBundle\Generator\BundleGenerator')
+ ->disableOriginalConstructor()
+ ->setMethods(array('generate'))
+ ->getMock()
+ ;
+ }
+}
diff --git a/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Tests/Command/GenerateCommandTest.php b/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Tests/Command/GenerateCommandTest.php
new file mode 100644
index 0000000..93d9a50
--- /dev/null
+++ b/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Tests/Command/GenerateCommandTest.php
@@ -0,0 +1,74 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Sensio\Bundle\GeneratorBundle\Tests\Command;
+
+use Symfony\Component\Console\Helper\HelperSet;
+use Symfony\Component\Console\Helper\FormatterHelper;
+use Sensio\Bundle\GeneratorBundle\Command\Helper\DialogHelper;
+use Symfony\Component\DependencyInjection\Container;
+
+abstract class GenerateCommandTest extends \PHPUnit_Framework_TestCase
+{
+ protected function getHelperSet($input)
+ {
+ $dialog = new DialogHelper();
+ $dialog->setInputStream($this->getInputStream($input));
+
+ return new HelperSet(array(new FormatterHelper(), $dialog));
+ }
+
+ protected function getBundle()
+ {
+ $bundle = $this->getMock('Symfony\Component\HttpKernel\Bundle\BundleInterface');
+ $bundle
+ ->expects($this->any())
+ ->method('getPath')
+ ->will($this->returnValue(sys_get_temp_dir()))
+ ;
+
+ return $bundle;
+ }
+
+ protected function getInputStream($input)
+ {
+ $stream = fopen('php://memory', 'r+', false);
+ fputs($stream, $input.str_repeat("\n", 10));
+ rewind($stream);
+
+ return $stream;
+ }
+
+ protected function getContainer()
+ {
+ $kernel = $this->getMock('Symfony\Component\HttpKernel\KernelInterface');
+ $kernel
+ ->expects($this->any())
+ ->method('getBundle')
+ ->will($this->returnValue($this->getBundle()))
+ ;
+
+ $filesystem = $this->getMock('Symfony\Component\Filesystem\Filesystem');
+ $filesystem
+ ->expects($this->any())
+ ->method('isAbsolutePath')
+ ->will($this->returnValue(true))
+ ;
+
+ $container = new Container();
+ $container->set('kernel', $kernel);
+ $container->set('filesystem', $filesystem);
+
+ $container->setParameter('kernel.root_dir', sys_get_temp_dir());
+
+ return $container;
+ }
+}
diff --git a/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Tests/Command/GenerateDoctrineCrudCommandTest.php b/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Tests/Command/GenerateDoctrineCrudCommandTest.php
new file mode 100644
index 0000000..ffea942
--- /dev/null
+++ b/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Tests/Command/GenerateDoctrineCrudCommandTest.php
@@ -0,0 +1,141 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Sensio\Bundle\GeneratorBundle\Tests\Command;
+
+use Symfony\Component\Console\Tester\CommandTester;
+use Sensio\Bundle\GeneratorBundle\Command\GenerateDoctrineCrudCommand;
+
+class GenerateDoctrineCrudCommandTest extends GenerateCommandTest
+{
+ /**
+ * @dataProvider getInteractiveCommandData
+ */
+ public function testInteractiveCommand($options, $input, $expected)
+ {
+ list($entity, $format, $prefix, $withWrite) = $expected;
+
+ $generator = $this->getGenerator();
+ $generator
+ ->expects($this->once())
+ ->method('generate')
+ ->with($this->getBundle(), $entity, $this->getDoctrineMetadata(), $format, $prefix, $withWrite)
+ ;
+
+ $tester = new CommandTester($this->getCommand($generator, $input));
+ $tester->execute($options);
+ }
+
+ public function getInteractiveCommandData()
+ {
+ return array(
+ array(array(), "AcmeBlogBundle:Blog/Post\n", array('Blog\\Post', 'annotation', 'blog_post', false)),
+ array(array('--entity' => 'AcmeBlogBundle:Blog/Post'), '', array('Blog\\Post', 'annotation', 'blog_post', false)),
+ array(array(), "AcmeBlogBundle:Blog/Post\ny\nyml\nfoobar\n", array('Blog\\Post', 'yml', 'foobar', true)),
+ array(array(), "AcmeBlogBundle:Blog/Post\ny\nyml\n/foobar\n", array('Blog\\Post', 'yml', 'foobar', true)),
+ array(array('--entity' => 'AcmeBlogBundle:Blog/Post', '--format' => 'yml', '--route-prefix' => 'foo', '--with-write' => true), '', array('Blog\\Post', 'yml', 'foo', true)),
+ );
+ }
+
+ /**
+ * @dataProvider getNonInteractiveCommandData
+ */
+ public function testNonInteractiveCommand($options, $expected)
+ {
+ list($entity, $format, $prefix, $withWrite) = $expected;
+
+ $generator = $this->getGenerator();
+ $generator
+ ->expects($this->once())
+ ->method('generate')
+ ->with($this->getBundle(), $entity, $this->getDoctrineMetadata(), $format, $prefix, $withWrite)
+ ;
+
+ $tester = new CommandTester($this->getCommand($generator, ''));
+ $tester->execute($options, array('interactive' => false));
+ }
+
+ public function getNonInteractiveCommandData()
+ {
+ return array(
+ array(array('--entity' => 'AcmeBlogBundle:Blog/Post'), array('Blog\\Post', 'annotation', 'blog_post', false)),
+ array(array('--entity' => 'AcmeBlogBundle:Blog/Post', '--format' => 'yml', '--route-prefix' => 'foo', '--with-write' => true), array('Blog\\Post', 'yml', 'foo', true)),
+ );
+ }
+
+ protected function getCommand($generator, $input)
+ {
+ $command = $this
+ ->getMockBuilder('Sensio\Bundle\GeneratorBundle\Command\GenerateDoctrineCrudCommand')
+ ->setMethods(array('getEntityMetadata'))
+ ->getMock()
+ ;
+
+ $command
+ ->expects($this->any())
+ ->method('getEntityMetadata')
+ ->will($this->returnValue(array($this->getDoctrineMetadata())))
+ ;
+
+ $command->setContainer($this->getContainer());
+ $command->setHelperSet($this->getHelperSet($input));
+ $command->setGenerator($generator);
+ $command->setFormGenerator($this->getFormGenerator());
+
+ return $command;
+ }
+
+ protected function getDoctrineMetadata()
+ {
+ return $this
+ ->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadataInfo')
+ ->disableOriginalConstructor()
+ ->getMock()
+ ;
+ }
+
+ protected function getGenerator()
+ {
+ // get a noop generator
+ return $this
+ ->getMockBuilder('Sensio\Bundle\GeneratorBundle\Generator\DoctrineCrudGenerator')
+ ->disableOriginalConstructor()
+ ->setMethods(array('generate'))
+ ->getMock()
+ ;
+ }
+
+ protected function getFormGenerator()
+ {
+ return $this
+ ->getMockBuilder('Sensio\Bundle\GeneratorBundle\Generator\DoctrineFormGenerator')
+ ->disableOriginalConstructor()
+ ->setMethods(array('generate'))
+ ->getMock()
+ ;
+ }
+
+ protected function getContainer()
+ {
+ $container = parent::getContainer();
+
+ $registry = $this->getMock('Symfony\Bridge\Doctrine\RegistryInterface');
+ $registry
+ ->expects($this->any())
+ ->method('getEntityNamespace')
+ ->will($this->returnValue('Foo\\FooBundle\\Entity'))
+ ;
+
+ $container->set('doctrine', $registry);
+
+ return $container;
+ }
+}
diff --git a/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Tests/Command/GenerateDoctrineEntityCommandTest.php b/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Tests/Command/GenerateDoctrineEntityCommandTest.php
new file mode 100644
index 0000000..5ef35c2
--- /dev/null
+++ b/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Tests/Command/GenerateDoctrineEntityCommandTest.php
@@ -0,0 +1,104 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Sensio\Bundle\GeneratorBundle\Tests\Command;
+
+use Symfony\Component\Console\Tester\CommandTester;
+use Sensio\Bundle\GeneratorBundle\Command\GenerateDoctrineEntityCommand;
+
+class GenerateDoctrineEntityCommandTest extends GenerateCommandTest
+{
+ /**
+ * @dataProvider getInteractiveCommandData
+ */
+ public function testInteractiveCommand($options, $input, $expected)
+ {
+ list($entity, $format, $fields) = $expected;
+
+ $generator = $this->getGenerator();
+ $generator
+ ->expects($this->once())
+ ->method('generate')
+ ->with($this->getBundle(), $entity, $format, $fields)
+ ;
+
+ $tester = new CommandTester($this->getCommand($generator, $input));
+ $tester->execute($options);
+ }
+
+ public function getInteractiveCommandData()
+ {
+ return array(
+ array(array(), "AcmeBlogBundle:Blog/Post\n", array('Blog\\Post', 'annotation', array())),
+ array(array('--entity' => 'AcmeBlogBundle:Blog/Post'), '', array('Blog\\Post', 'annotation', array())),
+ array(array(), "AcmeBlogBundle:Blog/Post\nyml\n\n", array('Blog\\Post', 'yml', array())),
+ array(array(), "AcmeBlogBundle:Blog/Post\nyml\ntitle\n\n255\ndescription\ntext\n\n", array('Blog\\Post', 'yml', array(
+ array('fieldName' => 'title', 'type' => 'string', 'length' => 255),
+ array('fieldName' => 'description', 'type' => 'text'),
+ ))),
+ );
+ }
+
+ /**
+ * @dataProvider getNonInteractiveCommandData
+ */
+ public function testNonInteractiveCommand($options, $expected)
+ {
+ list($entity, $format, $fields) = $expected;
+
+ $generator = $this->getGenerator();
+ $generator
+ ->expects($this->once())
+ ->method('generate')
+ ->with($this->getBundle(), $entity, $format, $fields)
+ ;
+ $generator
+ ->expects($this->any())
+ ->method('isReservedKeyword')
+ ->will($this->returnValue(false))
+ ;
+
+ $tester = new CommandTester($this->getCommand($generator, ''));
+ $tester->execute($options, array('interactive' => false));
+ }
+
+ public function getNonInteractiveCommandData()
+ {
+ return array(
+ array(array('--entity' => 'AcmeBlogBundle:Blog/Post'), array('Blog\\Post', 'annotation', array())),
+ array(array('--entity' => 'AcmeBlogBundle:Blog/Post', '--format' => 'yml', '--fields' => 'title:string(255) description:text'), array('Blog\\Post', 'yml', array(
+ array('fieldName' => 'title', 'type' => 'string', 'length' => 255),
+ array('fieldName' => 'description', 'type' => 'text', 'length' => ''),
+ ))),
+ );
+ }
+
+ protected function getCommand($generator, $input)
+ {
+ $command = new GenerateDoctrineEntityCommand();
+ $command->setContainer($this->getContainer());
+ $command->setHelperSet($this->getHelperSet($input));
+ $command->setGenerator($generator);
+
+ return $command;
+ }
+
+ protected function getGenerator()
+ {
+ // get a noop generator
+ return $this
+ ->getMockBuilder('Sensio\Bundle\GeneratorBundle\Generator\DoctrineEntityGenerator')
+ ->disableOriginalConstructor()
+ ->setMethods(array('generate', 'isReservedKeyword'))
+ ->getMock()
+ ;
+ }
+}
diff --git a/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Tests/Generator/BundleGeneratorTest.php b/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Tests/Generator/BundleGeneratorTest.php
new file mode 100644
index 0000000..3f5f850
--- /dev/null
+++ b/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Tests/Generator/BundleGeneratorTest.php
@@ -0,0 +1,59 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Sensio\Bundle\GeneratorBundle\Tests\Generator;
+
+use Sensio\Bundle\GeneratorBundle\Generator\BundleGenerator;
+
+class BundleGeneratorTest extends GeneratorTest
+{
+ public function testGenerateYaml()
+ {
+ $generator = new BundleGenerator($this->filesystem, __DIR__.'/../../Resources/skeleton/bundle');
+ $generator->generate('Foo\BarBundle', 'FooBarBundle', $this->tmpDir, 'yml', false);
+
+ $files = array(
+ 'FooBarBundle.php',
+ 'Controller/DefaultController.php',
+ 'Resources/views/Default/index.html.twig',
+ 'Resources/config/routing.yml',
+ 'Tests/Controller/DefaultControllerTest.php',
+ 'Resources/config/services.yml',
+ 'DependencyInjection/Configuration.php',
+ 'DependencyInjection/FooBarExtension.php',
+ );
+ foreach ($files as $file) {
+ $this->assertTrue(file_exists($this->tmpDir.'/Foo/BarBundle/'.$file), sprintf('%s has been generated', $file));
+ }
+
+ $content = file_get_contents($this->tmpDir.'/Foo/BarBundle/FooBarBundle.php');
+ $this->assertContains('namespace Foo\\BarBundle', $content);
+
+ $content = file_get_contents($this->tmpDir.'/Foo/BarBundle/Controller/DefaultController.php');
+ $this->assertContains('public function indexAction', $content);
+ $this->assertNotContains('@Route("/hello/{name}"', $content);
+
+ $content = file_get_contents($this->tmpDir.'/Foo/BarBundle/Resources/views/Default/index.html.twig');
+ $this->assertContains('Hello {{ name }}!', $content);
+ }
+
+ public function testGenerateAnnotation()
+ {
+ $generator = new BundleGenerator($this->filesystem, __DIR__.'/../../Resources/skeleton/bundle');
+ $generator->generate('Foo\BarBundle', 'FooBarBundle', $this->tmpDir, 'annotation', false);
+
+ $this->assertFalse(file_exists($this->tmpDir.'/Foo/BarBundle/Resources/config/routing.yml'));
+ $this->assertFalse(file_exists($this->tmpDir.'/Foo/BarBundle/Resources/config/routing.xml'));
+
+ $content = file_get_contents($this->tmpDir.'/Foo/BarBundle/Controller/DefaultController.php');
+ $this->assertContains('@Route("/hello/{name}"', $content);
+ }
+}
diff --git a/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Tests/Generator/DoctrineCrudGeneratorTest.php b/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Tests/Generator/DoctrineCrudGeneratorTest.php
new file mode 100644
index 0000000..6a7f5ee
--- /dev/null
+++ b/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Tests/Generator/DoctrineCrudGeneratorTest.php
@@ -0,0 +1,206 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Sensio\Bundle\GeneratorBundle\Tests\Generator;
+
+use Sensio\Bundle\GeneratorBundle\Generator\DoctrineCrudGenerator;
+
+class DoctrineCrudGeneratorTest extends GeneratorTest
+{
+ public function testGenerateYamlFull()
+ {
+ $this->getGenerator()->generate($this->getBundle(), 'Post', $this->getMetadata(), 'yml', '/post', true);
+
+ $files = array(
+ 'Controller/PostController.php',
+ 'Tests/Controller/PostControllerTest.php',
+ 'Resources/config/routing/post.yml',
+ 'Resources/views/Post/index.html.twig',
+ 'Resources/views/Post/show.html.twig',
+ 'Resources/views/Post/new.html.twig',
+ 'Resources/views/Post/edit.html.twig',
+ );
+ foreach ($files as $file) {
+ $this->assertTrue(file_exists($this->tmpDir.'/'.$file), sprintf('%s has been generated', $file));
+ }
+
+ $files = array(
+ 'Resources/config/routing/post.xml',
+ );
+ foreach ($files as $file) {
+ $this->assertFalse(file_exists($this->tmpDir.'/'.$file), sprintf('%s has not been generated', $file));
+ }
+
+ $content = file_get_contents($this->tmpDir.'/Controller/PostController.php');
+ $strings = array(
+ 'namespace Foo\BarBundle\Controller;',
+ 'public function indexAction',
+ 'public function showAction',
+ 'public function newAction',
+ 'public function editAction',
+ );
+ foreach ($strings as $string) {
+ $this->assertContains($string, $content);
+ }
+ }
+
+ public function testGenerateXml()
+ {
+ $this->getGenerator()->generate($this->getBundle(), 'Post', $this->getMetadata(), 'xml', '/post', false);
+
+ $files = array(
+ 'Controller/PostController.php',
+ 'Tests/Controller/PostControllerTest.php',
+ 'Resources/config/routing/post.xml',
+ 'Resources/views/Post/index.html.twig',
+ 'Resources/views/Post/show.html.twig',
+ );
+ foreach ($files as $file) {
+ $this->assertTrue(file_exists($this->tmpDir.'/'.$file), sprintf('%s has been generated', $file));
+ }
+
+ $files = array(
+ 'Resources/config/routing/post.yml',
+ 'Resources/views/Post/new.html.twig',
+ 'Resources/views/Post/edit.html.twig',
+ );
+ foreach ($files as $file) {
+ $this->assertFalse(file_exists($this->tmpDir.'/'.$file), sprintf('%s has not been generated', $file));
+ }
+
+ $content = file_get_contents($this->tmpDir.'/Controller/PostController.php');
+ $strings = array(
+ 'namespace Foo\BarBundle\Controller;',
+ 'public function indexAction',
+ 'public function showAction',
+ );
+ foreach ($strings as $string) {
+ $this->assertContains($string, $content);
+ }
+
+ $content = file_get_contents($this->tmpDir.'/Controller/PostController.php');
+ $strings = array(
+ 'public function newAction',
+ 'public function editAction',
+ '@Route',
+ );
+ foreach ($strings as $string) {
+ $this->assertNotContains($string, $content);
+ }
+ }
+
+ public function testGenerateAnnotationWrite()
+ {
+ $this->getGenerator()->generate($this->getBundle(), 'Post', $this->getMetadata(), 'annotation', '/post', true);
+
+ $files = array(
+ 'Controller/PostController.php',
+ 'Tests/Controller/PostControllerTest.php',
+ 'Resources/views/Post/index.html.twig',
+ 'Resources/views/Post/show.html.twig',
+ 'Resources/views/Post/new.html.twig',
+ 'Resources/views/Post/edit.html.twig',
+ );
+ foreach ($files as $file) {
+ $this->assertTrue(file_exists($this->tmpDir.'/'.$file), sprintf('%s has been generated', $file));
+ }
+
+ $files = array(
+ 'Resources/config/routing/post.yml',
+ 'Resources/config/routing/post.xml',
+ );
+ foreach ($files as $file) {
+ $this->assertFalse(file_exists($this->tmpDir.'/'.$file), sprintf('%s has not been generated', $file));
+ }
+
+ $content = file_get_contents($this->tmpDir.'/Controller/PostController.php');
+ $strings = array(
+ 'namespace Foo\BarBundle\Controller;',
+ 'public function indexAction',
+ 'public function showAction',
+ 'public function newAction',
+ 'public function editAction',
+ '@Route',
+ );
+ foreach ($strings as $string) {
+ $this->assertContains($string, $content);
+ }
+ }
+
+ public function testGenerateAnnotation()
+ {
+ $this->getGenerator()->generate($this->getBundle(), 'Post', $this->getMetadata(), 'annotation', '/post', false);
+
+ $files = array(
+ 'Controller/PostController.php',
+ 'Tests/Controller/PostControllerTest.php',
+ 'Resources/views/Post/index.html.twig',
+ 'Resources/views/Post/show.html.twig',
+ );
+ foreach ($files as $file) {
+ $this->assertTrue(file_exists($this->tmpDir.'/'.$file), sprintf('%s has been generated', $file));
+ }
+
+ $files = array(
+ 'Resources/config/routing/post.yml',
+ 'Resources/config/routing/post.xml',
+ 'Resources/views/Post/new.html.twig',
+ 'Resources/views/Post/edit.html.twig',
+ );
+ foreach ($files as $file) {
+ $this->assertFalse(file_exists($this->tmpDir.'/'.$file), sprintf('%s has not been generated', $file));
+ }
+
+ $content = file_get_contents($this->tmpDir.'/Controller/PostController.php');
+ $strings = array(
+ 'namespace Foo\BarBundle\Controller;',
+ 'public function indexAction',
+ 'public function showAction',
+ '@Route',
+ );
+ foreach ($strings as $string) {
+ $this->assertContains($string, $content);
+ }
+
+ $content = file_get_contents($this->tmpDir.'/Controller/PostController.php');
+ $strings = array(
+ 'public function newAction',
+ 'public function editAction',
+ );
+ foreach ($strings as $string) {
+ $this->assertNotContains($string, $content);
+ }
+ }
+
+ protected function getGenerator()
+ {
+ return new DoctrineCrudGenerator($this->filesystem, __DIR__.'/../../Resources/skeleton/crud');
+ }
+
+ protected function getBundle()
+ {
+ $bundle = $this->getMock('Symfony\Component\HttpKernel\Bundle\BundleInterface');
+ $bundle->expects($this->any())->method('getPath')->will($this->returnValue($this->tmpDir));
+ $bundle->expects($this->any())->method('getName')->will($this->returnValue('FooBarBundle'));
+ $bundle->expects($this->any())->method('getNamespace')->will($this->returnValue('Foo\BarBundle'));
+
+ return $bundle;
+ }
+
+ public function getMetadata()
+ {
+ $metadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadataInfo')->disableOriginalConstructor()->getMock();
+ $metadata->identifier = array('id');
+ $metadata->fieldMappings = array('title' => array('type' => 'string'));
+
+ return $metadata;
+ }
+}
diff --git a/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Tests/Generator/DoctrineFormGeneratorTest.php b/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Tests/Generator/DoctrineFormGeneratorTest.php
new file mode 100644
index 0000000..3255221
--- /dev/null
+++ b/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Tests/Generator/DoctrineFormGeneratorTest.php
@@ -0,0 +1,40 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Sensio\Bundle\GeneratorBundle\Tests\Generator;
+
+use Sensio\Bundle\GeneratorBundle\Generator\DoctrineFormGenerator;
+
+class DoctrineFormGeneratorTest extends GeneratorTest
+{
+ public function testGenerate()
+ {
+ $generator = new DoctrineFormGenerator($this->filesystem, __DIR__.'/../../Resources/skeleton/form');
+
+ $bundle = $this->getMock('Symfony\Component\HttpKernel\Bundle\BundleInterface');
+ $bundle->expects($this->any())->method('getPath')->will($this->returnValue($this->tmpDir));
+ $bundle->expects($this->any())->method('getNamespace')->will($this->returnValue('Foo\BarBundle'));
+
+ $metadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadataInfo')->disableOriginalConstructor()->getMock();
+ $metadata->identifier = array('id');
+ $metadata->associationMappings = array('title' => array('type' => 'string'));
+
+ $generator->generate($bundle, 'Post', $metadata);
+
+ $this->assertTrue(file_exists($this->tmpDir.'/Form/PostType.php'));
+
+ $content = file_get_contents($this->tmpDir.'/Form/PostType.php');
+ $this->assertContains('->add(\'title\')', $content);
+ $this->assertContains('class PostType extends AbstractType', $content);
+ $this->assertContains("'data_class' => 'Foo\BarBundle\Entity\Post'", $content);
+ $this->assertContains("'foo_barbundle_posttype'", $content);
+ }
+}
diff --git a/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Tests/Generator/GeneratorTest.php b/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Tests/Generator/GeneratorTest.php
new file mode 100644
index 0000000..4435b4a
--- /dev/null
+++ b/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Tests/Generator/GeneratorTest.php
@@ -0,0 +1,32 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Sensio\Bundle\GeneratorBundle\Tests\Generator;
+
+use Symfony\Component\Filesystem\Filesystem;
+
+abstract class GeneratorTest extends \PHPUnit_Framework_TestCase
+{
+ protected $filesystem;
+ protected $tmpDir;
+
+ public function setUp()
+ {
+ $this->tmpDir = sys_get_temp_dir().'/sf2';
+ $this->filesystem = new Filesystem();
+ $this->filesystem->remove($this->tmpDir);
+ }
+
+ public function tearDown()
+ {
+ $this->filesystem->remove($this->tmpDir);
+ }
+}
diff --git a/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/phpunit.xml.dist b/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/phpunit.xml.dist
new file mode 100644
index 0000000..6eb1ca0
--- /dev/null
+++ b/vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/phpunit.xml.dist
@@ -0,0 +1,20 @@
+
+
+
+
+
+ ./Tests
+
+
+
+
+
+ ./
+
+ ./Resources
+ ./Tests
+ ./vendor
+
+
+
+
diff --git a/vendor/swiftmailer/swiftmailer/.gitignore b/vendor/swiftmailer/swiftmailer/.gitignore
new file mode 100644
index 0000000..0aa62f5
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/.gitignore
@@ -0,0 +1,6 @@
+.DS_Store
+tests/acceptance.conf.php
+tests/smoke.conf.php
+build/*
+.project
+.settings/*
diff --git a/vendor/swiftmailer/swiftmailer/CHANGES b/vendor/swiftmailer/swiftmailer/CHANGES
new file mode 100644
index 0000000..a6a53ab
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/CHANGES
@@ -0,0 +1,100 @@
+Changelog since Version 4.x.x
+=============================
+
+4.2.2 (2012-XX-XX)
+------------------
+
+ * n/a
+
+4.2.1 (2012-07-13)
+------------------
+
+ * changed the coding standards to PSR-1/2
+ * fixed issue with autoloading
+ * added NativeQpContentEncoder to enhance performance (for PHP 5.3+)
+
+4.2.0 (2012-06-29)
+------------------
+
+ * added documentation about how to use the Japanese support introduced in 4.1.8
+ * added a way to override the default configuration in a lazy way
+ * changed the PEAR init script to lazy-load the initialization
+ * fixed a bug when calling Swift_Preferences before anything else (regression introduced in 4.1.8)
+
+4.1.8 (2012-06-17)
+------------------
+
+ * added Japanese iso-2022-jp support
+ * changed the init script to lazy-load the initialization
+ * fixed docblocks (@id) which caused some problems with libraries parsing the dobclocks
+ * fixed Swift_Mime_Headers_IdentificationHeader::setId() when passed an array of ids
+ * fixed encoding of email addresses in headers
+ * added replacements setter to the Decorator plugin
+
+4.1.7 (2012-04-26)
+------------------
+
+ * fixed QpEncoder safeMapShareId property
+
+4.1.6 (2012-03-23)
+------------------
+
+ * reduced the size of serialized Messages
+
+4.1.5 (2012-01-04)
+------------------
+
+ * enforced Swift_Spool::queueMessage() to return a Boolean
+ * made an optimization to the memory spool: start the transport only when required
+ * prevented stream_socket_client() from generating an error and throw a Swift_TransportException instead
+ * fixed a PHP warning when calling to mail() when safe_mode is off
+ * many doc tweaks
+
+4.1.4 (2011-12-16)
+------------------
+
+ * added a memory spool (Swift_MemorySpool)
+ * fixed too many opened files when sending emails with attachments
+
+4.1.3 (2011-10-27)
+------------------
+
+ * added STARTTLS support
+ * added missing @return tags on fluent methods
+ * added a MessageLogger plugin that logs all sent messages
+ * added composer.json
+
+4.1.2 (2011-09-13)
+------------------
+
+ * fixed wrong detection of magic_quotes_runtime
+ * fixed fatal errors when no To or Subject header has been set
+ * fixed charset on parameter header continuations
+ * added documentation about how to install Swiftmailer from the PEAR channel
+ * fixed various typos and markup problem in the documentation
+ * fixed warning when cache directory does not exist
+ * fixed "slashes are escaped" bug
+ * changed require_once() to require() in autoload
+
+4.1.1 (2011-07-04)
+------------------
+
+ * added missing file in PEAR package
+
+4.1.0 (2011-06-30)
+------------------
+
+ * documentation has been converted to ReST
+
+4.1.0 RC1 (2011-06-17)
+----------------------
+
+New features:
+
+ * changed the Decorator Plugin to allow replacements in all headers
+ * added Swift_Mime_Grammar and Swift_Validate to validate an email address
+ * modified the autoloader to lazy-initialize Swiftmailer
+ * removed Swift_Mailer::batchSend()
+ * added NullTransport
+ * added new plugins: RedirectingPlugin and ImpersonatePlugin
+ * added a way to send messages asynchronously (Spool)
diff --git a/vendor/swiftmailer/swiftmailer/README b/vendor/swiftmailer/swiftmailer/README
new file mode 100644
index 0000000..dfede07
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/README
@@ -0,0 +1,16 @@
+Swift Mailer
+------------
+
+Swift Mailer is a component based mailing solution for PHP 5.
+It is released under the LGPL license.
+
+Homepage: http://swiftmailer.org
+Documentation: http://swiftmailer.org/docs
+Mailing List: http://groups.google.com/group/swiftmailer
+Bugs: https://github.com/swiftmailer/swiftmailer/issues
+Repository: https://github.com/swiftmailer/swiftmailer
+
+Swift Mailer is highly object-oriented by design and lends itself
+to use in complex web application with a great deal of flexibility.
+
+For full details on usage, see the documentation.
diff --git a/vendor/swiftmailer/swiftmailer/README.git b/vendor/swiftmailer/swiftmailer/README.git
new file mode 100644
index 0000000..3baef7c
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/README.git
@@ -0,0 +1,67 @@
+This README applies to anyone who checks out the source from git.
+
+If you're reading this page on github.com, and you don't have git
+installed or know about git, you can download this repository by
+using the "download" button on github.com, right above the file
+list.
+
+PREAMBLE:
+---------
+
+The git repository is structured in the expected way where "master" is the
+main branch you should use if you want to have bleeding-edge updates. Any
+other branch should be ignored since it will likely contain unstable
+and/or experimental developments.
+
+Generally speaking you should feel safe using the "master" branch in
+production code. Anything likely to break will be committed to another
+branch. Only bugfixes and clean non-breaking feature additions will be
+performed in master.
+
+All releases (post version 4.0.0) are tagged using the version number of
+that release. Earlier versions exist in a subversion repository at the
+old sourceforge project page.
+
+
+WHAT IS SWIFT MAILER?
+---------------------
+
+Swift Mailer is a component based mailing solution for PHP 5.
+It is released under the LGPL license.
+
+Homepage: http://swiftmailer.org/
+Documentation: http://swiftmailer.org/docs
+Mailing List: http://groups.google.com/group/swiftmailer
+Bugs: https://github.com/swiftmailer/swiftmailer/issues
+Repository: https://github.com/swiftmailer/swiftmailer
+
+Swift Mailer is highly object-oriented by design and lends itself
+to use in complex web application with a great deal of flexibility.
+
+For full details on usage, see the documentation.
+
+
+WHY SO MUCH CLUTTER?
+--------------------
+As you can probably see, there are a lot more files in here than you find in
+the pre-packaged versions. That's because I store notes (UML, RFCs etc) in
+the repository.
+
+The main library files live in /lib and the tests live in /tests. You can run
+the tests by pointing your web browser at /test-suite, or by running the
+command "php test-suite/run.php". Some tests will be "skipped" if
+tests/smoke.conf.php and tests/acceptance.conf.php are not editted. This is
+harmless and normal.
+
+If you want to create a bundled-up package from subversion you can do so if
+you have Ant (http://ant.apache.org/) installed. Simply run "ant package"
+from this directory and the tar.gz file will be created in the /build
+directory.
+
+Running the command "ant" with no arguments will bundle up the package without
+compressing it into a tar.gz file.
+
+Tests can also be run using "ant test" provided php is on your PATH
+environment variable.
+
+EoM
diff --git a/vendor/swiftmailer/swiftmailer/VERSION b/vendor/swiftmailer/swiftmailer/VERSION
index 72ba2c7..64a59ba 100644
--- a/vendor/swiftmailer/swiftmailer/VERSION
+++ b/vendor/swiftmailer/swiftmailer/VERSION
@@ -1 +1 @@
-Swift-4.2.1
+Swift-4.2.2-DEV
diff --git a/vendor/swiftmailer/swiftmailer/build.xml b/vendor/swiftmailer/swiftmailer/build.xml
new file mode 100644
index 0000000..c4e234f
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/build.xml
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/vendor/swiftmailer/swiftmailer/create_pear_package.php b/vendor/swiftmailer/swiftmailer/create_pear_package.php
new file mode 100644
index 0000000..521d650
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/create_pear_package.php
@@ -0,0 +1,42 @@
+ date('Y-m-d'),
+ 'time' => date('H:m:00'),
+ 'version' => $argv[1],
+ 'api_version' => $argv[1],
+ 'stability' => $argv[2],
+ 'api_stability' => $argv[2],
+);
+
+$context['files'] = '';
+$path = realpath(dirname(__FILE__).'/lib/classes/Swift');
+foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::LEAVES_ONLY) as $file)
+{
+ if (preg_match('/\.php$/', $file))
+ {
+ $name = str_replace($path.'/', '', $file);
+ $context['files'] .= ' '."\n";
+ }
+}
+
+$template = file_get_contents(dirname(__FILE__).'/package.xml.tpl');
+$content = preg_replace_callback('/\{\{\s*([a-zA-Z0-9_]+)\s*\}\}/', 'replace_parameters', $template);
+file_put_contents(dirname(__FILE__).'/package.xml', $content);
+
+function replace_parameters($matches)
+{
+ global $context;
+
+ return isset($context[$matches[1]]) ? $context[$matches[1]] : null;
+}
diff --git a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/SmtpTransport.php b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/SmtpTransport.php
index 6e61e1f..b134416 100644
--- a/vendor/swiftmailer/swiftmailer/lib/classes/Swift/SmtpTransport.php
+++ b/vendor/swiftmailer/swiftmailer/lib/classes/Swift/SmtpTransport.php
@@ -20,7 +20,7 @@ class Swift_SmtpTransport extends Swift_Transport_EsmtpTransport
* Create a new SmtpTransport, optionally with $host, $port and $security.
* @param string $host
* @param int $port
- * @param int $security
+ * @param string $security
*/
public function __construct($host = 'localhost', $port = 25, $security = null)
{
@@ -39,7 +39,7 @@ class Swift_SmtpTransport extends Swift_Transport_EsmtpTransport
* Create a new SmtpTransport instance.
* @param string $host
* @param int $port
- * @param int $security
+ * @param string $security
* @return Swift_SmtpTransport
*/
public static function newInstance($host = 'localhost', $port = 25, $security = null)
diff --git a/vendor/swiftmailer/swiftmailer/lib/swift_required.php b/vendor/swiftmailer/swiftmailer/lib/swift_required.php
index e7869a2..a5c842b 100644
--- a/vendor/swiftmailer/swiftmailer/lib/swift_required.php
+++ b/vendor/swiftmailer/swiftmailer/lib/swift_required.php
@@ -21,9 +21,11 @@ define('SWIFT_REQUIRED_LOADED', true);
//Load Swift utility class
require dirname(__FILE__) . '/classes/Swift.php';
-function _swiftmailer_init()
-{
- require dirname(__FILE__) . '/swift_init.php';
+if (!function_exists('_swiftmailer_init')) {
+ function _swiftmailer_init()
+ {
+ require dirname(__FILE__) . '/swift_init.php';
+ }
}
//Start the autoloader and lazy-load the init script to set up dependency injection
diff --git a/vendor/swiftmailer/swiftmailer/lib/swift_required_pear.php b/vendor/swiftmailer/swiftmailer/lib/swift_required_pear.php
index b29fc79..64ec497 100644
--- a/vendor/swiftmailer/swiftmailer/lib/swift_required_pear.php
+++ b/vendor/swiftmailer/swiftmailer/lib/swift_required_pear.php
@@ -21,9 +21,11 @@ define('SWIFT_REQUIRED_LOADED', true);
//Load Swift utility class
require dirname(__FILE__) . '/Swift.php';
-function _swiftmailer_init()
-{
- require dirname(__FILE__) . '/swift_init.php';
+if (!function_exists('_swiftmailer_init')) {
+ function _swiftmailer_init()
+ {
+ require dirname(__FILE__) . '/swift_init.php';
+ }
}
//Start the autoloader and lazy-load the init script to set up dependency injection
diff --git a/vendor/swiftmailer/swiftmailer/notes/APPS b/vendor/swiftmailer/swiftmailer/notes/APPS
new file mode 100644
index 0000000..b06b4cc
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/notes/APPS
@@ -0,0 +1,15 @@
+Applications I need to test with
+---------------------------------
+
+Standalone (can read .eml files):
+---------------------------------
+Microsoft Entourage (can assume same as outlook)
+Mozilla Thunderbird
+Apple Mail
+
+Web-based:
+----------
+Hotmail
+Gmail
+Yahoo!
+Mail2Web
diff --git a/vendor/swiftmailer/swiftmailer/notes/CHARSETS b/vendor/swiftmailer/swiftmailer/notes/CHARSETS
new file mode 100644
index 0000000..6a97a89
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/notes/CHARSETS
@@ -0,0 +1,46 @@
+Following is a list of character sets along with their widths:
+--------------------------------------------------------------
+
+1 Octet 8bit:
+-------------
+Windows 125* (CP125*)
+CP*
+ANSI
+ISO-8859-* (IEC-8859-*)
+Macintosh (Mac OS Roman)
+KOI8-U (potentially KOI*8-*)
+KOI8-R
+MIK
+Cork (T1)
+ISCII
+VISCII
+
+
+1 Octet 7bit:
+-------------
+US-ASCII
+K0I7
+
+2 octets 16 bit:
+----------------
+UCS-2
+UTF-16* (UTF-16BE etc)
+
+4-octets 32 bit:
+----------------
+UCS-4
+UTF-32
+
+Variable-width:
+----------------------------
+Big5 - http://en.wikipedia.org/wiki/Big5 (1-2 bytes: 00-7f=1, 81-fe=2)
+HKSCS - http://en.wikipedia.org/wiki/HKSCS (a big5 variant, but some variants use 10646)
+ISO-10646 (IEC-10646) - http://en.wikipedia.org/wiki/ISO_10646 (unicode)
+UTF-8 (1-5 bytes)
+ISO-2022 (IEC-2022) - http://en.wikipedia.org/wiki/ISO_2022
+Shift-JIS - http://en.wikipedia.org/wiki/Shift-JIS
+
+A good resource:
+----------------
+http://en.wikipedia.org/wiki/Character_encoding#Simple_character_sets
+
diff --git a/vendor/swiftmailer/swiftmailer/notes/message.xml b/vendor/swiftmailer/swiftmailer/notes/message.xml
new file mode 100644
index 0000000..1183eca
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/notes/message.xml
@@ -0,0 +1,22 @@
+
+
+ Some test message
+ chris@w3style.co.uk
+ mark@swiftmailer.org
+ chris.corbyn@sitepoint.com
+ text/plain
+
+ Here's a recipe for beef stifado
+
+
+ text/html
+
+ This is the other part
+
+
+
+ application/pdf
+ stifado.pdf
+ /path/to/stifado.pdf
+
+
diff --git a/vendor/swiftmailer/swiftmailer/notes/rfc/rfc0821.txt b/vendor/swiftmailer/swiftmailer/notes/rfc/rfc0821.txt
new file mode 100644
index 0000000..d877b72
--- /dev/null
+++ b/vendor/swiftmailer/swiftmailer/notes/rfc/rfc0821.txt
@@ -0,0 +1,4050 @@
+
+
+
+ RFC 821
+
+
+
+
+
+ SIMPLE MAIL TRANSFER PROTOCOL
+
+
+
+ Jonathan B. Postel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ August 1982
+
+
+
+ Information Sciences Institute
+ University of Southern California
+ 4676 Admiralty Way
+ Marina del Rey, California 90291
+
+ (213) 822-1511
+
+
+
+
+RFC 821 August 1982
+ Simple Mail Transfer Protocol
+
+
+
+ TABLE OF CONTENTS
+
+ 1. INTRODUCTION .................................................. 1
+
+ 2. THE SMTP MODEL ................................................ 2
+
+ 3. THE SMTP PROCEDURE ............................................ 4
+
+ 3.1. Mail ..................................................... 4
+ 3.2. Forwarding ............................................... 7
+ 3.3. Verifying and Expanding .................................. 8
+ 3.4. Sending and Mailing ..................................... 11
+ 3.5. Opening and Closing ..................................... 13
+ 3.6. Relaying ................................................ 14
+ 3.7. Domains ................................................. 17
+ 3.8. Changing Roles .......................................... 18
+
+ 4. THE SMTP SPECIFICATIONS ...................................... 19
+
+ 4.1. SMTP Commands ........................................... 19
+ 4.1.1. Command Semantics ..................................... 19
+ 4.1.2. Command Syntax ........................................ 27
+ 4.2. SMTP Replies ............................................ 34
+ 4.2.1. Reply Codes by Function Group ......................... 35
+ 4.2.2. Reply Codes in Numeric Order .......................... 36
+ 4.3. Sequencing of Commands and Replies ...................... 37
+ 4.4. State Diagrams .......................................... 39
+ 4.5. Details ................................................. 41
+ 4.5.1. Minimum Implementation ................................ 41
+ 4.5.2. Transparency .......................................... 41
+ 4.5.3. Sizes ................................................. 42
+
+ APPENDIX A: TCP ................................................. 44
+ APPENDIX B: NCP ................................................. 45
+ APPENDIX C: NITS ................................................ 46
+ APPENDIX D: X.25 ................................................ 47
+ APPENDIX E: Theory of Reply Codes ............................... 48
+ APPENDIX F: Scenarios ........................................... 51
+
+ GLOSSARY ......................................................... 64
+
+ REFERENCES ....................................................... 67
+
+
+
+
+Network Working Group J. Postel
+Request for Comments: DRAFT ISI
+Replaces: RFC 788, 780, 772 August 1982
+
+ SIMPLE MAIL TRANSFER PROTOCOL
+
+
+1. INTRODUCTION
+
+ The objective of Simple Mail Transfer Protocol (SMTP) is to transfer
+ mail reliably and efficiently.
+
+ SMTP is independent of the particular transmission subsystem and
+ requires only a reliable ordered data stream channel. Appendices A,
+ B, C, and D describe the use of SMTP with various transport services.
+ A Glossary provides the definitions of terms as used in this
+ document.
+
+ An important feature of SMTP is its capability to relay mail across
+ transport service environments. A transport service provides an
+ interprocess communication environment (IPCE). An IPCE may cover one
+ network, several networks, or a subset of a network. It is important
+ to realize that transport systems (or IPCEs) are not one-to-one with
+ networks. A process can communicate directly with another process
+ through any mutually known IPCE. Mail is an application or use of
+ interprocess communication. Mail can be communicated between
+ processes in different IPCEs by relaying through a process connected
+ to two (or more) IPCEs. More specifically, mail can be relayed
+ between hosts on different transport systems by a host on both
+ transport systems.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Postel [Page 1]
+
+
+
+August 1982 RFC 821
+Simple Mail Transfer Protocol
+
+
+
+2. THE SMTP MODEL
+
+ The SMTP design is based on the following model of communication: as
+ the result of a user mail request, the sender-SMTP establishes a
+ two-way transmission channel to a receiver-SMTP. The receiver-SMTP
+ may be either the ultimate destination or an intermediate. SMTP
+ commands are generated by the sender-SMTP and sent to the
+ receiver-SMTP. SMTP replies are sent from the receiver-SMTP to the
+ sender-SMTP in response to the commands.
+
+ Once the transmission channel is established, the SMTP-sender sends a
+ MAIL command indicating the sender of the mail. If the SMTP-receiver
+ can accept mail it responds with an OK reply. The SMTP-sender then
+ sends a RCPT command identifying a recipient of the mail. If the
+ SMTP-receiver can accept mail for that recipient it responds with an
+ OK reply; if not, it responds with a reply rejecting that recipient
+ (but not the whole mail transaction). The SMTP-sender and
+ SMTP-receiver may negotiate several recipients. When the recipients
+ have been negotiated the SMTP-sender sends the mail data, terminating
+ with a special sequence. If the SMTP-receiver successfully processes
+ the mail data it responds with an OK reply. The dialog is purposely
+ lock-step, one-at-a-time.
+
+ -------------------------------------------------------------
+
+
+ +----------+ +----------+
+ +------+ | | | |
+ | User |<-->| | SMTP | |
+ +------+ | Sender- |Commands/Replies| Receiver-|
+ +------+ | SMTP |<-------------->| SMTP | +------+
+ | File |<-->| | and Mail | |<-->| File |
+ |System| | | | | |System|
+ +------+ +----------+ +----------+ +------+
+
+
+ Sender-SMTP Receiver-SMTP
+
+ Model for SMTP Use
+
+ Figure 1
+
+ -------------------------------------------------------------
+
+ The SMTP provides mechanisms for the transmission of mail; directly
+ from the sending user's host to the receiving user's host when the
+
+
+
+[Page 2] Postel
+
+
+
+RFC 821 August 1982
+ Simple Mail Transfer Protocol
+
+
+
+ two host are connected to the same transport service, or via one or
+ more relay SMTP-servers when the source and destination hosts are not
+ connected to the same transport service.
+
+ To be able to provide the relay capability the SMTP-server must be
+ supplied with the name of the ultimate destination host as well as
+ the destination mailbox name.
+
+ The argument to the MAIL command is a reverse-path, which specifies
+ who the mail is from. The argument to the RCPT command is a
+ forward-path, which specifies who the mail is to. The forward-path
+ is a source route, while the reverse-path is a return route (which
+ may be used to return a message to the sender when an error occurs
+ with a relayed message).
+
+ When the same message is sent to multiple recipients the SMTP
+ encourages the transmission of only one copy of the data for all the
+ recipients at the same destination host.
+
+ The mail commands and replies have a rigid syntax. Replies also have
+ a numeric code. In the following, examples appear which use actual
+ commands and replies. The complete lists of commands and replies
+ appears in Section 4 on specifications.
+
+ Commands and replies are not case sensitive. That is, a command or
+ reply word may be upper case, lower case, or any mixture of upper and
+ lower case. Note that this is not true of mailbox user names. For
+ some hosts the user name is case sensitive, and SMTP implementations
+ must take case to preserve the case of user names as they appear in
+ mailbox arguments. Host names are not case sensitive.
+
+ Commands and replies are composed of characters from the ASCII
+ character set [1]. When the transport service provides an 8-bit byte
+ (octet) transmission channel, each 7-bit character is transmitted
+ right justified in an octet with the high order bit cleared to zero.
+
+ When specifying the general form of a command or reply, an argument
+ (or special symbol) will be denoted by a meta-linguistic variable (or
+ constant), for example, "" or "". Here the
+ angle brackets indicate these are meta-linguistic variables.
+ However, some arguments use the angle brackets literally. For
+ example, an actual reverse-path is enclosed in angle brackets, i.e.,
+ "" is an instance of (the
+ angle brackets are actually transmitted in the command or reply).
+
+
+
+
+
+Postel [Page 3]
+
+
+
+August 1982 RFC 821
+Simple Mail Transfer Protocol
+
+
+
+3. THE SMTP PROCEDURES
+
+ This section presents the procedures used in SMTP in several parts.
+ First comes the basic mail procedure defined as a mail transaction.
+ Following this are descriptions of forwarding mail, verifying mailbox
+ names and expanding mailing lists, sending to terminals instead of or
+ in combination with mailboxes, and the opening and closing exchanges.
+ At the end of this section are comments on relaying, a note on mail
+ domains, and a discussion of changing roles. Throughout this section
+ are examples of partial command and reply sequences, several complete
+ scenarios are presented in Appendix F.
+
+ 3.1. MAIL
+
+ There are three steps to SMTP mail transactions. The transaction
+ is started with a MAIL command which gives the sender
+ identification. A series of one or more RCPT commands follows
+ giving the receiver information. Then a DATA command gives the
+ mail data. And finally, the end of mail data indicator confirms
+ the transaction.
+
+ The first step in the procedure is the MAIL command. The
+ contains the source mailbox.
+
+ MAIL FROM:
+
+ This command tells the SMTP-receiver that a new mail
+ transaction is starting and to reset all its state tables and
+ buffers, including any recipients or mail data. It gives the
+ reverse-path which can be used to report errors. If accepted,
+ the receiver-SMTP returns a 250 OK reply.
+
+ The can contain more than just a mailbox. The
+ is a reverse source routing list of hosts and
+ source mailbox. The first host in the should be
+ the host sending this command.
+
+ The second step in the procedure is the RCPT command.
+
+ RCPT TO:
+
+ This command gives a forward-path identifying one recipient.
+ If accepted, the receiver-SMTP returns a 250 OK reply, and
+ stores the forward-path. If the recipient is unknown the
+ receiver-SMTP returns a 550 Failure reply. This second step of
+ the procedure can be repeated any number of times.
+
+
+
+[Page 4] Postel
+
+
+
+RFC 821 August 1982
+ Simple Mail Transfer Protocol
+
+
+
+ The can contain more than just a mailbox. The
+ is a source routing list of hosts and the
+ destination mailbox. The first host in the
+ should be the host receiving this command.
+
+ The third step in the procedure is the DATA command.
+
+ DATA
+
+ If accepted, the receiver-SMTP returns a 354 Intermediate reply
+ and considers all succeeding lines to be the message text.
+ When the end of text is received and stored the SMTP-receiver
+ sends a 250 OK reply.
+
+ Since the mail data is sent on the transmission channel the end
+ of the mail data must be indicated so that the command and
+ reply dialog can be resumed. SMTP indicates the end of the
+ mail data by sending a line containing only a period. A
+ transparency procedure is used to prevent this from interfering
+ with the user's text (see Section 4.5.2).
+
+ Please note that the mail data includes the memo header
+ items such as Date, Subject, To, Cc, From [2].
+
+ The end of mail data indicator also confirms the mail
+ transaction and tells the receiver-SMTP to now process the
+ stored recipients and mail data. If accepted, the
+ receiver-SMTP returns a 250 OK reply. The DATA command should
+ fail only if the mail transaction was incomplete (for example,
+ no recipients), or if resources are not available.
+
+ The above procedure is an example of a mail transaction. These
+ commands must be used only in the order discussed above.
+ Example 1 (below) illustrates the use of these commands in a mail
+ transaction.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Postel [Page 5]
+
+
+
+August 1982 RFC 821
+Simple Mail Transfer Protocol
+
+
+
+ -------------------------------------------------------------
+
+ Example of the SMTP Procedure
+
+ This SMTP example shows mail sent by Smith at host Alpha.ARPA,
+ to Jones, Green, and Brown at host Beta.ARPA. Here we assume
+ that host Alpha contacts host Beta directly.
+
+ S: MAIL FROM:
+ R: 250 OK
+
+ S: RCPT TO:
+ R: 250 OK
+
+ S: RCPT TO:
+ R: 550 No such user here
+
+ S: RCPT TO:
+ R: 250 OK
+
+ S: DATA
+ R: 354 Start mail input; end with .
+ S: Blah blah blah...
+ S: ...etc. etc. etc.
+ S: .
+ R: 250 OK
+
+ The mail has now been accepted for Jones and Brown. Green did
+ not have a mailbox at host Beta.
+
+ Example 1
+
+ -------------------------------------------------------------
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[Page 6] Postel
+
+
+
+RFC 821 August 1982
+ Simple Mail Transfer Protocol
+
+
+
+ 3.2. FORWARDING
+
+ There are some cases where the destination information in the
+ is incorrect, but the receiver-SMTP knows the
+ correct destination. In such cases, one of the following replies
+ should be used to allow the sender to contact the correct
+ destination.
+
+ 251 User not local; will forward to
+
+ This reply indicates that the receiver-SMTP knows the user's
+ mailbox is on another host and indicates the correct
+ forward-path to use in the future. Note that either the
+ host or user or both may be different. The receiver takes
+ responsibility for delivering the message.
+
+ 551 User not local; please try
+
+ This reply indicates that the receiver-SMTP knows the user's
+ mailbox is on another host and indicates the correct
+ forward-path to use. Note that either the host or user or
+ both may be different. The receiver refuses to accept mail
+ for this user, and the sender must either redirect the mail
+ according to the information provided or return an error
+ response to the originating user.
+
+ Example 2 illustrates the use of these responses.
+
+ -------------------------------------------------------------
+
+ Example of Forwarding
+
+ Either
+
+ S: RCPT TO:
+ R: 251 User not local; will forward to
+
+ Or
+
+ S: RCPT TO:
+ R: 551 User not local; please try
+
+ Example 2
+
+ -------------------------------------------------------------
+
+
+
+
+Postel [Page 7]
+
+
+
+August 1982 RFC 821
+Simple Mail Transfer Protocol
+
+
+
+ 3.3. VERIFYING AND EXPANDING
+
+ SMTP provides as additional features, commands to verify a user
+ name or expand a mailing list. This is done with the VRFY and
+ EXPN commands, which have character string arguments. For the
+ VRFY command, the string is a user name, and the response may
+ include the full name of the user and must include the mailbox of
+ the user. For the EXPN command, the string identifies a mailing
+ list, and the multiline response may include the full name of the
+ users and must give the mailboxes on the mailing list.
+
+ "User name" is a fuzzy term and used purposely. If a host
+ implements the VRFY or EXPN commands then at least local mailboxes
+ must be recognized as "user names". If a host chooses to
+ recognize other strings as "user names" that is allowed.
+
+ In some hosts the distinction between a mailing list and an alias
+ for a single mailbox is a bit fuzzy, since a common data structure
+ may hold both types of entries, and it is possible to have mailing
+ lists of one mailbox. If a request is made to verify a mailing
+ list a positive response can be given if on receipt of a message
+ so addressed it will be delivered to everyone on the list,
+ otherwise an error should be reported (e.g., "550 That is a
+ mailing list, not a user"). If a request is made to expand a user
+ name a positive response can be formed by returning a list
+ containing one name, or an error can be reported (e.g., "550 That
+ is a user name, not a mailing list").
+
+ In the case of a multiline reply (normal for EXPN) exactly one
+ mailbox is to be specified on each line of the reply. In the case
+ of an ambiguous request, for example, "VRFY Smith", where there
+ are two Smith's the response must be "553 User ambiguous".
+
+ The case of verifying a user name is straightforward as shown in
+ example 3.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[Page 8] Postel
+
+
+
+RFC 821 August 1982
+ Simple Mail Transfer Protocol
+
+
+
+ -------------------------------------------------------------
+
+ Example of Verifying a User Name
+
+ Either
+
+ S: VRFY Smith
+ R: 250 Fred Smith
+
+ Or
+
+ S: VRFY Smith
+ R: 251 User not local; will forward to
+
+ Or
+
+ S: VRFY Jones
+ R: 550 String does not match anything.
+
+ Or
+
+ S: VRFY Jones
+ R: 551 User not local; please try
+
+ Or
+
+ S: VRFY Gourzenkyinplatz
+ R: 553 User ambiguous.
+
+ Example 3
+
+ -------------------------------------------------------------
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Postel [Page 9]
+
+
+
+August 1982 RFC 821
+Simple Mail Transfer Protocol
+
+
+
+ The case of expanding a mailbox list requires a multiline reply as
+ shown in example 4.
+
+ -------------------------------------------------------------
+
+ Example of Expanding a Mailing List
+
+ Either
+
+ S: EXPN Example-People
+ R: 250-Jon Postel
+ R: 250-Fred Fonebone
+ R: 250-Sam Q. Smith
+ R: 250-Quincy Smith <@USC-ISIF.ARPA:Q-Smith@ISI-VAXA.ARPA>
+ R: 250-
+ R: 250
+
+ Or
+
+ S: EXPN Executive-Washroom-List
+ R: 550 Access Denied to You.
+
+ Example 4
+
+ -------------------------------------------------------------
+
+ The character string arguments of the VRFY and EXPN commands
+ cannot be further restricted due to the variety of implementations
+ of the user name and mailbox list concepts. On some systems it
+ may be appropriate for the argument of the EXPN command to be a
+ file name for a file containing a mailing list, but again there is
+ a variety of file naming conventions in the Internet.
+
+ The VRFY and EXPN commands are not included in the minimum
+ implementation (Section 4.5.1), and are not required to work
+ across relays when they are implemented.
+
+
+
+
+
+
+
+
+
+
+
+
+
+[Page 10] Postel
+
+
+
+RFC 821 August 1982
+ Simple Mail Transfer Protocol
+
+
+
+ 3.4. SENDING AND MAILING
+
+ The main purpose of SMTP is to deliver messages to user's
+ mailboxes. A very similar service provided by some hosts is to
+ deliver messages to user's terminals (provided the user is active
+ on the host). The delivery to the user's mailbox is called
+ "mailing", the delivery to the user's terminal is called
+ "sending". Because in many hosts the implementation of sending is
+ nearly identical to the implementation of mailing these two
+ functions are combined in SMTP. However the sending commands are
+ not included in the required minimum implementation
+ (Section 4.5.1). Users should have the ability to control the
+ writing of messages on their terminals. Most hosts permit the
+ users to accept or refuse such messages.
+
+ The following three command are defined to support the sending
+ options. These are used in the mail transaction instead of the
+ MAIL command and inform the receiver-SMTP of the special semantics
+ of this transaction:
+
+ SEND FROM:
+
+ The SEND command requires that the mail data be delivered to
+ the user's terminal. If the user is not active (or not
+ accepting terminal messages) on the host a 450 reply may
+ returned to a RCPT command. The mail transaction is
+ successful if the message is delivered the terminal.
+
+ SOML FROM:
+
+ The Send Or MaiL command requires that the mail data be
+ delivered to the user's terminal if the user is active (and
+ accepting terminal messages) on the host. If the user is
+ not active (or not accepting terminal messages) then the
+ mail data is entered into the user's mailbox. The mail
+ transaction is successful if the message is delivered either
+ to the terminal or the mailbox.
+
+ SAML FROM:
+
+ The Send And MaiL command requires that the mail data be
+ delivered to the user's terminal if the user is active (and
+ accepting terminal messages) on the host. In any case the
+ mail data is entered into the user's mailbox. The mail
+ transaction is successful if the message is delivered the
+ mailbox.
+
+
+
+Postel [Page 11]
+
+
+
+August 1982 RFC 821
+Simple Mail Transfer Protocol
+
+
+
+ The same reply codes that are used for the MAIL commands are used
+ for these commands.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[Page 12] Postel
+
+
+
+RFC 821 August 1982
+ Simple Mail Transfer Protocol
+
+
+
+ 3.5. OPENING AND CLOSING
+
+ At the time the transmission channel is opened there is an
+ exchange to ensure that the hosts are communicating with the hosts
+ they think they are.
+
+ The following two commands are used in transmission channel
+ opening and closing:
+
+ HELO
+
+ QUIT
+
+ In the HELO command the host sending the command identifies
+ itself; the command may be interpreted as saying "Hello, I am
+ ".
+
+ -------------------------------------------------------------
+
+ Example of Connection Opening
+
+ R: 220 BBN-UNIX.ARPA Simple Mail Transfer Service Ready
+ S: HELO USC-ISIF.ARPA
+ R: 250 BBN-UNIX.ARPA
+
+ Example 5
+
+ -------------------------------------------------------------
+
+ -------------------------------------------------------------
+
+ Example of Connection Closing
+
+ S: QUIT
+ R: 221 BBN-UNIX.ARPA Service closing transmission channel
+
+ Example 6
+
+ -------------------------------------------------------------
+
+
+
+
+
+
+
+
+
+
+Postel [Page 13]
+
+
+
+August 1982 RFC 821
+Simple Mail Transfer Protocol
+
+
+
+ 3.6. RELAYING
+
+ The forward-path may be a source route of the form
+ "@ONE,@TWO:JOE@THREE", where ONE, TWO, and THREE are hosts. This
+ form is used to emphasize the distinction between an address and a
+ route. The mailbox is an absolute address, and the route is
+ information about how to get there. The two concepts should not
+ be confused.
+
+ Conceptually the elements of the forward-path are moved to the
+ reverse-path as the message is relayed from one server-SMTP to
+ another. The reverse-path is a reverse source route, (i.e., a
+ source route from the current location of the message to the
+ originator of the message). When a server-SMTP deletes its
+ identifier from the forward-path and inserts it into the
+ reverse-path, it must use the name it is known by in the
+ environment it is sending into, not the environment the mail came
+ from, in case the server-SMTP is known by different names in
+ different environments.
+
+ If when the message arrives at an SMTP the first element of the
+ forward-path is not the identifier of that SMTP the element is not
+ deleted from the forward-path and is used to determine the next
+ SMTP to send the message to. In any case, the SMTP adds its own
+ identifier to the reverse-path.
+
+ Using source routing the receiver-SMTP receives mail to be relayed
+ to another server-SMTP The receiver-SMTP may accept or reject the
+ task of relaying the mail in the same way it accepts or rejects
+ mail for a local user. The receiver-SMTP transforms the command
+ arguments by moving its own identifier from the forward-path to
+ the beginning of the reverse-path. The receiver-SMTP then becomes
+ a sender-SMTP, establishes a transmission channel to the next SMTP
+ in the forward-path, and sends it the mail.
+
+ The first host in the reverse-path should be the host sending the
+ SMTP commands, and the first host in the forward-path should be
+ the host receiving the SMTP commands.
+
+ Notice that the forward-path and reverse-path appear in the SMTP
+ commands and replies, but not necessarily in the message. That
+ is, there is no need for these paths and especially this syntax to
+ appear in the "To:" , "From:", "CC:", etc. fields of the message
+ header.
+
+ If a server-SMTP has accepted the task of relaying the mail and
+
+
+
+[Page 14] Postel
+
+
+
+RFC 821 August 1982
+ Simple Mail Transfer Protocol
+
+
+
+ later finds that the forward-path is incorrect or that the mail
+ cannot be delivered for whatever reason, then it must construct an
+ "undeliverable mail" notification message and send it to the
+ originator of the undeliverable mail (as indicated by the
+ reverse-path).
+
+ This notification message must be from the server-SMTP at this
+ host. Of course, server-SMTPs should not send notification
+ messages about problems with notification messages. One way to
+ prevent loops in error reporting is to specify a null reverse-path
+ in the MAIL command of a notification message. When such a
+ message is relayed it is permissible to leave the reverse-path
+ null. A MAIL command with a null reverse-path appears as follows:
+
+ MAIL FROM:<>
+
+ An undeliverable mail notification message is shown in example 7.
+ This notification is in response to a message originated by JOE at
+ HOSTW and sent via HOSTX to HOSTY with instructions to relay it on
+ to HOSTZ. What we see in the example is the transaction between
+ HOSTY and HOSTX, which is the first step in the return of the
+ notification message.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Postel [Page 15]
+
+
+
+August 1982 RFC 821
+Simple Mail Transfer Protocol
+
+
+
+ -------------------------------------------------------------
+
+ Example Undeliverable Mail Notification Message
+
+ S: MAIL FROM:<>
+ R: 250 ok
+ S: RCPT TO:<@HOSTX.ARPA:JOE@HOSTW.ARPA>
+ R: 250 ok
+ S: DATA
+ R: 354 send the mail data, end with .
+ S: Date: 23 Oct 81 11:22:33
+ S: From: SMTP@HOSTY.ARPA
+ S: To: JOE@HOSTW.ARPA
+ S: Subject: Mail System Problem
+ S:
+ S: Sorry JOE, your message to SAM@HOSTZ.ARPA lost.
+ S: HOSTZ.ARPA said this:
+ S: "550 No Such User"
+ S: .
+ R: 250 ok
+
+ Example 7
+
+ -------------------------------------------------------------
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[Page 16] Postel
+
+
+
+RFC 821 August 1982
+ Simple Mail Transfer Protocol
+
+
+
+ 3.7. DOMAINS
+
+ Domains are a recently introduced concept in the ARPA Internet
+ mail system. The use of domains changes the address space from a
+ flat global space of simple character string host names to a
+ hierarchically structured rooted tree of global addresses. The
+ host name is replaced by a domain and host designator which is a
+ sequence of domain element strings separated by periods with the
+ understanding that the domain elements are ordered from the most
+ specific to the most general.
+
+ For example, "USC-ISIF.ARPA", "Fred.Cambridge.UK", and
+ "PC7.LCS.MIT.ARPA" might be host-and-domain identifiers.
+
+ Whenever domain names are used in SMTP only the official names are
+ used, the use of nicknames or aliases is not allowed.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Postel [Page 17]
+
+
+
+August 1982 RFC 821
+Simple Mail Transfer Protocol
+
+
+
+ 3.8. CHANGING ROLES
+
+ The TURN command may be used to reverse the roles of the two
+ programs communicating over the transmission channel.
+
+ If program-A is currently the sender-SMTP and it sends the TURN
+ command and receives an ok reply (250) then program-A becomes the
+ receiver-SMTP.
+
+ If program-B is currently the receiver-SMTP and it receives the
+ TURN command and sends an ok reply (250) then program-B becomes
+ the sender-SMTP.
+
+ To refuse to change roles the receiver sends the 502 reply.
+
+ Please note that this command is optional. It would not normally
+ be used in situations where the transmission channel is TCP.
+ However, when the cost of establishing the transmission channel is
+ high, this command may be quite useful. For example, this command
+ may be useful in supporting be mail exchange using the public
+ switched telephone system as a transmission channel, especially if
+ some hosts poll other hosts for mail exchanges.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[Page 18] Postel
+
+
+
+RFC 821 August 1982
+ Simple Mail Transfer Protocol
+
+
+
+4. THE SMTP SPECIFICATIONS
+
+ 4.1. SMTP COMMANDS
+
+ 4.1.1. COMMAND SEMANTICS
+
+ The SMTP commands define the mail transfer or the mail system
+ function requested by the user. SMTP commands are character
+ strings terminated by . The command codes themselves are
+ alphabetic characters terminated by if parameters follow
+ and otherwise. The syntax of mailboxes must conform to
+ receiver site conventions. The SMTP commands are discussed
+ below. The SMTP replies are discussed in the Section 4.2.
+
+ A mail transaction involves several data objects which are
+ communicated as arguments to different commands. The
+ reverse-path is the argument of the MAIL command, the
+ forward-path is the argument of the RCPT command, and the mail
+ data is the argument of the DATA command. These arguments or
+ data objects must be transmitted and held pending the
+ confirmation communicated by the end of mail data indication
+ which finalizes the transaction. The model for this is that
+ distinct buffers are provided to hold the types of data
+ objects, that is, there is a reverse-path buffer, a
+ forward-path buffer, and a mail data buffer. Specific commands
+ cause information to be appended to a specific buffer, or cause
+ one or more buffers to be cleared.
+
+ HELLO (HELO)
+
+ This command is used to identify the sender-SMTP to the
+ receiver-SMTP. The argument field contains the host name of
+ the sender-SMTP.
+
+ The receiver-SMTP identifies itself to the sender-SMTP in
+ the connection greeting reply, and in the response to this
+ command.
+
+ This command and an OK reply to it confirm that both the
+ sender-SMTP and the receiver-SMTP are in the initial state,
+ that is, there is no transaction in progress and all state
+ tables and buffers are cleared.
+
+
+
+
+
+
+
+Postel [Page 19]
+
+
+
+August 1982 RFC 821
+Simple Mail Transfer Protocol
+
+
+
+ MAIL (MAIL)
+
+ This command is used to initiate a mail transaction in which
+ the mail data is delivered to one or more mailboxes. The
+ argument field contains a reverse-path.
+
+ The reverse-path consists of an optional list of hosts and
+ the sender mailbox. When the list of hosts is present, it
+ is a "reverse" source route and indicates that the mail was
+ relayed through each host on the list (the first host in the
+ list was the most recent relay). This list is used as a
+ source route to return non-delivery notices to the sender.
+ As each relay host adds itself to the beginning of the list,
+ it must use its name as known in the IPCE to which it is
+ relaying the mail rather than the IPCE from which the mail
+ came (if they are different). In some types of error
+ reporting messages (for example, undeliverable mail
+ notifications) the reverse-path may be null (see Example 7).
+
+ This command clears the reverse-path buffer, the
+ forward-path buffer, and the mail data buffer; and inserts
+ the reverse-path information from this command into the
+ reverse-path buffer.
+
+ RECIPIENT (RCPT)
+
+ This command is used to identify an individual recipient of
+ the mail data; multiple recipients are specified by multiple
+ use of this command.
+
+ The forward-path consists of an optional list of hosts and a
+ required destination mailbox. When the list of hosts is
+ present, it is a source route and indicates that the mail
+ must be relayed to the next host on the list. If the
+ receiver-SMTP does not implement the relay function it may
+ user the same reply it would for an unknown local user
+ (550).
+
+ When mail is relayed, the relay host must remove itself from
+ the beginning forward-path and put itself at the beginning
+ of the reverse-path. When mail reaches its ultimate
+ destination (the forward-path contains only a destination
+ mailbox), the receiver-SMTP inserts it into the destination
+ mailbox in accordance with its host mail conventions.
+
+
+
+
+
+[Page 20] Postel
+
+
+
+RFC 821 August 1982
+ Simple Mail Transfer Protocol
+
+
+
+ For example, mail received at relay host A with arguments
+
+ FROM:
+ TO:<@HOSTA.ARPA,@HOSTB.ARPA:USERC@HOSTD.ARPA>
+
+ will be relayed on to host B with arguments
+
+ FROM:<@HOSTA.ARPA:USERX@HOSTY.ARPA>
+ TO:<@HOSTB.ARPA:USERC@HOSTD.ARPA>.
+
+ This command causes its forward-path argument to be appended
+ to the forward-path buffer.
+
+ DATA (DATA)
+
+ The receiver treats the lines following the command as mail
+ data from the sender. This command causes the mail data
+ from this command to be appended to the mail data buffer.
+ The mail data may contain any of the 128 ASCII character
+ codes.
+
+ The mail data is terminated by a line containing only a
+ period, that is the character sequence "." (see
+ Section 4.5.2 on Transparency). This is the end of mail
+ data indication.
+
+ The end of mail data indication requires that the receiver
+ must now process the stored mail transaction information.
+ This processing consumes the information in the reverse-path
+ buffer, the forward-path buffer, and the mail data buffer,
+ and on the completion of this command these buffers are
+ cleared. If the processing is successful the receiver must
+ send an OK reply. If the processing fails completely the
+ receiver must send a failure reply.
+
+ When the receiver-SMTP accepts a message either for relaying
+ or for final delivery it inserts at the beginning of the
+ mail data a time stamp line. The time stamp line indicates
+ the identity of the host that sent the message, and the
+ identity of the host that received the message (and is
+ inserting this time stamp), and the date and time the
+ message was received. Relayed messages will have multiple
+ time stamp lines.
+
+ When the receiver-SMTP makes the "final delivery" of a
+ message it inserts at the beginning of the mail data a
+
+
+
+Postel [Page 21]
+
+
+
+August 1982 RFC 821
+Simple Mail Transfer Protocol
+
+
+
+ return path line. The return path line preserves the
+ information in the from the MAIL command.
+ Here, final delivery means the message leaves the SMTP
+ world. Normally, this would mean it has been delivered to
+ the destination user, but in some cases it may be further
+ processed and transmitted by another mail system.
+
+ It is possible for the mailbox in the return path be
+ different from the actual sender's mailbox, for example,
+ if error responses are to be delivered a special error
+ handling mailbox rather than the message senders.
+
+ The preceding two paragraphs imply that the final mail data
+ will begin with a return path line, followed by one or more
+ time stamp lines. These lines will be followed by the mail
+ data header and body [2]. See Example 8.
+
+ Special mention is needed of the response and further action
+ required when the processing following the end of mail data
+ indication is partially successful. This could arise if
+ after accepting several recipients and the mail data, the
+ receiver-SMTP finds that the mail data can be successfully
+ delivered to some of the recipients, but it cannot be to
+ others (for example, due to mailbox space allocation
+ problems). In such a situation, the response to the DATA
+ command must be an OK reply. But, the receiver-SMTP must
+ compose and send an "undeliverable mail" notification
+ message to the originator of the message. Either a single
+ notification which lists all of the recipients that failed
+ to get the message, or separate notification messages must
+ be sent for each failed recipient (see Example 7). All
+ undeliverable mail notification messages are sent using the
+ MAIL command (even if they result from processing a SEND,
+ SOML, or SAML command).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[Page 22] Postel
+
+
+
+RFC 821 August 1982
+ Simple Mail Transfer Protocol
+
+
+
+ -------------------------------------------------------------
+
+ Example of Return Path and Received Time Stamps
+
+ Return-Path: <@GHI.ARPA,@DEF.ARPA,@ABC.ARPA:JOE@ABC.ARPA>
+ Received: from GHI.ARPA by JKL.ARPA ; 27 Oct 81 15:27:39 PST
+ Received: from DEF.ARPA by GHI.ARPA ; 27 Oct 81 15:15:13 PST
+ Received: from ABC.ARPA by DEF.ARPA ; 27 Oct 81 15:01:59 PST
+ Date: 27 Oct 81 15:01:01 PST
+ From: JOE@ABC.ARPA
+ Subject: Improved Mailing System Installed
+ To: SAM@JKL.ARPA
+
+ This is to inform you that ...
+
+ Example 8
+
+ -------------------------------------------------------------
+
+ SEND (SEND)
+
+ This command is used to initiate a mail transaction in which
+ the mail data is delivered to one or more terminals. The
+ argument field contains a reverse-path. This command is
+ successful if the message is delivered to a terminal.
+
+ The reverse-path consists of an optional list of hosts and
+ the sender mailbox. When the list of hosts is present, it
+ is a "reverse" source route and indicates that the mail was
+ relayed through each host on the list (the first host in the
+ list was the most recent relay). This list is used as a
+ source route to return non-delivery notices to the sender.
+ As each relay host adds itself to the beginning of the list,
+ it must use its name as known in the IPCE to which it is
+ relaying the mail rather than the IPCE from which the mail
+ came (if they are different).
+
+ This command clears the reverse-path buffer, the
+ forward-path buffer, and the mail data buffer; and inserts
+ the reverse-path information from this command into the
+ reverse-path buffer.
+
+ SEND OR MAIL (SOML)
+
+ This command is used to initiate a mail transaction in which
+ the mail data is delivered to one or more terminals or
+
+
+
+Postel [Page 23]
+
+
+
+August 1982 RFC 821
+Simple Mail Transfer Protocol
+
+
+
+ mailboxes. For each recipient the mail data is delivered to
+ the recipient's terminal if the recipient is active on the
+ host (and accepting terminal messages), otherwise to the
+ recipient's mailbox. The argument field contains a
+ reverse-path. This command is successful if the message is
+ delivered to a terminal or the mailbox.
+
+ The reverse-path consists of an optional list of hosts and
+ the sender mailbox. When the list of hosts is present, it
+ is a "reverse" source route and indicates that the mail was
+ relayed through each host on the list (the first host in the
+ list was the most recent relay). This list is used as a
+ source route to return non-delivery notices to the sender.
+ As each relay host adds itself to the beginning of the list,
+ it must use its name as known in the IPCE to which it is
+ relaying the mail rather than the IPCE from which the mail
+ came (if they are different).
+
+ This command clears the reverse-path buffer, the
+ forward-path buffer, and the mail data buffer; and inserts
+ the reverse-path information from this command into the
+ reverse-path buffer.
+
+ SEND AND MAIL (SAML)
+
+ This command is used to initiate a mail transaction in which
+ the mail data is delivered to one or more terminals and
+ mailboxes. For each recipient the mail data is delivered to
+ the recipient's terminal if the recipient is active on the
+ host (and accepting terminal messages), and for all
+ recipients to the recipient's mailbox. The argument field
+ contains a reverse-path. This command is successful if the
+ message is delivered to the mailbox.
+
+ The reverse-path consists of an optional list of hosts and
+ the sender mailbox. When the list of hosts is present, it
+ is a "reverse" source route and indicates that the mail was
+ relayed through each host on the list (the first host in the
+ list was the most recent relay). This list is used as a
+ source route to return non-delivery notices to the sender.
+ As each relay host adds itself to the beginning of the list,
+ it must use its name as known in the IPCE to which it is
+ relaying the mail rather than the IPCE from which the mail
+ came (if they are different).
+
+ This command clears the reverse-path buffer, the
+
+
+
+[Page 24] Postel
+
+
+
+RFC 821 August 1982
+ Simple Mail Transfer Protocol
+
+
+
+ forward-path buffer, and the mail data buffer; and inserts
+ the reverse-path information from this command into the
+ reverse-path buffer.
+
+ RESET (RSET)
+
+ This command specifies that the current mail transaction is
+ to be aborted. Any stored sender, recipients, and mail data
+ must be discarded, and all buffers and state tables cleared.
+ The receiver must send an OK reply.
+
+ VERIFY (VRFY)
+
+ This command asks the receiver to confirm that the argument
+ identifies a user. If it is a user name, the full name of
+ the user (if known) and the fully specified mailbox are
+ returned.
+
+ This command has no effect on any of the reverse-path
+ buffer, the forward-path buffer, or the mail data buffer.
+
+ EXPAND (EXPN)
+
+ This command asks the receiver to confirm that the argument
+ identifies a mailing list, and if so, to return the
+ membership of that list. The full name of the users (if
+ known) and the fully specified mailboxes are returned in a
+ multiline reply.
+
+ This command has no effect on any of the reverse-path
+ buffer, the forward-path buffer, or the mail data buffer.
+
+ HELP (HELP)
+
+ This command causes the receiver to send helpful information
+ to the sender of the HELP command. The command may take an
+ argument (e.g., any command name) and return more specific
+ information as a response.
+
+ This command has no effect on any of the reverse-path
+ buffer, the forward-path buffer, or the mail data buffer.
+
+
+
+
+
+
+
+
+Postel [Page 25]
+
+
+
+August 1982 RFC 821
+Simple Mail Transfer Protocol
+
+
+
+ NOOP (NOOP)
+
+ This command does not affect any parameters or previously
+ entered commands. It specifies no action other than that
+ the receiver send an OK reply.
+
+ This command has no effect on any of the reverse-path
+ buffer, the forward-path buffer, or the mail data buffer.
+
+ QUIT (QUIT)
+
+ This command specifies that the receiver must send an OK
+ reply, and then close the transmission channel.
+
+ The receiver should not close the transmission channel until
+ it receives and replies to a QUIT command (even if there was
+ an error). The sender should not close the transmission
+ channel until it send a QUIT command and receives the reply
+ (even if there was an error response to a previous command).
+ If the connection is closed prematurely the receiver should
+ act as if a RSET command had been received (canceling any
+ pending transaction, but not undoing any previously
+ completed transaction), the sender should act as if the
+ command or transaction in progress had received a temporary
+ error (4xx).
+
+ TURN (TURN)
+
+ This command specifies that the receiver must either (1)
+ send an OK reply and then take on the role of the
+ sender-SMTP, or (2) send a refusal reply and retain the role
+ of the receiver-SMTP.
+
+ If program-A is currently the sender-SMTP and it sends the
+ TURN command and receives an OK reply (250) then program-A
+ becomes the receiver-SMTP. Program-A is then in the initial
+ state as if the transmission channel just opened, and it
+ then sends the 220 service ready greeting.
+
+ If program-B is currently the receiver-SMTP and it receives
+ the TURN command and sends an OK reply (250) then program-B
+ becomes the sender-SMTP. Program-B is then in the initial
+ state as if the transmission channel just opened, and it
+ then expects to receive the 220 service ready greeting.
+
+ To refuse to change roles the receiver sends the 502 reply.
+
+
+
+[Page 26] Postel
+
+
+
+RFC 821 August 1982
+ Simple Mail Transfer Protocol
+
+
+
+ There are restrictions on the order in which these command may
+ be used.
+
+ The first command in a session must be the HELO command.
+ The HELO command may be used later in a session as well. If
+ the HELO command argument is not acceptable a 501 failure
+ reply must be returned and the receiver-SMTP must stay in
+ the same state.
+
+ The NOOP, HELP, EXPN, and VRFY commands can be used at any
+ time during a session.
+
+ The MAIL, SEND, SOML, or SAML commands begin a mail
+ transaction. Once started a mail transaction consists of
+ one of the transaction beginning commands, one or more RCPT
+ commands, and a DATA command, in that order. A mail
+ transaction may be aborted by the RSET command. There may
+ be zero or more transactions in a session.
+
+ If the transaction beginning command argument is not
+ acceptable a 501 failure reply must be returned and the
+ receiver-SMTP must stay in the same state. If the commands
+ in a transaction are out of order a 503 failure reply must
+ be returned and the receiver-SMTP must stay in the same
+ state.
+
+ The last command in a session must be the QUIT command. The
+ QUIT command can not be used at any other time in a session.
+
+ 4.1.2. COMMAND SYNTAX
+
+ The commands consist of a command code followed by an argument
+ field. Command codes are four alphabetic characters. Upper
+ and lower case alphabetic characters are to be treated
+ identically. Thus, any of the following may represent the mail
+ command:
+
+ MAIL Mail mail MaIl mAIl
+
+ This also applies to any symbols representing parameter values,
+ such as "TO" or "to" for the forward-path. Command codes and
+ the argument fields are separated by one or more spaces.
+ However, within the reverse-path and forward-path arguments
+ case is important. In particular, in some hosts the user
+ "smith" is different from the user "Smith".
+
+
+
+
+Postel [Page 27]
+
+
+
+August 1982 RFC 821
+Simple Mail Transfer Protocol
+
+
+
+ The argument field consists of a variable length character
+ string ending with the character sequence . The receiver
+ is to take no action until this sequence is received.
+
+ Square brackets denote an optional argument field. If the
+ option is not taken, the appropriate default is implied.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[Page 28] Postel
+
+
+
+RFC 821 August 1982
+ Simple Mail Transfer Protocol
+
+
+
+ The following are the SMTP commands:
+
+ HELO
+
+ MAIL FROM:
+
+ RCPT TO:
+
+ DATA
+
+ RSET
+
+ SEND FROM:
+
+ SOML FROM:
+
+ SAML FROM:
+
+ VRFY
+
+ EXPN
+
+ HELP []
+
+ NOOP
+
+ QUIT
+
+ TURN
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Postel [Page 29]
+
+
+
+August 1982 RFC 821
+Simple Mail Transfer Protocol
+
+
+
+ The syntax of the above argument fields (using BNF notation
+ where applicable) is given below. The "..." notation indicates
+ that a field may be repeated one or more times.
+
+ ::=
+
+ ::=
+
+ ::= "<" [ ":" ] ">"
+
+ ::= | ","
+
+ ::= "@"
+
+ ::= | "."
+
+ ::= | "#" | "[" "]"
+
+ ::= "@"
+
+ ::= |
+
+ ::=
+
+ ::= |
+
+ ::= |
+
+ ::= | | "-"
+
+ ::= | "."
+
+ ::= |
+
+ ::= """ """
+
+ ::= "\" | "\" | |
+
+ ::= | "\"
+
+ ::= "." "." "."
+
+ ::= |
+
+ ::=
+
+
+
+
+[Page 30] Postel
+
+
+
+RFC 821 August 1982
+ Simple Mail Transfer Protocol
+
+
+
+ ::= the carriage return character (ASCII code 13)
+
+ ::= the line feed character (ASCII code 10)
+
+ ::= the space character (ASCII code 32)
+
+ ::= one, two, or three digits representing a decimal
+ integer value in the range 0 through 255
+
+ ::= any one of the 52 alphabetic characters A through Z
+ in upper case and a through z in lower case
+
+ ::= any one of the 128 ASCII characters, but not any
+ or
+
+ ::= any one of the ten digits 0 through 9
+
+ ::= any one of the 128 ASCII characters except ,
+ , quote ("), or backslash (\)
+
+ ::= any one of the 128 ASCII characters (no exceptions)
+
+ ::= "<" | ">" | "(" | ")" | "[" | "]" | "\" | "."
+ | "," | ";" | ":" | "@" """ | the control
+ characters (ASCII codes 0 through 31 inclusive and
+ 127)
+
+ Note that the backslash, "\", is a quote character, which is
+ used to indicate that the next character is to be used
+ literally (instead of its normal interpretation). For example,
+ "Joe\,Smith" could be used to indicate a single nine character
+ user field with comma being the fourth character of the field.
+
+ Hosts are generally known by names which are translated to
+ addresses in each host. Note that the name elements of domains
+ are the official names -- no use of nicknames or aliases is
+ allowed.
+
+ Sometimes a host is not known to the translation function and
+ communication is blocked. To bypass this barrier two numeric
+ forms are also allowed for host "names". One form is a decimal
+ integer prefixed by a pound sign, "#", which indicates the
+ number is the address of the host. Another form is four small
+ decimal integers separated by dots and enclosed by brackets,
+ e.g., "[123.255.37.2]", which indicates a 32-bit ARPA Internet
+ Address in four 8-bit fields.
+
+
+
+Postel [Page 31]
+
+
+
+August 1982 RFC 821
+Simple Mail Transfer Protocol
+
+
+
+ The time stamp line and the return path line are formally
+ defined as follows:
+
+ ::= "Return-Path:"
+
+ ::= "Received:"
+
+ ::= ";"
+
+
+ ::= "FROM"
+
+ ::= "BY"
+
+ ::= [] [] [] []
+
+ ::= "VIA"
+
+ ::= "WITH"
+
+ ::= "ID"
+
+ ::= "FOR"
+
+ ::= The standard names for links are registered with
+ the Network Information Center.
+
+ ::= The standard names for protocols are
+ registered with the Network Information Center.
+
+ ::=