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),
];

Contribute