PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / 11.1.1
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress v11.1.1
11.1.1 11.1.0 11.0.5 11.0.4 11.0.3 11.0.2 11.0.1 11.0.0 10.11.1 10.11.0 10.10.2 10.10.1 10.10.0 10.9.1 trunk 10.0.0 10.0.1 10.1.0 10.1.1 10.1.2 10.1.3 10.1.4 10.2.0 10.2.1 10.2.2 All 62 releases
← All changes | front/FrontControllers/FrontusersController.php +0 -986 10.10.2 → 11.1.1 View file →
@@ -1,986 +1,0 @@
1 -<?php
2 -
3 -namespace AcyMailing\FrontControllers;
4 -
5 -use AcyMailing\Classes\FieldClass;
6 -use AcyMailing\Classes\ListClass;
7 -use AcyMailing\Classes\MailClass;
8 -use AcyMailing\Classes\ScenarioClass;
9 -use AcyMailing\Classes\UserClass;
10 -use AcyMailing\Classes\UserStatClass;
11 -use AcyMailing\Controllers\UsersController;
12 -use AcyMailing\Helpers\CaptchaHelper;
13 -use AcyMailing\Helpers\EntitySelectHelper;
14 -use AcyMailing\Helpers\ExportHelper;
15 -use AcyMailing\Helpers\ToolbarHelper;
16 -use AcyMailing\Helpers\UserHelper;
17 -use AcyMailing\Core\AcymParameter;
18 -
19 -class FrontusersController extends UsersController
20 -{
21 - public function __construct()
22 - {
23 - parent::__construct();
24 -
25 - if (ACYM_CMS === 'joomla') {
26 - $menu = acym_getMenu();
27 - if (is_object($menu)) {
28 - $params = method_exists($menu, 'getParams') ? $menu->getParams() : $menu->params;
29 - $menuParams = new AcymParameter($params);
30 - $this->menuClass = $menuParams->get('pageclass_sfx', '');
31 - }
32 - }
33 -
34 - $this->publicFrontTasks = [
35 - 'subscribe',
36 - 'unsubscribe',
37 - 'unsubscribeAll',
38 - 'saveSubscriptions',
39 - 'unsubscribePage',
40 - 'confirm',
41 - 'profile',
42 - 'savechanges',
43 - 'exportdata',
44 - 'ajaxGetEnqueuedMessages',
45 - 'gdprDelete',
46 - ];
47 -
48 - }
49 -
50 -
51 - private function displayMessage(string $message, bool $ajax, string $type = 'error'): void
52 - {
53 - if ($ajax) {
54 - echo json_encode(
55 - [
56 - 'message' => acym_translation($message),
57 - 'type' => $type,
58 - 'code' => '1',
59 - ]
60 - );
61 - } else {
62 - acym_header('Content-type:text/html; charset=utf-8');
63 - echo '<script>alert("'.acym_translation($message, true).'"); window.history.go(-1);</script>';
64 - }
65 - exit;
66 - }
67 -
68 - public function subscribe(): void
69 - {
70 - acym_checkRobots();
71 -
72 - if (!acym_getVar('string', 'acy_source') && !empty($_GET['user'])) {
73 - acym_setVar('acy_source', 'url');
74 - }
75 -
76 - $ajax = acym_getVar('int', 'ajax', 0);
77 - if ($ajax) {
78 - @ob_end_clean();
79 - acym_header('Content-type:application/json; charset=utf-8');
80 - }
81 -
82 - $currentUserid = acym_currentUserId();
83 - if ((int)$this->config->get('allow_visitor', 1) != 1 && empty($currentUserid)) {
84 - if ($ajax) {
85 - echo '{"message":"'.acym_translation('ACYM_ONLY_LOGGED', true).'","type":"error","code":"0"}';
86 - exit;
87 - } else {
88 - acym_askLog(false, 'ACYM_ONLY_LOGGED');
89 -
90 - return;
91 - }
92 - }
93 -
94 - if (empty($currentUserid) && $this->config->get('captcha', 'none') !== 'none' && acym_level(ACYM_ESSENTIAL)) {
95 - $captchaHelper = new CaptchaHelper();
96 - if (!$captchaHelper->check()) {
97 - $this->displayMessage('ACYM_WRONG_CAPTCHA', $ajax);
98 - }
99 - }
100 -
101 - $formData = acym_getVar('array', 'user', [], '');
102 - $user = new \stdClass();
103 - if (!empty($formData['email'])) {
104 - $user->email = $formData['email'];
105 - }
106 -
107 - $userClass = new UserClass();
108 - if (empty($user->email)) {
109 - $connectedUser = $userClass->identify(true, 'userId', 'userKey');
110 - if (!empty($connectedUser->email)) {
111 - $user->email = $connectedUser->email;
112 - }
113 - }
114 - $user->email = trim($user->email);
115 -
116 - if (empty($user->email) || !acym_isValidEmail($user->email, true)) {
117 - $this->displayMessage('ACYM_VALID_EMAIL', $ajax);
118 - }
119 -
120 - $alreadyExists = $userClass->getOneByEmail($user->email);
121 - if (!empty($alreadyExists->id)) {
122 - $user->id = $alreadyExists->id;
123 - }
124 -
125 - $successfullySaved = $userClass->saveForm($ajax);
126 - $user->id = acym_getVar('int', 'userId');
127 -
128 - if (!empty($userClass->errors)) {
129 - $this->displayMessage(implode('<br /><br />', $userClass->errors), $ajax);
130 - }
131 -
132 - if (!$successfullySaved || empty($user->id)) {
133 - $this->displayMessage('ACYM_ERROR_SAVE_USER', $ajax);
134 - }
135 -
136 - $myuser = $userClass->getOneById($user->id);
137 - if (empty($myuser->id)) {
138 - $this->displayMessage('ACYM_ERROR_SAVE_USER', $ajax);
139 - }
140 -
141 - $msgtype = 'success';
142 - if (empty($myuser->confirmed) && $this->config->get('require_confirmation', 1) == 1) {
143 - if ($userClass->confirmationSentSuccess || empty($userClass->confirmationSentError)) {
144 - $msg = strip_tags(acym_getVar('string', 'confirmation_message', ''));
145 - if (empty($msg)) {
146 - $msg = 'ACYM_CONFIRMATION_SENT';
147 - }
148 - $code = 2;
149 - } else {
150 - $msg = $userClass->confirmationSentError;
151 - $code = 7;
152 - $msgtype = 'error';
153 - }
154 - } else {
155 - if ($userClass->subscribed) {
156 - $msg = strip_tags(acym_getVar('string', 'confirmation_message', ''));
157 - if (empty($msg)) {
158 - $msg = 'ACYM_SUBSCRIPTION_OK';
159 - }
160 - $code = 3;
161 - } else {
162 - $msg = 'ACYM_ALREADY_SUBSCRIBED';
163 - $code = 5;
164 - $enqueueMsgType = 'info';
165 - }
166 - }
167 -
168 - $replace = [];
169 - foreach ($myuser as $oneProp => $oneVal) {
170 - $replace['{user:'.$oneProp.'}'] = $oneVal;
171 - }
172 -
173 - $msg = str_replace(array_keys($replace), $replace, acym_translation($msg));
174 -
175 - if ($ajax) {
176 - $msg = str_replace(["\n", "\r", '"', '\\'], [' ', ' ', "'", '\\\\'], $msg);
177 - echo '{"message":"'.$msg.'","type":"'.$msgtype.'","code":"'.$code.'"}';
178 - exit;
179 - } else {
180 - acym_enqueueMessage($msg, !empty($enqueueMsgType) ? $enqueueMsgType : $msgtype);
181 - }
182 -
183 - $redirectUrl = urldecode(acym_getVar('string', 'redirect', ''));
184 - $redirectUrl = str_replace(array_keys($replace), $replace, $redirectUrl);
185 - if (empty($redirectUrl)) {
186 - $redirectUrl = acym_rootURI();
187 - }
188 -
189 - acym_redirect($redirectUrl, '', 'message', true);
190 - }
191 -
192 - private function unsubscribeDirectly(object $alreadyExists, bool $ajax): void
193 - {
194 - $userClass = new UserClass();
195 - if ($this->config->get('allow_modif', 'data') === 'none') {
196 - $currentUser = $userClass->identify(true, 'userId', 'userKey');
197 - if (empty($currentUser->email)) {
198 - $this->endUnsubscribe('ACYM_LOGIN', $ajax, 'error');
199 -
200 - return;
201 - }
202 - }
203 -
204 - if (empty($currentUser) || empty($currentUser->id)) {
205 - $currentUser = $alreadyExists;
206 - }
207 -
208 - $visibleSubscription = acym_getVar('array', 'subscription', []);
209 - $hiddenLists = trim(acym_getVar('string', 'hiddenlists', ''));
210 - $hiddenSubscription = empty($hiddenLists) ? [] : explode(',', $hiddenLists);
211 - $unsubscribeLists = array_merge($visibleSubscription, $hiddenSubscription);
212 -
213 - $mailId = acym_getVar('int', 'mail_id', 0);
214 -
215 - if (!empty($mailId) && !empty($currentUser->id)) {
216 - $userStatClass = new UserStatClass();
217 - $userStat = $userStatClass->getOneByMailAndUserId($mailId, $currentUser->id);
218 - if (acym_isRobot() || (!empty($userStat) && acym_getTimeFromUTCDate($userStat->send_date) > time() - 20)) {
219 - return;
220 - }
221 - }
222 -
223 - if (empty($unsubscribeLists)) {
224 - $mailClass = new MailClass();
225 - $mailType = $mailClass->getMailType($mailId);
226 - if (empty($currentUser) || empty($currentUser->id)) {
227 - $currentUser = $userClass->identify(true, 'userId', 'userKey');
228 - }
229 -
230 - if ($mailType === $mailClass::TYPE_SCENARIO) {
231 - $scenarioClass = new ScenarioClass();
232 - $scenarioId = $scenarioClass->getScenarioIdByMailId($mailId);
233 - if (!empty($currentUser->id)) {
234 - $scenarioClass->markUserUnsubscribeFromScenario($currentUser->id, $scenarioId);
235 - }
236 - }
237 - }
238 -
239 - if (!empty($mailId)) {
240 - $mailClass = new MailClass();
241 - $unsubscribeLists = array_keys($mailClass->getAllListsByMailId($mailId));
242 - }
243 -
244 - if (empty($unsubscribeLists)) {
245 - $msg = 'ACYM_NO_SUBSCRIPTION_LINKED_EMAIL';
246 - } elseif (false === $userClass->unsubscribe([$alreadyExists->id], $unsubscribeLists)) {
247 - $msg = 'ACYM_UNSUBSCRIPTION_NOT_IN_LIST';
248 - } else {
249 - $msg = 'ACYM_UNSUBSCRIPTION_OK';
250 - }
251 -
252 - if (!empty($mailType) && $mailType === $mailClass::TYPE_SCENARIO) {
253 - $msg = 'ACYM_UNSUBSCRIPTION_SCENARIO_OK';
254 - }
255 -
256 -
257 - $this->endUnsubscribe($msg, $ajax);
258 - }
259 -
260 - private function endUnsubscribe(string $msg, bool $ajax, string $type = 'success'): void
261 - {
262 - $msg = acym_translation($msg);
263 -
264 - if ($ajax) {
265 - echo json_encode(
266 - [
267 - 'message' => $msg,
268 - 'type' => $type,
269 - 'code' => '10',
270 - ]
271 - );
272 - exit;
273 - }
274 - acym_enqueueMessage($msg, $type);
275 -
276 - $redirectUrl = urldecode(acym_getVar('string', 'redirectunsub', ''));
277 - if (empty($redirectUrl)) {
278 - $redirectUrl = acym_rootURI();
279 - }
280 -
281 - acym_redirect($this->normalizeRedirectUrl($redirectUrl), '', 'message', true);
282 - }
283 -
284 - private function normalizeRedirectUrl(string $url): string
285 - {
286 - if ($url === '') {
287 - return '';
288 - }
289 - if (preg_match('~^[a-z][a-z0-9+.\-]*://~i', $url)) {
290 - return $url;
291 - }
292 - if (strpos($url, '/') === 0 || strpos($url, 'index.php') === 0) {
293 - return $url;
294 - }
295 - if (preg_match('~^[^/?#]+\.[a-z]{2,}(?:[/?#]|$)~i', $url)) {
296 - return 'https://'.$url;
297 - }
298 -
299 - return $url;
300 - }
301 -
302 - public function unsubscribe(): void
303 - {
304 - acym_checkRobots();
305 - $userClass = new UserClass();
306 -
307 - $redirectToUnsubPage = $this->config->get('unsubscribe_page', 1);
308 - $direct = acym_getVar('int', 'direct', 0);
309 -
310 - $ajax = acym_getVar('int', 'ajax', 0);
311 - if ($ajax) {
312 - @ob_end_clean();
313 - acym_header('Content-type:application/json; charset=utf-8');
314 - }
315 -
316 - $currentUserid = acym_currentUserId();
317 - $user = $userClass->identify(true, 'userId', 'userKey');
318 - if (empty($user)) {
319 - $user = $userClass->identify(true, 'user_id', 'user_key');
320 - $direct = 1;
321 - }
322 - if (empty($user) && empty($currentUserid) && $this->config->get('captcha', 'none') !== 'none' && acym_level(ACYM_ESSENTIAL)) {
323 - $captchaClass = new CaptchaHelper();
324 - if (!$captchaClass->check()) {
325 - $this->displayMessage('ACYM_WRONG_CAPTCHA', $ajax);
326 - }
327 - }
328 -
329 - $formData = acym_getVar('array', 'user', []);
330 - $email = '';
331 -
332 - if (!empty($formData['email'])) {
333 - $email = trim(strip_tags($formData['email']));
334 - } elseif (empty($user)) {
335 - return;
336 - } elseif (!empty($user->email)) {
337 - $email = $user->email;
338 - } elseif (!empty(acym_currentUserEmail())) {
339 - $email = acym_currentUserEmail();
340 - }
341 -
342 - $currentEmail = acym_currentUserEmail();
343 - if (empty($email) && !empty($currentEmail)) {
344 - $email = $currentEmail;
345 - }
346 -
347 - if (empty($email) || !acym_isValidEmail($email)) {
348 - $this->displayMessage('ACYM_VALID_EMAIL', $ajax);
349 - }
350 -
351 - $alreadyExists = $userClass->getOneByEmail($email);
352 -
353 - if (empty($alreadyExists->id)) {
354 - $this->displayMessage(acym_translationSprintf('ACYM_SUB_NOT_IN_LIST', $email), $ajax);
355 - }
356 -
357 - $fromModuleOrWidget = acym_getVar('string', 'acysubmode', '');
358 - if ((!empty($fromModuleOrWidget) && in_array($fromModuleOrWidget, ['form_acym', 'mod_acym', 'widget_acym'])) || $ajax || !$redirectToUnsubPage || !empty($direct)) {
359 - $this->unsubscribeDirectly($alreadyExists, $ajax);
360 - } elseif ($redirectToUnsubPage && !$ajax && !$direct) {
361 - $identifiedEmail = !empty($user->email) ? $user->email : $currentEmail;
362 - if (empty($identifiedEmail) || strtolower($alreadyExists->email) !== strtolower($identifiedEmail)) {
363 - $this->displayMessage('ACYM_NOT_ALLOWED_MODIFY_USER', $ajax);
364 - }
365 - $this->unsubscribePage($alreadyExists);
366 - }
367 - }
368 -
369 - private function getUserFromUnsubPage(): object
370 - {
371 - $userID = acym_getVar('int', 'user_id');
372 - $userClass = new UserClass();
373 -
374 - $user = $userClass->getOneById($userID);
375 -
376 - if (empty($user)) {
377 - acym_enqueueMessage(acym_translation('ACYM_USER_NOT_FOUND'), 'error');
378 -
379 - acym_redirect(acym_rootURI());
380 - }
381 -
382 - return $user;
383 - }
384 -
385 - private function unsubscribeAllInner(bool $update = false): void
386 - {
387 - $userClass = new UserClass();
388 - $user = $this->getUserFromUnsubPage();
389 - $redirectUrl = urldecode(acym_getVar('string', 'redirectunsub', ''));
390 - if (empty($redirectUrl)) {
391 - $redirectUrl = $this->config->get('unsub_redirect_url', '');
392 - }
393 -
394 - $allLists = $userClass->getUserSubscriptionById($user->id);
395 - if (empty($allLists)) {
396 - acym_enqueueMessage(acym_translation('ACYM_NOT_SUBSCRIBED_ANY_LIST'), 'info');
397 - acym_redirect($this->normalizeRedirectUrl(!empty($redirectUrl) ? $redirectUrl : acym_rootURI()), '', 'message', true);
398 - }
399 -
400 - $lists = [];
401 - foreach ($allLists as $list) {
402 - if (!$update || $list->visible == 1) {
403 - $lists[] = $list->id;
404 - }
405 - }
406 -
407 - $userClass->sendNotification($user->id, 'acy_notification_unsuball');
408 - $userClass->blockNotifications = true;
409 - $userClass->unsubscribe([$user->id], $lists);
410 - }
411 -
412 - private function redirectUnsubWorked(): void
413 - {
414 - acym_enqueueMessage(acym_translation('ACYM_SUBSCRIPTION_UPDATED_OK'));
415 - $redirectUrl = urldecode(acym_getVar('string', 'redirectunsub', ''));
416 - if (empty($redirectUrl)) {
417 - $redirectUrl = $this->config->get('unsub_redirect_url', '');
418 - }
419 - if (!empty($redirectUrl)) {
420 - acym_redirect($this->normalizeRedirectUrl($redirectUrl), '', 'message', true);
421 - } else {
422 - acym_redirect(acym_rootURI());
423 - }
424 - }
425 -
426 - public function unsubscribeAll(): void
427 - {
428 - $userClass = new UserClass();
429 - if (empty($userClass->identify(true, 'user_id', 'user_key'))) {
430 - acym_enqueueMessage(acym_translation('ACYM_USER_NOT_FOUND'), 'error');
431 -
432 - acym_redirect(acym_rootURI());
433 - }
434 -
435 - $displayCheckedLists = acym_getVar('string', 'displayed_checked_lists', '');
436 - if (!empty($displayCheckedLists)) {
437 - $user = $this->getUserFromUnsubPage();
438 - $userClass->unsubscribe([$user->id], explode(',', $displayCheckedLists));
439 - } else {
440 - $this->unsubscribeAllInner();
441 - }
442 -
443 - $ajax = acym_getVar('int', 'ajax', 0);
444 - if (!$ajax) {
445 - $this->redirectUnsubWorked();
446 - }
447 - }
448 -
449 - public function saveSubscriptions(): void
450 - {
451 - $userClass = new UserClass();
452 - if (empty($userClass->identify(true, 'user_id', 'user_key'))) {
453 - $this->displayMessage('ACYM_USER_NOT_FOUND', false);
454 - }
455 -
456 - $user = $this->getUserFromUnsubPage();
457 - $listsChecked = acym_getVar('array', 'lists', []);
458 - $listsChecked = array_filter($listsChecked, function ($status) {
459 - return intval($status) === 1;
460 - });
461 - $listsChecked = array_keys($listsChecked);
462 - $displayedCheckedLists = explode(',', acym_getVar('string', 'displayed_checked_lists', ''));
463 - $userSubscriptions = $userClass->getUserSubscriptionById($user->id);
464 -
465 - $userClass->subscribe([$user->id], $listsChecked);
466 -
467 - $listsToUnsub = [];
468 - foreach ($userSubscriptions as $subscription) {
469 - if (
470 - !in_array($subscription->id, $listsChecked)
471 - && in_array($subscription->id, $displayedCheckedLists)
472 - && intval($subscription->status) === 1
473 - ) {
474 - $listsToUnsub[] = $subscription->id;
475 - }
476 - }
477 -
478 - $userClass->unsubscribe([$user->id], $listsToUnsub);
479 - $this->redirectUnsubWorked();
480 - }
481 -
482 - public function unsubscribePage(object $alreadyExists): void
483 - {
484 - $userClass = new UserClass();
485 - $lang = acym_getVar('string', 'language', acym_getLanguageTag());
486 - $mailId = acym_getVar('int', 'mail_id', 0);
487 - $campaignListOnly = $this->config->get('unsubscribe_campaign_list_only', '0') === '1';
488 - $displaySurvey = $this->config->get('unsubpage_survey', '0') === '1';
489 - $surveyAnswers = $this->config->get('unsub_survey', '[]');
490 - $unsubscribeColor = $this->config->get('unsubscribe_color', '#00a4ff');
491 - $hoverColor = $this->darkenRGBColor($unsubscribeColor, 20);
492 -
493 - $surveyAnswers = json_decode($surveyAnswers, true);
494 -
495 - if (ACYM_CMS === 'joomla' && !empty($_GET['language'])) $lang = $_GET['language'];
496 - acym_setLanguage($lang);
497 - acym_loadLanguage($lang);
498 -
499 - $userSubscriptions = $userClass->getUserSubscriptionById($alreadyExists->id, 'id', false, false, true, false, $mailId, $campaignListOnly);
500 -
501 - $data = [
502 - 'user' => $alreadyExists,
503 - 'mail_id' => $mailId,
504 - 'subscriptions' => $userSubscriptions,
505 - 'lang' => $lang,
506 - ];
507 -
508 - if (acym_isMultilingual()) {
509 - $allLanguages = acym_getLanguages(false, true);
510 - if ($this->config->get('unsubpage_languages_multi_only', '0') === '1') {
511 - $allLanguages = acym_getMultilingualLanguages();
512 - }
513 -
514 - $data['languages'] = [];
515 - foreach ($allLanguages as $key => $language) {
516 - $data['languages'][$key] = $language->name;
517 - }
518 -
519 - $surveyAnswersTranslations = $this->config->get('unsub_survey_translation', '');
520 -
521 - if (!empty($surveyAnswersTranslations)) {
522 - $surveyAnswersTranslations = json_decode($surveyAnswersTranslations, true);
523 - if (isset($surveyAnswersTranslations[$data['lang']])) {
524 - $surveyAnswers = $surveyAnswersTranslations[$data['lang']]['unsub_survey'];
525 - }
526 - }
527 - }
528 -
529 - if ($displaySurvey) {
530 - $data['surveyAnswers'] = $surveyAnswers;
531 - array_unshift($data['surveyAnswers'], acym_translation('ACYM_SELECT_REASON'));
532 - $data['surveyAnswers'][] = acym_translation('ACYM_OTHER');
533 - $data['surveyAnswers'] = array_combine($data['surveyAnswers'], $data['surveyAnswers']);
534 - }
535 -
536 - if (!empty($this->config->get('unsubscribe_color'))) {
537 - $unsubscribeColor = $this->config->get('unsubscribe_color');
538 - $hoverColor = $this->darkenRGBColor($unsubscribeColor, 20);
539 - $data['unsubscribeColor'] = $unsubscribeColor;
540 - $data['hoverColor'] = $hoverColor;
541 - }
542 - $data['svgImage'] = $this->getSVGImage($unsubscribeColor, $hoverColor);
543 -
544 - acym_setVar('layout', 'unsubscribepage');
545 - acym_header('Content-Type: text/html; charset=utf-8');
546 -
547 - parent::display($data);
548 - }
549 -
550 - private function getSVGImage(string $unsubscribeColor, string $hoverColor): string
551 - {
552 - if ($this->config->get('display_unsub_image') === '1') {
553 - $svgPath = ACYM_IMAGES.'unsubscribe/unsub_image.svg';
554 -
555 - $svgContent = acym_fileGetContent($svgPath);
556 -
557 - return str_replace(
558 - ['#B118C8', '#C794CF'],
559 - [$unsubscribeColor, $hoverColor],
560 - $svgContent
561 - );
562 - }
563 -
564 - return '';
565 - }
566 -
567 - public function hexToRGB(string $hexColor): array
568 - {
569 - $hexColor = ltrim($hexColor, '#');
570 -
571 - if (strlen($hexColor) === 3) {
572 - $hexColor = $hexColor[0].$hexColor[0].$hexColor[1].$hexColor[1].$hexColor[2].$hexColor[2];
573 - }
574 -
575 - $r = hexdec(substr($hexColor, 0, 2));
576 - $g = hexdec(substr($hexColor, 2, 2));
577 - $b = hexdec(substr($hexColor, 4, 2));
578 -
579 - return [$r, $g, $b];
580 - }
581 -
582 - public function darkenRGBColor(string $hexColor, int $percent): string
583 - {
584 - $rgbValues = $this->hexToRGB($hexColor);
585 -
586 - $darkenedRGB = array_map(function ($value) use ($percent) {
587 - return max(0, $value - ($value * $percent / 100));
588 - }, $rgbValues);
589 -
590 - return sprintf('rgb(%d, %d, %d)', $darkenedRGB[0], $darkenedRGB[1], $darkenedRGB[2]);
591 - }
592 -
593 - public function confirm(): void
594 - {
595 - if (acym_isRobot()) {
596 - return;
597 - }
598 -
599 - $userClass = new UserClass();
600 - $user = $userClass->identify(true, 'userId', 'userKey');
601 - if (empty($user)) {
602 - acym_enqueueMessage(acym_translation('ACYM_USER_NOT_FOUND'), 'error');
603 - acym_redirect(acym_rootURI());
604 -
605 - return;
606 - }
607 -
608 - if ($this->config->get('confirmation_message', 1)) {
609 - if ($user->confirmed) {
610 - acym_enqueueMessage(acym_translation('ACYM_ALREADY_CONFIRMED'), 'info');
611 - } else {
612 - acym_enqueueMessage(acym_translation('ACYM_SUBSCRIPTION_CONFIRMED'), 'success');
613 - }
614 - }
615 -
616 - if (!$user->confirmed) {
617 - $userClass->confirm($user->id);
618 - }
619 -
620 - $redirectUrl = $this->config->get('confirm_redirect');
621 - if (!empty($redirectUrl)) {
622 - $replace = [];
623 - foreach ($user as $key => $val) {
624 - $replace['{user:'.$key.'}'] = $val;
625 - }
626 - $redirectUrl = str_replace(array_keys($replace), $replace, $redirectUrl);
627 - acym_redirect($redirectUrl);
628 -
629 - return;
630 - }
631 -
632 - acym_redirect(acym_rootURI());
633 - }
634 -
635 - public function profile(): void
636 - {
637 - $userClass = new UserClass();
638 - $user = $userClass->identify(true);
639 -
640 - if (empty($user)) {
641 - $allowvisitor = $this->config->get('allow_visitor', 1);
642 - if (empty($allowvisitor)) {
643 - acym_askLog(true, 'ACYM_ONLY_LOGGED', 'message');
644 -
645 - return;
646 - }
647 - }
648 -
649 - global $acymEmailMisspelledLoaded;
650 - $spellChecker = empty($acymEmailMisspelledLoaded) && !empty($this->config->get('email_spellcheck'));
651 - if ($spellChecker) $acymEmailMisspelledLoaded = true;
652 -
653 - if ($spellChecker) {
654 - acym_addStyle(false, ACYM_CSS.'libraries/email-misspelled.min.css?v='.filemtime(ACYM_MEDIA.'css'.DS.'libraries'.DS.'email-misspelled.min.css'));
655 - acym_addScript(false, ACYM_JS.'libraries/email-misspelled.min.js?v='.filemtime(ACYM_MEDIA.'js'.DS.'libraries'.DS.'email-misspelled.min.js'));
656 - }
657 - acym_addScript(false, ACYM_JS.'module.min.js?v='.filemtime(ACYM_MEDIA.'js'.DS.'module.min.js'));
658 -
659 - $params = new \stdClass();
660 - $menu = acym_getMenu();
661 - if (is_object($menu)) {
662 - $params->source = 'Menu n°'.$menu->id;
663 - $menuParameters = method_exists($menu, 'getParams') ? $menu->getParams() : $menu->params;
664 - $menuparams = new AcymParameter($menuParameters);
665 -
666 - if (!empty($menuparams)) {
667 - $params->suffix = $menuparams->get('pageclass_sfx', '');
668 - $params->page_heading = $menuparams->get('page_heading');
669 - $params->show_page_heading = $menuparams->get('show_page_heading', 0);
670 -
671 - if ($menuparams->get('menu-meta_description')) {
672 - acym_addMetadata('description', $menuparams->get('menu-meta_description'));
673 - }
674 - if ($menuparams->get('menu-meta_keywords')) {
675 - acym_addMetadata('keywords', $menuparams->get('menu-meta_keywords'));
676 - }
677 - if ($menuparams->get('robots')) {
678 - acym_addMetadata('robots', $menuparams->get('robots'));
679 - }
680 -
681 - $params->lists = $menuparams->get('lists', 'none');
682 - $params->listschecked = $menuparams->get('listschecked', 'none');
683 - $params->dropdown = $menuparams->get('dropdown');
684 - $params->hiddenlists = $menuparams->get('hiddenlists', 'None');
685 - $params->fields = $menuparams->get('fields');
686 - $params->introtext = $menuparams->get('introtext');
687 - $params->posttext = $menuparams->get('posttext');
688 - $params->page_title = $menuparams->get('page_title', '');
689 - }
690 - }
691 - $data = $this->prepareParams($params);
692 -
693 - if (empty($data['user']->language)) {
694 - $cmsUserLanguage = acym_getCmsUserLanguage();
695 - $data['user']->language = empty($cmsUserLanguage) ? acym_getLanguageTag() : $cmsUserLanguage;
696 - }
697 -
698 - $data['captchaHelper'] = new CaptchaHelper();
699 -
700 - acym_setVar('layout', 'profile');
701 - parent::display($data);
702 - }
703 -
704 - public function prepareParams(object $values): array
705 - {
706 - if (!isset($values->lists)) {
707 - $values->lists = 'none';
708 - }
709 - if (!isset($values->listschecked)) {
710 - $values->listschecked = 'none';
711 - }
712 - if (!isset($values->dropdown)) {
713 - $values->dropdown = 0;
714 - }
715 - if (!isset($values->hiddenlists)) {
716 - $values->hiddenlists = 'None';
717 - }
718 - if (empty($values->fields)) {
719 - $values->fields = ['1', '2'];
720 - }
721 - if (!in_array('2', $values->fields) && !in_array(2, $values->fields)) {
722 - $values->fields[] = '2';
723 - }
724 - if (!isset($values->introtext)) {
725 - $values->introtext = '';
726 - }
727 - if (!isset($values->posttext)) {
728 - $values->posttext = '';
729 - }
730 -
731 - foreach (['lists', 'listschecked', 'hiddenlists', 'fields'] as $option) {
732 - if (is_string($values->$option)) {
733 - $values->$option = explode(',', $values->$option);
734 - }
735 - }
736 -
737 - if ((empty($values->lists) || in_array('None', $values->lists)) && (empty($values->hiddenlists) || strtolower(implode('', $values->hiddenlists)) == 'none')) {
738 - $values->lists[] = 'All';
739 - }
740 -
741 - $userClass = new UserClass();
742 - $user = $userClass->identify(true);
743 - if (empty($user)) {
744 - $listClass = new ListClass();
745 - $subscription = $listClass->getAll('id');
746 -
747 - if (acym_isMultilingual()) {
748 - $subscription = $listClass->getTranslatedNameDescription($subscription);
749 - }
750 -
751 - $user = new \stdClass();
752 - $user->id = 0;
753 - $user->key = 0;
754 -
755 - if (!empty($subscription)) {
756 - foreach ($subscription as $id => $onesub) {
757 - $subscription[$id]->status = 1;
758 - if (strtolower(implode('', $values->listschecked)) != 'all' && !in_array($id, $values->listschecked)) {
759 - $subscription[$id]->status = -1;
760 - }
761 - }
762 - }
763 -
764 - acym_addBreadcrumb(acym_translation('ACYM_SUBSCRIPTION'));
765 - if (empty($menu)) {
766 - acym_setPageTitle(acym_translation('ACYM_SUBSCRIPTION'));
767 - }
768 - } else {
769 - $subscription = $userClass->getAllListsUserSubscriptionById($user->id, 'id', true);
770 -
771 - acym_addBreadcrumb(acym_translation('ACYM_MODIFY_SUBSCRIPTION'));
772 - if (empty($menu)) {
773 - acym_setPageTitle(acym_translation('ACYM_MODIFY_SUBSCRIPTION'));
774 - }
775 - }
776 -
777 - if (!empty($values->page_title)) {
778 - acym_addBreadcrumb($values->page_title);
779 - if (empty($menu)) {
780 - acym_setPageTitle($values->page_title);
781 - }
782 - }
783 -
784 - $allLists = $subscription;
785 -
786 - acym_initModule();
787 -
788 - if (!empty($values->lists) && strtolower(implode('', $values->lists)) != 'all') {
789 - if (in_array('None', $values->lists)) {
790 - $subscription = [];
791 - } else {
792 - $newSubscription = [];
793 - foreach ($subscription as $id => $onesub) {
794 - if (in_array($id, $values->lists)) {
795 - $newSubscription[$id] = $onesub;
796 - }
797 - }
798 - $subscription = $newSubscription;
799 - }
800 - }
801 -
802 - if (!empty($values->hiddenlists)) {
803 - $hiddenListsArray = [];
804 - if (strtolower(implode('', $values->hiddenlists)) == 'all') {
805 - $subscription = [];
806 - foreach ($allLists as $oneList) {
807 - if (!empty($oneList->active)) {
808 - $hiddenListsArray[] = $oneList->id;
809 - }
810 - }
811 - } elseif (strtolower(implode('', $values->hiddenlists)) != 'none') {
812 - foreach ($allLists as $oneList) {
813 - if (!$oneList->active || !in_array($oneList->id, $values->hiddenlists)) {
814 - continue;
815 - }
816 - $hiddenListsArray[] = $oneList->id;
817 - unset($subscription[$oneList->id]);
818 - }
819 - }
820 - $values->hiddenlists = $hiddenListsArray;
821 - }
822 -
823 - $defaultSubscription = $subscription;
824 - $forceLists = acym_getVar('string', 'listid', '');
825 - if (!empty($forceLists)) {
826 - $subscription = [];
827 - $forceLists = explode(',', $forceLists);
828 - foreach ($forceLists as $oneList) {
829 - if (!empty($defaultSubscription[$oneList])) {
830 - $subscription[$oneList] = $defaultSubscription[$oneList];
831 - }
832 - }
833 - }
834 - $forceHiddenLists = acym_getVar('string', 'hiddenlist', '');
835 - if (!empty($forceHiddenLists)) {
836 - $forceHiddenLists = explode(',', $forceHiddenLists);
837 - $tmpList = [];
838 - foreach ($forceHiddenLists as $oneList) {
839 - if (!empty($defaultSubscription[$oneList]) || in_array($oneList, $values->hiddenlists)) {
840 - $tmpList[] = $oneList;
841 - }
842 - }
843 - $values->hiddenlists = $tmpList;
844 - }
845 -
846 - $displayLists = false;
847 - foreach ($subscription as $oneSub) {
848 - if (!empty($oneSub->active) && $oneSub->visible) {
849 - $displayLists = true;
850 - break;
851 - }
852 - }
853 -
854 - $fieldClass = new FieldClass();
855 - $allfields = $fieldClass->getFieldsByID($values->fields);
856 - $fields = [];
857 - foreach ($allfields as $field) {
858 - if (intval($field->active) === 0) continue;
859 - $fields[$field->id] = $field;
860 - }
861 - $values->fields = $fields;
862 -
863 - $data = [
864 - 'config' => $this->config,
865 - 'displayLists' => $displayLists,
866 - 'user' => $user,
867 - 'subscription' => $subscription,
868 - 'fieldClass' => $fieldClass,
869 - ];
870 -
871 - foreach ($values as $key => $value) {
872 - $data[$key] = $value;
873 - }
874 -
875 - return $data;
876 - }
877 -
878 - public function savechanges(): void
879 - {
880 - acym_checkToken();
881 - acym_checkRobots();
882 -
883 - $userClass = new UserClass();
884 -
885 -
886 - $status = $userClass->saveForm(true);
887 - if ($status) {
888 - if ($userClass->confirmationSentSuccess) {
889 - $this->displayMessage('ACYM_CONFIRMATION_SENT', true, 'success');
890 - } elseif ($userClass->newUser) {
891 - $this->displayMessage('ACYM_SUBSCRIPTION_OK', true, 'success');
892 - } else {
893 - $this->displayMessage('ACYM_SUBSCRIPTION_UPDATED_OK', true, 'success');
894 - }
895 - } elseif (!empty($userClass->requireId)) {
896 - $this->displayMessage('ACYM_IDENTIFICATION_SENT', true, 'success');
897 - } elseif (!empty($userClass->errors)) {
898 - $this->displayMessage(implode('<br/>', $userClass->errors), true);
899 - } else {
900 - $this->displayMessage('ACYM_ERROR_SAVING', true);
901 - }
902 -
903 - exit;
904 - }
905 -
906 - public function exportdata(): void
907 - {
908 - acym_checkToken();
909 -
910 - $userClass = new UserClass();
911 - $user = $userClass->identify(true, 'userId', 'userKey');
912 -
913 - if (empty($user->id)) {
914 - acym_redirect(acym_rootURI());
915 - }
916 -
917 - $userHelper = new UserHelper();
918 - $userData = $userHelper->getUserData($user);
919 - $exportData = [];
920 - foreach ($userData as $oneCategory) {
921 - if (!isset($exportData[$oneCategory['group_label']])) {
922 - $exportData[$oneCategory['group_label']] = [];
923 - }
924 -
925 - $exportData[$oneCategory['group_label']][] = $oneCategory['data'];
926 - }
927 -
928 - $exportFiles = [
929 - [
930 - 'name' => 'data.json',
931 - 'data' => json_encode($exportData),
932 - ],
933 - ];
934 -
935 - $tempFolder = ACYM_MEDIA.'tmp'.DS;
936 - acym_createArchive($tempFolder.'export_data_user_'.$user->id, $exportFiles);
937 -
938 - $exportHelper = new ExportHelper();
939 - $exportHelper->setDownloadHeaders('export_data_user_'.$user->id, 'zip');
940 - readfile($tempFolder.'export_data_user_'.$user->id.'.zip');
941 -
942 - ignore_user_abort(true);
943 - unlink($tempFolder.'export_data_user_'.$user->id.'.zip');
944 - exit;
945 - }
946 -
947 - public function gdprDelete(): void
948 - {
949 - acym_checkToken();
950 -
951 - $userClass = new UserClass();
952 - $user = $userClass->identify(true, 'userId', 'userKey');
953 - if (empty($user->id)) {
954 - acym_redirect(acym_rootURI());
955 - }
956 -
957 - $userClass->delete([$user->id], true);
958 - }
959 -
960 - public function ajaxGetEnqueuedMessages(): void
961 - {
962 - acym_session();
963 -
964 - $output = '';
965 - $types = ['success', 'info', 'warning', 'error'];
966 - foreach ($types as $type) {
967 - if (empty($_SESSION['acymessage'.$type])) continue;
968 -
969 - $messages = $_SESSION['acymessage'.$type];
970 - if (!is_array($messages)) {
971 - $messages = [$messages];
972 - }
973 -
974 - $output .= '<div class="acym_callout acym__callout__front__'.$type.'" role="alert">';
975 - $output .= '<div>'.implode(' ', $messages).'</div>';
976 - $output .= '<button class="acym_callout_close" aria-label="'.acym_escape(acym_translation('ACYM_CLOSE_NOTIFICATION')).'">x</button></div>';
977 -
978 - unset($_SESSION['acymessage'.$type]);
979 - }
980 -
981 - if (!empty($output)) {
982 - $output = '<div id="acym__callout__container">'.$output.'</div>';
983 - }
984 - acym_sendAjaxResponse('', ['messages' => $output]);
985 - }
986 -}