From 88ce597f1e898b76c2f22d78e7fa735073426679 Mon Sep 17 00:00:00 2001 From: magdev Date: Thu, 26 Feb 2026 07:28:45 +0100 Subject: [PATCH] feat: Add environment variable support for license settings, fix German umlauts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add WP_PROMETHEUS_LICENSE_SERVER_URL, WP_PROMETHEUS_LICENSE_KEY, and WP_PROMETHEUS_LICENSE_SERVER_SECRET environment variables for Docker/container deployments. Admin UI disables inputs and shows override notice when env vars are set. Help tab documents the new variables with Docker Compose example. Fix all German (de_CH) translations to use proper umlauts (ä, ö, ü) instead of ASCII digraph substitutions (ae, oe, ue). Swiss German uses umlauts normally, only ß is replaced with ss. Co-Authored-By: Claude Opus 4.6 --- languages/wp-prometheus-de_CH.mo | Bin 22340 -> 23136 bytes languages/wp-prometheus-de_CH.po | 178 ++++++++++++++++++------------- languages/wp-prometheus.pot | 24 +++++ src/Admin/Settings.php | 42 +++++++- src/License/Manager.php | 39 +++++++ 5 files changed, 202 insertions(+), 81 deletions(-) diff --git a/languages/wp-prometheus-de_CH.mo b/languages/wp-prometheus-de_CH.mo index 8b7480b775ce58f7b37f922ad3f15d166f6b5a2d..027db52394f4c8b6e1314ad4d62d1e71d4d39c9a 100644 GIT binary patch delta 7012 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 qr5BoZSGJCdah6 Import" @@ -539,11 +551,11 @@ msgstr "Gehen Sie in Grafana zu Dashboards > Import" #: src/Admin/Settings.php msgid "Upload the JSON file or paste its contents" -msgstr "Laden Sie die JSON-Datei hoch oder fuegen Sie deren Inhalt ein" +msgstr "Laden Sie die JSON-Datei hoch oder fügen Sie deren Inhalt ein" #: src/Admin/Settings.php msgid "Select your Prometheus data source" -msgstr "Waehlen Sie Ihre Prometheus-Datenquelle" +msgstr "Wählen Sie Ihre Prometheus-Datenquelle" #: src/Admin/Settings.php msgid "Click Import" @@ -555,7 +567,7 @@ msgstr "Metrik-Name ist erforderlich." #: src/Metrics/CustomMetricBuilder.php msgid "Invalid metric name format." -msgstr "Ungueltiges Metrik-Namensformat." +msgstr "Ungültiges Metrik-Namensformat." #: src/Metrics/CustomMetricBuilder.php msgid "A metric with this name already exists." @@ -567,7 +579,7 @@ msgstr "Hilfetext ist erforderlich." #: src/Metrics/CustomMetricBuilder.php msgid "Invalid value type." -msgstr "Ungueltiger Werttyp." +msgstr "Ungültiger Werttyp." #: src/Metrics/CustomMetricBuilder.php msgid "Static value must be numeric." @@ -575,7 +587,7 @@ msgstr "Statischer Wert muss numerisch sein." #: src/Metrics/CustomMetricBuilder.php msgid "Option name is required for option value type." -msgstr "Optionsname ist fuer den Options-Werttyp erforderlich." +msgstr "Optionsname ist für den Options-Werttyp erforderlich." #. translators: %d: Maximum number of labels #: src/Metrics/CustomMetricBuilder.php @@ -584,7 +596,7 @@ msgstr "Maximal %d Labels erlaubt." #: src/Metrics/CustomMetricBuilder.php msgid "Invalid label name format." -msgstr "Ungueltiges Label-Namensformat." +msgstr "Ungültiges Label-Namensformat." #. translators: %d: Maximum number of label value combinations #: src/Metrics/CustomMetricBuilder.php @@ -593,11 +605,11 @@ msgstr "Maximal %d Label-Wert-Kombinationen erlaubt." #: src/Metrics/CustomMetricBuilder.php msgid "Invalid JSON format." -msgstr "Ungueltiges JSON-Format." +msgstr "Ungültiges JSON-Format." #: src/Metrics/CustomMetricBuilder.php msgid "Invalid export format." -msgstr "Ungueltiges Export-Format." +msgstr "Ungültiges Export-Format." #: src/Plugin.php msgid "Settings" @@ -606,21 +618,21 @@ msgstr "Einstellungen" #. translators: 1: Required PHP version, 2: Current PHP version #: wp-prometheus.php msgid "WP Prometheus requires PHP version %1$s or higher. You are running PHP %2$s." -msgstr "WP Prometheus erfordert PHP-Version %1$s oder hoeher. Sie verwenden PHP %2$s." +msgstr "WP Prometheus erfordert PHP-Version %1$s oder höher. Sie verwenden PHP %2$s." #. translators: 1: Required WordPress version, 2: Current WordPress version #: wp-prometheus.php msgid "WP Prometheus requires WordPress version %1$s or higher. You are running WordPress %2$s." -msgstr "WP Prometheus erfordert WordPress-Version %1$s oder hoeher. Sie verwenden WordPress %2$s." +msgstr "WP Prometheus erfordert WordPress-Version %1$s oder höher. Sie verwenden WordPress %2$s." #: wp-prometheus.php msgid "WP Prometheus requires Composer dependencies to be installed. Please run \"composer install\" in the plugin directory." -msgstr "WP Prometheus erfordert installierte Composer-Abhaengigkeiten. Bitte fuehren Sie \"composer install\" im Plugin-Verzeichnis aus." +msgstr "WP Prometheus erfordert installierte Composer-Abhängigkeiten. Bitte führen Sie \"composer install\" im Plugin-Verzeichnis aus." #. translators: %s: Required PHP version #: wp-prometheus.php msgid "WP Prometheus requires PHP version %s or higher." -msgstr "WP Prometheus erfordert PHP-Version %s oder hoeher." +msgstr "WP Prometheus erfordert PHP-Version %s oder höher." #: src/Admin/Settings.php msgid "Storage" @@ -632,15 +644,15 @@ msgstr "Metriken-Speicherkonfiguration" #: src/Admin/Settings.php msgid "Configure how Prometheus metrics are stored. Persistent storage (Redis, APCu) allows metrics to survive between requests and aggregate data over time." -msgstr "Konfigurieren Sie, wie Prometheus-Metriken gespeichert werden. Persistenter Speicher (Redis, APCu) ermoeglicht es, Metriken zwischen Anfragen zu erhalten und Daten ueber Zeit zu aggregieren." +msgstr "Konfigurieren Sie, wie Prometheus-Metriken gespeichert werden. Persistenter Speicher (Redis, APCu) ermöglicht es, Metriken zwischen Anfragen zu erhalten und Daten über Zeit zu aggregieren." #: src/Admin/Settings.php msgid "Environment Override Active" -msgstr "Umgebungsvariablen-Ueberschreibung aktiv" +msgstr "Umgebungsvariablen-Überschreibung aktiv" #: src/Admin/Settings.php msgid "Storage adapter is configured via environment variable. Admin settings will be ignored." -msgstr "Speicher-Adapter ist ueber Umgebungsvariable konfiguriert. Admin-Einstellungen werden ignoriert." +msgstr "Speicher-Adapter ist über Umgebungsvariable konfiguriert. Admin-Einstellungen werden ignoriert." #: src/Admin/Settings.php msgid "Storage Fallback Active" @@ -648,7 +660,7 @@ msgstr "Speicher-Fallback aktiv" #: src/Admin/Settings.php msgid "Falling back to In-Memory storage." -msgstr "Faellt zurueck auf In-Memory-Speicher." +msgstr "Fällt zurück auf In-Memory-Speicher." #: src/Admin/Settings.php msgid "Current Status:" @@ -665,11 +677,11 @@ msgstr "Speicher-Adapter" #: src/Admin/Settings.php msgid "unavailable" -msgstr "nicht verfuegbar" +msgstr "nicht verfügbar" #: src/Admin/Settings.php msgid "Select the storage backend for metrics. Redis and APCu require their respective PHP extensions." -msgstr "Waehlen Sie das Speicher-Backend fuer Metriken. Redis und APCu erfordern ihre jeweiligen PHP-Erweiterungen." +msgstr "Wählen Sie das Speicher-Backend für Metriken. Redis und APCu erfordern ihre jeweiligen PHP-Erweiterungen." #: src/Admin/Settings.php msgid "Redis Configuration" @@ -682,7 +694,7 @@ msgstr "Host" #. translators: %s: Environment variable name #: src/Admin/Settings.php msgid "Can be overridden with %s environment variable." -msgstr "Kann mit Umgebungsvariable %s ueberschrieben werden." +msgstr "Kann mit Umgebungsvariable %s überschrieben werden." #: src/Admin/Settings.php msgid "Port" @@ -703,15 +715,15 @@ msgstr "Datenbank" #. translators: %s: Environment variable name #: src/Admin/Settings.php msgid "Redis database index (0-15). Can be overridden with %s." -msgstr "Redis-Datenbankindex (0-15). Kann mit %s ueberschrieben werden." +msgstr "Redis-Datenbankindex (0-15). Kann mit %s überschrieben werden." #: src/Admin/Settings.php msgid "Key Prefix" -msgstr "Schluessel-Praefix" +msgstr "Schlüssel-Präfix" #: src/Admin/Settings.php msgid "Prefix for Redis keys. Useful when sharing Redis with other applications." -msgstr "Praefix fuer Redis-Schluessel. Nuetzlich bei gemeinsamer Redis-Nutzung mit anderen Anwendungen." +msgstr "Präfix für Redis-Schlüssel. Nützlich bei gemeinsamer Redis-Nutzung mit anderen Anwendungen." #: src/Admin/Settings.php msgid "APCu Configuration" @@ -720,7 +732,7 @@ msgstr "APCu-Konfiguration" #. translators: %s: Environment variable name #: src/Admin/Settings.php msgid "Prefix for APCu keys. Can be overridden with %s." -msgstr "Praefix fuer APCu-Schluessel. Kann mit %s ueberschrieben werden." +msgstr "Präfix für APCu-Schlüssel. Kann mit %s überschrieben werden." #: src/Admin/Settings.php msgid "Save Storage Settings" @@ -736,7 +748,7 @@ msgstr "Umgebungsvariablen" #: src/Admin/Settings.php msgid "For Docker or containerized environments, you can configure storage using environment variables. These take precedence over admin settings." -msgstr "Fuer Docker- oder Container-Umgebungen koennen Sie den Speicher ueber Umgebungsvariablen konfigurieren. Diese haben Vorrang vor Admin-Einstellungen." +msgstr "Für Docker- oder Container-Umgebungen können Sie den Speicher über Umgebungsvariablen konfigurieren. Diese haben Vorrang vor Admin-Einstellungen." #: src/Admin/Settings.php msgid "Variable" @@ -768,11 +780,23 @@ msgstr "Redis-Datenbankindex" #: src/Admin/Settings.php msgid "Redis key prefix" -msgstr "Redis-Schluessel-Praefix" +msgstr "Redis-Schlüssel-Präfix" #: src/Admin/Settings.php msgid "APCu key prefix" -msgstr "APCu-Schluessel-Praefix" +msgstr "APCu-Schlüssel-Präfix" + +#: src/Admin/Settings.php +msgid "License server URL" +msgstr "Lizenz-Server-URL" + +#: src/Admin/Settings.php +msgid "License key" +msgstr "Lizenzschlüssel" + +#: src/Admin/Settings.php +msgid "License server shared secret" +msgstr "Gemeinsames Geheimnis des Lizenz-Servers" #: src/Admin/Settings.php msgid "Docker Compose Example" @@ -784,11 +808,11 @@ msgstr "Zugriff verweigert." #: src/Admin/Settings.php msgid "Storage adapter is configured via environment variable and cannot be changed." -msgstr "Speicher-Adapter ist ueber Umgebungsvariable konfiguriert und kann nicht geaendert werden." +msgstr "Speicher-Adapter ist über Umgebungsvariable konfiguriert und kann nicht geändert werden." #: src/Admin/Settings.php msgid "Invalid storage adapter." -msgstr "Ungueltiger Speicher-Adapter." +msgstr "Ungültiger Speicher-Adapter." #: src/Admin/Settings.php msgid "Storage settings saved successfully." @@ -844,7 +868,7 @@ msgstr "APCu-Fehler: %s" #: src/Metrics/StorageFactory.php msgid "In-Memory storage is always available." -msgstr "In-Memory-Speicher ist immer verfuegbar." +msgstr "In-Memory-Speicher ist immer verfügbar." #: src/Metrics/StorageFactory.php msgid "Unknown storage adapter." @@ -869,7 +893,7 @@ msgstr "Redis-Ping fehlgeschlagen." #: src/Metrics/StorageFactory.php msgid "APCu is installed but not enabled. Check your php.ini settings." -msgstr "APCu ist installiert, aber nicht aktiviert. Pruefen Sie Ihre php.ini-Einstellungen." +msgstr "APCu ist installiert, aber nicht aktiviert. Prüfen Sie Ihre php.ini-Einstellungen." #: src/Metrics/StorageFactory.php msgid "APCu store operation failed." @@ -882,47 +906,47 @@ msgstr "APCu funktioniert. Speicher: %s belegt." #: src/Metrics/StorageFactory.php msgid "APCu fetch operation returned unexpected value." -msgstr "APCu-Abrufoperation hat unerwarteten Wert zurueckgegeben." +msgstr "APCu-Abrufoperation hat unerwarteten Wert zurückgegeben." #: src/Admin/Settings.php msgid "Early Mode" -msgstr "Fruehzeitiger Modus" +msgstr "Frühzeitiger Modus" #: src/Admin/Settings.php msgid "Early mode intercepts /metrics requests before full WordPress initialization. This prevents memory exhaustion issues caused by some plugins (e.g., Twig-based themes/plugins) but disables the wp_prometheus_collect_metrics hook for custom metrics." -msgstr "Der fruehzeitige Modus faengt /metrics-Anfragen vor der vollstaendigen WordPress-Initialisierung ab. Dies verhindert Speichererschoepfungsprobleme, die durch einige Plugins verursacht werden (z.B. Twig-basierte Themes/Plugins), deaktiviert jedoch den wp_prometheus_collect_metrics-Hook fuer benutzerdefinierte Metriken." +msgstr "Der frühzeitige Modus fängt /metrics-Anfragen vor der vollständigen WordPress-Initialisierung ab. Dies verhindert Speichererschöpfungsprobleme, die durch einige Plugins verursacht werden (z.B. Twig-basierte Themes/Plugins), deaktiviert jedoch den wp_prometheus_collect_metrics-Hook für benutzerdefinierte Metriken." #: src/Admin/Settings.php msgid "Early mode is configured via WP_PROMETHEUS_DISABLE_EARLY_MODE environment variable. Admin settings will be ignored." -msgstr "Der fruehzeitige Modus ist ueber die Umgebungsvariable WP_PROMETHEUS_DISABLE_EARLY_MODE konfiguriert. Admin-Einstellungen werden ignoriert." +msgstr "Der frühzeitige Modus ist über die Umgebungsvariable WP_PROMETHEUS_DISABLE_EARLY_MODE konfiguriert. Admin-Einstellungen werden ignoriert." #: src/Admin/Settings.php msgid "Disable Early Mode" -msgstr "Fruehzeitigen Modus deaktivieren" +msgstr "Frühzeitigen Modus deaktivieren" #: src/Admin/Settings.php msgid "Disable early metrics interception" -msgstr "Fruehzeitige Metriken-Abfangung deaktivieren" +msgstr "Frühzeitige Metriken-Abfangung deaktivieren" #: src/Admin/Settings.php msgid "When disabled, metrics are collected through normal WordPress template loading. This enables the wp_prometheus_collect_metrics hook for custom metrics but may cause issues with some plugins." -msgstr "Wenn deaktiviert, werden Metriken ueber das normale WordPress-Template-Laden erfasst. Dies aktiviert den wp_prometheus_collect_metrics-Hook fuer benutzerdefinierte Metriken, kann jedoch Probleme mit einigen Plugins verursachen." +msgstr "Wenn deaktiviert, werden Metriken über das normale WordPress-Template-Laden erfasst. Dies aktiviert den wp_prometheus_collect_metrics-Hook für benutzerdefinierte Metriken, kann jedoch Probleme mit einigen Plugins verursachen." #: src/Admin/Settings.php msgid "Early mode is active (this request was served via early interception)" -msgstr "Fruehzeitiger Modus ist aktiv (diese Anfrage wurde ueber fruehzeitige Abfangung verarbeitet)" +msgstr "Frühzeitiger Modus ist aktiv (diese Anfrage wurde über frühzeitige Abfangung verarbeitet)" #: src/Admin/Settings.php msgid "Early mode is disabled" -msgstr "Fruehzeitiger Modus ist deaktiviert" +msgstr "Frühzeitiger Modus ist deaktiviert" #: src/Admin/Settings.php msgid "Early mode is enabled (active for /metrics requests)" -msgstr "Fruehzeitiger Modus ist aktiviert (aktiv fuer /metrics-Anfragen)" +msgstr "Frühzeitiger Modus ist aktiviert (aktiv für /metrics-Anfragen)" #: src/Admin/Settings.php msgid "Clear all accumulated runtime metric data (HTTP requests, database queries). This is useful for testing or starting fresh." -msgstr "Alle gesammelten Laufzeit-Metrikdaten loeschen (HTTP-Anfragen, Datenbank-Abfragen). Dies ist nuetzlich zum Testen oder fuer einen Neuanfang." +msgstr "Alle gesammelten Laufzeit-Metrikdaten löschen (HTTP-Anfragen, Datenbank-Abfragen). Dies ist nützlich zum Testen oder für einen Neuanfang." #: src/Admin/Settings.php msgid "Endpoint" @@ -946,11 +970,11 @@ msgstr "Laufzeit-Metriken Verwaltung" #: src/Admin/Settings.php msgid "Runtime metrics track HTTP requests and database queries across requests. Use this section to manage accumulated data." -msgstr "Laufzeit-Metriken erfassen HTTP-Anfragen und Datenbank-Abfragen ueber mehrere Anfragen hinweg. Verwenden Sie diesen Bereich zur Verwaltung der gesammelten Daten." +msgstr "Laufzeit-Metriken erfassen HTTP-Anfragen und Datenbank-Abfragen über mehrere Anfragen hinweg. Verwenden Sie diesen Bereich zur Verwaltung der gesammelten Daten." #: src/Admin/Settings.php msgid "Reset Data" -msgstr "Daten zuruecksetzen" +msgstr "Daten zurücksetzen" #: src/Admin/Settings.php msgid "Extension" @@ -963,7 +987,7 @@ msgstr "Bereitgestellt von: %s" #: src/Admin/Settings.php msgid "No dashboards available." -msgstr "Keine Dashboards verfuegbar." +msgstr "Keine Dashboards verfügbar." #: src/Admin/Settings.php msgid "Pre-built dashboards for visualizing your WordPress metrics in Grafana." @@ -975,7 +999,7 @@ msgstr "Installationsanleitung" #: src/Admin/Settings.php msgid "Download the JSON file for your desired dashboard." -msgstr "Laden Sie die JSON-Datei fuer das gewuenschte Dashboard herunter." +msgstr "Laden Sie die JSON-Datei für das gewünschte Dashboard herunter." #: src/Admin/Settings.php msgid "In Grafana, go to Dashboards → Import." @@ -983,11 +1007,11 @@ msgstr "Gehen Sie in Grafana zu Dashboards → Import." #: src/Admin/Settings.php msgid "Upload the JSON file or paste its contents." -msgstr "Laden Sie die JSON-Datei hoch oder fuegen Sie den Inhalt ein." +msgstr "Laden Sie die JSON-Datei hoch oder fügen Sie den Inhalt ein." #: src/Admin/Settings.php msgid "Select your Prometheus data source when prompted." -msgstr "Waehlen Sie Ihre Prometheus-Datenquelle, wenn Sie dazu aufgefordert werden." +msgstr "Wählen Sie Ihre Prometheus-Datenquelle, wenn Sie dazu aufgefordert werden." #: src/Admin/Settings.php msgid "Click Import to create the dashboard." diff --git a/languages/wp-prometheus.pot b/languages/wp-prometheus.pot index 0f6681b..ee99f8e 100644 --- a/languages/wp-prometheus.pot +++ b/languages/wp-prometheus.pot @@ -98,6 +98,18 @@ msgstr "" msgid "Leave empty to keep existing." msgstr "" +#: src/Admin/Settings.php +msgid "Overridden by WP_PROMETHEUS_LICENSE_SERVER_URL environment variable." +msgstr "" + +#: src/Admin/Settings.php +msgid "Overridden by WP_PROMETHEUS_LICENSE_KEY environment variable." +msgstr "" + +#: src/Admin/Settings.php +msgid "Overridden by WP_PROMETHEUS_LICENSE_SERVER_SECRET environment variable." +msgstr "" + #: src/Admin/Settings.php msgid "Save License Settings" msgstr "" @@ -771,6 +783,18 @@ msgstr "" msgid "APCu key prefix" msgstr "" +#: src/Admin/Settings.php +msgid "License server URL" +msgstr "" + +#: src/Admin/Settings.php +msgid "License key" +msgstr "" + +#: src/Admin/Settings.php +msgid "License server shared secret" +msgstr "" + #: src/Admin/Settings.php msgid "Docker Compose Example" msgstr "" diff --git a/src/Admin/Settings.php b/src/Admin/Settings.php index 5bf045c..86a5175 100644 --- a/src/Admin/Settings.php +++ b/src/Admin/Settings.php @@ -311,6 +311,9 @@ class Settings { private function render_license_tab(): void { $license_key = LicenseManager::get_license_key(); $server_url = LicenseManager::get_server_url(); + $env_server_url = LicenseManager::is_env_override( 'server_url' ); + $env_license_key = LicenseManager::is_env_override( 'license_key' ); + $env_server_secret = LicenseManager::is_env_override( 'server_secret' ); $license_status = LicenseManager::get_cached_status(); $license_data = LicenseManager::get_cached_data(); $last_check = LicenseManager::get_last_check(); @@ -375,7 +378,11 @@ class Settings { + class="regular-text" placeholder="https://example.com" + > + +

+ @@ -385,7 +392,11 @@ class Settings { + class="regular-text" placeholder="XXXX-XXXX-XXXX-XXXX" + > + +

+ @@ -394,8 +405,13 @@ class Settings { -

+ value="" class="regular-text" placeholder="" + > + +

+ +

+ @@ -930,6 +946,21 @@ class Settings { wp_prom + + WP_PROMETHEUS_LICENSE_SERVER_URL + + https://license.example.com + + + WP_PROMETHEUS_LICENSE_KEY + + XXXX-XXXX-XXXX-XXXX + + + WP_PROMETHEUS_LICENSE_SERVER_SECRET + + my-shared-secret + @@ -941,6 +972,9 @@ class Settings { WP_PROMETHEUS_STORAGE_ADAPTER: redis WP_PROMETHEUS_REDIS_HOST: redis WP_PROMETHEUS_REDIS_PORT: 6379 + WP_PROMETHEUS_LICENSE_SERVER_URL: https://license.example.com + WP_PROMETHEUS_LICENSE_KEY: XXXX-XXXX-XXXX-XXXX + WP_PROMETHEUS_LICENSE_SERVER_SECRET: my-shared-secret depends_on: - redis diff --git a/src/License/Manager.php b/src/License/Manager.php index 1462838..6d403dd 100644 --- a/src/License/Manager.php +++ b/src/License/Manager.php @@ -346,30 +346,69 @@ final class Manager { /** * Get the license key. * + * Environment variable WP_PROMETHEUS_LICENSE_KEY takes precedence. + * * @return string */ public static function get_license_key(): string { + $env = getenv( 'WP_PROMETHEUS_LICENSE_KEY' ); + if ( false !== $env && '' !== $env ) { + return $env; + } return get_option( self::OPTION_LICENSE_KEY, '' ); } /** * Get the license server URL. * + * Environment variable WP_PROMETHEUS_LICENSE_SERVER_URL takes precedence. + * * @return string */ public static function get_server_url(): string { + $env = getenv( 'WP_PROMETHEUS_LICENSE_SERVER_URL' ); + if ( false !== $env && '' !== $env ) { + return $env; + } return get_option( self::OPTION_SERVER_URL, '' ); } /** * Get the server secret. * + * Environment variable WP_PROMETHEUS_LICENSE_SERVER_SECRET takes precedence. + * * @return string */ public static function get_server_secret(): string { + $env = getenv( 'WP_PROMETHEUS_LICENSE_SERVER_SECRET' ); + if ( false !== $env && '' !== $env ) { + return $env; + } return get_option( self::OPTION_SERVER_SECRET, '' ); } + /** + * Check if a license setting is overridden by an environment variable. + * + * @param string $setting One of 'server_url', 'license_key', 'server_secret'. + * @return bool + */ + public static function is_env_override( string $setting ): bool { + $map = array( + 'server_url' => 'WP_PROMETHEUS_LICENSE_SERVER_URL', + 'license_key' => 'WP_PROMETHEUS_LICENSE_KEY', + 'server_secret' => 'WP_PROMETHEUS_LICENSE_SERVER_SECRET', + ); + + if ( ! isset( $map[ $setting ] ) ) { + return false; + } + + $env = getenv( $map[ $setting ] ); + return false !== $env && '' !== $env; + } + /** * Get cached license status. *