diff --git a/administrator/components/com_admin/script.php b/administrator/components/com_admin/script.php
index 3656960988..8e8e58d3aa 100644
--- a/administrator/components/com_admin/script.php
+++ b/administrator/components/com_admin/script.php
@@ -170,7 +170,6 @@ protected function updateManifestCaches()
$extensions[] = array('plugin', 'joomla', 'extension', 0);
$extensions[] = array('plugin', 'joomla', 'content', 0);
$extensions[] = array('plugin', 'languagecode', 'system', 0);
- $extensions[] = array('plugin', 'recaptcha', 'captcha', 0);
$extensions[] = array('plugin', 'categories', 'finder', 0);
$extensions[] = array('plugin', 'content', 'finder', 0);
$extensions[] = array('plugin', 'tags', 'finder', 0);
diff --git a/administrator/language/en-GB/en-GB.plg_captcha_recaptcha.ini b/administrator/language/en-GB/en-GB.plg_captcha_recaptcha.ini
deleted file mode 100644
index 6ba182347e..0000000000
--- a/administrator/language/en-GB/en-GB.plg_captcha_recaptcha.ini
+++ /dev/null
@@ -1,49 +0,0 @@
-; Joomla! Project
-; Copyright (C) 2005 - 2014 Open Source Matters. All rights reserved.
-; License GNU General Public License version 2 or later; see LICENSE.txt, see LICENSE.php
-; Note : All ini files need to be saved as UTF-8
-
-PLG_CAPTCHA_RECAPTCHA_XML_DESCRIPTION="This CAPTCHA plugin uses the reCAPTCHA service to prevent spammers while it helps to digitize books, newspapers and old radio shows. To get a public and private key for your domain, go to http://www.google.com/recaptcha. To use this for new account registration, go to Options in the User Manager and select Captcha - reCaptcha as the Captcha."
-PLG_CAPTCHA_RECAPTCHA="Captcha - ReCaptcha"
-
-; Params
-PLG_RECAPTCHA_PUBLIC_KEY_LABEL="Public Key"
-PLG_RECAPTCHA_PUBLIC_KEY_DESC="Used in the JavaScript code that is served to your users. See the plugin description for instructions on getting a public key."
-PLG_RECAPTCHA_PRIVATE_KEY_LABEL="Private Key"
-PLG_RECAPTCHA_PRIVATE_KEY_DESC="Used in the communication between your server and the ReCaptha server. Be sure to keep it a secret. See the plugin description for instructions on getting a private key."
-PLG_RECAPTCHA_THEME_LABEL="Theme"
-PLG_RECAPTCHA_THEME_DESC="Defines which theme to use for reCAPTCHA."
-PLG_RECAPTCHA_THEME_RED="Red"
-PLG_RECAPTCHA_THEME_WHITE="White"
-PLG_RECAPTCHA_THEME_BLACKGLASS="BlackGlass"
-PLG_RECAPTCHA_THEME_CLEAN="Clean"
-PLG_RECAPTCHA_LANG_LABEL="Language"
-PLG_RECAPTCHA_LANG_DESC="Select the language for the reCAPTCHA. If default is set and the language file has a custom translation, it will be used."
-
-; Error messages
-PLG_RECAPTCHA_ERROR_NO_PRIVATE_KEY="ReCaptcha plugin needs a private key to be set in its parameters. Please contact a site administrator."
-PLG_RECAPTCHA_ERROR_NO_PUBLIC_KEY="ReCaptcha plugin needs a public key to be set in its parameters. Please contact a site administrator."
-PLG_RECAPTCHA_ERROR_EMPTY_SOLUTION="Empty solution not allowed."
-PLG_RECAPTCHA_ERROR_NO_IP="For security reasons, you must pass the remote ip address to reCAPTCHA"
-PLG_RECAPTCHA_ERROR_UNKNOWN="Unknown error."
-PLG_RECAPTCHA_ERROR_INVALID_SITE_PUBLIC_KEY="We weren't able to verify the public key."
-PLG_RECAPTCHA_ERROR_INVALID_SITE_PRIVATE_KEY="We weren't able to verify the private key."
-PLG_RECAPTCHA_ERROR_INVALID_REQUEST_COOKIE="The challenge parameter of the verify script was incorrect."
-PLG_RECAPTCHA_ERROR_INCORRECT_CAPTCHA_SOL="The CAPTCHA solution was incorrect."
-PLG_RECAPTCHA_ERROR_VERIFY_PARAMS_INCORRECT="The parameters to verify were incorrect, make sure you are passing all the required parameters."
-PLG_RECAPTCHA_ERROR_INVALID_REFERRER="reCAPTCHA API keys are tied to a specific domain name for security reasons."
-PLG_RECAPTCHA_ERROR_RECAPTCHA_NOT_REACHABLE="Unable to contact the reCAPTCHA verify server."
-
-; Uncomment(remove the ";" from the beginning of the line) the following lines if reCAPTCHA is not available in your language
-; When uncommenting, do NOT translate PLG_RECAPTCHA_CUSTOM_LANG
-; As of 01/01/2012, the following languages do not need translation: en, nl, fr, de, pt, ru, es, tr
-;PLG_RECAPTCHA_CUSTOM_LANG="true"
-;PLG_RECAPTCHA_INSTRUCTIONS_VISUAL="Type the two words:"
-;PLG_RECAPTCHA_INSTRUCTIONS_AUDIO="Type what you hear:"
-;PLG_RECAPTCHA_PLAY_AGAIN="Play sound again"
-;PLG_RECAPTCHA_CANT_HEAR_THIS="Download sound as MP3"
-;PLG_RECAPTCHA_VISUAL_CHALLENGE="Get a visual challenge"
-;PLG_RECAPTCHA_AUDIO_CHALLENGE="Get an audio challenge"
-;PLG_RECAPTCHA_REFRESH_BTN="Get a new challenge"
-;PLG_RECAPTCHA_HELP_BTN="Help"
-;PLG_RECAPTCHA_INCORRECT_TRY_AGAIN="Incorrect. Try again."
diff --git a/administrator/language/en-GB/en-GB.plg_captcha_recaptcha.sys.ini b/administrator/language/en-GB/en-GB.plg_captcha_recaptcha.sys.ini
deleted file mode 100644
index dc20fd6ba5..0000000000
--- a/administrator/language/en-GB/en-GB.plg_captcha_recaptcha.sys.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-; Joomla! Project
-; Copyright (C) 2005 - 2014 Open Source Matters. All rights reserved.
-; License GNU General Public License version 2 or later; see LICENSE.txt, see LICENSE.php
-; Note : All ini files need to be saved as UTF-8
-
-PLG_CAPTCHA_RECAPTCHA_XML_DESCRIPTION="This CAPTCHA plugin uses the reCAPTCHA service to prevent spammers while it helps to digitize books, newspapers and old radio shows. To get a public and private key for your domain, go to http://www.google.com/recaptcha. To use this for new account registration, go to Options in the User Manager and select Captcha - reCaptcha as the Captcha."
-PLG_CAPTCHA_RECAPTCHA="Captcha - ReCaptcha"
diff --git a/administrator/language/en-GB/install.xml b/administrator/language/en-GB/install.xml
index 4866618df7..62c8ca6f0c 100644
--- a/administrator/language/en-GB/install.xml
+++ b/administrator/language/en-GB/install.xml
@@ -84,8 +84,6 @@
en-GB.plg_authentication_joomla.sys.inien-GB.plg_authentication_ldap.inien-GB.plg_authentication_ldap.sys.ini
- en-GB.plg_captcha_recaptcha.ini
- en-GB.plg_captcha_recaptcha.sys.inien-GB.plg_content_emailcloak.inien-GB.plg_content_emailcloak.sys.inien-GB.plg_content_finder.ini
diff --git a/installation/sql/mysql/joomla.sql b/installation/sql/mysql/joomla.sql
index 6c11f06c05..aa07d2faec 100644
--- a/installation/sql/mysql/joomla.sql
+++ b/installation/sql/mysql/joomla.sql
@@ -360,7 +360,6 @@ INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`
(434, 'plg_extension_joomla', 'plugin', 'joomla', 'extension', 0, 1, 1, 1, '', '', '', '', 0, '0000-00-00 00:00:00', 1, 0),
(435, 'plg_content_joomla', 'plugin', 'joomla', 'content', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0),
(436, 'plg_system_languagecode', 'plugin', 'languagecode', 'system', 0, 0, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 10, 0),
-(439, 'plg_captcha_recaptcha', 'plugin', 'recaptcha', 'captcha', 0, 0, 1, 0, '', '{"public_key":"","private_key":"","theme":"clean"}', '', '', 0, '0000-00-00 00:00:00', 0, 0),
(440, 'plg_system_highlight', 'plugin', 'highlight', 'system', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 7, 0),
(441, 'plg_content_finder', 'plugin', 'finder', 'content', 0, 0, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0),
(442, 'plg_finder_categories', 'plugin', 'categories', 'finder', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 1, 0),
diff --git a/plugins/captcha/.gitignore b/plugins/captcha/.gitignore
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/plugins/captcha/recaptcha/recaptcha.php b/plugins/captcha/recaptcha/recaptcha.php
deleted file mode 100644
index b3d650a77c..0000000000
--- a/plugins/captcha/recaptcha/recaptcha.php
+++ /dev/null
@@ -1,269 +0,0 @@
-_getLanguage();
- $pubkey = $this->params->get('public_key', '');
- $theme = $this->params->get('theme', 'clean');
-
- if ($pubkey == null || $pubkey == '')
- {
- throw new Exception(JText::_('PLG_RECAPTCHA_ERROR_NO_PUBLIC_KEY'));
- }
-
- $server = self::RECAPTCHA_API_SERVER;
-
- if ($app->isSSLConnection())
- {
- $server = self::RECAPTCHA_API_SECURE_SERVER;
- }
-
- JHtml::_('script', $server . '/js/recaptcha_ajax.js');
- $document->addScriptDeclaration('jQuery( document ).ready(function()
- {
- Recaptcha.create("' . $pubkey . '", "' . $id . '", {theme: "' . $theme . '",' . $lang . 'tabindex: 0});});'
- );
-
- return true;
- }
-
- /**
- * Gets the challenge HTML
- *
- * @param string $name The name of the field.
- * @param string $id The id of the field.
- * @param string $class The class of the field. This should be passed as
- * e.g. 'class="required"'.
- *
- * @return string The HTML to be embedded in the form.
- *
- * @since 2.5
- */
- public function onDisplay($name, $id = 'dynamic_recaptcha_1', $class = '')
- {
- return '
';
- }
-
- /**
- * Calls an HTTP POST function to verify if the user's guess was correct
- *
- * @param string $code Answer provided by user.
- *
- * @return True if the answer is correct, false otherwise
- *
- * @since 2.5
- */
- public function onCheckAnswer($code)
- {
- $input = JFactory::getApplication()->input;
- $privatekey = $this->params->get('private_key');
- $remoteip = $input->server->get('REMOTE_ADDR', '', 'string');
- $challenge = $input->get('recaptcha_challenge_field', '', 'string');
- $response = $input->get('recaptcha_response_field', '', 'string');
-
- // Check for Private Key
- if (empty($privatekey))
- {
- $this->_subject->setError(JText::_('PLG_RECAPTCHA_ERROR_NO_PRIVATE_KEY'));
-
- return false;
- }
-
- // Check for IP
- if (empty($remoteip))
- {
- $this->_subject->setError(JText::_('PLG_RECAPTCHA_ERROR_NO_IP'));
-
- return false;
- }
-
- // Discard spam submissions
- if ($challenge == null || strlen($challenge) == 0 || $response == null || strlen($response) == 0)
- {
- $this->_subject->setError(JText::_('PLG_RECAPTCHA_ERROR_EMPTY_SOLUTION'));
-
- return false;
- }
-
- $response = $this->_recaptcha_http_post(
- self::RECAPTCHA_VERIFY_SERVER, "/recaptcha/api/verify",
- array(
- 'privatekey' => $privatekey,
- 'remoteip' => $remoteip,
- 'challenge' => $challenge,
- 'response' => $response
- )
- );
-
- $answers = explode("\n", $response[1]);
-
- if (trim($answers[0]) == 'true')
- {
- return true;
- }
- else
- {
- // @todo use exceptions here
- $this->_subject->setError(JText::_('PLG_RECAPTCHA_ERROR_' . strtoupper(str_replace('-', '_', $answers[1]))));
-
- return false;
- }
- }
-
- /**
- * Encodes the given data into a query string format.
- *
- * @param array $data Array of string elements to be encoded
- *
- * @return string Encoded request
- *
- * @since 2.5
- */
- private function _recaptcha_qsencode($data)
- {
- $req = "";
-
- foreach ($data as $key => $value)
- {
- $req .= $key . '=' . urlencode(stripslashes($value)) . '&';
- }
-
- // Cut the last '&'
- $req = rtrim($req, '&');
-
- return $req;
- }
-
- /**
- * Submits an HTTP POST to a reCAPTCHA server.
- *
- * @param string $host Host name to POST to.
- * @param string $path Path on host to POST to.
- * @param array $data Data to be POSTed.
- * @param int $port Optional port number on host.
- *
- * @return array Response
- *
- * @since 2.5
- */
- private function _recaptcha_http_post($host, $path, $data, $port = 80)
- {
- $req = $this->_recaptcha_qsencode($data);
-
- $http_request = "POST $path HTTP/1.0\r\n";
- $http_request .= "Host: $host\r\n";
- $http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n";
- $http_request .= "Content-Length: " . strlen($req) . "\r\n";
- $http_request .= "User-Agent: reCAPTCHA/PHP\r\n";
- $http_request .= "\r\n";
- $http_request .= $req;
-
- $response = '';
-
- if (($fs = @fsockopen($host, $port, $errno, $errstr, 10)) == false )
- {
- die('Could not open socket');
- }
-
- fwrite($fs, $http_request);
-
- while (!feof($fs))
- {
- // One TCP-IP packet
- $response .= fgets($fs, 1160);
- }
-
- fclose($fs);
- $response = explode("\r\n\r\n", $response, 2);
-
- return $response;
- }
-
- /**
- * Get the language tag or a custom translation
- *
- * @return string
- *
- * @since 2.5
- */
- private function _getLanguage()
- {
- $language = JFactory::getLanguage();
-
- $tag = explode('-', $language->getTag());
- $tag = $tag[0];
- $available = array('en', 'pt', 'fr', 'de', 'nl', 'ru', 'es', 'tr');
-
- if (in_array($tag, $available))
- {
- return "lang : '" . $tag . "',";
- }
-
- // If the default language is not available, let's search for a custom translation
- if ($language->hasKey('PLG_RECAPTCHA_CUSTOM_LANG'))
- {
- $custom[] = 'custom_translations : {';
- $custom[] = "\t" . 'instructions_visual : "' . JText::_('PLG_RECAPTCHA_INSTRUCTIONS_VISUAL') . '",';
- $custom[] = "\t" . 'instructions_audio : "' . JText::_('PLG_RECAPTCHA_INSTRUCTIONS_AUDIO') . '",';
- $custom[] = "\t" . 'play_again : "' . JText::_('PLG_RECAPTCHA_PLAY_AGAIN') . '",';
- $custom[] = "\t" . 'cant_hear_this : "' . JText::_('PLG_RECAPTCHA_CANT_HEAR_THIS') . '",';
- $custom[] = "\t" . 'visual_challenge : "' . JText::_('PLG_RECAPTCHA_VISUAL_CHALLENGE') . '",';
- $custom[] = "\t" . 'audio_challenge : "' . JText::_('PLG_RECAPTCHA_AUDIO_CHALLENGE') . '",';
- $custom[] = "\t" . 'refresh_btn : "' . JText::_('PLG_RECAPTCHA_REFRESH_BTN') . '",';
- $custom[] = "\t" . 'help_btn : "' . JText::_('PLG_RECAPTCHA_HELP_BTN') . '",';
- $custom[] = "\t" . 'incorrect_try_again : "' . JText::_('PLG_RECAPTCHA_INCORRECT_TRY_AGAIN') . '",';
- $custom[] = '},';
- $custom[] = "lang : '" . $tag . "',";
-
- return implode("\n", $custom);
- }
-
- // If nothing helps fall back to english
- return '';
- }
-}
diff --git a/plugins/captcha/recaptcha/recaptcha.xml b/plugins/captcha/recaptcha/recaptcha.xml
deleted file mode 100644
index 2cda724bdb..0000000000
--- a/plugins/captcha/recaptcha/recaptcha.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
- plg_captcha_recaptcha
- 3.0.0
- December 2011
- Joomla! Project
- admin@joomla.org
- www.joomla.org
- Copyright (C) 2005 - 2014 Open Source Matters. All rights reserved.
- GNU General Public License version 2 or later; see LICENSE.txt
- PLG_CAPTCHA_RECAPTCHA_XML_DESCRIPTION
-
- recaptcha.php
-
-
-
-
-
-
-
diff --git a/tests/unit/stubs/database/jos_content.csv b/tests/unit/stubs/database/jos_content.csv
index 0a937c7518..794c9b973d 100644
--- a/tests/unit/stubs/database/jos_content.csv
+++ b/tests/unit/stubs/database/jos_content.csv
@@ -285,12 +285,6 @@
A more sustainable and flexible framework for Component and Extension developers
Backward compatibility with previous releases of Components, Templates, Modules, and other Extensions
The Captcha plugins are used to prevent spam submissions on your forms such as registration, contact and login. You basic installation of Joomla includes one Captcha plugin which leverages the ReCaptcha® service but you may install other plugins connecting to different Captcha systems.
Note: ReCaptcha is a the trademark of Google Inc. and is an independent product not associated with or endorsed by the Joomla Project. You will need to register and agree to the Terms of Service at Recaptcha.net to use this plugin. Complete instructions are available if you edit the ReCaptcha plugin in the Plugin Manager.
The Quick Icon plugin group is used to provide notification that updates to Joomla! or installed extensions are available and should be applied. These notifications display on your administrator control panel, which is the page you see when you first log in to your site administrator.
Default on:
diff --git a/tests/unit/stubs/database/jos_extensions.csv b/tests/unit/stubs/database/jos_extensions.csv
index 0d6c406c93..8b5c34ce61 100644
--- a/tests/unit/stubs/database/jos_extensions.csv
+++ b/tests/unit/stubs/database/jos_extensions.csv
@@ -78,7 +78,6 @@
'434','plg_extension_joomla','plugin','joomla','extension','0','1','1','1','{"name":"plg_extension_joomla","type":"plugin","creationDate":"May 2010","author":"Joomla! Project","copyright":"Copyright (C) 2005 - 2014 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.0.0","description":"PLG_EXTENSION_JOOMLA_XML_DESCRIPTION","group":""}','{}',,,'0','0000-00-00 00:00:00','1','0'
'435','plg_content_joomla','plugin','joomla','content','0','1','1','0','{"name":"plg_content_joomla","type":"plugin","creationDate":"November 2010","author":"Joomla! Project","copyright":"Copyright (C) 2005 - 2014 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.0.0","description":"PLG_CONTENT_JOOMLA_XML_DESCRIPTION","group":""}','{}',,,'0','0000-00-00 00:00:00','0','0'
'436','plg_system_languagecode','plugin','languagecode','system','0','0','1','0','{"name":"plg_system_languagecode","type":"plugin","creationDate":"November 2011","author":"Joomla! Project","copyright":"Copyright (C) 2005 - 2014 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.0.0","description":"PLG_SYSTEM_LANGUAGECODE_XML_DESCRIPTION","group":""}','{}',,,'0','0000-00-00 00:00:00','10','0'
-'439','plg_captcha_recaptcha','plugin','recaptcha','captcha','0','0','1','0','{"name":"plg_captcha_recaptcha","type":"plugin","creationDate":"December 2011","author":"Joomla! Project","copyright":"Copyright (C) 2005 - 2014 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.0.0","description":"PLG_CAPTCHA_RECAPTCHA_XML_DESCRIPTION","group":""}','{"public_key":"","private_key":"","theme":"clean"}',,,'0','0000-00-00 00:00:00','0','0'
'440','plg_system_highlight','plugin','highlight','system','0','1','1','0','{"name":"plg_system_highlight","type":"plugin","creationDate":"August 2011","author":"Joomla! Project","copyright":"(C) 2005 - 2014 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.0.0","description":"PLG_SYSTEM_HIGHLIGHT_XML_DESCRIPTION","group":""}','{}',,,'0','0000-00-00 00:00:00','7','0'
'441','plg_content_finder','plugin','finder','content','0','0','1','0','{"name":"plg_content_finder","type":"plugin","creationDate":"December 2011","author":"Joomla! Project","copyright":"Copyright (C) 2005 - 2014 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.0.0","description":"PLG_CONTENT_FINDER_XML_DESCRIPTION","group":""}','{}',,,'0','0000-00-00 00:00:00','0','0'
'442','plg_finder_categories','plugin','categories','finder','0','1','1','0','{"name":"plg_finder_categories","type":"plugin","creationDate":"August 2011","author":"Joomla! Project","copyright":"(C) 2005 - 2014 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.0.0","description":"PLG_FINDER_CATEGORIES_XML_DESCRIPTION","group":""}','{}',,,'0','0000-00-00 00:00:00','1','0'