includes/dashboard/privacy.php
<?php
declare(strict_types=1);
/*
|--------------------------------------------------------------------------
| Privacy transparency
|--------------------------------------------------------------------------
|
| The privacy modal mirrors Brivacia's current runtime behavior.
| Values shown here come from the same core helpers used by the pixel:
| - brivaciaIpPrefix()
| - brivaciaNormalizeUserAgent()
| - visitorHash()
| - geoLookup()
|
*/
function privacyYesNo(?bool $value): string
{
if ($value === null) {
return t('ui.unknown');
}
return $value ? t('ui.yes') : t('ui.no');
}
function privacyIpPreview(string $prefix): string
{
$prefix = trim($prefix);
if ($prefix === '') {
return t('ui.unknown');
}
if (str_contains($prefix, ':')) {
return $prefix . ':…';
}
$visibleParts = explode('.', $prefix);
$maskedParts = array_fill(0, max(0, 4 - count($visibleParts)), 'x');
return implode('.', array_merge($visibleParts, $maskedParts));
}
function privacyLabelFromBucketPart(string $value): string
{
$value = trim($value);
if ($value === '' || $value === 'other') {
return t('ui.unknown');
}
return ucfirst($value);
}
$visitorDay = date('Y-m-d');
$visitorUa = (string)($_SERVER['HTTP_USER_AGENT'] ?? '');
$visitorIp = brivaciaClientIp();
$visitorIpPrefix = brivaciaIpPrefix($visitorIp);
$visitorUaBucket = brivaciaNormalizeUserAgent($visitorUa);
[$visitorBrowserFamily, $visitorPlatformFamily] = array_pad(
explode('|', $visitorUaBucket, 2),
2,
'other'
);
$visitorGeo = geoLookup($visitorIp);
$visitorCountry = (string)($visitorGeo['country'] ?? BRIVACIA_UNKNOWN);
$visitorGeoProvider = (string)($visitorGeo['provider'] ?? '');
$visitorVpn = $visitorGeo['vpn'] ?? null;
$visitorHash = visitorHash($visitorDay, $visitorUa, $visitorIp);
$visitorSeenToday = (int)(one($db, "
SELECT COUNT(*) AS total
FROM seen_daily
WHERE day = ? AND visitor_hash = ?
", [$visitorDay, $visitorHash])['total'] ?? 0);
$visitorReturnedToday = (bool)(one($db, "
SELECT returned_today
FROM visitor_sessions
WHERE day = ? AND visitor_hash = ?
", [$visitorDay, $visitorHash])['returned_today'] ?? 0);
$visitorDbSnapshot = [
'visited_today' => privacyYesNo($visitorSeenToday > 0),
'already_visited_today' => privacyYesNo($visitorReturnedToday),
'ip_preview' => privacyIpPreview($visitorIpPrefix),
'country' => $visitorCountry,
'os' => privacyLabelFromBucketPart($visitorPlatformFamily),
'browser_family' => privacyLabelFromBucketPart($visitorBrowserFamily),
];