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

Abierto Apto para principiantes
#66,249 3 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
77/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
php
Área
backend

Línea de trabajo

Empieza en apps/theming/lib/ThemingDefaults.php, alrededor de la línea 196, donde getColorPrimary() lee el primary_color del usuario y lo pasa a preg_match(). Comprueba las pruebas relacionadas con ThemingDefaults y si getColorBackground() maneja la entrada de la misma manera. Confirma que un color no definido recurre al valor predeterminado global sin producir un error y luego ejecuta las pruebas relevantes de theming.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

34-feedback needs info
⚠️ 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.

Lenguaje dominante
PHP
Estrellas
37.4k
Forks
5.3k
Merge medio
2 d 7 h
PR fusionados (30 d)
744

Preparar el entorno

Abrir en Codespaces

Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de nextcloud/server

Todos los issues de nextcloud/server

Issues similares

Más issues de PHP

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.