false, 'error' => 'Das Logo konnte nicht hochgeladen werden.']; } if (($file['size'] ?? 0) <= 0 || $file['size'] > 2 * 1024 * 1024) { return ['ok' => false, 'error' => 'Das Logo ist leer oder größer als 2 MB.']; } $tmp = (string)($file['tmp_name'] ?? ''); if (!is_uploaded_file($tmp)) { return ['ok' => false, 'error' => 'Die hochgeladene Datei konnte nicht verifiziert werden.']; } $info = @getimagesize($tmp); if ($info === false || !in_array($info[2], [IMAGETYPE_PNG, IMAGETYPE_JPEG], true)) { return ['ok' => false, 'error' => 'Es sind nur PNG- oder JPEG-Bilder erlaubt.']; } $ext = $info[2] === IMAGETYPE_PNG ? 'png' : 'jpg'; $dir = tenant_logo_dir(); if (!is_dir($dir)) { @mkdir($dir, 0700, true); } if (!is_dir($dir) || !is_writable($dir)) { return ['ok' => false, 'error' => 'Das Logo-Verzeichnis ist nicht beschreibbar.']; } // Alte Varianten (andere Endung) desselben Mandanten entfernen. foreach (['png', 'jpg'] as $altExt) { $old = $dir . '/logo_' . $tenantId . '.' . $altExt; if (is_file($old)) { @unlink($old); } } $filename = 'logo_' . $tenantId . '.' . $ext; if (!move_uploaded_file($tmp, $dir . '/' . $filename)) { return ['ok' => false, 'error' => 'Das Logo konnte nicht gespeichert werden.']; } return ['ok' => true, 'filename' => $filename]; } /** * Loescht eine hinterlegte Logo-Datei (falls vorhanden). */ function tenant_logo_delete(string $filename): void { $path = tenant_logo_path($filename); if ($path !== null) { @unlink($path); } }