From 6c853cf98c070056e453d9af68d14621a5725b79 Mon Sep 17 00:00:00 2001 From: Toky Herizo Date: Mon, 12 Feb 2018 11:24:14 +0400 Subject: [PATCH] udpate facebook SDK to 5.6 --- composer.json | 4 +- composer.lock | 357 +++++++++--------- config/configuration.sample.yml | 1 + .../Authentication/Provider/Facebook.php | 135 +++++-- .../Authentication/Provider/FacebookTest.php | 144 ++++--- 5 files changed, 380 insertions(+), 261 deletions(-) diff --git a/composer.json b/composer.json index 1dbc1c195a..e1c1bcb27f 100644 --- a/composer.json +++ b/composer.json @@ -67,7 +67,6 @@ "doctrine/migrations": "^1.0.0", "doctrine/orm": "^2.4.0", "elasticsearch/elasticsearch": "~2.0", - "facebook/php-sdk": "~3.2.3", "firebase/php-jwt": "^3.0.0", "gedmo/doctrine-extensions": "~2.3.0", "goodby/csv": "^1.3.0", @@ -119,7 +118,8 @@ "zend/gdata": "~1.12.1", "alchemy/worker-bundle": "^0.1.6", "alchemy/queue-bundle": "^0.1.5", - "google/recaptcha": "^1.1" + "google/recaptcha": "^1.1", + "facebook/graph-sdk": "^5.6" }, "require-dev": { "mikey179/vfsStream": "~1.5", diff --git a/composer.lock b/composer.lock index b018697c4d..cdad0d3708 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "41adbd5e058f718ce8a77e032f5bee29", - "content-hash": "a4f51c090576f4175a2b705cfeff622f", + "content-hash": "27b7c5232802fb93dcf5dc79141df96f", "packages": [ { "name": "alchemy-fr/tcpdf-clone", @@ -71,7 +70,7 @@ "source": "https://github.com/alchemy-fr/tcpdf-clone/tree/6.0.039", "issues": "https://github.com/alchemy-fr/tcpdf-clone/issues" }, - "time": "2013-10-13 16:11:17" + "time": "2013-10-13T16:11:17+00:00" }, { "name": "alchemy/binary-driver", @@ -128,7 +127,7 @@ "binary", "driver" ], - "time": "2016-03-02 13:49:15" + "time": "2016-03-02T13:49:15+00:00" }, { "name": "alchemy/embed-bundle", @@ -182,7 +181,7 @@ "source": "https://github.com/alchemy-fr/embed-bundle/tree/0.3.7", "issues": "https://github.com/alchemy-fr/embed-bundle/issues" }, - "time": "2017-05-30 13:18:21" + "time": "2017-05-30T13:18:21+00:00" }, { "name": "alchemy/geonames-api-consumer", @@ -220,7 +219,7 @@ "keywords": [ "geonames" ], - "time": "2014-02-05 15:29:39" + "time": "2014-02-05T15:29:39+00:00" }, { "name": "alchemy/ghostscript", @@ -272,7 +271,7 @@ "ghostscript", "pdf" ], - "time": "2013-06-25 09:12:58" + "time": "2013-06-25T09:12:58+00:00" }, { "name": "alchemy/mediavorus", @@ -335,7 +334,7 @@ "keywords": [ "metadata" ], - "time": "2016-05-02 15:08:36" + "time": "2016-05-02T15:08:36+00:00" }, { "name": "alchemy/oauth2php", @@ -358,7 +357,7 @@ ] }, "notification-url": "https://packagist.org/downloads/", - "time": "2013-07-01 09:46:59" + "time": "2013-07-01T09:46:59+00:00" }, { "name": "alchemy/phlickr", @@ -381,7 +380,7 @@ } }, "notification-url": "https://packagist.org/downloads/", - "time": "2014-12-15 14:27:57" + "time": "2014-12-15T14:27:57+00:00" }, { "name": "alchemy/phpexiftool", @@ -454,7 +453,7 @@ "exiftool", "metadata" ], - "time": "2017-05-18 19:04:04" + "time": "2017-05-18T19:04:04+00:00" }, { "name": "alchemy/queue-bundle", @@ -502,7 +501,7 @@ } ], "description": "Symfony bundle for alchemy/queue-component", - "time": "2016-10-04 14:19:39" + "time": "2016-10-04T14:19:39+00:00" }, { "name": "alchemy/queue-component", @@ -547,7 +546,7 @@ "MIT" ], "description": "Message queue component", - "time": "2016-10-05 10:41:36" + "time": "2016-10-05T10:41:36+00:00" }, { "name": "alchemy/rest-bundle", @@ -599,7 +598,7 @@ } ], "description": "Simple REST utility bundle", - "time": "2016-05-16 09:37:34" + "time": "2016-05-16T09:37:34+00:00" }, { "name": "alchemy/symfony-cors", @@ -646,7 +645,7 @@ } ], "description": "A library that adds CORS services to Silex/Symfony Applications", - "time": "2015-12-17 15:34:43" + "time": "2015-12-17T15:34:43+00:00" }, { "name": "alchemy/task-manager", @@ -709,7 +708,7 @@ "parallel", "process" ], - "time": "2016-11-30 13:34:30" + "time": "2016-11-30T13:34:30+00:00" }, { "name": "alchemy/worker-bundle", @@ -758,7 +757,7 @@ } ], "description": "Symfony bundle for alchemy/worker-component", - "time": "2016-12-06 10:39:58" + "time": "2016-12-06T10:39:58+00:00" }, { "name": "alchemy/worker-component", @@ -804,7 +803,7 @@ "MIT" ], "description": "Message queue worker component", - "time": "2016-11-14 16:41:16" + "time": "2016-11-14T16:41:16+00:00" }, { "name": "alchemy/zippy", @@ -866,7 +865,7 @@ "tar", "zip" ], - "time": "2016-02-15 22:46:40" + "time": "2016-02-15T22:46:40+00:00" }, { "name": "aws/aws-sdk-php", @@ -929,7 +928,7 @@ "s3", "sdk" ], - "time": "2016-07-25 18:03:20" + "time": "2016-07-25T18:03:20+00:00" }, { "name": "beberlei/assert", @@ -984,7 +983,7 @@ "assertion", "validation" ], - "time": "2017-01-24 15:14:39" + "time": "2017-01-24T15:14:39+00:00" }, { "name": "behat/transliterator", @@ -1024,7 +1023,7 @@ "slug", "transliterator" ], - "time": "2015-09-28 16:26:35" + "time": "2015-09-28T16:26:35+00:00" }, { "name": "cocur/slugify", @@ -1088,7 +1087,7 @@ "slug", "slugify" ], - "time": "2016-08-09 20:10:17" + "time": "2016-08-09T20:10:17+00:00" }, { "name": "dailymotion/sdk", @@ -1121,7 +1120,7 @@ "dailymotion", "sdk" ], - "time": "2015-11-20 11:18:32" + "time": "2015-11-20T11:18:32+00:00" }, { "name": "data-uri/data-uri", @@ -1166,7 +1165,7 @@ "data-uri", "uri" ], - "time": "2014-08-22 15:01:57" + "time": "2014-08-22T15:01:57+00:00" }, { "name": "dflydev/doctrine-orm-service-provider", @@ -1228,7 +1227,7 @@ "pimple", "silex" ], - "time": "2015-09-07 12:16:54" + "time": "2015-09-07T12:16:54+00:00" }, { "name": "doctrine/annotations", @@ -1296,7 +1295,7 @@ "docblock", "parser" ], - "time": "2015-08-31 12:32:49" + "time": "2015-08-31T12:32:49+00:00" }, { "name": "doctrine/cache", @@ -1366,7 +1365,7 @@ "cache", "caching" ], - "time": "2016-10-29 11:16:17" + "time": "2016-10-29T11:16:17+00:00" }, { "name": "doctrine/collections", @@ -1432,7 +1431,7 @@ "collections", "iterator" ], - "time": "2015-04-14 22:21:58" + "time": "2015-04-14T22:21:58+00:00" }, { "name": "doctrine/common", @@ -1505,7 +1504,7 @@ "persistence", "spl" ], - "time": "2016-11-30 16:50:46" + "time": "2016-11-30T16:50:46+00:00" }, { "name": "doctrine/dbal", @@ -1576,7 +1575,7 @@ "persistence", "queryobject" ], - "time": "2017-01-23 23:17:10" + "time": "2017-01-23T23:17:10+00:00" }, { "name": "doctrine/inflector", @@ -1643,7 +1642,7 @@ "singularize", "string" ], - "time": "2015-11-06 14:35:42" + "time": "2015-11-06T14:35:42+00:00" }, { "name": "doctrine/instantiator", @@ -1697,7 +1696,7 @@ "constructor", "instantiate" ], - "time": "2015-06-14 21:17:01" + "time": "2015-06-14T21:17:01+00:00" }, { "name": "doctrine/lexer", @@ -1751,7 +1750,7 @@ "lexer", "parser" ], - "time": "2014-09-09 13:34:57" + "time": "2014-09-09T13:34:57+00:00" }, { "name": "doctrine/migrations", @@ -1825,7 +1824,7 @@ "database", "migrations" ], - "time": "2016-12-25 22:54:00" + "time": "2016-12-25T22:54:00+00:00" }, { "name": "doctrine/orm", @@ -1901,7 +1900,7 @@ "database", "orm" ], - "time": "2016-12-18 15:42:34" + "time": "2016-12-18T15:42:34+00:00" }, { "name": "elasticsearch/elasticsearch", @@ -1955,7 +1954,7 @@ "elasticsearch", "search" ], - "time": "2016-11-30 17:15:05" + "time": "2016-11-30T17:15:05+00:00" }, { "name": "evenement/evenement", @@ -1995,53 +1994,65 @@ "keywords": [ "event-dispatcher" ], - "time": "2012-05-30 15:01:08" + "time": "2012-05-30T15:01:08+00:00" }, { - "name": "facebook/php-sdk", - "version": "v3.2.3", + "name": "facebook/graph-sdk", + "version": "5.6.1", "source": { "type": "git", - "url": "https://github.com/facebookarchive/facebook-php-sdk.git", - "reference": "6714042fa2f5979d4c64c7d11fb4bcab16bdf6cb" + "url": "https://github.com/facebook/php-graph-sdk.git", + "reference": "2f9639c15ae043911f40ffe44080b32bac2c5280" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facebookarchive/facebook-php-sdk/zipball/6714042fa2f5979d4c64c7d11fb4bcab16bdf6cb", - "reference": "6714042fa2f5979d4c64c7d11fb4bcab16bdf6cb", + "url": "https://api.github.com/repos/facebook/php-graph-sdk/zipball/2f9639c15ae043911f40ffe44080b32bac2c5280", + "reference": "2f9639c15ae043911f40ffe44080b32bac2c5280", "shasum": "" }, "require": { - "ext-curl": "*", - "ext-json": "*", - "php": ">=5.2.0" + "php": "^5.4|^7.0" }, "require-dev": { - "phpunit/phpunit": "3.7.*" + "guzzlehttp/guzzle": "~5.0", + "mockery/mockery": "~0.8", + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "guzzlehttp/guzzle": "Allows for implementation of the Guzzle HTTP client", + "paragonie/random_compat": "Provides a better CSPRNG option in PHP 5" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, "autoload": { - "classmap": [ - "src" + "psr-4": { + "Facebook\\": "src/Facebook/" + }, + "files": [ + "src/Facebook/polyfills.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "Apache2" + "Facebook Platform" ], "authors": [ { "name": "Facebook", - "homepage": "https://github.com/facebook/facebook-php-sdk/contributors" + "homepage": "https://github.com/facebook/php-graph-sdk/contributors" } ], - "description": "Facebook PHP SDK", - "homepage": "https://github.com/facebook/facebook-php-sdk", + "description": "Facebook SDK for PHP", + "homepage": "https://github.com/facebook/php-graph-sdk", "keywords": [ "facebook", "sdk" ], - "time": "2013-11-19 23:11:14" + "time": "2017-08-16T17:28:07+00:00" }, { "name": "firebase/php-jwt", @@ -2084,7 +2095,7 @@ ], "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", "homepage": "https://github.com/firebase/php-jwt", - "time": "2015-07-22 18:31:08" + "time": "2015-07-22T18:31:08+00:00" }, { "name": "gedmo/doctrine-extensions", @@ -2162,7 +2173,7 @@ "tree", "uploadable" ], - "time": "2015-02-24 21:41:37" + "time": "2015-02-24T21:41:37+00:00" }, { "name": "goodby/csv", @@ -2219,7 +2230,7 @@ "export", "import" ], - "time": "2015-06-29 10:28:19" + "time": "2015-06-29T10:28:19+00:00" }, { "name": "google/apiclient", @@ -2278,7 +2289,7 @@ "keywords": [ "google" ], - "time": "2017-11-03 01:19:53" + "time": "2017-11-03T01:19:53+00:00" }, { "name": "google/apiclient-services", @@ -2315,7 +2326,7 @@ "keywords": [ "google" ], - "time": "2017-11-25 00:23:12" + "time": "2017-11-25T00:23:12+00:00" }, { "name": "google/auth", @@ -2360,7 +2371,7 @@ "google", "oauth2" ], - "time": "2017-10-10 17:01:45" + "time": "2017-10-10T17:01:45+00:00" }, { "name": "google/recaptcha", @@ -2405,7 +2416,7 @@ "recaptcha", "spam" ], - "time": "2017-03-09 18:44:34" + "time": "2017-03-09T18:44:34+00:00" }, { "name": "guzzle/guzzle", @@ -2501,7 +2512,7 @@ "web service" ], "abandoned": "guzzlehttp/guzzle", - "time": "2015-03-18 18:23:50" + "time": "2015-03-18T18:23:50+00:00" }, { "name": "guzzlehttp/guzzle", @@ -2566,7 +2577,7 @@ "rest", "web service" ], - "time": "2017-06-22 18:50:49" + "time": "2017-06-22T18:50:49+00:00" }, { "name": "guzzlehttp/promises", @@ -2617,7 +2628,7 @@ "keywords": [ "promise" ], - "time": "2016-12-20 10:07:11" + "time": "2016-12-20T10:07:11+00:00" }, { "name": "guzzlehttp/psr7", @@ -2682,7 +2693,7 @@ "uri", "url" ], - "time": "2017-03-20 17:10:46" + "time": "2017-03-20T17:10:46+00:00" }, { "name": "guzzlehttp/ringphp", @@ -2733,7 +2744,7 @@ } ], "description": "Provides a simple API and specification that abstracts away the details of HTTP into a single PHP function.", - "time": "2015-05-20 03:37:09" + "time": "2015-05-20T03:37:09+00:00" }, { "name": "guzzlehttp/streams", @@ -2783,7 +2794,7 @@ "Guzzle", "stream" ], - "time": "2014-10-12 19:18:40" + "time": "2014-10-12T19:18:40+00:00" }, { "name": "hoa/compiler", @@ -2863,7 +2874,7 @@ "trace", "uniform" ], - "time": "2015-10-29 21:35:12" + "time": "2015-10-29T21:35:12+00:00" }, { "name": "hoa/console", @@ -2935,7 +2946,7 @@ "tput", "window" ], - "time": "2015-07-27 07:52:10" + "time": "2015-07-27T07:52:10+00:00" }, { "name": "hoa/core", @@ -3003,7 +3014,7 @@ "protocol" ], "abandoned": "hoa/consistency", - "time": "2015-11-09 06:51:06" + "time": "2015-11-09T06:51:06+00:00" }, { "name": "hoa/dispatcher", @@ -3063,7 +3074,7 @@ "kit", "library" ], - "time": "2015-11-09 06:52:08" + "time": "2015-11-09T06:52:08+00:00" }, { "name": "hoa/file", @@ -3123,7 +3134,7 @@ "link", "temporary" ], - "time": "2015-11-09 06:55:20" + "time": "2015-11-09T06:55:20+00:00" }, { "name": "hoa/iterator", @@ -3176,7 +3187,7 @@ "iterator", "library" ], - "time": "2015-10-29 21:37:16" + "time": "2015-10-29T21:37:16+00:00" }, { "name": "hoa/math", @@ -3238,7 +3249,7 @@ "sampler", "set" ], - "time": "2015-10-26 15:22:52" + "time": "2015-10-26T15:22:52+00:00" }, { "name": "hoa/regex", @@ -3292,7 +3303,7 @@ "library", "regex" ], - "time": "2015-08-13 06:48:47" + "time": "2015-08-13T06:48:47+00:00" }, { "name": "hoa/router", @@ -3344,7 +3355,7 @@ "library", "router" ], - "time": "2015-10-21 14:12:51" + "time": "2015-10-21T14:12:51+00:00" }, { "name": "hoa/stream", @@ -3402,7 +3413,7 @@ "stream", "wrapper" ], - "time": "2015-10-26 12:21:43" + "time": "2015-10-26T12:21:43+00:00" }, { "name": "hoa/ustring", @@ -3461,7 +3472,7 @@ "string", "unicode" ], - "time": "2015-11-09 06:44:33" + "time": "2015-11-09T06:44:33+00:00" }, { "name": "hoa/visitor", @@ -3516,7 +3527,7 @@ "visit", "visitor" ], - "time": "2015-08-17 06:30:58" + "time": "2015-08-17T06:30:58+00:00" }, { "name": "igorw/get-in", @@ -3561,7 +3572,7 @@ "assoc-array", "hash-map" ], - "time": "2014-12-15 23:03:51" + "time": "2014-12-15T23:03:51+00:00" }, { "name": "imagine/imagine", @@ -3620,7 +3631,7 @@ "support": { "source": "https://github.com/alchemy-fr/Imagine/tree/alchemy-0.6.2" }, - "time": "2015-01-13 18:12:26" + "time": "2015-01-13T18:12:26+00:00" }, { "name": "ircmaxell/password-compat", @@ -3662,7 +3673,7 @@ "hashing", "password" ], - "time": "2014-11-20 16:49:30" + "time": "2014-11-20T16:49:30+00:00" }, { "name": "ircmaxell/random-lib", @@ -3717,7 +3728,7 @@ "random-numbers", "random-strings" ], - "time": "2016-09-07 15:52:06" + "time": "2016-09-07T15:52:06+00:00" }, { "name": "ircmaxell/security-lib", @@ -3763,7 +3774,7 @@ ], "description": "A Base Security Library", "homepage": "https://github.com/ircmaxell/SecurityLib", - "time": "2015-03-20 14:31:23" + "time": "2015-03-20T14:31:23+00:00" }, { "name": "jms/metadata", @@ -3814,7 +3825,7 @@ "xml", "yaml" ], - "time": "2016-12-05 10:18:33" + "time": "2016-12-05T10:18:33+00:00" }, { "name": "jms/parser-lib", @@ -3849,7 +3860,7 @@ "Apache2" ], "description": "A library for easily creating recursive-descent parsers.", - "time": "2012-11-18 18:08:43" + "time": "2012-11-18T18:08:43+00:00" }, { "name": "jms/serializer", @@ -3919,7 +3930,7 @@ "serialization", "xml" ], - "time": "2014-03-18 08:39:00" + "time": "2014-03-18T08:39:00+00:00" }, { "name": "jms/translation-bundle", @@ -3995,7 +4006,7 @@ "support": { "source": "https://github.com/alchemy-fr/JMSTranslationBundle/tree/rebase-2015-10-20" }, - "time": "2015-11-04 15:09:44" + "time": "2015-11-04T15:09:44+00:00" }, { "name": "justinrainbow/json-schema", @@ -4061,7 +4072,7 @@ "json", "schema" ], - "time": "2016-05-10 20:38:51" + "time": "2016-05-10T20:38:51+00:00" }, { "name": "league/flysystem", @@ -4144,7 +4155,7 @@ "sftp", "storage" ], - "time": "2017-01-30 17:41:17" + "time": "2017-01-30T17:41:17+00:00" }, { "name": "league/flysystem-aws-s3-v2", @@ -4191,7 +4202,7 @@ } ], "description": "Flysystem adapter for AWS S3 SDK v2", - "time": "2015-10-15 15:55:48" + "time": "2015-10-15T15:55:48+00:00" }, { "name": "league/fractal", @@ -4252,7 +4263,7 @@ "league", "rest" ], - "time": "2016-12-02 14:55:48" + "time": "2016-12-02T14:55:48+00:00" }, { "name": "media-alchemyst/media-alchemyst", @@ -4326,7 +4337,7 @@ "video", "video processing" ], - "time": "2016-03-16 13:11:52" + "time": "2016-03-16T13:11:52+00:00" }, { "name": "monolog/monolog", @@ -4404,7 +4415,7 @@ "logging", "psr-3" ], - "time": "2016-11-26 00:15:39" + "time": "2016-11-26T00:15:39+00:00" }, { "name": "mrclay/minify", @@ -4444,7 +4455,7 @@ ], "description": "Minify is a PHP5 app that helps you follow several rules for client-side performance. It combines multiple CSS or Javascript files, removes unnecessary whitespace and comments, and serves them with gzip encoding and optimal client-side cache headers", "homepage": "http://code.google.com/p/minify/", - "time": "2013-07-23 19:58:28" + "time": "2013-07-23T19:58:28+00:00" }, { "name": "neutron/process-manager", @@ -4483,7 +4494,7 @@ "homepage": "http://www.lickmychip.com/" } ], - "time": "2014-02-13 20:27:33" + "time": "2014-02-13T20:27:33+00:00" }, { "name": "neutron/recaptcha", @@ -4527,7 +4538,7 @@ } ], "description": "ReCaptcha Client", - "time": "2013-02-14 13:42:00" + "time": "2013-02-14T13:42:00+00:00" }, { "name": "neutron/signal-handler", @@ -4570,7 +4581,7 @@ "keywords": [ "signal" ], - "time": "2014-01-15 17:24:13" + "time": "2014-01-15T17:24:13+00:00" }, { "name": "neutron/silex-filesystem-provider", @@ -4614,7 +4625,7 @@ "silex", "temporary-filesystem" ], - "time": "2012-11-08 21:07:08" + "time": "2012-11-08T21:07:08+00:00" }, { "name": "neutron/silex-imagine-provider", @@ -4661,7 +4672,7 @@ "imagine", "silex" ], - "time": "2013-05-03 18:48:51" + "time": "2013-05-03T18:48:51+00:00" }, { "name": "neutron/temporary-filesystem", @@ -4701,7 +4712,7 @@ } ], "description": "Symfony filesystem extension to handle temporary files", - "time": "2016-03-05 10:22:50" + "time": "2016-03-05T10:22:50+00:00" }, { "name": "nikic/php-parser", @@ -4746,7 +4757,7 @@ "parser", "php" ], - "time": "2015-09-19 14:15:08" + "time": "2015-09-19T14:15:08+00:00" }, { "name": "ocramius/proxy-manager", @@ -4809,7 +4820,7 @@ "proxy pattern", "service proxies" ], - "time": "2015-08-09 04:28:19" + "time": "2015-08-09T04:28:19+00:00" }, { "name": "pagerfanta/pagerfanta", @@ -4876,7 +4887,7 @@ "paginator", "paging" ], - "time": "2016-11-28 09:17:04" + "time": "2016-11-28T09:17:04+00:00" }, { "name": "paragonie/random_compat", @@ -4924,7 +4935,7 @@ "pseudorandom", "random" ], - "time": "2016-11-07 23:38:38" + "time": "2016-11-07T23:38:38+00:00" }, { "name": "php-ffmpeg/php-ffmpeg", @@ -4993,7 +5004,7 @@ "video", "video processing" ], - "time": "2014-08-26 08:46:56" + "time": "2014-08-26T08:46:56+00:00" }, { "name": "php-mp4box/php-mp4box", @@ -5044,7 +5055,7 @@ "gpac", "mp4box" ], - "time": "2013-06-25 10:13:06" + "time": "2013-06-25T10:13:06+00:00" }, { "name": "php-unoconv/php-unoconv", @@ -5094,7 +5105,7 @@ "keywords": [ "unoconv" ], - "time": "2013-06-25 10:09:59" + "time": "2013-06-25T10:09:59+00:00" }, { "name": "php-xpdf/php-xpdf", @@ -5146,7 +5157,7 @@ "pdf", "xpdf" ], - "time": "2016-07-04 07:30:16" + "time": "2016-07-04T07:30:16+00:00" }, { "name": "phpcollection/phpcollection", @@ -5194,7 +5205,7 @@ "sequence", "set" ], - "time": "2015-05-17 12:39:23" + "time": "2015-05-17T12:39:23+00:00" }, { "name": "phpexiftool/exiftool", @@ -5227,7 +5238,7 @@ "exiftool", "metadatas" ], - "time": "2016-01-25 11:10:14" + "time": "2016-01-25T11:10:14+00:00" }, { "name": "phpoption/phpoption", @@ -5277,7 +5288,7 @@ "php", "type" ], - "time": "2015-07-25 16:39:46" + "time": "2015-07-25T16:39:46+00:00" }, { "name": "phpseclib/phpseclib", @@ -5369,7 +5380,7 @@ "x.509", "x509" ], - "time": "2017-10-23 05:04:54" + "time": "2017-10-23T05:04:54+00:00" }, { "name": "pimple/pimple", @@ -5415,7 +5426,7 @@ "container", "dependency injection" ], - "time": "2013-11-22 08:30:29" + "time": "2013-11-22T08:30:29+00:00" }, { "name": "psr/cache", @@ -5461,7 +5472,7 @@ "psr", "psr-6" ], - "time": "2016-08-06 20:24:11" + "time": "2016-08-06T20:24:11+00:00" }, { "name": "psr/http-message", @@ -5511,7 +5522,7 @@ "request", "response" ], - "time": "2016-08-06 14:39:51" + "time": "2016-08-06T14:39:51+00:00" }, { "name": "psr/log", @@ -5558,7 +5569,7 @@ "psr", "psr-3" ], - "time": "2016-10-10 12:19:37" + "time": "2016-10-10T12:19:37+00:00" }, { "name": "ramsey/uuid", @@ -5640,7 +5651,7 @@ "identifier", "uuid" ], - "time": "2016-11-22 19:21:44" + "time": "2016-11-22T19:21:44+00:00" }, { "name": "react/promise", @@ -5683,7 +5694,7 @@ "promise", "promises" ], - "time": "2016-12-22 14:09:01" + "time": "2016-12-22T14:09:01+00:00" }, { "name": "roave/security-advisories", @@ -5814,7 +5825,7 @@ } ], "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", - "time": "2017-01-24 18:32:04" + "time": "2017-01-24T18:32:04+00:00" }, { "name": "seld/jsonlint", @@ -5860,7 +5871,7 @@ "parser", "validator" ], - "time": "2016-11-14 17:59:58" + "time": "2016-11-14T17:59:58+00:00" }, { "name": "silex/silex", @@ -5937,7 +5948,7 @@ "keywords": [ "microframework" ], - "time": "2016-01-06 14:59:35" + "time": "2016-01-06T14:59:35+00:00" }, { "name": "silex/web-profiler", @@ -5982,7 +5993,7 @@ ], "description": "A WebProfiler for Silex", "homepage": "http://silex.sensiolabs.org/", - "time": "2016-01-10 11:39:13" + "time": "2016-01-10T11:39:13+00:00" }, { "name": "simple-bus/doctrine-orm-bridge", @@ -6036,7 +6047,7 @@ "doctrine", "event bus" ], - "time": "2015-04-29 12:27:27" + "time": "2015-04-29T12:27:27+00:00" }, { "name": "simple-bus/jms-serializer-bridge", @@ -6085,7 +6096,7 @@ "message", "serialization" ], - "time": "2015-07-29 07:48:42" + "time": "2015-07-29T07:48:42+00:00" }, { "name": "simple-bus/message-bus", @@ -6135,7 +6146,7 @@ "message", "message bus" ], - "time": "2016-02-12 08:35:53" + "time": "2016-02-12T08:35:53+00:00" }, { "name": "simple-bus/serialization", @@ -6183,7 +6194,7 @@ "messages", "serialization" ], - "time": "2015-05-08 13:34:17" + "time": "2015-05-08T13:34:17+00:00" }, { "name": "sorien/silex-dbal-profiler", @@ -6231,7 +6242,7 @@ "profiler", "silex" ], - "time": "2016-10-26 11:08:02" + "time": "2016-10-26T11:08:02+00:00" }, { "name": "sorien/silex-pimple-dumper", @@ -6273,7 +6284,7 @@ "plugin", "silex" ], - "time": "2015-11-11 07:16:28" + "time": "2015-11-11T07:16:28+00:00" }, { "name": "swftools/swftools", @@ -6327,7 +6338,7 @@ "flash", "swf" ], - "time": "2013-07-03 13:11:36" + "time": "2013-07-03T13:11:36+00:00" }, { "name": "swiftmailer/swiftmailer", @@ -6381,7 +6392,7 @@ "mail", "mailer" ], - "time": "2016-12-29 10:02:40" + "time": "2016-12-29T10:02:40+00:00" }, { "name": "symfony/polyfill-apcu", @@ -6434,7 +6445,7 @@ "portable", "shim" ], - "time": "2016-11-14 01:06:16" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/polyfill-intl-icu", @@ -6492,7 +6503,7 @@ "portable", "shim" ], - "time": "2016-11-14 01:06:16" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/polyfill-mbstring", @@ -6551,7 +6562,7 @@ "portable", "shim" ], - "time": "2016-11-14 01:06:16" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/polyfill-php54", @@ -6609,7 +6620,7 @@ "portable", "shim" ], - "time": "2016-11-14 01:06:16" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/polyfill-php55", @@ -6665,7 +6676,7 @@ "portable", "shim" ], - "time": "2016-11-14 01:06:16" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/polyfill-php56", @@ -6721,7 +6732,7 @@ "portable", "shim" ], - "time": "2016-11-14 01:06:16" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/polyfill-php70", @@ -6780,7 +6791,7 @@ "portable", "shim" ], - "time": "2016-11-14 01:06:16" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/polyfill-util", @@ -6832,7 +6843,7 @@ "polyfill", "shim" ], - "time": "2016-11-14 01:06:16" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/security-acl", @@ -6893,7 +6904,7 @@ ], "description": "Symfony Security Component - ACL (Access Control List)", "homepage": "https://symfony.com", - "time": "2015-12-28 09:39:46" + "time": "2015-12-28T09:39:46+00:00" }, { "name": "symfony/symfony", @@ -7028,7 +7039,7 @@ "keywords": [ "framework" ], - "time": "2017-01-12 20:27:46" + "time": "2017-01-12T20:27:46+00:00" }, { "name": "themattharris/tmhoauth", @@ -7070,7 +7081,7 @@ "oauth", "twitter" ], - "time": "2014-08-06 22:29:35" + "time": "2014-08-06T22:29:35+00:00" }, { "name": "twig/extensions", @@ -7122,7 +7133,7 @@ "i18n", "text" ], - "time": "2016-10-25 17:34:14" + "time": "2016-10-25T17:34:14+00:00" }, { "name": "twig/twig", @@ -7183,7 +7194,7 @@ "keywords": [ "templating" ], - "time": "2017-01-11 19:36:15" + "time": "2017-01-11T19:36:15+00:00" }, { "name": "vierbergenlars/php-semver", @@ -7231,7 +7242,7 @@ "semver", "versioning" ], - "time": "2013-09-20 10:41:27" + "time": "2013-09-20T10:41:27+00:00" }, { "name": "webmozart/assert", @@ -7281,7 +7292,7 @@ "check", "validate" ], - "time": "2016-11-23 20:04:58" + "time": "2016-11-23T20:04:58+00:00" }, { "name": "webmozart/json", @@ -7330,7 +7341,7 @@ } ], "description": "A robust JSON decoder/encoder with support for schema validation.", - "time": "2016-01-14 12:11:46" + "time": "2016-01-14T12:11:46+00:00" }, { "name": "webmozart/path-util", @@ -7376,7 +7387,7 @@ } ], "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", - "time": "2015-12-17 08:42:14" + "time": "2015-12-17T08:42:14+00:00" }, { "name": "willdurand/negotiation", @@ -7428,7 +7439,7 @@ "header", "negotiation" ], - "time": "2016-10-14 09:17:47" + "time": "2016-10-14T09:17:47+00:00" }, { "name": "zend/gdata", @@ -7469,7 +7480,7 @@ "gdata", "zend" ], - "time": "2013-01-30 15:31:21" + "time": "2013-01-30T15:31:21+00:00" }, { "name": "zendframework/zend-code", @@ -7521,7 +7532,7 @@ "code", "zf2" ], - "time": "2016-04-20 17:26:42" + "time": "2016-04-20T17:26:42+00:00" }, { "name": "zendframework/zend-eventmanager", @@ -7575,7 +7586,7 @@ "events", "zf2" ], - "time": "2016-02-18 20:53:00" + "time": "2016-02-18T20:53:00+00:00" } ], "packages-dev": [ @@ -7623,7 +7634,7 @@ ], "description": "Virtual file system to mock the real file system in unit tests.", "homepage": "http://vfs.bovigo.org/", - "time": "2016-07-18 14:02:57" + "time": "2016-07-18T14:02:57+00:00" }, { "name": "php-amqplib/php-amqplib", @@ -7693,7 +7704,7 @@ "queue", "rabbitmq" ], - "time": "2016-04-11 14:30:01" + "time": "2016-04-11T14:30:01+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -7747,7 +7758,7 @@ "reflection", "static analysis" ], - "time": "2015-12-27 11:43:31" + "time": "2015-12-27T11:43:31+00:00" }, { "name": "phpdocumentor/reflection-docblock", @@ -7792,7 +7803,7 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2016-09-30 07:12:33" + "time": "2016-09-30T07:12:33+00:00" }, { "name": "phpdocumentor/type-resolver", @@ -7839,7 +7850,7 @@ "email": "me@mikevanriel.com" } ], - "time": "2016-11-25 06:54:22" + "time": "2016-11-25T06:54:22+00:00" }, { "name": "phpspec/prophecy", @@ -7902,7 +7913,7 @@ "spy", "stub" ], - "time": "2016-11-21 14:58:47" + "time": "2016-11-21T14:58:47+00:00" }, { "name": "phpunit/php-code-coverage", @@ -7964,7 +7975,7 @@ "testing", "xunit" ], - "time": "2015-10-06 15:47:00" + "time": "2015-10-06T15:47:00+00:00" }, { "name": "phpunit/php-file-iterator", @@ -8011,7 +8022,7 @@ "filesystem", "iterator" ], - "time": "2016-10-03 07:40:28" + "time": "2016-10-03T07:40:28+00:00" }, { "name": "phpunit/php-text-template", @@ -8052,7 +8063,7 @@ "keywords": [ "template" ], - "time": "2015-06-21 13:50:34" + "time": "2015-06-21T13:50:34+00:00" }, { "name": "phpunit/php-timer", @@ -8096,7 +8107,7 @@ "keywords": [ "timer" ], - "time": "2016-05-12 18:03:57" + "time": "2016-05-12T18:03:57+00:00" }, { "name": "phpunit/php-token-stream", @@ -8145,7 +8156,7 @@ "keywords": [ "tokenizer" ], - "time": "2016-11-15 14:06:22" + "time": "2016-11-15T14:06:22+00:00" }, { "name": "phpunit/phpunit", @@ -8217,7 +8228,7 @@ "testing", "xunit" ], - "time": "2017-01-26 16:15:36" + "time": "2017-01-26T16:15:36+00:00" }, { "name": "phpunit/phpunit-mock-objects", @@ -8273,7 +8284,7 @@ "mock", "xunit" ], - "time": "2015-10-02 06:51:40" + "time": "2015-10-02T06:51:40+00:00" }, { "name": "sebastian/comparator", @@ -8337,7 +8348,7 @@ "compare", "equality" ], - "time": "2017-01-29 09:50:25" + "time": "2017-01-29T09:50:25+00:00" }, { "name": "sebastian/diff", @@ -8389,7 +8400,7 @@ "keywords": [ "diff" ], - "time": "2015-12-08 07:14:41" + "time": "2015-12-08T07:14:41+00:00" }, { "name": "sebastian/environment", @@ -8439,7 +8450,7 @@ "environment", "hhvm" ], - "time": "2016-08-18 05:49:44" + "time": "2016-08-18T05:49:44+00:00" }, { "name": "sebastian/exporter", @@ -8506,7 +8517,7 @@ "export", "exporter" ], - "time": "2016-06-17 09:04:28" + "time": "2016-06-17T09:04:28+00:00" }, { "name": "sebastian/global-state", @@ -8557,7 +8568,7 @@ "keywords": [ "global state" ], - "time": "2015-10-12 03:26:01" + "time": "2015-10-12T03:26:01+00:00" }, { "name": "sebastian/recursion-context", @@ -8610,7 +8621,7 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2015-11-11 19:50:13" + "time": "2015-11-11T19:50:13+00:00" }, { "name": "sebastian/version", @@ -8645,7 +8656,7 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", - "time": "2015-06-21 13:59:46" + "time": "2015-06-21T13:59:46+00:00" } ], "aliases": [ diff --git a/config/configuration.sample.yml b/config/configuration.sample.yml index 499c631812..2467514a84 100644 --- a/config/configuration.sample.yml +++ b/config/configuration.sample.yml @@ -135,6 +135,7 @@ authentication: options: app-id: '' secret: '' + default-graph-version: 'v2.10' twitter: enabled: false options: diff --git a/lib/Alchemy/Phrasea/Authentication/Provider/Facebook.php b/lib/Alchemy/Phrasea/Authentication/Provider/Facebook.php index 370c14ed64..ceec5d4dd6 100644 --- a/lib/Alchemy/Phrasea/Authentication/Provider/Facebook.php +++ b/lib/Alchemy/Phrasea/Authentication/Provider/Facebook.php @@ -21,13 +21,14 @@ use Symfony\Component\HttpFoundation\Session\SessionInterface; class Facebook extends AbstractProvider { - /** @var \Facebook */ + /** @var \Facebook\Facebook */ private $facebook; - public function __construct(\Facebook $facebook, UrlGenerator $generator) + public function __construct(\Facebook\Facebook $facebook, UrlGenerator $generator, SessionInterface $session) { $this->facebook = $facebook; $this->generator = $generator; + $this->session = $session; } /** @@ -51,14 +52,16 @@ class Facebook extends AbstractProvider */ public function authenticate() { - return new RedirectResponse($this->facebook->getLoginUrl([ - 'scope' => 'email', - 'redirect_uri' => $this->generator->generate( - 'login_authentication_provider_callback', - ['providerId' => $this->getId()], - UrlGenerator::ABSOLUTE_URL + return new RedirectResponse( + $this->facebook->getRedirectLoginHelper()->getLoginUrl( + $this->generator->generate( + 'login_authentication_provider_callback', + ['providerId' => $this->getId()], + UrlGenerator::ABSOLUTE_URL + ), + ['email'] ) - ])); + ); } /** @@ -66,15 +69,15 @@ class Facebook extends AbstractProvider */ public function logout() { - $this->facebook->destroySession(); + $this->session->remove('fb_access_token'); } /** - * @param \Facebook $facebook + * @param \Facebook\Facebook $facebook * * @return Facebook */ - public function setFacebook(\Facebook $facebook) + public function setFacebook(\Facebook\Facebook $facebook) { $this->facebook = $facebook; @@ -82,35 +85,55 @@ class Facebook extends AbstractProvider } /** - * @return \Facebook + * @return \Facebook\Facebook */ public function getFacebook() { return $this->facebook; } + /** + * @param $dataToRetrieve + * @return \Facebook\GraphNodes\GraphUser + */ + protected function getGraphUser($dataToRetrieve) + { + try { + $response = $this->facebook->get( + "/me?fields=" . implode(',', $dataToRetrieve), + $this->session->get('fb_access_token') + ); + } catch(\Facebook\Exceptions\FacebookResponseException $e) { + throw new NotAuthenticatedException('Graph returned an error: ' . $e->getMessage()); + exit; + } catch(\Facebook\Exceptions\FacebookSDKException $e) { + throw new NotAuthenticatedException('Facebook SDK returned an error: ' . $e->getMessage()); + exit; + } + + if (!$response) + { + throw new NotAuthenticatedException('Not authenticated'); + } + + return $response->getGraphUser(); + } + /** * {@inheritdoc} */ public function getIdentity() { - try { - $data = $this->facebook->api('/me'); - $identity = new Identity(); + $user = $this->getGraphUser(['id', 'name', 'email', 'picture', 'last_name', 'first_name']); + + $identity = new Identity(); - $identity->set(Identity::PROPERTY_ID, $data['id']); - $identity->set(Identity::PROPERTY_IMAGEURL, sprintf( - 'https://graph.facebook.com/%s/picture?return_ssl_resources=1', - $data['username'] - )); - $identity->set(Identity::PROPERTY_EMAIL, $data['email']); - $identity->set(Identity::PROPERTY_FIRSTNAME, $data['first_name']); - $identity->set(Identity::PROPERTY_LASTNAME, $data['last_name']); - $identity->set(Identity::PROPERTY_USERNAME, $data['username']); - - } catch (\FacebookApiException $e) { - throw new NotAuthenticatedException('Unable to get profile informations', $e->getCode(), $e); - } + $identity->set(Identity::PROPERTY_ID, $user['id']); + $identity->set(Identity::PROPERTY_IMAGEURL, $user['picture']); + $identity->set(Identity::PROPERTY_EMAIL, $user['email']); + $identity->set(Identity::PROPERTY_FIRSTNAME, $user['first_name']); + $identity->set(Identity::PROPERTY_LASTNAME, $user['last_name']); + $identity->set(Identity::PROPERTY_USERNAME, $user['first_name']); return $identity; } @@ -120,9 +143,44 @@ class Facebook extends AbstractProvider */ public function onCallback(Request $request) { - if (!$this->facebook->getUser()) { - throw new NotAuthenticatedException('Facebook authentication failed'); + $helper = $this->facebook->getRedirectLoginHelper(); + + try { + $accessToken = $helper->getAccessToken(); + } catch(\Facebook\Exceptions\FacebookResponseException $e) { + throw new NotAuthenticatedException('Graph returned an error: ' . $e->getMessage()); + exit; + } catch(\Facebook\Exceptions\FacebookSDKException $e) { + throw new NotAuthenticatedException('Facebook SDK returned an error: ' . $e->getMessage()); + exit; } + + if (! isset($accessToken)) { + if ($helper->getError()) { + $error = "Error: " . $helper->getError() . "\n"; + $error .= "Error Code: " . $helper->getErrorCode() . "\n"; + $error .= "Error Reason: " . $helper->getErrorReason() . "\n"; + $error .= "Error Description: " . $helper->getErrorDescription() . "\n"; + + throw new NotAuthenticatedException($error); + + } else { + throw new NotAuthenticatedException('Facebook authentication failed'); + } + exit; + } + + $oAuth2Client = $this->facebook->getOAuth2Client(); + + if (! $accessToken->isLongLived()) { + try { + $accessToken = $oAuth2Client->getLongLivedAccessToken($accessToken); + } catch (\Facebook\Exceptions\FacebookSDKException $e) { + throw new NotAuthenticatedException('Error getting long-lived access token: ' . $e->getMessage() ); + exit; + } + } + $this->session->set('fb_access_token', (string) $accessToken); } /** @@ -130,11 +188,9 @@ class Facebook extends AbstractProvider */ public function getToken() { - if (0 >= $this->facebook->getUser()) { - throw new NotAuthenticatedException('Provider has not authenticated'); - } + $user = $this->getGraphUser(['id']); - return new Token($this, $this->facebook->getUser()); + return new Token($this, $user['id']); } /** @@ -194,11 +250,12 @@ class Facebook extends AbstractProvider */ public static function create(UrlGenerator $generator, SessionInterface $session, array $options) { - $config['appId'] = $options['app-id']; - $config['secret'] = $options['secret']; + $config['app_id'] = $options['app-id']; + $config['app_secret'] = $options['secret']; + $config['default_graph_version'] = $options['default-graph-version']; - $facebook = new \Facebook($config); + $facebook = new \Facebook\Facebook($config); - return new static($facebook, $generator); + return new static($facebook, $generator, $session); } } diff --git a/tests/Alchemy/Tests/Phrasea/Authentication/Provider/FacebookTest.php b/tests/Alchemy/Tests/Phrasea/Authentication/Provider/FacebookTest.php index 9d49b231bf..f3a5d3f151 100644 --- a/tests/Alchemy/Tests/Phrasea/Authentication/Provider/FacebookTest.php +++ b/tests/Alchemy/Tests/Phrasea/Authentication/Provider/FacebookTest.php @@ -5,6 +5,7 @@ namespace Alchemy\Tests\Phrasea\Authentication\Provider; use Alchemy\Phrasea\Authentication\Provider\Facebook; use Alchemy\Phrasea\Authentication\Provider\ProviderInterface; use Alchemy\Phrasea\Authentication\Provider\Token\Identity; +use Facebook\Authentication\AccessToken; /** * @group functional @@ -12,6 +13,8 @@ use Alchemy\Phrasea\Authentication\Provider\Token\Identity; */ class FacebookTest extends ProviderTestCase { + const TOKEN = 'aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789'; + public function testGetSetSession() { $this->markTestSkipped('testGetSetSession disabled for facebook'); @@ -35,10 +38,6 @@ class FacebookTest extends ProviderTestCase public function provideDataForFailingCallback() { $provider = $this->getProvider(); - $provider->getFacebook()->expects($this->any()) - ->method('getUser') - ->will($this->returnValue(null)); - return [ [$provider, $this->getRequestMock()] ]; @@ -52,10 +51,8 @@ class FacebookTest extends ProviderTestCase public function provideDataForSuccessCallback() { $provider = $this->getProvider(); - $provider->getFacebook()->expects($this->any()) - ->method('getUser') - ->will($this->returnValue('123456')); - + $facebookMock = $this->getFacebookMock(true); + $provider->setFacebook($facebookMock); return [ [$provider, $this->getRequestMock()] ]; @@ -63,14 +60,14 @@ class FacebookTest extends ProviderTestCase protected function getProvider() { - return new Facebook($this->getFacebookMock(), $this->getUrlGeneratorMock()); + return new Facebook($this->getFacebookMock(), $this->getUrlGeneratorMock(), $this->getMockSession()); } protected function authenticateProvider(ProviderInterface $provider) { - $provider->getFacebook()->expects($this->any()) - ->method('getUser') - ->will($this->returnValue('123456')); + $facebookMock = $this->getFacebookMock(true); + $provider->setFacebook($facebookMock); + $provider->getSession()->set('fb_access_token', self::TOKEN); } protected function getProviderForSuccessIdentity() @@ -78,27 +75,6 @@ class FacebookTest extends ProviderTestCase $provider = $this->getProvider(); $this->authenticateProvider($provider); - $facebook = $this->getMockBuilder('Facebook') - ->disableOriginalConstructor() - ->setMethods(['getLoginUrl', 'api', 'getUser']) - ->getMock(); - - $facebook->expects($this->any()) - ->method('getLoginUrl') - ->will($this->returnValue('http://www.facebook.com/')); - - $facebook->expects($this->once()) - ->method('api') - ->will($this->returnValue([ - 'id' => self::ID, - 'username' => self::FIRSTNAME, - 'first_name' => self::FIRSTNAME, - 'last_name' => self::LASTNAME, - 'email' => self::EMAIL, - ])); - - $provider->setFacebook($facebook); - return $provider; } @@ -123,6 +99,7 @@ class FacebookTest extends ProviderTestCase return [ 'app-id' => 'zizi', 'secret' => 's3cr3t', + 'default-graph-version' => 'v2.10' ]; } @@ -131,27 +108,100 @@ class FacebookTest extends ProviderTestCase return $this->getProvider(); } - private function getFacebookMock() + private function getFacebookMock($ValidAccessToken = false) { - $facebook = $this->getMockBuilder('Facebook') + $facebook = $this->getMockBuilder('Facebook\Facebook') ->disableOriginalConstructor() - ->setMethods(['getLoginUrl', 'api', 'getUser']) + ->setMethods(['getRedirectLoginHelper', 'get', 'getOAuth2Client']) ->getMock(); - $facebook->expects($this->any()) - ->method('getLoginUrl') - ->will($this->returnValue('http://www.facebook.com/')); + $helper = $this->getFacebookRedirectLoginHelperMock($ValidAccessToken); $facebook->expects($this->any()) - ->method('api') - ->will($this->returnCallback(function () use ($facebook) { - if (!$facebook->getUser()) { - throw new \FacebookApiException([ - 'error_msg' => 'Not authenticated' - ]); - } - })); + ->method('getRedirectLoginHelper') + ->will($this->returnValue($helper)); + + $OAuth2Client = $this->getOAuth2ClientMock(); + + $facebook->expects($this->any()) + ->method('getOAuth2Client') + ->will($this->returnValue($OAuth2Client)); + + if ($ValidAccessToken) + { + $FacebookResponse = $this->getFacebookResponseMock(); + + $facebook->expects($this->any()) + ->method('get') + ->will($this->returnValue($FacebookResponse)); + } return $facebook; } + + private function getAccessTokenMock($valid = true) + { + $expiresAt = (time() + 3600); + return ($valid)? new AccessToken(self::TOKEN, $expiresAt) : null; + } + + private function getFacebookRedirectLoginHelperMock($ValidAccessToken = true) + { + $accessToken = $this->getAccessTokenMock($ValidAccessToken); + + $helper = $this->getMockBuilder('Facebook\Helpers\FacebookRedirectLoginHelper') + ->disableOriginalConstructor() + ->setMethods(['getLoginUrl', 'getAccessToken', 'getError']) + ->getMock(); + + $helper->expects($this->any()) + ->method('getLoginUrl') + ->will($this->returnValue('http://www.facebook.com/')); + + $helper->expects($this->any()) + ->method('getAccessToken') + ->will($this->returnValue($accessToken)); + + $helper->expects($this->any()) + ->method('getError') + ->will($this->returnValue(null)); + + return $helper; + } + + private function getOAuth2ClientMock() + { + $OAuth2Client = $this->getMockBuilder('Facebook\Authentication\OAuth2Client') + ->disableOriginalConstructor() + ->setMethods(['getLongLivedAccessToken']) + ->getMock(); + + $OAuth2Client->expects($this->any()) + ->method('getLongLivedAccessToken') + ->will($this->returnValue(self::TOKEN)); + + return $OAuth2Client; + } + + private function getFacebookResponseMock() + { + $FacebookResponse = $this->getMockBuilder('Facebook\FacebookResponse') + ->disableOriginalConstructor() + ->setMethods(['getGraphUser']) + ->getMock(); + + $FacebookResponse->expects($this->any()) + ->method('getGraphUser') + ->will($this->returnValue([ + 'id' => self::ID, + 'name' => self::FIRSTNAME, + 'first_name' => self::FIRSTNAME, + 'last_name' => self::LASTNAME, + 'email' => self::EMAIL, + 'picture' => self::IMAGEURL + ])); + + return $FacebookResponse; + } + }