diff --git a/catalyst/api-bundle/CatalystAPIBundle.php b/catalyst/api-bundle/CatalystAPIBundle.php new file mode 100644 index 00000000..226e1157 --- /dev/null +++ b/catalyst/api-bundle/CatalystAPIBundle.php @@ -0,0 +1,9 @@ +setName('api:test-connector') + ->setDescription('Test API connector.') + ->setHelp('Test API Connector.') + ->addArgument('protocol', InputArgument::REQUIRED, 'protocol') + ->addArgument('server', InputArgument::REQUIRED, 'server') + ->addArgument('api_key', InputArgument::REQUIRED, 'api_key') + ->addArgument('secret_key', InputArgument::REQUIRED, 'secret_key'); + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $protocol = $input->getArgument('protocol'); + $server = $input->getArgument('server'); + $api_key = $input->getArgument('api_key'); + $secret_key = $input->getArgument('secret_key'); + + // api client + $api = new APIClient($server, $api_key, $secret_key); + $api->setProtocol($protocol); + + // test + $api->get('/capi/test'); + + // TODO: shift this out of the bundle, since it's project specific + // warranty register + $params = [ + 'serial' => 'LJ34LJADR12SDLKJL', + 'plate_number' => 'XEN918', + 'warranty_class' => 'private', + 'date_purchase' => '20181001', + 'date_expire' => '20191001', + ]; + $api->post('/capi/warranty', $params); + + // warranty find + $api->get('/capi/warranty/LJ34LJADR12SDLKJL'); + + // warranty claim + $api->post('/capi/warranty/LJ34LJADR12SDLKJL/claim'); + + // battery + // $api->get('/capi/battery_models'); + // $api->get('/capi/battery_sizes'); + + // vehicle + // $api->get('/capi/vehicle_manufacturers'); + // $api->get('/capi/vehicles'); + } +} diff --git a/catalyst/api-bundle/Command/UserCreateCommand.php b/catalyst/api-bundle/Command/UserCreateCommand.php new file mode 100644 index 00000000..cea9682c --- /dev/null +++ b/catalyst/api-bundle/Command/UserCreateCommand.php @@ -0,0 +1,49 @@ +em = $em; + + parent::__construct(); + } + + protected function configure() + { + $this->setName('api:user-create') + ->setDescription('Create new API user.') + ->setHelp('Creates new API user and saves to database.') + ->addArgument('name', InputArgument::REQUIRED, 'name'); + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $name = $input->getArgument('name'); + + $user = new User(); + $user->setName($name); + + $this->em->persist($user); + $this->em->flush(); + + $output->write('API Key - ' . $user->getAPIKey() . "\n"); + $output->write('Secret Key - ' . $user->getSecretKey() . "\n"); + } + + +} diff --git a/catalyst/api-bundle/Connector/Client.php b/catalyst/api-bundle/Connector/Client.php new file mode 100644 index 00000000..904b7cad --- /dev/null +++ b/catalyst/api-bundle/Connector/Client.php @@ -0,0 +1,151 @@ +protocol = 'https'; + $this->port = null; + + $this->server = $server; + $this->api_key = $api_key; + $this->secret_key = $secret_key; + $this->curl = curl_init(); + } + + public function __destruct() + { + curl_close($this->curl); + } + + public function setProtocol($protocol) + { + if ($protocol != 'http' && $protocol != 'https') + return $this; + + $this->protocol = $protocol; + return $this; + } + + protected function getDateString() + { + $date = new DateTime(); + return $date->format(self::DATE_FORMAT); + } + + public function get($url, $params = []) + { + curl_reset($this->curl); + + $date_string = $this->getDateString(); + $headers = $this->generateHeaders('GET', $url, $date_string); + + // build query string + if (count($params) > 0) + $query_string = '?' . http_build_query($params); + else + $query_string = ''; + + // build url + if ($this->port == null) + $full_url = $this->protocol . '://' . $this->server . $url . $query_string; + else + $full_url = $this->protocol . '://' . $this->server . ':' . $this->port . $url . $query_string; + + error_log($full_url); + + // curl + // curl_setopt($this->curl, CURLOPT_VERBOSE, true); + curl_setopt($this->curl, CURLOPT_URL, $full_url); + curl_setopt($this->curl, CURLOPT_HTTPHEADER, $headers); + curl_setopt($this->curl, CURLOPT_USERAGENT, self::USER_AGENT); + curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($this->curl, CURLOPT_TIMEOUT, 0); + + $res = curl_exec($this->curl); + error_log($res); + } + + public function post($url, $params = []) + { + curl_reset($this->curl); + + $date_string = $this->getDateString(); + $headers = $this->generateHeaders('POST', $url, $date_string); + + // build query string + $query_string = http_build_query($params); + + // build url + if ($this->port == null) + $full_url = $this->protocol . '://' . $this->server . $url; + else + $full_url = $this->protocol . '://' . $this->server . ':' . $this->port . $url; + + error_log($full_url); + + // curl + // curl_setopt($this->curl, CURLOPT_VERBOSE, true); + curl_setopt($this->curl, CURLOPT_URL, $full_url); + curl_setopt($this->curl, CURLOPT_POST, true); + curl_setopt($this->curl, CURLOPT_POSTFIELDS, $query_string); + curl_setopt($this->curl, CURLOPT_HTTPHEADER, $headers); + curl_setopt($this->curl, CURLOPT_USERAGENT, self::USER_AGENT); + curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($this->curl, CURLOPT_TIMEOUT, 0); + + $res = curl_exec($this->curl); + error_log($res); + } + + protected function generateSignature($method, $url, $date_string) + { + $creds = [ + $method, + $url, + $date_string, + $this->secret_key, + ]; + $sig_source = implode('|', $creds); + + error_log('SIG SOURCE - ' . $sig_source); + + $raw_sig = hash_hmac('sha1', $sig_source, $this->secret_key, true); + $enc_sig = base64_encode($raw_sig); + + return $enc_sig; + } + + protected function generateHeaders($method, $url, $date_string) + { + $sig = $this->generateSignature($method, $url, $date_string); + + $headers = [ + self::HEADER_API_KEY . ': ' . $this->api_key, + self::HEADER_SIGNATURE . ': ' . $sig, + self::HEADER_DATE . ': ' . $date_string, + ]; + + return $headers; + } +} diff --git a/catalyst/api-bundle/Controller/APIController.php b/catalyst/api-bundle/Controller/APIController.php new file mode 100644 index 00000000..fc38e32b --- /dev/null +++ b/catalyst/api-bundle/Controller/APIController.php @@ -0,0 +1,7 @@ +setAPIKey($this->generateAPIKey()) + ->setSecretKey($this->generateSecretKey()); + + // set date created + $this->date_create = new DateTime(); + } + + public function getID() + { + return $this->id; + } + + public function setAPIKey($api_key) + { + $this->api_key = $api_key; + return $this; + } + + public function getAPIKey() + { + return $this->api_key; + } + + public function setSecretKey($key) + { + $this->secret_key = $key; + return $this; + } + + public function getSecretKey() + { + return $this->secret_key; + } + + public function setName($name) + { + $this->name = $name; + return $this; + } + + public function getName() + { + return $this->name; + } + + public function getRoles() + { + return ['ROLE_API']; + } + + public function getDateCreate() + { + return $this->date_create; + } + + public function getPassword() + { + // we don't need this for API + return 'notneeded'; + } + + public function getSalt() + { + return null; + } + + public function getUsername() + { + // since it's an api, the api key IS the username + return $this->api_key; + } + + public function eraseCredentials() + { + return; + } + + public function generateAPIKey() + { + return $this->generateKey('api'); + } + + public function generateSecretKey() + { + return $this->generateKey('secret'); + } + + protected function generateKey($prefix = '') + { + return md5(uniqid($prefix, true)); + } +} + diff --git a/catalyst/api-bundle/Response/APIResponse.php b/catalyst/api-bundle/Response/APIResponse.php new file mode 100644 index 00000000..baa10603 --- /dev/null +++ b/catalyst/api-bundle/Response/APIResponse.php @@ -0,0 +1,20 @@ + (bool) $success, + 'message' => (string) $message, + 'data' => $data, + ]; + parent::__construct($data, $status, $headers); + } +} + + diff --git a/catalyst/api-bundle/Security/APIKeyAuthenticator.php b/catalyst/api-bundle/Security/APIKeyAuthenticator.php new file mode 100644 index 00000000..f40728df --- /dev/null +++ b/catalyst/api-bundle/Security/APIKeyAuthenticator.php @@ -0,0 +1,154 @@ +em = $em; + } + + protected function validateSignature($creds, $secret_key) + { + $elements = [ + $creds['method'], + $creds['uri'], + $creds['date'], + $secret_key, + ]; + $sig_source = implode('|', $elements); + + error_log($sig_source); + + // generate signature + $raw_sig = hash_hmac('sha1', $sig_source, $secret_key, true); + $enc_sig = base64_encode($raw_sig); + + error_log($enc_sig); + + if ($enc_sig != trim($creds['signature'])) + throw new CustomUserMessageAuthenticationException('Invalid signature.'); + + } + + public function createToken(Request $req, $provider_key) + { + // api key header + $api_key = $req->headers->get(self::HEADER_API_KEY); + if ($api_key == null) + throw new BadCredentialsException('No API key sent.'); + + // check date from headers + $hdate_string = $req->headers->get(self::HEADER_DATE); + if ($hdate_string == null) + throw new BadCredentialsException('No date specified.'); + + $hdate = DateTime::createFromFormat(self::DATE_FORMAT, $hdate_string); + if ($hdate == null) + throw new BadCredentialsException('Invalid date specified.'); + + // get number of seconds difference + $date_now = new DateTime(); + $date_diff = abs($date_now->getTimestamp() - $hdate->getTimestamp()); + + // time difference is too much + if ($date_diff > self::TIME_LIMIT) + throw new BadCredentialsException('Clock synchronization error.'); + + // signature header + $sig = $req->headers->get(self::HEADER_SIGNATURE); + if ($sig == null) + throw new BadCredentialsException('No signature sent.'); + + // credentials + $creds = [ + 'api_key' => $api_key, + 'date' => $hdate_string, + 'signature' => $sig, + 'method' => $req->getRealMethod(), + 'uri' => $req->getPathInfo(), + ]; + + return new PreAuthenticatedToken( + 'anonymous', + $creds, + $provider_key + ); + } + + public function supportsToken(TokenInterface $token, $provider_key) + { + return $token instanceof PreAuthenticatedToken && $token->getProviderKey() === $provider_key; + } + + public function authenticateToken(TokenInterface $token, UserProviderInterface $user_provider, $provider_key) + { + if (!$user_provider instanceof APIKeyUserProvider) + { + throw new \InvalidArgumentException( + sprintf( + 'The user provider must be an instance of APIKeyUserProvider (%s was given).', + get_class($user_provider) + ) + ); + } + + $creds = $token->getCredentials(); + $api_key = $creds['api_key']; + $user = $user_provider->getUserByAPIKey($api_key); + + // check if api key is valid + if (!$user) + throw new CustomUserMessageAuthenticationException('Invalid API Key'); + + // check if signature is valid + $this->validateSignature($creds, $user->getSecretKey()); + + // $user = $user_provider->loadUserByUsername($username); + + return new PreAuthenticatedToken( + $user, + $api_key, + $provider_key, + $user->getRoles() + ); + } + + public function onAuthenticationFailure(Request $req, AuthenticationException $exception) + { + $data = [ + 'success' => false, + 'error' => [ + 'message' => $exception->getMessage(), + ], + ]; + return new JsonResponse($data, 401); + } +} diff --git a/catalyst/api-bundle/Security/APIKeyUserProvider.php b/catalyst/api-bundle/Security/APIKeyUserProvider.php new file mode 100644 index 00000000..1521a390 --- /dev/null +++ b/catalyst/api-bundle/Security/APIKeyUserProvider.php @@ -0,0 +1,62 @@ +em = $em; + } + + public function getUserByAPIKey($api_key) + { + $user = $this->em->getRepository(User::class)->find($api_key); + + return $user; + } + + public function getUsernameForAPIKey($apiKey) + { + // Look up the username based on the token in the database, via + // an API call, or do something entirely different + $username = 'test'; + + return $username; + } + + public function loadUserByUsername($username) + { + return new User( + $username, + null, + // the roles for the user - you may choose to determine + // these dynamically somehow based on the user + array('ROLE_API') + ); + } + + public function refreshUser(UserInterface $user) + { + // this is used for storing authentication in the session + // but in this example, the token is sent in each request, + // so authentication can be stateless. Throwing this exception + // is proper to make things stateless + throw new UnsupportedUserException(); + } + + public function supportsClass($class) + { + return User::class === $class; + } +} diff --git a/catalyst/api-bundle/Service/AccessDeniedHandler.php b/catalyst/api-bundle/Service/AccessDeniedHandler.php new file mode 100644 index 00000000..7cf5be90 --- /dev/null +++ b/catalyst/api-bundle/Service/AccessDeniedHandler.php @@ -0,0 +1,18 @@ +getMessage(); + + return new Response($content, 403); + } +} diff --git a/composer.json b/composer.json index 32460969..d02f6ed6 100644 --- a/composer.json +++ b/composer.json @@ -38,7 +38,7 @@ "autoload": { "psr-4": { "App\\": "src/", - "Catalyst\\": "catalyst-libs/" + "Catalyst\\APIBundle\\": "catalyst/api-bundle/" } }, "autoload-dev": { diff --git a/composer.lock b/composer.lock index 8f79d5de..93bbc92a 100644 --- a/composer.lock +++ b/composer.lock @@ -223,16 +223,16 @@ }, { "name": "data-dog/audit-bundle", - "version": "v0.1.10", + "version": "v0.1.11", "source": { "type": "git", "url": "https://github.com/DATA-DOG/DataDogAuditBundle.git", - "reference": "fa1f88b97d023a2148bc628923ffd08e4b6e5da3" + "reference": "71e709d92fe503eb229cf241c4d84350f532e2db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/DATA-DOG/DataDogAuditBundle/zipball/fa1f88b97d023a2148bc628923ffd08e4b6e5da3", - "reference": "fa1f88b97d023a2148bc628923ffd08e4b6e5da3", + "url": "https://api.github.com/repos/DATA-DOG/DataDogAuditBundle/zipball/71e709d92fe503eb229cf241c4d84350f532e2db", + "reference": "71e709d92fe503eb229cf241c4d84350f532e2db", "shasum": "" }, "require": { @@ -289,7 +289,7 @@ "log", "orm" ], - "time": "2018-01-11T14:17:37+00:00" + "time": "2018-09-13T20:51:07+00:00" }, { "name": "doctrine/annotations", @@ -361,16 +361,16 @@ }, { "name": "doctrine/cache", - "version": "v1.7.1", + "version": "v1.8.0", "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "b3217d58609e9c8e661cd41357a54d926c4a2a1a" + "reference": "d768d58baee9a4862ca783840eca1b9add7a7f57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/b3217d58609e9c8e661cd41357a54d926c4a2a1a", - "reference": "b3217d58609e9c8e661cd41357a54d926c4a2a1a", + "url": "https://api.github.com/repos/doctrine/cache/zipball/d768d58baee9a4862ca783840eca1b9add7a7f57", + "reference": "d768d58baee9a4862ca783840eca1b9add7a7f57", "shasum": "" }, "require": { @@ -381,8 +381,9 @@ }, "require-dev": { "alcaeus/mongo-php-adapter": "^1.1", + "doctrine/coding-standard": "^4.0", "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^5.7", + "phpunit/phpunit": "^7.0", "predis/predis": "~1.0" }, "suggest": { @@ -391,7 +392,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7.x-dev" + "dev-master": "1.8.x-dev" } }, "autoload": { @@ -426,12 +427,12 @@ } ], "description": "Caching library offering an object-oriented API for many cache backends", - "homepage": "http://www.doctrine-project.org", + "homepage": "https://www.doctrine-project.org", "keywords": [ "cache", "caching" ], - "time": "2017-08-25T07:02:50+00:00" + "time": "2018-08-21T18:01:43+00:00" }, { "name": "doctrine/collections", @@ -502,33 +503,39 @@ }, { "name": "doctrine/common", - "version": "v2.8.1", + "version": "v2.9.0", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "f68c297ce6455e8fd794aa8ffaf9fa458f6ade66" + "reference": "a210246d286c77d2b89040f8691ba7b3a713d2c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/f68c297ce6455e8fd794aa8ffaf9fa458f6ade66", - "reference": "f68c297ce6455e8fd794aa8ffaf9fa458f6ade66", + "url": "https://api.github.com/repos/doctrine/common/zipball/a210246d286c77d2b89040f8691ba7b3a713d2c1", + "reference": "a210246d286c77d2b89040f8691ba7b3a713d2c1", "shasum": "" }, "require": { - "doctrine/annotations": "1.*", - "doctrine/cache": "1.*", - "doctrine/collections": "1.*", - "doctrine/inflector": "1.*", - "doctrine/lexer": "1.*", - "php": "~7.1" + "doctrine/annotations": "^1.0", + "doctrine/cache": "^1.0", + "doctrine/collections": "^1.0", + "doctrine/event-manager": "^1.0", + "doctrine/inflector": "^1.0", + "doctrine/lexer": "^1.0", + "doctrine/persistence": "^1.0", + "doctrine/reflection": "^1.0", + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^5.7" + "doctrine/coding-standard": "^1.0", + "phpunit/phpunit": "^6.3", + "squizlabs/php_codesniffer": "^3.0", + "symfony/phpunit-bridge": "^4.0.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.8.x-dev" + "dev-master": "2.9.x-dev" } }, "autoload": { @@ -560,10 +567,14 @@ { "name": "Johannes Schmitt", "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" } ], "description": "Common Library for Doctrine projects", - "homepage": "http://www.doctrine-project.org", + "homepage": "https://www.doctrine-project.org", "keywords": [ "annotations", "collections", @@ -571,31 +582,36 @@ "persistence", "spl" ], - "time": "2017-08-31T08:43:38+00:00" + "time": "2018-07-12T21:16:12+00:00" }, { "name": "doctrine/dbal", - "version": "v2.6.3", + "version": "v2.8.0", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "e3eed9b1facbb0ced3a0995244843a189e7d1b13" + "reference": "5140a64c08b4b607b9bedaae0cedd26f04a0e621" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/e3eed9b1facbb0ced3a0995244843a189e7d1b13", - "reference": "e3eed9b1facbb0ced3a0995244843a189e7d1b13", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/5140a64c08b4b607b9bedaae0cedd26f04a0e621", + "reference": "5140a64c08b4b607b9bedaae0cedd26f04a0e621", "shasum": "" }, "require": { - "doctrine/common": "^2.7.1", + "doctrine/cache": "^1.0", + "doctrine/event-manager": "^1.0", "ext-pdo": "*", "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^5.4.6", + "doctrine/coding-standard": "^4.0", + "jetbrains/phpstorm-stubs": "^2018.1.2", + "phpstan/phpstan": "^0.10.1", + "phpunit/phpunit": "^7.1.2", "phpunit/phpunit-mock-objects": "!=3.2.4,!=3.2.5", - "symfony/console": "2.*||^3.0" + "symfony/console": "^2.0.5|^3.0|^4.0", + "symfony/phpunit-bridge": "^3.4.5|^4.0.5" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -606,7 +622,8 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6.x-dev" + "dev-master": "2.8.x-dev", + "dev-develop": "3.0.x-dev" } }, "autoload": { @@ -644,20 +661,20 @@ "persistence", "queryobject" ], - "time": "2017-11-19T13:38:54+00:00" + "time": "2018-07-13T03:16:35+00:00" }, { "name": "doctrine/doctrine-bundle", - "version": "1.8.1", + "version": "1.9.1", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "eb6e4fb904a459be28872765ab6e2d246aac7c87" + "reference": "703fad32e4c8cbe609caf45a71a1d4266c830f0f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/eb6e4fb904a459be28872765ab6e2d246aac7c87", - "reference": "eb6e4fb904a459be28872765ab6e2d246aac7c87", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/703fad32e4c8cbe609caf45a71a1d4266c830f0f", + "reference": "703fad32e4c8cbe609caf45a71a1d4266c830f0f", "shasum": "" }, "require": { @@ -668,13 +685,13 @@ "symfony/console": "~2.7|~3.0|~4.0", "symfony/dependency-injection": "~2.7|~3.0|~4.0", "symfony/doctrine-bridge": "~2.7|~3.0|~4.0", - "symfony/framework-bundle": "~2.7|~3.0|~4.0" + "symfony/framework-bundle": "^2.7.22|~3.0|~4.0" }, "conflict": { "symfony/http-foundation": "<2.6" }, "require-dev": { - "doctrine/orm": "~2.3", + "doctrine/orm": "~2.4", "phpunit/phpunit": "^4.8.36|^5.7|^6.4", "satooshi/php-coveralls": "^1.0", "symfony/phpunit-bridge": "~2.7|~3.0|~4.0", @@ -729,43 +746,43 @@ "orm", "persistence" ], - "time": "2017-11-24T13:09:19+00:00" + "time": "2018-04-19T14:07:39+00:00" }, { "name": "doctrine/doctrine-cache-bundle", - "version": "1.3.2", + "version": "1.3.3", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineCacheBundle.git", - "reference": "9baecbd6bfdd1123b0cf8c1b88fee0170a84ddd1" + "reference": "4c8e363f96427924e7e519c5b5119b4f54512697" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/9baecbd6bfdd1123b0cf8c1b88fee0170a84ddd1", - "reference": "9baecbd6bfdd1123b0cf8c1b88fee0170a84ddd1", + "url": "https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/4c8e363f96427924e7e519c5b5119b4f54512697", + "reference": "4c8e363f96427924e7e519c5b5119b4f54512697", "shasum": "" }, "require": { "doctrine/cache": "^1.4.2", "doctrine/inflector": "~1.0", "php": ">=5.3.2", - "symfony/doctrine-bridge": "~2.2|~3.0|~4.0" + "symfony/doctrine-bridge": "~2.7|~3.3|~4.0" }, "require-dev": { "instaclick/coding-standard": "~1.1", "instaclick/object-calisthenics-sniffs": "dev-master", "instaclick/symfony2-coding-standard": "dev-remaster", - "phpunit/phpunit": "~4", + "phpunit/phpunit": "~4|~5", "predis/predis": "~0.8", "satooshi/php-coveralls": "^1.0", "squizlabs/php_codesniffer": "~1.5", - "symfony/console": "~2.2|~3.0|~4.0", - "symfony/finder": "~2.2|~3.0|~4.0", - "symfony/framework-bundle": "~2.2|~3.0|~4.0", - "symfony/phpunit-bridge": "~2.7|~3.0|~4.0", - "symfony/security-acl": "~2.3|~3.0", - "symfony/validator": "~2.2|~3.0|~4.0", - "symfony/yaml": "~2.2|~3.0|~4.0" + "symfony/console": "~2.7|~3.3|~4.0", + "symfony/finder": "~2.7|~3.3|~4.0", + "symfony/framework-bundle": "~2.7|~3.3|~4.0", + "symfony/phpunit-bridge": "~2.7|~3.3|~4.0", + "symfony/security-acl": "~2.7|~3.3", + "symfony/validator": "~2.7|~3.3|~4.0", + "symfony/yaml": "~2.7|~3.3|~4.0" }, "suggest": { "symfony/security-acl": "For using this bundle to cache ACLs" @@ -817,7 +834,7 @@ "cache", "caching" ], - "time": "2017-10-12T17:23:29+00:00" + "time": "2018-03-27T09:22:12+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", @@ -881,21 +898,95 @@ "time": "2017-11-01T09:13:26+00:00" }, { - "name": "doctrine/inflector", - "version": "v1.2.0", + "name": "doctrine/event-manager", + "version": "v1.0.0", "source": { "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "e11d84c6e018beedd929cff5220969a3c6d1d462" + "url": "https://github.com/doctrine/event-manager.git", + "reference": "a520bc093a0170feeb6b14e9d83f3a14452e64b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/e11d84c6e018beedd929cff5220969a3c6d1d462", - "reference": "e11d84c6e018beedd929cff5220969a3c6d1d462", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/a520bc093a0170feeb6b14e9d83f3a14452e64b3", + "reference": "a520bc093a0170feeb6b14e9d83f3a14452e64b3", "shasum": "" }, "require": { - "php": "^7.0" + "php": "^7.1" + }, + "conflict": { + "doctrine/common": "<2.9@dev" + }, + "require-dev": { + "doctrine/coding-standard": "^4.0", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Doctrine Event Manager component", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "eventdispatcher", + "eventmanager" + ], + "time": "2018-06-11T11:59:03+00:00" + }, + { + "name": "doctrine/inflector", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "5527a48b7313d15261292c149e55e26eae771b0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a", + "reference": "5527a48b7313d15261292c149e55e26eae771b0a", + "shasum": "" + }, + "require": { + "php": "^7.1" }, "require-dev": { "phpunit/phpunit": "^6.2" @@ -903,7 +994,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-master": "1.3.x-dev" } }, "autoload": { @@ -945,7 +1036,7 @@ "singularize", "string" ], - "time": "2017-07-22T12:18:28+00:00" + "time": "2018-01-09T20:05:19+00:00" }, { "name": "doctrine/instantiator", @@ -1057,35 +1148,36 @@ }, { "name": "doctrine/migrations", - "version": "v1.6.2", + "version": "v1.8.1", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "e3faf7c96b8a6084045dedcaf51f74c7834644d4" + "reference": "215438c0eef3e5f9b7da7d09c6b90756071b43e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/e3faf7c96b8a6084045dedcaf51f74c7834644d4", - "reference": "e3faf7c96b8a6084045dedcaf51f74c7834644d4", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/215438c0eef3e5f9b7da7d09c6b90756071b43e6", + "reference": "215438c0eef3e5f9b7da7d09c6b90756071b43e6", "shasum": "" }, "require": { "doctrine/dbal": "~2.6", "ocramius/proxy-manager": "^1.0|^2.0", "php": "^7.1", - "symfony/console": "~3.3|^4.0", - "symfony/yaml": "~3.3|^4.0" + "symfony/console": "~3.3|^4.0" }, "require-dev": { "doctrine/coding-standard": "^1.0", "doctrine/orm": "~2.5", "jdorn/sql-formatter": "~1.1", "mikey179/vfsstream": "^1.6", - "phpunit/phpunit": "~6.2", - "squizlabs/php_codesniffer": "^3.0" + "phpunit/phpunit": "~7.0", + "squizlabs/php_codesniffer": "^3.0", + "symfony/yaml": "~3.3|^4.0" }, "suggest": { - "jdorn/sql-formatter": "Allows to generate formatted SQL with the diff command." + "jdorn/sql-formatter": "Allows to generate formatted SQL with the diff command.", + "symfony/yaml": "Allows the use of yaml for migration configuration files." }, "bin": [ "bin/doctrine-migrations" @@ -1093,17 +1185,18 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "v1.6.x-dev" + "dev-master": "v1.8.x-dev" } }, "autoload": { "psr-4": { - "Doctrine\\DBAL\\Migrations\\": "lib/Doctrine/DBAL/Migrations" + "Doctrine\\DBAL\\Migrations\\": "lib/Doctrine/DBAL/Migrations", + "Doctrine\\Migrations\\": "lib/Doctrine/Migrations" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "LGPL-2.1" + "MIT" ], "authors": [ { @@ -1120,25 +1213,25 @@ } ], "description": "Database Schema migrations using Doctrine DBAL", - "homepage": "http://www.doctrine-project.org", + "homepage": "https://www.doctrine-project.org/projects/migrations.html", "keywords": [ "database", "migrations" ], - "time": "2017-11-24T14:13:17+00:00" + "time": "2018-06-06T21:00:30+00:00" }, { "name": "doctrine/orm", - "version": "v2.6.0", + "version": "v2.6.2", "source": { "type": "git", "url": "https://github.com/doctrine/doctrine2.git", - "reference": "374e7ace49d864dad8cddbc55346447c8a6a2083" + "reference": "d2b4dd71d2a276edd65d0c170375b445f8a4a4a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/374e7ace49d864dad8cddbc55346447c8a6a2083", - "reference": "374e7ace49d864dad8cddbc55346447c8a6a2083", + "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/d2b4dd71d2a276edd65d0c170375b445f8a4a4a8", + "reference": "d2b4dd71d2a276edd65d0c170375b445f8a4a4a8", "shasum": "" }, "require": { @@ -1207,20 +1300,173 @@ "database", "orm" ], - "time": "2017-12-20T00:38:15+00:00" + "time": "2018-07-12T20:47:13+00:00" }, { - "name": "guzzlehttp/guzzle", - "version": "6.3.0", + "name": "doctrine/persistence", + "version": "v1.0.1", "source": { "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699" + "url": "https://github.com/doctrine/persistence.git", + "reference": "af1ec238659a83e320f03e0e454e200f689b4b97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f4db5a78a5ea468d4831de7f0bf9d9415e348699", - "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/af1ec238659a83e320f03e0e454e200f689b4b97", + "reference": "af1ec238659a83e320f03e0e454e200f689b4b97", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "doctrine/cache": "^1.0", + "doctrine/collections": "^1.0", + "doctrine/event-manager": "^1.0", + "doctrine/reflection": "^1.0", + "php": "^7.1" + }, + "conflict": { + "doctrine/common": "<2.9@dev" + }, + "require-dev": { + "doctrine/coding-standard": "^4.0", + "phpstan/phpstan": "^0.8", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Doctrine Persistence abstractions.", + "homepage": "https://doctrine-project.org/projects/persistence.html", + "keywords": [ + "persistence" + ], + "time": "2018-07-12T12:37:50+00:00" + }, + { + "name": "doctrine/reflection", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/reflection.git", + "reference": "02538d3f95e88eb397a5f86274deb2c6175c2ab6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/reflection/zipball/02538d3f95e88eb397a5f86274deb2c6175c2ab6", + "reference": "02538d3f95e88eb397a5f86274deb2c6175c2ab6", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "ext-tokenizer": "*", + "php": "^7.1" + }, + "require-dev": { + "doctrine/coding-standard": "^4.0", + "doctrine/common": "^2.8", + "phpstan/phpstan": "^0.9.2", + "phpstan/phpstan-phpunit": "^0.9.4", + "phpunit/phpunit": "^7.0", + "squizlabs/php_codesniffer": "^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Doctrine Reflection component", + "homepage": "https://www.doctrine-project.org/projects/reflection.html", + "keywords": [ + "reflection" + ], + "time": "2018-06-14T14:45:07+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.3.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", "shasum": "" }, "require": { @@ -1230,7 +1476,7 @@ }, "require-dev": { "ext-curl": "*", - "phpunit/phpunit": "^4.0 || ^5.0", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", "psr/log": "^1.0" }, "suggest": { @@ -1239,7 +1485,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "6.2-dev" + "dev-master": "6.3-dev" } }, "autoload": { @@ -1272,7 +1518,7 @@ "rest", "web service" ], - "time": "2017-06-22T18:50:49+00:00" + "time": "2018-04-22T15:46:56+00:00" }, { "name": "guzzlehttp/promises", @@ -1441,28 +1687,79 @@ "time": "2014-01-12T16:20:24+00:00" }, { - "name": "ocramius/package-versions", - "version": "1.2.0", + "name": "nikic/php-parser", + "version": "v4.1.0", "source": { "type": "git", - "url": "https://github.com/Ocramius/PackageVersions.git", - "reference": "ad8a245decad4897cc6b432743913dad0d69753c" + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "d0230c5c77a7e3cfa69446febf340978540958c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Ocramius/PackageVersions/zipball/ad8a245decad4897cc6b432743913dad0d69753c", - "reference": "ad8a245decad4897cc6b432743913dad0d69753c", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/d0230c5c77a7e3cfa69446febf340978540958c0", + "reference": "d0230c5c77a7e3cfa69446febf340978540958c0", "shasum": "" }, "require": { - "composer-plugin-api": "^1.0", - "php": "~7.0" + "ext-tokenizer": "*", + "php": ">=7.0" }, "require-dev": { - "composer/composer": "^1.3", + "phpunit/phpunit": "^6.5 || ^7.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "time": "2018-10-10T09:24:14+00:00" + }, + { + "name": "ocramius/package-versions", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/Ocramius/PackageVersions.git", + "reference": "4489d5002c49d55576fa0ba786f42dbb009be46f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Ocramius/PackageVersions/zipball/4489d5002c49d55576fa0ba786f42dbb009be46f", + "reference": "4489d5002c49d55576fa0ba786f42dbb009be46f", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0.0", + "php": "^7.1.0" + }, + "require-dev": { + "composer/composer": "^1.6.3", "ext-zip": "*", - "humbug/humbug": "dev-master", - "phpunit/phpunit": "^6.4" + "infection/infection": "^0.7.1", + "phpunit/phpunit": "^7.0.0" }, "type": "composer-plugin", "extra": { @@ -1487,20 +1784,20 @@ } ], "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", - "time": "2017-11-24T11:07:03+00:00" + "time": "2018-02-05T13:05:30+00:00" }, { "name": "ocramius/proxy-manager", - "version": "2.2.0", + "version": "2.2.2", "source": { "type": "git", "url": "https://github.com/Ocramius/ProxyManager.git", - "reference": "81d53b2878f1d1c40ad27270e64b51798485dfc5" + "reference": "14b137b06b0f911944132df9d51e445a35920ab1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/81d53b2878f1d1c40ad27270e64b51798485dfc5", - "reference": "81d53b2878f1d1c40ad27270e64b51798485dfc5", + "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/14b137b06b0f911944132df9d51e445a35920ab1", + "reference": "14b137b06b0f911944132df9d51e445a35920ab1", "shasum": "" }, "require": { @@ -1557,7 +1854,7 @@ "proxy pattern", "service proxies" ], - "time": "2017-11-16T23:22:31+00:00" + "time": "2018-09-27T13:45:01+00:00" }, { "name": "predis/predis", @@ -1803,16 +2100,16 @@ }, { "name": "psr/simple-cache", - "version": "1.0.0", + "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/php-fig/simple-cache.git", - "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24" + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/753fa598e8f3b9966c886fe13f370baa45ef0e24", - "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", "shasum": "" }, "require": { @@ -1847,27 +2144,27 @@ "psr-16", "simple-cache" ], - "time": "2017-01-02T13:31:39+00:00" + "time": "2017-10-23T01:57:42+00:00" }, { "name": "sensio/framework-extra-bundle", - "version": "v5.1.3", + "version": "v5.2.1", "source": { "type": "git", "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", - "reference": "0696496cb3e2d23add645d424699e5c723238aad" + "reference": "535b56b7b0325e87b15b9c57bd3631ae2a0b9f16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/0696496cb3e2d23add645d424699e5c723238aad", - "reference": "0696496cb3e2d23add645d424699e5c723238aad", + "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/535b56b7b0325e87b15b9c57bd3631ae2a0b9f16", + "reference": "535b56b7b0325e87b15b9c57bd3631ae2a0b9f16", "shasum": "" }, "require": { "doctrine/common": "^2.2", "symfony/config": "^3.3|^4.0", "symfony/dependency-injection": "^3.3|^4.0", - "symfony/framework-bundle": "^3.3|^4.0", + "symfony/framework-bundle": "^3.4|^4.0", "symfony/http-kernel": "^3.3|^4.0" }, "require-dev": { @@ -1877,6 +2174,8 @@ "symfony/dom-crawler": "^3.3|^4.0", "symfony/expression-language": "^3.3|^4.0", "symfony/finder": "^3.3|^4.0", + "symfony/monolog-bridge": "^3.0|^4.0", + "symfony/monolog-bundle": "^3.2", "symfony/phpunit-bridge": "^3.3|^4.0", "symfony/psr-http-message-bridge": "^0.3", "symfony/security-bundle": "^3.3|^4.0", @@ -1893,7 +2192,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "5.1.x-dev" + "dev-master": "5.2.x-dev" } }, "autoload": { @@ -1916,7 +2215,7 @@ "annotations", "controllers" ], - "time": "2017-12-04T18:33:55+00:00" + "time": "2018-09-30T05:16:57+00:00" }, { "name": "setasign/fpdf", @@ -1959,16 +2258,16 @@ }, { "name": "symfony/cache", - "version": "v4.0.2", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "d00351f230ca037ca13f6fec3411e002043f7421" + "reference": "05ce0ddc8bc1ffe592105398fc2c725cb3080a38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/d00351f230ca037ca13f6fec3411e002043f7421", - "reference": "d00351f230ca037ca13f6fec3411e002043f7421", + "url": "https://api.github.com/repos/symfony/cache/zipball/05ce0ddc8bc1ffe592105398fc2c725cb3080a38", + "reference": "05ce0ddc8bc1ffe592105398fc2c725cb3080a38", "shasum": "" }, "require": { @@ -1993,7 +2292,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -2024,30 +2323,33 @@ "caching", "psr6" ], - "time": "2017-12-08T16:11:45+00:00" + "time": "2018-09-30T03:38:13+00:00" }, { "name": "symfony/config", - "version": "v4.0.2", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "0356e6d5298e9e72212c0bad65c2f1b49e42d622" + "reference": "b3d4d7b567d7a49e6dfafb6d4760abc921177c96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/0356e6d5298e9e72212c0bad65c2f1b49e42d622", - "reference": "0356e6d5298e9e72212c0bad65c2f1b49e42d622", + "url": "https://api.github.com/repos/symfony/config/zipball/b3d4d7b567d7a49e6dfafb6d4760abc921177c96", + "reference": "b3d4d7b567d7a49e6dfafb6d4760abc921177c96", "shasum": "" }, "require": { "php": "^7.1.3", - "symfony/filesystem": "~3.4|~4.0" + "symfony/filesystem": "~3.4|~4.0", + "symfony/polyfill-ctype": "~1.8" }, "conflict": { "symfony/finder": "<3.4" }, "require-dev": { + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", "symfony/finder": "~3.4|~4.0", "symfony/yaml": "~3.4|~4.0" }, @@ -2057,7 +2359,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -2084,20 +2386,20 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2017-12-14T19:48:22+00:00" + "time": "2018-09-08T13:24:10+00:00" }, { "name": "symfony/console", - "version": "v4.0.2", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "de8cf039eacdec59d83f7def67e3b8ff5ed46714" + "reference": "dc7122fe5f6113cfaba3b3de575d31112c9aa60b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/de8cf039eacdec59d83f7def67e3b8ff5ed46714", - "reference": "de8cf039eacdec59d83f7def67e3b8ff5ed46714", + "url": "https://api.github.com/repos/symfony/console/zipball/dc7122fe5f6113cfaba3b3de575d31112c9aa60b", + "reference": "dc7122fe5f6113cfaba3b3de575d31112c9aa60b", "shasum": "" }, "require": { @@ -2117,7 +2419,7 @@ "symfony/process": "~3.4|~4.0" }, "suggest": { - "psr/log": "For using the console logger", + "psr/log-implementation": "For using the console logger", "symfony/event-dispatcher": "", "symfony/lock": "", "symfony/process": "" @@ -2125,7 +2427,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -2152,20 +2454,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2017-12-14T19:48:22+00:00" + "time": "2018-10-03T08:15:46+00:00" }, { "name": "symfony/debug", - "version": "v4.0.2", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "8c3e709209ce3b952a31c0f4a31ac7703c3d0226" + "reference": "e3f76ce6198f81994e019bb2b4e533e9de1b9b90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/8c3e709209ce3b952a31c0f4a31ac7703c3d0226", - "reference": "8c3e709209ce3b952a31c0f4a31ac7703c3d0226", + "url": "https://api.github.com/repos/symfony/debug/zipball/e3f76ce6198f81994e019bb2b4e533e9de1b9b90", + "reference": "e3f76ce6198f81994e019bb2b4e533e9de1b9b90", "shasum": "" }, "require": { @@ -2181,7 +2483,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -2208,20 +2510,20 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2017-12-12T08:41:51+00:00" + "time": "2018-10-02T16:36:10+00:00" }, { "name": "symfony/dependency-injection", - "version": "v4.0.2", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "d2fa088b5fd7d429974a36bf1a9846b912d9d124" + "reference": "f6b9d893ad28aefd8942dc0469c8397e2216fe30" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/d2fa088b5fd7d429974a36bf1a9846b912d9d124", - "reference": "d2fa088b5fd7d429974a36bf1a9846b912d9d124", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/f6b9d893ad28aefd8942dc0469c8397e2216fe30", + "reference": "f6b9d893ad28aefd8942dc0469c8397e2216fe30", "shasum": "" }, "require": { @@ -2229,7 +2531,7 @@ "psr/container": "^1.0" }, "conflict": { - "symfony/config": "<3.4", + "symfony/config": "<4.1.1", "symfony/finder": "<3.4", "symfony/proxy-manager-bridge": "<3.4", "symfony/yaml": "<3.4" @@ -2238,7 +2540,7 @@ "psr/container-implementation": "1.0" }, "require-dev": { - "symfony/config": "~3.4|~4.0", + "symfony/config": "~4.1", "symfony/expression-language": "~3.4|~4.0", "symfony/yaml": "~3.4|~4.0" }, @@ -2252,7 +2554,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -2279,25 +2581,26 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2017-12-14T19:48:22+00:00" + "time": "2018-10-02T12:40:59+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v4.0.2", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "d14c17af9290634eb1588b75ed64a64ee286ba3e" + "reference": "ad230829c4eb9ef13c8fcbba6077971c6377c18c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/d14c17af9290634eb1588b75ed64a64ee286ba3e", - "reference": "d14c17af9290634eb1588b75ed64a64ee286ba3e", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/ad230829c4eb9ef13c8fcbba6077971c6377c18c", + "reference": "ad230829c4eb9ef13c8fcbba6077971c6377c18c", "shasum": "" }, "require": { "doctrine/common": "~2.4", "php": "^7.1.3", + "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { @@ -2331,7 +2634,7 @@ "type": "symfony-bridge", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -2358,20 +2661,20 @@ ], "description": "Symfony Doctrine Bridge", "homepage": "https://symfony.com", - "time": "2017-12-09T12:13:31+00:00" + "time": "2018-10-02T12:40:59+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.0.2", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "d4face19ed8002eec8280bc1c5ec18130472bf43" + "reference": "bfb30c2ad377615a463ebbc875eba64a99f6aa3e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d4face19ed8002eec8280bc1c5ec18130472bf43", - "reference": "d4face19ed8002eec8280bc1c5ec18130472bf43", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/bfb30c2ad377615a463ebbc875eba64a99f6aa3e", + "reference": "bfb30c2ad377615a463ebbc875eba64a99f6aa3e", "shasum": "" }, "require": { @@ -2394,7 +2697,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -2421,29 +2724,30 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2017-12-14T19:48:22+00:00" + "time": "2018-07-26T09:10:45+00:00" }, { "name": "symfony/filesystem", - "version": "v4.0.3", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "760e47a4ee64b4c48f4b30017011e09d4c0f05ed" + "reference": "596d12b40624055c300c8b619755b748ca5cf0b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/760e47a4ee64b4c48f4b30017011e09d4c0f05ed", - "reference": "760e47a4ee64b4c48f4b30017011e09d4c0f05ed", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/596d12b40624055c300c8b619755b748ca5cf0b5", + "reference": "596d12b40624055c300c8b619755b748ca5cf0b5", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": "^7.1.3", + "symfony/polyfill-ctype": "~1.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -2470,20 +2774,20 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:38:00+00:00" + "time": "2018-10-02T12:40:59+00:00" }, { "name": "symfony/finder", - "version": "v4.0.3", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "8b08180f2b7ccb41062366b9ad91fbc4f1af8601" + "reference": "1f17195b44543017a9c9b2d437c670627e96ad06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/8b08180f2b7ccb41062366b9ad91fbc4f1af8601", - "reference": "8b08180f2b7ccb41062366b9ad91fbc4f1af8601", + "url": "https://api.github.com/repos/symfony/finder/zipball/1f17195b44543017a9c9b2d437c670627e96ad06", + "reference": "1f17195b44543017a9c9b2d437c670627e96ad06", "shasum": "" }, "require": { @@ -2492,7 +2796,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -2519,34 +2823,34 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:38:00+00:00" + "time": "2018-10-03T08:47:56+00:00" }, { "name": "symfony/flex", - "version": "v1.0.53", + "version": "v1.1.1", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "cc4b1bac464597ce220d4f8208c38c75195e80c2" + "reference": "9fb60f232af0764d58002e7872acb43a74506d25" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/cc4b1bac464597ce220d4f8208c38c75195e80c2", - "reference": "cc4b1bac464597ce220d4f8208c38c75195e80c2", + "url": "https://api.github.com/repos/symfony/flex/zipball/9fb60f232af0764d58002e7872acb43a74506d25", + "reference": "9fb60f232af0764d58002e7872acb43a74506d25", "shasum": "" }, "require": { - "composer-plugin-api": "^1.1", + "composer-plugin-api": "^1.0", "php": "^7.0" }, "require-dev": { - "composer/composer": "^1.4", + "composer/composer": "^1.0.2", "symfony/phpunit-bridge": "^3.2.8" }, "type": "composer-plugin", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "1.1-dev" }, "class": "Symfony\\Flex\\Flex" }, @@ -2565,20 +2869,21 @@ "email": "fabien.potencier@gmail.com" } ], - "time": "2017-12-27T16:06:01+00:00" + "description": "Composer plugin for Symfony", + "time": "2018-09-03T08:17:12+00:00" }, { "name": "symfony/framework-bundle", - "version": "v4.0.2", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "82e45a486a2cbdab5d43512bea10af1681dcd8e2" + "reference": "3a0f2ec035c6ecc0f751fda1a76b02310bc9bbfe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/82e45a486a2cbdab5d43512bea10af1681dcd8e2", - "reference": "82e45a486a2cbdab5d43512bea10af1681dcd8e2", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/3a0f2ec035c6ecc0f751fda1a76b02310bc9bbfe", + "reference": "3a0f2ec035c6ecc0f751fda1a76b02310bc9bbfe", "shasum": "" }, "require": { @@ -2586,14 +2891,14 @@ "php": "^7.1.3", "symfony/cache": "~3.4|~4.0", "symfony/config": "~3.4|~4.0", - "symfony/dependency-injection": "~3.4|~4.0", - "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/dependency-injection": "^4.1.1", + "symfony/event-dispatcher": "^4.1", "symfony/filesystem": "~3.4|~4.0", "symfony/finder": "~3.4|~4.0", - "symfony/http-foundation": "~3.4|~4.0", - "symfony/http-kernel": "~3.4|~4.0", + "symfony/http-foundation": "^4.1", + "symfony/http-kernel": "^4.1", "symfony/polyfill-mbstring": "~1.0", - "symfony/routing": "~3.4|~4.0" + "symfony/routing": "^4.1" }, "conflict": { "phpdocumentor/reflection-docblock": "<3.0", @@ -2601,13 +2906,15 @@ "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", "symfony/asset": "<3.4", "symfony/console": "<3.4", - "symfony/form": "<3.4", + "symfony/form": "<4.1", + "symfony/messenger": ">=4.2", "symfony/property-info": "<3.4", - "symfony/serializer": "<3.4", + "symfony/serializer": "<4.1", "symfony/stopwatch": "<3.4", "symfony/translation": "<3.4", - "symfony/validator": "<3.4", - "symfony/workflow": "<3.4" + "symfony/twig-bridge": "<4.1.1", + "symfony/validator": "<4.1", + "symfony/workflow": "<4.1" }, "require-dev": { "doctrine/annotations": "~1.0", @@ -2620,22 +2927,23 @@ "symfony/css-selector": "~3.4|~4.0", "symfony/dom-crawler": "~3.4|~4.0", "symfony/expression-language": "~3.4|~4.0", - "symfony/form": "~3.4|~4.0", + "symfony/form": "^4.1", "symfony/lock": "~3.4|~4.0", + "symfony/messenger": "^4.1", "symfony/polyfill-intl-icu": "~1.0", "symfony/process": "~3.4|~4.0", "symfony/property-info": "~3.4|~4.0", "symfony/security": "~3.4|~4.0", "symfony/security-core": "~3.4|~4.0", "symfony/security-csrf": "~3.4|~4.0", - "symfony/serializer": "~3.4|~4.0", + "symfony/serializer": "^4.1", "symfony/stopwatch": "~3.4|~4.0", "symfony/templating": "~3.4|~4.0", "symfony/translation": "~3.4|~4.0", - "symfony/validator": "~3.4|~4.0", + "symfony/validator": "^4.1", "symfony/var-dumper": "~3.4|~4.0", "symfony/web-link": "~3.4|~4.0", - "symfony/workflow": "~3.4|~4.0", + "symfony/workflow": "^4.1", "symfony/yaml": "~3.4|~4.0", "twig/twig": "~1.34|~2.4" }, @@ -2652,7 +2960,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -2679,20 +2987,20 @@ ], "description": "Symfony FrameworkBundle", "homepage": "https://symfony.com", - "time": "2017-12-15T01:44:28+00:00" + "time": "2018-10-03T08:47:56+00:00" }, { "name": "symfony/http-foundation", - "version": "v4.0.2", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "aba96bd07be7796c81ca0ceafa7d48a6fef036c8" + "reference": "d528136617ff24f530e70df9605acc1b788b08d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/aba96bd07be7796c81ca0ceafa7d48a6fef036c8", - "reference": "aba96bd07be7796c81ca0ceafa7d48a6fef036c8", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d528136617ff24f530e70df9605acc1b788b08d4", + "reference": "d528136617ff24f530e70df9605acc1b788b08d4", "shasum": "" }, "require": { @@ -2700,12 +3008,13 @@ "symfony/polyfill-mbstring": "~1.1" }, "require-dev": { + "predis/predis": "~1.0", "symfony/expression-language": "~3.4|~4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -2732,33 +3041,34 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2017-12-14T19:48:22+00:00" + "time": "2018-10-03T08:48:45+00:00" }, { "name": "symfony/http-kernel", - "version": "v4.0.2", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "f2ea7461cdcad837b8bc6022b59d5eb8c9618aa5" + "reference": "f5e7c15a5d010be0e16ce798594c5960451d4220" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f2ea7461cdcad837b8bc6022b59d5eb8c9618aa5", - "reference": "f2ea7461cdcad837b8bc6022b59d5eb8c9618aa5", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f5e7c15a5d010be0e16ce798594c5960451d4220", + "reference": "f5e7c15a5d010be0e16ce798594c5960451d4220", "shasum": "" }, "require": { "php": "^7.1.3", "psr/log": "~1.0", "symfony/debug": "~3.4|~4.0", - "symfony/event-dispatcher": "~3.4|~4.0", - "symfony/http-foundation": "~3.4|~4.0" + "symfony/event-dispatcher": "~4.1", + "symfony/http-foundation": "^4.1.1", + "symfony/polyfill-ctype": "~1.8" }, "conflict": { "symfony/config": "<3.4", - "symfony/dependency-injection": "<3.4", - "symfony/var-dumper": "<3.4", + "symfony/dependency-injection": "<4.1", + "symfony/var-dumper": "<4.1.1", "twig/twig": "<1.34|<2.4,>=2" }, "provide": { @@ -2770,7 +3080,7 @@ "symfony/config": "~3.4|~4.0", "symfony/console": "~3.4|~4.0", "symfony/css-selector": "~3.4|~4.0", - "symfony/dependency-injection": "~3.4|~4.0", + "symfony/dependency-injection": "^4.1", "symfony/dom-crawler": "~3.4|~4.0", "symfony/expression-language": "~3.4|~4.0", "symfony/finder": "~3.4|~4.0", @@ -2779,7 +3089,7 @@ "symfony/stopwatch": "~3.4|~4.0", "symfony/templating": "~3.4|~4.0", "symfony/translation": "~3.4|~4.0", - "symfony/var-dumper": "~3.4|~4.0" + "symfony/var-dumper": "^4.1.1" }, "suggest": { "symfony/browser-kit": "", @@ -2791,7 +3101,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -2818,29 +3128,30 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2017-12-15T03:06:17+00:00" + "time": "2018-10-03T12:53:38+00:00" }, { "name": "symfony/inflector", - "version": "v4.0.2", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/inflector.git", - "reference": "8740990f67ec9f89bfa116d11bad2990dd510ece" + "reference": "07810b5c88ec0c2e98972571a40a126b44664e13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/inflector/zipball/8740990f67ec9f89bfa116d11bad2990dd510ece", - "reference": "8740990f67ec9f89bfa116d11bad2990dd510ece", + "url": "https://api.github.com/repos/symfony/inflector/zipball/07810b5c88ec0c2e98972571a40a126b44664e13", + "reference": "07810b5c88ec0c2e98972571a40a126b44664e13", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": "^7.1.3", + "symfony/polyfill-ctype": "~1.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -2875,7 +3186,7 @@ "symfony", "words" ], - "time": "2017-08-31T20:46:21+00:00" + "time": "2018-07-26T08:55:25+00:00" }, { "name": "symfony/lts", @@ -2883,12 +3194,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/lts.git", - "reference": "396c5fca8d73d01186df37d7031321a3c0c2bf92" + "reference": "c1affae45b78aee036effa1759237e7fa96d4af2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/lts/zipball/396c5fca8d73d01186df37d7031321a3c0c2bf92", - "reference": "396c5fca8d73d01186df37d7031321a3c0c2bf92", + "url": "https://api.github.com/repos/symfony/lts/zipball/c1affae45b78aee036effa1759237e7fa96d4af2", + "reference": "c1affae45b78aee036effa1759237e7fa96d4af2", "shasum": "" }, "conflict": { @@ -2917,6 +3228,7 @@ "symfony/intl": ">=5", "symfony/ldap": ">=5", "symfony/lock": ">=5", + "symfony/messenger": ">=5", "symfony/monolog-bridge": ">=5", "symfony/options-resolver": ">=5", "symfony/process": ">=5", @@ -2967,35 +3279,43 @@ ], "description": "Enforces Long Term Supported versions of Symfony components", "homepage": "https://symfony.com", - "time": "2017-10-19T02:16:32+00:00" + "abandoned": "symfony/flex", + "time": "2018-10-03T12:03:19+00:00" }, { "name": "symfony/maker-bundle", - "version": "v1.0.2", + "version": "v1.8.0", "source": { "type": "git", "url": "https://github.com/symfony/maker-bundle.git", - "reference": "bf97703ddb68c6b37bd6bab5f5ebd5c7542ca1ef" + "reference": "26643943fe19b5b47d620744907f09d1d6b3f06f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/bf97703ddb68c6b37bd6bab5f5ebd5c7542ca1ef", - "reference": "bf97703ddb68c6b37bd6bab5f5ebd5c7542ca1ef", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/26643943fe19b5b47d620744907f09d1d6b3f06f", + "reference": "26643943fe19b5b47d620744907f09d1d6b3f06f", "shasum": "" }, "require": { + "doctrine/inflector": "^1.2", + "nikic/php-parser": "^4.0", "php": "^7.0.8", "symfony/config": "^3.4|^4.0", "symfony/console": "^3.4|^4.0", "symfony/dependency-injection": "^3.4|^4.0", "symfony/filesystem": "^3.4|^4.0", + "symfony/finder": "^3.4|^4.0", "symfony/framework-bundle": "^3.4|^4.0", "symfony/http-kernel": "^3.4|^4.0" }, "require-dev": { + "allocine/twigcs": "^3.0", + "doctrine/doctrine-bundle": "^1.8", + "doctrine/orm": "^2.3", "friendsofphp/php-cs-fixer": "^2.8", "symfony/phpunit-bridge": "^3.4|^4.0", - "symfony/process": "^3.4|^4.0" + "symfony/process": "^3.4|^4.0", + "symfony/yaml": "^3.4|^4.0" }, "type": "symfony-bundle", "extra": { @@ -3018,13 +3338,15 @@ "homepage": "https://symfony.com/contributors" } ], + "description": "Symfony Maker helps you create empty commands, controllers, form classes, tests and more so you can forget about writing boilerplate code.", + "homepage": "https://symfony.com/doc/current/bundles/SymfonyMakerBundle/index.html", "keywords": [ "code generator", "generator", "scaffold", "scaffolding" ], - "time": "2017-12-04T17:50:28+00:00" + "time": "2018-10-13T19:56:32+00:00" }, { "name": "symfony/orm-pack", @@ -3055,17 +3377,75 @@ "time": "2017-12-12T01:47:50+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.6.0", + "name": "symfony/polyfill-ctype", + "version": "v1.9.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296" + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296", - "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "time": "2018-08-06T14:22:27+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.9.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d0cd638f4634c16d8df4508e847f14e9e43168b8", + "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8", "shasum": "" }, "require": { @@ -3077,7 +3457,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6-dev" + "dev-master": "1.9-dev" } }, "autoload": { @@ -3111,20 +3491,20 @@ "portable", "shim" ], - "time": "2017-10-11T12:05:26+00:00" + "time": "2018-08-06T14:22:27+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.6.0", + "version": "v1.9.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "6de4f4884b97abbbed9f0a84a95ff2ff77254254" + "reference": "95c50420b0baed23852452a7f0c7b527303ed5ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/6de4f4884b97abbbed9f0a84a95ff2ff77254254", - "reference": "6de4f4884b97abbbed9f0a84a95ff2ff77254254", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/95c50420b0baed23852452a7f0c7b527303ed5ae", + "reference": "95c50420b0baed23852452a7f0c7b527303ed5ae", "shasum": "" }, "require": { @@ -3133,7 +3513,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6-dev" + "dev-master": "1.9-dev" } }, "autoload": { @@ -3166,7 +3546,7 @@ "portable", "shim" ], - "time": "2017-10-11T12:05:26+00:00" + "time": "2018-08-06T14:22:27+00:00" }, { "name": "symfony/profiler-pack", @@ -3198,16 +3578,16 @@ }, { "name": "symfony/property-access", - "version": "v4.0.2", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "8dc059852b7bdd8b871eb3ca95b8d70be3b39488" + "reference": "ae5620fb79729bc8b5dd83b75507cbcae24f83ee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/8dc059852b7bdd8b871eb3ca95b8d70be3b39488", - "reference": "8dc059852b7bdd8b871eb3ca95b8d70be3b39488", + "url": "https://api.github.com/repos/symfony/property-access/zipball/ae5620fb79729bc8b5dd83b75507cbcae24f83ee", + "reference": "ae5620fb79729bc8b5dd83b75507cbcae24f83ee", "shasum": "" }, "require": { @@ -3223,7 +3603,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -3261,20 +3641,20 @@ "property path", "reflection" ], - "time": "2017-12-14T00:19:09+00:00" + "time": "2018-10-02T12:40:59+00:00" }, { "name": "symfony/routing", - "version": "v4.0.2", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "972810def5cae044d19195045f7eb418141bf37b" + "reference": "537803f0bdfede36b9acef052d2e4d447d9fa0e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/972810def5cae044d19195045f7eb418141bf37b", - "reference": "972810def5cae044d19195045f7eb418141bf37b", + "url": "https://api.github.com/repos/symfony/routing/zipball/537803f0bdfede36b9acef052d2e4d447d9fa0e9", + "reference": "537803f0bdfede36b9acef052d2e4d447d9fa0e9", "shasum": "" }, "require": { @@ -3287,7 +3667,6 @@ }, "require-dev": { "doctrine/annotations": "~1.0", - "doctrine/common": "~2.2", "psr/log": "~1.0", "symfony/config": "~3.4|~4.0", "symfony/dependency-injection": "~3.4|~4.0", @@ -3306,7 +3685,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -3339,20 +3718,20 @@ "uri", "url" ], - "time": "2017-12-14T22:39:22+00:00" + "time": "2018-10-02T12:40:59+00:00" }, { "name": "symfony/security", - "version": "v4.0.2", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/security.git", - "reference": "6ff0f1e97f583583c10152e4050e8a4fac2cfd1e" + "reference": "5393c2d277bf53fb3d91f083b067f8ce41033fcd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security/zipball/6ff0f1e97f583583c10152e4050e8a4fac2cfd1e", - "reference": "6ff0f1e97f583583c10152e4050e8a4fac2cfd1e", + "url": "https://api.github.com/repos/symfony/security/zipball/5393c2d277bf53fb3d91f083b067f8ce41033fcd", + "reference": "5393c2d277bf53fb3d91f083b067f8ce41033fcd", "shasum": "" }, "require": { @@ -3379,7 +3758,7 @@ "symfony/validator": "~3.4|~4.0" }, "suggest": { - "psr/container": "To instantiate the Security class", + "psr/container-implementation": "To instantiate the Security class", "symfony/expression-language": "For using the expression voter", "symfony/form": "", "symfony/ldap": "For using the LDAP user and authentication providers", @@ -3389,7 +3768,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -3416,33 +3795,33 @@ ], "description": "Symfony Security Component", "homepage": "https://symfony.com", - "time": "2017-12-14T19:48:22+00:00" + "time": "2018-10-02T12:40:59+00:00" }, { "name": "symfony/security-bundle", - "version": "v4.0.2", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "3b05217c09492ed797c2ac8244c77f9258f46cd1" + "reference": "be4456eb61bb142342a7c9a41e4127783b077a86" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/3b05217c09492ed797c2ac8244c77f9258f46cd1", - "reference": "3b05217c09492ed797c2ac8244c77f9258f46cd1", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/be4456eb61bb142342a7c9a41e4127783b077a86", + "reference": "be4456eb61bb142342a7c9a41e4127783b077a86", "shasum": "" }, "require": { "ext-xml": "*", "php": "^7.1.3", - "symfony/dependency-injection": "~3.4|~4.0", - "symfony/http-kernel": "~3.4|~4.0", - "symfony/security": "~3.4|~4.0" + "symfony/dependency-injection": "^3.4.3|^4.0.3", + "symfony/http-kernel": "^4.1", + "symfony/security": "^4.1.4" }, "conflict": { "symfony/console": "<3.4", "symfony/event-dispatcher": "<3.4", - "symfony/framework-bundle": "<3.4", + "symfony/framework-bundle": "<4.1.1", "symfony/var-dumper": "<3.4" }, "require-dev": { @@ -3455,7 +3834,7 @@ "symfony/event-dispatcher": "~3.4|~4.0", "symfony/expression-language": "~3.4|~4.0", "symfony/form": "~3.4|~4.0", - "symfony/framework-bundle": "~3.4|~4.0", + "symfony/framework-bundle": "~4.1", "symfony/http-foundation": "~3.4|~4.0", "symfony/process": "~3.4|~4.0", "symfony/translation": "~3.4|~4.0", @@ -3469,7 +3848,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -3496,20 +3875,20 @@ ], "description": "Symfony SecurityBundle", "homepage": "https://symfony.com", - "time": "2017-12-14T22:39:22+00:00" + "time": "2018-10-02T12:40:59+00:00" }, { "name": "symfony/stopwatch", - "version": "v4.0.2", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "ac0e49150555c703fef6b696d8eaba1db7a3ca03" + "reference": "5bfc064125b73ff81229e19381ce1c34d3416f4b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/ac0e49150555c703fef6b696d8eaba1db7a3ca03", - "reference": "ac0e49150555c703fef6b696d8eaba1db7a3ca03", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5bfc064125b73ff81229e19381ce1c34d3416f4b", + "reference": "5bfc064125b73ff81229e19381ce1c34d3416f4b", "shasum": "" }, "require": { @@ -3518,7 +3897,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -3545,20 +3924,20 @@ ], "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", - "time": "2017-11-09T12:45:29+00:00" + "time": "2018-10-02T12:40:59+00:00" }, { "name": "symfony/translation", - "version": "v4.0.3", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "2bb1b9dac38d32c5afb00edc9371b5db4cf6d000" + "reference": "9f0b61e339160a466ebcde167a6c5521c810e304" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/2bb1b9dac38d32c5afb00edc9371b5db4cf6d000", - "reference": "2bb1b9dac38d32c5afb00edc9371b5db4cf6d000", + "url": "https://api.github.com/repos/symfony/translation/zipball/9f0b61e339160a466ebcde167a6c5521c810e304", + "reference": "9f0b61e339160a466ebcde167a6c5521c810e304", "shasum": "" }, "require": { @@ -3573,20 +3952,21 @@ "require-dev": { "psr/log": "~1.0", "symfony/config": "~3.4|~4.0", + "symfony/console": "~3.4|~4.0", "symfony/dependency-injection": "~3.4|~4.0", "symfony/finder": "~2.8|~3.0|~4.0", "symfony/intl": "~3.4|~4.0", "symfony/yaml": "~3.4|~4.0" }, "suggest": { - "psr/log": "To use logging capability in translator", + "psr/log-implementation": "To use logging capability in translator", "symfony/config": "", "symfony/yaml": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -3613,20 +3993,20 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:38:00+00:00" + "time": "2018-10-02T16:36:10+00:00" }, { "name": "symfony/twig-bridge", - "version": "v4.0.2", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "aeb221936ad39c579b7e002dfd4e7544a5d666f6" + "reference": "7af4d9e7c38c1eb8c0d4e2528c33e6d23728ff7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/aeb221936ad39c579b7e002dfd4e7544a5d666f6", - "reference": "aeb221936ad39c579b7e002dfd4e7544a5d666f6", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/7af4d9e7c38c1eb8c0d4e2528c33e6d23728ff7e", + "reference": "7af4d9e7c38c1eb8c0d4e2528c33e6d23728ff7e", "shasum": "" }, "require": { @@ -3635,7 +4015,7 @@ }, "conflict": { "symfony/console": "<3.4", - "symfony/form": "<3.4" + "symfony/form": "<4.1.2" }, "require-dev": { "symfony/asset": "~3.4|~4.0", @@ -3643,7 +4023,7 @@ "symfony/dependency-injection": "~3.4|~4.0", "symfony/expression-language": "~3.4|~4.0", "symfony/finder": "~3.4|~4.0", - "symfony/form": "~3.4|~4.0", + "symfony/form": "^4.1.5", "symfony/http-foundation": "~3.4|~4.0", "symfony/http-kernel": "~3.4|~4.0", "symfony/polyfill-intl-icu": "~1.0", @@ -3676,7 +4056,7 @@ "type": "symfony-bridge", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -3703,43 +4083,44 @@ ], "description": "Symfony Twig Bridge", "homepage": "https://symfony.com", - "time": "2017-12-12T08:41:51+00:00" + "time": "2018-10-02T12:40:59+00:00" }, { "name": "symfony/twig-bundle", - "version": "v4.0.2", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "77381f8b99b319dc83e609c66942eb3a0a5b066d" + "reference": "efc59fa344a2b7985afae56877a6cf59de9954e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/77381f8b99b319dc83e609c66942eb3a0a5b066d", - "reference": "77381f8b99b319dc83e609c66942eb3a0a5b066d", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/efc59fa344a2b7985afae56877a6cf59de9954e2", + "reference": "efc59fa344a2b7985afae56877a6cf59de9954e2", "shasum": "" }, "require": { "php": "^7.1.3", "symfony/config": "~3.4|~4.0", - "symfony/http-foundation": "~3.4|~4.0", - "symfony/http-kernel": "~3.4|~4.0", - "symfony/twig-bridge": "~3.4|~4.0", + "symfony/http-foundation": "~4.1", + "symfony/http-kernel": "~4.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/twig-bridge": "^3.4.3|^4.0.3", "twig/twig": "~1.34|~2.4" }, "conflict": { - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<3.4" + "symfony/dependency-injection": "<4.1", + "symfony/framework-bundle": "<4.1" }, "require-dev": { "doctrine/annotations": "~1.0", "doctrine/cache": "~1.0", "symfony/asset": "~3.4|~4.0", - "symfony/dependency-injection": "~3.4|~4.0", + "symfony/dependency-injection": "~4.1", "symfony/expression-language": "~3.4|~4.0", "symfony/finder": "~3.4|~4.0", "symfony/form": "~3.4|~4.0", - "symfony/framework-bundle": "~3.4|~4.0", + "symfony/framework-bundle": "~4.1", "symfony/routing": "~3.4|~4.0", "symfony/stopwatch": "~3.4|~4.0", "symfony/templating": "~3.4|~4.0", @@ -3749,7 +4130,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -3776,24 +4157,25 @@ ], "description": "Symfony TwigBundle", "homepage": "https://symfony.com", - "time": "2017-12-04T12:31:58+00:00" + "time": "2018-09-30T03:38:13+00:00" }, { "name": "symfony/validator", - "version": "v4.0.3", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "dac55edb2d1a59026d2e51a04def7f9a1f19f365" + "reference": "eccf669ccfa447e5b9d850cd34db3a0539867773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/dac55edb2d1a59026d2e51a04def7f9a1f19f365", - "reference": "dac55edb2d1a59026d2e51a04def7f9a1f19f365", + "url": "https://api.github.com/repos/symfony/validator/zipball/eccf669ccfa447e5b9d850cd34db3a0539867773", + "reference": "eccf669ccfa447e5b9d850cd34db3a0539867773", "shasum": "" }, "require": { "php": "^7.1.3", + "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", "symfony/translation": "~3.4|~4.0" }, @@ -3801,6 +4183,7 @@ "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", "symfony/dependency-injection": "<3.4", "symfony/http-kernel": "<3.4", + "symfony/intl": "<4.1", "symfony/yaml": "<3.4" }, "require-dev": { @@ -3811,9 +4194,9 @@ "symfony/config": "~3.4|~4.0", "symfony/dependency-injection": "~3.4|~4.0", "symfony/expression-language": "~3.4|~4.0", - "symfony/http-foundation": "~3.4|~4.0", + "symfony/http-foundation": "~4.1", "symfony/http-kernel": "~3.4|~4.0", - "symfony/intl": "~3.4|~4.0", + "symfony/intl": "~4.1", "symfony/property-access": "~3.4|~4.0", "symfony/var-dumper": "~3.4|~4.0", "symfony/yaml": "~3.4|~4.0" @@ -3833,7 +4216,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -3860,20 +4243,20 @@ ], "description": "Symfony Validator Component", "homepage": "https://symfony.com", - "time": "2018-01-03T17:15:19+00:00" + "time": "2018-10-02T16:36:10+00:00" }, { "name": "symfony/var-dumper", - "version": "v4.0.2", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "0991597a40f062bab7203efc2cc6cee9b3d44ed6" + "reference": "60319b45653580b0cdacca499344577d87732f16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0991597a40f062bab7203efc2cc6cee9b3d44ed6", - "reference": "0991597a40f062bab7203efc2cc6cee9b3d44ed6", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/60319b45653580b0cdacca499344577d87732f16", + "reference": "60319b45653580b0cdacca499344577d87732f16", "shasum": "" }, "require": { @@ -3882,20 +4265,26 @@ "symfony/polyfill-php72": "~1.5" }, "conflict": { - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/console": "<3.4" }, "require-dev": { "ext-iconv": "*", + "symfony/process": "~3.4|~4.0", "twig/twig": "~1.34|~2.4" }, "suggest": { "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump" + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" }, + "bin": [ + "Resources/bin/var-dump-server" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -3929,25 +4318,25 @@ "debug", "dump" ], - "time": "2017-12-12T08:41:51+00:00" + "time": "2018-10-02T16:36:10+00:00" }, { "name": "symfony/web-profiler-bundle", - "version": "v4.0.2", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "81e20cbc7b998918a413fbf84a6f2cc770837e10" + "reference": "17fed79cdbc4649ea59297e6ca7aa8e89182c3c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/81e20cbc7b998918a413fbf84a6f2cc770837e10", - "reference": "81e20cbc7b998918a413fbf84a6f2cc770837e10", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/17fed79cdbc4649ea59297e6ca7aa8e89182c3c1", + "reference": "17fed79cdbc4649ea59297e6ca7aa8e89182c3c1", "shasum": "" }, "require": { "php": "^7.1.3", - "symfony/http-kernel": "~3.4|~4.0", + "symfony/http-kernel": "~4.1", "symfony/routing": "~3.4|~4.0", "symfony/twig-bridge": "~3.4|~4.0", "symfony/var-dumper": "~3.4|~4.0", @@ -3968,7 +4357,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -3995,24 +4384,25 @@ ], "description": "Symfony WebProfilerBundle", "homepage": "https://symfony.com", - "time": "2017-12-12T08:41:51+00:00" + "time": "2018-09-30T03:38:13+00:00" }, { "name": "symfony/yaml", - "version": "v4.0.2", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "a5ee52d155f06ad23b19eb63c31228ff56ad1116" + "reference": "367e689b2fdc19965be435337b50bc8adf2746c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/a5ee52d155f06ad23b19eb63c31228ff56ad1116", - "reference": "a5ee52d155f06ad23b19eb63c31228ff56ad1116", + "url": "https://api.github.com/repos/symfony/yaml/zipball/367e689b2fdc19965be435337b50bc8adf2746c9", + "reference": "367e689b2fdc19965be435337b50bc8adf2746c9", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": "^7.1.3", + "symfony/polyfill-ctype": "~1.8" }, "conflict": { "symfony/console": "<3.4" @@ -4026,7 +4416,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -4053,35 +4443,36 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2017-12-12T08:41:51+00:00" + "time": "2018-10-02T16:36:10+00:00" }, { "name": "twig/twig", - "version": "v2.4.4", + "version": "v2.5.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "eddb97148ad779f27e670e1e3f19fb323aedafeb" + "reference": "6a5f676b77a90823c2d4eaf76137b771adf31323" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/eddb97148ad779f27e670e1e3f19fb323aedafeb", - "reference": "eddb97148ad779f27e670e1e3f19fb323aedafeb", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/6a5f676b77a90823c2d4eaf76137b771adf31323", + "reference": "6a5f676b77a90823c2d4eaf76137b771adf31323", "shasum": "" }, "require": { "php": "^7.0", + "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-mbstring": "~1.0" }, "require-dev": { "psr/container": "^1.0", - "symfony/debug": "~2.7", - "symfony/phpunit-bridge": "~3.3@dev" + "symfony/debug": "^2.7", + "symfony/phpunit-bridge": "^3.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.4-dev" + "dev-master": "2.5-dev" } }, "autoload": { @@ -4110,29 +4501,29 @@ }, { "name": "Twig Team", - "homepage": "http://twig.sensiolabs.org/contributors", + "homepage": "https://twig.symfony.com/contributors", "role": "Contributors" } ], "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "http://twig.sensiolabs.org", + "homepage": "https://twig.symfony.com", "keywords": [ "templating" ], - "time": "2017-09-27T18:10:31+00:00" + "time": "2018-07-13T07:18:09+00:00" }, { "name": "zendframework/zend-code", - "version": "3.3.0", + "version": "3.3.1", "source": { "type": "git", "url": "https://github.com/zendframework/zend-code.git", - "reference": "6b1059db5b368db769e4392c6cb6cc139e56640d" + "reference": "c21db169075c6ec4b342149f446e7b7b724f95eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-code/zipball/6b1059db5b368db769e4392c6cb6cc139e56640d", - "reference": "6b1059db5b368db769e4392c6cb6cc139e56640d", + "url": "https://api.github.com/repos/zendframework/zend-code/zipball/c21db169075c6ec4b342149f446e7b7b724f95eb", + "reference": "c21db169075c6ec4b342149f446e7b7b724f95eb", "shasum": "" }, "require": { @@ -4153,8 +4544,8 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev", - "dev-develop": "3.3-dev" + "dev-master": "3.3.x-dev", + "dev-develop": "3.4.x-dev" } }, "autoload": { @@ -4172,20 +4563,20 @@ "code", "zf2" ], - "time": "2017-10-20T15:21:32+00:00" + "time": "2018-08-13T20:36:59+00:00" }, { "name": "zendframework/zend-eventmanager", - "version": "3.2.0", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/zendframework/zend-eventmanager.git", - "reference": "9d72db10ceb6e42fb92350c0cb54460da61bd79c" + "reference": "a5e2583a211f73604691586b8406ff7296a946dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/9d72db10ceb6e42fb92350c0cb54460da61bd79c", - "reference": "9d72db10ceb6e42fb92350c0cb54460da61bd79c", + "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd", + "reference": "a5e2583a211f73604691586b8406ff7296a946dd", "shasum": "" }, "require": { @@ -4194,7 +4585,7 @@ "require-dev": { "athletic/athletic": "^0.1", "container-interop/container-interop": "^1.1.0", - "phpunit/phpunit": "^6.0.7 || ^5.7.14", + "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2", "zendframework/zend-coding-standard": "~1.0.0", "zendframework/zend-stdlib": "^2.7.3 || ^3.0" }, @@ -4226,32 +4617,35 @@ "events", "zf2" ], - "time": "2017-07-11T19:17:22+00:00" + "time": "2018-04-25T15:33:34+00:00" } ], "packages-dev": [ { "name": "doctrine/data-fixtures", - "version": "v1.3.0", + "version": "v1.3.1", "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "7b76ccc8e648c4502aad7f61347326c8a072bd3b" + "reference": "3a1e2c3c600e615a2dffe56d4ca0875cc5233e0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/7b76ccc8e648c4502aad7f61347326c8a072bd3b", - "reference": "7b76ccc8e648c4502aad7f61347326c8a072bd3b", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/3a1e2c3c600e615a2dffe56d4ca0875cc5233e0a", + "reference": "3a1e2c3c600e615a2dffe56d4ca0875cc5233e0a", "shasum": "" }, "require": { "doctrine/common": "~2.2", "php": "^7.1" }, + "conflict": { + "doctrine/phpcr-odm": "<1.3.0" + }, "require-dev": { "doctrine/dbal": "^2.5.4", "doctrine/orm": "^2.5.4", - "phpunit/phpunit": "^6.3" + "phpunit/phpunit": "^7.0" }, "suggest": { "alcaeus/mongo-php-adapter": "For using MongoDB ODM with PHP 7", @@ -4285,7 +4679,7 @@ "keywords": [ "database" ], - "time": "2017-11-27T18:48:06+00:00" + "time": "2018-03-20T09:06:36+00:00" }, { "name": "doctrine/doctrine-fixtures-bundle", @@ -4350,16 +4744,16 @@ }, { "name": "symfony/dotenv", - "version": "v4.0.2", + "version": "v4.1.6", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "ffcaeab01e42b0c40669add2aa8e77f79ddb9389" + "reference": "22ca63c46e252b8a8f37b8f9e6da66bff5b3d3e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/ffcaeab01e42b0c40669add2aa8e77f79ddb9389", - "reference": "ffcaeab01e42b0c40669add2aa8e77f79ddb9389", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/22ca63c46e252b8a8f37b8f9e6da66bff5b3d3e7", + "reference": "22ca63c46e252b8a8f37b8f9e6da66bff5b3d3e7", "shasum": "" }, "require": { @@ -4371,7 +4765,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -4403,25 +4797,25 @@ "env", "environment" ], - "time": "2017-12-08T15:46:13+00:00" + "time": "2018-07-26T11:24:31+00:00" }, { "name": "symfony/thanks", - "version": "v1.0.0", + "version": "v1.1.0", "source": { "type": "git", "url": "https://github.com/symfony/thanks.git", - "reference": "f3e567198cbac9dbec5baf9004f1e51fecc82c79" + "reference": "9474a631b52737c623b6aeba22f00bbc003251da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/thanks/zipball/f3e567198cbac9dbec5baf9004f1e51fecc82c79", - "reference": "f3e567198cbac9dbec5baf9004f1e51fecc82c79", + "url": "https://api.github.com/repos/symfony/thanks/zipball/9474a631b52737c623b6aeba22f00bbc003251da", + "reference": "9474a631b52737c623b6aeba22f00bbc003251da", "shasum": "" }, "require": { - "composer-plugin-api": "^1.1", - "php": "^5.5.9|^7.0.8" + "composer-plugin-api": "^1.0", + "php": "^5.5.9|^7.0.0" }, "type": "composer-plugin", "extra": { @@ -4445,7 +4839,8 @@ "email": "p@tchwork.com" } ], - "time": "2017-12-20T21:36:05+00:00" + "description": "Give thanks (in the form of a GitHub ⭐) to your fellow PHP package maintainers (not limited to Symfony components)!", + "time": "2018-08-24T14:08:13+00:00" } ], "aliases": [], diff --git a/config/bundles.php b/config/bundles.php index 9e9caf97..db1fdb73 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -11,5 +11,7 @@ return [ Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], + + Catalyst\APIBundle\CatalystAPIBundle::class => ['all' => true], // DataDog\AuditBundle\DataDogAuditBundle::class => ['all' => true], ]; diff --git a/config/packages/security.yaml b/config/packages/security.yaml index 6de188ee..1911adb5 100644 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -5,10 +5,12 @@ security: algorithm: bcrypt cost: 12 providers: - user: + user_provider: entity: class: App\Entity\User property: username + api_key_user_provider: + id: Catalyst\APIBundle\Security\APIKeyUserProvider firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ @@ -27,7 +29,15 @@ security: pattern: ^\/rapi\/ security: false + warranty_api: + pattern: ^\/capi\/ + stateless: true + simple_preauth: + authenticator: Catalyst\APIBundle\Security\APIKeyAuthenticator + provider: api_key_user_provider + main: + provider: user_provider form_login: login_path: login check_path: login diff --git a/config/routes/warranty_api.yaml b/config/routes/warranty_api.yaml new file mode 100644 index 00000000..bfc4d731 --- /dev/null +++ b/config/routes/warranty_api.yaml @@ -0,0 +1,75 @@ +# api test +capi_test: + path: /capi/test + controller: App\Controller\CAPI\TestController::test + + +# battery api + +# battery models +capi_battery_models: + path: /capi/battery_models + controller: App\Controller\CAPI\BatteryController::getModels + methods: [GET] + +# battery sizes +capi_battery_sizes: + path: /capi/battery_sizes + controller: App\Controller\CAPI\BatteryController::getSizes + methods: [GET] + + +# vehicle api + +capi_vehicle_mfgs: + path: /capi/vehicle_manufacturers + controller: App\Controller\CAPI\VehicleController::getManufacturers + methods: [GET] + +capi_vehicle_list: + path: /capi/vehicles + controller: App\Controller\CAPI\VehicleController::list + methods: [GET] + + +# warranty api + +# check warranty by serial +capi_warranty_find: + path: /capi/warranty/{serial} + controller: App\Controller\CAPI\WarrantyController::find + methods: [GET] + +# register battery +capi_warranty_register: + path: /capi/warranty + controller: App\Controller\CAPI\WarrantyController::register + methods: [POST] + +# claim warranty +capi_warranty_claim: + path: /capi/warranty/{serial}/claim + controller: App\Controller\CAPI\WarrantyController::claim + methods: [POST] + + + +# customer vehicle api + +# find customer vehicle by id +capi_cv_find_by_id: + path: /capi/customer_vehicle/id/{id} + controller: App\Controller\::findByID + methods: [GET] + +# find customer vehicle by plate +capi_cv_find_by_plate: + path: /capi/customer_vehicle/plate/{plate} + controller: App\Controller\CAPI\CustomerVehicle::findByPlate + methods: [GET] + +# register customer vehicle +capi_cv_register: + path: /capi/customer_vehicle + controller: App\Controller\CAPI\CustomerVehicle::register + methods: [POST] diff --git a/config/services.yaml b/config/services.yaml index 3fb4c50f..00d35755 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -75,3 +75,20 @@ services: arguments: $ip_address: "%env(APNS_REDIS_IP_ADDRESS)%" $port: "%env(APNS_REDIS_PORT)%" + + Catalyst\APIBundle\Security\APIKeyUserProvider: + arguments: + $em: "@doctrine.orm.entity_manager" + + Catalyst\APIBundle\Security\APIKeyAuthenticator: + arguments: + $em: "@doctrine.orm.entity_manager" + + Catalyst\APIBundle\Command\UserCreateCommand: + arguments: + $em: "@doctrine.orm.entity_manager" + tags: ['console.command'] + + Catalyst\APIBundle\Command\TestCommand: + tags: ['console.command'] + diff --git a/src/Controller/CAPI/BatteryController.php b/src/Controller/CAPI/BatteryController.php new file mode 100644 index 00000000..f99d0ad5 --- /dev/null +++ b/src/Controller/CAPI/BatteryController.php @@ -0,0 +1,55 @@ +getRepository(BatteryModel::class)->findBy([], ['name' => 'ASC']); + + $result = []; + foreach ($models as $model) + { + $result[] = [ + 'id' => $model->getID(), + 'name' => $model->getName(), + ]; + } + + $data = [ + 'models' => $result, + ]; + + return new APIResponse(true, 'Battery models loaded.', $data); + } + + public function getSizes(EntityManagerInterface $em) + { + $sizes = $em->getRepository(BatterySize::class)->findBy([], ['name' => 'ASC']); + + $result = []; + foreach ($sizes as $size) + { + $result[] = [ + 'id' => $size->getID(), + 'name' => $size->getName(), + ]; + } + + $data = [ + 'sizes' => $result, + ]; + + return new APIResponse(true, 'Battery sizes loaded.', $data); + } +} diff --git a/src/Controller/CAPI/TestController.php b/src/Controller/CAPI/TestController.php new file mode 100644 index 00000000..0143166a --- /dev/null +++ b/src/Controller/CAPI/TestController.php @@ -0,0 +1,20 @@ + 'Test successful.', + ]; + return new APIResponse(true, 'Test successful.', $data); + } +} diff --git a/src/Controller/CAPI/VehicleController.php b/src/Controller/CAPI/VehicleController.php new file mode 100644 index 00000000..67527bb3 --- /dev/null +++ b/src/Controller/CAPI/VehicleController.php @@ -0,0 +1,55 @@ +getRepository(VehicleManufacturer::class)->findBy([], ['name' => 'ASC']); + + $result = []; + foreach ($mfgs as $mfg) + { + $result[] = [ + 'id' => $mfg->getID(), + 'name' => $mfg->getName(), + ]; + } + + $data = [ + 'manufacturers' => $result, + ]; + + return new APIResponse(true, 'Vehicle manufacturers loaded.', $data); + } + + public function list(EntityManagerInterface $em) + { + $vehicles = $em->getRepository(Vehicle::class)->findBy([], ['manufacturer' => 'ASC', 'make' => 'ASC']); + + $result = []; + foreach ($vehicles as $v) + { + $result[] = [ + 'id' => $v->getID(), + 'name' => $v->getMake() . ' ' . $v->getModelYearFormatted(), + ]; + } + + $data = [ + 'vehicles' => $result, + ]; + + return new APIResponse(true, 'Vehicles loaded.', $data); + } +} diff --git a/src/Controller/CAPI/WarrantyController.php b/src/Controller/CAPI/WarrantyController.php new file mode 100644 index 00000000..433f710f --- /dev/null +++ b/src/Controller/CAPI/WarrantyController.php @@ -0,0 +1,185 @@ +getMethod() == 'GET') + { + $check = $req->query->get($param); + if (empty($check)) + $missing[] = $param; + } + // else if ($req->getMethod() == 'POST') + else + { + $check = $req->request->get($param); + if (empty($check)) + $missing[] = $param; + } + } + + // check missing parameters + if (count($missing) > 0) + { + $miss_string = implode(', ', $missing); + return 'Missing required parameter(s): ' . $miss_string; + } + + return false; + } + + protected function cleanSerial($serial) + { + return trim(strtoupper($serial)); + } + + protected function generateWarrantyData(Warranty $warr) + { + $data = [ + 'id' => (int) $warr->getID(), + 'serial' => (string) $warr->getSerial(), + 'warranty_class' => (string) $warr->getWarrantyClass(), + 'plate_number' => (string) $warr->getPlateNumber(), + 'status' => (string) $warr->getStatus(), + 'date_create' => (string) $warr->getDateCreate()->format('YmdHis'), + 'date_purchase' => (string) $warr->getDatePurchase()->format('Ymd'), + 'date_expire' => (string) $warr->getDateExpire()->format('Ymd'), + ]; + + $date_claim = $warr->getDateClaim(); + if ($date_claim == null) + $data['date_claim'] = null; + else + $data['date_claim'] = (string) $warr->getDateClaim()->format('Ymd'); + + return $data; + } + + public function find($serial, EntityManagerInterface $em) + { + $clean_serial = $this->cleanSerial($serial); + $warr = $em->getRepository(Warranty::class)->findOneBy(['serial' => $clean_serial]); + + if ($warr == null) + return new APIResponse(false, 'No warranty found with that serial number.', null, 404); + + + $data = [ + 'warranty' => $this->generateWarrantyData($warr), + ]; + + return new APIResponse(true, 'Warranty found.', $data); + } + + public function register(Request $req, EntityManagerInterface $em) + { + // required parameters + $params = [ + 'serial', + 'warranty_class', + 'plate_number', + 'date_expire', + 'date_purchase', + ]; + $msg = $this->checkRequiredParameters($req, $params); + error_log('msg - ' . $msg); + if ($msg) + return new APIResponse(false, $msg); + + $serial = $req->request->get('serial'); + $date_expire_string = $req->request->get('date_expire'); + $date_pur_string = $req->request->get('date_purchase'); + $warr_class = $req->request->get('warranty_class'); + $plate = $req->request->get('plate_number'); + + // wrong date expire format + $date_expire = DateTime::createFromFormat('Ymd', $date_expire_string); + if ($date_expire === false) + return new APIResponse(false, 'Wrong date format: date_expire.'); + + // wrong date purchase format + $date_pur = DateTime::createFromFormat('Ymd', $date_pur_string); + if ($date_pur === false) + return new APIResponse(false, 'Wrong date format: date_purchase.'); + + // valid warranty class + if (!WarrantyClass::validate($warr_class)) + return new APIResponse(false, 'Invalid warranty class.'); + + // plate number + $plate = Warranty::cleanPlateNumber($plate); + if (!$plate) + return new APIResponse(false, 'Invalid plate number.'); + + // warranty + $warr = new Warranty(); + $warr->setSerial($serial) + ->setWarrantyClass($warr_class) + ->setPlateNumber($plate) + ->setDatePurchase($date_pur) + ->setDateClaim(null) + ->setDateExpire($date_expire); + + try + { + $em->persist($warr); + $em->flush(); + } + catch (UniqueConstraintViolationException $e) + { + return new APIResponse(false, 'Duplicate serial encountered.'); + } + + // data + $data = [ + 'warranty' => $this->generateWarrantyData($warr), + ]; + + return new APIResponse(true, 'Warranty registered.', $data); + } + + public function claim(Request $req, EntityManagerInterface $em, $serial) + { + $clean_serial = $this->cleanSerial($serial); + $warr = $em->getRepository(Warranty::class)->findOneBy(['serial' => $clean_serial]); + + // no warranty + if ($warr == null) + return new APIResponse(false, 'No warranty found with that serial number.', null, 404); + + // warranty is not active + if (!$warr->canClaim()) + return new APIResponse(false, 'Warranty is not active.'); + + // set status to claim + $warr->setStatus(WarrantyStatus::CLAIMED) + ->setDateClaim(new DateTime()); + + $em->flush(); + + // TODO: claim log + + return new APIResponse(true, 'Warranty claimed successfully.'); + } +} diff --git a/src/Entity/Warranty.php b/src/Entity/Warranty.php new file mode 100644 index 00000000..040c6c49 --- /dev/null +++ b/src/Entity/Warranty.php @@ -0,0 +1,207 @@ +date_create = new DateTime(); + $this->warranty_class = WarrantyClass::WTY_PRIVATE; + $this->status = WarrantyStatus::ACTIVE; + $this->date_claim = null; + } + + public function getID() + { + return $this->id; + } + + public function setSerial($serial) + { + $this->serial = $serial; + return $this; + } + + public function getSerial() + { + return $this->serial; + } + + public function setWarrantyClass($class) + { + $this->warranty_class = $class; + return $this; + } + + public function getWarrantyClass() + { + return $this->warranty_class; + } + + // TODO: use a service to handle plate number filtering + public static function cleanPlateNumber($plate) + { + // trim and make upper case + $clean_plate = strtoupper(trim($plate)); + + // remove invalid characters + $clean_plate = preg_replace("/[^A-Z0-9]/", '', $clean_plate); + + // check if format is correct + // AAA123 or AAA1234 + $res = preg_match("/^[A-Z]{3}[0-9]{3,4}$/", $clean_plate); + if ($res) + return $clean_plate; + + return false; + } + + public function setPlateNumber($plate) + { + // TODO: custom exception + $plate_number = $this->cleanPlateNumber($plate); + if (!$plate_number) + throw new Exception('Invalid plate number.'); + + $this->plate_number = $plate_number; + + return $this; + } + + public function getPlateNumber() + { + return $this->plate_number; + } + + public function setStatus($status) + { + $this->status = $status; + return $this; + } + + public function getStatus() + { + return $this->status; + } + + public function getDateCreate() + { + return $this->date_create; + } + + public function setDatePurchase(DateTime $date) + { + $this->date_purchase = $date; + return $this; + } + + public function getDatePurchase() + { + return $this->date_purchase; + } + + public function setDateExpire(DateTime $date) + { + $this->date_expire = $date; + return $this; + } + + public function getDateExpire() + { + return $this->date_expire; + } + + public function setDateClaim(DateTime $date = null) + { + $this->date_claim = $date; + return $this; + } + + public function getDateClaim() + { + return $this->date_claim; + } + + public function canClaim() + { + if ($this->status == WarrantyStatus::ACTIVE) + return true; + + if ($this->status == WarrantyStatus::CLAIMED) + return true; + + return false; + } +} diff --git a/src/Ramcar/WarrantyStatus.php b/src/Ramcar/WarrantyStatus.php new file mode 100644 index 00000000..0dd419a2 --- /dev/null +++ b/src/Ramcar/WarrantyStatus.php @@ -0,0 +1,18 @@ + 'Active', + 'expired' => 'Expired', + 'claimed' => 'Claimed', + 'cancelled' => 'Cancelled', + ]; +} diff --git a/symfony.lock b/symfony.lock index e5a554fe..c4d2edd6 100644 --- a/symfony.lock +++ b/symfony.lock @@ -56,6 +56,9 @@ "ref": "c1431086fec31f17fbcfe6d6d7e92059458facc1" } }, + "doctrine/event-manager": { + "version": "v1.0.0" + }, "doctrine/inflector": { "version": "v1.2.0" }, @@ -71,6 +74,12 @@ "doctrine/orm": { "version": "v2.6.0" }, + "doctrine/persistence": { + "version": "v1.0.1" + }, + "doctrine/reflection": { + "version": "v1.0.0" + }, "guzzlehttp/guzzle": { "version": "6.3.0" }, @@ -83,6 +92,9 @@ "jdorn/sql-formatter": { "version": "v1.2.17" }, + "nikic/php-parser": { + "version": "v4.1.0" + }, "ocramius/package-versions": { "version": "1.2.0" }, @@ -197,6 +209,9 @@ "symfony/orm-pack": { "version": "v1.0.5" }, + "symfony/polyfill-ctype": { + "version": "v1.9.0" + }, "symfony/polyfill-mbstring": { "version": "v1.6.0" },