├── .gitignore ├── mailru.nocaptcha ├── lang │ ├── ru │ │ ├── options.php │ │ └── install │ │ │ └── index.php │ └── en │ │ ├── install │ │ └── index.php │ │ └── options.php ├── prolog.php ├── install │ ├── version.php │ ├── components │ │ └── mailru │ │ │ └── nocaptcha.widget │ │ │ ├── lang │ │ │ ├── en │ │ │ │ ├── .parameters.php │ │ │ │ └── .description.php │ │ │ └── ru │ │ │ │ ├── .parameters.php │ │ │ │ └── .description.php │ │ │ ├── images │ │ │ └── nocaptcha.gif │ │ │ ├── templates │ │ │ └── .default.php │ │ │ ├── component.php │ │ │ ├── .description.php │ │ │ └── .parameters.php │ └── index.php ├── default_option.php ├── include.php ├── classes │ └── general │ │ ├── captcha.php │ │ └── nocaptcha.php └── options.php ├── SConstruct └── README.asciidoc /.gitignore: -------------------------------------------------------------------------------- 1 | .*.tar.gz 2 | .sconsign.dblite 3 | -------------------------------------------------------------------------------- /mailru.nocaptcha/lang/ru/options.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mailru/nocaptcha-bitrix/master/mailru.nocaptcha/lang/ru/options.php -------------------------------------------------------------------------------- /mailru.nocaptcha/prolog.php: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /mailru.nocaptcha/lang/ru/install/index.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mailru/nocaptcha-bitrix/master/mailru.nocaptcha/lang/ru/install/index.php -------------------------------------------------------------------------------- /mailru.nocaptcha/install/version.php: -------------------------------------------------------------------------------- 1 | "0.1.0", 4 | "VERSION_DATE" => "2015-05-25 11:50:19", 5 | ); 6 | ?> 7 | -------------------------------------------------------------------------------- /mailru.nocaptcha/lang/en/install/index.php: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /mailru.nocaptcha/install/components/mailru/nocaptcha.widget/lang/en/.parameters.php: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /mailru.nocaptcha/default_option.php: -------------------------------------------------------------------------------- 1 | "", 4 | "private_key" => "", 5 | "ru_langs" => "ru,be,uk,kz", 6 | "replace" => "N", 7 | ); 8 | ?> 9 | -------------------------------------------------------------------------------- /mailru.nocaptcha/install/components/mailru/nocaptcha.widget/images/nocaptcha.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mailru/nocaptcha-bitrix/master/mailru.nocaptcha/install/components/mailru/nocaptcha.widget/images/nocaptcha.gif -------------------------------------------------------------------------------- /mailru.nocaptcha/install/components/mailru/nocaptcha.widget/lang/ru/.parameters.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mailru/nocaptcha-bitrix/master/mailru.nocaptcha/install/components/mailru/nocaptcha.widget/lang/ru/.parameters.php -------------------------------------------------------------------------------- /mailru.nocaptcha/install/components/mailru/nocaptcha.widget/lang/ru/.description.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mailru/nocaptcha-bitrix/master/mailru.nocaptcha/install/components/mailru/nocaptcha.widget/lang/ru/.description.php -------------------------------------------------------------------------------- /mailru.nocaptcha/install/components/mailru/nocaptcha.widget/templates/.default.php: -------------------------------------------------------------------------------- 1 |
">
2 | -------------------------------------------------------------------------------- /mailru.nocaptcha/install/components/mailru/nocaptcha.widget/lang/en/.description.php: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /mailru.nocaptcha/lang/en/options.php: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /mailru.nocaptcha/include.php: -------------------------------------------------------------------------------- 1 | "classes/general/nocaptcha.php")); 3 | if (COption::GetOptionString("mailru.nocaptcha", "replace", "N") === "Y") 4 | { 5 | require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/mailru.nocaptcha/classes/general/captcha.php"); 6 | } 7 | ?> 8 | -------------------------------------------------------------------------------- /mailru.nocaptcha/install/components/mailru/nocaptcha.widget/component.php: -------------------------------------------------------------------------------- 1 | AddContainerId($arResult["ID"]); 9 | } 10 | else 11 | { 12 | $arResult["ID"] = CNocaptcha::GetInstance()->GenerateContainerId(); 13 | } 14 | $this->IncludeComponentTemplate(); 15 | ?> 16 | -------------------------------------------------------------------------------- /mailru.nocaptcha/install/components/mailru/nocaptcha.widget/.description.php: -------------------------------------------------------------------------------- 1 | GetMessage("NOCAPTCHA_WIDGET_NAME"), 8 | "DESCRIPTION" => GetMessage("NOCAPTCHA_WIDGET_DESCRIPTION"), 9 | "ICON" => "/images/nocaptcha.gif", 10 | "PATH" => array( 11 | "ID" => "utility", 12 | ), 13 | ); 14 | ?> 15 | -------------------------------------------------------------------------------- /mailru.nocaptcha/install/components/mailru/nocaptcha.widget/.parameters.php: -------------------------------------------------------------------------------- 1 | array( 6 | "ID" => array( 7 | "NAME" => GetMessage("NOCAPTCHA_WIDGET_ID"), 8 | "TYPE" => "STRING", 9 | "DEFAULT" => "", 10 | "PARENT" => "BASE", 11 | ), 12 | "TABINDEX" => array( 13 | "NAME" => GetMessage("NOCAPTCHA_WIDGET_TABINDEX"), 14 | "TYPE" => "STRING", 15 | "DEFAULT" => "", 16 | "PARENT" => "BASE", 17 | ), 18 | ), 19 | ); 20 | ?> 21 | -------------------------------------------------------------------------------- /mailru.nocaptcha/classes/general/captcha.php: -------------------------------------------------------------------------------- 1 | Check($captchaId, $captchaValue) === true) 17 | return true; 18 | return false; 19 | } 20 | 21 | public function CheckCodeCrypt($captchaValue, $captchaId, 22 | $password = '', $bUpperCode = true) 23 | { 24 | return $this->CheckCode($captchaValue, $captchaId); 25 | } 26 | 27 | public function SetCode() 28 | { 29 | } 30 | 31 | public function GetSID() 32 | { 33 | return 'fake_sid'; 34 | } 35 | } 36 | ?> 37 | -------------------------------------------------------------------------------- /SConstruct: -------------------------------------------------------------------------------- 1 | import os, re 2 | from copy import deepcopy 3 | from datetime import datetime 4 | 5 | vars = Variables() 6 | vars.Add(EnumVariable('P', 'Part of the version to increment', 'p', 7 | allowed_values=('M', 'm', 'p'))) 8 | env = Environment(variables=vars) 9 | Help(vars.GenerateHelpText(env)) 10 | 11 | def parse_version(file): 12 | with open(file, 'r') as f: 13 | for line in f: 14 | match = re.search('[\\\'\\\"]VERSION[\\\'\\\"][^\d]+(\d+)\.(\d+)\.(\d+)', line) 15 | if not match: 16 | continue 17 | return [int(v) for v in deepcopy(match.group(1, 2, 3))] 18 | raise ValueError(u"Invalid version.php file format.") 19 | 20 | def generate_version(file, vers): 21 | vers = u"{0}.{1}.{2}".format(*vers) 22 | date = datetime.today().strftime(u"%Y-%m-%d %H:%M:%S") 23 | data = u""" "{0}", 26 | "VERSION_DATE" => "{1}", 27 | ); 28 | ?> 29 | """ 30 | data = data.format(vers, date) 31 | with open(file, 'w') as f: 32 | f.writelines(data.encode('utf8')) 33 | 34 | def increment_version(target, source, env): 35 | vers = parse_version('mailru.nocaptcha/install/version.php') 36 | inc = env.get('P', 'p') 37 | if inc == 'M': 38 | vers[0] += 1 39 | vers[1] = 0 40 | vers[2] = 0 41 | elif inc == 'm': 42 | vers[1] += 1 43 | vers[2] = 0 44 | else: 45 | vers[2] += 1 46 | generate_version('mailru.nocaptcha/install/version.php', vers) 47 | 48 | inc_version = env.Command('vers', '', increment_version) 49 | 50 | last_version = env.Command('.last_version', 'mailru.nocaptcha', [ 51 | Copy('.last_version', 'mailru.nocaptcha'), 52 | 'tar -czf .last_version.tar.gz .last_version', 53 | Delete('.last_version')]) 54 | 55 | env.AlwaysBuild(last_version) 56 | env.Default(last_version) 57 | -------------------------------------------------------------------------------- /mailru.nocaptcha/install/index.php: -------------------------------------------------------------------------------- 1 | MODULE_VERSION = BX_NOCAPTCHA_VERSION; 30 | $this->MODULE_VERSION_DATE = BX_NOCAPTCHA_VERSION_DATE; 31 | $this->MODULE_NAME = GetMessage("NOCAPTCHA_NAME"); 32 | $this->MODULE_DESCRIPTION = GetMessage("NOCAPTCHA_DESCRIPTION"); 33 | $this->PARTNER_NAME = "Mail.Ru Group"; 34 | $this->PARTNER_URI = "http://corp.mail.ru"; 35 | } 36 | 37 | function InstallFiles() 38 | { 39 | CopyDirFiles($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/".$this->MODULE_ID."/install/components", 40 | $_SERVER["DOCUMENT_ROOT"]."/bitrix/components", true, true); 41 | } 42 | 43 | function UnInstallFiles() 44 | { 45 | DeleteDirFilesEx("bitrix/components/mailru/nocaptcha.widget"); 46 | DeleteDirFiles($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/".$this->MODULE_ID."/install/components", 47 | $_SERVER["DOCUMENT_ROOT"]."/bitrix/components"); 48 | } 49 | 50 | function DoInstall() 51 | { 52 | $this->InstallFiles(); 53 | RegisterModuleDependences("main", "OnPageStart", $this->MODULE_ID); 54 | RegisterModule($this->MODULE_ID); 55 | } 56 | 57 | function DoUninstall() 58 | { 59 | $this->UnInstallFiles(); 60 | UnRegisterModuleDependences("main", "OnPageStart", $this->MODULE_ID); 61 | UnRegisterModule($this->MODULE_ID); 62 | } 63 | } 64 | ?> 65 | -------------------------------------------------------------------------------- /mailru.nocaptcha/classes/general/nocaptcha.php: -------------------------------------------------------------------------------- 1 | publicKey = COption::GetOptionString("mailru.nocaptcha", "public_key", 28 | $nocaptcha_default_option["public_key"]); 29 | $this->privateKey = COption::GetOptionString("mailru.nocaptcha", "private_key", 30 | $nocaptcha_default_option["private_key"]); 31 | $t = COption::GetOptionString("mailru.nocaptcha", "ru_langs", 32 | $nocaptcha_default_option["ru_langs"]); 33 | $this->arRuLangs = preg_split("/[^[:alnum:]]+/", $t, -1, PREG_SPLIT_NO_EMPTY); 34 | } 35 | 36 | private function __clone() 37 | { 38 | } 39 | 40 | private function __wakeup() 41 | { 42 | } 43 | 44 | private static function JoinParams($params) 45 | { 46 | if (!count($params)) 47 | return ""; 48 | $ret = array(); 49 | foreach ($params as $key => $val) 50 | { 51 | $ret[] = $key."=".urlencode(stripslashes($val)); 52 | } 53 | return "?".join("&", $ret); 54 | } 55 | 56 | private function GenerateSettings() 57 | { 58 | if (!in_array(LANGUAGE_ID, $this->arRuLangs)) 59 | $this->arSettings["lang"] = "en"; 60 | return "var nocaptchaSettings=".json_encode($this->arSettings).";"; 61 | } 62 | 63 | private function GenerateScriptUrl() 64 | { 65 | $params = array("public_key" => $this->publicKey); 66 | return self::API_SERVER."/captcha".self::JoinParams($params); 67 | } 68 | 69 | public static function AddSettingsAndScript() 70 | { 71 | global $APPLICATION; 72 | $inst = self::GetInstance(); 73 | $APPLICATION->AddHeadString(''); 75 | $APPLICATION->AddHeadScript($inst->GenerateScriptUrl()); 76 | } 77 | 78 | public function Check($captchaId, $captchaValue) 79 | { 80 | $params = array( 81 | "private_key" => $this->privateKey, 82 | "captcha_id" => $captchaId, 83 | "captcha_value" => $captchaValue, 84 | ); 85 | $url = self::API_SERVER."/check".self::JoinParams($params); 86 | 87 | $resp = @file_get_contents($url); 88 | if($resp === false) 89 | { 90 | return "request failed"; 91 | } 92 | $data = json_decode($resp); 93 | if (!$data) 94 | { 95 | return "invalid response"; 96 | } 97 | if ($data->status !== "ok") 98 | { 99 | return "service returned an error: ".$data->desc; 100 | } 101 | if (!$data->is_correct) 102 | { 103 | return false; 104 | } 105 | return true; 106 | } 107 | 108 | public function AddContainerId($id) 109 | { 110 | if (!isset($this->arSettings["containers"])) 111 | $this->arSettings["containers"] = array(); 112 | $this->arSettings["containers"][] = $id; 113 | } 114 | 115 | public function GenerateContainerId() 116 | { 117 | $id = "nocaptcha".$this->nextId++; 118 | $this->AddContainerId($id); 119 | return $id; 120 | } 121 | } 122 | ?> 123 | -------------------------------------------------------------------------------- /mailru.nocaptcha/options.php: -------------------------------------------------------------------------------- 1 | IsAdmin()) 3 | return; 4 | 5 | define(BX_NOCAPTCHA_MODULE_ID, "mailru.nocaptcha"); 6 | 7 | IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/options.php"); 8 | IncludeModuleLangFile(__FILE__); 9 | 10 | require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/".BX_NOCAPTCHA_MODULE_ID."/default_option.php"); 11 | 12 | $options = array( 13 | array("public_key", GetMessage("NOCAPTCHA_PUBLIC_KEY"), $nocaptcha_default_option["public_key"], 14 | array("text", 40, 64, false)), 15 | array("private_key", GetMessage("NOCAPTCHA_PRIVATE_KEY"), $nocaptcha_default_option["private_key"], 16 | array("text", 40, 64, true)), 17 | array("ru_langs", GetMessage("NOCAPTCHA_RU_LANGS"), $nocaptcha_default_option["ru_langs"], 18 | array("text", 40, 20, false)), 19 | array("replace", GetMessage("NOCAPTCHA_REPLACE"), $nocaptcha_default_option["replace"], 20 | array("checkbox")), 21 | ); 22 | 23 | $tabs = array( 24 | array("DIV" => "edit1", 25 | "TAB" => GetMessage("MAIN_TAB_SET"), 26 | "ICON" => "ib_settings", 27 | "TITLE" => GetMessage("MAIN_TAB_TITLE_SET")), 28 | ); 29 | 30 | $tabControl = new CAdminTabControl("tabControl", $tabs); 31 | 32 | if ($REQUEST_METHOD == "POST" && strlen($Update . $Apply . $RestoreDefaults) > 0 33 | && check_bitrix_sessid()) 34 | { 35 | if (strlen($RestoreDefaults) > 0) 36 | COption::RemoveOption(BX_NOCAPTCHA_MODULE_ID); 37 | else 38 | { 39 | foreach ($options as $option) 40 | { 41 | $name = $option[0]; 42 | $val = $_REQUEST[$name]; 43 | if ($option[2][0] == "checkbox" && $val != "Y") 44 | $val = "N"; 45 | COption::SetOptionString(BX_NOCAPTCHA_MODULE_ID, $name, $val, $caption); 46 | } 47 | } 48 | if (strlen($Update) > 0 && strlen($_REQUEST["back_url_settings"]) > 0) 49 | LocalRedirect($_REQUEST["back_url_settings"]); 50 | else 51 | LocalRedirect($APPLICATION->GetCurPage() . "?mid=" . urlencode($mid) . "&lang=" . urlencode(LANGUAGE_ID) . "&back_url_settings=" . urlencode($_REQUEST["back_url_settings"]) . "&" . $tabControl->ActiveTabParam() . "&mid_menu=1"); 52 | } 53 | 54 | $tabControl->Begin(); 55 | ?> 56 |
57 | BeginNextTab(); 59 | 60 | foreach ($options as $option): 61 | $name = $option[0]; 62 | $caption = $option[1]; 63 | $val = COption::GetOptionString(BX_NOCAPTCHA_MODULE_ID, $name, $option[2]); 64 | $type = $option[3]; 65 | ?> 66 | 67 | 68 | 69 | 70 | 71 | 72 | > 73 | 74 | > 75 | 76 | 77 | 78 | 79 | 80 | 81 | Buttons();?> 82 | " title="" class="adm-btn-save"> 83 | " title=""> 84 | 0): ?> 85 | " title="" onclick="window.location=''"> 86 | "> 87 | 88 | " onclick="return confirm('')" value=""> 89 | 90 | End();?> 91 |
92 | -------------------------------------------------------------------------------- /README.asciidoc: -------------------------------------------------------------------------------- 1 | nocaptcha-bitrix 2 | ================ 3 | 4 | == Краткое описание 5 | 6 | Модуль CMS Bitrix для работы с сервисом Некапча Mail.Ru. 7 | 8 | Некапча - это интеллектуальный сервис капчи, способный избавить большинство 9 | реальных пользователей от разгадывания рисунка капчи, вместе с тем не ухудшая 10 | защиту от спам-ботов. Сервис успешно используется как в наших внутренних 11 | проектах, так и на сайтах, не связанных с Mail.Ru. 12 | 13 | Подробнее: https://nocaptcha.mail.ru[сайт], 14 | https://nocaptcha.mail.ru/docs[документация], 15 | http://habrahabr.ru/company/mailru/blog/255633/[статья на Хабрахабре] 16 | 17 | Обратная связь: nocaptcha@corp.mail.ru 18 | 19 | == Установка 20 | 21 | Перед использованием модуля необходимо зарегистрировать свой домен на 22 | https://nocaptcha.mail.ru[сайте Некапчи]. 23 | 24 | 1. Копируем директорию _nocaptcha_ в _bitrix/modules_. 25 | 2. Устанавливаем модуль в административной панели в разделе _Настройки > 26 | Настройки продукта > Модули_. 27 | 3. Настраиваем модуль в административной панели в разделе _Настройки > 28 | Настройки продукта > Настройки модулей > Некапча Mail.Ru_. 29 | 30 | == Настройка 31 | 32 | Публичный и секретный ключ:: 33 | Ключи для генерации скрипта Некапчи и проверки введенного кода. 34 | Создаются при регистрации домена на сайте Некапчи. 35 | 36 | Использовать русскоязычный виджет для языков (через запятую):: 37 | Коды языков, для которых виджет будет отображаться на русском языке. Для 38 | всех других языков - на английском. Пример: +ru,be,kz,uk+. 39 | 40 | Заменить стандартную капчу (требуется отредактировать шаблоны):: 41 | Позволяет заменить стандартную капчу CMS Bitrix на Некапчу Mail.Ru. Для 42 | полной замены требуется отредактировать шаблоны, где используется 43 | стандартная капча. 44 | 45 | == Использование 46 | 47 | === Добавление виджета 48 | 49 | Виджет можно встроить в визуальном редакторе. Он расположен в списке 50 | компонентов _Компоненты > Служебные > Виджет Некапчи Mail.Ru_. 51 | 52 | Другим способом добавления является вызов компонента из кода: 53 | 54 | [source,php] 55 | ---- 56 | global $APPLICATION; 57 | $APPLICATION->IncludeComponent("mailru:nocaptcha.widget", ""); 58 | ---- 59 | 60 | Встраивание скрипта и настроек в +head+ страницы, добавление контейнера происходит 61 | автоматически. 62 | 63 | Доступные параметры компонента: 64 | 65 | +ID+:: ID контейнера. По умолчанию генерируется автоматически. 66 | +TABINDEX+:: tabindex поля для ввода кода. Требуется для корректной 67 | настройки последовательности переключения полей по TAB. 68 | 69 | [source,php] 70 | ---- 71 | global $APPLICATION; 72 | $APPLICATION->IncludeComponent("mailru:nocaptcha.widget", "", 73 | array("TABINDEX" => "4")); 74 | ---- 75 | 76 | Шаблон компонента всегда используется стандартный и менять его нельзя. 77 | 78 | === Проверка введенного кода 79 | 80 | Если виджет Некапчи встроен в форму корректно, то в обработчик передаются 81 | параметры +captcha_id+ и +captcha_value+. Пример кода для проверки капчи: 82 | 83 | [source,php] 84 | ---- 85 | CModule::IncludeModule("nocaptcha"); 86 | if (CNocaptcha::GetInstance()->Check($_REQUEST["captcha_id"], 87 | $_REQUEST["captcha_value"]) === true) 88 | { 89 | // ок 90 | } 91 | else 92 | { 93 | // введен неверный код 94 | } 95 | ---- 96 | 97 | Если в настройках установлена замена стандартной капчи, то для проверки можно 98 | использовать стандартную функцию +CaptchaCheckCode()+: 99 | 100 | [source,php] 101 | ---- 102 | global $APPLICATION; 103 | if ($APPLICATION->CaptchaCheckCode($_REQUEST["captcha_value"], 104 | $_REQUEST["captcha_id"])) 105 | { 106 | // ок 107 | } 108 | else 109 | { 110 | // введен неверный код 111 | } 112 | ---- 113 | 114 | == FAQ 115 | 116 | === Как отредактировать шаблон со стандартной капчей? 117 | 118 | 1. Если шаблон системный, то копируем его в текущий шаблон сайта. Например, из 119 | _bitrix/components/bitrix/system.auth.registration/templates/.default_ в 120 | _bitrix/templates/my_site_template/components/bitrix/system.auth.registration/.default_. 121 | 2. В шаблоне заменяем верстку стандартной капчи на вызов компонента виджета 122 | Некапчи. 123 | + 124 | Было: 125 | + 126 | [source,php] 127 | ---- 128 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | " /> 139 | " width="180" height="40" alt="CAPTCHA" /> 140 | 141 | 142 | 143 | *: 144 | 145 | 146 | 149 | ---- 150 | + 151 | Стало: 152 | + 153 | [source,php] 154 | ---- 155 | 159 | 160 | 161 | 162 | 163 | * 164 | IncludeComponent("mailru:nocaptcha.widget"); ?> 165 | 166 | 169 | ---- 170 | 171 | == Лицензия 172 | 173 | image:http://i.creativecommons.org/p/zero/1.0/88x31.png["CC0",link="http://creativecommons.org/publicdomain/zero/1.0/"] 174 | 175 | По мере возможности в соответствии с законодательством, Mail.Ru отказался от 176 | всех авторских прав и смежных прав на модуль CMS Bitrix для работы с сервисом 177 | Некапча Mail.Ru 178 | --------------------------------------------------------------------------------