PluginProbe
The Innovative Form Builder – IvyForms / 0.9
The Innovative Form Builder – IvyForms v0.9
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 0.9, at backend/src/Services/Security/SecurityService.php

155 lines 5.0 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 // phpcs:disable PSR1.Files.SideEffects
11 if (!defined('ABSPATH')) {
12 exit; // Exit if accessed directly
13 }
14
15 use IvyForms\Common\Exceptions\ForbiddenException;
16 use IvyForms\Factory\Security\SecurityServiceFactory;
17 use IvyForms\Factory\Security\CaptchaProviderResolver;
18 use IvyForms\Services\Security\Common\CaptchaServiceInterface;
19 use IvyForms\Services\Security\Recaptcha\RecaptchaConfigProvider;
20 use IvyForms\Services\Security\Turnstile\TurnstileConfigProvider;
21 use IvyForms\Services\Security\HCaptcha\HCaptchaConfigProvider;
22
23 /**
24 * Class SecurityService
25 *
26 * Central service for all security-related functionality including CAPTCHA validation.
27 * This service acts as a facade over the SecurityServiceFactory, providing a clean
28 * interface for controllers to interact with security features.
29 *
30 * @package IvyForms\Services\Security
31 */
32 class SecurityService
33 {
34 /**
35 * @var SecurityServiceFactory
36 */
37 private SecurityServiceFactory $securityServiceFactory;
38
39 /**
40 * @var RecaptchaConfigProvider
41 */
42 private RecaptchaConfigProvider $recaptchaConfigProvider;
43
44 /**
45 * @var TurnstileConfigProvider
46 */
47 private TurnstileConfigProvider $turnstileConfigProvider;
48
49 /**
50 * @var HCaptchaConfigProvider
51 */
52 private HCaptchaConfigProvider $hcaptchaConfigProvider;
53
54 public function __construct(SecurityServiceFactory $securityServiceFactory)
55 {
56 $this->securityServiceFactory = $securityServiceFactory;
57 $this->recaptchaConfigProvider = new RecaptchaConfigProvider();
58 $this->turnstileConfigProvider = new TurnstileConfigProvider();
59 $this->hcaptchaConfigProvider = new HCaptchaConfigProvider();
60 }
61
62 /**
63 * Get the currently active CAPTCHA provider
64 *
65 * @return string ('recaptcha', 'hcaptcha', 'turnstile', 'none')
66 */
67 public function getActiveCaptchaProvider(): string
68 {
69 return $this->securityServiceFactory->getActiveCaptchaProvider();
70 }
71
72 /**
73 * Determine CAPTCHA provider based on form fields and current settings
74 *
75 * @param array<object> $formFields Array of form field objects
76 * @return string The CAPTCHA provider to use for this form
77 */
78 public function getCaptchaProviderForForm(array $formFields): string
79 {
80 return $this->securityServiceFactory->getCaptchaProviderForForm($formFields);
81 }
82
83 /**
84 * Validate CAPTCHA response for form submission
85 *
86 * This method automatically determines the appropriate CAPTCHA provider
87 * based on the form fields and validates the submission accordingly.
88 *
89 * @param array<string,mixed> $submissionData The form submission data
90 * @param array<object> $formFields The form field objects
91 * @return bool
92 * @throws ForbiddenException If CAPTCHA validation fails
93 */
94 public function validateFormSubmission(array $submissionData, array $formFields): bool
95 {
96 return $this->securityServiceFactory->validateFormSubmission($submissionData, $formFields);
97 }
98
99 /**
100 * Get security configuration for frontend
101 *
102 * @param array<object> $formFields Array of form field objects to determine required config
103 * @return array<string, mixed>
104 */
105 public function getFrontendSecurityConfig(array $formFields): array
106 {
107 $provider = $this->getCaptchaProviderForForm($formFields);
108
109 if ($provider === CaptchaProviderResolver::PROVIDER_NONE) {
110 return $this->buildDisabledConfig();
111 }
112
113 return $this->buildProviderConfig($provider, $formFields);
114 }
115
116 /**
117 * Build configuration for disabled CAPTCHA
118 *
119 * @return array<string, mixed>
120 */
121 private function buildDisabledConfig(): array
122 {
123 return [
124 'captcha' => [
125 'enabled' => false,
126 'provider' => CaptchaProviderResolver::PROVIDER_NONE
127 ]
128 ];
129 }
130
131 /**
132 * Build provider configuration
133 *
134 * @param string $provider
135 * @param array<object> $formFields
136 * @return array<string, mixed>
137 */
138 private function buildProviderConfig(string $provider, array $formFields): array
139 {
140 $service = $this->securityServiceFactory->createActiveCaptchaService($formFields);
141
142 $config = ['captcha' => ['enabled' => true, 'provider' => $provider]];
143
144 if ($provider === CaptchaProviderResolver::PROVIDER_RECAPTCHA) {
145 $config['captcha']['recaptcha'] = $this->recaptchaConfigProvider->getConfig($service);
146 } elseif ($provider === CaptchaProviderResolver::PROVIDER_TURNSTILE) {
147 $config['captcha']['turnstile'] = $this->turnstileConfigProvider->getConfig($service);
148 } elseif ($provider === CaptchaProviderResolver::PROVIDER_HCAPTCHA) {
149 $config['captcha']['hcaptcha'] = $this->hcaptchaConfigProvider->getConfig($service);
150 }
151
152 return $config;
153 }
154 }
155