Sitewards_Captcha - Version 1.0.0

Version Notes

Released new extension.

Download this release

Release Info

Developer Sitewards Magento Team
Extension Sitewards_Captcha
Version 1.0.0
Comparing to
See all releases


Version 1.0.0

app/code/community/Sitewards/Captcha/Block/Sendfriend/Send.php ADDED
@@ -0,0 +1,98 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Class Sitewards_Captcha_Block_Sendfriend_Send
4
+ * - update the Mage_Sendfriend_Block_Send to allow customer edit product description and name
5
+ * - check if captcha required
6
+ *
7
+ * @category Sitewards
8
+ * @package Sitewards_Captcha
9
+ * @copyright Copyright (c) 2013 Sitewards GmbH (http://www.sitewards.com/)
10
+ */
11
+ class Sitewards_Captcha_Block_Sendfriend_Send extends Mage_Sendfriend_Block_Send {
12
+
13
+ /**
14
+ * Sendfriend product
15
+ *
16
+ * @var object Mage_Catalog_Model_Product
17
+ */
18
+ protected $_oProduct = null;
19
+
20
+ /**
21
+ * Block id
22
+ *
23
+ * @type string
24
+ */
25
+ const CAPTCHA_BLOCK_ID = 'sendfriend';
26
+
27
+ /**
28
+ * Number of emails without captcha config path
29
+ *
30
+ * @type string
31
+ */
32
+ const XML_PATH_MAX_TILL_CAPTCHA_TIMES = 'customer/captcha/max_till_captcha_times';
33
+
34
+ /**
35
+ * Captcha Timeout config path
36
+ *
37
+ * @type string
38
+ */
39
+ const XML_PATH_MAX_TILL_CAPTCHA_TIMEFRAME_SECONDS = 'customer/captcha/max_till_captcha_timeframe_seconds';
40
+
41
+ /**
42
+ * Load the product object based on the requested Id
43
+ */
44
+ public function _prepareLayout() {
45
+ $iProductId = $this->getRequest()->getParam('id', null);
46
+ $this->_oProduct = Mage::getModel('catalog/product')->load($iProductId);
47
+ }
48
+
49
+ /**
50
+ * Load the message getData when it has been set,
51
+ * Else load the product description.
52
+ *
53
+ * @return string
54
+ */
55
+ public function getMessage() {
56
+ $aFormData = $this->getFormData()->getData();
57
+ if(!empty($aFormData)) {
58
+ return $aFormData['sender']['message'];
59
+ } else {
60
+ return $this->getProductDescription();
61
+ }
62
+ }
63
+
64
+ /**
65
+ * Retrieve Current Product Description
66
+ *
67
+ * @return string
68
+ */
69
+ public function getProductDescription() {
70
+ return $this->_oProduct->getDescription();
71
+ }
72
+
73
+ /**
74
+ * Retrieve Current Product Name
75
+ *
76
+ * @return string
77
+ */
78
+ public function getProductName() {
79
+ return $this->_oProduct->getName();
80
+ }
81
+
82
+ /**
83
+ * Check whether captcha should be displayed in the form
84
+ *
85
+ * @return boolean
86
+ */
87
+ public function isCaptchaRequired(){
88
+ if (!Mage::helper('captcha')->isSendFriendCaptchaRequired()) {
89
+ return false;
90
+ }
91
+ $oCaptchaChecker = Mage::getModel('captcha/captchachecker');
92
+ return $oCaptchaChecker->isRequired(
93
+ self::CAPTCHA_BLOCK_ID,
94
+ Mage::getStoreConfig(self::XML_PATH_MAX_TILL_CAPTCHA_TIMES),
95
+ Mage::getStoreConfig(self::XML_PATH_MAX_TILL_CAPTCHA_TIMEFRAME_SECONDS)
96
+ );
97
+ }
98
+ }
app/code/community/Sitewards/Captcha/Helper/Data.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Sitewards_Captcha_Helper_Data
4
+ * - check if captcha is required
5
+ *
6
+ * @category Sitewards
7
+ * @package Sitewards_Captcha
8
+ * @copyright Copyright (c) 2013 Sitewards GmbH (http://www.sitewards.com/)
9
+ */
10
+ class Sitewards_Captcha_Helper_Data extends Mage_Captcha_Helper_Data {
11
+
12
+ /**
13
+ * Returns if captcha is set to display for send to friend form
14
+ *
15
+ * @return bool
16
+ */
17
+ public function isSendFriendCaptchaRequired() {
18
+ $oCaptchaModel = Mage::helper('captcha')->getCaptcha(Sitewards_Captcha_Model_Sendfriend::SEND_FRIEND_FORM_ID);
19
+ if (!$oCaptchaModel->isRequired()) {
20
+ return false;
21
+ }
22
+ return true;
23
+ }
24
+ }
app/code/community/Sitewards/Captcha/Model/CaptchaChecker.php ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Sitewards_Captcha_Model_CaptchaChecker
4
+ * - check if captcha is required
5
+ * - validate captcha
6
+ * - increment successful form submit
7
+ *
8
+ * @category Sitewards
9
+ * @package Sitewards_Captcha
10
+ * @copyright Copyright (c) 2013 Sitewards GmbH (http://www.sitewards.com/)
11
+ */
12
+ class Sitewards_Captcha_Model_CaptchaChecker extends Mage_Core_Model_Abstract {
13
+
14
+ /**
15
+ * Customer session
16
+ *
17
+ * @var Mage_Core_Model_Abstract
18
+ */
19
+ private $oCustomerSession = null;
20
+
21
+
22
+ public function __construct(){
23
+ $this->oCustomerSession = Mage::getSingleton('customer/session');
24
+ }
25
+
26
+ /**
27
+ * Checks if the captcha should be displayed in the form
28
+ *
29
+ *
30
+ * @param string $sIdBlock unique string to get the right counter
31
+ * @param integer $iMaxPerTimeframe max. number of sending the form before captcha should be displayed
32
+ * @param integer $iTimeframeSeconds timeframe within which the counter should get the max value to make the captcha displayed
33
+ * @return boolean
34
+ */
35
+ public function isRequired($sIdBlock, $iMaxPerTimeframe, $iTimeframeSeconds){
36
+ $iTimesInTimeframe = 0;
37
+ $aCounter = $this->getCounter($sIdBlock);
38
+ foreach ($aCounter as $iTimestamp){
39
+ if ($iTimestamp > time() - $iTimeframeSeconds){
40
+ $iTimesInTimeframe++;
41
+ }
42
+ }
43
+ if ($iTimesInTimeframe >= $iMaxPerTimeframe){
44
+ return true;
45
+ } else {
46
+ return false;
47
+ }
48
+ }
49
+
50
+ /**
51
+ * Gets the counter for a particular block based on the block id
52
+ * Returns the array of the form
53
+ * Array(
54
+ * 'key' => 'timestamp_of_the_counter_inc',
55
+ * ...
56
+ * )
57
+ *
58
+ * @param string $sIdBlock
59
+ * @return array
60
+ */
61
+ private function getCounter($sIdBlock){
62
+ $aCaptchaCheckerSession = $this->oCustomerSession->getData('captchachecker');
63
+ if (isset($aCaptchaCheckerSession[$sIdBlock])){
64
+ return $aCaptchaCheckerSession[$sIdBlock];
65
+ } else {
66
+ return array();
67
+ }
68
+ }
69
+
70
+ /**
71
+ * Sets the counter
72
+ * Overwrites the counter for a certain block id with a new counter array
73
+ *
74
+ * @param string $sIdBlock
75
+ * @param array $aCounter
76
+ * @return Sitewards_Captcha_Model_CaptchaChecker
77
+ */
78
+ private function setCounter($sIdBlock, $aCounter){
79
+ $aCaptchaCheckerSession = $this->oCustomerSession->getData('captchachecker');
80
+ $aCaptchaCheckerSession[$sIdBlock] = $aCounter;
81
+ $this->oCustomerSession->setData('captchachecker', $aCaptchaCheckerSession);
82
+ return $this;
83
+ }
84
+
85
+ /**
86
+ * Increments the counter with a certain block id
87
+ *
88
+ * @param string $sIdBlock
89
+ * @return Sitewards_Captcha_Model_CaptchaChecker
90
+ */
91
+ public function incCounter($sIdBlock){
92
+ $aCounter = $this->getCounter($sIdBlock);
93
+ $aCounter[] = time();
94
+ $this->setCounter($sIdBlock, $aCounter);
95
+ return $this;
96
+ }
97
+
98
+ /**
99
+ * Checks if the captcha provided in the post form is valid
100
+ *
101
+ * @return boolean
102
+ */
103
+ public function isValidCaptcha(){
104
+ $aCaptchaFormValues = Mage::app()->getRequest()->getParam('captcha');
105
+ $bValid = true;
106
+ // for the case that we have more than one captcha
107
+ // in the form, every captcha should be validated
108
+ if (is_array($aCaptchaFormValues)){
109
+ foreach ($aCaptchaFormValues as $sCaptchaName => $sCaptchaValue){
110
+ $oCaptchaModel = Mage::helper('captcha')->getCaptcha($sCaptchaName);
111
+ if (!$oCaptchaModel->isCorrect($sCaptchaValue)){
112
+ $bValid = false;
113
+ }
114
+ }
115
+ }
116
+ return $bValid;
117
+ }
118
+ }
app/code/community/Sitewards/Captcha/Model/Sendfriend.php ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Sitewards_Captcha_Model_Sendfriend
4
+ * - override Mage_Sendfriend_Model_Sendfriend
5
+ * - set the correct product url in the email sent
6
+ * - send customer modified product name
7
+ * - validate captcha
8
+ *
9
+ * @category Sitewards
10
+ * @package Sitewards_Captcha
11
+ * @copyright Copyright (c) 2013 Sitewards GmbH (http://www.sitewards.com/)
12
+ */
13
+ class Sitewards_Captcha_Model_Sendfriend extends Mage_Sendfriend_Model_Sendfriend {
14
+
15
+ const SEND_FRIEND_FORM_ID = 'product_sendtofriend_form_captcha';
16
+
17
+ /**
18
+ * Update the send email function to set the correct product url in the email a friend
19
+ *
20
+ * @see Mage_Sendfriend_Model_Sendfriend::send()
21
+ */
22
+ public function send() {
23
+
24
+ if ($this->isExceedLimit()){
25
+ Mage::throwException(Mage::helper('sendfriend')->__('You have exceeded limit of %d sends in an hour', $this->getMaxSendsToFriend()));
26
+ }
27
+
28
+ /* @var $oTranslate Mage_Core_Model_Translate */
29
+ $oTranslate = Mage::getSingleton('core/translate');
30
+ $oTranslate->setTranslateInline(false);
31
+
32
+ /* @var $oMailTemplate Mage_Core_Model_Email_Template */
33
+ $oMailTemplate = Mage::getModel('core/email_template');
34
+
35
+ $sMessage = nl2br(htmlspecialchars($this->getSender()->getMessage()));
36
+ $sPName = nl2br(htmlspecialchars($this->getSender()->getProductName()));
37
+
38
+ $sSender = array(
39
+ 'name' => $this->_getHelper()->htmlEscape($this->getSender()->getName()),
40
+ 'email' => $this->_getHelper()->htmlEscape($this->getSender()->getEmail())
41
+ );
42
+ $aShopSender = array(
43
+ 'name'=> Mage::getStoreConfig('trans_email/ident_general/name'),
44
+ 'email'=> Mage::getStoreConfig('trans_email/ident_general/email')
45
+ );
46
+
47
+ $oMailTemplate->setDesignConfig(array(
48
+ 'area' => 'frontend',
49
+ 'store' => Mage::app()->getStore()->getId()
50
+ ));
51
+
52
+ foreach ($this->getRecipients()->getEmails() as $iEmailKey => $sEmail) {
53
+ $sName = $this->getRecipients()->getNames($iEmailKey);
54
+ $oMailTemplate->sendTransactional(
55
+ $this->getTemplate(),
56
+ $aShopSender,
57
+ $sEmail,
58
+ $sName,
59
+ array(
60
+ 'name' => $sName,
61
+ 'email' => $sEmail,
62
+ 'product_name' => $sPName,
63
+ 'telephone' => Mage::getStoreConfig('general/store_information/phone'),
64
+ 'product_url' => Mage::app()->getStore()->getBaseUrl().$this->getProduct()->getRequestPath().$this->getProduct()->getUrlPath(),
65
+ 'message' => $sMessage,
66
+ 'sender_name' => $sSender['name'],
67
+ 'sender_email' => $sSender['email'],
68
+ 'product_image' => Mage::helper('catalog/image')->init($this->getProduct(),'small_image')->resize(75),
69
+ )
70
+ );
71
+ }
72
+
73
+ $oTranslate->setTranslateInline(true);
74
+ $this->_incrementSentCount();
75
+
76
+ return $this;
77
+ }
78
+
79
+ /**
80
+ * Additionally checks if the captcha is required for the form and if so, if it is valid
81
+ *
82
+ * @see Mage_Sendfriend_Model_Sendfriend::validate()
83
+ */
84
+ public function validate()
85
+ {
86
+ $aErrors = array();
87
+
88
+ $sName = $this->getSender()->getName();
89
+ if (empty($sName)) {
90
+ $aErrors[] = Mage::helper('sendfriend')->__('The sender name cannot be empty.');
91
+ }
92
+
93
+ $sEmail = $this->getSender()->getEmail();
94
+ if (empty($sEmail) OR !Zend_Validate::is($sEmail, 'EmailAddress')) {
95
+ $aErrors[] = Mage::helper('sendfriend')->__('Invalid sender email.');
96
+ }
97
+
98
+ if (!$this->getRecipients()->getEmails()) {
99
+ $aErrors[] = Mage::helper('sendfriend')->__('At least one recipient must be specified.');
100
+ }
101
+
102
+ // validate recipients email addresses
103
+ foreach ($this->getRecipients()->getEmails() as $sEmail) {
104
+ if (!Zend_Validate::is($sEmail, 'EmailAddress')) {
105
+ $aErrors[] = Mage::helper('sendfriend')->__('An invalid email address for recipient was entered.');
106
+ break;
107
+ }
108
+ }
109
+
110
+ // validate recipients name
111
+ foreach ($this->getRecipients()->getNames() as $sName) {
112
+ if (empty($sName)) {
113
+ $aErrors[] = Mage::helper('sendfriend')->__('At least one recipient must be specified.');
114
+ break;
115
+ }
116
+ }
117
+
118
+ $sProductName = $this->getProduct()->getName();
119
+ if(empty($sProductName)) {
120
+ $aErrors[] = Mage::helper('sendfriend')->__('The product name cannot be empty.');
121
+ }
122
+
123
+ $iMaxRecipients = $this->getMaxRecipients();
124
+ if (count($this->getRecipients()->getEmails()) > $iMaxRecipients) {
125
+ $aErrors[] = Mage::helper('sendfriend')->__('No more than %d emails can be sent at a time.', $this->getMaxRecipients());
126
+ }
127
+
128
+ $oCaptchaChecker = Mage::getModel('captcha/captchachecker');
129
+ $bCaptchaRequired = $oCaptchaChecker->isRequired(
130
+ Sitewards_Captcha_Block_Sendfriend_Send::CAPTCHA_BLOCK_ID,
131
+ Sitewards_Captcha_Block_Sendfriend_Send::XML_PATH_MAX_TILL_CAPTCHA_TIMES,
132
+ Sitewards_Captcha_Block_Sendfriend_Send::XML_PATH_MAX_TILL_CAPTCHA_TIMEFRAME_SECONDS
133
+ );
134
+
135
+ if ($bCaptchaRequired){
136
+ if (!$oCaptchaChecker->isValidCaptcha()){
137
+ $sErrorMessage = Mage::helper('captcha')->__('Incorrect Captcha Code');
138
+ if (!is_array($aErrors)){
139
+ $aErrors = array( $sErrorMessage );
140
+ } else {
141
+ $aErrors[] = $sErrorMessage;
142
+ }
143
+ }
144
+ }
145
+
146
+ if (empty($aErrors)) {
147
+ return true;
148
+ }
149
+
150
+ return $aErrors;
151
+ }
152
+
153
+ }
app/code/community/Sitewards/Captcha/controllers/ProductController.php ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Sitewards_Captcha_ProductController
4
+ * Override Mage_Sendfriend_ProductController action sendmailAction to work with the pop up and not the normal form
5
+ *
6
+ * @category Sitewards
7
+ * @package Sitewards_Captcha
8
+ * @copyright Copyright (c) 2013 Sitewards GmbH (http://www.sitewards.com/)
9
+ */
10
+ require_once 'Mage/Sendfriend/controllers/ProductController.php';
11
+ class Sitewards_Captcha_ProductController extends Mage_Sendfriend_ProductController {
12
+
13
+ /**
14
+ * Send Email Post Action and increase the counter for the captcha displaying feature
15
+ * Work with the javascript pop-up and not just the normal form
16
+ * redirects to the form if the form key is not valid or the fields validation failed.
17
+ * Otherwise sets body to "success" to reload the page and exit the popup
18
+ *
19
+ *
20
+ * @return void
21
+ */
22
+ public function sendmailAction() {
23
+ if (!$this->_validateFormKey()) {
24
+ return $this->_redirect('*/*/send', array('_current' => true));
25
+ }
26
+
27
+ /* @var $oProduct Mage_Catalog_Model_Product */
28
+ $oProduct = $this->_initProduct();
29
+ /* @var $oSendToFriendModel Mage_Sendfriend_Model_Sendfriend */
30
+ $oSendToFriendModel = $this->_initSendToFriendModel();
31
+ $aFormData = $this->getRequest()->getPost();
32
+
33
+ if (!$oProduct || !$aFormData) {
34
+ $this->_forward('noRoute');
35
+ return;
36
+ }
37
+
38
+ $iCategoryId = $this->getRequest()->getParam('cat_id', null);
39
+ if ($iCategoryId) {
40
+ /* @var $oCategory Mage_Catalog_Model_Category */
41
+ $oCategory = Mage::getModel('catalog/category')
42
+ ->load($iCategoryId);
43
+ $oProduct->setCategory($oCategory);
44
+ Mage::register('current_category', $oCategory);
45
+ }
46
+
47
+ $aSender = $this->getRequest()->getPost('sender');
48
+
49
+ $oSendToFriendModel->setSender($aSender);
50
+ $oSendToFriendModel->setRecipients($this->getRequest()->getPost('recipients'));
51
+ $oSendToFriendModel->setProduct($oProduct);
52
+
53
+ try {
54
+ $mValidate = $oSendToFriendModel->validate();
55
+ if ($mValidate === true) {
56
+ $oSendToFriendModel->send();
57
+ Mage::getSingleton('catalog/session')->addSuccess($this->__('The link to a friend was sent.'));
58
+
59
+ // increase counter for captcha limits
60
+ if (Mage::helper('captcha')->isSendFriendCaptchaRequired()) {
61
+ $oCaptchaChecker = Mage::getModel('captcha/captchachecker');
62
+ $oCaptchaChecker->incCounter(Sitewards_Captcha_Block_Sendfriend_Send::CAPTCHA_BLOCK_ID);
63
+ }
64
+
65
+ $this->_redirect('*/*/closepopup', array('id' => $oProduct->getId()));
66
+ return;
67
+ } else {
68
+ if (is_array($mValidate)) {
69
+ foreach ($mValidate as $sErrorMessage) {
70
+ Mage::getSingleton('catalog/session')->addError($sErrorMessage);
71
+ }
72
+ } else {
73
+ Mage::getSingleton('catalog/session')->addError($this->__('There were some problems with the data.'));
74
+ }
75
+ }
76
+ } catch (Mage_Core_Exception $oException) {
77
+ Mage::getSingleton('catalog/session')->addError($oException->getMessage());
78
+ } catch (Exception $oException) {
79
+ Mage::getSingleton('catalog/session')
80
+ ->addException($oException, $this->__('Some emails were not sent.'));
81
+ }
82
+
83
+ // save form data
84
+ Mage::getSingleton('catalog/session')->setSendfriendFormData($aFormData);
85
+
86
+ $this->_redirectError(Mage::getURL('*/*/send', array('_current' => true)));
87
+ }
88
+
89
+ /**
90
+ * Renders html page which contains javascript
91
+ * to close the popup and redirect to product page
92
+ */
93
+ public function closepopupAction() {
94
+ /* @var $oProduct Mage_Catalog_Model_Product */
95
+ $oProduct = $this->_initProduct();
96
+ $oBlock = $this->getLayout()->createBlock(
97
+ 'Mage_Core_Block_Template',
98
+ 'closepopup',
99
+ array('template' => 'sitewards/captcha/closepopup.phtml')
100
+ );
101
+ $oBlock->setRedirectUrl($oProduct->getProductUrl());
102
+ $this->getResponse()->setBody(
103
+ $oBlock->toHtml()
104
+ );
105
+ }
106
+ }
app/code/community/Sitewards/Captcha/etc/config.xml ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--
3
+ /**
4
+ * The main config file
5
+ *
6
+ * @category Sitewards
7
+ * @package Sitewards_Captcha
8
+ * @copyright Copyright (c) 2013 Sitewards GmbH (http://www.sitewards.com/)
9
+ */
10
+ -->
11
+ <config>
12
+ <modules>
13
+ <Sitewards_Captcha>
14
+ <version>1.0.0</version>
15
+ </Sitewards_Captcha>
16
+ </modules>
17
+ <global>
18
+ <blocks>
19
+ <sendfriend>
20
+ <rewrite>
21
+ <send>Sitewards_Captcha_Block_Sendfriend_Send</send>
22
+ </rewrite>
23
+ </sendfriend>
24
+ <sitewards_captcha>
25
+ <class>Sitewards_Captcha_Block</class>
26
+ </sitewards_captcha>
27
+ </blocks>
28
+ <helpers>
29
+ <captcha>
30
+ <rewrite>
31
+ <data>Sitewards_Captcha_Helper_Data</data>
32
+ </rewrite>
33
+ </captcha>
34
+ </helpers>
35
+ <models>
36
+ <captcha>
37
+ <rewrite>
38
+ <captchachecker>Sitewards_Captcha_Model_CaptchaChecker</captchachecker>
39
+ </rewrite>
40
+ </captcha>
41
+ <sendfriend>
42
+ <rewrite>
43
+ <sendfriend>Sitewards_Captcha_Model_Sendfriend</sendfriend>
44
+ </rewrite>
45
+ </sendfriend>
46
+ </models>
47
+ </global>
48
+ <frontend>
49
+ <layout>
50
+ <updates>
51
+ <sitewards_productemail>
52
+ <file>sitewards/captcha.xml</file>
53
+ </sitewards_productemail>
54
+ </updates>
55
+ </layout>
56
+ <routers>
57
+ <sendfriend>
58
+ <args>
59
+ <modules>
60
+ <Sitewards_Captcha before="Mage_Sendfriend">Sitewards_Captcha</Sitewards_Captcha>
61
+ </modules>
62
+ </args>
63
+ </sendfriend>
64
+ </routers>
65
+ <translate>
66
+ <modules>
67
+ <Sitewards_Captcha>
68
+ <files>
69
+ <default>Sitewards_Captcha.csv</default>
70
+ </files>
71
+ </Sitewards_Captcha>
72
+ </modules>
73
+ </translate>
74
+ </frontend>
75
+ <default>
76
+ <sendfriend>
77
+ <email>
78
+ <enabled>1</enabled>
79
+ <template>sendfriend_email_template</template>
80
+ <allow_guest>1</allow_guest>
81
+ <max_recipients>5</max_recipients>
82
+ <max_per_hour>999</max_per_hour>
83
+ <check_by>0</check_by>
84
+ </email>
85
+ </sendfriend>
86
+ <customer>
87
+ <captcha>
88
+ <always_for>
89
+ <product_sendtofriend_form_captcha>1</product_sendtofriend_form_captcha>
90
+ </always_for>
91
+ <max_till_captcha_times>3</max_till_captcha_times>
92
+ <max_till_captcha_timeframe_seconds>3600</max_till_captcha_timeframe_seconds>
93
+ </captcha>
94
+ </customer>
95
+ <captcha translate="label">
96
+ <frontend>
97
+ <areas>
98
+ <product_sendtofriend_form_captcha>
99
+ <label>Email to a Friend</label>
100
+ </product_sendtofriend_form_captcha>
101
+ </areas>
102
+ </frontend>
103
+ </captcha>
104
+ </default>
105
+ </config>
app/code/community/Sitewards/Captcha/etc/system.xml ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ *
5
+ * @category Sitewards
6
+ * @package Sitewards_Captcha
7
+ * @copyright Copyright (c) 2013 Sitewards GmbH (http://www.sitewards.com/)
8
+ */
9
+ -->
10
+ <config>
11
+ <sections>
12
+ <customer>
13
+ <groups>
14
+ <captcha>
15
+ <fields>
16
+ <heading_3dsecure translate="label">
17
+ <label>Email to a Friend</label>
18
+ <frontend_model>adminhtml/system_config_form_field_heading</frontend_model>
19
+ <sort_order>120</sort_order>
20
+ <show_in_default>1</show_in_default>
21
+ <show_in_website>1</show_in_website>
22
+ <depends><enable>1</enable></depends>
23
+ </heading_3dsecure>
24
+ <max_till_captcha_times translate="label">
25
+ <label>Number of emails without captcha</label>
26
+ <frontend_type>text</frontend_type>
27
+ <sort_order>130</sort_order>
28
+ <show_in_default>1</show_in_default>
29
+ <show_in_website>1</show_in_website>
30
+ <show_in_store>0</show_in_store>
31
+ <depends><enable>1</enable></depends>
32
+ <frontend_class>required-entry validate-digits</frontend_class>
33
+ </max_till_captcha_times >
34
+ <max_till_captcha_timeframe_seconds translate="label">
35
+ <label>CAPTCHA Timeout (seconds)</label>
36
+ <frontend_type>text</frontend_type>
37
+ <sort_order>140</sort_order>
38
+ <show_in_default>1</show_in_default>
39
+ <show_in_website>1</show_in_website>
40
+ <show_in_store>0</show_in_store>
41
+ <depends><enable>1</enable></depends>
42
+ <frontend_class>required-entry validate-digits</frontend_class>
43
+ </max_till_captcha_timeframe_seconds>
44
+ </fields>
45
+ </captcha>
46
+ </groups>
47
+ </customer>
48
+ </sections>
49
+ </config>
50
+
51
+
app/design/frontend/base/default/layout/sitewards/captcha.xml ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--
3
+ /**
4
+ * sitewards/captcha.xml
5
+ * Layout file for the Sitewards Captcha module
6
+ *
7
+ * @category Sitewards
8
+ * @package Sitewards_Captcha
9
+ * @copyright Copyright (c) 2013 Sitewards GmbH (http://www.sitewards.com/)
10
+ */
11
+ -->
12
+ <layout>
13
+ <sendfriend_product_send>
14
+ <reference name="root">
15
+ <action method="setTemplate"><template>page/popup.phtml</template></action>
16
+ </reference>
17
+ <reference name="sendfriend.send">
18
+ <action method="setTemplate"><template>sitewards/captcha/sendfriend/send.phtml</template></action>
19
+ </reference>
20
+ <block type="captcha/captcha" name="captcha.sendtofriend">
21
+ <reference name="head">
22
+ <action method="addJs"><file>mage/captcha.js</file></action>
23
+ </reference>
24
+ <action method="setFormId"><formId>product_sendtofriend_form_captcha</formId></action>
25
+ </block>
26
+ </sendfriend_product_send>
27
+ <sendfriend_product_closepopup>
28
+ <block type="page/html" name="root" template="sitewards/captcha/closepopup.phtml"></block>
29
+ </sendfriend_product_closepopup>
30
+ <catalog_product_view>
31
+ <reference name="head">
32
+ <action method="addItem"><type>js</type><name>prototype/window.js</name></action>
33
+ <action method="addItem"><type>js_css</type><name>prototype/windows/themes/default.css</name></action>
34
+ <action method="addCss"><name>lib/prototype/windows/themes/magento.css</name></action>
35
+ <action method="addItem"><type>js</type><name>sitewards/captcha.js</name></action>
36
+ </reference>
37
+ </catalog_product_view>
38
+ </layout>
app/design/frontend/base/default/template/sitewards/captcha/closepopup.phtml ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Close popup window and redirect to product page
4
+ *
5
+ * @category Sitewards
6
+ * @package Sitewards_Captcha
7
+ * @copyright Copyright (c) 2013 Sitewards GmbH (http://www.sitewards.com/)
8
+ */
9
+ /* @var $this Mage_Core_Block_Template */
10
+ ?>
11
+ <script type="text/javascript">
12
+ // <![CDATA[
13
+ this.parent.closePopup();
14
+ window.parent.location.href = '<?php echo $this->getRedirectUrl()?>';
15
+ // ]]>
16
+ </script>
app/design/frontend/base/default/template/sitewards/captcha/sendfriend/send.phtml ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Send to friend form
4
+ *
5
+ * @see Mage_Sendfriend_Block_Send
6
+ *
7
+ * @category Sitewards
8
+ * @package Sitewards_Captcha
9
+ * @copyright Copyright (c) 2013 Sitewards GmbH (http://www.sitewards.com/)
10
+ */
11
+ /* @var $this Mage_Sendfriend_Block_Send */
12
+ ?>
13
+ <script type="text/javascript">
14
+ //<![CDATA[
15
+ i=0;
16
+ var recipCount = 1;
17
+ var maxRecip = <?php echo $this->getMaxRecipients() ?>;
18
+ function remove_recipient(i){
19
+ $('recipients_name'+i).up(2).remove();
20
+ recipCount--;
21
+ if(recipCount<maxRecip && maxRecip != 0) {
22
+ $('add_recipient_button').show();
23
+ $('max_recipient_message').hide();
24
+ }
25
+ return false;
26
+ }
27
+
28
+ function add_recipient(){
29
+ ul = $('recipients_options');
30
+ var li_mail = Element.extend(document.createElement("LI"));
31
+ li_mail.addClassName('fields additional-row');
32
+ li_mail.innerHTML = '<p><a href="delete_email" title="<?php echo $this->__('Remove Email') ?>" onclick="remove_recipient('+i+'); return false" class="btn-remove"><?php echo $this->__('Remove Email') ?>"<\/a><\/p>'
33
+ li_mail.innerHTML += '<div class="field"><label for="recipients_name'+i+'" class="required"><em>*<\/em><?php echo $this->__('Name:') ?><\/label><div class="input-box"><input name="recipients[name][]" type="text" class="input-text required-entry" id="recipients_name'+i+'" /><\/div>';
34
+ li_mail.innerHTML += '<div class="field"><label for="recipients_email'+i+'" class="required"><em>*<\/em><?php echo $this->__('Email Address:') ?><\/label><div class="input-box"><input name="recipients[email][]" value="" title="<?php echo $this->__('Email Address') ?>" id="recipients_email'+i+'" type="text" class="input-text required-entry validate-email" /><\/div><\/div>';
35
+ i++;
36
+ recipCount++;
37
+ if(recipCount>=maxRecip && maxRecip != 0) {
38
+ $('add_recipient_button').hide();
39
+ $('max_recipient_message').show();
40
+ }
41
+
42
+ ul.appendChild(li_mail);
43
+ }
44
+ //]]>
45
+ </script>
46
+
47
+ <div class="send-friend">
48
+ <?php echo $this->getMessagesBlock()->getGroupedHtml() ?>
49
+ <div class="page-title">
50
+ <h1><?php echo $this->__('Email to a Friend') ?></h1>
51
+ </div>
52
+ <form action="<?php echo $this->getSendUrl() ?>" method="post" id="product_sendtofriend_form">
53
+ <div class="fieldset">
54
+ <?php echo $this->getBlockHtml('formkey')?>
55
+ <h2 class="legend"><?php echo $this->__('Sender:') ?></h2>
56
+ <ul class="form-list" id="sender_options">
57
+ <li class="fields">
58
+ <div class="field">
59
+ <label for="sender_name" class="required"><em>*</em><?php echo $this->__('Name:') ?></label>
60
+ <div class="input-box">
61
+ <input name="sender[name]" value="<?php echo $this->htmlEscape($this->getUserName()) ?>" title="<?php echo $this->__('Name') ?>" id="sender_name" type="text" class="input-text required-entry" />
62
+ </div>
63
+ </div>
64
+ <div class="field">
65
+ <label for="sender_email" class="required"><em>*</em><?php echo $this->__('Email:') ?></label>
66
+ <div class="input-box">
67
+ <input name="sender[email]" value="<?php echo $this->htmlEscape($this->getEmail()) ?>" title="<?php echo $this->__('Email Address') ?>" id="sender_email" type="text" class="input-text required-entry validate-email" />
68
+ </div>
69
+ </div>
70
+ </li>
71
+ <li>
72
+ <label for="sender_product_name" class="required"><em>*</em><?php echo $this->__('Product Name:') ?></label>
73
+ <div class="input-box">
74
+ <input name="sender[product_name]" value="<?php echo $this->htmlEscape($this->getProductName()) ?>" title="<?php echo $this->__('Product Name') ?>" id="sender_product_name" type="text" class="input-text required-entry" />
75
+ </div>
76
+ </li>
77
+ <li class="wide">
78
+ <label for="sender_message" class="required"><?php echo $this->__('Message:') ?></label>
79
+ <div class="input-box">
80
+ <textarea name="sender[message]" class="input-text" id="sender_message" cols="3" rows="3"><?php echo $this->htmlEscape($this->getMessage())?></textarea>
81
+ </div>
82
+ </li>
83
+ </ul>
84
+ </div>
85
+ <div class="fieldset">
86
+ <h2 class="legend"><?php echo $this->__('Recipient:') ?></h2>
87
+ <ul class="form-list" id="recipients_options">
88
+ <li class="fields">
89
+ <div class="field">
90
+ <label for="recipients_name" class="required"><em>*</em><?php echo $this->__('Name:') ?></label>
91
+ <div class="input-box">
92
+ <input name="recipients[name][]" type="text" class="input-text required-entry" id="recipients_name" />
93
+ </div>
94
+ </div>
95
+ <div class="field">
96
+ <label for="recipients_email" class="required"><em>*</em><?php echo $this->__('Email Address:') ?></label>
97
+ <div class="input-box">
98
+ <input name="recipients[email][]" value="" title="<?php echo $this->__('Email Address') ?>" id="recipients_email" type="text" class="input-text required-entry validate-email" />
99
+ </div>
100
+ </div>
101
+ </li>
102
+ </ul>
103
+ </div>
104
+ <?php if ($this->isCaptchaRequired()):?>
105
+ <div class="fieldset">
106
+ <h2 class="legend"><?php echo $this->__('Captcha:') ?></h2>
107
+ <ul class="form-list" id="recipients_options">
108
+ <?php
109
+ $oCaptchaBlock = Mage::getBlockSingleton('captcha/captcha')
110
+ ->setFormId('product_sendtofriend_form_captcha')
111
+ ->setShowCaptcha(true);
112
+ echo $oCaptchaBlock->toHtml();
113
+ ?>
114
+ </ul>
115
+ </div>
116
+ <?php endif;?>
117
+ <div class="buttons-set">
118
+ <button type="submit" class="button<?php if (!$this->canSend()):?> disabled<?php endif ?>"<?php if (!$this->canSend()):?> disabled="disabled"<?php endif ?>><span><span><?php echo $this->__('Send Email') ?></span></span></button>
119
+ <div id="max_recipient_message" style="display:none;">
120
+ <?php if ($this->getMaxRecipients()): ?>
121
+ <p class="limit"><?php echo $this->__('Maximum %d email addresses allowed.', $this->getMaxRecipients()) ?></p>
122
+ <?php endif; ?>
123
+ </div>
124
+ <?php if (1 < $this->getMaxRecipients()): ?>
125
+ <p id="add_recipient_button">
126
+ <button type="button" onclick="add_recipient();" class="button"><span><span><?php echo $this->__('Add Recipient') ?></span></span></button>
127
+ </p>
128
+ <?php endif; ?>
129
+ </div>
130
+ </form>
131
+ <script type="text/javascript">
132
+ //<![CDATA[
133
+ var productSendtofriendForm = new VarienForm('product_sendtofriend_form');
134
+ productSendtofriendForm.submit = function() {
135
+ if(this.validator.validate()) {
136
+ this.form.submit();
137
+ }
138
+ }.bind(productSendtofriendForm);
139
+ //]]>
140
+ </script>
141
+ </div>
app/etc/modules/Sitewards_Captcha.xml ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--
3
+ /**
4
+ * Sitewards_Captcha.xml
5
+ * - Activate module,
6
+ * - Specify code pool,
7
+ * - Set-up dependencies
8
+ *
9
+ * @category Sitewards
10
+ * @package Sitewards_Captcha
11
+ * @copyright Copyright (c) 2013 Sitewards GmbH (http://www.sitewards.com/de/)
12
+ */
13
+ -->
14
+ <config>
15
+ <modules>
16
+ <Sitewards_Captcha>
17
+ <active>true</active>
18
+ <codePool>community</codePool>
19
+ <depends>
20
+ <Mage_Catalog />
21
+ <Mage_Sendfriend />
22
+ <Mage_Captcha />
23
+ </depends>
24
+ </Sitewards_Captcha>
25
+ </modules>
26
+ </config>
app/locale/de_DE/Sitewards_Captcha.csv ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "Add Recipient","Empfänger hinzufügen"
2
+ "Allow for Guests","Für Gäste erlauben"
3
+ "Mage_Sendfriend::An invalid email address for recipient was entered.","Sie haben eine ungültige Empfänger E-Mail-Adresse eingegeben."
4
+ "At least one recipient must be specified.","Es muss mindestens ein Empfänger eingetragen werden."
5
+ "Back","Zurück"
6
+ "Catalog Product Email to a Friend","Produkt aus dem Katalog per E-Mail an einen Freund senden"
7
+ "Email Address","E-Mail-Adresse"
8
+ "Email Address:","E-Mail-Adresse:"
9
+ "Email Templates","E-Mail Vorlagen"
10
+ "Email to a Friend","Diesen Artikel per E-Mail empfehlen"
11
+ "Email:","E-Mail:"
12
+ "Enabled","Aktiviert"
13
+ "Invalid Sender Information","Ungültiger Absender"
14
+ "Mage_Sendfriend::Invalid sender email.","Sie haben eine ungültige Absender E-Mail-Adresse eingegeben."
15
+ "Limit Sending By","Senden einschränken auf"
16
+ "Max Products Sent in 1 Hour","Maximale Anzahl in einer Stunde gesendeter Produkte"
17
+ "Max Recipients","Maximale Empfängeranzahl"
18
+ "Maximum %d email addresses allowed.","Maximal %d E-Mail-Adressen erlaubt."
19
+ "Message:","Nachricht:"
20
+ "Name","Name"
21
+ "Name:","Name:"
22
+ "No more than %d emails can be sent at a time.","Es können nicht mehr als %d E-Mails auf einmal versendet werden."
23
+ "Please define a correct Cookie instance.","Legen Sie bitte eine korrekte Cookie-Instanz fest."
24
+ "Please define a correct Product instance.","Legen Sie bitte eine korrekte Produkt-Instanz fest."
25
+ "Please define the correct Sender information.","Bitte legen Sie korrekte Senderinformationen fest."
26
+ "Recipient:","Empfänger:"
27
+ "Remove Email","E-Mail löschen"
28
+ "Select Email Template","E-Mail-Vorlage wählen"
29
+ "Send Email","E-Mail senden"
30
+ "Send product to a friend","Dieses Produkt an einen Freund senden"
31
+ "Sender:","Absender:"
32
+ "Some emails were not sent.","Einige E-Mail wurden nicht gesendet."
33
+ "The link to a friend was sent.","Vielen Dank. Ihre Empfehlung wurde versendet."
34
+ "The message cannot be empty."," Sie haben keine Nachricht eingegeben."
35
+ "The messages cannot be sent more than %d times in an hour","Die Nachrichten können nicht öfter als %d mal pro Stunde gesendet werden"
36
+ "Mage_Sendfriend::The sender name cannot be empty."," Sie haben keinen Absender-Namen eingegeben."
37
+ "The product name cannot be empty.","Bitte geben Sie den Produktnamen an."
38
+ "There were some problems with the data.","Es traten Probleme mit den Daten auf."
39
+ "You have exceeded limit of %d sends in an hour","Sie haben das Limit von %d Nachrichten pro Stunde überschritten"
40
+ "Product Name:","Produktbezeichnung:"
41
+ "Message to the recipient:","Nachricht an den Empfänger:"
js/sitewards/captcha.js ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Show prototype popup window
3
+ *
4
+ * @param string sUrl
5
+ */
6
+ function showPopup(sUrl) {
7
+ oPopup = new Window({
8
+ id:'popup_window',
9
+ className: 'magento',
10
+ url: sUrl,
11
+ width: 820,
12
+ height: 600,
13
+ minimizable: false,
14
+ maximizable: false,
15
+ showEffectOptions: {
16
+ duration: 0.4
17
+ },
18
+ hideEffectOptions:{
19
+ duration: 0.4
20
+ },
21
+ destroyOnClose: true
22
+ });
23
+ oPopup.setZIndex(100);
24
+ oPopup.showCenter(true);
25
+ }
26
+
27
+ /**
28
+ * Close popup window
29
+ */
30
+ function closePopup() {
31
+ Windows.close('popup_window');
32
+ }
33
+
34
+ document.observe("dom:loaded", function() {
35
+ $$('p.email-friend a')[0].observe('click', function(oEvent) {
36
+ showPopup($(this).readAttribute('href'));
37
+ Event.stop(oEvent);
38
+ });
39
+ });
40
+
41
+
package.xml ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <package>
3
+ <name>Sitewards_Captcha</name>
4
+ <version>1.0.0</version>
5
+ <stability>stable</stability>
6
+ <license uri="http://www.opensource.org/licenses/gpl-license.php">GPL</license>
7
+ <channel>community</channel>
8
+ <extends/>
9
+ <summary>Additional functionality for magento captcha extension.</summary>
10
+ <description>Installation instruction&#xD;
11
+ ------------------------&#xD;
12
+ &#xD;
13
+ 1. Install the extension&#xD;
14
+ 2. Go to System -&gt; Configuration -&gt; Customers -&gt; Customer Configuration-&gt;Captcha and select "Email to a Friend" option in Forms field.</description>
15
+ <notes>Released new extension.</notes>
16
+ <authors><author><name>Sitewards Magento Team</name><user>sitewards</user><email>magento@sitewards.com</email></author></authors>
17
+ <date>2013-09-18</date>
18
+ <time>04:00:04</time>
19
+ <contents><target name="magecommunity"><dir name="Sitewards"><dir name="Captcha"><dir name="Block"><dir name="Sendfriend"><file name="Send.php" hash="8875265013ec45ffcfe92be6ad2326da"/></dir></dir><dir name="Helper"><file name="Data.php" hash="a268ddaabc47fcbc323e759c873ae869"/></dir><dir name="Model"><file name="CaptchaChecker.php" hash="c6b275af326acd6f2fb95adceb1a23f1"/><file name="Sendfriend.php" hash="5c56a12b97585752cc04ea42c6207540"/></dir><dir name="controllers"><file name="ProductController.php" hash="164a0aa604fd92e30a49ce27a73424ec"/></dir><dir name="etc"><file name="config.xml" hash="fde3ce84e888c2b3fc049a4a59f78b3f"/><file name="system.xml" hash="b84ba97ea80312adb7f38c2187670aa5"/></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Sitewards_Captcha.xml" hash="abf4c910ece09269ce5d7fc73c3121a7"/></dir></target><target name="magelocale"><dir name="de_DE"><file name="Sitewards_Captcha.csv" hash="f76b6cded4bd7c78de96685e5cac0519"/></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="template"><dir name="sitewards"><dir name="captcha"><file name="closepopup.phtml" hash="6e963b95e4d7d568b190414fa0c514f6"/><dir name="sendfriend"><file name="send.phtml" hash="a92861c8a260e03a7712ee375be4ffb2"/></dir></dir></dir></dir><dir name="layout"><dir name="sitewards"><file name="captcha.xml" hash="d28bec040715e0de93f469a0b2e16057"/></dir></dir></dir></dir></dir></target><target name="mageweb"><dir name="js"><dir name="sitewards"><file name="captcha.js" hash="9662f0c2a5ff7f3eb898df7dd6df39a4"/></dir></dir></target></contents>
20
+ <compatible/>
21
+ <dependencies><required><php><min>5.3.0</min><max>6.0.0</max></php></required></dependencies>
22
+ </package>