PluginProbe
The Innovative Form Builder – IvyForms / 1.5.1
The Innovative Form Builder – IvyForms v1.5.1
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
ivyforms / backend / src / Services / Security / SecurityService.php

SecurityService.php in The Innovative Form Builder – IvyForms 1.5.1, at backend/src/Services/Security/SecurityService.php

150 lines 4.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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 }
150