From 30f33f1f0c4b47292bd4bc04fa29259eb6e07046 Mon Sep 17 00:00:00 2001 From: sikofitt Date: Tue, 20 Dec 2016 14:32:00 -0800 Subject: [PATCH] Final --- .gitignore | 3 +- .idea/composerJson.xml | 9 + .idea/deployment.xml | 4 + .idea/vcs.xml | 6 + .php_cs | 19 + README.md | 55 + Tests/FireFoxBinaryTest.php | 28 + Tests/GitHubTests.php | 25 - Tests/SeleniumTorSimpleTest.php | 67 ++ bin/console | 18 + composer.json | 17 +- composer.lock | 1045 +++++++++++++++-- phpunit.xml | 30 + .../Command/TorBrowserDownloadCommand.php | 139 +++ src/Sikofitt/WebDriver/FirefoxBinary.php | 35 + .../WebDriver/Remote/DesiredCapabilities.php | 37 + src/Sikofitt/WebDriver/Tor/TorDriver.php | 17 + src/Sikofitt/WebDriver/Tor/TorPreferences.php | 44 + src/Sikofitt/WebDriver/Tor/TorProfile.php | 16 + src/Sikofitt/WebDriver/TorLauncher.php | 46 + 20 files changed, 1523 insertions(+), 137 deletions(-) create mode 100644 .idea/composerJson.xml create mode 100644 .idea/deployment.xml create mode 100644 .idea/vcs.xml create mode 100644 .php_cs create mode 100644 README.md create mode 100644 Tests/FireFoxBinaryTest.php delete mode 100644 Tests/GitHubTests.php create mode 100644 Tests/SeleniumTorSimpleTest.php create mode 100755 bin/console create mode 100644 phpunit.xml create mode 100644 src/Sikofitt/Console/Command/TorBrowserDownloadCommand.php create mode 100644 src/Sikofitt/WebDriver/FirefoxBinary.php create mode 100644 src/Sikofitt/WebDriver/Remote/DesiredCapabilities.php create mode 100644 src/Sikofitt/WebDriver/Tor/TorDriver.php create mode 100644 src/Sikofitt/WebDriver/Tor/TorPreferences.php create mode 100644 src/Sikofitt/WebDriver/Tor/TorProfile.php create mode 100644 src/Sikofitt/WebDriver/TorLauncher.php diff --git a/.gitignore b/.gitignore index 1bfac7f..1021153 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /vendor/ -*~ \ No newline at end of file +*~ +.idea/ \ No newline at end of file diff --git a/.idea/composerJson.xml b/.idea/composerJson.xml new file mode 100644 index 0000000..4199499 --- /dev/null +++ b/.idea/composerJson.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/deployment.xml b/.idea/deployment.xml new file mode 100644 index 0000000..7d69a67 --- /dev/null +++ b/.idea/deployment.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.php_cs b/.php_cs new file mode 100644 index 0000000..7acf5b2 --- /dev/null +++ b/.php_cs @@ -0,0 +1,19 @@ + +This source file is subject to the MIT license that is bundled +with this source code in the file LICENSE. +EOF; + +$finder = PhpCsFixer\Finder::create() + ->in([__DIR__ . '/src', __DIR__ . '/Tests']); + +return PhpCsFixer\Config::create() + ->setRules([ + '@PSR2' => true, + 'header_comment' => [ + 'header' => $header + ], + ]) + ->setFinder($finder); \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..f22e078 --- /dev/null +++ b/README.md @@ -0,0 +1,55 @@ +## Selenium Tor Implementation for [facebook/php-webdriver](https://github.com/facebook/php-webdriver) + +### Usage + +#### Install Composer + +* `curl -SsL https://getcomposer.org/installer|php` +* `mv composer.phar /usr/local/bin/composer` + +#### Get the code + +* Clone the repository `git clone https://repos.bgemi.net/sikofitt/selenium-tor` +* `cd selenium-tor` + +#### Install dependencies +* Then install the dependencies with `composer install` + +#### Get tor if you don't have it +* `composer download` or +* `bin/console tor:download` + +```php +use Sikofitt\WebDriver\FirefoxBinary; +use Sikofitt\WebDriver\Remote\DesiredCapabilities; +use Sikofitt\WebDriver\Tor\TorProfile; +use Sikofitt\WebDriver\TorLauncher; + + +require 'vendor/autoload.php'; + +$firefoxBinary = new FirefoxBinary(__DIR__ . '/../tor-browser_en-US/Browser/start-tor-browser'); +$caps = DesiredCapabilities::tor($firefoxBinary); +$profile = new TorProfile(); +$caps->setCapability('timeout', 3600); +$caps->setCapability(FirefoxDriver::PROFILE, $profile); + +$torProcess = TorLauncher::launch($firefoxBinary); +// Wait for Tor to connect +sleep(2); +$this->webDriver = RemoteWebDriver::create('http://localhost:4444/wd/hub', $caps); +$this->webDriver->navigate()->to('http://32b5oz2bbtn6gqj3.onion'); +// Or $this-webDriver->get('http://32b5oz2bbtn6gqj3.onion'); +$pageImages = $this->webDriver->findElements(WebDriverBy::tagName('img')); +$images = []; +foreach($pageImages as $image) +{ + $images[] = $image->getAttribute('src'); +} +TorLauncher::stop($torProcess); + +``` + +### Tests + +`composer test'` \ No newline at end of file diff --git a/Tests/FireFoxBinaryTest.php b/Tests/FireFoxBinaryTest.php new file mode 100644 index 0000000..16089a6 --- /dev/null +++ b/Tests/FireFoxBinaryTest.php @@ -0,0 +1,28 @@ + + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +use Sikofitt\WebDriver\FirefoxBinary; + +/** + * Created by PhpStorm. + * User: eric + * Date: 12/20/16 + * Time: 1:33 PM + */ +class FireFoxBinaryTest extends PHPUnit_Framework_TestCase +{ + + /** + * @expectedException \Exception + */ + public function testBinaryFail() + { + $fireFoxBinary = new FirefoxBinary('file'); + } +} diff --git a/Tests/GitHubTests.php b/Tests/GitHubTests.php deleted file mode 100644 index 81a795c..0000000 --- a/Tests/GitHubTests.php +++ /dev/null @@ -1,25 +0,0 @@ -webDriver = RemoteWebDriver::create('http://localhost:4444/wd/hub', DesiredCapabilities::firefox()); - } - - public function tearDown() - { - $this->webDriver->quit(); - } - public function testGitHubHome() { - $this->webDriver->get($this->url); - $this->assertContains('GitHub', $this->webDriver->getTitle()); - } -} \ No newline at end of file diff --git a/Tests/SeleniumTorSimpleTest.php b/Tests/SeleniumTorSimpleTest.php new file mode 100644 index 0000000..90b0bcb --- /dev/null +++ b/Tests/SeleniumTorSimpleTest.php @@ -0,0 +1,67 @@ + + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +use Sikofitt\WebDriver\FirefoxBinary; +use Sikofitt\WebDriver\Remote\DesiredCapabilities; +use Sikofitt\WebDriver\Tor\TorProfile; +use Sikofitt\WebDriver\TorLauncher; + + +require 'vendor/autoload.php'; + +/** + * Class SeleniumTorTests + */ +class SeleniumTorSimpleTests extends PHPUnit_Framework_TestCase +{ + protected $webDriver; + protected $urls = [ + 'http://skunksworkedp2cg.onion/sites.html' => 'A list of onion sites ordered by hostname', + 'http://32b5oz2bbtn6gqj3.onion' => 'The Hidden Wiki', + ]; + + protected $process; + protected $torProcess; + + public function setUp() + { + $firefoxBinary = new FirefoxBinary(__DIR__ . '/../tor-browser_en-US/Browser/start-tor-browser'); + $caps = DesiredCapabilities::tor($firefoxBinary); + $profile = new TorProfile(); + $caps->setCapability('timeout', 3600); + $caps->setCapability(FirefoxDriver::PROFILE, $profile); + + $this->torProcess = TorLauncher::launch($firefoxBinary); + + // Wait for Tor to connect + sleep(2); + $this->webDriver = RemoteWebDriver::create('http://localhost:4444/wd/hub', $caps); + } + + public function tearDown() + { + $this->webDriver->quit(); + TorLauncher::stop($this->torProcess); + } + + + public function testOnionCoreSite() + { + foreach ($this->urls as $url => $title) { + $this->webDriver->navigate()->to($url); + $elements = $this->webDriver->findElements(WebDriverBy::tagName('img')); + $this->assertEquals($title, $this->webDriver->getTitle()); + $images = []; + foreach ($elements as $element) { + $images[] = $element->getAttribute('src'); + } + file_put_contents(__DIR__ . '/../' . 'data.json', json_encode($images, JSON_PRETTY_PRINT)); + } + } +} diff --git a/bin/console b/bin/console new file mode 100755 index 0000000..06dd961 --- /dev/null +++ b/bin/console @@ -0,0 +1,18 @@ +#!/usr/bin/env php +add(new Sikofitt\Console\Command\TorBrowserDownloadCommand()); + +$app->run(); \ No newline at end of file diff --git a/composer.json b/composer.json index 415a813..8259e33 100644 --- a/composer.json +++ b/composer.json @@ -1,9 +1,22 @@ { "require-dev": { "phpunit/phpunit": "*", - "facebook/webdriver": "^1.2", - "se/selenium-server-standalone": "~2" + "friendsofphp/php-cs-fixer": "^2.0" }, "require": { + "facebook/webdriver": "dev-master", + "se/selenium-server-standalone": "~2", + "guzzlehttp/guzzle": "^6.2", + "symfony/console": "^3.2", + "symfony/process": "^3.2" + }, + "autoload": { + "psr-4": { + "Sikofitt\\":"src/Sikofitt" } + }, + "scripts": { + "tests": "vendor/bin/phpunit", + "download":"php bin/console tor:download" + } } diff --git a/composer.lock b/composer.lock index 5dd2dce..c2c98ad 100644 --- a/composer.lock +++ b/composer.lock @@ -4,9 +4,586 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "ecde7686e58544317cd07bc652dbb9c8", - "content-hash": "1247b0f750bb71ef5d87826c4b347753", - "packages": [], + "hash": "9adf3cf7906f0b5209fd592d4f1e55e2", + "content-hash": "54e275391a6e9e2bb1973efbc562ecd9", + "packages": [ + { + "name": "facebook/webdriver", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/facebook/php-webdriver.git", + "reference": "575600dfcfebad49fd0fc59d781b0696462a1f4e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/575600dfcfebad49fd0fc59d781b0696462a1f4e", + "reference": "575600dfcfebad49fd0fc59d781b0696462a1f4e", + "shasum": "" + }, + "require": { + "php": ">=5.3.19" + }, + "require-dev": { + "phpdocumentor/phpdocumentor": "2.*", + "phpunit/phpunit": "3.7.*" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "A php client for WebDriver", + "homepage": "https://github.com/facebook/php-webdriver", + "keywords": [ + "facebook", + "php", + "selenium", + "webdriver" + ], + "time": "2015-06-09 17:09:16" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.2.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "ebf29dee597f02f09f4d5bbecc68230ea9b08f60" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/ebf29dee597f02f09f4d5bbecc68230ea9b08f60", + "reference": "ebf29dee597f02f09f4d5bbecc68230ea9b08f60", + "shasum": "" + }, + "require": { + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.3.1", + "php": ">=5.5" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.0", + "psr/log": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.2-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2016-10-08 15:01:37" + }, + { + "name": "guzzlehttp/promises", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "time": "2016-12-20 10:07:11" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "5c6447c9df362e8f8093bda8f5d8873fe5c7f65b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/5c6447c9df362e8f8093bda8f5d8873fe5c7f65b", + "reference": "5c6447c9df362e8f8093bda8f5d8873fe5c7f65b", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "PSR-7 message implementation", + "keywords": [ + "http", + "message", + "stream", + "uri" + ], + "time": "2016-06-24 23:00:38" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06 14:39:51" + }, + { + "name": "psr/log", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2016-10-10 12:19:37" + }, + { + "name": "se/selenium-server-standalone", + "version": "v2.53.1", + "source": { + "type": "git", + "url": "https://github.com/sveneisenschmidt/selenium-server-standalone.git", + "reference": "ef4eea9c99efb9c0e3084e9cae625662ccd43361" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sveneisenschmidt/selenium-server-standalone/zipball/ef4eea9c99efb9c0e3084e9cae625662ccd43361", + "reference": "ef4eea9c99efb9c0e3084e9cae625662ccd43361", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "bin": [ + "bin/selenium-server-standalone" + ], + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache 2.0" + ], + "authors": [ + { + "name": "Sven Eisenschmidt", + "email": "sven.eisenschmidt@gmail.com" + } + ], + "description": "Composer distribution of Selenium Server Standalone, the browser automation framework. Adds a executable to your composer bin directory.", + "homepage": "https://github.com/sveneisenschmidt/selenium-server-standalone", + "keywords": [ + "selenium", + "testing" + ], + "time": "2016-07-01 14:16:52" + }, + { + "name": "symfony/console", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "d12aa9ca20f4db83ec58410978dab6afcb9d6aaa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/d12aa9ca20f4db83ec58410978dab6afcb9d6aaa", + "reference": "d12aa9ca20f4db83ec58410978dab6afcb9d6aaa", + "shasum": "" + }, + "require": { + "php": ">=5.5.9", + "symfony/debug": "~2.8|~3.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/event-dispatcher": "~2.8|~3.0", + "symfony/filesystem": "~2.8|~3.0", + "symfony/process": "~2.8|~3.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/filesystem": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2016-12-11 14:34:22" + }, + { + "name": "symfony/debug", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "9f923e68d524a3095c5a2ae5fc7220c7cbc12231" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/9f923e68d524a3095c5a2ae5fc7220c7cbc12231", + "reference": "9f923e68d524a3095c5a2ae5fc7220c7cbc12231", + "shasum": "" + }, + "require": { + "php": ">=5.5.9", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + }, + "require-dev": { + "symfony/class-loader": "~2.8|~3.0", + "symfony/http-kernel": "~2.8|~3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Debug Component", + "homepage": "https://symfony.com", + "time": "2016-11-16 22:18:16" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e79d363049d1c2128f133a2667e4f4190904f7f4", + "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2016-11-14 01:06:16" + }, + { + "name": "symfony/process", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "02ea84847aad71be7e32056408bb19f3a616cdd3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/02ea84847aad71be7e32056408bb19f3a616cdd3", + "reference": "02ea84847aad71be7e32056408bb19f3a616cdd3", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2016-11-24 10:40:28" + } + ], "packages-dev": [ { "name": "doctrine/instantiator", @@ -63,51 +640,69 @@ "time": "2015-06-14 21:17:01" }, { - "name": "facebook/webdriver", - "version": "1.2.0", + "name": "friendsofphp/php-cs-fixer", + "version": "v2.0.0", "source": { "type": "git", - "url": "https://github.com/facebook/php-webdriver.git", - "reference": "af21de3ae5306a8ca0bcc02a19735dadc43e83f3" + "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", + "reference": "f3baf72eb2f58bf275b372540f5b47d25aed910f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/af21de3ae5306a8ca0bcc02a19735dadc43e83f3", - "reference": "af21de3ae5306a8ca0bcc02a19735dadc43e83f3", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/f3baf72eb2f58bf275b372540f5b47d25aed910f", + "reference": "f3baf72eb2f58bf275b372540f5b47d25aed910f", "shasum": "" }, "require": { - "ext-curl": "*", - "php": "^5.5 || ~7.0" + "ext-tokenizer": "*", + "php": "^5.3.6 || >=7.0 <7.2", + "sebastian/diff": "^1.1", + "symfony/console": "^2.3 || ^3.0", + "symfony/event-dispatcher": "^2.1 || ^3.0", + "symfony/filesystem": "^2.4 || ^3.0", + "symfony/finder": "^2.2 || ^3.0", + "symfony/polyfill-php54": "^1.0", + "symfony/process": "^2.3 || ^3.0", + "symfony/stopwatch": "^2.5 || ^3.0" + }, + "conflict": { + "hhvm": "<3.9" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^1.11", - "php-mock/php-mock-phpunit": "^1.1", - "phpunit/phpunit": "4.6.* || ~5.0", - "squizlabs/php_codesniffer": "^2.6" + "gecko-packages/gecko-php-unit": "^2.0", + "phpunit/phpunit": "^4.5|^5", + "satooshi/php-coveralls": "^1.0" }, - "suggest": { - "phpdocumentor/phpdocumentor": "2.*" + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } }, - "type": "library", "autoload": { "psr-4": { - "Facebook\\WebDriver\\": "lib/" + "PhpCsFixer\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "Apache-2.0" + "MIT" ], - "description": "A PHP client for WebDriver", - "homepage": "https://github.com/facebook/php-webdriver", - "keywords": [ - "facebook", - "php", - "selenium", - "webdriver" + "authors": [ + { + "name": "Dariusz RumiƄski", + "email": "dariusz.ruminski@gmail.com" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } ], - "time": "2016-10-14 15:16:51" + "description": "A tool to automatically fix PHP code style", + "time": "2016-12-01 06:18:06" }, { "name": "myclabs/deep-copy", @@ -362,16 +957,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "4.0.3", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "903fd6318d0a90b4770a009ff73e4a4e9c437929" + "reference": "c14196e64a78570034afd0b7a9f3757ba71c2a0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/903fd6318d0a90b4770a009ff73e4a4e9c437929", - "reference": "903fd6318d0a90b4770a009ff73e4a4e9c437929", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c14196e64a78570034afd0b7a9f3757ba71c2a0a", + "reference": "c14196e64a78570034afd0b7a9f3757ba71c2a0a", "shasum": "" }, "require": { @@ -421,7 +1016,7 @@ "testing", "xunit" ], - "time": "2016-11-28 16:00:31" + "time": "2016-12-20 15:22:42" }, { "name": "phpunit/php-file-iterator", @@ -606,38 +1201,38 @@ }, { "name": "phpunit/phpunit", - "version": "5.5.4", + "version": "5.7.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "3e6e88e56c912133de6e99b87728cca7ed70c5f5" + "reference": "af91da3f2671006ff5d0628023de3b7ac4d1ef09" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3e6e88e56c912133de6e99b87728cca7ed70c5f5", - "reference": "3e6e88e56c912133de6e99b87728cca7ed70c5f5", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/af91da3f2671006ff5d0628023de3b7ac4d1ef09", + "reference": "af91da3f2671006ff5d0628023de3b7ac4d1ef09", "shasum": "" }, "require": { "ext-dom": "*", "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", "myclabs/deep-copy": "~1.3", "php": "^5.6 || ^7.0", - "phpspec/prophecy": "^1.3.1", - "phpunit/php-code-coverage": "^4.0.1", + "phpspec/prophecy": "^1.6.2", + "phpunit/php-code-coverage": "^4.0.3", "phpunit/php-file-iterator": "~1.4", "phpunit/php-text-template": "~1.2", "phpunit/php-timer": "^1.0.6", "phpunit/phpunit-mock-objects": "^3.2", - "sebastian/comparator": "~1.1", + "sebastian/comparator": "~1.2.2", "sebastian/diff": "~1.2", - "sebastian/environment": "^1.3 || ^2.0", - "sebastian/exporter": "~1.2", - "sebastian/global-state": "~1.0", - "sebastian/object-enumerator": "~1.0", + "sebastian/environment": "^1.3.4 || ^2.0", + "sebastian/exporter": "~2.0", + "sebastian/global-state": "^1.0 || ^2.0", + "sebastian/object-enumerator": "~2.0", "sebastian/resource-operations": "~1.0", "sebastian/version": "~1.0|~2.0", "symfony/yaml": "~2.1|~3.0" @@ -645,7 +1240,11 @@ "conflict": { "phpdocumentor/reflection-docblock": "3.0.2" }, + "require-dev": { + "ext-pdo": "*" + }, "suggest": { + "ext-xdebug": "*", "phpunit/php-invoker": "~1.1" }, "bin": [ @@ -654,7 +1253,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.5.x-dev" + "dev-master": "5.7.x-dev" } }, "autoload": { @@ -680,7 +1279,7 @@ "testing", "xunit" ], - "time": "2016-08-26 07:11:44" + "time": "2016-12-13 16:19:44" }, { "name": "phpunit/phpunit-mock-objects", @@ -741,45 +1340,6 @@ ], "time": "2016-12-08 20:27:08" }, - { - "name": "se/selenium-server-standalone", - "version": "v2.53.1", - "source": { - "type": "git", - "url": "https://github.com/sveneisenschmidt/selenium-server-standalone.git", - "reference": "ef4eea9c99efb9c0e3084e9cae625662ccd43361" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sveneisenschmidt/selenium-server-standalone/zipball/ef4eea9c99efb9c0e3084e9cae625662ccd43361", - "reference": "ef4eea9c99efb9c0e3084e9cae625662ccd43361", - "shasum": "" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "bin": [ - "bin/selenium-server-standalone" - ], - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache 2.0" - ], - "authors": [ - { - "name": "Sven Eisenschmidt", - "email": "sven.eisenschmidt@gmail.com" - } - ], - "description": "Composer distribution of Selenium Server Standalone, the browser automation framework. Adds a executable to your composer bin directory.", - "homepage": "https://github.com/sveneisenschmidt/selenium-server-standalone", - "keywords": [ - "selenium", - "testing" - ], - "time": "2016-07-01 14:16:52" - }, { "name": "sebastian/code-unit-reverse-lookup", "version": "1.0.0", @@ -993,21 +1553,21 @@ }, { "name": "sebastian/exporter", - "version": "1.2.2", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4" + "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4", - "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", + "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", "shasum": "" }, "require": { "php": ">=5.3.3", - "sebastian/recursion-context": "~1.0" + "sebastian/recursion-context": "~2.0" }, "require-dev": { "ext-mbstring": "*", @@ -1016,7 +1576,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -1056,7 +1616,7 @@ "export", "exporter" ], - "time": "2016-06-17 09:04:28" + "time": "2016-11-19 08:54:04" }, { "name": "sebastian/global-state", @@ -1111,21 +1671,21 @@ }, { "name": "sebastian/object-enumerator", - "version": "1.0.0", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "d4ca2fb70344987502567bc50081c03e6192fb26" + "reference": "96f8a3f257b69e8128ad74d3a7fd464bcbaa3b35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/d4ca2fb70344987502567bc50081c03e6192fb26", - "reference": "d4ca2fb70344987502567bc50081c03e6192fb26", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/96f8a3f257b69e8128ad74d3a7fd464bcbaa3b35", + "reference": "96f8a3f257b69e8128ad74d3a7fd464bcbaa3b35", "shasum": "" }, "require": { "php": ">=5.6", - "sebastian/recursion-context": "~1.0" + "sebastian/recursion-context": "~2.0" }, "require-dev": { "phpunit/phpunit": "~5" @@ -1133,7 +1693,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -1153,20 +1713,20 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2016-01-28 13:25:10" + "time": "2016-11-19 07:35:10" }, { "name": "sebastian/recursion-context", - "version": "1.0.2", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "913401df809e99e4f47b27cdd781f4a258d58791" + "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791", - "reference": "913401df809e99e4f47b27cdd781f4a258d58791", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a", + "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a", "shasum": "" }, "require": { @@ -1178,7 +1738,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -1206,7 +1766,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": "2016-11-19 07:33:16" }, { "name": "sebastian/resource-operations", @@ -1293,6 +1853,271 @@ "homepage": "https://github.com/sebastianbergmann/version", "time": "2016-10-03 07:35:21" }, + { + "name": "symfony/event-dispatcher", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "e8f47a327c2f0fd5aa04fa60af2b693006ed7283" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/e8f47a327c2f0fd5aa04fa60af2b693006ed7283", + "reference": "e8f47a327c2f0fd5aa04fa60af2b693006ed7283", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.8|~3.0", + "symfony/dependency-injection": "~2.8|~3.0", + "symfony/expression-language": "~2.8|~3.0", + "symfony/stopwatch": "~2.8|~3.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "time": "2016-10-13 06:29:04" + }, + { + "name": "symfony/filesystem", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "8d4cf7561a5b17e5eb7a02b80d0b8f014a3796d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/8d4cf7561a5b17e5eb7a02b80d0b8f014a3796d4", + "reference": "8d4cf7561a5b17e5eb7a02b80d0b8f014a3796d4", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "https://symfony.com", + "time": "2016-11-24 00:46:43" + }, + { + "name": "symfony/finder", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "a69cb5d455b4885ca376dc5bb3e1155cc8c08c4b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/a69cb5d455b4885ca376dc5bb3e1155cc8c08c4b", + "reference": "a69cb5d455b4885ca376dc5bb3e1155cc8c08c4b", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2016-12-13 09:39:43" + }, + { + "name": "symfony/polyfill-php54", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php54.git", + "reference": "90e085822963fdcc9d1c5b73deb3d2e5783b16a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php54/zipball/90e085822963fdcc9d1c5b73deb3d2e5783b16a0", + "reference": "90e085822963fdcc9d1c5b73deb3d2e5783b16a0", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php54\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 5.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2016-11-14 01:06:16" + }, + { + "name": "symfony/stopwatch", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "5b139e1c4290e6c7640ba80d9c9b5e49ef22b841" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5b139e1c4290e6c7640ba80d9c9b5e49ef22b841", + "reference": "5b139e1c4290e6c7640ba80d9c9b5e49ef22b841", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Stopwatch Component", + "homepage": "https://symfony.com", + "time": "2016-06-29 05:43:10" + }, { "name": "symfony/yaml", "version": "v3.2.1", @@ -1401,7 +2226,9 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "facebook/webdriver": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": [], diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..d710944 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,30 @@ + + + + Tests/ + src/ + *.php + + + \ No newline at end of file diff --git a/src/Sikofitt/Console/Command/TorBrowserDownloadCommand.php b/src/Sikofitt/Console/Command/TorBrowserDownloadCommand.php new file mode 100644 index 0000000..dd4c21c --- /dev/null +++ b/src/Sikofitt/Console/Command/TorBrowserDownloadCommand.php @@ -0,0 +1,139 @@ + + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace Sikofitt\Console\Command; + +use GuzzleHttp\Client; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\Process\Process; +use Symfony\Component\Process\ProcessBuilder; + +/** + * Class TorBrowserDownloadCommand + * + * @package Sikofitt\Console\Command + */ +class TorBrowserDownloadCommand extends Command +{ + const TOR_VERSION = '6.0.8'; + const TOR_DOWNLOAD_URL = 'https://www.torproject.org/dist/torbrowser'; + const TOR_PACKAGE_LINUX_I386 = 'tor-browser-linux32-6.0.8_en-US.tar.xz'; + const TOR_PACKAGE_LINUX_X64 = 'tor-browser-linux64-6.0.8_en-US.tar.xz'; + const TOR_PACKAGE_WIN = 'torbrowser-install-6.0.8_en-US.exe'; + + private $url; + + /** + * {@inheritdoc} + */ + public function configure() + { + $this->setName('tor:download') + ->setDescription('Downloads the tor browser.'); + } + + /** + * Downloads and extracts the tor browser. + * + * @param \Symfony\Component\Console\Input\InputInterface $input + * @param \Symfony\Component\Console\Output\OutputInterface $output + * @return void + */ + public function execute(InputInterface $input, OutputInterface $output) + { + $this->url = $this->getDownloadUrl(); + $io = $this->getStyle($input, $output); + + $download = $io->confirm('Download Tor?', true); + if (false === $download) { + exit(255); + } + + $io->note('Downloading ' . $this->getDownloadUrl() . ' ...'); + if (false === file_exists(BASE_DIR . $this->getFileName())) { + $client = new Client(); + try { + $data = $client->get($this->url); + } catch (\Exception $e) { + $io->error($e->getMessage()); + exit; + } + + file_put_contents(BASE_DIR . $this->getFileName(), $data->getBody()->getContents()); + } + $io->success('Downloaded'); + $io->note('Extracting ...'); + $tar = new ProcessBuilder(); + $tar + ->setPrefix('tar') + ->setArguments(array('-xvf', BASE_DIR . $this->getFileName())) + ->getProcess()->run(); + } + + /** + * Helper method to get symfony style + * + * @param \Symfony\Component\Console\Input\InputInterface $input + * The Input instance + * @param \Symfony\Component\Console\Output\OutputInterface $output + * The output instance + * + * @return \Symfony\Component\Console\Style\SymfonyStyle + * Instance of SymfonyStyle + */ + private function getStyle(InputInterface $input, OutputInterface $output) + { + return new SymfonyStyle($input, $output); + } + + private function getFileName() + { + $arch = $this->getArch(); + $os = $this->getOS(); + + switch ($os) { + case 'linux': + default: + switch ($arch) { + case 'i386': + $package = self::TOR_PACKAGE_LINUX_I386; + break; + case 'x86_64': + default: + $package = self::TOR_PACKAGE_LINUX_X64; + break; + } + break; + case 'win': + case 'windows': + $package = self::TOR_PACKAGE_WIN; + break; + } + return $package; + } + + private function getDownloadUrl() + { + $package = $this->getFileName(); + return sprintf('%s/%s/%s', self::TOR_DOWNLOAD_URL, self::TOR_VERSION, $package); + } + + private function getArch() + { + return strtolower(php_uname('m')); + } + + private function getOS() + { + return strtolower(PHP_OS); + } +} diff --git a/src/Sikofitt/WebDriver/FirefoxBinary.php b/src/Sikofitt/WebDriver/FirefoxBinary.php new file mode 100644 index 0000000..7c83d03 --- /dev/null +++ b/src/Sikofitt/WebDriver/FirefoxBinary.php @@ -0,0 +1,35 @@ + + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace Sikofitt\WebDriver; + +use Symfony\Component\Process\Process; + +/** + * Class FirefoxBinary + * + * @package Sikofitt\WebDriver + */ +class FirefoxBinary extends \SplFileInfo +{ + + /** + * @var string + */ + private $binaryName; + + public function __construct($binaryName) + { + parent::__construct($binaryName); + $this->binaryName = $binaryName; + if (false === $this->isExecutable()) { + throw new \Exception(sprintf('%s is not executable.', $this->binaryName)); + } + } +} diff --git a/src/Sikofitt/WebDriver/Remote/DesiredCapabilities.php b/src/Sikofitt/WebDriver/Remote/DesiredCapabilities.php new file mode 100644 index 0000000..b54af73 --- /dev/null +++ b/src/Sikofitt/WebDriver/Remote/DesiredCapabilities.php @@ -0,0 +1,37 @@ + + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace Sikofitt\WebDriver\Remote; + +use Sikofitt\WebDriver\FirefoxBinary; +use WebDriverCapabilityType; +use WebDriverPlatform; +use DesiredCapabilities as FaceBookDesiredCapabilities; + +class DesiredCapabilities extends FaceBookDesiredCapabilities +{ + + /** + * @param FirefoxBinary|null $firefoxBinary + * + * @return static DesiredCapabilities + */ + public static function tor(FirefoxBinary $firefoxBinary = null) + { + $caps = new static([ + WebDriverCapabilityType::BROWSER_NAME => 'firefox', + WebDriverCapabilityType::PLATFORM => WebDriverPlatform::ANY, + ]); + if (null !== $firefoxBinary) { + $caps->setCapability('firefox_binary', $firefoxBinary->getPathname()); + } + + return $caps; + } +} diff --git a/src/Sikofitt/WebDriver/Tor/TorDriver.php b/src/Sikofitt/WebDriver/Tor/TorDriver.php new file mode 100644 index 0000000..6817204 --- /dev/null +++ b/src/Sikofitt/WebDriver/Tor/TorDriver.php @@ -0,0 +1,17 @@ + + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace Sikofitt\WebDriver\Tor; + +use FirefoxDriver; + +class TorDriver extends FirefoxDriver +{ + const PROFILE = '/home/eric/projects/selenium-tor/tor-browser_en-US/Browser/TorBrowser/Data/Browser/profile.default'; +} diff --git a/src/Sikofitt/WebDriver/Tor/TorPreferences.php b/src/Sikofitt/WebDriver/Tor/TorPreferences.php new file mode 100644 index 0000000..09de582 --- /dev/null +++ b/src/Sikofitt/WebDriver/Tor/TorPreferences.php @@ -0,0 +1,44 @@ + + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace Sikofitt\WebDriver\Tor; + +/** + * Class TorPreferences + * + * @package Sikofitt\WebDriver\Tor + */ +class TorPreferences extends FirefoxPreferences +{ + + /** + * @var string + * Port WebDriver uses to communicate with Firefox instance + */ + const WEBDRIVER_FIREFOX_PORT = 'webdriver_firefox_port'; + + /** + * @var string + * Should the reader view (FF 38+) be enabled? NO. + * Disable the "Reader View" help tooltip, which can hide elements in the window.document + */ + const READER_PARSE_ON_LOAD_ENABLED = false; + + /** + * @var string + * Browser homepage + */ + const BROWSER_STARTUP_HOMEPAGE = 'browser.startup.homepage'; + + + + private function __construct() + { + } +} diff --git a/src/Sikofitt/WebDriver/Tor/TorProfile.php b/src/Sikofitt/WebDriver/Tor/TorProfile.php new file mode 100644 index 0000000..4b5327a --- /dev/null +++ b/src/Sikofitt/WebDriver/Tor/TorProfile.php @@ -0,0 +1,16 @@ + + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace Sikofitt\WebDriver\Tor; + +use FirefoxProfile; + +class TorProfile extends FirefoxProfile +{ +} diff --git a/src/Sikofitt/WebDriver/TorLauncher.php b/src/Sikofitt/WebDriver/TorLauncher.php new file mode 100644 index 0000000..6d9bb3b --- /dev/null +++ b/src/Sikofitt/WebDriver/TorLauncher.php @@ -0,0 +1,46 @@ + + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace Sikofitt\WebDriver; + +use Symfony\Component\Process\Process; +use Symfony\Component\Process\ProcessBuilder; + +class TorLauncher +{ + public static function launch(FirefoxBinary $firefoxBinary, $options = []) + { + $defaultOptions = array( + '--detach', + '--browser', + '--new-instance', + '--allow-remote', + ); + + $defaultOptions += $options; + $processBuilder = new ProcessBuilder(); + $processBuilder + ->setPrefix($firefoxBinary->getPathname()) + ->setArguments($defaultOptions); + $process = $processBuilder->getProcess(); + $process->start(); + return $process; + } + public static function stop(Process $process) + { + $process->stop(3, SIGKILL); + if ('linux' === strtolower(PHP_OS)) { + $processBuilder = new ProcessBuilder(); + $processBuilder->setPrefix('killall') + ->setArguments(['firefox']) + ->getProcess() + ->run(); + } + } +}