Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package roundcubemail for openSUSE:Factory checked in at 2026-02-09 11:43:32 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/roundcubemail (Old) and /work/SRC/openSUSE:Factory/.roundcubemail.new.1670 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "roundcubemail" Mon Feb 9 11:43:32 2026 rev:91 rq:1331861 version:1.6.13 Changes: -------- --- /work/SRC/openSUSE:Factory/roundcubemail/roundcubemail.changes 2025-12-22 22:56:04.021910012 +0100 +++ /work/SRC/openSUSE:Factory/.roundcubemail.new.1670/roundcubemail.changes 2026-02-09 11:44:07.419674637 +0100 @@ -1,0 +2,19 @@ +Sun Feb 8 12:51:32 UTC 2026 - Lars Vogdt <[email protected]> + +- update to 1.6.13 + This is a security update to the stable version 1.6 of Roundcube Webmail. + It provides fixes to recently reported security vulnerabilities: + + Fix CSS injection vulnerability reported by CERT Polska. + + Fix remote image blocking bypass via SVG content reported by nullcathedral. + + This version is considered stable and we recommend to update all productive + installations of Roundcube 1.6.x with it. Please do backup your data + before updating! + + CHANGELOG + + Managesieve: Fix handling of string-list format values for date + tests in Out of Office (#10075) + + Fix CSS injection vulnerability reported by CERT Polska. + + Fix remote image blocking bypass via SVG content reported by nullcathedral. + +------------------------------------------------------------------- Old: ---- roundcubemail-1.6.12-complete.tar.gz roundcubemail-1.6.12-complete.tar.gz.asc New: ---- roundcubemail-1.6.13-complete.tar.gz roundcubemail-1.6.13-complete.tar.gz.asc ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ roundcubemail.spec ++++++ --- /var/tmp/diff_new_pack.aTDqiD/_old 2026-02-09 11:44:08.055701395 +0100 +++ /var/tmp/diff_new_pack.aTDqiD/_new 2026-02-09 11:44:08.059701563 +0100 @@ -1,7 +1,7 @@ # # spec file for package roundcubemail # -# Copyright (c) 2025 SUSE LLC and contributors +# Copyright (c) 2026 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -20,7 +20,7 @@ %define roundcubeconfigpath %{_sysconfdir}/%{name} Name: roundcubemail -Version: 1.6.12 +Version: 1.6.13 Release: 0 Summary: A browser-based multilingual IMAP client License: BSD-3-Clause AND GPL-2.0-only AND GPL-3.0-or-later ++++++ roundcubemail-1.6.12-complete.tar.gz -> roundcubemail-1.6.13-complete.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/CHANGELOG.md new/roundcubemail-1.6.13/CHANGELOG.md --- old/roundcubemail-1.6.12/CHANGELOG.md 2025-12-14 09:22:45.000000000 +0100 +++ new/roundcubemail-1.6.13/CHANGELOG.md 2026-02-08 10:33:27.000000000 +0100 @@ -1,5 +1,11 @@ # Changelog Roundcube Webmail +## Release 1.6.13 + +- Managesieve: Fix handling of string-list format values for date tests in Out of Office (#10075) +- Fix remote image blocking bypass via SVG content reported by nullcathedral +- Fix CSS injection vulnerability reported by CERT Polska + ## Release 1.6.12 - Support IPv6 in database DSN (#9937) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/composer.lock new/roundcubemail-1.6.13/composer.lock --- old/roundcubemail-1.6.12/composer.lock 2025-12-14 09:22:46.000000000 +0100 +++ new/roundcubemail-1.6.13/composer.lock 2026-02-08 10:33:28.000000000 +0100 @@ -667,6 +667,7 @@ "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=Console_CommandLine", "source": "https://github.com/pear/Console_CommandLine" }, + "abandoned": true, "time": "2023-04-02T18:49:53+00:00" }, { @@ -1085,16 +1086,16 @@ }, { "name": "pear/pear-core-minimal", - "version": "v1.10.16", + "version": "v1.10.18", "source": { "type": "git", "url": "https://github.com/pear/pear-core-minimal.git", - "reference": "c0f51b45f50683bf5bbf558036854ebc9b54d033" + "reference": "c7b55789d01de0ce090d289b73f1bbd6a2f113b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/c0f51b45f50683bf5bbf558036854ebc9b54d033", - "reference": "c0f51b45f50683bf5bbf558036854ebc9b54d033", + "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/c7b55789d01de0ce090d289b73f1bbd6a2f113b1", + "reference": "c7b55789d01de0ce090d289b73f1bbd6a2f113b1", "shasum": "" }, "require": { @@ -1130,7 +1131,7 @@ "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=PEAR", "source": "https://github.com/pear/pear-core-minimal" }, - "time": "2024-11-24T22:27:58+00:00" + "time": "2025-12-14T20:37:07+00:00" }, { "name": "pear/pear_exception", @@ -1584,15 +1585,15 @@ "packages-dev": [], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, "platform": { "php": ">=7.3.0" }, - "platform-dev": [], + "platform-dev": {}, "platform-overrides": { "php": "7.3" }, - "plugin-api-version": "2.2.0" + "plugin-api-version": "2.9.0" } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/index.php new/roundcubemail-1.6.13/index.php --- old/roundcubemail-1.6.12/index.php 2025-12-14 09:22:45.000000000 +0100 +++ new/roundcubemail-1.6.13/index.php 2026-02-08 10:33:27.000000000 +0100 @@ -2,7 +2,7 @@ /** +-------------------------------------------------------------------------+ | Roundcube Webmail IMAP Client | - | Version 1.6.12 | + | Version 1.6.13 | | | | Copyright (C) The Roundcube Dev Team | | | diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/installer/index.php new/roundcubemail-1.6.13/installer/index.php --- old/roundcubemail-1.6.12/installer/index.php 2025-12-14 09:22:44.000000000 +0100 +++ new/roundcubemail-1.6.13/installer/index.php 2026-02-08 10:33:27.000000000 +0100 @@ -3,7 +3,7 @@ /** +-------------------------------------------------------------------------+ | Roundcube Webmail setup tool | - | Version 1.6.12 | + | Version 1.6.13 | | | | Copyright (C) The Roundcube Dev Team | | | diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/plugins/managesieve/Changelog new/roundcubemail-1.6.13/plugins/managesieve/Changelog --- old/roundcubemail-1.6.12/plugins/managesieve/Changelog 2025-12-14 09:22:45.000000000 +0100 +++ new/roundcubemail-1.6.13/plugins/managesieve/Changelog 2026-02-08 10:33:27.000000000 +0100 @@ -1,3 +1,4 @@ +- Fix handling of string-list format values for date tests in Out of Office (#10075) - Fix invalid line break characters in multi-line text in Sieve scripts (#9543) - Fix javascript error when relational or spamtest extension is not enabled (#9139) - Removed managesieve_usetls option (in favor of the scheme prefix in managesieve_host) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php new/roundcubemail-1.6.13/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php --- old/roundcubemail-1.6.12/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php 2025-12-14 09:22:45.000000000 +0100 +++ new/roundcubemail-1.6.13/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php 2026-02-08 10:33:27.000000000 +0100 @@ -150,6 +150,14 @@ } } + // According to RFC5260, currentdate target can be a string-list, + // but here we support only a single value (#10074) + foreach ($rule['tests'] as $i => $r) { + if ($r['test'] == 'currentdate' && is_array($r['arg'])) { + $rule['tests'][$i]['arg'] = array_first($r['arg']); + } + } + $this->vacation = array_merge($rule['actions'][0], [ 'idx' => $idx, 'disabled' => $rule['disabled'] || !$active, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/program/include/iniset.php new/roundcubemail-1.6.13/program/include/iniset.php --- old/roundcubemail-1.6.12/program/include/iniset.php 2025-12-14 09:22:45.000000000 +0100 +++ new/roundcubemail-1.6.13/program/include/iniset.php 2026-02-08 10:33:27.000000000 +0100 @@ -24,7 +24,7 @@ } // application constants -define('RCMAIL_VERSION', '1.6.12'); +define('RCMAIL_VERSION', '1.6.13'); define('RCMAIL_START', microtime(true)); if (!defined('INSTALL_PATH')) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/program/lib/Roundcube/bootstrap.php new/roundcubemail-1.6.13/program/lib/Roundcube/bootstrap.php --- old/roundcubemail-1.6.12/program/lib/Roundcube/bootstrap.php 2025-12-14 09:22:45.000000000 +0100 +++ new/roundcubemail-1.6.13/program/lib/Roundcube/bootstrap.php 2026-02-08 10:33:27.000000000 +0100 @@ -57,7 +57,7 @@ } // framework constants -define('RCUBE_VERSION', '1.6.12'); +define('RCUBE_VERSION', '1.6.13'); define('RCUBE_CHARSET', 'UTF-8'); define('RCUBE_TEMP_FILE_PREFIX', 'RCMTEMP'); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/program/lib/Roundcube/rcube_utils.php new/roundcubemail-1.6.13/program/lib/Roundcube/rcube_utils.php --- old/roundcubemail-1.6.12/program/lib/Roundcube/rcube_utils.php 2025-12-14 09:22:45.000000000 +0100 +++ new/roundcubemail-1.6.13/program/lib/Roundcube/rcube_utils.php 2026-02-08 10:33:27.000000000 +0100 @@ -432,7 +432,7 @@ */ public static function mod_css_styles($source, $container_id, $allow_remote = false, $prefix = '') { - $source = self::xss_entity_decode($source); + $source = self::xss_entity_decode($source); // No @import allowed // TODO: We should just remove it, not invalidate the whole content @@ -445,6 +445,9 @@ return '/* invalid! */'; } + // remove html and css comments + $source = preg_replace('/(^\s*<\!--)|(-->\s*$)/m', '', $source); + // To prevent from a double-escaping tricks we consider a script with // any escape sequences (after de-escaping them above) an evil script. // This probably catches many valid scripts, but we\'re on the safe side. @@ -452,8 +455,12 @@ return '/* evil! */'; } - // remove html comments - $source = preg_replace('/(^\s*<\!--)|(-->\s*$)/m', '', $source); + // If after removing comments there are still comments it's most likely a hack + // Note: In <=1.6 comments are being removed by xss_entity_decode() above + // $source = self::remove_css_comments($source); + if (strpos($source, '/*') !== false || strpos($source, '<!--') !== false) { + return '/* evil! */'; + } $url_callback = static function ($url) use ($allow_remote) { if (strpos($url, 'data:image') === 0) { @@ -468,8 +475,14 @@ $replacements = new rcube_string_replacer(); // cut out all contents between { and } - while (($pos = strpos($source, '{', $last_pos)) && ($pos2 = strpos($source, '}', $pos))) { - $nested = strpos($source, '{', $pos+1); + while (($pos = strpos($source, '{', $last_pos)) && ($pos2 = strpos($source, '}', $pos) ?: (strlen($source) - 1))) { + // In case there was no closing brace add one + if ($source[$pos2] != '}') { + $pos2++; + $source .= '}'; + } + + $nested = strpos($source, '{', $pos + 1); if ($nested && $nested < $pos2) { // when dealing with nested blocks (e.g. @media), take the inner one $pos = $nested; } @@ -559,7 +572,7 @@ $value .= ' url(' . $url . ')'; } } - } elseif (preg_match('/;.*/', $val)) { + } elseif (preg_match('/;.+/', $val)) { // Invalid or evil content, ignore continue; } else { @@ -595,19 +608,8 @@ */ public static function parse_css_block($style) { - $pos = 0; - - // first remove comments - while (($pos = strpos($style, '/*', $pos)) !== false) { - $end = strpos($style, '*/', $pos+2); - - if ($end === false) { - $style = substr($style, 0, $pos); - } - else { - $style = substr_replace($style, '', $pos, $end - $pos + 2); - } - } + // Remove comments + $style = self::remove_css_comments($style); // Replace new lines with spaces $style = preg_replace('/[\r\n]+/', ' ', $style); @@ -660,6 +662,30 @@ } /** + * Remove CSS comments from styles. + * + * @param string $style CSS style + * + * @return string CSS style + */ + public static function remove_css_comments($style) + { + $pos = 0; + + while (($pos = strpos($style, '/*', $pos)) !== false) { + $end = strpos($style, '*/', $pos + 2); + + if ($end === false) { + $style = substr($style, 0, $pos); + } else { + $style = substr_replace($style, '', $pos, $end - $pos + 2); + } + } + + return $style; + } + + /** * Explode css style value * * @param string $style CSS style diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/program/lib/Roundcube/rcube_washtml.php new/roundcubemail-1.6.13/program/lib/Roundcube/rcube_washtml.php --- old/roundcubemail-1.6.12/program/lib/Roundcube/rcube_washtml.php 2025-12-14 09:22:45.000000000 +0100 +++ new/roundcubemail-1.6.13/program/lib/Roundcube/rcube_washtml.php 2026-02-08 10:33:27.000000000 +0100 @@ -482,8 +482,7 @@ || $attr == 'color-profile' // SVG || ($attr == 'poster' && $tag == 'video') || ($attr == 'src' && preg_match('/^(img|image|source|input|video|audio)$/i', $tag)) - || ($tag == 'use' && $attr == 'href') // SVG - || ($tag == 'image' && $attr == 'href'); // SVG + || ($attr == 'href' && preg_match('/^(feimage|image|use)$/i', $tag)); // SVG } /** diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/public_html/index.php new/roundcubemail-1.6.13/public_html/index.php --- old/roundcubemail-1.6.12/public_html/index.php 2025-12-14 09:22:45.000000000 +0100 +++ new/roundcubemail-1.6.13/public_html/index.php 2026-02-08 10:33:27.000000000 +0100 @@ -3,7 +3,7 @@ /* +-----------------------------------------------------------------------+ | Roundcube Webmail IMAP Client | - | Version 1.6.12 | + | Version 1.6.13 | | | | Copyright (C) The Roundcube Dev Team | | | diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/vendor/autoload.php new/roundcubemail-1.6.13/vendor/autoload.php --- old/roundcubemail-1.6.12/vendor/autoload.php 2025-12-14 09:22:51.000000000 +0100 +++ new/roundcubemail-1.6.13/vendor/autoload.php 2026-02-08 10:33:34.000000000 +0100 @@ -2,7 +2,22 @@ // autoload.php @generated by Composer +if (PHP_VERSION_ID < 50600) { + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + $err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, $err); + } elseif (!headers_sent()) { + echo $err; + } + } + throw new RuntimeException($err); +} + require_once __DIR__ . '/composer/autoload_real.php'; -return ComposerAutoloaderInit0e572040d941ed19e19bbb9fc5945df6::getLoader(); -// generated by Roundcube install 1.6.12 +return ComposerAutoloaderInitd30534b7ccef70d5be1f4ba9bc89dbe4::getLoader(); +// generated by Roundcube install 1.6.13 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/vendor/composer/ClassLoader.php new/roundcubemail-1.6.13/vendor/composer/ClassLoader.php --- old/roundcubemail-1.6.12/vendor/composer/ClassLoader.php 2025-12-14 09:22:47.000000000 +0100 +++ new/roundcubemail-1.6.13/vendor/composer/ClassLoader.php 2026-01-29 11:40:53.000000000 +0100 @@ -42,35 +42,37 @@ */ class ClassLoader { - /** @var ?string */ + /** @var \Closure(string):void */ + private static $includeFile; + + /** @var string|null */ private $vendorDir; // PSR-4 /** - * @var array[] - * @psalm-var array<string, array<string, int>> + * @var array<string, array<string, int>> */ private $prefixLengthsPsr4 = array(); /** - * @var array[] - * @psalm-var array<string, array<int, string>> + * @var array<string, list<string>> */ private $prefixDirsPsr4 = array(); /** - * @var array[] - * @psalm-var array<string, string> + * @var list<string> */ private $fallbackDirsPsr4 = array(); // PSR-0 /** - * @var array[] - * @psalm-var array<string, array<string, string[]>> + * List of PSR-0 prefixes + * + * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2'))) + * + * @var array<string, array<string, list<string>>> */ private $prefixesPsr0 = array(); /** - * @var array[] - * @psalm-var array<string, string> + * @var list<string> */ private $fallbackDirsPsr0 = array(); @@ -78,8 +80,7 @@ private $useIncludePath = false; /** - * @var string[] - * @psalm-var array<string, string> + * @var array<string, string> */ private $classMap = array(); @@ -87,29 +88,29 @@ private $classMapAuthoritative = false; /** - * @var bool[] - * @psalm-var array<string, bool> + * @var array<string, bool> */ private $missingClasses = array(); - /** @var ?string */ + /** @var string|null */ private $apcuPrefix; /** - * @var self[] + * @var array<string, self> */ private static $registeredLoaders = array(); /** - * @param ?string $vendorDir + * @param string|null $vendorDir */ public function __construct($vendorDir = null) { $this->vendorDir = $vendorDir; + self::initializeIncludeClosure(); } /** - * @return string[] + * @return array<string, list<string>> */ public function getPrefixes() { @@ -121,8 +122,7 @@ } /** - * @return array[] - * @psalm-return array<string, array<int, string>> + * @return array<string, list<string>> */ public function getPrefixesPsr4() { @@ -130,8 +130,7 @@ } /** - * @return array[] - * @psalm-return array<string, string> + * @return list<string> */ public function getFallbackDirs() { @@ -139,8 +138,7 @@ } /** - * @return array[] - * @psalm-return array<string, string> + * @return list<string> */ public function getFallbackDirsPsr4() { @@ -148,8 +146,7 @@ } /** - * @return string[] Array of classname => path - * @psalm-return array<string, string> + * @return array<string, string> Array of classname => path */ public function getClassMap() { @@ -157,8 +154,7 @@ } /** - * @param string[] $classMap Class to filename map - * @psalm-param array<string, string> $classMap + * @param array<string, string> $classMap Class to filename map * * @return void */ @@ -175,24 +171,25 @@ * Registers a set of PSR-0 directories for a given prefix, either * appending or prepending to the ones previously set for this prefix. * - * @param string $prefix The prefix - * @param string[]|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories + * @param string $prefix The prefix + * @param list<string>|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories * * @return void */ public function add($prefix, $paths, $prepend = false) { + $paths = (array) $paths; if (!$prefix) { if ($prepend) { $this->fallbackDirsPsr0 = array_merge( - (array) $paths, + $paths, $this->fallbackDirsPsr0 ); } else { $this->fallbackDirsPsr0 = array_merge( $this->fallbackDirsPsr0, - (array) $paths + $paths ); } @@ -201,19 +198,19 @@ $first = $prefix[0]; if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = (array) $paths; + $this->prefixesPsr0[$first][$prefix] = $paths; return; } if ($prepend) { $this->prefixesPsr0[$first][$prefix] = array_merge( - (array) $paths, + $paths, $this->prefixesPsr0[$first][$prefix] ); } else { $this->prefixesPsr0[$first][$prefix] = array_merge( $this->prefixesPsr0[$first][$prefix], - (array) $paths + $paths ); } } @@ -222,9 +219,9 @@ * Registers a set of PSR-4 directories for a given namespace, either * appending or prepending to the ones previously set for this namespace. * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param string[]|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list<string>|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException * @@ -232,17 +229,18 @@ */ public function addPsr4($prefix, $paths, $prepend = false) { + $paths = (array) $paths; if (!$prefix) { // Register directories for the root namespace. if ($prepend) { $this->fallbackDirsPsr4 = array_merge( - (array) $paths, + $paths, $this->fallbackDirsPsr4 ); } else { $this->fallbackDirsPsr4 = array_merge( $this->fallbackDirsPsr4, - (array) $paths + $paths ); } } elseif (!isset($this->prefixDirsPsr4[$prefix])) { @@ -252,18 +250,18 @@ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; + $this->prefixDirsPsr4[$prefix] = $paths; } elseif ($prepend) { // Prepend directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( - (array) $paths, + $paths, $this->prefixDirsPsr4[$prefix] ); } else { // Append directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( $this->prefixDirsPsr4[$prefix], - (array) $paths + $paths ); } } @@ -272,8 +270,8 @@ * Registers a set of PSR-0 directories for a given prefix, * replacing any others previously set for this prefix. * - * @param string $prefix The prefix - * @param string[]|string $paths The PSR-0 base directories + * @param string $prefix The prefix + * @param list<string>|string $paths The PSR-0 base directories * * @return void */ @@ -290,8 +288,8 @@ * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param string[]|string $paths The PSR-4 base directories + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list<string>|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException * @@ -425,7 +423,8 @@ public function loadClass($class) { if ($file = $this->findFile($class)) { - includeFile($file); + $includeFile = self::$includeFile; + $includeFile($file); return true; } @@ -476,9 +475,9 @@ } /** - * Returns the currently registered loaders indexed by their corresponding vendor directories. + * Returns the currently registered loaders keyed by their corresponding vendor directories. * - * @return self[] + * @return array<string, self> */ public static function getRegisteredLoaders() { @@ -555,18 +554,26 @@ return false; } -} -/** - * Scope isolated include. - * - * Prevents access to $this/self from included files. - * - * @param string $file - * @return void - * @private - */ -function includeFile($file) -{ - include $file; + /** + * @return void + */ + private static function initializeIncludeClosure() + { + if (self::$includeFile !== null) { + return; + } + + /** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + * + * @param string $file + * @return void + */ + self::$includeFile = \Closure::bind(static function($file) { + include $file; + }, null, null); + } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/vendor/composer/InstalledVersions.php new/roundcubemail-1.6.13/vendor/composer/InstalledVersions.php --- old/roundcubemail-1.6.12/vendor/composer/InstalledVersions.php 2025-12-14 09:22:46.000000000 +0100 +++ new/roundcubemail-1.6.13/vendor/composer/InstalledVersions.php 2026-02-08 10:33:28.000000000 +0100 @@ -21,23 +21,36 @@ * See also https://getcomposer.org/doc/07-runtime.md#installed-versions * * To require its presence, you can require `composer-runtime-api ^2.0` + * + * @final */ class InstalledVersions { /** + * @var string|null if set (by reflection by Composer), this should be set to the path where this class is being copied to + * @internal + */ + private static $selfDir = null; + + /** * @var mixed[]|null - * @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}|array{}|null + * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null */ private static $installed; /** + * @var bool + */ + private static $installedIsLocalDir; + + /** * @var bool|null */ private static $canGetVendors; /** * @var array[] - * @psalm-var array<string, array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}> + * @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}> */ private static $installedByVendor = array(); @@ -96,7 +109,7 @@ { foreach (self::getInstalled() as $installed) { if (isset($installed['versions'][$packageName])) { - return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']); + return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false; } } @@ -117,7 +130,7 @@ */ public static function satisfies(VersionParser $parser, $packageName, $constraint) { - $constraint = $parser->parseConstraints($constraint); + $constraint = $parser->parseConstraints((string) $constraint); $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); return $provided->matches($constraint); @@ -241,7 +254,7 @@ /** * @return array - * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string} + * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} */ public static function getRootPackage() { @@ -255,7 +268,7 @@ * * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. * @return array[] - * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>} + * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} */ public static function getRawData() { @@ -278,7 +291,7 @@ * Returns the raw data of all installed.php which are currently loaded for custom implementations * * @return array[] - * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}> + * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}> */ public static function getAllRawData() { @@ -301,17 +314,35 @@ * @param array[] $data A vendor/composer/installed.php data set * @return void * - * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>} $data + * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data */ public static function reload($data) { self::$installed = $data; self::$installedByVendor = array(); + + // when using reload, we disable the duplicate protection to ensure that self::$installed data is + // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not, + // so we have to assume it does not, and that may result in duplicate data being returned when listing + // all installed packages for example + self::$installedIsLocalDir = false; + } + + /** + * @return string + */ + private static function getSelfDir() + { + if (self::$selfDir === null) { + self::$selfDir = strtr(__DIR__, '\\', '/'); + } + + return self::$selfDir; } /** * @return array[] - * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}> + * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}> */ private static function getInstalled() { @@ -323,7 +354,9 @@ $copiedLocalDir = false; if (self::$canGetVendors) { + $selfDir = self::getSelfDir(); foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + $vendorDir = strtr($vendorDir, '\\', '/'); if (isset(self::$installedByVendor[$vendorDir])) { $installed[] = self::$installedByVendor[$vendorDir]; } elseif (is_file($vendorDir.'/composer/installed.php')) { @@ -331,11 +364,14 @@ $required = require $vendorDir.'/composer/installed.php'; self::$installedByVendor[$vendorDir] = $required; $installed[] = $required; - if (strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { + if (self::$installed === null && $vendorDir.'/composer' === $selfDir) { self::$installed = $required; - $copiedLocalDir = true; + self::$installedIsLocalDir = true; } } + if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) { + $copiedLocalDir = true; + } } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/vendor/composer/autoload_classmap.php new/roundcubemail-1.6.13/vendor/composer/autoload_classmap.php --- old/roundcubemail-1.6.12/vendor/composer/autoload_classmap.php 2025-12-14 09:22:47.000000000 +0100 +++ new/roundcubemail-1.6.13/vendor/composer/autoload_classmap.php 2026-02-08 10:33:29.000000000 +0100 @@ -2,7 +2,7 @@ // autoload_classmap.php @generated by Composer -$vendorDir = dirname(dirname(__FILE__)); +$vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/vendor/composer/autoload_files.php new/roundcubemail-1.6.13/vendor/composer/autoload_files.php --- old/roundcubemail-1.6.12/vendor/composer/autoload_files.php 2025-12-14 09:22:47.000000000 +0100 +++ new/roundcubemail-1.6.13/vendor/composer/autoload_files.php 2026-02-08 10:33:29.000000000 +0100 @@ -2,7 +2,7 @@ // autoload_files.php @generated by Composer -$vendorDir = dirname(dirname(__FILE__)); +$vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/vendor/composer/autoload_namespaces.php new/roundcubemail-1.6.13/vendor/composer/autoload_namespaces.php --- old/roundcubemail-1.6.12/vendor/composer/autoload_namespaces.php 2025-12-14 09:22:47.000000000 +0100 +++ new/roundcubemail-1.6.13/vendor/composer/autoload_namespaces.php 2026-02-08 10:33:29.000000000 +0100 @@ -2,12 +2,12 @@ // autoload_namespaces.php @generated by Composer -$vendorDir = dirname(dirname(__FILE__)); +$vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( - 'Net' => array($vendorDir . '/pear/net_socket', $vendorDir . '/pear/net_smtp'), + 'Net' => array($vendorDir . '/pear/net_smtp', $vendorDir . '/pear/net_socket'), 'Mail' => array($vendorDir . '/pear/mail_mime'), - 'Console' => array($vendorDir . '/pear/console_getopt', $vendorDir . '/pear/console_commandline'), + 'Console' => array($vendorDir . '/pear/console_commandline', $vendorDir . '/pear/console_getopt'), 'Auth' => array($vendorDir . '/pear/auth_sasl'), ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/vendor/composer/autoload_psr4.php new/roundcubemail-1.6.13/vendor/composer/autoload_psr4.php --- old/roundcubemail-1.6.12/vendor/composer/autoload_psr4.php 2025-12-14 09:22:47.000000000 +0100 +++ new/roundcubemail-1.6.13/vendor/composer/autoload_psr4.php 2026-02-08 10:33:29.000000000 +0100 @@ -2,13 +2,13 @@ // autoload_psr4.php @generated by Composer -$vendorDir = dirname(dirname(__FILE__)); +$vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( 'RtfHtmlPhp\\' => array($vendorDir . '/roundcube/rtf-html-php/src'), 'Roundcube\\Composer\\' => array($vendorDir . '/roundcube/plugin-installer/src'), - 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src', $vendorDir . '/psr/http-factory/src'), + 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-factory/src', $vendorDir . '/psr/http-message/src'), 'Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'), 'Masterminds\\' => array($vendorDir . '/masterminds/html5/src'), 'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/vendor/composer/autoload_real.php new/roundcubemail-1.6.13/vendor/composer/autoload_real.php --- old/roundcubemail-1.6.12/vendor/composer/autoload_real.php 2025-12-14 09:22:47.000000000 +0100 +++ new/roundcubemail-1.6.13/vendor/composer/autoload_real.php 2026-02-08 10:33:29.000000000 +0100 @@ -2,7 +2,7 @@ // autoload_real.php @generated by Composer -class ComposerAutoloaderInit0e572040d941ed19e19bbb9fc5945df6 +class ComposerAutoloaderInitd30534b7ccef70d5be1f4ba9bc89dbe4 { private static $loader; @@ -24,61 +24,31 @@ require __DIR__ . '/platform_check.php'; - spl_autoload_register(array('ComposerAutoloaderInit0e572040d941ed19e19bbb9fc5945df6', 'loadClassLoader'), true, true); - self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__))); - spl_autoload_unregister(array('ComposerAutoloaderInit0e572040d941ed19e19bbb9fc5945df6', 'loadClassLoader')); + spl_autoload_register(array('ComposerAutoloaderInitd30534b7ccef70d5be1f4ba9bc89dbe4', 'loadClassLoader'), true, true); + self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); + spl_autoload_unregister(array('ComposerAutoloaderInitd30534b7ccef70d5be1f4ba9bc89dbe4', 'loadClassLoader')); $includePaths = require __DIR__ . '/include_paths.php'; $includePaths[] = get_include_path(); set_include_path(implode(PATH_SEPARATOR, $includePaths)); - $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); - if ($useStaticLoader) { - require __DIR__ . '/autoload_static.php'; - - call_user_func(\Composer\Autoload\ComposerStaticInit0e572040d941ed19e19bbb9fc5945df6::getInitializer($loader)); - } else { - $map = require __DIR__ . '/autoload_namespaces.php'; - foreach ($map as $namespace => $path) { - $loader->set($namespace, $path); - } - - $map = require __DIR__ . '/autoload_psr4.php'; - foreach ($map as $namespace => $path) { - $loader->setPsr4($namespace, $path); - } - - $classMap = require __DIR__ . '/autoload_classmap.php'; - if ($classMap) { - $loader->addClassMap($classMap); - } - } + require __DIR__ . '/autoload_static.php'; + call_user_func(\Composer\Autoload\ComposerStaticInitd30534b7ccef70d5be1f4ba9bc89dbe4::getInitializer($loader)); $loader->register(true); - if ($useStaticLoader) { - $includeFiles = Composer\Autoload\ComposerStaticInit0e572040d941ed19e19bbb9fc5945df6::$files; - } else { - $includeFiles = require __DIR__ . '/autoload_files.php'; - } - foreach ($includeFiles as $fileIdentifier => $file) { - composerRequire0e572040d941ed19e19bbb9fc5945df6($fileIdentifier, $file); + $filesToLoad = \Composer\Autoload\ComposerStaticInitd30534b7ccef70d5be1f4ba9bc89dbe4::$files; + $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { + if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { + $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; + + require $file; + } + }, null, null); + foreach ($filesToLoad as $fileIdentifier => $file) { + $requireFile($fileIdentifier, $file); } return $loader; } } - -/** - * @param string $fileIdentifier - * @param string $file - * @return void - */ -function composerRequire0e572040d941ed19e19bbb9fc5945df6($fileIdentifier, $file) -{ - if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { - $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; - - require $file; - } -} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/vendor/composer/autoload_static.php new/roundcubemail-1.6.13/vendor/composer/autoload_static.php --- old/roundcubemail-1.6.12/vendor/composer/autoload_static.php 2025-12-14 09:22:47.000000000 +0100 +++ new/roundcubemail-1.6.13/vendor/composer/autoload_static.php 2026-02-08 10:33:29.000000000 +0100 @@ -4,7 +4,7 @@ namespace Composer\Autoload; -class ComposerStaticInit0e572040d941ed19e19bbb9fc5945df6 +class ComposerStaticInitd30534b7ccef70d5be1f4ba9bc89dbe4 { public static $files = array ( '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php', @@ -13,107 +13,107 @@ ); public static $prefixLengthsPsr4 = array ( - 'R' => + 'R' => array ( 'RtfHtmlPhp\\' => 11, 'Roundcube\\Composer\\' => 19, ), - 'P' => + 'P' => array ( 'Psr\\Http\\Message\\' => 17, 'Psr\\Http\\Client\\' => 16, ), - 'M' => + 'M' => array ( 'Masterminds\\' => 12, ), - 'G' => + 'G' => array ( 'GuzzleHttp\\Psr7\\' => 16, 'GuzzleHttp\\Promise\\' => 19, 'GuzzleHttp\\' => 11, ), - 'D' => + 'D' => array ( 'DASPRiD\\Enum\\' => 13, ), - 'B' => + 'B' => array ( 'BaconQrCode\\' => 12, ), ); public static $prefixDirsPsr4 = array ( - 'RtfHtmlPhp\\' => + 'RtfHtmlPhp\\' => array ( 0 => __DIR__ . '/..' . '/roundcube/rtf-html-php/src', ), - 'Roundcube\\Composer\\' => + 'Roundcube\\Composer\\' => array ( 0 => __DIR__ . '/..' . '/roundcube/plugin-installer/src', ), - 'Psr\\Http\\Message\\' => + 'Psr\\Http\\Message\\' => array ( - 0 => __DIR__ . '/..' . '/psr/http-message/src', - 1 => __DIR__ . '/..' . '/psr/http-factory/src', + 0 => __DIR__ . '/..' . '/psr/http-factory/src', + 1 => __DIR__ . '/..' . '/psr/http-message/src', ), - 'Psr\\Http\\Client\\' => + 'Psr\\Http\\Client\\' => array ( 0 => __DIR__ . '/..' . '/psr/http-client/src', ), - 'Masterminds\\' => + 'Masterminds\\' => array ( 0 => __DIR__ . '/..' . '/masterminds/html5/src', ), - 'GuzzleHttp\\Psr7\\' => + 'GuzzleHttp\\Psr7\\' => array ( 0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src', ), - 'GuzzleHttp\\Promise\\' => + 'GuzzleHttp\\Promise\\' => array ( 0 => __DIR__ . '/..' . '/guzzlehttp/promises/src', ), - 'GuzzleHttp\\' => + 'GuzzleHttp\\' => array ( 0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src', ), - 'DASPRiD\\Enum\\' => + 'DASPRiD\\Enum\\' => array ( 0 => __DIR__ . '/..' . '/dasprid/enum/src', ), - 'BaconQrCode\\' => + 'BaconQrCode\\' => array ( 0 => __DIR__ . '/..' . '/bacon/bacon-qr-code/src', ), ); public static $prefixesPsr0 = array ( - 'N' => + 'N' => array ( - 'Net' => + 'Net' => array ( - 0 => __DIR__ . '/..' . '/pear/net_socket', - 1 => __DIR__ . '/..' . '/pear/net_smtp', + 0 => __DIR__ . '/..' . '/pear/net_smtp', + 1 => __DIR__ . '/..' . '/pear/net_socket', ), ), - 'M' => + 'M' => array ( - 'Mail' => + 'Mail' => array ( 0 => __DIR__ . '/..' . '/pear/mail_mime', ), ), - 'C' => + 'C' => array ( - 'Console' => + 'Console' => array ( - 0 => __DIR__ . '/..' . '/pear/console_getopt', - 1 => __DIR__ . '/..' . '/pear/console_commandline', + 0 => __DIR__ . '/..' . '/pear/console_commandline', + 1 => __DIR__ . '/..' . '/pear/console_getopt', ), ), - 'A' => + 'A' => array ( - 'Auth' => + 'Auth' => array ( 0 => __DIR__ . '/..' . '/pear/auth_sasl', ), @@ -169,10 +169,10 @@ public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit0e572040d941ed19e19bbb9fc5945df6::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit0e572040d941ed19e19bbb9fc5945df6::$prefixDirsPsr4; - $loader->prefixesPsr0 = ComposerStaticInit0e572040d941ed19e19bbb9fc5945df6::$prefixesPsr0; - $loader->classMap = ComposerStaticInit0e572040d941ed19e19bbb9fc5945df6::$classMap; + $loader->prefixLengthsPsr4 = ComposerStaticInitd30534b7ccef70d5be1f4ba9bc89dbe4::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInitd30534b7ccef70d5be1f4ba9bc89dbe4::$prefixDirsPsr4; + $loader->prefixesPsr0 = ComposerStaticInitd30534b7ccef70d5be1f4ba9bc89dbe4::$prefixesPsr0; + $loader->classMap = ComposerStaticInitd30534b7ccef70d5be1f4ba9bc89dbe4::$classMap; }, null, ClassLoader::class); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/vendor/composer/include_paths.php new/roundcubemail-1.6.13/vendor/composer/include_paths.php --- old/roundcubemail-1.6.12/vendor/composer/include_paths.php 2025-12-14 09:22:47.000000000 +0100 +++ new/roundcubemail-1.6.13/vendor/composer/include_paths.php 2026-02-08 10:33:29.000000000 +0100 @@ -2,7 +2,7 @@ // include_paths.php @generated by Composer -$vendorDir = dirname(dirname(__FILE__)); +$vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/vendor/composer/installed.json new/roundcubemail-1.6.13/vendor/composer/installed.json --- old/roundcubemail-1.6.12/vendor/composer/installed.json 2025-12-14 09:22:46.000000000 +0100 +++ new/roundcubemail-1.6.13/vendor/composer/installed.json 2026-02-08 10:33:29.000000000 +0100 @@ -688,6 +688,7 @@ "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=Console_CommandLine", "source": "https://github.com/pear/Console_CommandLine" }, + "abandoned": true, "install-path": "../pear/console_commandline" }, { @@ -1127,17 +1128,17 @@ }, { "name": "pear/pear-core-minimal", - "version": "v1.10.16", - "version_normalized": "1.10.16.0", + "version": "v1.10.18", + "version_normalized": "1.10.18.0", "source": { "type": "git", "url": "https://github.com/pear/pear-core-minimal.git", - "reference": "c0f51b45f50683bf5bbf558036854ebc9b54d033" + "reference": "c7b55789d01de0ce090d289b73f1bbd6a2f113b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/c0f51b45f50683bf5bbf558036854ebc9b54d033", - "reference": "c0f51b45f50683bf5bbf558036854ebc9b54d033", + "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/c7b55789d01de0ce090d289b73f1bbd6a2f113b1", + "reference": "c7b55789d01de0ce090d289b73f1bbd6a2f113b1", "shasum": "" }, "require": { @@ -1148,7 +1149,7 @@ "replace": { "rsky/pear-core-min": "self.version" }, - "time": "2024-11-24T22:27:58+00:00", + "time": "2025-12-14T20:37:07+00:00", "type": "library", "installation-source": "dist", "autoload": { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/vendor/composer/installed.php new/roundcubemail-1.6.13/vendor/composer/installed.php --- old/roundcubemail-1.6.12/vendor/composer/installed.php 2025-12-14 09:22:46.000000000 +0100 +++ new/roundcubemail-1.6.13/vendor/composer/installed.php 2026-02-08 10:33:29.000000000 +0100 @@ -1,184 +1,184 @@ <?php return array( 'root' => array( + 'name' => 'roundcube/roundcubemail', 'pretty_version' => '1.0.0+no-version-set', 'version' => '1.0.0.0', + 'reference' => null, 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'reference' => null, - 'name' => 'roundcube/roundcubemail', 'dev' => false, ), 'versions' => array( 'bacon/bacon-qr-code' => array( 'pretty_version' => '2.0.8', 'version' => '2.0.8.0', + 'reference' => '8674e51bb65af933a5ffaf1c308a660387c35c22', 'type' => 'library', 'install_path' => __DIR__ . '/../bacon/bacon-qr-code', 'aliases' => array(), - 'reference' => '8674e51bb65af933a5ffaf1c308a660387c35c22', 'dev_requirement' => false, ), 'dasprid/enum' => array( 'pretty_version' => '1.0.7', 'version' => '1.0.7.0', + 'reference' => 'b5874fa9ed0043116c72162ec7f4fb50e02e7cce', 'type' => 'library', 'install_path' => __DIR__ . '/../dasprid/enum', 'aliases' => array(), - 'reference' => 'b5874fa9ed0043116c72162ec7f4fb50e02e7cce', 'dev_requirement' => false, ), 'guzzlehttp/guzzle' => array( 'pretty_version' => '7.10.0', 'version' => '7.10.0.0', + 'reference' => 'b51ac707cfa420b7bfd4e4d5e510ba8008e822b4', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/guzzle', 'aliases' => array(), - 'reference' => 'b51ac707cfa420b7bfd4e4d5e510ba8008e822b4', 'dev_requirement' => false, ), 'guzzlehttp/promises' => array( 'pretty_version' => '2.3.0', 'version' => '2.3.0.0', + 'reference' => '481557b130ef3790cf82b713667b43030dc9c957', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/promises', 'aliases' => array(), - 'reference' => '481557b130ef3790cf82b713667b43030dc9c957', 'dev_requirement' => false, ), 'guzzlehttp/psr7' => array( 'pretty_version' => '2.8.0', 'version' => '2.8.0.0', + 'reference' => '21dc724a0583619cd1652f673303492272778051', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/psr7', 'aliases' => array(), - 'reference' => '21dc724a0583619cd1652f673303492272778051', 'dev_requirement' => false, ), 'kolab/net_ldap3' => array( 'pretty_version' => 'v1.1.5', 'version' => '1.1.5.0', + 'reference' => '5a319cf437d75aad564ce7fd076cc5423722868b', 'type' => 'library', 'install_path' => __DIR__ . '/../kolab/net_ldap3', 'aliases' => array(), - 'reference' => '5a319cf437d75aad564ce7fd076cc5423722868b', 'dev_requirement' => false, ), 'masterminds/html5' => array( 'pretty_version' => '2.7.6', 'version' => '2.7.6.0', + 'reference' => '897eb517a343a2281f11bc5556d6548db7d93947', 'type' => 'library', 'install_path' => __DIR__ . '/../masterminds/html5', 'aliases' => array(), - 'reference' => '897eb517a343a2281f11bc5556d6548db7d93947', 'dev_requirement' => false, ), 'pear/auth_sasl' => array( 'pretty_version' => 'v1.1.0', 'version' => '1.1.0.0', + 'reference' => 'db1ead3dc0bf986d2bab0dbc04d114800cf91dee', 'type' => 'library', 'install_path' => __DIR__ . '/../pear/auth_sasl', 'aliases' => array(), - 'reference' => 'db1ead3dc0bf986d2bab0dbc04d114800cf91dee', 'dev_requirement' => false, ), 'pear/console_commandline' => array( 'pretty_version' => 'v1.2.6', 'version' => '1.2.6.0', + 'reference' => '611c5bff2e47ec5a184748cb5fedc2869098ff28', 'type' => 'library', 'install_path' => __DIR__ . '/../pear/console_commandline', 'aliases' => array(), - 'reference' => '611c5bff2e47ec5a184748cb5fedc2869098ff28', 'dev_requirement' => false, ), 'pear/console_getopt' => array( 'pretty_version' => 'v1.4.3', 'version' => '1.4.3.0', + 'reference' => 'a41f8d3e668987609178c7c4a9fe48fecac53fa0', 'type' => 'library', 'install_path' => __DIR__ . '/../pear/console_getopt', 'aliases' => array(), - 'reference' => 'a41f8d3e668987609178c7c4a9fe48fecac53fa0', 'dev_requirement' => false, ), 'pear/crypt_gpg' => array( 'pretty_version' => 'v1.6.11', 'version' => '1.6.11.0', + 'reference' => '6d307aae8b38ee35d0a2297510bd2356d1452c2b', 'type' => 'library', 'install_path' => __DIR__ . '/../pear/crypt_gpg', 'aliases' => array(), - 'reference' => '6d307aae8b38ee35d0a2297510bd2356d1452c2b', 'dev_requirement' => false, ), 'pear/mail_mime' => array( 'pretty_version' => '1.10.12', 'version' => '1.10.12.0', + 'reference' => 'd032c7c9335e96d5954ac6e93d33955f3b7246e2', 'type' => 'library', 'install_path' => __DIR__ . '/../pear/mail_mime', 'aliases' => array(), - 'reference' => 'd032c7c9335e96d5954ac6e93d33955f3b7246e2', 'dev_requirement' => false, ), 'pear/net_ldap2' => array( 'pretty_version' => 'v2.3.0', 'version' => '2.3.0.0', + 'reference' => '6eae6d20533469ffe1c01684923cd09f0fae3b77', 'type' => 'library', 'install_path' => __DIR__ . '/../pear/net_ldap2', 'aliases' => array(), - 'reference' => '6eae6d20533469ffe1c01684923cd09f0fae3b77', 'dev_requirement' => false, ), 'pear/net_sieve' => array( 'pretty_version' => '1.4.8', 'version' => '1.4.8.0', + 'reference' => '345eb171c0b377e4f9f6fe9c6e532a76dfe2d754', 'type' => 'library', 'install_path' => __DIR__ . '/../pear/net_sieve', 'aliases' => array(), - 'reference' => '345eb171c0b377e4f9f6fe9c6e532a76dfe2d754', 'dev_requirement' => false, ), 'pear/net_smtp' => array( 'pretty_version' => '1.10.1', 'version' => '1.10.1.0', + 'reference' => 'cfd963dc5cc73b4d64c7769e47dfa0f439dec536', 'type' => 'library', 'install_path' => __DIR__ . '/../pear/net_smtp', 'aliases' => array(), - 'reference' => 'cfd963dc5cc73b4d64c7769e47dfa0f439dec536', 'dev_requirement' => false, ), 'pear/net_socket' => array( 'pretty_version' => 'v1.2.2', 'version' => '1.2.2.0', + 'reference' => 'bbe6a12bb4f7059dba161f6ddd43f369c0ec8d09', 'type' => 'library', 'install_path' => __DIR__ . '/../pear/net_socket', 'aliases' => array(), - 'reference' => 'bbe6a12bb4f7059dba161f6ddd43f369c0ec8d09', 'dev_requirement' => false, ), 'pear/pear-core-minimal' => array( - 'pretty_version' => 'v1.10.16', - 'version' => '1.10.16.0', + 'pretty_version' => 'v1.10.18', + 'version' => '1.10.18.0', + 'reference' => 'c7b55789d01de0ce090d289b73f1bbd6a2f113b1', 'type' => 'library', 'install_path' => __DIR__ . '/../pear/pear-core-minimal', 'aliases' => array(), - 'reference' => 'c0f51b45f50683bf5bbf558036854ebc9b54d033', 'dev_requirement' => false, ), 'pear/pear_exception' => array( 'pretty_version' => 'v1.0.2', 'version' => '1.0.2.0', + 'reference' => 'b14fbe2ddb0b9f94f5b24cf08783d599f776fff0', 'type' => 'class', 'install_path' => __DIR__ . '/../pear/pear_exception', 'aliases' => array(), - 'reference' => 'b14fbe2ddb0b9f94f5b24cf08783d599f776fff0', 'dev_requirement' => false, ), 'psr/http-client' => array( 'pretty_version' => '1.0.3', 'version' => '1.0.3.0', + 'reference' => 'bb5906edc1c324c9a05aa0873d40117941e5fa90', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-client', 'aliases' => array(), - 'reference' => 'bb5906edc1c324c9a05aa0873d40117941e5fa90', 'dev_requirement' => false, ), 'psr/http-client-implementation' => array( @@ -190,10 +190,10 @@ 'psr/http-factory' => array( 'pretty_version' => '1.1.0', 'version' => '1.1.0.0', + 'reference' => '2b4765fddfe3b508ac62f829e852b1501d3f6e8a', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-factory', 'aliases' => array(), - 'reference' => '2b4765fddfe3b508ac62f829e852b1501d3f6e8a', 'dev_requirement' => false, ), 'psr/http-factory-implementation' => array( @@ -205,10 +205,10 @@ 'psr/http-message' => array( 'pretty_version' => '2.0', 'version' => '2.0.0.0', + 'reference' => '402d35bcb92c70c026d1a6a9883f06b2ead23d71', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-message', 'aliases' => array(), - 'reference' => '402d35bcb92c70c026d1a6a9883f06b2ead23d71', 'dev_requirement' => false, ), 'psr/http-message-implementation' => array( @@ -220,52 +220,52 @@ 'ralouphie/getallheaders' => array( 'pretty_version' => '3.0.3', 'version' => '3.0.3.0', + 'reference' => '120b605dfeb996808c31b6477290a714d356e822', 'type' => 'library', 'install_path' => __DIR__ . '/../ralouphie/getallheaders', 'aliases' => array(), - 'reference' => '120b605dfeb996808c31b6477290a714d356e822', 'dev_requirement' => false, ), 'roundcube/plugin-installer' => array( 'pretty_version' => '0.3.11', 'version' => '0.3.11.0', + 'reference' => '93c5cfc660d47929aaca64585791e7e3887948ed', 'type' => 'composer-plugin', 'install_path' => __DIR__ . '/../roundcube/plugin-installer', 'aliases' => array(), - 'reference' => '93c5cfc660d47929aaca64585791e7e3887948ed', 'dev_requirement' => false, ), 'roundcube/roundcubemail' => array( 'pretty_version' => '1.0.0+no-version-set', 'version' => '1.0.0.0', + 'reference' => null, 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'reference' => null, 'dev_requirement' => false, ), 'roundcube/rtf-html-php' => array( 'pretty_version' => 'v2.2', 'version' => '2.2.0.0', + 'reference' => 'a3432ca249b73bf24fec50114191a63ad8b1478c', 'type' => 'library', 'install_path' => __DIR__ . '/../roundcube/rtf-html-php', 'aliases' => array(), - 'reference' => 'a3432ca249b73bf24fec50114191a63ad8b1478c', 'dev_requirement' => false, ), 'rsky/pear-core-min' => array( 'dev_requirement' => false, 'replaced' => array( - 0 => 'v1.10.16', + 0 => 'v1.10.18', ), ), 'symfony/deprecation-contracts' => array( 'pretty_version' => 'v2.5.4', 'version' => '2.5.4.0', + 'reference' => '605389f2a7e5625f273b53960dc46aeaf9c62918', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), - 'reference' => '605389f2a7e5625f273b53960dc46aeaf9c62918', 'dev_requirement' => false, ), ), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/vendor/composer/platform_check.php new/roundcubemail-1.6.13/vendor/composer/platform_check.php --- old/roundcubemail-1.6.12/vendor/composer/platform_check.php 2025-12-14 09:22:47.000000000 +0100 +++ new/roundcubemail-1.6.13/vendor/composer/platform_check.php 2026-02-08 10:33:29.000000000 +0100 @@ -19,8 +19,7 @@ echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; } } - trigger_error( - 'Composer detected issues in your platform: ' . implode(' ', $issues), - E_USER_ERROR + throw new \RuntimeException( + 'Composer detected issues in your platform: ' . implode(' ', $issues) ); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/roundcubemail-1.6.12/vendor/pear/pear-core-minimal/src/PEAR.php new/roundcubemail-1.6.13/vendor/pear/pear-core-minimal/src/PEAR.php --- old/roundcubemail-1.6.12/vendor/pear/pear-core-minimal/src/PEAR.php 2024-11-24 23:27:58.000000000 +0100 +++ new/roundcubemail-1.6.13/vendor/pear/pear-core-minimal/src/PEAR.php 2025-12-14 21:37:07.000000000 +0100 @@ -216,9 +216,13 @@ public function __call($method, $arguments) { if (!isset(self::$bivalentMethods[$method])) { - trigger_error( - 'Call to undefined method PEAR::' . $method . '()', E_USER_ERROR - ); + if (PHP_VERSION_ID < 70000) { + trigger_error( + 'Call to undefined method PEAR::' . $method . '()', E_USER_ERROR + ); + } else { + throw new Error('Call to undefined method PEAR::' . $method . '()'); + } } return call_user_func_array( array(__CLASS__, '_' . $method), @@ -229,9 +233,13 @@ public static function __callStatic($method, $arguments) { if (!isset(self::$bivalentMethods[$method])) { - trigger_error( - 'Call to undefined method PEAR::' . $method . '()', E_USER_ERROR - ); + if (PHP_VERSION_ID < 70000) { + trigger_error( + 'Call to undefined method PEAR::' . $method . '()', E_USER_ERROR + ); + } else { + throw new Error('Call to undefined method PEAR::' . $method . '()'); + } } return call_user_func_array( array(__CLASS__, '_' . $method),
