Exemplo n.º 1
0
    def validate_form(self):
        """
        check all required fields and parameters
        """
        if not self.block_id:
            raise BadRequest(
                translate(
                    _("missing_blockid_label", default="Missing block_id"),
                    context=self.request,
                ))
        if not self.block:
            raise BadRequest(
                translate(
                    _(
                        "block_form_not_found_label",
                        default=
                        'Block with @type "form" and id "$block" not found in this context: $context',
                        mapping={
                            "block": self.block_id,
                            "context": self.context.absolute_url(),
                        },
                    ),
                    context=self.request,
                ), )

        if not self.block.get("store", False) and not self.block.get(
                "send", False):
            raise BadRequest(
                translate(
                    _(
                        "missing_action",
                        default=
                        'You need to set at least one form action between "send" and "store".',  # noqa
                    ),
                    context=self.request,
                ))

        if not self.form_data.get("data", []):
            raise BadRequest(
                translate(
                    _(
                        "empty_form_data",
                        default="Empty form data.",
                    ),
                    context=self.request,
                ))

        if self.block.get("captcha", False):
            getMultiAdapter(
                (self.context, self.request),
                ICaptchaSupport,
                name=self.block["captcha"],
            ).verify(self.form_data.get("captcha"))
 def verify(self, data):
     if not self.settings.private_key:
         raise ValueError("No hcaptcha private key configured. Go to "
                          "path/to/site/@@hcaptcha-settings to configure.")
     if not data or not data.get("token"):
         raise BadRequest(
             translate(
                 _("No captcha token provided."),
                 context=self.request,
             ))
     token = data["token"]
     remote_addr = self.request.get("HTTP_X_FORWARDED_FOR",
                                    "").split(",")[0]
     if not remote_addr:
         remote_addr = self.request.get("REMOTE_ADDR")
     res = submit(token, self.settings.private_key, remote_addr)
     if not res.is_valid:
         raise BadRequest(
             translate(
                 _("The code you entered was wrong, please enter the new one."
                   ),
                 context=self.request,
             ))
Exemplo n.º 3
0
    def send_data(self):
        subject = self.form_data.get("subject", "") or self.block.get(
            "default_subject", "")

        mfrom = self.form_data.get("from", "") or self.block.get(
            "default_from", "")
        mreply_to = self.get_reply_to()

        if not subject or not mfrom:
            raise BadRequest(
                translate(
                    _(
                        "send_required_field_missing",
                        default="Missing required field: subject or from.",
                    ),
                    context=self.request,
                ))

        portal = api.portal.get()
        overview_controlpanel = getMultiAdapter((portal, self.request),
                                                name="overview-controlpanel")
        if overview_controlpanel.mailhost_warning():
            raise BadRequest("MailHost is not configured.")

        registry = getUtility(IRegistry)
        mail_settings = registry.forInterface(IMailSchema, prefix="plone")
        mto = self.block.get("default_to", mail_settings.email_from_address)
        encoding = registry.get("plone.email_charset", "utf-8")
        message = self.prepare_message()

        msg = EmailMessage()
        msg.set_content(message)
        msg["Subject"] = subject
        msg["From"] = mfrom
        msg["To"] = mto
        msg["Reply-To"] = mreply_to

        msg.replace_header("Content-Type", 'text/html; charset="utf-8"')

        self.manage_attachments(msg=msg)

        self.send_mail(msg=msg, encoding=encoding)

        for bcc in self.get_bcc():
            # send a copy also to the fields with bcc flag
            msg.replace_header("To", bcc)
            self.send_mail(msg=msg, encoding=encoding)
class HCaptchaSupport(CaptchaSupport):
    name = _("HCaptcha")

    def __init__(self, context, request):
        super().__init__(context, request)
        registry = queryUtility(IRegistry)
        self.settings = registry.forInterface(IHCaptchaSettings, check=False)

    def isEnabled(self):
        return self.settings and self.settings.public_key and self.settings.private_key

    def serialize(self):
        if not self.settings.public_key:
            raise ValueError("No hcaptcha public key configured. Go to "
                             "path/to/site/@@hcaptcha-settings to configure.")
        return {
            "provider": "hcaptcha",
            "public_key": self.settings.public_key,
        }

    def verify(self, data):
        if not self.settings.private_key:
            raise ValueError("No hcaptcha private key configured. Go to "
                             "path/to/site/@@hcaptcha-settings to configure.")
        if not data or not data.get("token"):
            raise BadRequest(
                translate(
                    _("No captcha token provided."),
                    context=self.request,
                ))
        token = data["token"]
        remote_addr = self.request.get("HTTP_X_FORWARDED_FOR",
                                       "").split(",")[0]
        if not remote_addr:
            remote_addr = self.request.get("REMOTE_ADDR")
        res = submit(token, self.settings.private_key, remote_addr)
        if not res.is_valid:
            raise BadRequest(
                translate(
                    _("The code you entered was wrong, please enter the new one."
                      ),
                    context=self.request,
                ))
class HCaptchaInvisibleSupport(HCaptchaSupport):
    name = _("HCaptcha Invisible")