[Bug]: TypeError in ThemingDefaults::getColorPrimary() — preg_match() under PHP 8.4 on unset user primary_color

Aperta Adatta ai principianti
#66,249 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
77/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
php
Ambito
backend

Direzione di ricerca

Inizia da apps/theming/lib/ThemingDefaults.php, intorno alla riga 196, dove getColorPrimary() legge il primary_color dell’utente e lo passa a preg_match(). Controlla i test correlati a ThemingDefaults e verifica se getColorBackground() gestisce l’input allo stesso modo. Conferma che un colore non impostato ricade sul valore predefinito globale senza errori, quindi esegui i test pertinenti di theming.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

34-feedback
⚠️ This issue respects the following points: ⚠️
Bug description

When accessing /apps/files/ (or any page initializing user capabilities/theming) under PHP 8.4+, Nextcloud crashes with a fatal TypeError (HTTP 500) if the logged-in user does not have a custom primary_color configured.

In apps/theming/lib/ThemingDefaults.php line 196-197:

$userPrimaryColor = $this->userConfig->getValueString($user->getUID(), Application::APP_ID, 'primary_color');
if (preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', $userPrimaryColor)) {
    return $userPrimaryColor;
}

Under PHP 8.4+, preg_match enforces strict types and no longer tolerates non-string types or certain uninitialized proxy representations from getValueString(), throwing:

TypeError: preg_match(): Argument #2 ($subject) must be of type string, string given at /var/www/html/apps/theming/lib/ThemingDefaults.php#197
Steps to reproduce
  1. Run Nextcloud Server 34.x on PHP 8.4 (e.g. official nextcloud:34.0.5 Apache Docker image).
  2. Log in as an admin or normal user who has never set a custom theming primary color.
  3. Access /apps/files/.
  4. The page fails with HTTP 500 Internal Server Error.
Expected behavior

Nextcloud should fall back gracefully to the global system primary color ($defaultColor) without throwing a fatal TypeError.

Nextcloud Server version

34

Operating system

Debian/Ubuntu

PHP engine version

PHP 8.4

Web server

Apache (supported)

Database engine version

PostgreSQL

Is this bug present after an update or on a fresh install?

Updated from a MINOR version (ex. 32.0.1 to 32.0.2)

Are you using the Nextcloud Server Encryption module?

Encryption is Disabled

What user-backends are you using?
  • Default user-backend (database)
Nextcloud Logs
{
  "reqId": "n6FAHxGdzIB0H4OyzO55",
  "level": 3,
  "time": "2026-11-04T03:10:52+00:00",
  "remoteAddr": "x.x.x.x",
  "user": "admin",
  "app": "index",
  "method": "GET",
  "url": "/apps/files/",
  "message": "preg_match(): Argument #2 ($subject) must be of type string, string given",
  "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/27.2 Safari/605.1.15",
  "version": "34.0.5.1",
  "exception": {
    "Exception": "TypeError",
    "Message": "preg_match(): Argument #2 ($subject) must be of type string, string given",
    "Code": 0,
    "Trace": [
      {
        "function": "preg_match",
        "file": "/var/www/html/apps/theming/lib/ThemingDefaults.php",
        "line": 197,
        "args": ["/^\\#([0-9a-f]{3}|[0-9a-f]{6})$/i", ""]
      },
      {
        "file": "/var/www/html/apps/theming/lib/Capabilities.php",
        "line": 88,
        "function": "getColorPrimary",
        "class": "OCA\\Theming\\ThemingDefaults",
        "type": "->"
      },
      {
        "file": "/var/www/html/lib/private/CapabilitiesManager.php",
        "line": 60,
        "function": "getCapabilities",
        "class": "OCA\\Theming\\Capabilities",
        "type": "->"
      },
      {
        "file": "/var/www/html/lib/private/Template/JSConfigHelper.php",
        "line": 141,
        "function": "getCapabilities",
        "class": "OC\\CapabilitiesManager",
        "type": "->"
      },
      {
        "file": "/var/www/html/lib/private/TemplateLayout.php",
        "line": 251,
        "function": "getConfig",
        "class": "OC\\Template\\JSConfigHelper",
        "type": "->"
      },
      {
        "file": "/var/www/html/apps/files/lib/Controller/ViewController.php",
        "line": 202,
        "function": "dispatchTyped",
        "class": "OC\\EventDispatcher\\EventDispatcher",
        "type": "->"
      }
    ],
    "File": "/var/www/html/apps/theming/lib/ThemingDefaults.php",
    "Line": 197
  }
}
Suggested Fix

Add defensive type checks and explicit casting in apps/theming/lib/ThemingDefaults.php:

--- a/apps/theming/lib/ThemingDefaults.php
+++ b/apps/theming/lib/ThemingDefaults.php
@@ -194,7 +194,7 @@ class ThemingDefaults extends \OC_Defaults {
 		// user-defined primary color
 		if (!empty($user)) {
 			$userPrimaryColor = $this->userConfig->getValueString($user->getUID(), Application::APP_ID, 'primary_color');
-			if (preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', $userPrimaryColor)) {
+			if (!empty($userPrimaryColor) && is_string($userPrimaryColor) && preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', (string)$userPrimaryColor)) {
 				return $userPrimaryColor;
 			}
 		}

Similarly for getColorBackground() if applicable.

Lingua principale
PHP
Stelle
37.4k
Fork
5.3k
Merge medio
2g 7h
PR unite (30g)
744

Preparare l'ambiente

Apri in Codespaces

Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di nextcloud/server

Tutte le issue di nextcloud/server

Issue simili

Altre issue su PHP

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.