Initial commit: OCA Website packages (16 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:06 +02:00
commit 0578ef7638
660 changed files with 37334 additions and 0 deletions

View file

@ -0,0 +1,46 @@
# Website reCAPTCHA v2
Odoo addon: website_recaptcha_v2
## Installation
```bash
pip install odoo-bringout-oca-website-website_recaptcha_v2
```
## Dependencies
This addon depends on:
- website
## Manifest Information
- **Name**: Website reCAPTCHA v2
- **Version**: 16.0.1.0.0
- **Category**: Website
- **License**: AGPL-3
- **Installable**: False
## Source
Based on [OCA/website](https://github.com/OCA/website) branch 16.0, addon `website_recaptcha_v2`.
## License
This package maintains the original AGPL-3 license from the upstream Odoo project.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Reports: doc/REPORTS.md
- Security: doc/SECURITY.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md

View file

@ -0,0 +1,32 @@
# Architecture
```mermaid
flowchart TD
U[Users] -->|HTTP| V[Views and QWeb Templates]
V --> C[Controllers]
V --> W[Wizards Transient Models]
C --> M[Models and ORM]
W --> M
M --> R[Reports]
DX[Data XML] --> M
S[Security ACLs and Groups] -. enforces .-> M
subgraph Website_recaptcha_v2 Module - website_recaptcha_v2
direction LR
M:::layer
W:::layer
C:::layer
V:::layer
R:::layer
S:::layer
DX:::layer
end
classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px
```
Notes
- Views include tree/form/kanban templates and report templates.
- Controllers provide website/portal routes when present.
- Wizards are UI flows implemented with `models.TransientModel`.
- Data XML loads data/demo records; Security defines groups and access.

View file

@ -0,0 +1,3 @@
# Configuration
Refer to Odoo settings for website_recaptcha_v2. Configure related models, access rights, and options as needed.

View file

@ -0,0 +1,3 @@
# Controllers
This module does not define custom HTTP controllers.

View file

@ -0,0 +1,5 @@
# Dependencies
This addon depends on:
- [website](../../odoo-bringout-oca-ocb-website)

View file

@ -0,0 +1,4 @@
# FAQ
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
- Q: How to enable? A: Start server with --addon website_recaptcha_v2 or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-website-website_recaptcha_v2"
# or
uv pip install odoo-bringout-oca-website-website_recaptcha_v2"
```

View file

@ -0,0 +1,13 @@
# Models
Detected core models and extensions in website_recaptcha_v2.
```mermaid
classDiagram
class res_config_settings
class website
```
Notes
- Classes show model technical names; fields omitted for brevity.
- Items listed under _inherit are extensions of existing models.

View file

@ -0,0 +1,6 @@
# Overview
Packaged Odoo addon: website_recaptcha_v2. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon website_recaptcha_v2
- License: LGPL-3

View file

@ -0,0 +1,3 @@
# Reports
This module does not define custom reports.

View file

@ -0,0 +1,8 @@
# Security
This module does not define custom security rules or access controls beyond Odoo defaults.
Default Odoo security applies:
- Base user access through standard groups
- Model access inherited from dependencies
- No custom row-level security rules

View file

@ -0,0 +1,5 @@
# Troubleshooting
- Ensure Python and Odoo environment matches repo guidance.
- Check database connectivity and logs if startup fails.
- Validate that dependent addons listed in DEPENDENCIES.md are installed.

View file

@ -0,0 +1,7 @@
# Usage
Start Odoo including this addon (from repo root):
```bash
python3 scripts/nix_odoo_web_server.py --db-name mydb --addon website_recaptcha_v2
```

View file

@ -0,0 +1,3 @@
# Wizards
This module does not include UI wizards.

View file

@ -0,0 +1,42 @@
[project]
name = "odoo-bringout-oca-website-website_recaptcha_v2"
version = "16.0.0"
description = "Website reCAPTCHA v2 - Helper module to add reCAPTCHA v2 to website forms"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-ocb-website>=16.0.0",
"requests>=2.25.1"
]
readme = "README.md"
requires-python = ">= 3.11"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Office/Business",
]
[project.urls]
homepage = "https://github.com/bringout/0"
repository = "https://github.com/bringout/0"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["website_recaptcha_v2"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]

View file

@ -0,0 +1,106 @@
====================
Website reCAPTCHA v2
====================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:55856dbbdf9c9efc1b9b1ebbb33638a0018eda0d91bd6c8c9e30805aa8f2e5b0
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fwebsite-lightgray.png?logo=github
:target: https://github.com/OCA/website/tree/16.0/website_recaptcha_v2
:alt: OCA/website
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/website-16-0/website-16-0-website_recaptcha_v2
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/website&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module allows to use reCAPTCHA v2 on website forms.
It is a helper module that only provides the widget and the validation logic
which can be used by other modules to actually display it on website forms and
check whether the user entry is valid.
This module originally comes from ``website_recaptcha_reloaded`` from Tech
Receptives, which itself comes from ``website_recaptcha`` from Elico Corp.
**Table of contents**
.. contents::
:local:
Configuration
=============
reCAPTCHA is configured in Settings > Website. It can be enabled or disabled
using the checkbox, and the site and secret keys can be defined there when it
is enabled.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/website/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/website/issues/new?body=module:%20website_recaptcha_v2%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Elico Corp
* Tech Receptives
* Coop IT Easy SC
Contributors
~~~~~~~~~~~~
* `Elico Corp <https://elico-corp.com>`_:
* Augustin Cisterne-Kaas
* `Tech Receptives <https://techreceptives.com>`_:
* Parthiv Patel
* Hardik Kalariya
* `Coop IT Easy SC <https://coopiteasy.be>`_:
* Houssine Bakkali
* Robin Keunen
* Carmen Bianca Bakker
* Victor Champonnois
* hugues de keyzer
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
This module is part of the `OCA/website <https://github.com/OCA/website/tree/16.0/website_recaptcha_v2>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1,7 @@
# SPDX-FileCopyrightText: 2010-2014 Elico Corp
# SPDX-FileContributor: Augustin Cisterne-Kaas <augustin.cisterne-kaas@elico-corp.com>
# SPDX-FileCopyrightText: 2015 Tech-Receptives Solutions Pvt. Ltd.
#
# SPDX-License-Identifier: AGPL-3.0-or-later
from . import models

View file

@ -0,0 +1,27 @@
# SPDX-FileCopyrightText: 2010-2014 Elico Corp
# SPDX-FileContributor: Augustin Cisterne-Kaas <augustin.cisterne-kaas@elico-corp.com>
# SPDX-FileCopyrightText: 2015 Tech-Receptives Solutions Pvt. Ltd.
# SPDX-FileCopyrightText: 2019 Coop IT Easy SC
#
# SPDX-License-Identifier: AGPL-3.0-or-later
{
"name": "Website reCAPTCHA v2",
"version": "16.0.1.0.0",
"category": "Website",
"depends": ["website"],
"author": (
"Elico Corp, Tech Receptives, Coop IT Easy SC, "
"Odoo Community Association (OCA)"
),
"license": "AGPL-3",
"website": "https://github.com/OCA/website",
"summary": "Helper module to add reCAPTCHA v2 to website forms",
"data": [
"views/res_config_settings_view.xml",
"views/website_templates.xml",
],
"demo": [
"demo/demo.xml",
],
}

View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8" ?>
<!--
SPDX-FileCopyrightText: 2022 Coop IT Easy SC
SPDX-License-Identifier: AGPL-3.0-or-later
-->
<odoo>
<record id="website.default_website" model="website">
<field name="recaptcha_v2_enabled">True</field>
<!--
reCAPTCHA test keys from https://developers.google.com/recaptcha/docs/faq
-->
<field
name="recaptcha_v2_site_key"
>6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI</field>
<field
name="recaptcha_v2_secret_key"
>6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe</field>
</record>
</odoo>

View file

@ -0,0 +1,136 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * website_recaptcha_v2
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: website_recaptcha_v2
#: model_terms:ir.ui.view,arch_db:website_recaptcha_v2.res_config_settings_view_form
msgid ""
"<i class=\"fa fa-arrow-right\"/>\n"
" Get reCAPTCHA v2 keys"
msgstr ""
#. module: website_recaptcha_v2
#: model_terms:ir.ui.view,arch_db:website_recaptcha_v2.res_config_settings_view_form
msgid ""
"<span class=\"fa fa-lg fa-globe\" title=\"Values set here are website-"
"specific.\" groups=\"website.group_multi_website\"/>"
msgstr ""
#. module: website_recaptcha_v2
#: model:ir.model,name:website_recaptcha_v2.model_res_config_settings
msgid "Config Settings"
msgstr "Postavke"
#. module: website_recaptcha_v2
#: model:ir.model.fields,field_description:website_recaptcha_v2.field_res_config_settings__recaptcha_v2_enabled
#: model:ir.model.fields,field_description:website_recaptcha_v2.field_website__recaptcha_v2_enabled
msgid "Enable reCAPTCHA v2"
msgstr "omogući reCAPTCHA v2"
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid "No response given."
msgstr "Jedna zvezda"
#. module: website_recaptcha_v2
#: model_terms:ir.ui.view,arch_db:website_recaptcha_v2.res_config_settings_view_form
msgid "Protect your forms using reCAPTCHA v2"
msgstr "Jedna zvezda od pet"
#. module: website_recaptcha_v2
#: model:ir.model.fields,field_description:website_recaptcha_v2.field_res_config_settings__recaptcha_v2_secret_key
#: model:ir.model.fields,field_description:website_recaptcha_v2.field_website__recaptcha_v2_secret_key
msgid "Secret Key (v2)"
msgstr "Secret Key (v2)"
#. module: website_recaptcha_v2
#: model:ir.model.fields,field_description:website_recaptcha_v2.field_res_config_settings__recaptcha_v2_site_key
#: model:ir.model.fields,field_description:website_recaptcha_v2.field_website__recaptcha_v2_site_key
msgid "Site Key (v2)"
msgstr "Site Key (v2)"
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid "The challenge was not successfully completed."
msgstr "Ukloni selekciju"
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid "The request is invalid or malformed."
msgstr "Tri zvezde od pet"
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid ""
"The response is no longer valid: either is too old or has been used "
"previously."
msgstr ""
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid "The response parameter is invalid or malformed."
msgstr "The response parameter is invalid or malformed."
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid "The response parameter is missing."
msgstr "The response parameter is missing."
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid "The secret parameter is invalid or malformed."
msgstr "The secret parameter is invalid or malformed."
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid "The secret parameter is missing."
msgstr "The secret parameter is missing."
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid "Unknown reCAPTCHA error (error code: {errorcode})."
msgstr "Unknown reCAPTCHA greška (greška code: {errorcode})."
#. module: website_recaptcha_v2
#: model:ir.model,name:website_recaptcha_v2.model_website
msgid "Website"
msgstr "Web stranica"
#. module: website_recaptcha_v2
#: model_terms:ir.ui.view,arch_db:website_recaptcha_v2.res_config_settings_view_form
msgid "reCAPTCHA icon"
msgstr "reCAPTCHA icon"
#. module: website_recaptcha_v2
#: model_terms:ir.ui.view,arch_db:website_recaptcha_v2.res_config_settings_view_form
msgid "reCAPTCHA v2"
msgstr "reCAPTCHA v2"

View file

@ -0,0 +1,144 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * website_recaptcha_v2
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-12-04 12:06+0000\n"
"Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
"Language-Team: none\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.6.2\n"
#. module: website_recaptcha_v2
#: model_terms:ir.ui.view,arch_db:website_recaptcha_v2.res_config_settings_view_form
msgid ""
"<i class=\"fa fa-arrow-right\"/>\n"
" Get reCAPTCHA v2 keys"
msgstr ""
"<i class=\"fa fa-arrow-right\"/>\n"
" Ottieni chiavi reCAPTCHA v2"
#. module: website_recaptcha_v2
#: model_terms:ir.ui.view,arch_db:website_recaptcha_v2.res_config_settings_view_form
msgid ""
"<span class=\"fa fa-lg fa-globe\" title=\"Values set here are website-"
"specific.\" groups=\"website.group_multi_website\"/>"
msgstr ""
"<span class=\"fa fa-lg fa-globe\" title=\"I valori impostati qui sono "
"specifici per sito web.\" groups=\"website.group_multi_website\"/>"
#. module: website_recaptcha_v2
#: model:ir.model,name:website_recaptcha_v2.model_res_config_settings
msgid "Config Settings"
msgstr "Impostazioni configurazione"
#. module: website_recaptcha_v2
#: model:ir.model.fields,field_description:website_recaptcha_v2.field_res_config_settings__recaptcha_v2_enabled
#: model:ir.model.fields,field_description:website_recaptcha_v2.field_website__recaptcha_v2_enabled
msgid "Enable reCAPTCHA v2"
msgstr "Abilita reCAPTCHA v2"
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid "No response given."
msgstr "Nessuna risposta data."
#. module: website_recaptcha_v2
#: model_terms:ir.ui.view,arch_db:website_recaptcha_v2.res_config_settings_view_form
msgid "Protect your forms using reCAPTCHA v2"
msgstr "Proteggere i propri moduli usando reCAPTCHA v2"
#. module: website_recaptcha_v2
#: model:ir.model.fields,field_description:website_recaptcha_v2.field_res_config_settings__recaptcha_v2_secret_key
#: model:ir.model.fields,field_description:website_recaptcha_v2.field_website__recaptcha_v2_secret_key
msgid "Secret Key (v2)"
msgstr "Chiave segreta (v2)"
#. module: website_recaptcha_v2
#: model:ir.model.fields,field_description:website_recaptcha_v2.field_res_config_settings__recaptcha_v2_site_key
#: model:ir.model.fields,field_description:website_recaptcha_v2.field_website__recaptcha_v2_site_key
msgid "Site Key (v2)"
msgstr "Chiave sito (v2)"
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid "The challenge was not successfully completed."
msgstr "La verifica non è stata completata con successo."
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid "The request is invalid or malformed."
msgstr "La richiesta non è valida o malformato."
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid ""
"The response is no longer valid: either is too old or has been used "
"previously."
msgstr ""
"La risposta non è più valida: è troppo vecchia o è già stata utilizzata."
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid "The response parameter is invalid or malformed."
msgstr "Il parametro della risposta non è valido o malformato."
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid "The response parameter is missing."
msgstr "Manca il parametro della risposta."
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid "The secret parameter is invalid or malformed."
msgstr "Il parametro segreto non è valido o malformato."
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid "The secret parameter is missing."
msgstr "Manca il parametro segreto."
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid "Unknown reCAPTCHA error (error code: {errorcode})."
msgstr "Errore reCAPTCHA sconosciuto (codice errore: {errorcode})."
#. module: website_recaptcha_v2
#: model:ir.model,name:website_recaptcha_v2.model_website
msgid "Website"
msgstr "Sito web"
#. module: website_recaptcha_v2
#: model_terms:ir.ui.view,arch_db:website_recaptcha_v2.res_config_settings_view_form
msgid "reCAPTCHA icon"
msgstr "Icona reCAPTCHA"
#. module: website_recaptcha_v2
#: model_terms:ir.ui.view,arch_db:website_recaptcha_v2.res_config_settings_view_form
msgid "reCAPTCHA v2"
msgstr "reCAPTCHA v2"

View file

@ -0,0 +1,136 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * website_recaptcha_v2
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: website_recaptcha_v2
#: model_terms:ir.ui.view,arch_db:website_recaptcha_v2.res_config_settings_view_form
msgid ""
"<i class=\"fa fa-arrow-right\"/>\n"
" Get reCAPTCHA v2 keys"
msgstr ""
#. module: website_recaptcha_v2
#: model_terms:ir.ui.view,arch_db:website_recaptcha_v2.res_config_settings_view_form
msgid ""
"<span class=\"fa fa-lg fa-globe\" title=\"Values set here are website-"
"specific.\" groups=\"website.group_multi_website\"/>"
msgstr ""
#. module: website_recaptcha_v2
#: model:ir.model,name:website_recaptcha_v2.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: website_recaptcha_v2
#: model:ir.model.fields,field_description:website_recaptcha_v2.field_res_config_settings__recaptcha_v2_enabled
#: model:ir.model.fields,field_description:website_recaptcha_v2.field_website__recaptcha_v2_enabled
msgid "Enable reCAPTCHA v2"
msgstr ""
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid "No response given."
msgstr ""
#. module: website_recaptcha_v2
#: model_terms:ir.ui.view,arch_db:website_recaptcha_v2.res_config_settings_view_form
msgid "Protect your forms using reCAPTCHA v2"
msgstr ""
#. module: website_recaptcha_v2
#: model:ir.model.fields,field_description:website_recaptcha_v2.field_res_config_settings__recaptcha_v2_secret_key
#: model:ir.model.fields,field_description:website_recaptcha_v2.field_website__recaptcha_v2_secret_key
msgid "Secret Key (v2)"
msgstr ""
#. module: website_recaptcha_v2
#: model:ir.model.fields,field_description:website_recaptcha_v2.field_res_config_settings__recaptcha_v2_site_key
#: model:ir.model.fields,field_description:website_recaptcha_v2.field_website__recaptcha_v2_site_key
msgid "Site Key (v2)"
msgstr ""
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid "The challenge was not successfully completed."
msgstr ""
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid "The request is invalid or malformed."
msgstr ""
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid ""
"The response is no longer valid: either is too old or has been used "
"previously."
msgstr ""
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid "The response parameter is invalid or malformed."
msgstr ""
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid "The response parameter is missing."
msgstr ""
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid "The secret parameter is invalid or malformed."
msgstr ""
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid "The secret parameter is missing."
msgstr ""
#. module: website_recaptcha_v2
#. odoo-python
#: code:addons/website_recaptcha_v2/models/website.py:0
#, python-format
msgid "Unknown reCAPTCHA error (error code: {errorcode})."
msgstr ""
#. module: website_recaptcha_v2
#: model:ir.model,name:website_recaptcha_v2.model_website
msgid "Website"
msgstr ""
#. module: website_recaptcha_v2
#: model_terms:ir.ui.view,arch_db:website_recaptcha_v2.res_config_settings_view_form
msgid "reCAPTCHA icon"
msgstr ""
#. module: website_recaptcha_v2
#: model_terms:ir.ui.view,arch_db:website_recaptcha_v2.res_config_settings_view_form
msgid "reCAPTCHA v2"
msgstr ""

View file

@ -0,0 +1,9 @@
# SPDX-FileCopyrightText: 2010-2014 Elico Corp
# SPDX-FileContributor: Augustin Cisterne-Kaas <augustin.cisterne-kaas@elico-corp.com>
# SPDX-FileCopyrightText: 2015 Tech-Receptives Solutions Pvt. Ltd.
# SPDX-FileCopyrightText: 2022 Coop IT Easy SC
#
# SPDX-License-Identifier: AGPL-3.0-or-later
from . import res_config_settings
from . import website

View file

@ -0,0 +1,23 @@
# SPDX-FileCopyrightText: 2010-2014 Elico Corp
# SPDX-FileContributor: Augustin Cisterne-Kaas <augustin.cisterne-kaas@elico-corp.com>
# SPDX-FileCopyrightText: 2015 Tech-Receptives Solutions Pvt. Ltd.
# SPDX-FileCopyrightText: 2019 Simone Orsi - Camptocamp SA
# SPDX-FileCopyrightText: 2019 Coop IT Easy SC
#
# SPDX-License-Identifier: AGPL-3.0-or-later
from odoo import fields, models
class ResConfigSettings(models.TransientModel):
_inherit = "res.config.settings"
recaptcha_v2_enabled = fields.Boolean(
related="website_id.recaptcha_v2_enabled", readonly=False
)
recaptcha_v2_site_key = fields.Char(
related="website_id.recaptcha_v2_site_key", readonly=False
)
recaptcha_v2_secret_key = fields.Char(
related="website_id.recaptcha_v2_secret_key", readonly=False
)

View file

@ -0,0 +1,77 @@
# SPDX-FileCopyrightText: 2010-2014 Elico Corp
# SPDX-FileContributor: Augustin Cisterne-Kaas <augustin.cisterne-kaas@elico-corp.com>
# SPDX-FileCopyrightText: 2015 Tech-Receptives Solutions Pvt. Ltd.
# SPDX-FileCopyrightText: 2019 Simone Orsi - Camptocamp SA
# SPDX-FileCopyrightText: 2019 Coop IT Easy SC
#
# SPDX-License-Identifier: AGPL-3.0-or-later
import requests
from odoo import _, api, fields, models
RECAPTCHA_API_URL = "https://www.recaptcha.net/recaptcha/api/siteverify"
RECAPTCHA_API_TIMEOUT = 30
class Website(models.Model):
_inherit = "website"
recaptcha_v2_enabled = fields.Boolean("Enable reCAPTCHA v2")
recaptcha_v2_site_key = fields.Char("Site Key (v2)")
recaptcha_v2_secret_key = fields.Char("Secret Key (v2)")
@api.model
def _get_error_message(self, errorcode=None):
mapping = {
"missing-input-secret": _("The secret parameter is missing."),
"invalid-input-secret": _("The secret parameter is invalid or malformed."),
"missing-input-response": _("The response parameter is missing."),
"invalid-input-response": _(
"The response parameter is invalid or malformed."
),
"bad-request": _("The request is invalid or malformed."),
"timeout-or-duplicate": _(
"The response is no longer valid: either is too old or has "
"been used previously."
),
}
return mapping.get(
errorcode,
_(
"Unknown reCAPTCHA error (error code: {errorcode}).".format(
errorcode=errorcode
)
),
)
def is_recaptcha_v2_valid(self, form_values):
"""
Checks whether the reCAPTCHA v2 challenge has been correctly solved.
form_values must be a dictionary containing the form values.
Returns a (bool, str) tuple. The first element tells whether the
CAPTCHA is valid or not. The second is the error message when
applicable (or an empty string).
If reCAPTCHA is disabled in the settings, this method behaves as if
the CAPTCHA was correctly solved, but without doing any check.
"""
if not self.recaptcha_v2_enabled:
return (True, "")
response = form_values.get("g-recaptcha-response")
if not response:
return (False, _("No response given."))
get_res = {"secret": self.recaptcha_v2_secret_key, "response": response}
res = requests.post(
RECAPTCHA_API_URL, data=get_res, timeout=RECAPTCHA_API_TIMEOUT
).json()
error_msg = "\n".join(
self._get_error_message(error) for error in res.get("error-codes", [])
)
if error_msg:
return (False, error_msg)
if not res.get("success"):
return (False, _("The challenge was not successfully completed."))
return (True, "")

View file

@ -0,0 +1,3 @@
reCAPTCHA is configured in Settings > Website. It can be enabled or disabled
using the checkbox, and the site and secret keys can be defined there when it
is enabled.

View file

@ -0,0 +1,15 @@
* `Elico Corp <https://elico-corp.com>`_:
* Augustin Cisterne-Kaas
* `Tech Receptives <https://techreceptives.com>`_:
* Parthiv Patel
* Hardik Kalariya
* `Coop IT Easy SC <https://coopiteasy.be>`_:
* Houssine Bakkali
* Robin Keunen
* Carmen Bianca Bakker
* Victor Champonnois
* hugues de keyzer

View file

@ -0,0 +1,8 @@
This module allows to use reCAPTCHA v2 on website forms.
It is a helper module that only provides the widget and the validation logic
which can be used by other modules to actually display it on website forms and
check whether the user entry is valid.
This module originally comes from ``website_recaptcha_reloaded`` from Tech
Receptives, which itself comes from ``website_recaptcha`` from Elico Corp.

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -0,0 +1,451 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>Website reCAPTCHA v2</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="website-recaptcha-v2">
<h1 class="title">Website reCAPTCHA v2</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:55856dbbdf9c9efc1b9b1ebbb33638a0018eda0d91bd6c8c9e30805aa8f2e5b0
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/website/tree/16.0/website_recaptcha_v2"><img alt="OCA/website" src="https://img.shields.io/badge/github-OCA%2Fwebsite-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/website-16-0/website-16-0-website_recaptcha_v2"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/website&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module allows to use reCAPTCHA v2 on website forms.</p>
<p>It is a helper module that only provides the widget and the validation logic
which can be used by other modules to actually display it on website forms and
check whether the user entry is valid.</p>
<p>This module originally comes from <tt class="docutils literal">website_recaptcha_reloaded</tt> from Tech
Receptives, which itself comes from <tt class="docutils literal">website_recaptcha</tt> from Elico Corp.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#configuration" id="toc-entry-1">Configuration</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-5">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#toc-entry-1">Configuration</a></h1>
<p>reCAPTCHA is configured in Settings &gt; Website. It can be enabled or disabled
using the checkbox, and the site and secret keys can be defined there when it
is enabled.</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-2">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/website/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/website/issues/new?body=module:%20website_recaptcha_v2%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-4">Authors</a></h2>
<ul class="simple">
<li>Elico Corp</li>
<li>Tech Receptives</li>
<li>Coop IT Easy SC</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-5">Contributors</a></h2>
<ul class="simple">
<li><a class="reference external" href="https://elico-corp.com">Elico Corp</a>:<ul>
<li>Augustin Cisterne-Kaas</li>
</ul>
</li>
<li><a class="reference external" href="https://techreceptives.com">Tech Receptives</a>:<ul>
<li>Parthiv Patel</li>
<li>Hardik Kalariya</li>
</ul>
</li>
<li><a class="reference external" href="https://coopiteasy.be">Coop IT Easy SC</a>:<ul>
<li>Houssine Bakkali</li>
<li>Robin Keunen</li>
<li>Carmen Bianca Bakker</li>
<li>Victor Champonnois</li>
<li>hugues de keyzer</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-6">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/website/tree/16.0/website_recaptcha_v2">OCA/website</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View file

@ -0,0 +1,5 @@
# SPDX-FileCopyrightText: 2022 Coop IT Easy SC
#
# SPDX-License-Identifier: AGPL-3.0-or-later
from . import test_recaptcha

View file

@ -0,0 +1,128 @@
# SPDX-FileCopyrightText: 2022 Coop IT Easy SC
#
# SPDX-License-Identifier: AGPL-3.0-or-later
from unittest import mock
from odoo.tests.common import TransactionCase
imp_requests = "odoo.addons.website_recaptcha_v2.models.website.requests"
class TestRecaptcha(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.website = cls.env.ref("website.default_website")
cls.website.write(
{
"recaptcha_v2_enabled": True,
"recaptcha_v2_site_key": "test-site",
"recaptcha_v2_secret_key": "test-secret",
}
)
@mock.patch(imp_requests)
def test_captcha_http_request(self, requests_mock):
self.website.is_recaptcha_v2_valid({"g-recaptcha-response": "dummy_response"})
requests_mock.post.assert_called_once_with(
"https://www.recaptcha.net/recaptcha/api/siteverify",
data={
"secret": "test-secret",
"response": "dummy_response",
},
timeout=30,
)
@mock.patch(imp_requests)
def test_captcha_valid(self, requests_mock):
requests_mock.post().json.return_value = {"success": True}
result, error_msg = self.website.is_recaptcha_v2_valid(
{"g-recaptcha-response": "dummy_response"}
)
self.assertTrue(result)
self.assertEqual(error_msg, "")
@mock.patch(imp_requests)
def test_captcha_single_error(self, requests_mock):
requests_mock.post().json.return_value = {
"error-codes": ["missing-input-secret"]
}
result, error_msg = self.website.is_recaptcha_v2_valid(
{"g-recaptcha-response": "dummy_response"}
)
self.assertFalse(result)
self.assertEqual(error_msg, "The secret parameter is missing.")
@mock.patch(imp_requests)
def test_captcha_multiple_errors(self, requests_mock):
requests_mock.post().json.return_value = {
"error-codes": ["invalid-input-secret", "missing-input-response"]
}
result, error_msg = self.website.is_recaptcha_v2_valid(
{"g-recaptcha-response": "dummy_response"}
)
self.assertFalse(result)
self.assertEqual(
error_msg,
"The secret parameter is invalid or malformed.\n"
"The response parameter is missing.",
)
@mock.patch(imp_requests)
def test_captcha_false_success(self, requests_mock):
requests_mock.post().json.return_value = {"success": False}
result, error_msg = self.website.is_recaptcha_v2_valid(
{"g-recaptcha-response": "dummy_response"}
)
self.assertFalse(result)
self.assertEqual(error_msg, "The challenge was not successfully completed.")
@mock.patch(imp_requests)
def test_captcha_empty_response(self, requests_mock):
requests_mock.post().json.return_value = {}
result, error_msg = self.website.is_recaptcha_v2_valid(
{"g-recaptcha-response": "dummy_response"}
)
self.assertFalse(result)
self.assertEqual(error_msg, "The challenge was not successfully completed.")
@mock.patch(imp_requests)
def test_captcha_unknown_error(self, requests_mock):
requests_mock.post().json.return_value = {"error-codes": ["unknown-error"]}
result, error_msg = self.website.is_recaptcha_v2_valid(
{"g-recaptcha-response": "dummy_response"}
)
self.assertFalse(result)
self.assertEqual(
error_msg, "Unknown reCAPTCHA error (error code: unknown-error)."
)
@mock.patch(imp_requests)
def test_captcha_no_errors_and_success(self, requests_mock):
requests_mock.post().json.return_value = {
"error-codes": [],
"success": True,
}
result, error_msg = self.website.is_recaptcha_v2_valid(
{"g-recaptcha-response": "dummy_response"}
)
self.assertTrue(result)
self.assertEqual(error_msg, "")
def test_captcha_no_response(self):
result, error_msg = self.website.is_recaptcha_v2_valid({})
self.assertFalse(result)
self.assertEqual(error_msg, "No response given.")
@mock.patch(imp_requests)
def test_captcha_disabled(self, requests_mock):
self.env["ir.config_parameter"].sudo().set_param(
"portal_recaptcha.recaptcha_v2_enabled", False
)
result, error_msg = self.website.is_recaptcha_v2_valid(
{"g-recaptcha-response": "dummy_response"}
)
self.assertTrue(result)
self.assertEqual(error_msg, "")
requests_mock.assert_not_called()

View file

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="utf-8" ?>
<!--
SPDX-FileCopyrightText: 2010-2014 Elico Corp
SPDX-FileContributor: Augustin Cisterne-Kaas <augustin.cisterne-kaas@elico-corp.com>
SPDX-FileCopyrightText: 2015 Tech-Receptives Solutions Pvt. Ltd.
SPDX-FileCopyrightText: 2018 Simone Orsi - Camptocamp SA
SPDX-FileCopyrightText: 2019 Tecnativa - Cristina Martin R.
SPDX-FileCopyrightText: 2019 Coop IT Easy SC
SPDX-License-Identifier: AGPL-3.0-or-later
-->
<odoo>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">Website settings</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="website.res_config_settings_view_form" />
<field name="arch" type="xml">
<xpath expr="//div[@data-key='website']" position="inside">
<h2>reCAPTCHA v2</h2>
<div class="row o_settings_container mt16" id="recaptcha_v2">
<div
class="col-12 col-lg-6 o_setting_box"
id="recaptcha_v2_setting"
>
<div class="o_setting_left_pane">
<field name="recaptcha_v2_enabled" />
</div>
<div class="o_setting_right_pane">
<img
width="20px"
alt="reCAPTCHA icon"
class="mr4"
src="website_recaptcha_v2/static/description/recaptcha_ico.png"
/>
<label string="reCAPTCHA v2" for="recaptcha_v2_enabled" />
<span
class="fa fa-lg fa-globe"
title="Values set here are website-specific."
groups="website.group_multi_website"
/>
<div class="text-muted">
Protect your forms using reCAPTCHA v2
</div>
<div
class="content-group"
attrs="{'invisible': [('recaptcha_v2_enabled', '=', False)]}"
>
<div class="row mt16">
<label
for="recaptcha_v2_site_key"
class="col-4 o_light_label"
/>
<field name="recaptcha_v2_site_key" />
</div>
<div class="row">
<label
for="recaptcha_v2_secret_key"
class="col-4 o_light_label"
/>
<field name="recaptcha_v2_secret_key" />
</div>
<div>
<a
href="https://www.google.com/recaptcha/admin"
class="oe_link"
target="_blank"
>
<i class="fa fa-arrow-right" />
Get reCAPTCHA v2 keys
</a>
</div>
</div>
</div>
</div>
</div>
</xpath>
</field>
</record>
</odoo>

View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8" ?>
<!--
SPDX-FileCopyrightText: 2010-2014 Elico Corp
SPDX-FileContributor: Augustin Cisterne-Kaas <augustin.cisterne-kaas@elico-corp.com>
SPDX-FileCopyrightText: 2015 Tech-Receptives Solutions Pvt. Ltd.
SPDX-FileCopyrightText: 2019 Coop IT Easy SC
SPDX-License-Identifier: AGPL-3.0-or-later
-->
<odoo>
<template id="recaptcha_widget" name="reCAPTCHA widget">
<t t-if="website.recaptcha_v2_enabled">
<div
class="g-recaptcha"
t-att-data-sitekey="website.recaptcha_v2_site_key"
/>
<script src="https://www.recaptcha.net/recaptcha/api.js" async="true" />
</t>
</template>
</odoo>