PluginProbe
The Innovative Form Builder – IvyForms / 1.5
The Innovative Form Builder – IvyForms v1.5
1.5.1 1.5 1.4.1 1.4 trunk 0.1.2 0.2 0.2.1 0.3 0.3.1 0.4 0.5 0.6 0.6.1 0.6.1-backup 0.6.1.1 0.7 0.8 0.8.1 0.8.2 0.9 0.9.1 1.0 1.1 1.1.1 All 27 releases
← All changes | backend/src/Services/Security/SecurityService.php +149 -0 0.6.1 → 1.5 View file →
@@ -1,0 +1,149 @@
1 +<?php
2 +
3 +/**
4 + * @copyright © Melograno Venture Studio. All rights reserved.
5 + * @licence See COPYING.md for license details.
6 + */
7 +
8 +namespace IvyForms\Services\Security;
9 +
10 +use IvyForms\Common\Exceptions\ForbiddenException;
11 +use IvyForms\Factory\Security\SecurityServiceFactory;
12 +use IvyForms\Factory\Security\CaptchaProviderResolver;
13 +use IvyForms\Services\Security\Common\CaptchaServiceInterface;
14 +use IvyForms\Services\Security\Recaptcha\RecaptchaConfigProvider;
15 +use IvyForms\Services\Security\Turnstile\TurnstileConfigProvider;
16 +use IvyForms\Services\Security\HCaptcha\HCaptchaConfigProvider;
17 +
18 +/**
19 + * Class SecurityService
20 + *
21 + * Central service for all security-related functionality including CAPTCHA validation.
22 + * This service acts as a facade over the SecurityServiceFactory, providing a clean
23 + * interface for controllers to interact with security features.
24 + *
25 + * @package IvyForms\Services\Security
26 + */
27 +class SecurityService
28 +{
29 + /**
30 + * @var SecurityServiceFactory
31 + */
32 + private SecurityServiceFactory $securityServiceFactory;
33 +
34 + /**
35 + * @var RecaptchaConfigProvider
36 + */
37 + private RecaptchaConfigProvider $recaptchaConfigProvider;
38 +
39 + /**
40 + * @var TurnstileConfigProvider
41 + */
42 + private TurnstileConfigProvider $turnstileConfigProvider;
43 +
44 + /**
45 + * @var HCaptchaConfigProvider
46 + */
47 + private HCaptchaConfigProvider $hcaptchaConfigProvider;
48 +
49 + public function __construct(SecurityServiceFactory $securityServiceFactory)
50 + {
51 + $this->securityServiceFactory = $securityServiceFactory;
52 + $this->recaptchaConfigProvider = new RecaptchaConfigProvider();
53 + $this->turnstileConfigProvider = new TurnstileConfigProvider();
54 + $this->hcaptchaConfigProvider = new HCaptchaConfigProvider();
55 + }
56 +
57 + /**
58 + * Get the currently active CAPTCHA provider
59 + *
60 + * @return string ('recaptcha', 'hcaptcha', 'turnstile', 'none')
61 + */
62 + public function getActiveCaptchaProvider(): string
63 + {
64 + return $this->securityServiceFactory->getActiveCaptchaProvider();
65 + }
66 +
67 + /**
68 + * Determine CAPTCHA provider based on form fields and current settings
69 + *
70 + * @param array<object> $formFields Array of form field objects
71 + * @return string The CAPTCHA provider to use for this form
72 + */
73 + public function getCaptchaProviderForForm(array $formFields): string
74 + {
75 + return $this->securityServiceFactory->getCaptchaProviderForForm($formFields);
76 + }
77 +
78 + /**
79 + * Validate CAPTCHA response for form submission
80 + *
81 + * This method automatically determines the appropriate CAPTCHA provider
82 + * based on the form fields and validates the submission accordingly.
83 + *
84 + * @param array<string,mixed> $submissionData The form submission data
85 + * @param array<object> $formFields The form field objects
86 + * @return bool
87 + * @throws ForbiddenException If CAPTCHA validation fails
88 + */
89 + public function validateFormSubmission(array $submissionData, array $formFields): bool
90 + {
91 + return $this->securityServiceFactory->validateFormSubmission($submissionData, $formFields);
92 + }
93 +
94 + /**
95 + * Get security configuration for frontend
96 + *
97 + * @param array<object> $formFields Array of form field objects to determine required config
98 + * @return array<string, mixed>
99 + */
100 + public function getFrontendSecurityConfig(array $formFields): array
101 + {
102 + $provider = $this->getCaptchaProviderForForm($formFields);
103 +
104 + if ($provider === CaptchaProviderResolver::PROVIDER_NONE) {
105 + return $this->buildDisabledConfig();
106 + }
107 +
108 + return $this->buildProviderConfig($provider, $formFields);
109 + }
110 +
111 + /**
112 + * Build configuration for disabled CAPTCHA
113 + *
114 + * @return array<string, mixed>
115 + */
116 + private function buildDisabledConfig(): array
117 + {
118 + return [
119 + 'captcha' => [
120 + 'enabled' => false,
121 + 'provider' => CaptchaProviderResolver::PROVIDER_NONE
122 + ]
123 + ];
124 + }
125 +
126 + /**
127 + * Build provider configuration
128 + *
129 + * @param string $provider
130 + * @param array<object> $formFields
131 + * @return array<string, mixed>
132 + */
133 + private function buildProviderConfig(string $provider, array $formFields): array
134 + {
135 + $service = $this->securityServiceFactory->createActiveCaptchaService($formFields);
136 +
137 + $config = ['captcha' => ['enabled' => true, 'provider' => $provider]];
138 +
139 + if ($provider === CaptchaProviderResolver::PROVIDER_RECAPTCHA) {
140 + $config['captcha']['recaptcha'] = $this->recaptchaConfigProvider->getConfig($service);
141 + } elseif ($provider === CaptchaProviderResolver::PROVIDER_TURNSTILE) {
142 + $config['captcha']['turnstile'] = $this->turnstileConfigProvider->getConfig($service);
143 + } elseif ($provider === CaptchaProviderResolver::PROVIDER_HCAPTCHA) {
144 + $config['captcha']['hcaptcha'] = $this->hcaptchaConfigProvider->getConfig($service);
145 + }
146 +
147 + return $config;
148 + }
149 +}