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, ))
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")