PluginProbe
The Innovative Form Builder – IvyForms / 0.8
The Innovative Form Builder – IvyForms v0.8
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 1.2 1.3
ivyforms / backend / src / Factory / Security / SecurityServiceFactory.php

SecurityServiceFactory.php in The Innovative Form Builder – IvyForms 0.8, at backend/src/Factory/Security/SecurityServiceFactory.php

173 lines 4.7 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\Factory\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\Services\Security\CaptchaServiceInterface;
17 use IvyForms\Services\Settings\SettingsService;
18
19 /**
20 * Main facade for security service management
21 *
22 * Provides a simplified interface for creating and managing CAPTCHA services
23 * while delegating specific responsibilities to specialized classes.
24 *
25 * @package IvyForms\Factory\Security
26 */
27 class SecurityServiceFactory
28 {
29 private CaptchaServiceFactory $factory;
30
31 private CaptchaProviderRegistry $registry;
32
33 private CaptchaProviderResolver $resolver;
34
35 public function __construct(SettingsService $settingsService)
36 {
37 $this->factory = new CaptchaServiceFactory($settingsService);
38 $this->registry = new CaptchaProviderRegistry();
39 $this->resolver = new CaptchaProviderResolver($settingsService);
40 }
41
42 /**
43 * Get the active CAPTCHA provider from settings
44 *
45 * Note: This returns the first configured provider, but actual usage
46 * depends on which CAPTCHA field is present in the specific form.
47 *
48 * @return string
49 */
50 public function getActiveCaptchaProvider(): string
51 {
52 return $this->resolver->getActiveProvider();
53 }
54
55 /**
56 * Determine CAPTCHA provider based on form fields and current settings
57 *
58 * @param array<object> $formFields Array of form field objects
59 * @return string The CAPTCHA provider to use for this form
60 */
61 public function getCaptchaProviderForForm(array $formFields): string
62 {
63 return $this->resolver->resolveProviderForForm($formFields);
64 }
65
66 /**
67 * Create the appropriate CAPTCHA service based on active provider
68 *
69 * @param array<object>|null $formFields Optional form fields to determine provider
70 * @return CaptchaServiceInterface|null Returns the service instance or null if no provider is active
71 */
72 public function createActiveCaptchaService(?array $formFields = null): ?CaptchaServiceInterface
73 {
74 $provider = ($formFields !== null)
75 ? $this->getCaptchaProviderForForm($formFields)
76 : $this->getActiveCaptchaProvider();
77
78 if ($provider === CaptchaProviderResolver::PROVIDER_NONE) {
79 return null;
80 }
81
82 // Use cached instance if available
83 if ($this->registry->has($provider)) {
84 return $this->registry->get($provider);
85 }
86
87 $service = $this->factory->create($provider);
88 if ($service !== null) {
89 $this->registry->register($provider, $service);
90 }
91
92 return $service;
93 }
94
95 /**
96 * Validate form submission with the appropriate CAPTCHA provider based on form fields
97 *
98 * @param array<string, mixed> $submissionData The form submission data
99 * @param array<object> $formFields The form field objects
100 * @return bool
101 * @throws ForbiddenException
102 */
103 public function validateFormSubmission(array $submissionData, array $formFields): bool
104 {
105 $service = $this->createActiveCaptchaService($formFields);
106
107 if ($service === null) {
108 // No CAPTCHA service active for this form, validation passes
109 return true;
110 }
111
112 return $service->validateFormSubmission($submissionData, $formFields);
113 }
114
115 /**
116 * Get all supported CAPTCHA providers
117 *
118 * @return array<string>
119 */
120 public function getSupportedProviders(): array
121 {
122 return $this->factory->getSupportedProviders();
123 }
124
125 /**
126 * Get all configured CAPTCHA providers from database
127 *
128 * @return array<string>
129 */
130 public function getConfiguredProviders(): array
131 {
132 return $this->resolver->getConfiguredProviders();
133 }
134
135 /**
136 * Get the resolver instance for advanced operations
137 *
138 * @return CaptchaProviderResolver
139 */
140 public function getResolver(): CaptchaProviderResolver
141 {
142 return $this->resolver;
143 }
144
145 /**
146 * Get the registry instance for cache management
147 *
148 * @return CaptchaProviderRegistry
149 */
150 public function getRegistry(): CaptchaProviderRegistry
151 {
152 return $this->registry;
153 }
154
155 /**
156 * Get the factory instance for direct service creation
157 *
158 * @return CaptchaServiceFactory
159 */
160 public function getFactory(): CaptchaServiceFactory
161 {
162 return $this->factory;
163 }
164
165 /**
166 * Clear all cached service instances
167 */
168 public function clearCache(): void
169 {
170 $this->registry->clear();
171 }
172 }
173