mirror of
https://git.d3data.de/3rdParty/captcha-module.git
synced 2024-11-21 06:03:11 +01:00
ESDEV-2769 Extract capcha functionality into contrib module
Extract code into module. Add tests.
This commit is contained in:
parent
2a1313850f
commit
7a4ae598f6
@ -1,3 +1,3 @@
|
||||
captcha_module
|
||||
|
||||
Contrib module contaning captcha logic.
|
||||
Contrib module containing captcha logic.
|
||||
|
44
controllers/oecaptchacontact.php
Normal file
44
controllers/oecaptchacontact.php
Normal file
@ -0,0 +1,44 @@
|
||||
<?php
|
||||
/**
|
||||
* #PHPHEADER_OECAPTCHA_LICENSE_INFORMATION#
|
||||
*/
|
||||
|
||||
class oeCaptchaContact extends oeCaptchaContact_parent
|
||||
{
|
||||
/**
|
||||
* Class handling CAPTCHA image.
|
||||
*
|
||||
* @var object
|
||||
*/
|
||||
protected $captcha = null;
|
||||
|
||||
/**
|
||||
* Composes and sends user written message, returns false if some parameters
|
||||
* are missing.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function send()
|
||||
{
|
||||
if (!$this->getCaptcha()->passCaptcha()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return parent::send();
|
||||
}
|
||||
|
||||
/**
|
||||
* Template variable getter. Returns object of handling CAPTCHA image
|
||||
*
|
||||
* @return object
|
||||
*/
|
||||
public function getCaptcha()
|
||||
{
|
||||
if ($this->captcha === null) {
|
||||
$this->captcha = oxNew('oeCaptcha');
|
||||
}
|
||||
|
||||
return $this->captcha;
|
||||
}
|
||||
|
||||
}
|
52
controllers/oecaptchadetails.php
Normal file
52
controllers/oecaptchadetails.php
Normal file
@ -0,0 +1,52 @@
|
||||
<?php
|
||||
/**
|
||||
* #PHPHEADER_OECAPTCHA_LICENSE_INFORMATION#
|
||||
*/
|
||||
|
||||
/**
|
||||
* Class oeCaptchaDetails.
|
||||
* Extends Details.
|
||||
*
|
||||
* @see Details
|
||||
*/
|
||||
class oeCaptchaDetails extends oeCaptchaDetails_parent
|
||||
{
|
||||
/**
|
||||
* Class handling CAPTCHA image.
|
||||
*
|
||||
* @var object
|
||||
*/
|
||||
protected $captcha = null;
|
||||
|
||||
/**
|
||||
* Validates email
|
||||
* address. If email is wrong - returns false and exits. If email
|
||||
* address is OK - creates price alarm object and saves it
|
||||
* (oxpricealarm::save()). Sends price alarm notification mail
|
||||
* to shop owner.
|
||||
*
|
||||
* @return bool false on error
|
||||
*/
|
||||
public function addme()
|
||||
{
|
||||
if (!$this->getCaptcha()->passCaptcha(false)) {
|
||||
$this->_iPriceAlarmStatus = 2;
|
||||
return;
|
||||
}
|
||||
|
||||
return parent::addme();
|
||||
}
|
||||
|
||||
/**
|
||||
* Template variable getter. Returns object of handling CAPTCHA image
|
||||
*
|
||||
* @return object
|
||||
*/
|
||||
public function getCaptcha()
|
||||
{
|
||||
if ($this->captcha === null) {
|
||||
$this->captcha = oxNew('oeCaptcha');
|
||||
}
|
||||
return $this->captcha;
|
||||
}
|
||||
}
|
49
controllers/oecaptchainvite.php
Normal file
49
controllers/oecaptchainvite.php
Normal file
@ -0,0 +1,49 @@
|
||||
<?php
|
||||
/**
|
||||
* #PHPHEADER_OECAPTCHA_LICENSE_INFORMATION#
|
||||
*/
|
||||
|
||||
/**
|
||||
* Article suggestion page.
|
||||
* Collects some article base information, sets default recommendation text,
|
||||
* sends suggestion mail to user.
|
||||
*/
|
||||
class oeCaptchaInvite extends oeCaptchaInvite_parent
|
||||
{
|
||||
/**
|
||||
* Class handling CAPTCHA image.
|
||||
*
|
||||
* @var object
|
||||
*/
|
||||
protected $captcha = null;
|
||||
|
||||
/**
|
||||
* Sends product suggestion mail and returns a URL according to
|
||||
* URL formatting rules.
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
public function send()
|
||||
{
|
||||
if (!$this->getCaptcha()->passCaptcha()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return parent::send();
|
||||
}
|
||||
|
||||
/**
|
||||
* Template variable getter. Returns object of handling CAPTCHA image
|
||||
*
|
||||
* @return object
|
||||
*/
|
||||
public function getCaptcha()
|
||||
{
|
||||
if ($this->captcha === null) {
|
||||
$this->captcha = oxNew('oeCaptcha');
|
||||
}
|
||||
|
||||
return $this->captcha;
|
||||
}
|
||||
|
||||
}
|
37
controllers/oecaptchapricealarm.php
Normal file
37
controllers/oecaptchapricealarm.php
Normal file
@ -0,0 +1,37 @@
|
||||
<?php
|
||||
/**
|
||||
* #PHPHEADER_OECAPTCHA_LICENSE_INFORMATION#
|
||||
*/
|
||||
|
||||
/**
|
||||
* Pricealarm window.
|
||||
* Arranges "pricealarm" window, by sending eMail and storing into Database (etc.)
|
||||
* submission. Result - "pricealarm.tpl" template. After user correctly
|
||||
* fulfils all required fields all information is sent to shop owner by
|
||||
* email.
|
||||
* OXID eShop -> pricealarm.
|
||||
*/
|
||||
class oeCaptchaPricealarm extends oeCaptchaPricealarm_parent
|
||||
{
|
||||
/**
|
||||
* Validates email
|
||||
* address. If email is wrong - returns false and exits. If email
|
||||
* address is OK - creates prcealarm object and saves it
|
||||
* (oxpricealarm::save()). Sends pricealarm notification mail
|
||||
* to shop owner.
|
||||
*
|
||||
* @return bool false on error
|
||||
*/
|
||||
public function addme()
|
||||
{
|
||||
//control captcha
|
||||
$captcha = oxNew('oeCaptcha');
|
||||
if (!$captcha->passCaptcha(false)) {
|
||||
$this->_iPriceAlarmStatus = 2;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
return parent::addme();
|
||||
}
|
||||
}
|
52
controllers/oecaptchasuggest.php
Normal file
52
controllers/oecaptchasuggest.php
Normal file
@ -0,0 +1,52 @@
|
||||
<?php
|
||||
/**
|
||||
* #PHPHEADER_OECAPTCHA_LICENSE_INFORMATION#
|
||||
*/
|
||||
|
||||
/**
|
||||
* Article suggestion page.
|
||||
* Collects some article base information, sets default recomendation text,
|
||||
* sends suggestion mail to user.
|
||||
*/
|
||||
class oeCaptchaSuggest extends oeCaptchaSuggest_parent
|
||||
{
|
||||
/**
|
||||
* Class handling CAPTCHA image.
|
||||
*
|
||||
* @var object
|
||||
*/
|
||||
protected $captcha = null;
|
||||
|
||||
/**
|
||||
* Sends product suggestion mail and returns a URL according to
|
||||
* URL formatting rules.
|
||||
*
|
||||
* Template variables:
|
||||
* <b>editval</b>, <b>error</b>
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
public function send()
|
||||
{
|
||||
// spam spider prevension
|
||||
if (!$this->getCaptcha()->passCaptcha()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return parent::send();
|
||||
}
|
||||
|
||||
/**
|
||||
* Template variable getter. Returns object of handling CAPTCHA image
|
||||
*
|
||||
* @return object
|
||||
*/
|
||||
public function getCaptcha()
|
||||
{
|
||||
if ($this->captcha === null) {
|
||||
$this->captcha = oxNew('oeCaptcha');
|
||||
}
|
||||
|
||||
return $this->captcha;
|
||||
}
|
||||
}
|
234
core/oecaptcha.php
Normal file
234
core/oecaptcha.php
Normal file
@ -0,0 +1,234 @@
|
||||
<?php
|
||||
/**
|
||||
* #PHPHEADER_OECAPTCHA_LICENSE_INFORMATION#
|
||||
*/
|
||||
|
||||
/**
|
||||
* Class handling CAPTCHA image
|
||||
* This class requires utility file utils/verificationimg.php as image generator
|
||||
*
|
||||
*/
|
||||
class oeCaptcha extends oxSuperCfg
|
||||
{
|
||||
/**
|
||||
* CAPTCHA length
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
protected $macLength = 5;
|
||||
|
||||
/**
|
||||
* Captcha text
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $text = null;
|
||||
|
||||
/**
|
||||
* Possible CAPTCHA chars, no ambiguities
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $macChars = 'abcdefghijkmnpqrstuvwxyz23456789';
|
||||
|
||||
/**
|
||||
* Captcha timeout 60 * 5 = 5 minutes
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
protected $timeout = 300;
|
||||
|
||||
/**
|
||||
* Returns text
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getText()
|
||||
{
|
||||
if (!$this->text) {
|
||||
$this->text = '';
|
||||
for ($i = 0; $i < $this->macLength; $i++) {
|
||||
$this->text .= strtolower($this->macChars{rand(0, strlen($this->macChars) - 1)});
|
||||
}
|
||||
}
|
||||
|
||||
return $this->text;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns text hash
|
||||
*
|
||||
* @param string $text User supplie text
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getHash($text = null)
|
||||
{
|
||||
// inserting captcha record
|
||||
$time = time() + $this->timeout;
|
||||
$textHash = $this->getTextHash($text);
|
||||
|
||||
// if session is started - storing captcha info here
|
||||
$session = $this->getSession();
|
||||
if ($session->isSessionStarted()) {
|
||||
$hash = oxUtilsObject::getInstance()->generateUID();
|
||||
$hashArray = $session->getVariable('captchaHashes');
|
||||
$hashArray[$hash] = array($textHash => $time);
|
||||
$session->setVariable('captchaHashes', $hashArray);
|
||||
} else {
|
||||
$database = oxDb::getDb();
|
||||
$query = "insert into oecaptcha (oxhash, oxtime) values (" .
|
||||
$database->quote($textHash) . ", " . $database->quote($time) . ")";
|
||||
$database->execute($query);
|
||||
$hash = $database->getOne('select LAST_INSERT_ID()', false, false);
|
||||
}
|
||||
|
||||
return $hash;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns given string captcha hash
|
||||
*
|
||||
* @param string $text string to hash
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getTextHash($text)
|
||||
{
|
||||
if (!$text) {
|
||||
$text = $this->getText();
|
||||
}
|
||||
$text = strtolower($text);
|
||||
|
||||
return md5('ox' . $text);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns url to CAPTCHA image generator.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getImageUrl()
|
||||
{
|
||||
$url = $this->getConfig()->getCurrentShopUrl() . 'modules/oe/captcha/core/utils/verificationimg.php?e_mac=';
|
||||
$key = $this->getConfig()->getConfigParam('oecaptchakey');
|
||||
$key = empty($key) ? null : $key;
|
||||
$url .= oxRegistry::getUtils()->strMan($this->getText(), $key);
|
||||
|
||||
return $url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if image could be generated
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isImageVisible()
|
||||
{
|
||||
return ((function_exists('imagecreatetruecolor') || function_exists('imagecreate')) && $this->getConfig()->getConfigParam('iUseGDVersion') > 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if captcha is passed.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function passCaptcha($displayError = true)
|
||||
{
|
||||
$return = true;
|
||||
|
||||
// spam spider prevention
|
||||
$mac = $this->getConfig()->getRequestParameter('c_mac');
|
||||
$macHash = $this->getConfig()->getRequestParameter('c_mach');
|
||||
|
||||
if (!$this->pass($mac, $macHash)) {
|
||||
$return = false;
|
||||
}
|
||||
|
||||
if (!$return && $displayError) {
|
||||
// even if there is no exception, use this as a default display method
|
||||
oxRegistry::get('oxUtilsView')->addErrorToDisplay('MESSAGE_WRONG_VERIFICATION_CODE');
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies captcha input vs supplied hash. Returns true on success.
|
||||
*
|
||||
* @param string $mac User supplied text
|
||||
* @param string $macHash Generated hash
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function pass($mac, $macHash)
|
||||
{
|
||||
$time = time();
|
||||
$hash = $this->getTextHash($mac);
|
||||
$pass = $this->passFromSession($macHash, $hash, $time);
|
||||
|
||||
// if captcha info was NOT stored in session
|
||||
if ($pass === null) {
|
||||
$pass = $this->passFromDb((int) $macHash, $hash, $time);
|
||||
}
|
||||
|
||||
return (bool) $pass;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks for session captcha hash validity
|
||||
*
|
||||
* @param string $macHash hash key
|
||||
* @param string $hash captcha hash
|
||||
* @param int $time check time
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function passFromSession($macHash, $hash, $time)
|
||||
{
|
||||
$pass = null;
|
||||
$session = $this->getSession();
|
||||
|
||||
if (($hashArray = $session->getVariable('captchaHashes'))) {
|
||||
$pass = (isset($hashArray[$macHash][$hash]) && $hashArray[$macHash][$hash] >= $time) ? true : false;
|
||||
unset($hashArray[$macHash]);
|
||||
if (!empty($hashArray)) {
|
||||
$session->setVariable('captchaHashes', $hashArray);
|
||||
} else {
|
||||
$session->deleteVariable('captchaHashes');
|
||||
}
|
||||
}
|
||||
|
||||
return $pass;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks for DB captcha hash validity
|
||||
*
|
||||
* @param int $macHash hash key
|
||||
* @param string $hash captcha hash
|
||||
* @param int $time check time
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function passFromDb($macHash, $hash, $time)
|
||||
{
|
||||
$database = oxDb::getDb();
|
||||
$where = "where oxid = " . $database->quote($macHash) . " and oxhash = " . $database->quote($hash);
|
||||
$query = "select 1 from oecaptcha " . $where;
|
||||
$pass = (bool) $database->getOne($query, false, false);
|
||||
|
||||
if ($pass) {
|
||||
// cleanup
|
||||
$query = "delete from oecaptcha " . $where;
|
||||
$database->execute($query);
|
||||
}
|
||||
|
||||
// garbage cleanup
|
||||
$query = "delete from oecaptcha where oxtime < $time";
|
||||
$database->execute($query);
|
||||
|
||||
return $pass;
|
||||
}
|
||||
|
||||
}
|
62
core/oecaptchaevents.php
Normal file
62
core/oecaptchaevents.php
Normal file
@ -0,0 +1,62 @@
|
||||
<?php
|
||||
/**
|
||||
* #PHPHEADER_OECAPTCHA_LICENSE_INFORMATION#
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Class defines what module does on Shop events.
|
||||
*/
|
||||
class oeCaptchaEvents
|
||||
{
|
||||
/**
|
||||
* Add table oecaptcha.
|
||||
*/
|
||||
public static function addCaptchaTable()
|
||||
{
|
||||
$query = "CREATE TABLE IF NOT EXISTS `oecaptcha` (" .
|
||||
"`OXID` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Captcha id'," .
|
||||
"`OXHASH` char(32) NOT NULL default '' COMMENT 'Hash'," .
|
||||
"`OXTIME` int(11) NOT NULL COMMENT 'Validation time'," .
|
||||
"`OXTIMESTAMP` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP COMMENT 'Timestamp'," .
|
||||
"PRIMARY KEY (`OXID`), " .
|
||||
"KEY `OXID` (`OXID`,`OXHASH`), " .
|
||||
"KEY `OXTIME` (`OXTIME`) " .
|
||||
") ENGINE=MEMORY AUTO_INCREMENT=1 COMMENT 'If session is not available, this is where captcha information is stored';";
|
||||
|
||||
oxDb::getDb()->execute($query);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove table oecaptcha.
|
||||
* NOTE: table oecaptcha contains temporary data if any and can be
|
||||
* removed without side effects on module deactivation
|
||||
*/
|
||||
public static function removeCaptchaTable()
|
||||
{
|
||||
$query = "DROP TABLE IF EXISTS `oecaptcha`";
|
||||
|
||||
oxDb::getDb()->execute($query);
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute action on activate event
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
public static function onActivate()
|
||||
{
|
||||
self::addCaptchaTable();
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute action on deactivate event
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
public static function onDeactivate()
|
||||
{
|
||||
self::removeCaptchaTable();
|
||||
}
|
||||
}
|
106
core/utils/verificationimg.php
Normal file
106
core/utils/verificationimg.php
Normal file
@ -0,0 +1,106 @@
|
||||
<?php
|
||||
/**
|
||||
* #PHPHEADER_OECAPTCHA_LICENSE_INFORMATION#
|
||||
*/
|
||||
|
||||
// #1428C - spam spider prevention
|
||||
if (isset($_GET['e_mac'])) {
|
||||
$emac = $_GET['e_mac'];
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
require_once '../../../../../bootstrap.php';
|
||||
|
||||
if (!function_exists('generateVerificationImg')) {
|
||||
|
||||
/**
|
||||
* Generates image
|
||||
*
|
||||
* @param string $mac verification code
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
function generateVerificationImg($mac)
|
||||
{
|
||||
$width = 80;
|
||||
$height = 18;
|
||||
$fontSize = 14;
|
||||
|
||||
if (function_exists('imagecreatetruecolor')) {
|
||||
// GD2
|
||||
$image = imagecreatetruecolor($width, $height);
|
||||
} elseif (function_exists('imagecreate')) {
|
||||
// GD1
|
||||
$image = imagecreate($width, $height);
|
||||
} else {
|
||||
// GD not found
|
||||
return;
|
||||
}
|
||||
|
||||
$textX = ($width - strlen($mac) * imagefontwidth($fontSize)) / 2;
|
||||
$textY = ($height - imagefontheight($fontSize)) / 2;
|
||||
|
||||
$colors = array();
|
||||
$colors["text"] = imagecolorallocate($image, 0, 0, 0);
|
||||
$colors["shadow1"] = imagecolorallocate($image, 200, 200, 200);
|
||||
$colors["shadow2"] = imagecolorallocate($image, 100, 100, 100);
|
||||
$colors["background"] = imagecolorallocate($image, 255, 255, 255);
|
||||
$colors["border"] = imagecolorallocate($image, 0, 0, 0);
|
||||
|
||||
imagefill($image, 0, 0, $colors["background"]);
|
||||
imagerectangle($image, 0, 0, $width - 1, $height - 1, $colors["border"]);
|
||||
imagestring($image, $fontSize, $textX + 1, $textY + 0, $mac, $colors["shadow2"]);
|
||||
imagestring($image, $fontSize, $textX + 0, $textY + 1, $mac, $colors["shadow1"]);
|
||||
imagestring($image, $fontSize, $textX, $textY, $mac, $colors["text"]);
|
||||
|
||||
header('Content-type: image/png');
|
||||
imagepng($image);
|
||||
imagedestroy($image);
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('strRem')) {
|
||||
|
||||
require_once getShopBasePath() . '/core/oxdecryptor.php';
|
||||
|
||||
/**
|
||||
* OXID specific string manipulation method
|
||||
*
|
||||
* @param string $value string
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function strRem($value)
|
||||
{
|
||||
$decryptor = new oxDecryptor;
|
||||
|
||||
$key = oxRegistry::getConfig()->getConfigParam('oecaptchakey');
|
||||
|
||||
if (empty($key)) {
|
||||
$key = getOxConfKey();
|
||||
}
|
||||
|
||||
return $decryptor->decrypt($value, $key);
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('getOxConfKey')) {
|
||||
|
||||
/**
|
||||
* Get default config key.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getOxConfKey()
|
||||
{
|
||||
$fileName = getShopBasePath() . '/core/oxconfk.php';
|
||||
$configFile = new oxConfigFile($fileName);
|
||||
|
||||
return $configFile->getVar("sConfigKey");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$mac = strRem($emac);
|
||||
generateVerificationImg($mac);
|
36
docs/README.txt
Executable file
36
docs/README.txt
Executable file
@ -0,0 +1,36 @@
|
||||
==Title==
|
||||
OE Captcha
|
||||
|
||||
==Author==
|
||||
OXID eSales AG
|
||||
|
||||
==Prefix==
|
||||
oe
|
||||
|
||||
==Shop Version==
|
||||
6.x
|
||||
|
||||
==Version==
|
||||
1.0.0
|
||||
|
||||
==Link==
|
||||
http://www.oxid-esales.com/
|
||||
|
||||
==Mail==
|
||||
|
||||
|
||||
==Description==
|
||||
OE Captcha Module
|
||||
|
||||
==Installation==
|
||||
Activate the module in administration area.
|
||||
|
||||
==Extend==
|
||||
|
||||
|
||||
==Modules==
|
||||
|
||||
==Modified original templates==
|
||||
|
||||
==Uninstall==
|
||||
Disable the module in administration area and delete module folder.
|
63
metadata.php
Executable file
63
metadata.php
Executable file
@ -0,0 +1,63 @@
|
||||
<?php
|
||||
/**
|
||||
* #PHPHEADER_OECAPTCHA_LICENSE_INFORMATION#
|
||||
*/
|
||||
/**
|
||||
* This file is part of OXID eSales Captcha module.
|
||||
*
|
||||
* TODO: license
|
||||
*
|
||||
* @category module
|
||||
* @package captcha
|
||||
* @author OXID eSales AG
|
||||
* @link http://www.oxid-esales.com/
|
||||
* @copyright (C) OXID eSales AG 2003-20162016
|
||||
*/
|
||||
|
||||
/**
|
||||
* Metadata version
|
||||
*/
|
||||
$sMetadataVersion = '1.1';
|
||||
|
||||
/**
|
||||
* Module information
|
||||
*/
|
||||
$aModule = array(
|
||||
'id' => 'oecaptcha',
|
||||
'title' => array(
|
||||
'de' => 'Simple Captcha',
|
||||
'en' => 'Simple Captcha',
|
||||
),
|
||||
'description' => array(
|
||||
'de' => 'OXID eSales Simple Captcha Module',
|
||||
'en' => 'OXID eSales Simple Captcha Module',
|
||||
),
|
||||
'thumbnail' => 'out/pictures/picture.png',
|
||||
'version' => '1.0.0',
|
||||
'author' => 'OXID eSales AG',
|
||||
'url' => 'http://www.oxid-esales.com/',
|
||||
'email' => '',
|
||||
'extend' => array('details' => 'oe/captcha/controllers/oecaptchadetails',
|
||||
'contact' => 'oe/captcha/controllers/oecaptchacontact',
|
||||
'invite' => 'oe/captcha/controllers/oecaptchainvite',
|
||||
'pricealarm' => 'oe/captcha/controllers/oecaptchapricealarm',
|
||||
'suggest' => 'oe/captcha/controllers/oecaptchasuggest'),
|
||||
'files' => array(
|
||||
'oecaptcha' => 'oe/captcha/core/oecaptcha.php',
|
||||
'oecaptchaEvents' => 'oe/captcha/core/oecaptchaevents.php',
|
||||
),
|
||||
'templates' => array(),
|
||||
'blocks' => array(
|
||||
array('template' => 'form/contact.tpl', 'block'=>'captcha_form', 'file'=>'/views/blocks/captcha_form.tpl'),
|
||||
array('template' => 'form/invite.tpl', 'block'=>'captcha_form', 'file'=>'/views/blocks/captcha_form.tpl'),
|
||||
array('template' => 'form/pricealarm.tpl', 'block'=>'captcha_form', 'file'=>'/views/blocks/captcha_form.tpl'),
|
||||
array('template' => 'form/suggest.tpl', 'block'=>'captcha_form', 'file'=>'/views/blocks/captcha_form.tpl'),
|
||||
),
|
||||
'settings' => array(
|
||||
array('group' => 'main', 'name' => 'oecaptchakey', 'type' => 'str', 'value' => ''),
|
||||
),
|
||||
'events' => array(
|
||||
'onActivate' => 'oecaptchaevents::onActivate',
|
||||
'onDeactivate' => 'oecaptchaevents::onDeactivate'
|
||||
),
|
||||
);
|
BIN
out/pictures/picture.png
Executable file
BIN
out/pictures/picture.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 6.9 KiB |
40
tests/unit/CaptchaTestCase.php
Normal file
40
tests/unit/CaptchaTestCase.php
Normal file
@ -0,0 +1,40 @@
|
||||
<?php
|
||||
/**
|
||||
* #PHPHEADER_OECAPTCHA_LICENSE_INFORMATION#
|
||||
*/
|
||||
|
||||
abstract class CaptchaTestCase extends OxidTestCase
|
||||
{
|
||||
/**
|
||||
* Fixture set up.
|
||||
*/
|
||||
protected function setUp()
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
$query = "CREATE TABLE IF NOT EXISTS `oecaptcha` (
|
||||
`OXID` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Captcha id',
|
||||
`OXHASH` char(32) NOT NULL default '' COMMENT 'Hash',
|
||||
`OXTIME` int(11) NOT NULL COMMENT 'Validation time',
|
||||
`OXTIMESTAMP` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP COMMENT 'Timestamp',
|
||||
PRIMARY KEY (`OXID`),
|
||||
KEY `OXID` (`OXID`,`OXHASH`),
|
||||
KEY `OXTIME` (`OXTIME`)
|
||||
) ENGINE=MEMORY AUTO_INCREMENT=1 COMMENT 'If session is not available, this is where captcha information is stored';
|
||||
";
|
||||
|
||||
oxDb::getDb()->execute($query);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fixture set up.
|
||||
*/
|
||||
protected function tearDown()
|
||||
{
|
||||
$query = "DROP TABLE `oecaptcha`";
|
||||
oxDb::getDb()->execute($query);
|
||||
|
||||
parent::tearDown();
|
||||
}
|
||||
|
||||
}
|
59
tests/unit/core/oecaptchaEventsTest.php
Normal file
59
tests/unit/core/oecaptchaEventsTest.php
Normal file
@ -0,0 +1,59 @@
|
||||
<?php
|
||||
/**
|
||||
* #PHPHEADER_OECAPTCHA_LICENSE_INFORMATION#
|
||||
*/
|
||||
|
||||
require_once __DIR__ . '/../CaptchaTestCase.php';
|
||||
|
||||
class Unit_Core_oecaptchaEventsTest extends CaptchaTestCase
|
||||
{
|
||||
/**
|
||||
* Set up the fixture.
|
||||
*/
|
||||
protected function setUp()
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
//Drop captcha table
|
||||
oxDb::getDB()->execute("DROP TABLE IF EXISTS `oecaptcha`");
|
||||
}
|
||||
|
||||
/**
|
||||
* Tear down the fixture.
|
||||
*/
|
||||
public function tearDown()
|
||||
{
|
||||
oeCaptchaEvents::addCaptchaTable();
|
||||
|
||||
parent::tearDown();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test onActivate event.
|
||||
*/
|
||||
public function testOnActivate()
|
||||
{
|
||||
oeCaptchaEvents::onActivate();
|
||||
|
||||
$oDbMetaDataHandler = oxNew('oxDbMetaDataHandler');
|
||||
|
||||
//If session is not available, table oecaptcha is where captcha information is stored
|
||||
$this->assertTrue($oDbMetaDataHandler->tableExists('oecaptcha'));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Test onActivate event.
|
||||
*/
|
||||
public function testOnDeactivate()
|
||||
{
|
||||
oeCaptchaEvents::onDeactivate();
|
||||
|
||||
$oDbMetaDataHandler = oxNew('oxDbMetaDataHandler');
|
||||
|
||||
//If session is not available, table oecaptcha is where captcha information is stored
|
||||
$this->assertFalse($oDbMetaDataHandler->tableExists('oecaptcha'));
|
||||
|
||||
}
|
||||
|
||||
}
|
230
tests/unit/core/oecaptchaTest.php
Normal file
230
tests/unit/core/oecaptchaTest.php
Normal file
@ -0,0 +1,230 @@
|
||||
<?php
|
||||
/**
|
||||
* #PHPHEADER_OECAPTCHA_LICENSE_INFORMATION#
|
||||
*/
|
||||
|
||||
require_once __DIR__ . '/../CaptchaTestCase.php';
|
||||
|
||||
class Unit_Core_oecaptchaTest extends CaptchaTestCase
|
||||
{
|
||||
private $captcha = null;
|
||||
|
||||
/**
|
||||
* Fixture set up.
|
||||
*/
|
||||
public function setUp()
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
$this->captcha = $this->getProxyClass('oecaptcha');
|
||||
}
|
||||
|
||||
/**
|
||||
* oeCaptcha::getText() test case
|
||||
*/
|
||||
public function testGetText()
|
||||
{
|
||||
$this->assertNull($this->captcha->getNonPublicVar('text'));
|
||||
$sText = $this->captcha->getText();
|
||||
$this->assertEquals($sText, $this->captcha->getNonPublicVar('text'));
|
||||
$this->assertEquals(5, strlen($sText));
|
||||
}
|
||||
|
||||
/**
|
||||
* oeCaptcha::getTextHash() test case
|
||||
*/
|
||||
public function testGetTextHash()
|
||||
{
|
||||
$this->assertEquals('c4b961848aeff4d9b083fe15a56c9bd0', $this->captcha->getTextHash('test1'));
|
||||
}
|
||||
|
||||
/**
|
||||
* oeCaptcha::getHash() test case
|
||||
*/
|
||||
public function testGetHashNoSession()
|
||||
{
|
||||
$session = $this->getMock('oxSession', array('isSessionStarted'));
|
||||
$session->expects($this->once())->method('isSessionStarted')->will($this->returnValue(false));
|
||||
|
||||
$captcha = $this->getMock('oeCaptcha', array('getSession'));
|
||||
$captcha->expects($this->once())->method('getSession')->will($this->returnValue($session));
|
||||
|
||||
$hash = $captcha->getHash('test');
|
||||
$this->assertEquals(oxDb::getDb()->getOne('select LAST_INSERT_ID()', false, false), $hash);
|
||||
}
|
||||
|
||||
/**
|
||||
* oeCaptcha::getHash() test case
|
||||
* #0004286 adding case for multiple hashes
|
||||
*/
|
||||
public function testGetHashSession()
|
||||
{
|
||||
$session = $this->getMock('oxSession', array('isSessionStarted'));
|
||||
$session->expects($this->exactly(2))->method('isSessionStarted')->will($this->returnValue(true));
|
||||
|
||||
$captcha = $this->getMock('oeCaptcha', array('getSession'));
|
||||
$captcha->expects($this->exactly(2))->method('getSession')->will($this->returnValue($session));
|
||||
$hash1 = $captcha->getHash('test1');
|
||||
$hash2 = $captcha->getHash('test2');
|
||||
|
||||
$captchaHash = oxRegistry::getSession()->getVariable('captchaHashes');
|
||||
$this->assertNotNull($captchaHash);
|
||||
$this->assertTrue(isset($captchaHash[$hash1]));
|
||||
$this->assertTrue(isset($captchaHash[$hash2]));
|
||||
}
|
||||
|
||||
/**
|
||||
* oeCaptcha::getImageUrl() test case
|
||||
*/
|
||||
public function testGetImageUrl()
|
||||
{
|
||||
$this->setConfigParam('oecaptchakey', 'someTestCaptchaKey');
|
||||
$this->captcha->setNonPublicVar('text', 'test1');
|
||||
$expected = $this->getConfig()->getShopUrl() . 'modules/oe/captcha/core/utils/verificationimg.php?e_mac=ox_MAsbCBYgVBoQ';
|
||||
|
||||
$this->assertEquals($expected, $this->captcha->getImageUrl());
|
||||
}
|
||||
|
||||
/**
|
||||
* oeCaptcha::getImageUrl() test case if sCaptcha key is not set
|
||||
*/
|
||||
public function testGetImageUrlFallbackKey()
|
||||
{
|
||||
$this->setConfigParam('oecaptchakey', '');
|
||||
$this->captcha->setNonPublicVar('text', 'test1');
|
||||
|
||||
$expected = $this->getConfig()->getShopUrl() . 'modules/oe/captcha/core/utils/verificationimg.php?e_mac=ox_MB4FUUYlYlld';
|
||||
$this->assertEquals($expected, $this->captcha->getImageUrl());
|
||||
}
|
||||
|
||||
/**
|
||||
* oeCaptcha::isImageVisible() test case
|
||||
*/
|
||||
public function testIsImageVisible()
|
||||
{
|
||||
$this->assertTrue($this->captcha->isImageVisible());
|
||||
}
|
||||
|
||||
/**
|
||||
* oeCaptcha::isImageVisible() test case
|
||||
*/
|
||||
public function testIsImageVisibleLowGD()
|
||||
{
|
||||
$this->getConfig()->setConfigParam('iUseGDVersion', 0);
|
||||
$this->assertFalse($this->captcha->isImageVisible());
|
||||
}
|
||||
|
||||
/**
|
||||
* oeCaptcha::pass() test case
|
||||
*/
|
||||
public function testDbPassCorrect()
|
||||
{
|
||||
$captcha = $this->getMock('oeCaptcha', array('passFromSession'));
|
||||
$captcha->expects($this->once())->method('passFromSession')->will($this->returnValue(null));
|
||||
|
||||
// reseting session
|
||||
$session = oxNew('oxSession');
|
||||
$captcha->setSession($session);
|
||||
|
||||
$captcha->getHash('3at8u');
|
||||
$hash = oxDb::getDb()->getOne('select LAST_INSERT_ID()', false, false);
|
||||
$this->assertTrue($captcha->pass('3at8u', $hash));
|
||||
}
|
||||
|
||||
/**
|
||||
* oeCaptcha::pass() test case
|
||||
*/
|
||||
public function testDbPassFail()
|
||||
{
|
||||
$captcha = $this->getMock('oeCaptcha', array('passFromSession'));
|
||||
$captcha->expects($this->once())->method('passFromSession')->will($this->returnValue(null));
|
||||
|
||||
$this->assertFalse($captcha->pass('3at8v', 'd9a470912b222133fb913da36c0f50d0'));
|
||||
}
|
||||
|
||||
/**
|
||||
* oeCaptcha::pass() test case
|
||||
* #0004286 adding case for multiple hashes
|
||||
*/
|
||||
public function testSessionPassCorrect()
|
||||
{
|
||||
$mac1 = '3at8u';
|
||||
$mac2 = '3at8u';
|
||||
$hash1 = 1234;
|
||||
$hash2 = 1235;
|
||||
|
||||
$captcha = oxNew('oeCaptcha');
|
||||
$hash = array(
|
||||
$hash1 => array($captcha->getTextHash($mac1) => time() + 3600),
|
||||
$hash2 => array($captcha->getTextHash($mac2) => time() + 3600)
|
||||
);
|
||||
$session = $this->getSession();
|
||||
$session->setVariable('captchaHashes', $hash);
|
||||
|
||||
$captcha = $this->getMock('oeCaptcha', array('passFromDb'));
|
||||
$captcha->expects($this->never())->method('passFromDb');
|
||||
|
||||
$this->assertTrue($captcha->pass($mac1, $hash1));
|
||||
$this->assertEquals(1, count($session->getVariable('captchaHashes')));
|
||||
|
||||
$this->assertTrue($captcha->pass($mac2, $hash2));
|
||||
$this->assertNull($session->getVariable('captchaHashes'));
|
||||
}
|
||||
|
||||
/**
|
||||
* oeCaptcha::pass() test case
|
||||
*/
|
||||
public function testSessionPassFail()
|
||||
{
|
||||
$this->getSession()->setVariable('captchaHashes', array('testHash' => array('testTextHash' => 132)));
|
||||
|
||||
$captcha = $this->getMock('oeCaptcha', array('passFromDb'));
|
||||
$captcha->expects($this->never())->method('passFromDb');
|
||||
|
||||
$this->assertFalse($captcha->pass('3at8v', 'd9a470912b222133fb913da36c0f50d0'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test passing captcha.
|
||||
*/
|
||||
public function testPassCaptchaYes()
|
||||
{
|
||||
$captcha = $this->getMock('oeCaptcha', array('pass'));
|
||||
$captcha->expects($this->once())->method('pass')->will($this->returnValue(true));
|
||||
|
||||
$result = $captcha->passCaptcha();
|
||||
$this->assertTrue($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test not passing captcha.
|
||||
*/
|
||||
public function testPassCaptchaNo()
|
||||
{
|
||||
$utilsView = $this->getMock('oxUtilsView', array('addErrorToDisplay'));
|
||||
$utilsView->expects($this->once())->method('addErrorToDisplay')->with($this->equalTo('MESSAGE_WRONG_VERIFICATION_CODE'));
|
||||
oxRegistry::set('oxUtilsView', $utilsView);
|
||||
|
||||
$captcha = $this->getMock('oeCaptcha', array('pass'));
|
||||
$captcha->expects($this->once())->method('pass')->will($this->returnValue(false));
|
||||
|
||||
$result = $captcha->passCaptcha();
|
||||
$this->assertFalse($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test not passing captcha without displaying error message.
|
||||
*/
|
||||
public function testPassCaptchaNoWithoutDisplayMessage()
|
||||
{
|
||||
$utilsView = $this->getMock('oxUtilsView', array('addErrorToDisplay'));
|
||||
$utilsView->expects($this->never())->method('addErrorToDisplay');
|
||||
oxRegistry::set('oxUtilsView', $utilsView);
|
||||
|
||||
$captcha = $this->getMock('oeCaptcha', array('pass'));
|
||||
$captcha->expects($this->once())->method('pass')->will($this->returnValue(false));
|
||||
|
||||
$result = $captcha->passCaptcha(false);
|
||||
$this->assertFalse($result);
|
||||
}
|
||||
}
|
150
tests/unit/views/contactTest.php
Normal file
150
tests/unit/views/contactTest.php
Normal file
@ -0,0 +1,150 @@
|
||||
<?php
|
||||
/**
|
||||
* #PHPHEADER_OECAPTCHA_LICENSE_INFORMATION#
|
||||
*/
|
||||
|
||||
require_once __DIR__ . '/../CaptchaTestCase.php';
|
||||
|
||||
/**
|
||||
* Testing details class
|
||||
*/
|
||||
class Unit_contactTest extends CaptchaTestCase
|
||||
{
|
||||
/**
|
||||
* Test if send mail is not executed if CAPTCHA image is not entered
|
||||
* and warning message is displayed
|
||||
*/
|
||||
public function testSaveWithoutCaptcha()
|
||||
{
|
||||
oxRegistry::getSession()->deleteVariable('Errors');
|
||||
|
||||
$params['oxuser__oxusername'] = 'aaaa@aaa.com';
|
||||
$this->setRequestParameter('editval', $params);
|
||||
$contact = oxNew('Contact');
|
||||
|
||||
$this->assertFalse($contact->send());
|
||||
|
||||
//checking if warning was added to errors list
|
||||
$message = oxRegistry::getLang()->translateString('MESSAGE_WRONG_VERIFICATION_CODE');
|
||||
$errors = oxRegistry::getSession()->getVariable('Errors');
|
||||
$error = unserialize($errors['default'][0]);
|
||||
|
||||
$this->assertEquals($message, $error->getOxMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test if send mail is not executed if user data is not entered
|
||||
* and warning message is displayed
|
||||
*/
|
||||
public function testSaveWithoutUserData()
|
||||
{
|
||||
oxRegistry::getSession()->deleteVariable('Errors');
|
||||
oxTestModules::addFunction('oeCaptcha', 'pass', '{return true;}');
|
||||
|
||||
$params['oxuser__oxusername'] = 'aaaa@aaa.com';
|
||||
$this->setRequestParameter('editval', $params);
|
||||
$contact = oxNew('Contact');
|
||||
|
||||
$this->assertFalse($contact->send());
|
||||
|
||||
//checking if warning was added to errors list
|
||||
$message = oxRegistry::getLang()->translateString('ERROR_MESSAGE_INPUT_NOTALLFIELDS');
|
||||
$errors = oxRegistry::getSession()->getVariable('Errors');
|
||||
$error = unserialize($errors['default'][0]);
|
||||
|
||||
$this->assertEquals($message, $error->getOxMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test send mail
|
||||
*/
|
||||
public function testSave()
|
||||
{
|
||||
oxTestModules::addFunction('oeCaptcha', 'pass', '{return true;}');
|
||||
oxTestModules::addFunction('oxemail', 'sendContactMail', '{return true;}');
|
||||
|
||||
$params['oxuser__oxusername'] = 'aaaa@aaa.com';
|
||||
$params['oxuser__oxfname'] = 'first name';
|
||||
$params['oxuser__oxlname'] = 'last name';
|
||||
$this->setRequestParameter('editval', $params);
|
||||
$this->setRequestParameter('c_subject', 'testSubject');
|
||||
$contact = $this->getProxyClass('Contact');
|
||||
$contact->send();
|
||||
|
||||
$this->assertEquals(1, $contact->getNonPublicVar('_blContactSendStatus'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test getting object for handling CAPTCHA image
|
||||
*/
|
||||
public function testGetCaptcha()
|
||||
{
|
||||
$contact = oxNew('Contact');
|
||||
$this->assertEquals(oxNew('oeCaptcha'), $contact->getCaptcha());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test case for bug #0002065: Contact-Mail shows MR or MRS instead of localized salutation
|
||||
*/
|
||||
public function testSendForBugtrackEntry0002065()
|
||||
{
|
||||
$params = array(
|
||||
'oxuser__oxusername' => 'info@oxid-esales.com',
|
||||
'oxuser__oxfname' => 'admin',
|
||||
'oxuser__oxlname' => 'admin',
|
||||
'oxuser__oxsal' => 'MR'
|
||||
);
|
||||
|
||||
$this->setRequestParameter('editval', $params);
|
||||
$this->setRequestParameter('c_message', 'message');
|
||||
$this->setRequestParameter('c_subject', 'subject');
|
||||
|
||||
$language = oxRegistry::getLang();
|
||||
$message = $language->translateString('MESSAGE_FROM') . ' ' . $language->translateString('MR') .
|
||||
' admin admin(info@oxid-esales.com)<br /><br />message';
|
||||
|
||||
$email = $this->getMock('oxemail', array('sendContactMail'));
|
||||
$email->expects($this->once())->method('sendContactMail')->with($this->equalTo('info@oxid-esales.com'),
|
||||
$this->equalTo('subject'), $this->equalTo($message))->will($this->returnValue(true));
|
||||
oxTestModules::addModuleObject('oxemail', $email);
|
||||
|
||||
$captcha = $this->getMock('oeCaptcha', array('passCaptcha'));
|
||||
$captcha->expects($this->once())->method('passCaptcha')->will($this->returnValue(true));
|
||||
|
||||
$contact = $this->getMock('oecaptchacontact', array('getCaptcha'));
|
||||
$contact->expects($this->once())->method('getCaptcha')->will($this->returnValue($captcha));
|
||||
$contact->send();
|
||||
}
|
||||
|
||||
/**
|
||||
* Testing method send()
|
||||
*/
|
||||
public function testSendEmailNotSend()
|
||||
{
|
||||
$utils = $this->getMock('oxUtilsView', array('addErrorToDisplay'));
|
||||
$utils->expects($this->once())->method('addErrorToDisplay')->with($this->equalTo('ERROR_MESSAGE_CHECK_EMAIL'));
|
||||
oxTestModules::addModuleObject('oxUtilsView', $utils);
|
||||
|
||||
$params = array(
|
||||
'oxuser__oxusername' => 'info@oxid-esales.com',
|
||||
'oxuser__oxfname' => 'admin',
|
||||
'oxuser__oxlname' => 'admin',
|
||||
'oxuser__oxsal' => 'MR'
|
||||
);
|
||||
|
||||
$this->setRequestParameter('editval', $params);
|
||||
$this->setRequestParameter('c_message', 'message');
|
||||
$this->setRequestParameter('c_subject', 'subject');
|
||||
|
||||
$email = $this->getMock('oxemail', array('sendContactMail'));
|
||||
$email->expects($this->once())->method('sendContactMail')->will($this->returnValue(false));
|
||||
oxTestModules::addModuleObject('oxemail', $email);
|
||||
|
||||
$captcha = $this->getMock('oeCaptcha', array('passCaptcha'));
|
||||
$captcha->expects($this->once())->method('passCaptcha')->will($this->returnValue(true));
|
||||
|
||||
$contact = $this->getMock('oecaptchacontact', array('getCaptcha'));
|
||||
$contact->expects($this->once())->method('getCaptcha')->will($this->returnValue($captcha));
|
||||
$contact->send();
|
||||
}
|
||||
}
|
45
tests/unit/views/detailsTest.php
Normal file
45
tests/unit/views/detailsTest.php
Normal file
@ -0,0 +1,45 @@
|
||||
<?php
|
||||
/**
|
||||
* #PHPHEADER_OECAPTCHA_LICENSE_INFORMATION#
|
||||
*/
|
||||
|
||||
require_once __DIR__ . '/../CaptchaTestCase.php';
|
||||
|
||||
/**
|
||||
* Testing details class
|
||||
*/
|
||||
class Unit_detailsTest extends CaptchaTestCase
|
||||
{
|
||||
/**
|
||||
* Test get Captcha.
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
public function testGetCaptcha()
|
||||
{
|
||||
$details = $this->getProxyClass('oecaptchadetails');
|
||||
$this->assertEquals(oxNew('oeCaptcha'), $details->getCaptcha());
|
||||
}
|
||||
|
||||
/**
|
||||
* Invalid captcha test case.
|
||||
*/
|
||||
public function testAddmeInvalidCaptcha()
|
||||
{
|
||||
$captcha = $this->getMock('oeCaptcha', array('passCaptcha'));
|
||||
$captcha->expects($this->once())->method('passCaptcha')->will($this->returnValue(false));
|
||||
|
||||
$email = $this->getMock('oxEmail', array('sendPricealarmNotification'));
|
||||
$email->expects($this->never())->method('sendPricealarmNotification');
|
||||
oxTestModules::addModuleObject('oxEmail', $email);
|
||||
|
||||
$details = $this->getMock($this->getProxyClassName('oecaptchadetails'), array('getCaptcha'));
|
||||
$details->expects($this->once())->method('getCaptcha')->will($this->returnValue($captcha));
|
||||
|
||||
$details->addme();
|
||||
$this->assertSame(2, $details->getNonPublicVar('_iPriceAlarmStatus'));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
106
tests/unit/views/inviteTest.php
Normal file
106
tests/unit/views/inviteTest.php
Normal file
@ -0,0 +1,106 @@
|
||||
<?php
|
||||
/**
|
||||
* #PHPHEADER_OECAPTCHA_LICENSE_INFORMATION#
|
||||
*/
|
||||
|
||||
require_once __DIR__ . '/../CaptchaTestCase.php';
|
||||
|
||||
class Unit_inviteTest extends OxidTestCase
|
||||
{
|
||||
/**
|
||||
* Tear down the fixture.
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
protected function tearDown()
|
||||
{
|
||||
$this->cleanUpTable('oxinvitations', 'oxuserid');
|
||||
|
||||
parent::tearDown();
|
||||
}
|
||||
|
||||
/**
|
||||
* Testing method getCaptcha()
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
public function testGetCaptcha()
|
||||
{
|
||||
$invite = $this->getProxyClass('oecaptchainvite');
|
||||
$this->assertEquals(oxNew('oeCaptcha'), $invite->getCaptcha());
|
||||
}
|
||||
|
||||
/**
|
||||
* Testing method send() - no captcha text
|
||||
*/
|
||||
public function testSendWithoutCaptcha()
|
||||
{
|
||||
$this->setRequestParameter('editval', array('rec_email' => 'testRecEmail@oxid-esales.com',
|
||||
'send_name' => 'testSendName',
|
||||
'send_email' => 'testSendEmail@oxid-esales.com',
|
||||
'send_message' => 'testSendMessage',
|
||||
'send_subject' => 'testSendSubject'));
|
||||
$this->getConfig()->setConfigParam('blInvitationsEnabled', true);
|
||||
|
||||
$captcha = $this->getMock('oeCaptcha', array('passCaptcha'));
|
||||
$captcha->expects($this->once())->method('passCaptcha')->will($this->returnValue(false));
|
||||
|
||||
$invite = $this->getMock('oecaptchainvite', array('getCaptcha', 'getUser'));
|
||||
$invite->expects($this->never())->method('getUser');
|
||||
$invite->expects($this->once())->method('getCaptcha')->will($this->returnValue($captcha));
|
||||
$invite->send();
|
||||
$this->assertFalse($invite->getInviteSendStatus());
|
||||
}
|
||||
|
||||
/**
|
||||
* Testing method send()
|
||||
*/
|
||||
public function testSend()
|
||||
{
|
||||
$this->setRequestParameter('editval', array('rec_email' => array('testRecEmail@oxid-esales.com'), 'send_name' => 'testSendName', 'send_email' => 'testSendEmail@oxid-esales.com', 'send_message' => 'testSendMessage', 'send_subject' => 'testSendSubject'));
|
||||
$this->getConfig()->setConfigParam('blInvitationsEnabled', true);
|
||||
|
||||
$email = $this->getMock('oxEmail', array('sendInviteMail'));
|
||||
$email->expects($this->once())->method('sendInviteMail')->will($this->returnValue(true));
|
||||
oxTestModules::addModuleObject('oxEmail', $email);
|
||||
|
||||
$captcha = $this->getMock('oeCaptcha', array('passCaptcha'));
|
||||
$captcha->expects($this->once())->method('passCaptcha')->will($this->returnValue(true));
|
||||
|
||||
$invite = $this->getMock('oecaptchainvite', array('getCaptcha', 'getUser'));
|
||||
$invite->expects($this->once())->method('getCaptcha')->will($this->returnValue($captcha));
|
||||
$invite->expects($this->any())->method('getUser')->will($this->returnValue(oxNew('oxUser')));
|
||||
$invite->send();
|
||||
$this->assertTrue($invite->getInviteSendStatus());
|
||||
}
|
||||
|
||||
/**
|
||||
* Testing method render()
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
public function testRender()
|
||||
{
|
||||
$this->getConfig()->setConfigParam('blInvitationsEnabled', true);
|
||||
|
||||
$invite = $this->getMock('invite', array('getUser'));
|
||||
$invite->expects($this->any())->method('getUser')->will($this->returnValue(oxNew('oxUser')));
|
||||
|
||||
$this->assertEquals('page/privatesales/invite.tpl', $invite->render());
|
||||
}
|
||||
|
||||
/**
|
||||
* Testing method render() - mail was sent status
|
||||
*/
|
||||
public function testRenderMailWasSent()
|
||||
{
|
||||
$this->getConfig()->setConfigParam('blInvitationsEnabled', true);
|
||||
|
||||
$invite = $this->getProxyClass('invite');
|
||||
$invite->setNonPublicVar('_iMailStatus', 1);
|
||||
$invite->render();
|
||||
|
||||
$this->assertTrue($invite->getInviteSendStatus());
|
||||
}
|
||||
|
||||
}
|
111
tests/unit/views/pricealarmTest.php
Normal file
111
tests/unit/views/pricealarmTest.php
Normal file
@ -0,0 +1,111 @@
|
||||
<?php
|
||||
/**
|
||||
* #PHPHEADER_OECAPTCHA_LICENSE_INFORMATION#
|
||||
*/
|
||||
|
||||
require_once __DIR__ . '/../CaptchaTestCase.php';
|
||||
|
||||
class Unit_pricealarmTest extends CaptchaTestCase
|
||||
{
|
||||
/**
|
||||
* Tear down the fixture.
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
protected function tearDown()
|
||||
{
|
||||
$this->cleanUpTable('oxpricealarm', 'oxartid');
|
||||
|
||||
parent::tearDown();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test incorrect captcha.
|
||||
*/
|
||||
public function testAddmeIncorectCaptcha()
|
||||
{
|
||||
$priceAlarm = $this->getProxyClass('oecaptchapricealarm');
|
||||
$this->setRequestParameter('c_mac', 'aa');
|
||||
$this->setRequestParameter('c_mach', 'bb');
|
||||
|
||||
$priceAlarm->addme();
|
||||
|
||||
$this->assertEquals(2, $priceAlarm->getNonPublicVar('_iPriceAlarmStatus'));
|
||||
|
||||
$query = 'select count(oxid) from oxpricealarm';
|
||||
$this->assertEquals(0, oxDb::getDb()->getOne($query));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test incorrect email.
|
||||
*/
|
||||
public function testAddmeIncorectEmail()
|
||||
{
|
||||
$priceAlarm = $this->getProxyClass('oecaptchapricealarm');
|
||||
oxTestModules::addFunction('oeCaptcha', 'passCaptcha', '{return true;}');
|
||||
|
||||
$this->setRequestParameter('pa', array('email' => 'ladyGaga'));
|
||||
$priceAlarm->addme();
|
||||
|
||||
$this->assertEquals(0, $priceAlarm->getNonPublicVar('_iPriceAlarmStatus'));
|
||||
|
||||
$query = 'select count(oxid) from oxpricealarm';
|
||||
$this->assertEquals(0, oxDb::getDb()->getOne($query));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test all is well.
|
||||
*/
|
||||
public function testAddmeSavesAndSendsPriceAlarm()
|
||||
{
|
||||
$priceAlarm = $this->getProxyClass('pricealarm');
|
||||
oxTestModules::addFunction('oeCaptcha', 'passCaptcha', '{return true;}');
|
||||
oxTestModules::addFunction('oxEmail', 'sendPricealarmNotification', '{return 999;}');
|
||||
|
||||
$this->getSession()->setVariable('usr', 'testUserId');
|
||||
$parameters['email'] = 'goodemail@ladyGagaFans.lt';
|
||||
$parameters['aid'] = '_testArtId';
|
||||
$parameters['price'] = '10';
|
||||
|
||||
$parameters['mano'] = '101';
|
||||
|
||||
$this->setRequestParameter('pa', $parameters);
|
||||
$priceAlarm->addme();
|
||||
|
||||
$this->assertEquals(999, $priceAlarm->getNonPublicVar('_iPriceAlarmStatus'));
|
||||
|
||||
$query = 'select * from oxpricealarm';
|
||||
$alarm = oxDb::getDb(oxDB::FETCH_MODE_ASSOC)->getRow($query);
|
||||
|
||||
$this->assertEquals($parameters['email'], $alarm['OXEMAIL']);
|
||||
$this->assertEquals($parameters['aid'], $alarm['OXARTID']);
|
||||
$this->assertEquals($parameters['price'], $alarm['OXPRICE']);
|
||||
$this->assertEquals('testUserId', $alarm['OXUSERID']);
|
||||
$this->assertEquals('EUR', $alarm['OXCURRENCY']);
|
||||
$this->assertEquals(0, $alarm['OXLANG']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test saving active language.
|
||||
*/
|
||||
public function testAddmeSavesCurrentActiveLanguage()
|
||||
{
|
||||
$priceAlarm = $this->getProxyClass('pricealarm');
|
||||
oxTestModules::addFunction('oeCaptcha', 'passCaptcha', '{return true;}');
|
||||
oxTestModules::addFunction('oxEmail', 'sendPricealarmNotification', '{return 999;}');
|
||||
|
||||
$this->getSession()->setVariable('usr', 'testUserId');
|
||||
$parameters['email'] = 'goodemail@ladyGagaFans.lt';
|
||||
|
||||
oxRegistry::getLang()->setBaseLanguage(1);
|
||||
$this->setRequestParameter('pa', $parameters);
|
||||
|
||||
$priceAlarm->addme();
|
||||
|
||||
$query = 'select oxlang from oxpricealarm';
|
||||
$language = oxDb::getDb(oxDB::FETCH_MODE_ASSOC)->getOne($query);
|
||||
|
||||
$this->assertEquals(1, $language);
|
||||
}
|
||||
|
||||
}
|
111
tests/unit/views/suggestTest.php
Normal file
111
tests/unit/views/suggestTest.php
Normal file
@ -0,0 +1,111 @@
|
||||
<?php
|
||||
/**
|
||||
* #PHPHEADER_OECAPTCHA_LICENSE_INFORMATION#
|
||||
*/
|
||||
|
||||
require_once __DIR__ . '/../CaptchaTestCase.php';
|
||||
|
||||
class Unit_suggestTest extends CaptchaTestCase
|
||||
{
|
||||
/**
|
||||
* Tear down the fixture.
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
protected function tearDown()
|
||||
{
|
||||
$sDelete = "delete from oxrecommlists where oxid like 'testlist%'";
|
||||
oxDb::getDB()->execute($sDelete);
|
||||
|
||||
$sDelete = "delete from oxobject2list where oxlistid like 'testlist%'";
|
||||
oxDb::getDB()->execute($sDelete);
|
||||
|
||||
parent::tearDown();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test getter for suggest data.
|
||||
*/
|
||||
public function testGetSuggestData()
|
||||
{
|
||||
oxTestModules::addFunction('oeCaptcha', 'passCaptcha', '{return true;}');
|
||||
$this->setRequestParameter('editval', array('name' => 'test', 'value' => 'testvalue'));
|
||||
|
||||
$suggest = $this->getProxyClass('oecaptchasuggest');
|
||||
$suggest->send();
|
||||
|
||||
$parameter = $suggest->getSuggestData();
|
||||
|
||||
$this->assertEquals('test', $parameter->name);
|
||||
$this->assertEquals('testvalue', $parameter->value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test captcha getter.
|
||||
*/
|
||||
public function testGetCaptcha()
|
||||
{
|
||||
$suggest = $this->getProxyClass('oecaptchasuggest');
|
||||
$this->assertEquals(oxNew('oeCaptcha'), $suggest->getCaptcha());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test all is well.
|
||||
*/
|
||||
public function testSendPass()
|
||||
{
|
||||
$this->setRequestParameter(
|
||||
'editval',
|
||||
array(
|
||||
'name' => 'test',
|
||||
'value' => 'testvalue',
|
||||
'rec_name' => 'test1',
|
||||
'rec_email' => 'recmail@oxid.lt',
|
||||
'send_name' => 'test3',
|
||||
'send_email' => 'sendmail@oxid.lt',
|
||||
'send_message' => 'test5',
|
||||
'send_subject' => 'test6',
|
||||
)
|
||||
);
|
||||
|
||||
$email = $this->getMock('stdclass', array('sendSuggestMail'));
|
||||
$email->expects($this->once())->method('sendSuggestMail')
|
||||
->will($this->returnValue(1));
|
||||
|
||||
oxTestModules::addModuleObject('oxemail', $email);
|
||||
|
||||
$product = $this->getMock('oxarticle', array('getId'));
|
||||
$product->expects($this->once())->method('getId')->will($this->returnValue('XProduct'));
|
||||
|
||||
$captcha = $this->getMock('oeCaptcha', array('passCaptcha'));
|
||||
$captcha->expects($this->once())->method('passCaptcha')->will($this->returnValue(true));
|
||||
|
||||
$suggest = $this->getMock('oecaptchasuggest', array('getProduct', 'getCaptcha'));
|
||||
$suggest->expects($this->once())->method('getProduct')->will($this->returnValue($product));
|
||||
$suggest->expects($this->once())->method('getCaptcha')->will($this->returnValue($captcha));
|
||||
|
||||
$this->setRequestParameter('searchparam', 'searchparam&&A');
|
||||
$this->setRequestParameter('searchcnid', 'searchcnid&&A');
|
||||
$this->setRequestParameter('searchvendor', 'searchvendor&&A');
|
||||
$this->setRequestParameter('searchmanufacturer', 'searchmanufacturer&&A');
|
||||
$this->setRequestParameter('listtype', 'listtype&&A');
|
||||
|
||||
$expected = 'details?anid=XProduct&searchparam=searchparam%26%26A&searchcnid=searchcnid&&A&searchvendor=searchvendor&&A&searchmanufacturer=searchmanufacturer&&A&listtype=listtype&&A';
|
||||
$this->assertEquals($expected, $suggest->send());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invalid captcha case.
|
||||
*/
|
||||
public function testSendInvalidCaptcha()
|
||||
{
|
||||
$captcha = $this->getMock('oeCaptcha', array('passCaptcha'));
|
||||
$captcha->expects($this->once())->method('passCaptcha')->will($this->returnValue(false));
|
||||
|
||||
$suggest = $this->getMock('oecaptchasuggest', array('getProduct', 'getCaptcha'));
|
||||
$suggest->expects($this->never())->method('getProduct');
|
||||
$suggest->expects($this->once())->method('getCaptcha')->will($this->returnValue($captcha));
|
||||
|
||||
$this->assertFalse($suggest->send());
|
||||
}
|
||||
}
|
17
translations/de/oecaptcha_de_lang.php
Executable file
17
translations/de/oecaptcha_de_lang.php
Executable file
@ -0,0 +1,17 @@
|
||||
<?php
|
||||
/**
|
||||
|
||||
*
|
||||
* @category module
|
||||
* @package captcha
|
||||
* @author OXID eSales AG
|
||||
* @link http://www.oxid-esales.com/
|
||||
* @copyright (C) OXID eSales AG 2003-20162016
|
||||
*/
|
||||
|
||||
$sLangName = 'Deutsch';
|
||||
|
||||
$aLang = array(
|
||||
'charset' => 'UTF-8',
|
||||
'MESSAGE_WRONG_VERIFICATION_CODE' => 'Der Prüfcode, den Sie eingegeben haben, ist nicht korrekt. Bitte versuchen Sie es erneut!'
|
||||
);
|
17
translations/en/oecaptcha_en_lang.php
Executable file
17
translations/en/oecaptcha_en_lang.php
Executable file
@ -0,0 +1,17 @@
|
||||
<?php
|
||||
/**
|
||||
|
||||
*
|
||||
* @category module
|
||||
* @package captcha
|
||||
* @author OXID eSales AG
|
||||
* @link http://www.oxid-esales.com/
|
||||
* @copyright (C) OXID eSales AG 2003-20162016
|
||||
*/
|
||||
|
||||
$sLangName = 'English';
|
||||
|
||||
$aLang = array(
|
||||
'charset' => 'UTF-8',
|
||||
'MESSAGE_WRONG_VERIFICATION_CODE' => "The verification code you entered is not correct. Please try again."
|
||||
);
|
13
views/admin/de/module_options.php
Normal file
13
views/admin/de/module_options.php
Normal file
@ -0,0 +1,13 @@
|
||||
<?php
|
||||
/**
|
||||
* #PHPHEADER_OECAPTCHA_LICENSE_INFORMATION#
|
||||
*/
|
||||
|
||||
// -------------------------------
|
||||
// RESOURCE IDENTIFIER = STRING
|
||||
// -------------------------------
|
||||
$aLang = array(
|
||||
'charset' => 'UTF-8',
|
||||
'SHOP_MODULE_GROUP_main' => 'Allgemein',
|
||||
'SHOP_MODULE_oecaptchakey' => 'Captcha Key',
|
||||
);
|
13
views/admin/en/module_options.php
Normal file
13
views/admin/en/module_options.php
Normal file
@ -0,0 +1,13 @@
|
||||
<?php
|
||||
/**
|
||||
* #PHPHEADER_OECAPTCHA_LICENSE_INFORMATION#
|
||||
*/
|
||||
|
||||
// -------------------------------
|
||||
// RESOURCE IDENTIFIER = STRING
|
||||
// -------------------------------
|
||||
$aLang = array(
|
||||
'charset' => 'UTF-8',
|
||||
'SHOP_MODULE_GROUP_main' => 'General',
|
||||
'SHOP_MODULE_oecaptchakey' => 'Captcha Key',
|
||||
);
|
18
views/blocks/captcha_form.tpl
Normal file
18
views/blocks/captcha_form.tpl
Normal file
@ -0,0 +1,18 @@
|
||||
[{$smarty.block.parent}]
|
||||
|
||||
[{assign var="oCaptcha" value=$oView->getCaptcha()}]
|
||||
<input type="hidden" name="c_mach" value="[{$oCaptcha->getHash()}]"/>
|
||||
|
||||
<li class="verify">
|
||||
<label class="req">[{oxmultilang ident="VERIFICATION_CODE" suffix="COLON"}]</label>
|
||||
[{assign var="oCaptcha" value=$oView->getCaptcha()}]
|
||||
[{if $oCaptcha->isImageVisible()}]
|
||||
<img src="[{$oCaptcha->getImageUrl()}]" alt="">
|
||||
[{else}]
|
||||
<span class="verificationCode" id="verifyTextCode">[{$oCaptcha->getText()}]</span>
|
||||
[{/if}]
|
||||
<input type="text" data-fieldsize="verify" name="c_mac" value="" class="js-oxValidate js-oxValidate_notEmpty">
|
||||
<p class="oxValidateError">
|
||||
<span class="js-oxError_notEmpty">[{oxmultilang ident="ERROR_MESSAGE_INPUT_NOTALLFIELDS"}]</span>
|
||||
</p>
|
||||
</li>
|
Loading…
Reference in New Issue
Block a user