* different object on a subsequent GET you are strongly recommended to not | * different object on a subsequent GET you are strongly recommended to not | ||||
* return an ETag, and just return null. | * return an ETag, and just return null. | ||||
* | * | ||||
* @param resource $data | |||||
* @param resource|string $data | |||||
* | * | ||||
* @throws Forbidden | * @throws Forbidden | ||||
* @throws UnsupportedMediaType | * @throws UnsupportedMediaType |
$encryptedFiles = []; | $encryptedFiles = []; | ||||
$this->walkFiles($view, $sourcePath, | $this->walkFiles($view, $sourcePath, | ||||
function (FileInfo $fileInfo) use ($progress) { | |||||
function (FileInfo $fileInfo) use ($progress, &$encryptedFiles) { | |||||
if ($fileInfo->getType() === FileInfo::TYPE_FOLDER) { | if ($fileInfo->getType() === FileInfo::TYPE_FOLDER) { | ||||
// only analyze into folders from main storage, | // only analyze into folders from main storage, | ||||
if (!$fileInfo->getStorage()->instanceOfStorage(IHomeStorage::class)) { | if (!$fileInfo->getStorage()->instanceOfStorage(IHomeStorage::class)) { |
$result = $this->getConnection()->put($this->absPath($path), $stream); | $result = $this->getConnection()->put($this->absPath($path), $stream); | ||||
fclose($stream); | fclose($stream); | ||||
if ($result) { | if ($result) { | ||||
if ($size === null) { | |||||
throw new \Exception("Failed to get written size from sftp storage wrapper"); | |||||
} | |||||
return $size; | return $size; | ||||
} else { | } else { | ||||
throw new \Exception("Failed to write steam to sftp storage"); | throw new \Exception("Failed to write steam to sftp storage"); |
$recommendations[] = $this->l10n->t('The OPcache buffer is nearly full. To assure that all scripts can be hold in cache, it is recommended to apply "opcache.memory_consumption" to your PHP configuration with a value higher than "%s".', [($this->iniGetWrapper->getNumeric('opcache.memory_consumption') ?: 'currently')]); | $recommendations[] = $this->l10n->t('The OPcache buffer is nearly full. To assure that all scripts can be hold in cache, it is recommended to apply "opcache.memory_consumption" to your PHP configuration with a value higher than "%s".', [($this->iniGetWrapper->getNumeric('opcache.memory_consumption') ?: 'currently')]); | ||||
} | } | ||||
$interned_strings_buffer = $this->iniGetWrapper->getNumeric('opcache.interned_strings_buffer') ?? 0; | |||||
$memory_consumption = $this->iniGetWrapper->getNumeric('opcache.memory_consumption') ?? 0; | |||||
if ( | if ( | ||||
// Do not recommend to raise the interned strings buffer size above a quarter of the total OPcache size | // Do not recommend to raise the interned strings buffer size above a quarter of the total OPcache size | ||||
($this->iniGetWrapper->getNumeric('opcache.interned_strings_buffer') ?? $this->iniGetWrapper->getNumeric('opcache.memory_consumption') > 0 ?? 0 / 4) && | |||||
($interned_strings_buffer < ($memory_consumption / 4)) && | |||||
( | ( | ||||
empty($status['interned_strings_usage']['free_memory']) || | empty($status['interned_strings_usage']['free_memory']) || | ||||
($status['interned_strings_usage']['used_memory'] / $status['interned_strings_usage']['free_memory'] > 9) | ($status['interned_strings_usage']['used_memory'] / $status['interned_strings_usage']['free_memory'] > 9) |
/** | /** | ||||
* @param $app string app name | |||||
* @param string $app app name | |||||
* @return string|ISimpleFile path to app icon / file of logo | * @return string|ISimpleFile path to app icon / file of logo | ||||
*/ | */ | ||||
public function getAppIcon($app) { | public function getAppIcon($app) { | ||||
} | } | ||||
/** | /** | ||||
* @param $app string app name | |||||
* @param $image string relative path to image in app folder | |||||
* @param string $app app name | |||||
* @param string $image relative path to image in app folder | |||||
* @return string|false absolute path to image | * @return string|false absolute path to image | ||||
*/ | */ | ||||
public function getAppImage($app, $image) { | public function getAppImage($app, $image) { | ||||
/** | /** | ||||
* replace default color with a custom one | * replace default color with a custom one | ||||
* | * | ||||
* @param $svg string content of a svg file | |||||
* @param $color string color to match | |||||
* @param string $svg content of a svg file | |||||
* @param string $color color to match | |||||
* @return string | * @return string | ||||
*/ | */ | ||||
public function colorizeSvg($svg, $color) { | public function colorizeSvg($svg, $color) { |
$con = new \OCA\User_LDAP\Connection($ldapWrapper, $prefix, null); | $con = new \OCA\User_LDAP\Connection($ldapWrapper, $prefix, null); | ||||
$con->setConfiguration($configuration->getConfiguration()); | $con->setConfiguration($configuration->getConfiguration()); | ||||
$con->ldapConfigurationActive = true; | |||||
$con->ldapConfigurationActive = (string)true; | |||||
$con->setIgnoreValidation(true); | $con->setIgnoreValidation(true); | ||||
$factory = \OC::$server->get(\OCA\User_LDAP\AccessFactory::class); | $factory = \OC::$server->get(\OCA\User_LDAP\AccessFactory::class); |
use Psr\Log\LoggerInterface; | use Psr\Log\LoggerInterface; | ||||
/** | /** | ||||
* @property int ldapPagingSize holds an integer | |||||
* @property string ldapUserAvatarRule | |||||
* @property string $ldapHost | |||||
* @property string $ldapPort | |||||
* @property string $ldapBackupHost | |||||
* @property string $ldapBackupPort | |||||
* @property string $ldapBackgroundHost | |||||
* @property string $ldapBackgroundPort | |||||
* @property array|'' $ldapBase | |||||
* @property array|'' $ldapBaseUsers | |||||
* @property array|'' $ldapBaseGroups | |||||
* @property string $ldapAgentName | |||||
* @property string $ldapAgentPassword | |||||
* @property string $ldapTLS | |||||
* @property string $turnOffCertCheck | |||||
* @property string $ldapIgnoreNamingRules | |||||
* @property string $ldapUserDisplayName | |||||
* @property string $ldapUserDisplayName2 | |||||
* @property string $ldapUserAvatarRule | |||||
* @property string $ldapGidNumber | |||||
* @property array|'' $ldapUserFilterObjectclass | |||||
* @property array|'' $ldapUserFilterGroups | |||||
* @property string $ldapUserFilter | |||||
* @property string $ldapUserFilterMode | |||||
* @property string $ldapGroupFilter | |||||
* @property string $ldapGroupFilterMode | |||||
* @property array|'' $ldapGroupFilterObjectclass | |||||
* @property array|'' $ldapGroupFilterGroups | |||||
* @property string $ldapGroupDisplayName | |||||
* @property string $ldapGroupMemberAssocAttr | |||||
* @property string $ldapLoginFilter | |||||
* @property string $ldapLoginFilterMode | |||||
* @property string $ldapLoginFilterEmail | |||||
* @property string $ldapLoginFilterUsername | |||||
* @property array|'' $ldapLoginFilterAttributes | |||||
* @property string $ldapQuotaAttribute | |||||
* @property string $ldapQuotaDefault | |||||
* @property string $ldapEmailAttribute | |||||
* @property string $ldapCacheTTL | |||||
* @property string $ldapUuidUserAttribute | |||||
* @property string $ldapUuidGroupAttribute | |||||
* @property string $ldapOverrideMainServer | |||||
* @property string $ldapConfigurationActive | |||||
* @property array|'' $ldapAttributesForUserSearch | |||||
* @property array|'' $ldapAttributesForGroupSearch | |||||
* @property string $ldapExperiencedAdmin | |||||
* @property string $homeFolderNamingRule | |||||
* @property string $hasMemberOfFilterSupport | |||||
* @property string $useMemberOfToDetectMembership | |||||
* @property string $ldapExpertUsernameAttr | |||||
* @property string $ldapExpertUUIDUserAttr | |||||
* @property string $ldapExpertUUIDGroupAttr | |||||
* @property string $markRemnantsAsDisabled | |||||
* @property string $lastJpegPhotoLookup | |||||
* @property string $ldapNestedGroups | |||||
* @property string $ldapPagingSize | |||||
* @property string $turnOnPasswordChange | |||||
* @property string $ldapDynamicGroupMemberURL | |||||
* @property string $ldapDefaultPPolicyDN | |||||
* @property string $ldapExtStorageHomeAttribute | |||||
* @property string $ldapMatchingRuleInChainState | |||||
* @property string $ldapConnectionTimeout | |||||
* @property string $ldapAttributePhone | |||||
* @property string $ldapAttributeWebsite | |||||
* @property string $ldapAttributeAddress | |||||
* @property string $ldapAttributeTwitter | |||||
* @property string $ldapAttributeFediverse | |||||
* @property string $ldapAttributeOrganisation | |||||
* @property string $ldapAttributeRole | |||||
* @property string $ldapAttributeHeadline | |||||
* @property string $ldapAttributeBiography | |||||
* @property string $ldapAdminGroup | |||||
*/ | */ | ||||
class Configuration { | class Configuration { | ||||
public const AVATAR_PREFIX_DEFAULT = 'default'; | public const AVATAR_PREFIX_DEFAULT = 'default'; |
use Psr\Log\LoggerInterface; | use Psr\Log\LoggerInterface; | ||||
/** | /** | ||||
* magic properties (incomplete) | |||||
* magic properties | |||||
* responsible for LDAP connections in context with the provided configuration | * responsible for LDAP connections in context with the provided configuration | ||||
* | * | ||||
* @property string ldapHost | |||||
* @property string ldapPort holds the port number | |||||
* @property string ldapUserFilter | |||||
* @property string ldapUserDisplayName | |||||
* @property string ldapUserDisplayName2 | |||||
* @property string ldapUserAvatarRule | |||||
* @property boolean turnOnPasswordChange | |||||
* @property string[] ldapBaseUsers | |||||
* @property int|null ldapPagingSize holds an integer | |||||
* @property bool|mixed|void ldapGroupMemberAssocAttr | |||||
* @property string ldapUuidUserAttribute | |||||
* @property string ldapUuidGroupAttribute | |||||
* @property string ldapExpertUUIDUserAttr | |||||
* @property string ldapExpertUUIDGroupAttr | |||||
* @property string ldapQuotaAttribute | |||||
* @property string ldapQuotaDefault | |||||
* @property string ldapEmailAttribute | |||||
* @property string ldapExtStorageHomeAttribute | |||||
* @property string homeFolderNamingRule | |||||
* @property bool|string markRemnantsAsDisabled | |||||
* @property bool|string ldapNestedGroups | |||||
* @property string[] ldapBaseGroups | |||||
* @property string ldapGroupFilter | |||||
* @property string ldapGroupDisplayName | |||||
* @property string ldapLoginFilter | |||||
* @property string ldapDynamicGroupMemberURL | |||||
* @property string ldapGidNumber | |||||
* @property int hasMemberOfFilterSupport | |||||
* @property int useMemberOfToDetectMembership | |||||
* @property string ldapMatchingRuleInChainState | |||||
* @property string ldapAttributePhone | |||||
* @property string ldapAttributeWebsite | |||||
* @property string ldapAttributeAddress | |||||
* @property string ldapAttributeTwitter | |||||
* @property string ldapAttributeFediverse | |||||
* @property string ldapAttributeOrganisation | |||||
* @property string ldapAttributeRole | |||||
* @property string ldapAttributeHeadline | |||||
* @property string ldapAttributeBiography | |||||
* @property string ldapAdminGroup | |||||
* @property string $ldapHost | |||||
* @property string $ldapPort | |||||
* @property string $ldapBackupHost | |||||
* @property string $ldapBackupPort | |||||
* @property string $ldapBackgroundHost | |||||
* @property string $ldapBackgroundPort | |||||
* @property array|'' $ldapBase | |||||
* @property array|'' $ldapBaseUsers | |||||
* @property array|'' $ldapBaseGroups | |||||
* @property string $ldapAgentName | |||||
* @property string $ldapAgentPassword | |||||
* @property string $ldapTLS | |||||
* @property string $turnOffCertCheck | |||||
* @property string $ldapIgnoreNamingRules | |||||
* @property string $ldapUserDisplayName | |||||
* @property string $ldapUserDisplayName2 | |||||
* @property string $ldapUserAvatarRule | |||||
* @property string $ldapGidNumber | |||||
* @property array|'' $ldapUserFilterObjectclass | |||||
* @property array|'' $ldapUserFilterGroups | |||||
* @property string $ldapUserFilter | |||||
* @property string $ldapUserFilterMode | |||||
* @property string $ldapGroupFilter | |||||
* @property string $ldapGroupFilterMode | |||||
* @property array|'' $ldapGroupFilterObjectclass | |||||
* @property array|'' $ldapGroupFilterGroups | |||||
* @property string $ldapGroupDisplayName | |||||
* @property string $ldapGroupMemberAssocAttr | |||||
* @property string $ldapLoginFilter | |||||
* @property string $ldapLoginFilterMode | |||||
* @property string $ldapLoginFilterEmail | |||||
* @property string $ldapLoginFilterUsername | |||||
* @property array|'' $ldapLoginFilterAttributes | |||||
* @property string $ldapQuotaAttribute | |||||
* @property string $ldapQuotaDefault | |||||
* @property string $ldapEmailAttribute | |||||
* @property string $ldapCacheTTL | |||||
* @property string $ldapUuidUserAttribute | |||||
* @property string $ldapUuidGroupAttribute | |||||
* @property string $ldapOverrideMainServer | |||||
* @property string $ldapConfigurationActive | |||||
* @property array|'' $ldapAttributesForUserSearch | |||||
* @property array|'' $ldapAttributesForGroupSearch | |||||
* @property string $ldapExperiencedAdmin | |||||
* @property string $homeFolderNamingRule | |||||
* @property string $hasMemberOfFilterSupport | |||||
* @property string $useMemberOfToDetectMembership | |||||
* @property string $ldapExpertUsernameAttr | |||||
* @property string $ldapExpertUUIDUserAttr | |||||
* @property string $ldapExpertUUIDGroupAttr | |||||
* @property string $markRemnantsAsDisabled | |||||
* @property string $lastJpegPhotoLookup | |||||
* @property string $ldapNestedGroups | |||||
* @property string $ldapPagingSize | |||||
* @property string $turnOnPasswordChange | |||||
* @property string $ldapDynamicGroupMemberURL | |||||
* @property string $ldapDefaultPPolicyDN | |||||
* @property string $ldapExtStorageHomeAttribute | |||||
* @property string $ldapMatchingRuleInChainState | |||||
* @property string $ldapConnectionTimeout | |||||
* @property string $ldapAttributePhone | |||||
* @property string $ldapAttributeWebsite | |||||
* @property string $ldapAttributeAddress | |||||
* @property string $ldapAttributeTwitter | |||||
* @property string $ldapAttributeFediverse | |||||
* @property string $ldapAttributeOrganisation | |||||
* @property string $ldapAttributeRole | |||||
* @property string $ldapAttributeHeadline | |||||
* @property string $ldapAttributeBiography | |||||
* @property string $ldapAdminGroup | |||||
*/ | */ | ||||
class Connection extends LDAPUtility { | class Connection extends LDAPUtility { | ||||
private ?\LDAP\Connection $ldapConnectionRes = null; | private ?\LDAP\Connection $ldapConnectionRes = null; | ||||
$backupPort = (int)$this->configuration->ldapBackupPort; | $backupPort = (int)$this->configuration->ldapBackupPort; | ||||
if ($backupPort <= 0) { | if ($backupPort <= 0) { | ||||
$this->configuration->backupPort = $this->configuration->ldapPort; | |||||
$this->configuration->ldapBackupPort = $this->configuration->ldapPort; | |||||
} | } | ||||
//make sure empty search attributes are saved as simple, empty array | //make sure empty search attributes are saved as simple, empty array | ||||
if ((stripos((string)$this->configuration->ldapHost, 'ldaps://') === 0) | if ((stripos((string)$this->configuration->ldapHost, 'ldaps://') === 0) | ||||
&& $this->configuration->ldapTLS) { | && $this->configuration->ldapTLS) { | ||||
$this->configuration->ldapTLS = false; | |||||
$this->configuration->ldapTLS = (string)false; | |||||
$this->logger->info( | $this->logger->info( | ||||
'LDAPS (already using secure connection) and TLS do not work together. Switched off TLS.', | 'LDAPS (already using secure connection) and TLS do not work together. Switched off TLS.', | ||||
['app' => 'user_ldap'] | ['app' => 'user_ldap'] |
$this->backends[$configPrefix] = | $this->backends[$configPrefix] = | ||||
new Group_LDAP($this->getAccess($configPrefix), $this->groupPluginManager, $this->config, $this->ncUserManager); | new Group_LDAP($this->getAccess($configPrefix), $this->groupPluginManager, $this->config, $this->ncUserManager); | ||||
if (is_null($this->refBackend)) { | if (is_null($this->refBackend)) { | ||||
$this->refBackend = &$this->backends[$configPrefix]; | |||||
$this->refBackend = $this->backends[$configPrefix]; | |||||
} | } | ||||
} | } | ||||
$results = $access->fetchListOfUsers( | $results = $access->fetchListOfUsers( | ||||
$filter, | $filter, | ||||
$access->userManager->getAttributes(), | $access->userManager->getAttributes(), | ||||
$connection->ldapPagingSize, | |||||
(int)$connection->ldapPagingSize, | |||||
$cycleData['offset'], | $cycleData['offset'], | ||||
true | true | ||||
); | ); |
$serverControls = []; | $serverControls = []; | ||||
} | } | ||||
/** @psalm-suppress UndefinedVariable $oldHandler is defined when the closure is called but psalm fails to get that */ | |||||
$oldHandler = set_error_handler(function ($no, $message, $file, $line) use (&$oldHandler) { | $oldHandler = set_error_handler(function ($no, $message, $file, $line) use (&$oldHandler) { | ||||
if (str_contains($message, 'Partial search results returned: Sizelimit exceeded')) { | if (str_contains($message, 'Partial search results returned: Sizelimit exceeded')) { | ||||
return true; | return true; |
); | ); | ||||
if (is_null($this->refBackend)) { | if (is_null($this->refBackend)) { | ||||
$this->refBackend = &$this->backends[$configPrefix]; | |||||
$this->refBackend = $this->backends[$configPrefix]; | |||||
} | } | ||||
} | } | ||||
$this->fetchGroups($dbKey, $confKey); | $this->fetchGroups($dbKey, $confKey); | ||||
if ($testMemberOf) { | if ($testMemberOf) { | ||||
$this->configuration->hasMemberOfFilterSupport = $this->testMemberOf(); | |||||
$this->configuration->hasMemberOfFilterSupport = (string)$this->testMemberOf(); | |||||
$this->result->markChange(); | $this->result->markChange(); | ||||
if (!$this->configuration->hasMemberOfFilterSupport) { | if (!$this->configuration->hasMemberOfFilterSupport) { | ||||
throw new \Exception('memberOf is not supported by the server'); | throw new \Exception('memberOf is not supported by the server'); | ||||
if ($settingsFound === true) { | if ($settingsFound === true) { | ||||
$config = [ | $config = [ | ||||
'ldapPort' => $p, | |||||
'ldapTLS' => (int)$t | |||||
'ldapPort' => (string)$p, | |||||
'ldapTLS' => (string)$t, | |||||
]; | ]; | ||||
$this->configuration->setConfiguration($config); | $this->configuration->setConfiguration($config); | ||||
$this->logger->debug( | $this->logger->debug( | ||||
$this->ldap->setOption($cr, LDAP_OPT_PROTOCOL_VERSION, 3); | $this->ldap->setOption($cr, LDAP_OPT_PROTOCOL_VERSION, 3); | ||||
$this->ldap->setOption($cr, LDAP_OPT_REFERRALS, 0); | $this->ldap->setOption($cr, LDAP_OPT_REFERRALS, 0); | ||||
$this->ldap->setOption($cr, LDAP_OPT_NETWORK_TIMEOUT, self::LDAP_NW_TIMEOUT); | $this->ldap->setOption($cr, LDAP_OPT_NETWORK_TIMEOUT, self::LDAP_NW_TIMEOUT); | ||||
if ($this->configuration->ldapTLS === 1) { | |||||
if ($this->configuration->ldapTLS) { | |||||
$this->ldap->startTls($cr); | $this->ldap->startTls($cr); | ||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
/** | |||||
* @return array<array{port:int,tls:bool}> | |||||
*/ | |||||
private function getDefaultLdapPortSettings(): array { | private function getDefaultLdapPortSettings(): array { | ||||
static $settings = [ | static $settings = [ | ||||
['port' => 7636, 'tls' => false], | ['port' => 7636, 'tls' => false], | ||||
return $settings; | return $settings; | ||||
} | } | ||||
/** | |||||
* @return array<array{port:int,tls:bool}> | |||||
*/ | |||||
private function getPortSettingsToTry(): array { | private function getPortSettingsToTry(): array { | ||||
//389 ← LDAP / Unencrypted or StartTLS | //389 ← LDAP / Unencrypted or StartTLS | ||||
//636 ← LDAPS / SSL | //636 ← LDAPS / SSL | ||||
} | } | ||||
$portSettings[] = ['port' => $port, 'tls' => false]; | $portSettings[] = ['port' => $port, 'tls' => false]; | ||||
} elseif ($this->configuration->usesLdapi()) { | } elseif ($this->configuration->usesLdapi()) { | ||||
$portSettings[] = ['port' => '', 'tls' => false]; | |||||
$portSettings[] = ['port' => 0, 'tls' => false]; | |||||
} | } | ||||
//default ports | //default ports |
/** | /** | ||||
* Generate mime type list file | * Generate mime type list file | ||||
* | * | ||||
* @param array $aliases | |||||
* @param array<string,string> $aliases | |||||
* @return string | * @return string | ||||
*/ | */ | ||||
public function generateFile(array $aliases): string { | public function generateFile(array $aliases): string { |
protected function execute(InputInterface $input, OutputInterface $output): int { | protected function execute(InputInterface $input, OutputInterface $output): int { | ||||
$fileInput = $input->getArgument("file"); | $fileInput = $input->getArgument("file"); | ||||
$sizes = $input->getOption("size"); | $sizes = $input->getOption("size"); | ||||
$sizes = array_map(function (string $size) use ($output, &$error) { | |||||
$sizes = array_map(function (string $size) use ($output) { | |||||
if (str_contains($size, 'x')) { | if (str_contains($size, 'x')) { | ||||
$sizeParts = explode('x', $size, 2); | $sizeParts = explode('x', $size, 2); | ||||
} else { | } else { | ||||
$sizeParts = [$size, $size]; | $sizeParts = [$size, $size]; | ||||
} | } | ||||
if (!is_numeric($sizeParts[0]) || !is_numeric($sizeParts[1])) { | |||||
if (!is_numeric($sizeParts[0]) || !is_numeric($sizeParts[1] ?? null)) { | |||||
$output->writeln("<error>Invalid size $size</error>"); | $output->writeln("<error>Invalid size $size</error>"); | ||||
return null; | return null; | ||||
} | } |
//this doesn´t work always depending on the webserver and php configuration. | //this doesn´t work always depending on the webserver and php configuration. | ||||
//Let´s try to overwrite some defaults if they are smaller than 1 hour | //Let´s try to overwrite some defaults if they are smaller than 1 hour | ||||
if (intval(@ini_get('max_execution_time') ?? 0) < 3600) { | |||||
if (intval(@ini_get('max_execution_time') ?: 0) < 3600) { | |||||
@ini_set('max_execution_time', strval(3600)); | @ini_set('max_execution_time', strval(3600)); | ||||
} | } | ||||
if (intval(@ini_get('max_input_time') ?? 0) < 3600) { | |||||
if (intval(@ini_get('max_input_time') ?: 0) < 3600) { | |||||
@ini_set('max_input_time', strval(3600)); | @ini_set('max_input_time', strval(3600)); | ||||
} | } | ||||
// update local cache | // update local cache | ||||
if ($lazy) { | if ($lazy) { | ||||
$cache = &$this->lazyCache; | |||||
$this->lazyCache[$app][$key] = $value; | |||||
} else { | } else { | ||||
$cache = &$this->fastCache; | |||||
$this->fastCache[$app][$key] = $value; | |||||
} | } | ||||
$cache[$app][$key] = $value; | |||||
$this->valueTypes[$app][$key] = $type; | $this->valueTypes[$app][$key] = $type; | ||||
return true; | return true; | ||||
foreach ($rows as $row) { | foreach ($rows as $row) { | ||||
// most of the time, 'lazy' is not in the select because its value is already known | // most of the time, 'lazy' is not in the select because its value is already known | ||||
if (($row['lazy'] ?? ($lazy ?? 0) ? 1 : 0) === 1) { | if (($row['lazy'] ?? ($lazy ?? 0) ? 1 : 0) === 1) { | ||||
$cache = &$this->lazyCache; | |||||
$this->lazyCache[$row['appid']][$row['configkey']] = $row['configvalue'] ?? ''; | |||||
} else { | } else { | ||||
$cache = &$this->fastCache; | |||||
$this->fastCache[$row['appid']][$row['configkey']] = $row['configvalue'] ?? ''; | |||||
} | } | ||||
$cache[$row['appid']][$row['configkey']] = $row['configvalue'] ?? ''; | |||||
$this->valueTypes[$row['appid']][$row['configkey']] = (int)($row['type'] ?? 0); | $this->valueTypes[$row['appid']][$row['configkey']] = (int)($row['type'] ?? 0); | ||||
} | } | ||||
$result->closeCursor(); | $result->closeCursor(); |
* Class for accessing variables in the request. | * Class for accessing variables in the request. | ||||
* This class provides an immutable object with request variables. | * This class provides an immutable object with request variables. | ||||
* | * | ||||
* @property mixed[] cookies | |||||
* @property mixed[] env | |||||
* @property mixed[] files | |||||
* @property string method | |||||
* @property mixed[] parameters | |||||
* @property mixed[] server | |||||
* @property mixed[] $cookies | |||||
* @property mixed[] $env | |||||
* @property mixed[] $files | |||||
* @property string $method | |||||
* @property mixed[] $parameters | |||||
* @property mixed[] $server | |||||
* @template-implements \ArrayAccess<string,mixed> | * @template-implements \ArrayAccess<string,mixed> | ||||
*/ | */ | ||||
class Request implements \ArrayAccess, \Countable, IRequest { | class Request implements \ArrayAccess, \Countable, IRequest { |
/** | /** | ||||
* @deprecated 20.0.0 use \OCP\IContainer::registerService | * @deprecated 20.0.0 use \OCP\IContainer::registerService | ||||
*/ | */ | ||||
public function offsetSet($id, $service): void { | |||||
$this->container->offsetSet($id, $service); | |||||
public function offsetSet($offset, $value): void { | |||||
$this->container->offsetSet($offset, $value); | |||||
} | } | ||||
/** | /** |
*/ | */ | ||||
private $cachedHeaders = false; | private $cachedHeaders = false; | ||||
/** | |||||
* @var \Archive_Tar | |||||
*/ | |||||
private $tar = null; | |||||
private \Archive_Tar $tar; | |||||
/** | |||||
* @var string | |||||
*/ | |||||
private $path; | |||||
private string $path; | |||||
public function __construct(string $source) { | public function __construct(string $source) { | ||||
$types = [null, 'gz', 'bz2']; | $types = [null, 'gz', 'bz2']; | ||||
$tmp = \OC::$server->getTempManager()->getTemporaryFolder(); | $tmp = \OC::$server->getTempManager()->getTemporaryFolder(); | ||||
$this->tar->extract($tmp); | $this->tar->extract($tmp); | ||||
rename($tmp . $source, $tmp . $dest); | rename($tmp . $source, $tmp . $dest); | ||||
$this->tar = null; | |||||
$this->tar->_close(); | |||||
unlink($this->path); | unlink($this->path); | ||||
$types = [null, 'gz', 'bz']; | $types = [null, 'gz', 'bz']; | ||||
$this->tar = new \Archive_Tar($this->path, $types[self::getTarType($this->path)]); | $this->tar = new \Archive_Tar($this->path, $types[self::getTarType($this->path)]); | ||||
* get all files in the archive | * get all files in the archive | ||||
*/ | */ | ||||
public function getFiles(): array { | public function getFiles(): array { | ||||
if ($this->fileList) { | |||||
if ($this->fileList !== false) { | |||||
return $this->fileList; | return $this->fileList; | ||||
} | } | ||||
if (!$this->cachedHeaders) { | |||||
$this->cachedHeaders = $this->tar->listContent(); | |||||
if ($this->cachedHeaders === false) { | |||||
$headers = $this->tar->listContent(); | |||||
if (is_array($headers)) { | |||||
$this->cachedHeaders = $headers; | |||||
} else { | |||||
return []; | |||||
} | |||||
} | } | ||||
$files = []; | $files = []; | ||||
foreach ($this->cachedHeaders as $header) { | foreach ($this->cachedHeaders as $header) { | ||||
*/ | */ | ||||
public function getFile(string $path) { | public function getFile(string $path) { | ||||
$string = $this->tar->extractInString($path); | $string = $this->tar->extractInString($path); | ||||
/** @var ?string $string */ | |||||
if (is_string($string)) { | if (is_string($string)) { | ||||
return $string; | return $string; | ||||
} else { | } else { | ||||
$tmp = \OC::$server->getTempManager()->getTemporaryFolder(); | $tmp = \OC::$server->getTempManager()->getTemporaryFolder(); | ||||
$this->tar->extract($tmp); | $this->tar->extract($tmp); | ||||
\OCP\Files::rmdirr($tmp . $path); | \OCP\Files::rmdirr($tmp . $path); | ||||
$this->tar = null; | |||||
unlink($this->path); | unlink($this->path); | ||||
$this->reopen(); | $this->reopen(); | ||||
$this->tar->createModify([$tmp], '', $tmp); | $this->tar->createModify([$tmp], '', $tmp); | ||||
* reopen the archive to ensure everything is written | * reopen the archive to ensure everything is written | ||||
*/ | */ | ||||
private function reopen(): void { | private function reopen(): void { | ||||
if ($this->tar) { | |||||
$this->tar->_close(); | |||||
$this->tar = null; | |||||
} | |||||
$this->tar->_close(); | |||||
$types = [null, 'gz', 'bz']; | $types = [null, 'gz', 'bz']; | ||||
$this->tar = new \Archive_Tar($this->path, $types[self::getTarType($this->path)]); | $this->tar = new \Archive_Tar($this->path, $types[self::getTarType($this->path)]); | ||||
} | } | ||||
* Get error object from archive_tar. | * Get error object from archive_tar. | ||||
*/ | */ | ||||
public function getError(): ?\PEAR_Error { | public function getError(): ?\PEAR_Error { | ||||
if ($this->tar instanceof \Archive_Tar && $this->tar->error_object instanceof \PEAR_Error) { | |||||
if ($this->tar->error_object instanceof \PEAR_Error) { | |||||
return $this->tar->error_object; | return $this->tar->error_object; | ||||
} | } | ||||
return null; | return null; |
* | * | ||||
* @return $this This QueryBuilder instance. | * @return $this This QueryBuilder instance. | ||||
*/ | */ | ||||
public function addGroupBy(...$groupBys) { | |||||
if (count($groupBys) === 1 && is_array($groupBys[0])) { | |||||
$$groupBys = $groupBys[0]; | |||||
} | |||||
public function addGroupBy(...$groupBy) { | |||||
call_user_func_array( | call_user_func_array( | ||||
[$this->queryBuilder, 'addGroupBy'], | [$this->queryBuilder, 'addGroupBy'], | ||||
$this->helper->quoteColumnNames($groupBys) | |||||
$this->helper->quoteColumnNames($groupBy) | |||||
); | ); | ||||
return $this; | return $this; |
} | } | ||||
/** | /** | ||||
* @param $userId | |||||
* @param $fileId | |||||
* @param null $filePath | |||||
* @return Node | |||||
* @param string $userId | |||||
* @param int $fileId | |||||
* @param ?string $filePath | |||||
* @throws NotFoundException | * @throws NotFoundException | ||||
*/ | */ | ||||
public function getFileForToken($userId, $fileId, $filePath = null): Node { | public function getFileForToken($userId, $fileId, $filePath = null): Node { |
$realPath = realpath($pathToResolve); | $realPath = realpath($pathToResolve); | ||||
while ($realPath === false) { // for non existing files check the parent directory | while ($realPath === false) { // for non existing files check the parent directory | ||||
$currentPath = dirname($currentPath); | $currentPath = dirname($currentPath); | ||||
/** @psalm-suppress TypeDoesNotContainType Let's be extra cautious and still check for empty string */ | |||||
if ($currentPath === '' || $currentPath === '.') { | if ($currentPath === '' || $currentPath === '.') { | ||||
return $fullPath; | return $fullPath; | ||||
} | } |
private const CUSTOM_MIMETYPEMAPPING = 'mimetypemapping.json'; | private const CUSTOM_MIMETYPEMAPPING = 'mimetypemapping.json'; | ||||
private const CUSTOM_MIMETYPEALIASES = 'mimetypealiases.json'; | private const CUSTOM_MIMETYPEALIASES = 'mimetypealiases.json'; | ||||
protected $mimetypes = []; | |||||
protected $secureMimeTypes = []; | |||||
protected $mimetypeIcons = []; | |||||
/** @var string[] */ | |||||
protected $mimeTypeAlias = []; | |||||
/** @var IURLGenerator */ | |||||
private $urlGenerator; | |||||
private LoggerInterface $logger; | |||||
/** @var string */ | |||||
private $customConfigDir; | |||||
/** @var string */ | |||||
private $defaultConfigDir; | |||||
public function __construct(IURLGenerator $urlGenerator, | |||||
LoggerInterface $logger, | |||||
string $customConfigDir, | |||||
string $defaultConfigDir) { | |||||
$this->urlGenerator = $urlGenerator; | |||||
$this->logger = $logger; | |||||
$this->customConfigDir = $customConfigDir; | |||||
$this->defaultConfigDir = $defaultConfigDir; | |||||
protected array $mimetypes = []; | |||||
protected array $secureMimeTypes = []; | |||||
protected array $mimetypeIcons = []; | |||||
/** @var array<string,string> */ | |||||
protected array $mimeTypeAlias = []; | |||||
public function __construct( | |||||
private IURLGenerator $urlGenerator, | |||||
private LoggerInterface $logger, | |||||
private string $customConfigDir, | |||||
private string $defaultConfigDir, | |||||
) { | |||||
} | } | ||||
/** | /** | ||||
} | } | ||||
/** | /** | ||||
* @return string[] | |||||
* @return array<string,string> | |||||
*/ | */ | ||||
public function getAllAliases(): array { | public function getAllAliases(): array { | ||||
$this->loadAliases(); | $this->loadAliases(); |
$this->logger = $logger; | $this->logger = $logger; | ||||
$this->displayNameCache = new DisplayNameCache($cacheFactory, $this); | $this->displayNameCache = new DisplayNameCache($cacheFactory, $this); | ||||
$cachedGroups = &$this->cachedGroups; | |||||
$cachedUserGroups = &$this->cachedUserGroups; | |||||
$this->listen('\OC\Group', 'postDelete', function ($group) use (&$cachedGroups, &$cachedUserGroups) { | |||||
/** | |||||
* @var \OC\Group\Group $group | |||||
*/ | |||||
unset($cachedGroups[$group->getGID()]); | |||||
$cachedUserGroups = []; | |||||
$this->listen('\OC\Group', 'postDelete', function (IGroup $group): void { | |||||
unset($this->cachedGroups[$group->getGID()]); | |||||
$this->cachedUserGroups = []; | |||||
}); | }); | ||||
$this->listen('\OC\Group', 'postAddUser', function ($group) use (&$cachedUserGroups) { | |||||
/** | |||||
* @var \OC\Group\Group $group | |||||
*/ | |||||
$cachedUserGroups = []; | |||||
$this->listen('\OC\Group', 'postAddUser', function (IGroup $group): void { | |||||
$this->cachedUserGroups = []; | |||||
}); | }); | ||||
$this->listen('\OC\Group', 'postRemoveUser', function ($group) use (&$cachedUserGroups) { | |||||
/** | |||||
* @var \OC\Group\Group $group | |||||
*/ | |||||
$cachedUserGroups = []; | |||||
$this->listen('\OC\Group', 'postRemoveUser', function (IGroup $group): void { | |||||
$this->cachedUserGroups = []; | |||||
}); | }); | ||||
} | } | ||||
$aliases = $this->mimetypeDetector->getAllAliases(); | $aliases = $this->mimetypeDetector->getAllAliases(); | ||||
// Remove comments | // Remove comments | ||||
$aliases = array_filter($aliases, static function ($key) { | |||||
$aliases = array_filter($aliases, static function (string $key) { | |||||
return !($key === '' || $key[0] === '_'); | return !($key === '' || $key[0] === '_'); | ||||
}, ARRAY_FILTER_USE_KEY); | }, ARRAY_FILTER_USE_KEY); | ||||
/** @var string */ | /** @var string */ | ||||
private $label = ''; | private $label = ''; | ||||
/** @var IRootFolder */ | |||||
private $rootFolder; | |||||
/** @var IUserManager */ | |||||
private $userManager; | |||||
/** @var ICacheEntry|null */ | /** @var ICacheEntry|null */ | ||||
private $nodeCacheEntry; | private $nodeCacheEntry; | ||||
/** @var bool */ | /** @var bool */ | ||||
private $hideDownload = false; | private $hideDownload = false; | ||||
public function __construct(IRootFolder $rootFolder, IUserManager $userManager) { | |||||
$this->rootFolder = $rootFolder; | |||||
$this->userManager = $userManager; | |||||
public function __construct( | |||||
private IRootFolder $rootFolder, | |||||
private IUserManager $userManager, | |||||
) { | |||||
} | } | ||||
/** | /** | ||||
* @inheritdoc | * @inheritdoc | ||||
*/ | */ | ||||
public function setId($id) { | public function setId($id) { | ||||
/** @var mixed $id Let's be safe until strong typing */ | |||||
if (is_int($id)) { | if (is_int($id)) { | ||||
$id = (string)$id; | $id = (string)$id; | ||||
} | } | ||||
/** | /** | ||||
* Set the parent of this share | * Set the parent of this share | ||||
* | * | ||||
* @param int parent | |||||
* @param int $parent | |||||
* @return IShare | * @return IShare | ||||
* @deprecated The new shares do not have parents. This is just here for legacy reasons. | * @deprecated The new shares do not have parents. This is just here for legacy reasons. | ||||
*/ | */ |
/** | /** | ||||
* @var \OCP\UserInterface[] $backends | * @var \OCP\UserInterface[] $backends | ||||
*/ | */ | ||||
private $backends = []; | |||||
private array $backends = []; | |||||
/** | /** | ||||
* @var \OC\User\User[] $cachedUsers | |||||
* @var array<string,\OC\User\User> $cachedUsers | |||||
*/ | */ | ||||
private $cachedUsers = []; | |||||
private array $cachedUsers = []; | |||||
/** @var IConfig */ | |||||
private $config; | |||||
/** @var ICache */ | |||||
private $cache; | |||||
/** @var IEventDispatcher */ | |||||
private $eventDispatcher; | |||||
private ICache $cache; | |||||
private DisplayNameCache $displayNameCache; | private DisplayNameCache $displayNameCache; | ||||
public function __construct(IConfig $config, | |||||
public function __construct( | |||||
private IConfig $config, | |||||
ICacheFactory $cacheFactory, | ICacheFactory $cacheFactory, | ||||
IEventDispatcher $eventDispatcher) { | |||||
$this->config = $config; | |||||
private IEventDispatcher $eventDispatcher, | |||||
) { | |||||
$this->cache = new WithLocalCache($cacheFactory->createDistributed('user_backend_map')); | $this->cache = new WithLocalCache($cacheFactory->createDistributed('user_backend_map')); | ||||
$cachedUsers = &$this->cachedUsers; | |||||
$this->listen('\OC\User', 'postDelete', function ($user) use (&$cachedUsers) { | |||||
/** @var \OC\User\User $user */ | |||||
unset($cachedUsers[$user->getUID()]); | |||||
$this->listen('\OC\User', 'postDelete', function (IUser $user): void { | |||||
unset($this->cachedUsers[$user->getUID()]); | |||||
}); | }); | ||||
$this->eventDispatcher = $eventDispatcher; | |||||
$this->displayNameCache = new DisplayNameCache($cacheFactory, $this); | $this->displayNameCache = new DisplayNameCache($cacheFactory, $this); | ||||
} | } | ||||
* return the content of a file or return a zip file containing multiple files | * return the content of a file or return a zip file containing multiple files | ||||
* | * | ||||
* @param string $dir | * @param string $dir | ||||
* @param string $files ; separated list of files to download | |||||
* @param string|array $files ; separated list of files to download | |||||
* @param array $params ; 'head' boolean to only send header of the request ; 'range' http range header | * @param array $params ; 'head' boolean to only send header of the request ; 'range' http range header | ||||
*/ | */ | ||||
public static function get($dir, $files, $params = null) { | public static function get($dir, $files, $params = null) { |
$bytes = (float)$str; | $bytes = (float)$str; | ||||
if (preg_match('#([kmgtp]?b?)$#si', $str, $matches) && !empty($bytes_array[$matches[1]])) { | |||||
if (preg_match('#([kmgtp]?b?)$#si', $str, $matches) && isset($bytes_array[$matches[1]])) { | |||||
$bytes *= $bytes_array[$matches[1]]; | $bytes *= $bytes_array[$matches[1]]; | ||||
} else { | } else { | ||||
return false; | return false; |
public function mimeTypeIcon($mimeType); | public function mimeTypeIcon($mimeType); | ||||
/** | /** | ||||
* @return string[] | |||||
* @return array<string,string> | |||||
* @since 28.0.0 | * @since 28.0.0 | ||||
*/ | */ | ||||
public function getAllAliases(): array; | public function getAllAliases(): array; |
* Set the cache entry for the shared node | * Set the cache entry for the shared node | ||||
* | * | ||||
* @param ICacheEntry $entry | * @param ICacheEntry $entry | ||||
* @return void | |||||
* @since 11.0.0 | * @since 11.0.0 | ||||
*/ | */ | ||||
public function setNodeCacheEntry(ICacheEntry $entry); | public function setNodeCacheEntry(ICacheEntry $entry); |
"packages": [ | "packages": [ | ||||
{ | { | ||||
"name": "amphp/amp", | "name": "amphp/amp", | ||||
"version": "v2.6.2", | |||||
"version": "v2.6.4", | |||||
"source": { | "source": { | ||||
"type": "git", | "type": "git", | ||||
"url": "https://github.com/amphp/amp.git", | "url": "https://github.com/amphp/amp.git", | ||||
"reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb" | |||||
"reference": "ded3d9be08f526089eb7ee8d9f16a9768f9dec2d" | |||||
}, | }, | ||||
"dist": { | "dist": { | ||||
"type": "zip", | "type": "zip", | ||||
"url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", | |||||
"reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", | |||||
"url": "https://api.github.com/repos/amphp/amp/zipball/ded3d9be08f526089eb7ee8d9f16a9768f9dec2d", | |||||
"reference": "ded3d9be08f526089eb7ee8d9f16a9768f9dec2d", | |||||
"shasum": "" | "shasum": "" | ||||
}, | }, | ||||
"require": { | "require": { | ||||
"ext-json": "*", | "ext-json": "*", | ||||
"jetbrains/phpstorm-stubs": "^2019.3", | "jetbrains/phpstorm-stubs": "^2019.3", | ||||
"phpunit/phpunit": "^7 | ^8 | ^9", | "phpunit/phpunit": "^7 | ^8 | ^9", | ||||
"psalm/phar": "^3.11@dev", | |||||
"react/promise": "^2" | |||||
"react/promise": "^2", | |||||
"vimeo/psalm": "^3.12" | |||||
}, | }, | ||||
"type": "library", | "type": "library", | ||||
"extra": { | "extra": { | ||||
"support": { | "support": { | ||||
"irc": "irc://irc.freenode.org/amphp", | "irc": "irc://irc.freenode.org/amphp", | ||||
"issues": "https://github.com/amphp/amp/issues", | "issues": "https://github.com/amphp/amp/issues", | ||||
"source": "https://github.com/amphp/amp/tree/v2.6.2" | |||||
"source": "https://github.com/amphp/amp/tree/v2.6.4" | |||||
}, | }, | ||||
"funding": [ | "funding": [ | ||||
{ | { | ||||
"type": "github" | "type": "github" | ||||
} | } | ||||
], | ], | ||||
"time": "2022-02-20T17:52:18+00:00" | |||||
"time": "2024-03-21T18:52:26+00:00" | |||||
}, | }, | ||||
{ | { | ||||
"name": "amphp/byte-stream", | "name": "amphp/byte-stream", | ||||
}, | }, | ||||
{ | { | ||||
"name": "composer/pcre", | "name": "composer/pcre", | ||||
"version": "3.0.2", | |||||
"version": "3.1.3", | |||||
"source": { | "source": { | ||||
"type": "git", | "type": "git", | ||||
"url": "https://github.com/composer/pcre.git", | "url": "https://github.com/composer/pcre.git", | ||||
"reference": "4482b6409ca6bfc2af043a5711cd21ac3e7a8dfb" | |||||
"reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8" | |||||
}, | }, | ||||
"dist": { | "dist": { | ||||
"type": "zip", | "type": "zip", | ||||
"url": "https://api.github.com/repos/composer/pcre/zipball/4482b6409ca6bfc2af043a5711cd21ac3e7a8dfb", | |||||
"reference": "4482b6409ca6bfc2af043a5711cd21ac3e7a8dfb", | |||||
"url": "https://api.github.com/repos/composer/pcre/zipball/5b16e25a5355f1f3afdfc2f954a0a80aec4826a8", | |||||
"reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8", | |||||
"shasum": "" | "shasum": "" | ||||
}, | }, | ||||
"require": { | "require": { | ||||
], | ], | ||||
"support": { | "support": { | ||||
"issues": "https://github.com/composer/pcre/issues", | "issues": "https://github.com/composer/pcre/issues", | ||||
"source": "https://github.com/composer/pcre/tree/3.0.2" | |||||
"source": "https://github.com/composer/pcre/tree/3.1.3" | |||||
}, | }, | ||||
"funding": [ | "funding": [ | ||||
{ | { | ||||
"type": "tidelift" | "type": "tidelift" | ||||
} | } | ||||
], | ], | ||||
"time": "2022-11-03T20:24:16+00:00" | |||||
"time": "2024-03-19T10:26:25+00:00" | |||||
}, | }, | ||||
{ | { | ||||
"name": "composer/semver", | "name": "composer/semver", | ||||
"version": "3.3.2", | |||||
"version": "3.4.0", | |||||
"source": { | "source": { | ||||
"type": "git", | "type": "git", | ||||
"url": "https://github.com/composer/semver.git", | "url": "https://github.com/composer/semver.git", | ||||
"reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" | |||||
"reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" | |||||
}, | }, | ||||
"dist": { | "dist": { | ||||
"type": "zip", | "type": "zip", | ||||
"url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", | |||||
"reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", | |||||
"url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", | |||||
"reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", | |||||
"shasum": "" | "shasum": "" | ||||
}, | }, | ||||
"require": { | "require": { | ||||
"versioning" | "versioning" | ||||
], | ], | ||||
"support": { | "support": { | ||||
"irc": "irc://irc.freenode.org/composer", | |||||
"irc": "ircs://irc.libera.chat:6697/composer", | |||||
"issues": "https://github.com/composer/semver/issues", | "issues": "https://github.com/composer/semver/issues", | ||||
"source": "https://github.com/composer/semver/tree/3.3.2" | |||||
"source": "https://github.com/composer/semver/tree/3.4.0" | |||||
}, | }, | ||||
"funding": [ | "funding": [ | ||||
{ | { | ||||
"type": "tidelift" | "type": "tidelift" | ||||
} | } | ||||
], | ], | ||||
"time": "2022-04-01T19:23:25+00:00" | |||||
"time": "2023-08-31T09:50:34+00:00" | |||||
}, | }, | ||||
{ | { | ||||
"name": "composer/xdebug-handler", | "name": "composer/xdebug-handler", | ||||
"version": "3.0.3", | |||||
"version": "3.0.4", | |||||
"source": { | "source": { | ||||
"type": "git", | "type": "git", | ||||
"url": "https://github.com/composer/xdebug-handler.git", | "url": "https://github.com/composer/xdebug-handler.git", | ||||
"reference": "ced299686f41dce890debac69273b47ffe98a40c" | |||||
"reference": "4f988f8fdf580d53bdb2d1278fe93d1ed5462255" | |||||
}, | }, | ||||
"dist": { | "dist": { | ||||
"type": "zip", | "type": "zip", | ||||
"url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", | |||||
"reference": "ced299686f41dce890debac69273b47ffe98a40c", | |||||
"url": "https://api.github.com/repos/composer/xdebug-handler/zipball/4f988f8fdf580d53bdb2d1278fe93d1ed5462255", | |||||
"reference": "4f988f8fdf580d53bdb2d1278fe93d1ed5462255", | |||||
"shasum": "" | "shasum": "" | ||||
}, | }, | ||||
"require": { | "require": { | ||||
"require-dev": { | "require-dev": { | ||||
"phpstan/phpstan": "^1.0", | "phpstan/phpstan": "^1.0", | ||||
"phpstan/phpstan-strict-rules": "^1.1", | "phpstan/phpstan-strict-rules": "^1.1", | ||||
"symfony/phpunit-bridge": "^6.0" | |||||
"phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" | |||||
}, | }, | ||||
"type": "library", | "type": "library", | ||||
"autoload": { | "autoload": { | ||||
"performance" | "performance" | ||||
], | ], | ||||
"support": { | "support": { | ||||
"irc": "irc://irc.freenode.org/composer", | |||||
"irc": "ircs://irc.libera.chat:6697/composer", | |||||
"issues": "https://github.com/composer/xdebug-handler/issues", | "issues": "https://github.com/composer/xdebug-handler/issues", | ||||
"source": "https://github.com/composer/xdebug-handler/tree/3.0.3" | |||||
"source": "https://github.com/composer/xdebug-handler/tree/3.0.4" | |||||
}, | }, | ||||
"funding": [ | "funding": [ | ||||
{ | { | ||||
"type": "tidelift" | "type": "tidelift" | ||||
} | } | ||||
], | ], | ||||
"time": "2022-02-25T21:32:43+00:00" | |||||
"time": "2024-03-26T18:29:49+00:00" | |||||
}, | }, | ||||
{ | { | ||||
"name": "dnoegel/php-xdg-base-dir", | "name": "dnoegel/php-xdg-base-dir", | ||||
}, | }, | ||||
"time": "2019-12-04T15:06:13+00:00" | "time": "2019-12-04T15:06:13+00:00" | ||||
}, | }, | ||||
{ | |||||
"name": "doctrine/deprecations", | |||||
"version": "1.1.3", | |||||
"source": { | |||||
"type": "git", | |||||
"url": "https://github.com/doctrine/deprecations.git", | |||||
"reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" | |||||
}, | |||||
"dist": { | |||||
"type": "zip", | |||||
"url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", | |||||
"reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", | |||||
"shasum": "" | |||||
}, | |||||
"require": { | |||||
"php": "^7.1 || ^8.0" | |||||
}, | |||||
"require-dev": { | |||||
"doctrine/coding-standard": "^9", | |||||
"phpstan/phpstan": "1.4.10 || 1.10.15", | |||||
"phpstan/phpstan-phpunit": "^1.0", | |||||
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", | |||||
"psalm/plugin-phpunit": "0.18.4", | |||||
"psr/log": "^1 || ^2 || ^3", | |||||
"vimeo/psalm": "4.30.0 || 5.12.0" | |||||
}, | |||||
"suggest": { | |||||
"psr/log": "Allows logging deprecations via PSR-3 logger implementation" | |||||
}, | |||||
"type": "library", | |||||
"autoload": { | |||||
"psr-4": { | |||||
"Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" | |||||
} | |||||
}, | |||||
"notification-url": "https://packagist.org/downloads/", | |||||
"license": [ | |||||
"MIT" | |||||
], | |||||
"description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", | |||||
"homepage": "https://www.doctrine-project.org/", | |||||
"support": { | |||||
"issues": "https://github.com/doctrine/deprecations/issues", | |||||
"source": "https://github.com/doctrine/deprecations/tree/1.1.3" | |||||
}, | |||||
"time": "2024-01-30T19:34:25+00:00" | |||||
}, | |||||
{ | { | ||||
"name": "felixfbecker/advanced-json-rpc", | "name": "felixfbecker/advanced-json-rpc", | ||||
"version": "v3.2.1", | "version": "v3.2.1", | ||||
}, | }, | ||||
{ | { | ||||
"name": "fidry/cpu-core-counter", | "name": "fidry/cpu-core-counter", | ||||
"version": "0.5.1", | |||||
"version": "1.1.0", | |||||
"source": { | "source": { | ||||
"type": "git", | "type": "git", | ||||
"url": "https://github.com/theofidry/cpu-core-counter.git", | "url": "https://github.com/theofidry/cpu-core-counter.git", | ||||
"reference": "b58e5a3933e541dc286cc91fc4f3898bbc6f1623" | |||||
"reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42" | |||||
}, | }, | ||||
"dist": { | "dist": { | ||||
"type": "zip", | "type": "zip", | ||||
"url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/b58e5a3933e541dc286cc91fc4f3898bbc6f1623", | |||||
"reference": "b58e5a3933e541dc286cc91fc4f3898bbc6f1623", | |||||
"url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/f92996c4d5c1a696a6a970e20f7c4216200fcc42", | |||||
"reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42", | |||||
"shasum": "" | "shasum": "" | ||||
}, | }, | ||||
"require": { | "require": { | ||||
}, | }, | ||||
"require-dev": { | "require-dev": { | ||||
"fidry/makefile": "^0.2.0", | "fidry/makefile": "^0.2.0", | ||||
"fidry/php-cs-fixer-config": "^1.1.2", | |||||
"phpstan/extension-installer": "^1.2.0", | "phpstan/extension-installer": "^1.2.0", | ||||
"phpstan/phpstan": "^1.9.2", | "phpstan/phpstan": "^1.9.2", | ||||
"phpstan/phpstan-deprecation-rules": "^1.0.0", | "phpstan/phpstan-deprecation-rules": "^1.0.0", | ||||
"phpstan/phpstan-phpunit": "^1.2.2", | "phpstan/phpstan-phpunit": "^1.2.2", | ||||
"phpstan/phpstan-strict-rules": "^1.4.4", | "phpstan/phpstan-strict-rules": "^1.4.4", | ||||
"phpunit/phpunit": "^9.5.26 || ^8.5.31", | |||||
"theofidry/php-cs-fixer-config": "^1.0", | |||||
"phpunit/phpunit": "^8.5.31 || ^9.5.26", | |||||
"webmozarts/strict-phpunit": "^7.5" | "webmozarts/strict-phpunit": "^7.5" | ||||
}, | }, | ||||
"type": "library", | "type": "library", | ||||
], | ], | ||||
"support": { | "support": { | ||||
"issues": "https://github.com/theofidry/cpu-core-counter/issues", | "issues": "https://github.com/theofidry/cpu-core-counter/issues", | ||||
"source": "https://github.com/theofidry/cpu-core-counter/tree/0.5.1" | |||||
"source": "https://github.com/theofidry/cpu-core-counter/tree/1.1.0" | |||||
}, | }, | ||||
"funding": [ | "funding": [ | ||||
{ | { | ||||
"type": "github" | "type": "github" | ||||
} | } | ||||
], | ], | ||||
"time": "2022-12-24T12:35:10+00:00" | |||||
"time": "2024-02-07T09:43:46+00:00" | |||||
}, | }, | ||||
{ | { | ||||
"name": "netresearch/jsonmapper", | "name": "netresearch/jsonmapper", | ||||
"version": "v4.0.0", | |||||
"version": "v4.4.1", | |||||
"source": { | "source": { | ||||
"type": "git", | "type": "git", | ||||
"url": "https://github.com/cweiske/jsonmapper.git", | "url": "https://github.com/cweiske/jsonmapper.git", | ||||
"reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d" | |||||
"reference": "132c75c7dd83e45353ebb9c6c9f591952995bbf0" | |||||
}, | }, | ||||
"dist": { | "dist": { | ||||
"type": "zip", | "type": "zip", | ||||
"url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", | |||||
"reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d", | |||||
"url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/132c75c7dd83e45353ebb9c6c9f591952995bbf0", | |||||
"reference": "132c75c7dd83e45353ebb9c6c9f591952995bbf0", | |||||
"shasum": "" | "shasum": "" | ||||
}, | }, | ||||
"require": { | "require": { | ||||
"php": ">=7.1" | "php": ">=7.1" | ||||
}, | }, | ||||
"require-dev": { | "require-dev": { | ||||
"phpunit/phpunit": "~7.5 || ~8.0 || ~9.0", | |||||
"phpunit/phpunit": "~7.5 || ~8.0 || ~9.0 || ~10.0", | |||||
"squizlabs/php_codesniffer": "~3.5" | "squizlabs/php_codesniffer": "~3.5" | ||||
}, | }, | ||||
"type": "library", | "type": "library", | ||||
"support": { | "support": { | ||||
"email": "cweiske@cweiske.de", | "email": "cweiske@cweiske.de", | ||||
"issues": "https://github.com/cweiske/jsonmapper/issues", | "issues": "https://github.com/cweiske/jsonmapper/issues", | ||||
"source": "https://github.com/cweiske/jsonmapper/tree/v4.0.0" | |||||
"source": "https://github.com/cweiske/jsonmapper/tree/v4.4.1" | |||||
}, | }, | ||||
"time": "2020-12-01T19:48:11+00:00" | |||||
"time": "2024-01-31T06:18:54+00:00" | |||||
}, | }, | ||||
{ | { | ||||
"name": "nikic/php-parser", | "name": "nikic/php-parser", | ||||
"version": "v4.15.1", | |||||
"version": "v4.19.1", | |||||
"source": { | "source": { | ||||
"type": "git", | "type": "git", | ||||
"url": "https://github.com/nikic/PHP-Parser.git", | "url": "https://github.com/nikic/PHP-Parser.git", | ||||
"reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900" | |||||
"reference": "4e1b88d21c69391150ace211e9eaf05810858d0b" | |||||
}, | }, | ||||
"dist": { | "dist": { | ||||
"type": "zip", | "type": "zip", | ||||
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", | |||||
"reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", | |||||
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4e1b88d21c69391150ace211e9eaf05810858d0b", | |||||
"reference": "4e1b88d21c69391150ace211e9eaf05810858d0b", | |||||
"shasum": "" | "shasum": "" | ||||
}, | }, | ||||
"require": { | "require": { | ||||
"ext-tokenizer": "*", | "ext-tokenizer": "*", | ||||
"php": ">=7.0" | |||||
"php": ">=7.1" | |||||
}, | }, | ||||
"require-dev": { | "require-dev": { | ||||
"ircmaxell/php-yacc": "^0.0.7", | "ircmaxell/php-yacc": "^0.0.7", | ||||
], | ], | ||||
"support": { | "support": { | ||||
"issues": "https://github.com/nikic/PHP-Parser/issues", | "issues": "https://github.com/nikic/PHP-Parser/issues", | ||||
"source": "https://github.com/nikic/PHP-Parser/tree/v4.15.1" | |||||
"source": "https://github.com/nikic/PHP-Parser/tree/v4.19.1" | |||||
}, | }, | ||||
"time": "2022-09-04T07:30:47+00:00" | |||||
"time": "2024-03-17T08:10:35+00:00" | |||||
}, | }, | ||||
{ | { | ||||
"name": "phpdocumentor/reflection-common", | "name": "phpdocumentor/reflection-common", | ||||
}, | }, | ||||
{ | { | ||||
"name": "phpdocumentor/type-resolver", | "name": "phpdocumentor/type-resolver", | ||||
"version": "1.6.2", | |||||
"version": "1.8.2", | |||||
"source": { | "source": { | ||||
"type": "git", | "type": "git", | ||||
"url": "https://github.com/phpDocumentor/TypeResolver.git", | "url": "https://github.com/phpDocumentor/TypeResolver.git", | ||||
"reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d" | |||||
"reference": "153ae662783729388a584b4361f2545e4d841e3c" | |||||
}, | }, | ||||
"dist": { | "dist": { | ||||
"type": "zip", | "type": "zip", | ||||
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/48f445a408c131e38cab1c235aa6d2bb7a0bb20d", | |||||
"reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d", | |||||
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", | |||||
"reference": "153ae662783729388a584b4361f2545e4d841e3c", | |||||
"shasum": "" | "shasum": "" | ||||
}, | }, | ||||
"require": { | "require": { | ||||
"php": "^7.4 || ^8.0", | |||||
"phpdocumentor/reflection-common": "^2.0" | |||||
"doctrine/deprecations": "^1.0", | |||||
"php": "^7.3 || ^8.0", | |||||
"phpdocumentor/reflection-common": "^2.0", | |||||
"phpstan/phpdoc-parser": "^1.13" | |||||
}, | }, | ||||
"require-dev": { | "require-dev": { | ||||
"ext-tokenizer": "*", | "ext-tokenizer": "*", | ||||
"phpbench/phpbench": "^1.2", | |||||
"phpstan/extension-installer": "^1.1", | "phpstan/extension-installer": "^1.1", | ||||
"phpstan/phpstan": "^1.8", | "phpstan/phpstan": "^1.8", | ||||
"phpstan/phpstan-phpunit": "^1.1", | "phpstan/phpstan-phpunit": "^1.1", | ||||
"description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", | "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", | ||||
"support": { | "support": { | ||||
"issues": "https://github.com/phpDocumentor/TypeResolver/issues", | "issues": "https://github.com/phpDocumentor/TypeResolver/issues", | ||||
"source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.2" | |||||
"source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.2" | |||||
}, | |||||
"time": "2024-02-23T11:10:43+00:00" | |||||
}, | |||||
{ | |||||
"name": "phpstan/phpdoc-parser", | |||||
"version": "1.27.0", | |||||
"source": { | |||||
"type": "git", | |||||
"url": "https://github.com/phpstan/phpdoc-parser.git", | |||||
"reference": "86e4d5a4b036f8f0be1464522f4c6b584c452757" | |||||
}, | |||||
"dist": { | |||||
"type": "zip", | |||||
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/86e4d5a4b036f8f0be1464522f4c6b584c452757", | |||||
"reference": "86e4d5a4b036f8f0be1464522f4c6b584c452757", | |||||
"shasum": "" | |||||
}, | |||||
"require": { | |||||
"php": "^7.2 || ^8.0" | |||||
}, | |||||
"require-dev": { | |||||
"doctrine/annotations": "^2.0", | |||||
"nikic/php-parser": "^4.15", | |||||
"php-parallel-lint/php-parallel-lint": "^1.2", | |||||
"phpstan/extension-installer": "^1.0", | |||||
"phpstan/phpstan": "^1.5", | |||||
"phpstan/phpstan-phpunit": "^1.1", | |||||
"phpstan/phpstan-strict-rules": "^1.0", | |||||
"phpunit/phpunit": "^9.5", | |||||
"symfony/process": "^5.2" | |||||
}, | }, | ||||
"time": "2022-10-14T12:47:21+00:00" | |||||
"type": "library", | |||||
"autoload": { | |||||
"psr-4": { | |||||
"PHPStan\\PhpDocParser\\": [ | |||||
"src/" | |||||
] | |||||
} | |||||
}, | |||||
"notification-url": "https://packagist.org/downloads/", | |||||
"license": [ | |||||
"MIT" | |||||
], | |||||
"description": "PHPDoc parser with support for nullable, intersection and generic types", | |||||
"support": { | |||||
"issues": "https://github.com/phpstan/phpdoc-parser/issues", | |||||
"source": "https://github.com/phpstan/phpdoc-parser/tree/1.27.0" | |||||
}, | |||||
"time": "2024-03-21T13:14:53+00:00" | |||||
}, | }, | ||||
{ | { | ||||
"name": "psr/container", | "name": "psr/container", | ||||
}, | }, | ||||
{ | { | ||||
"name": "sebastian/diff", | "name": "sebastian/diff", | ||||
"version": "4.0.4", | |||||
"version": "4.0.6", | |||||
"source": { | "source": { | ||||
"type": "git", | "type": "git", | ||||
"url": "https://github.com/sebastianbergmann/diff.git", | "url": "https://github.com/sebastianbergmann/diff.git", | ||||
"reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" | |||||
"reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" | |||||
}, | }, | ||||
"dist": { | "dist": { | ||||
"type": "zip", | "type": "zip", | ||||
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", | |||||
"reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", | |||||
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", | |||||
"reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", | |||||
"shasum": "" | "shasum": "" | ||||
}, | }, | ||||
"require": { | "require": { | ||||
], | ], | ||||
"support": { | "support": { | ||||
"issues": "https://github.com/sebastianbergmann/diff/issues", | "issues": "https://github.com/sebastianbergmann/diff/issues", | ||||
"source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" | |||||
"source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" | |||||
}, | }, | ||||
"funding": [ | "funding": [ | ||||
{ | { | ||||
"type": "github" | "type": "github" | ||||
} | } | ||||
], | ], | ||||
"time": "2020-10-26T13:10:38+00:00" | |||||
"time": "2024-03-02T06:30:58+00:00" | |||||
}, | }, | ||||
{ | { | ||||
"name": "spatie/array-to-xml", | "name": "spatie/array-to-xml", | ||||
"version": "3.1.5", | |||||
"version": "3.2.3", | |||||
"source": { | "source": { | ||||
"type": "git", | "type": "git", | ||||
"url": "https://github.com/spatie/array-to-xml.git", | "url": "https://github.com/spatie/array-to-xml.git", | ||||
"reference": "13f76acef5362d15c71ae1ac6350cc3df5e25e43" | |||||
"reference": "c95fd4db94ec199f798d4b5b4a81757bd20d88ab" | |||||
}, | }, | ||||
"dist": { | "dist": { | ||||
"type": "zip", | "type": "zip", | ||||
"url": "https://api.github.com/repos/spatie/array-to-xml/zipball/13f76acef5362d15c71ae1ac6350cc3df5e25e43", | |||||
"reference": "13f76acef5362d15c71ae1ac6350cc3df5e25e43", | |||||
"url": "https://api.github.com/repos/spatie/array-to-xml/zipball/c95fd4db94ec199f798d4b5b4a81757bd20d88ab", | |||||
"reference": "c95fd4db94ec199f798d4b5b4a81757bd20d88ab", | |||||
"shasum": "" | "shasum": "" | ||||
}, | }, | ||||
"require": { | "require": { | ||||
"xml" | "xml" | ||||
], | ], | ||||
"support": { | "support": { | ||||
"source": "https://github.com/spatie/array-to-xml/tree/3.1.5" | |||||
"source": "https://github.com/spatie/array-to-xml/tree/3.2.3" | |||||
}, | }, | ||||
"funding": [ | "funding": [ | ||||
{ | { | ||||
"type": "github" | "type": "github" | ||||
} | } | ||||
], | ], | ||||
"time": "2022-12-24T13:43:51+00:00" | |||||
"time": "2024-02-07T10:39:02+00:00" | |||||
}, | }, | ||||
{ | { | ||||
"name": "symfony/console", | "name": "symfony/console", | ||||
"version": "v5.4.15", | |||||
"version": "v5.4.36", | |||||
"source": { | "source": { | ||||
"type": "git", | "type": "git", | ||||
"url": "https://github.com/symfony/console.git", | "url": "https://github.com/symfony/console.git", | ||||
"reference": "ea59bb0edfaf9f28d18d8791410ee0355f317669" | |||||
"reference": "39f75d9d73d0c11952fdcecf4877b4d0f62a8f6e" | |||||
}, | }, | ||||
"dist": { | "dist": { | ||||
"type": "zip", | "type": "zip", | ||||
"url": "https://api.github.com/repos/symfony/console/zipball/ea59bb0edfaf9f28d18d8791410ee0355f317669", | |||||
"reference": "ea59bb0edfaf9f28d18d8791410ee0355f317669", | |||||
"url": "https://api.github.com/repos/symfony/console/zipball/39f75d9d73d0c11952fdcecf4877b4d0f62a8f6e", | |||||
"reference": "39f75d9d73d0c11952fdcecf4877b4d0f62a8f6e", | |||||
"shasum": "" | "shasum": "" | ||||
}, | }, | ||||
"require": { | "require": { | ||||
"homepage": "https://symfony.com", | "homepage": "https://symfony.com", | ||||
"keywords": [ | "keywords": [ | ||||
"cli", | "cli", | ||||
"command line", | |||||
"command-line", | |||||
"console", | "console", | ||||
"terminal" | "terminal" | ||||
], | ], | ||||
"support": { | "support": { | ||||
"source": "https://github.com/symfony/console/tree/v5.4.15" | |||||
"source": "https://github.com/symfony/console/tree/v5.4.36" | |||||
}, | }, | ||||
"funding": [ | "funding": [ | ||||
{ | { | ||||
"type": "tidelift" | "type": "tidelift" | ||||
} | } | ||||
], | ], | ||||
"time": "2022-10-26T21:41:52+00:00" | |||||
"time": "2024-02-20T16:33:57+00:00" | |||||
}, | }, | ||||
{ | { | ||||
"name": "symfony/deprecation-contracts", | "name": "symfony/deprecation-contracts", | ||||
}, | }, | ||||
{ | { | ||||
"name": "symfony/filesystem", | "name": "symfony/filesystem", | ||||
"version": "v5.4.21", | |||||
"version": "v5.4.35", | |||||
"source": { | "source": { | ||||
"type": "git", | "type": "git", | ||||
"url": "https://github.com/symfony/filesystem.git", | "url": "https://github.com/symfony/filesystem.git", | ||||
"reference": "e75960b1bbfd2b8c9e483e0d74811d555ca3de9f" | |||||
"reference": "5a553607d4ffbfa9c0ab62facadea296c9db7086" | |||||
}, | }, | ||||
"dist": { | "dist": { | ||||
"type": "zip", | "type": "zip", | ||||
"url": "https://api.github.com/repos/symfony/filesystem/zipball/e75960b1bbfd2b8c9e483e0d74811d555ca3de9f", | |||||
"reference": "e75960b1bbfd2b8c9e483e0d74811d555ca3de9f", | |||||
"url": "https://api.github.com/repos/symfony/filesystem/zipball/5a553607d4ffbfa9c0ab62facadea296c9db7086", | |||||
"reference": "5a553607d4ffbfa9c0ab62facadea296c9db7086", | |||||
"shasum": "" | "shasum": "" | ||||
}, | }, | ||||
"require": { | "require": { | ||||
"description": "Provides basic utilities for the filesystem", | "description": "Provides basic utilities for the filesystem", | ||||
"homepage": "https://symfony.com", | "homepage": "https://symfony.com", | ||||
"support": { | "support": { | ||||
"source": "https://github.com/symfony/filesystem/tree/v5.4.21" | |||||
"source": "https://github.com/symfony/filesystem/tree/v5.4.35" | |||||
}, | }, | ||||
"funding": [ | "funding": [ | ||||
{ | { | ||||
"type": "tidelift" | "type": "tidelift" | ||||
} | } | ||||
], | ], | ||||
"time": "2023-02-14T08:03:56+00:00" | |||||
"time": "2024-01-23T13:51:25+00:00" | |||||
}, | }, | ||||
{ | { | ||||
"name": "symfony/polyfill-ctype", | "name": "symfony/polyfill-ctype", | ||||
"version": "v1.26.0", | |||||
"version": "v1.29.0", | |||||
"source": { | "source": { | ||||
"type": "git", | "type": "git", | ||||
"url": "https://github.com/symfony/polyfill-ctype.git", | "url": "https://github.com/symfony/polyfill-ctype.git", | ||||
"reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" | |||||
"reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" | |||||
}, | }, | ||||
"dist": { | "dist": { | ||||
"type": "zip", | "type": "zip", | ||||
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", | |||||
"reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", | |||||
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", | |||||
"reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", | |||||
"shasum": "" | "shasum": "" | ||||
}, | }, | ||||
"require": { | "require": { | ||||
}, | }, | ||||
"type": "library", | "type": "library", | ||||
"extra": { | "extra": { | ||||
"branch-alias": { | |||||
"dev-main": "1.26-dev" | |||||
}, | |||||
"thanks": { | "thanks": { | ||||
"name": "symfony/polyfill", | "name": "symfony/polyfill", | ||||
"url": "https://github.com/symfony/polyfill" | "url": "https://github.com/symfony/polyfill" | ||||
"portable" | "portable" | ||||
], | ], | ||||
"support": { | "support": { | ||||
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" | |||||
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" | |||||
}, | }, | ||||
"funding": [ | "funding": [ | ||||
{ | { | ||||
"type": "tidelift" | "type": "tidelift" | ||||
} | } | ||||
], | ], | ||||
"time": "2022-05-24T11:49:31+00:00" | |||||
"time": "2024-01-29T20:11:03+00:00" | |||||
}, | }, | ||||
{ | { | ||||
"name": "symfony/polyfill-intl-grapheme", | "name": "symfony/polyfill-intl-grapheme", | ||||
"version": "v1.26.0", | |||||
"version": "v1.29.0", | |||||
"source": { | "source": { | ||||
"type": "git", | "type": "git", | ||||
"url": "https://github.com/symfony/polyfill-intl-grapheme.git", | "url": "https://github.com/symfony/polyfill-intl-grapheme.git", | ||||
"reference": "433d05519ce6990bf3530fba6957499d327395c2" | |||||
"reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" | |||||
}, | }, | ||||
"dist": { | "dist": { | ||||
"type": "zip", | "type": "zip", | ||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", | |||||
"reference": "433d05519ce6990bf3530fba6957499d327395c2", | |||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", | |||||
"reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", | |||||
"shasum": "" | "shasum": "" | ||||
}, | }, | ||||
"require": { | "require": { | ||||
}, | }, | ||||
"type": "library", | "type": "library", | ||||
"extra": { | "extra": { | ||||
"branch-alias": { | |||||
"dev-main": "1.26-dev" | |||||
}, | |||||
"thanks": { | "thanks": { | ||||
"name": "symfony/polyfill", | "name": "symfony/polyfill", | ||||
"url": "https://github.com/symfony/polyfill" | "url": "https://github.com/symfony/polyfill" | ||||
"shim" | "shim" | ||||
], | ], | ||||
"support": { | "support": { | ||||
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" | |||||
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" | |||||
}, | }, | ||||
"funding": [ | "funding": [ | ||||
{ | { | ||||
"type": "tidelift" | "type": "tidelift" | ||||
} | } | ||||
], | ], | ||||
"time": "2022-05-24T11:49:31+00:00" | |||||
"time": "2024-01-29T20:11:03+00:00" | |||||
}, | }, | ||||
{ | { | ||||
"name": "symfony/polyfill-intl-normalizer", | "name": "symfony/polyfill-intl-normalizer", | ||||
"version": "v1.26.0", | |||||
"version": "v1.29.0", | |||||
"source": { | "source": { | ||||
"type": "git", | "type": "git", | ||||
"url": "https://github.com/symfony/polyfill-intl-normalizer.git", | "url": "https://github.com/symfony/polyfill-intl-normalizer.git", | ||||
"reference": "219aa369ceff116e673852dce47c3a41794c14bd" | |||||
"reference": "bc45c394692b948b4d383a08d7753968bed9a83d" | |||||
}, | }, | ||||
"dist": { | "dist": { | ||||
"type": "zip", | "type": "zip", | ||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", | |||||
"reference": "219aa369ceff116e673852dce47c3a41794c14bd", | |||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", | |||||
"reference": "bc45c394692b948b4d383a08d7753968bed9a83d", | |||||
"shasum": "" | "shasum": "" | ||||
}, | }, | ||||
"require": { | "require": { | ||||
}, | }, | ||||
"type": "library", | "type": "library", | ||||
"extra": { | "extra": { | ||||
"branch-alias": { | |||||
"dev-main": "1.26-dev" | |||||
}, | |||||
"thanks": { | "thanks": { | ||||
"name": "symfony/polyfill", | "name": "symfony/polyfill", | ||||
"url": "https://github.com/symfony/polyfill" | "url": "https://github.com/symfony/polyfill" | ||||
"shim" | "shim" | ||||
], | ], | ||||
"support": { | "support": { | ||||
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" | |||||
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" | |||||
}, | }, | ||||
"funding": [ | "funding": [ | ||||
{ | { | ||||
"type": "tidelift" | "type": "tidelift" | ||||
} | } | ||||
], | ], | ||||
"time": "2022-05-24T11:49:31+00:00" | |||||
"time": "2024-01-29T20:11:03+00:00" | |||||
}, | }, | ||||
{ | { | ||||
"name": "symfony/polyfill-mbstring", | "name": "symfony/polyfill-mbstring", | ||||
"version": "v1.26.0", | |||||
"version": "v1.29.0", | |||||
"source": { | "source": { | ||||
"type": "git", | "type": "git", | ||||
"url": "https://github.com/symfony/polyfill-mbstring.git", | "url": "https://github.com/symfony/polyfill-mbstring.git", | ||||
"reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" | |||||
"reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" | |||||
}, | }, | ||||
"dist": { | "dist": { | ||||
"type": "zip", | "type": "zip", | ||||
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", | |||||
"reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", | |||||
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", | |||||
"reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", | |||||
"shasum": "" | "shasum": "" | ||||
}, | }, | ||||
"require": { | "require": { | ||||
}, | }, | ||||
"type": "library", | "type": "library", | ||||
"extra": { | "extra": { | ||||
"branch-alias": { | |||||
"dev-main": "1.26-dev" | |||||
}, | |||||
"thanks": { | "thanks": { | ||||
"name": "symfony/polyfill", | "name": "symfony/polyfill", | ||||
"url": "https://github.com/symfony/polyfill" | "url": "https://github.com/symfony/polyfill" | ||||
"shim" | "shim" | ||||
], | ], | ||||
"support": { | "support": { | ||||
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" | |||||
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" | |||||
}, | }, | ||||
"funding": [ | "funding": [ | ||||
{ | { | ||||
"type": "tidelift" | "type": "tidelift" | ||||
} | } | ||||
], | ], | ||||
"time": "2022-05-24T11:49:31+00:00" | |||||
"time": "2024-01-29T20:11:03+00:00" | |||||
}, | }, | ||||
{ | { | ||||
"name": "symfony/polyfill-php73", | "name": "symfony/polyfill-php73", | ||||
"version": "v1.26.0", | |||||
"version": "v1.29.0", | |||||
"source": { | "source": { | ||||
"type": "git", | "type": "git", | ||||
"url": "https://github.com/symfony/polyfill-php73.git", | "url": "https://github.com/symfony/polyfill-php73.git", | ||||
"reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" | |||||
"reference": "21bd091060673a1177ae842c0ef8fe30893114d2" | |||||
}, | }, | ||||
"dist": { | "dist": { | ||||
"type": "zip", | "type": "zip", | ||||
"url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", | |||||
"reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", | |||||
"url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/21bd091060673a1177ae842c0ef8fe30893114d2", | |||||
"reference": "21bd091060673a1177ae842c0ef8fe30893114d2", | |||||
"shasum": "" | "shasum": "" | ||||
}, | }, | ||||
"require": { | "require": { | ||||
}, | }, | ||||
"type": "library", | "type": "library", | ||||
"extra": { | "extra": { | ||||
"branch-alias": { | |||||
"dev-main": "1.26-dev" | |||||
}, | |||||
"thanks": { | "thanks": { | ||||
"name": "symfony/polyfill", | "name": "symfony/polyfill", | ||||
"url": "https://github.com/symfony/polyfill" | "url": "https://github.com/symfony/polyfill" | ||||
"shim" | "shim" | ||||
], | ], | ||||
"support": { | "support": { | ||||
"source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" | |||||
"source": "https://github.com/symfony/polyfill-php73/tree/v1.29.0" | |||||
}, | }, | ||||
"funding": [ | "funding": [ | ||||
{ | { | ||||
"type": "tidelift" | "type": "tidelift" | ||||
} | } | ||||
], | ], | ||||
"time": "2022-05-24T11:49:31+00:00" | |||||
"time": "2024-01-29T20:11:03+00:00" | |||||
}, | }, | ||||
{ | { | ||||
"name": "symfony/polyfill-php80", | "name": "symfony/polyfill-php80", | ||||
"version": "v1.26.0", | |||||
"version": "v1.29.0", | |||||
"source": { | "source": { | ||||
"type": "git", | "type": "git", | ||||
"url": "https://github.com/symfony/polyfill-php80.git", | "url": "https://github.com/symfony/polyfill-php80.git", | ||||
"reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" | |||||
"reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" | |||||
}, | }, | ||||
"dist": { | "dist": { | ||||
"type": "zip", | "type": "zip", | ||||
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", | |||||
"reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", | |||||
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", | |||||
"reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", | |||||
"shasum": "" | "shasum": "" | ||||
}, | }, | ||||
"require": { | "require": { | ||||
}, | }, | ||||
"type": "library", | "type": "library", | ||||
"extra": { | "extra": { | ||||
"branch-alias": { | |||||
"dev-main": "1.26-dev" | |||||
}, | |||||
"thanks": { | "thanks": { | ||||
"name": "symfony/polyfill", | "name": "symfony/polyfill", | ||||
"url": "https://github.com/symfony/polyfill" | "url": "https://github.com/symfony/polyfill" | ||||
"shim" | "shim" | ||||
], | ], | ||||
"support": { | "support": { | ||||
"source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" | |||||
"source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" | |||||
}, | }, | ||||
"funding": [ | "funding": [ | ||||
{ | { | ||||
"type": "tidelift" | "type": "tidelift" | ||||
} | } | ||||
], | ], | ||||
"time": "2022-05-10T07:21:04+00:00" | |||||
"time": "2024-01-29T20:11:03+00:00" | |||||
}, | }, | ||||
{ | { | ||||
"name": "symfony/service-contracts", | "name": "symfony/service-contracts", | ||||
}, | }, | ||||
{ | { | ||||
"name": "symfony/string", | "name": "symfony/string", | ||||
"version": "v5.4.15", | |||||
"version": "v5.4.36", | |||||
"source": { | "source": { | ||||
"type": "git", | "type": "git", | ||||
"url": "https://github.com/symfony/string.git", | "url": "https://github.com/symfony/string.git", | ||||
"reference": "571334ce9f687e3e6af72db4d3b2a9431e4fd9ed" | |||||
"reference": "4e232c83622bd8cd32b794216aa29d0d266d353b" | |||||
}, | }, | ||||
"dist": { | "dist": { | ||||
"type": "zip", | "type": "zip", | ||||
"url": "https://api.github.com/repos/symfony/string/zipball/571334ce9f687e3e6af72db4d3b2a9431e4fd9ed", | |||||
"reference": "571334ce9f687e3e6af72db4d3b2a9431e4fd9ed", | |||||
"url": "https://api.github.com/repos/symfony/string/zipball/4e232c83622bd8cd32b794216aa29d0d266d353b", | |||||
"reference": "4e232c83622bd8cd32b794216aa29d0d266d353b", | |||||
"shasum": "" | "shasum": "" | ||||
}, | }, | ||||
"require": { | "require": { | ||||
"utf8" | "utf8" | ||||
], | ], | ||||
"support": { | "support": { | ||||
"source": "https://github.com/symfony/string/tree/v5.4.15" | |||||
"source": "https://github.com/symfony/string/tree/v5.4.36" | |||||
}, | }, | ||||
"funding": [ | "funding": [ | ||||
{ | { | ||||
"type": "tidelift" | "type": "tidelift" | ||||
} | } | ||||
], | ], | ||||
"time": "2022-10-05T15:16:54+00:00" | |||||
"time": "2024-02-01T08:49:30+00:00" | |||||
}, | }, | ||||
{ | { | ||||
"name": "vimeo/psalm", | "name": "vimeo/psalm", | ||||
"version": "5.9.0", | |||||
"version": "5.23.1", | |||||
"source": { | "source": { | ||||
"type": "git", | "type": "git", | ||||
"url": "https://github.com/vimeo/psalm.git", | "url": "https://github.com/vimeo/psalm.git", | ||||
"reference": "8b9ad1eb9e8b7d3101f949291da2b9f7767cd163" | |||||
"reference": "8471a896ccea3526b26d082f4461eeea467f10a4" | |||||
}, | }, | ||||
"dist": { | "dist": { | ||||
"type": "zip", | "type": "zip", | ||||
"url": "https://api.github.com/repos/vimeo/psalm/zipball/8b9ad1eb9e8b7d3101f949291da2b9f7767cd163", | |||||
"reference": "8b9ad1eb9e8b7d3101f949291da2b9f7767cd163", | |||||
"url": "https://api.github.com/repos/vimeo/psalm/zipball/8471a896ccea3526b26d082f4461eeea467f10a4", | |||||
"reference": "8471a896ccea3526b26d082f4461eeea467f10a4", | |||||
"shasum": "" | "shasum": "" | ||||
}, | }, | ||||
"require": { | "require": { | ||||
"ext-tokenizer": "*", | "ext-tokenizer": "*", | ||||
"felixfbecker/advanced-json-rpc": "^3.1", | "felixfbecker/advanced-json-rpc": "^3.1", | ||||
"felixfbecker/language-server-protocol": "^1.5.2", | "felixfbecker/language-server-protocol": "^1.5.2", | ||||
"fidry/cpu-core-counter": "^0.4.1 || ^0.5.1", | |||||
"fidry/cpu-core-counter": "^0.4.1 || ^0.5.1 || ^1.0.0", | |||||
"netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", | "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0", | ||||
"nikic/php-parser": "^4.14", | |||||
"php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0", | |||||
"sebastian/diff": "^4.0 || ^5.0", | |||||
"nikic/php-parser": "^4.16", | |||||
"php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0", | |||||
"sebastian/diff": "^4.0 || ^5.0 || ^6.0", | |||||
"spatie/array-to-xml": "^2.17.0 || ^3.0", | "spatie/array-to-xml": "^2.17.0 || ^3.0", | ||||
"symfony/console": "^4.1.6 || ^5.0 || ^6.0", | |||||
"symfony/filesystem": "^5.4 || ^6.0" | |||||
"symfony/console": "^4.1.6 || ^5.0 || ^6.0 || ^7.0", | |||||
"symfony/filesystem": "^5.4 || ^6.0 || ^7.0" | |||||
}, | |||||
"conflict": { | |||||
"nikic/php-parser": "4.17.0" | |||||
}, | }, | ||||
"provide": { | "provide": { | ||||
"psalm/psalm": "self.version" | "psalm/psalm": "self.version" | ||||
"psalm/plugin-phpunit": "^0.18", | "psalm/plugin-phpunit": "^0.18", | ||||
"slevomat/coding-standard": "^8.4", | "slevomat/coding-standard": "^8.4", | ||||
"squizlabs/php_codesniffer": "^3.6", | "squizlabs/php_codesniffer": "^3.6", | ||||
"symfony/process": "^4.4 || ^5.0 || ^6.0" | |||||
"symfony/process": "^4.4 || ^5.0 || ^6.0 || ^7.0" | |||||
}, | }, | ||||
"suggest": { | "suggest": { | ||||
"ext-curl": "In order to send data to shepherd", | "ext-curl": "In order to send data to shepherd", | ||||
"psalm-refactor", | "psalm-refactor", | ||||
"psalter" | "psalter" | ||||
], | ], | ||||
"type": "library", | |||||
"type": "project", | |||||
"extra": { | "extra": { | ||||
"branch-alias": { | "branch-alias": { | ||||
"dev-master": "5.x-dev", | "dev-master": "5.x-dev", | ||||
"static analysis" | "static analysis" | ||||
], | ], | ||||
"support": { | "support": { | ||||
"docs": "https://psalm.dev/docs", | |||||
"issues": "https://github.com/vimeo/psalm/issues", | "issues": "https://github.com/vimeo/psalm/issues", | ||||
"source": "https://github.com/vimeo/psalm/tree/5.9.0" | |||||
"source": "https://github.com/vimeo/psalm" | |||||
}, | }, | ||||
"time": "2023-03-29T21:38:21+00:00" | |||||
"time": "2024-03-11T20:33:46+00:00" | |||||
}, | }, | ||||
{ | { | ||||
"name": "webmozart/assert", | "name": "webmozart/assert", | ||||
"platform-overrides": { | "platform-overrides": { | ||||
"php": "8.0" | "php": "8.0" | ||||
}, | }, | ||||
"plugin-api-version": "2.3.0" | |||||
"plugin-api-version": "2.6.0" | |||||
} | } |