Skip to content
Merged
Show file tree
Hide file tree
Changes from 131 commits
Commits
Show all changes
138 commits
Select commit Hold shift + click to select a range
fa5828c
Extend anonymisation settings to allow them to be site specific
michalkleiner Jul 21, 2025
433f979
Mark api methods as internal
michalkleiner Jul 22, 2025
51dbcf7
Only set idSite if truthy
michalkleiner Jul 23, 2025
5b6dc78
Mark UI-only API methods as ignored for system tests
michalkleiner Jul 23, 2025
fd0282c
Update UI test screenshots
michalkleiner Jul 23, 2025
ccfb1bb
Use correct cache setting method
michalkleiner Jul 24, 2025
6d884c6
Remove controller methods and use API instead
michalkleiner Jul 24, 2025
17854e2
Use local variable
michalkleiner Jul 24, 2025
8f03851
Remove ignore annotation so the method is available via API
michalkleiner Jul 24, 2025
5fe367b
Use better descriptive name
michalkleiner Jul 24, 2025
56b963b
Fix test
michalkleiner Jul 25, 2025
f8e1742
Merge branch '5.x-dev' into dev-19315
michalkleiner Jul 30, 2025
6f7abd7
Tweaks from testing
michalkleiner Jul 31, 2025
396027f
Add more privacy config tests
michalkleiner Jul 31, 2025
9211dca
Merge branch '5.x-dev' into dev-19315
michalkleiner Jul 31, 2025
8176f20
Fix CS and minor comment tweaks
michalkleiner Jul 31, 2025
c48ac89
Add expected system test files for new PrivacyManager API method
michalkleiner Jul 31, 2025
0875739
Fix CS
michalkleiner Jul 31, 2025
0e00852
Remove forgotten logging
michalkleiner Jul 31, 2025
8946262
Build vue files
innocraft-automation Jul 31, 2025
f0f9c72
Undo comment change as now covered by PHPStan baseline exception
michalkleiner Aug 1, 2025
bdf0b84
Fix CS
michalkleiner Aug 4, 2025
9ad3b6e
Temporarily update submodule reference
michalkleiner Aug 4, 2025
f536069
Merge branch '5.x-dev' into dev-19315
michalkleiner Aug 4, 2025
8e52ccf
Temporarily update submodule reference
michalkleiner Aug 4, 2025
a64a817
Merge branch '5.x-dev' into dev-19315
michalkleiner Aug 7, 2025
e3a6b1e
Merge branch '5.x-dev' into dev-19315
michalkleiner Aug 8, 2025
56fb3ed
Use site-specific config in more places
michalkleiner Aug 8, 2025
2c6e0a1
Fix CS after 5.x-dev merge
michalkleiner Aug 8, 2025
4986135
Add class to cancel button
michalkleiner Aug 8, 2025
5e983a4
Add classes to individual field wrappers for easier targetting in tests
michalkleiner Aug 8, 2025
afd8211
Add site information to the top of anonymisation settings
michalkleiner Aug 8, 2025
fcbdc3f
Add site-specific privacy settings UI test and screenshots
michalkleiner Aug 8, 2025
96c9145
Merge branch '5.x-dev' into dev-19315
michalkleiner Aug 8, 2025
564ecdd
Remove option to set cookieless tracking per site
michalkleiner Aug 13, 2025
7328283
Remove console debugging
michalkleiner Aug 13, 2025
3861ed9
Fix type hints in class annotation
michalkleiner Aug 13, 2025
e57194d
Build dist files
michalkleiner Aug 13, 2025
2511399
Merge branch '5.x-dev' into dev-19315
michalkleiner Aug 13, 2025
f0bf67b
Use instance privacy config as cookieless tracking can't be site-spec…
michalkleiner Aug 13, 2025
204eceb
Fix CS
michalkleiner Aug 13, 2025
5b018af
Update UI test screenshots from CI
michalkleiner Aug 13, 2025
620440c
Update PHPStan baseline
michalkleiner Aug 13, 2025
ed36728
Merge branch '5.x-dev' into dev-19315
michalkleiner Aug 13, 2025
abd669d
Further removal of cookieless tracking related changes
michalkleiner Aug 13, 2025
3e2f829
Update type hint
michalkleiner Aug 14, 2025
b1bfb1a
Allow re-setting anonymisation config for all sites
michalkleiner Aug 14, 2025
5e209cf
Remove forgotten logger
michalkleiner Aug 14, 2025
142cea8
Ensure we always have ?int site id
michalkleiner Aug 14, 2025
364cb02
Cater for possibility of PrivacyManager plugin being disabled
michalkleiner Aug 14, 2025
a0750fa
Adjust permissions check within the API setter
michalkleiner Aug 14, 2025
01508ec
Add site-specific suffix to field names (when available) to prevent o…
michalkleiner Aug 14, 2025
3a6aaa8
Add UI test for scenario with disabled PrivacyManager plugin
michalkleiner Aug 14, 2025
b40bb2c
Fix CS
michalkleiner Aug 14, 2025
0d725b6
Merge branch '5.x-dev' into dev-19315
michalkleiner Aug 14, 2025
9f3ef08
Merge branch '5.x-dev' into dev-19315
michalkleiner Aug 14, 2025
4c3b9fd
Add type hints to API setter
michalkleiner Aug 14, 2025
1081732
Update UI test selectors after making field IDs unique
michalkleiner Aug 14, 2025
180f5e8
Update UI test screenshot from CI
michalkleiner Aug 14, 2025
7795df6
Fix UI test selectors
michalkleiner Aug 14, 2025
86dac77
Merge branch '5.x-dev' into dev-19315
michalkleiner Aug 14, 2025
20c5abd
Merge branch '5.x-dev' into dev-19315
michalkleiner Aug 18, 2025
ef3ec5b
Revert changes to API method name and params for ActivityLog compatib…
michalkleiner Aug 19, 2025
4cd3c6c
Bump version so that ActivityLog can support the new API params
michalkleiner Aug 19, 2025
cf9065e
Merge branch '5.x-dev' into dev-19315
michalkleiner Aug 19, 2025
28ad882
Merge branch '5.x-dev' into dev-19315
michalkleiner Aug 27, 2025
409eaa4
Merge branch '5.x-dev' into dev-19315
michalkleiner Sep 2, 2025
79b8515
Move site-specific anonymisation settings into the standard edit form
michalkleiner Sep 2, 2025
dc3d289
Update UI tests
michalkleiner Sep 2, 2025
b1de46f
Merge branch '5.x-dev' into dev-19315
michalkleiner Sep 2, 2025
ada71c2
Don't show anonymisation settings when creating a new site
michalkleiner Sep 2, 2025
a330d89
Update UI test screenshots
michalkleiner Sep 2, 2025
9e232bc
Revert sites manager button layout
michalkleiner Sep 2, 2025
89411c2
Revert "Update UI test screenshots"
michalkleiner Sep 2, 2025
b346bf6
Add link to system-level privacy settings
michalkleiner Sep 2, 2025
c574bb2
Update UI test screenshots
michalkleiner Sep 2, 2025
29920d4
Update TagManager submodule
michalkleiner Sep 2, 2025
6ceba5d
Use site specific id selector for UTC help text
michalkleiner Sep 3, 2025
630d9ca
Hide UTC selector in UI tests
michalkleiner Sep 3, 2025
75da914
Merge branch '5.x-dev' into dev-19315
michalkleiner Sep 3, 2025
cd313ec
Update UI tests
michalkleiner Sep 3, 2025
d565775
Update UI test screenshots from CI
michalkleiner Sep 3, 2025
d6ca1e5
Update TagManager submodule
michalkleiner Sep 3, 2025
f95184e
Update TagManager submodule
michalkleiner Sep 3, 2025
d1b92e6
Increase maximum bundle size
michalkleiner Sep 3, 2025
a6e9388
Adjust per-site anonymisation to only use a single save button
michalkleiner Sep 3, 2025
95f7678
Update UI test and test screenshots after using a single set of save/…
michalkleiner Sep 3, 2025
7e295e4
Update UI test screenshots from CI
michalkleiner Sep 4, 2025
05024a4
Only trigger privacy settings save when editing existing site
michalkleiner Sep 4, 2025
395bef6
Merge branch '5.x-dev' into dev-19315
michalkleiner Sep 8, 2025
fcd5a5d
Apply review feedback
michalkleiner Sep 8, 2025
4e45503
Update UI test screenshots from CI
michalkleiner Sep 8, 2025
c429f01
Refactor fixture to prepare tracker in a reusable way
michalkleiner Sep 10, 2025
e9cb963
Update type hint to accept floats when adding hours
michalkleiner Sep 10, 2025
2460511
Track extra visit to side id 2
michalkleiner Sep 10, 2025
15ada60
Add test for IP anonymisation settings
michalkleiner Sep 10, 2025
7074afa
Add expected API response files for site-specific anonymisation
michalkleiner Sep 10, 2025
dfaaa3f
Fix getting global fallback value before resolving to default value
michalkleiner Sep 10, 2025
7ebe4de
Merge branch '5.x-dev' into dev-19315
michalkleiner Sep 16, 2025
04819be
Merge branch '5.x-dev' into dev-19315
michalkleiner Sep 17, 2025
9976eeb
Update implementation after 5.x-dev merge
michalkleiner Sep 16, 2025
9d0761a
Ensure password is required when setting config id randomisation per …
michalkleiner Sep 17, 2025
a117286
Remove config id randomisation feature flag from API response for set…
michalkleiner Sep 17, 2025
2654d80
Add tests for config id randomisation using per-site settings
michalkleiner Sep 17, 2025
6c64f56
Remove unused method
michalkleiner Sep 17, 2025
9497fd9
Add type hints to API setter
michalkleiner Sep 17, 2025
17ca7f4
Fix variable name after refactoring
michalkleiner Sep 18, 2025
7f944c0
Fix CS
michalkleiner Sep 18, 2025
ff82190
Fix API param name after refactoring
michalkleiner Sep 18, 2025
26073e8
Update UI test screenshots
michalkleiner Sep 18, 2025
9199e38
Merge branch '5.x-dev' into dev-19315
michalkleiner Sep 19, 2025
66140c6
Update UI test screenshots
michalkleiner Sep 19, 2025
da9dfa1
Ensure password is only required when enabling config id randomisation
michalkleiner Sep 22, 2025
e6c1e7f
Disable saving state when success notification is displayed
michalkleiner Sep 22, 2025
df60d38
Merge branch '5.x-dev' into dev-19315
caddoo Sep 23, 2025
d66a227
Merge branch '5.x-dev' into dev-19315
caddoo Sep 26, 2025
3f4d6aa
Merge branch '5.x-dev' into dev-19315
michalkleiner Sep 26, 2025
e4e7635
Merge branch '5.x-dev' into dev-19315
michalkleiner Oct 1, 2025
e39b32d
Update config to work with compliance policy mechanism and per-site s…
michalkleiner Oct 2, 2025
db427d2
Improve code legibility and add docblocks
michalkleiner Oct 2, 2025
0132d04
Rebuild dist file
michalkleiner Oct 2, 2025
c148806
Use Config's mechanism to get raw option value
michalkleiner Oct 2, 2025
4eb3d5b
Fix type
michalkleiner Oct 2, 2025
fd59bb3
Fix namespace
michalkleiner Oct 2, 2025
3e04463
Update test to cater for ip mask length and ip anonymisation being se…
michalkleiner Oct 2, 2025
dc53a25
Revert baseline change
michalkleiner Oct 2, 2025
473b0f6
Remove getOptionValue overrides
michalkleiner Oct 3, 2025
e4eac3a
Revert "Remove getOptionValue overrides"
michalkleiner Oct 3, 2025
9273862
Add a custom setting interface for cases where the setting value is p…
michalkleiner Oct 3, 2025
17fa142
Use custom setting interface
michalkleiner Oct 3, 2025
c517015
Merge branch '5.x-dev' into dev-19315
michalkleiner Oct 6, 2025
e031dbc
Update TagManager submodule
michalkleiner Oct 7, 2025
eba84bc
Add interface types
michalkleiner Oct 7, 2025
cee9213
Add explicit API method param type
michalkleiner Oct 7, 2025
b35ba78
Ensure site-specific settings are removed when a site is deleted
michalkleiner Oct 7, 2025
337f5cf
Merge branch '5.x-dev' into dev-19315
michalkleiner Oct 7, 2025
31fcbb2
Update expected system tests to a correct global default value
michalkleiner Oct 7, 2025
97b7f6d
Update UI test screenshot from CI
michalkleiner Oct 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions core/Date.php
Original file line number Diff line number Diff line change
Expand Up @@ -1008,7 +1008,7 @@ public function addMonth($n)
/**
* Adds `$n` hours to `$this` date and returns the result in a new Date.
*
* @param int $n Number of hours to add. Can be less than 0.
* @param int|float $n Number of hours to add. Can be less than 0, can be decimal (will get converted to minutes)
* @return \Piwik\Date
*/
public function addHour($n)
Expand All @@ -1022,7 +1022,7 @@ public function addHour($n)
* this static function instead of {@link addHour()} will be faster since a
* Date instance does not have to be created.
*
* @param int $timestamp The timestamp to add to.
* @param int|float $timestamp The timestamp to add to.
* @param number $n Number of hours to add, must be > 0.
* @return int The result as a UNIX timestamp.
*/
Expand Down
8 changes: 8 additions & 0 deletions core/Settings/Interfaces/CustomSettingInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

namespace Piwik\Settings\Interfaces;

interface CustomSettingInterface
{
public static function getCustomValue(?int $idSite = null);
}
2 changes: 1 addition & 1 deletion core/Settings/Interfaces/OptionSettingInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@ interface OptionSettingInterface
/**
* @return string|false
*/
public static function getOptionValue();
public static function getOptionValue(?int $idSite = null);
}
9 changes: 3 additions & 6 deletions core/Settings/Interfaces/Traits/Getters/OptionGetterTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,14 @@
*/
trait OptionGetterTrait
{
/**
* @return string|null
*/
public static function getOptionValue()
public static function getOptionValue(?int $idSite = null): ?string
{
$optionValue = Option::get(self::getOptionName());
$optionValue = Option::get(self::getOptionName($idSite));
if ($optionValue !== false) {
return $optionValue;
}
return null;
}

abstract protected static function getOptionName(): string;
abstract protected static function getOptionName(?int $idSite = null): string;
}
12 changes: 1 addition & 11 deletions phpstan-baseline.neon
Original file line number Diff line number Diff line change
Expand Up @@ -5698,16 +5698,6 @@ parameters:
count: 1
path: plugins/PrivacyManager/API.php

-
message: "#^Property Piwik\\\\Plugins\\\\PrivacyManager\\\\Config\\:\\:\\$anonymizeOrderId \\(int\\) does not accept bool\\.$#"
count: 1
path: plugins/PrivacyManager/API.php

-
message: "#^Property Piwik\\\\Plugins\\\\PrivacyManager\\\\Config\\:\\:\\$anonymizeUserId \\(int\\) does not accept bool\\.$#"
count: 1
path: plugins/PrivacyManager/API.php

-
message: "#^Binary operation \"\\+\" between non\\-falsy\\-string and int results in an error\\.$#"
count: 1
Expand Down Expand Up @@ -6439,7 +6429,7 @@ parameters:
path: plugins/UsersManager/API.php

-
message: "#^Parameter \\#1 \\$n of method Piwik\\\\Date\\:\\:addHour\\(\\) expects int, string given\\.$#"
message: "#^Parameter \\#1 \\$n of method Piwik\\\\Date\\:\\:addHour\\(\\) expects float\\|int, string given\\.$#"
count: 1
path: plugins/UsersManager/API.php

Expand Down
5 changes: 3 additions & 2 deletions plugins/CoreHome/Tracker/VisitRequestProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ public function processRequestParams(VisitProperties $visitProperties, Request $
return true;
}

$privacyConfig = new PrivacyManagerConfig();
$privacyConfig = new PrivacyManagerConfig($request->getIdSiteIfExists());

if ($privacyConfig->randomizeConfigId) {
// always new visit when randomising config id
Expand Down Expand Up @@ -155,8 +155,9 @@ public function afterRequestProcessed(VisitProperties $visitProperties, Request
* This event is primarily used by the **PrivacyManager** plugin to anonymize IP addresses.
*
* @param string &$ip The visitor's IP address.
* @param int $idSite The site ID we're tracking the visit for.
*/
$this->eventDispatcher->postEvent('Tracker.setVisitorIp', array(&$ip));
$this->eventDispatcher->postEvent('Tracker.setVisitorIp', [&$ip, (int) $request->getIdSiteIfExists()]);

$visitProperties->setProperty('location_ip', $ip);

Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
144 changes: 103 additions & 41 deletions plugins/PrivacyManager/API.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
use Piwik\Piwik;
use Piwik\Config as PiwikConfig;
use Piwik\Plugin\Manager;
use Piwik\Plugins\CustomJsTracker\File;
use Piwik\Plugins\FeatureFlags\FeatureFlagManager;
use Piwik\Plugins\Live\Live;
use Piwik\Plugins\PrivacyManager\FeatureFlags\PrivacyCompliance;
Expand All @@ -26,6 +27,7 @@
use Piwik\Policy\CompliancePolicy;
use Piwik\Policy\PolicyManager;
use Piwik\Site;
use Piwik\Tracker\TrackerCodeGenerator;
use Piwik\Validators\BaseValidator;

/**
Expand All @@ -50,11 +52,6 @@ class API extends \Piwik\Plugin\API
*/
private $logDataAnonymizer;

/**
* @var ReferrerAnonymizer
*/
private $referrerAnonymizer;

/**
* @var FeatureFlagManager
*/
Expand All @@ -65,13 +62,11 @@ public function __construct(
DataSubjects $gdpr,
LogDataAnonymizations $logDataAnonymizations,
LogDataAnonymizer $logDataAnonymizer,
ReferrerAnonymizer $referrerAnonymizer,
FeatureFlagManager $featureFlagManager
) {
$this->gdpr = $gdpr;
$this->logDataAnonymizations = $logDataAnonymizations;
$this->logDataAnonymizer = $logDataAnonymizer;
$this->referrerAnonymizer = $referrerAnonymizer;
$this->featureFlagManager = $featureFlagManager;
}

Expand Down Expand Up @@ -237,66 +232,133 @@ private function formatAvailableColumnsToAnonymize($columns)
return $formatted;
}

/**
* Provide tracker file name and whether it's writable
*
* @return array{0: string, 1: bool}
*/
private function getTrackerFileDetails(): array
{
if (Piwik::hasUserSuperUserAccess()) {
$jsCodeGenerator = new TrackerCodeGenerator();
$file = new File(PIWIK_DOCUMENT_ROOT . '/' . $jsCodeGenerator->getJsTrackerEndpoint());
$filename = $jsCodeGenerator->getJsTrackerEndpoint();

if (Manager::getInstance()->isPluginActivated('CustomJsTracker')) {
$file = StaticContainer::get('Piwik\Plugins\CustomJsTracker\TrackerUpdater')->getToFile();
$filename = $file->getName();
}

return [$filename, $file->hasWriteAccess()];
}

return ['', false];
}

/**
* Provide anonymisation settings to Matomo UI only
*
* @internal
*/
public function getAnonymisationSettings(?int $idSiteSpecific = null): array
{
if (is_numeric($idSiteSpecific)) {
$idSite = intval($idSiteSpecific);
Piwik::checkUserHasAdminAccess($idSiteSpecific);
} else {
$idSite = null;
Piwik::checkUserHasSuperUserAccess();
}

$privacyConfig = new Config($idSite);
$settings = [];
foreach ($privacyConfig->getConfigPropertyNames() as $propertyName) {
$settings[$propertyName] = $privacyConfig->{$propertyName};
}
$settings['useSiteSpecificSettings'] = $privacyConfig->useSiteSpecificSettings();

// provide extra settings
[$trackerFilename, $trackerFileWritable] = $this->getTrackerFileDetails();
$settings = array_merge($settings, [
'maskLengthOptions' => PrivacyManager::getMaskLengthOptions(),
'useAnonymizedIpForVisitEnrichmentOptions' =>
PrivacyManager::getUseAnonymizedIpForVisitEnrichmentOptions(),
'referrerAnonymizationOptions' => ReferrerAnonymizer::getAvailableAnonymizationOptions(),
'trackerFileName' => $trackerFilename,
'trackerWritable' => $trackerFileWritable,
]);

return $settings;
}

/**
* @internal
*/
public function setAnonymizeIpSettings(
$anonymizeIPEnable,
$maskLength,
$useAnonymizedIpForVisitEnrichment,
$anonymizeUserId = false,
$anonymizeOrderId = false,
$anonymizeReferrer = '',
$forceCookielessTracking = false,
$randomizeConfigId = false,
bool $anonymizeIPEnable,
int $ipAddressMaskLength,
bool $useAnonymizedIpForVisitEnrichment,
bool $anonymizeUserId = false,
bool $anonymizeOrderId = false,
string $anonymizeReferrer = '',
bool $forceCookielessTracking = false,
bool $randomizeConfigId = false,
?int $idSiteSpecific = null,
bool $useSiteSpecificSettings = false,
#[\SensitiveParameter]
$passwordConfirmation = ''
string $passwordConfirmation = ''
) {
Piwik::checkUserHasSuperUserAccess();
if (null !== $idSiteSpecific) {
$idSite = $idSiteSpecific;
Piwik::checkUserHasAdminAccess($idSiteSpecific);
} else {
$idSite = null;
Piwik::checkUserHasSuperUserAccess();
}

// if we receive a specific site ID, and it's set not to use custom site settings, we need to remove them
// so that the behaviour defaults to the system settings
if ($idSite && !$useSiteSpecificSettings) {
$privacyConfig = new Config($idSite);
$privacyConfig->removeForSite();

if ($randomizeConfigId == '1') {
return true;
}

if ($randomizeConfigId) {
$this->confirmCurrentUserPassword($passwordConfirmation);
}

if ($anonymizeIPEnable == '1') {
IPAnonymizer::activate();
} elseif ($anonymizeIPEnable == '0') {
IPAnonymizer::deactivate();
if ($anonymizeIPEnable) {
IPAnonymizer::activate($idSite);
} else {
// pass
IPAnonymizer::deactivate($idSite);
}

if (
!empty($anonymizeReferrer)
&& !array_key_exists($anonymizeReferrer, $this->referrerAnonymizer->getAvailableAnonymizationOptions())
&& !array_key_exists($anonymizeReferrer, ReferrerAnonymizer::getAvailableAnonymizationOptions())
) {
$anonymizeReferrer = '';
}

$privacyConfig = new Config();
$privacyConfig->ipAddressMaskLength = (int) $maskLength;
$privacyConfig->useAnonymizedIpForVisitEnrichment = (bool) $useAnonymizedIpForVisitEnrichment;
$privacyConfig = new Config($idSite);
$privacyConfig->ipAddressMaskLength = $ipAddressMaskLength;
$privacyConfig->useAnonymizedIpForVisitEnrichment = $useAnonymizedIpForVisitEnrichment;
$privacyConfig->anonymizeReferrer = $anonymizeReferrer;
$privacyConfig->anonymizeUserId = $anonymizeUserId;
$privacyConfig->anonymizeOrderId = $anonymizeOrderId;
$privacyConfig->randomizeConfigId = $randomizeConfigId;

if (false !== $anonymizeUserId) {
$privacyConfig->anonymizeUserId = (bool) $anonymizeUserId;
}

if (false !== $anonymizeOrderId) {
$privacyConfig->anonymizeOrderId = (bool) $anonymizeOrderId;
}

if (false !== $forceCookielessTracking) {
$privacyConfig->forceCookielessTracking = (bool) $forceCookielessTracking;
if (!$idSite) {
// only allow setting 'force cookieless tracking' instance-wide and skip it for site as it applies
// changes to JS tracker files that we can't currently support on a per-site basis
$privacyConfig->forceCookielessTracking = $forceCookielessTracking;

// update tracker files
Piwik::postEvent('CustomJsTracker.updateTracker');
}

if (false !== $randomizeConfigId) {
$privacyConfig->randomizeConfigId = (bool) $randomizeConfigId;
}

return true;
}

Expand Down
Loading
Loading