aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCôme Chilliet <91878298+come-nc@users.noreply.github.com>2021-12-16 14:24:47 +0100
committerGitHub <noreply@github.com>2021-12-16 14:24:47 +0100
commit9a37ca9b480c9cd3ea6474db2c6f52908c653aaf (patch)
tree3ee506bbca954f5b7bd0acbd13f1e5cbaba2e127
parent1fdc97bb13376677536b2a300469a73f8a5c30e7 (diff)
parentc3a1a66eaefac9e06385d125dd4edae3117cc9eb (diff)
downloadnextcloud-server-9a37ca9b480c9cd3ea6474db2c6f52908c653aaf.tar.gz
nextcloud-server-9a37ca9b480c9cd3ea6474db2c6f52908c653aaf.zip
Merge pull request #29862 from nextcloud/fix/support-php-8.1-2
Support PHP 8.1 - Second batch
-rw-r--r--.github/workflows/lint.yml2
-rw-r--r--.github/workflows/oci.yml2
-rw-r--r--apps/encryption/lib/Command/FixEncryptedVersion.php5
-rw-r--r--apps/encryption/tests/Crypto/EncryptAllTest.php5
-rw-r--r--apps/files_sharing/tests/Controller/PublicPreviewControllerTest.php4
-rw-r--r--apps/files_trashbin/tests/Controller/PreviewControllerTest.php2
-rw-r--r--apps/files_versions/tests/Controller/PreviewControllerTest.php2
-rw-r--r--apps/settings/tests/Settings/Admin/SharingTest.php2
-rw-r--r--apps/theming/tests/Controller/IconControllerTest.php2
-rw-r--r--apps/theming/tests/Controller/ThemingControllerTest.php7
-rw-r--r--apps/user_ldap/lib/Access.php8
-rw-r--r--apps/user_ldap/lib/Connection.php9
-rw-r--r--apps/user_ldap/lib/Group_LDAP.php6
-rw-r--r--apps/user_ldap/lib/Group_Proxy.php2
-rw-r--r--apps/user_ldap/lib/IGroupLDAP.php2
-rw-r--r--apps/user_ldap/lib/ILDAPWrapper.php62
-rw-r--r--apps/user_ldap/lib/IUserLDAP.php2
-rw-r--r--apps/user_ldap/lib/LDAP.php92
-rw-r--r--apps/user_ldap/lib/LDAPProvider.php4
-rw-r--r--apps/user_ldap/lib/PagedResults/IAdapter.php4
-rw-r--r--apps/user_ldap/lib/PagedResults/TLinkId.php12
-rw-r--r--apps/user_ldap/lib/User/Manager.php2
-rw-r--r--apps/user_ldap/lib/User/User.php8
-rw-r--r--apps/user_ldap/lib/User_LDAP.php2
-rw-r--r--apps/user_ldap/lib/User_Proxy.php2
-rw-r--r--apps/user_ldap/lib/Wizard.php6
-rw-r--r--apps/user_ldap/tests/AccessTest.php2
-rw-r--r--apps/user_ldap/tests/Integration/ExceptionOnLostConnection.php4
-rw-r--r--lib/private/Updater/ChangesCheck.php10
-rw-r--r--lib/private/Updater/VersionCheck.php10
-rw-r--r--lib/public/LDAP/ILDAPProvider.php4
-rw-r--r--lib/versioncheck.php6
-rw-r--r--psalm.xml3
-rw-r--r--tests/lib/Archive/ZIPTest.php2
-rw-r--r--tests/lib/Files/ViewTest.php5
35 files changed, 150 insertions, 152 deletions
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index db6f9bbf40c..3158b97e0c5 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -6,7 +6,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
- php-versions: ['7.3', '7.4', '8.0']
+ php-versions: ['7.3', '7.4', '8.0', '8.1']
name: php${{ matrix.php-versions }} lint
steps:
- name: Checkout
diff --git a/.github/workflows/oci.yml b/.github/workflows/oci.yml
index b30960bdba2..4fcfc7ff04e 100644
--- a/.github/workflows/oci.yml
+++ b/.github/workflows/oci.yml
@@ -14,7 +14,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- php-versions: [ '7.3', '7.4', '8.0' ]
+ php-versions: [ '7.3', '7.4', '8.0', '8.1']
databases: [ 'oci' ]
name: php${{ matrix.php-versions }}-${{ matrix.databases }}
diff --git a/apps/encryption/lib/Command/FixEncryptedVersion.php b/apps/encryption/lib/Command/FixEncryptedVersion.php
index d51f64c8ef9..073c1f1438a 100644
--- a/apps/encryption/lib/Command/FixEncryptedVersion.php
+++ b/apps/encryption/lib/Command/FixEncryptedVersion.php
@@ -116,10 +116,7 @@ class FixEncryptedVersion extends Command {
$user = (string)$input->getArgument('user');
$pathToWalk = "/$user/files";
- /**
- * trim() returns an empty string when the argument is an unset/null
- */
- $pathOption = \trim($input->getOption('path'), '/');
+ $pathOption = \trim(($input->getOption('path') ?? ''), '/');
if ($pathOption !== "") {
$pathToWalk = "$pathToWalk/$pathOption";
}
diff --git a/apps/encryption/tests/Crypto/EncryptAllTest.php b/apps/encryption/tests/Crypto/EncryptAllTest.php
index 4a00b67f0b1..e5c10dd67e8 100644
--- a/apps/encryption/tests/Crypto/EncryptAllTest.php
+++ b/apps/encryption/tests/Crypto/EncryptAllTest.php
@@ -117,9 +117,12 @@ class EncryptAllTest extends TestCase {
$this->userInterface = $this->getMockBuilder(UserInterface::class)
->disableOriginalConstructor()->getMock();
+ /* We need format method to return a string */
+ $outputFormatter = $this->createMock(OutputFormatterInterface::class);
+ $outputFormatter->method('format')->willReturnArgument(0);
$this->outputInterface->expects($this->any())->method('getFormatter')
- ->willReturn($this->createMock(OutputFormatterInterface::class));
+ ->willReturn($outputFormatter);
$this->userManager->expects($this->any())->method('getBackends')->willReturn([$this->userInterface]);
$this->userInterface->expects($this->any())->method('getUsers')->willReturn(['user1', 'user2']);
diff --git a/apps/files_sharing/tests/Controller/PublicPreviewControllerTest.php b/apps/files_sharing/tests/Controller/PublicPreviewControllerTest.php
index e089cd9e34b..9f852721678 100644
--- a/apps/files_sharing/tests/Controller/PublicPreviewControllerTest.php
+++ b/apps/files_sharing/tests/Controller/PublicPreviewControllerTest.php
@@ -137,6 +137,8 @@ class PublicPreviewControllerTest extends TestCase {
->willReturn($file);
$preview = $this->createMock(ISimpleFile::class);
+ $preview->method('getName')->willReturn('name');
+ $preview->method('getMTime')->willReturn(42);
$this->previewManager->method('getPreview')
->with($this->equalTo($file), 10, 10, false)
->willReturn($preview);
@@ -192,6 +194,8 @@ class PublicPreviewControllerTest extends TestCase {
->willReturn($file);
$preview = $this->createMock(ISimpleFile::class);
+ $preview->method('getName')->willReturn('name');
+ $preview->method('getMTime')->willReturn(42);
$this->previewManager->method('getPreview')
->with($this->equalTo($file), 10, 10, false)
->willReturn($preview);
diff --git a/apps/files_trashbin/tests/Controller/PreviewControllerTest.php b/apps/files_trashbin/tests/Controller/PreviewControllerTest.php
index 1a36473ecf1..441222bea19 100644
--- a/apps/files_trashbin/tests/Controller/PreviewControllerTest.php
+++ b/apps/files_trashbin/tests/Controller/PreviewControllerTest.php
@@ -144,6 +144,8 @@ class PreviewControllerTest extends TestCase {
->willReturn($file);
$preview = $this->createMock(ISimpleFile::class);
+ $preview->method('getName')->willReturn('name');
+ $preview->method('getMTime')->willReturn(42);
$this->previewManager->method('getPreview')
->with($this->equalTo($file), 10, 10, true, IPreview::MODE_FILL, 'myMime')
->willReturn($preview);
diff --git a/apps/files_versions/tests/Controller/PreviewControllerTest.php b/apps/files_versions/tests/Controller/PreviewControllerTest.php
index 64a060e3108..0457d0d5f24 100644
--- a/apps/files_versions/tests/Controller/PreviewControllerTest.php
+++ b/apps/files_versions/tests/Controller/PreviewControllerTest.php
@@ -141,6 +141,8 @@ class PreviewControllerTest extends TestCase {
->willReturn($file);
$preview = $this->createMock(ISimpleFile::class);
+ $preview->method('getName')->willReturn('name');
+ $preview->method('getMTime')->willReturn(42);
$this->previewManager->method('getPreview')
->with($this->equalTo($file), 10, 10, true, IPreview::MODE_FILL, 'myMime')
->willReturn($preview);
diff --git a/apps/settings/tests/Settings/Admin/SharingTest.php b/apps/settings/tests/Settings/Admin/SharingTest.php
index c90429f6dd8..222be5fd9dc 100644
--- a/apps/settings/tests/Settings/Admin/SharingTest.php
+++ b/apps/settings/tests/Settings/Admin/SharingTest.php
@@ -74,6 +74,7 @@ class SharingTest extends TestCase {
->method('getAppValue')
->willReturnMap([
['core', 'shareapi_exclude_groups_list', '', ''],
+ ['core', 'shareapi_allow_links_exclude_groups', '', ''],
['core', 'shareapi_allow_group_sharing', 'yes', 'yes'],
['core', 'shareapi_allow_links', 'yes', 'yes'],
['core', 'shareapi_allow_public_upload', 'yes', 'yes'],
@@ -146,6 +147,7 @@ class SharingTest extends TestCase {
->method('getAppValue')
->willReturnMap([
['core', 'shareapi_exclude_groups_list', '', '["NoSharers","OtherNoSharers"]'],
+ ['core', 'shareapi_allow_links_exclude_groups', '', ''],
['core', 'shareapi_allow_group_sharing', 'yes', 'yes'],
['core', 'shareapi_allow_links', 'yes', 'yes'],
['core', 'shareapi_allow_public_upload', 'yes', 'yes'],
diff --git a/apps/theming/tests/Controller/IconControllerTest.php b/apps/theming/tests/Controller/IconControllerTest.php
index 821291427d9..04954782168 100644
--- a/apps/theming/tests/Controller/IconControllerTest.php
+++ b/apps/theming/tests/Controller/IconControllerTest.php
@@ -91,6 +91,8 @@ class IconControllerTest extends TestCase {
$icon->expects($this->any())->method('getContent')->willReturn($data);
$icon->expects($this->any())->method('getMimeType')->willReturn('image type');
$icon->expects($this->any())->method('getEtag')->willReturn('my etag');
+ $icon->expects($this->any())->method('getName')->willReturn('my name');
+ $icon->expects($this->any())->method('getMTime')->willReturn(42);
$icon->method('getName')->willReturn($filename);
return new SimpleFile($icon);
}
diff --git a/apps/theming/tests/Controller/ThemingControllerTest.php b/apps/theming/tests/Controller/ThemingControllerTest.php
index 639574a5270..cff2028809d 100644
--- a/apps/theming/tests/Controller/ThemingControllerTest.php
+++ b/apps/theming/tests/Controller/ThemingControllerTest.php
@@ -689,6 +689,8 @@ class ThemingControllerTest extends TestCase {
public function testGetLogo() {
$file = $this->createMock(ISimpleFile::class);
+ $file->method('getName')->willReturn('logo.svg');
+ $file->method('getMTime')->willReturn(42);
$this->imageManager->expects($this->once())
->method('getImage')
->willReturn($file);
@@ -719,6 +721,8 @@ class ThemingControllerTest extends TestCase {
public function testGetLoginBackground() {
$file = $this->createMock(ISimpleFile::class);
+ $file->method('getName')->willReturn('background.png');
+ $file->method('getMTime')->willReturn(42);
$this->imageManager->expects($this->once())
->method('getImage')
->willReturn($file);
@@ -744,6 +748,7 @@ class ThemingControllerTest extends TestCase {
$this->appManager->expects($this->once())->method('getAppPath')->with('theming')->willReturn(\OC::$SERVERROOT . '/theming');
$file = $this->createMock(ISimpleFile::class);
$file->expects($this->any())->method('getName')->willReturn('theming.css');
+ $file->expects($this->any())->method('getMTime')->willReturn(42);
$file->expects($this->any())->method('getContent')->willReturn('compiled');
$this->scssCacher->expects($this->once())->method('process')->willReturn(true);
$this->scssCacher->expects($this->once())->method('getCachedCSS')->willReturn($file);
@@ -759,6 +764,7 @@ class ThemingControllerTest extends TestCase {
$this->appManager->expects($this->once())->method('getAppPath')->with('theming')->willReturn(\OC::$SERVERROOT . '/theming');
$file = $this->createMock(ISimpleFile::class);
$file->expects($this->any())->method('getName')->willReturn('theming.css');
+ $file->expects($this->any())->method('getMTime')->willReturn(42);
$file->expects($this->any())->method('getContent')->willReturn('compiled');
$this->scssCacher->expects($this->once())->method('process')->willReturn(true);
$this->scssCacher->expects($this->once())->method('getCachedCSS')->willThrowException(new NotFoundException());
@@ -772,6 +778,7 @@ class ThemingControllerTest extends TestCase {
$this->appManager->expects($this->once())->method('getAppPath')->with('theming')->willReturn('/outside/serverroot/theming');
$file = $this->createMock(ISimpleFile::class);
$file->expects($this->any())->method('getName')->willReturn('theming.css');
+ $file->expects($this->any())->method('getMTime')->willReturn(42);
$file->expects($this->any())->method('getContent')->willReturn('compiled');
$this->scssCacher->expects($this->once())->method('process')->with('/outside/serverroot/theming', 'css/theming.scss', 'theming')->willReturn(true);
$this->scssCacher->expects($this->once())->method('getCachedCSS')->willReturn($file);
diff --git a/apps/user_ldap/lib/Access.php b/apps/user_ldap/lib/Access.php
index 0af04747ded..f79efe90996 100644
--- a/apps/user_ldap/lib/Access.php
+++ b/apps/user_ldap/lib/Access.php
@@ -260,7 +260,7 @@ class Access extends LDAPUtility {
/**
* Runs an read operation against LDAP
*
- * @param resource $cr the LDAP connection
+ * @param resource|\LDAP\Connection $cr the LDAP connection
* @param string $dn
* @param string $attribute
* @param string $filter
@@ -926,7 +926,7 @@ class Access extends LDAPUtility {
* @throws \Exception
*/
public function batchApplyUserAttributes(array $ldapRecords) {
- $displayNameAttribute = strtolower($this->connection->ldapUserDisplayName);
+ $displayNameAttribute = strtolower((string)$this->connection->ldapUserDisplayName);
foreach ($ldapRecords as $userRecord) {
if (!isset($userRecord[$displayNameAttribute])) {
// displayName is obligatory
@@ -1186,7 +1186,7 @@ class Access extends LDAPUtility {
/**
* processes an LDAP paged search operation
*
- * @param resource $sr the array containing the LDAP search resources
+ * @param resource|\LDAP\Result|resource[]|\LDAP\Result[] $sr the array containing the LDAP search resources
* @param int $foundItems number of results in the single search operation
* @param int $limit maximum results to be counted
* @param bool $pagedSearchOK whether a paged search has been executed
@@ -1303,7 +1303,7 @@ class Access extends LDAPUtility {
}
/**
- * @param resource $sr
+ * @param resource|\LDAP\Result|resource[]|\LDAP\Result[] $sr
* @return int
* @throws ServerNotAvailableException
*/
diff --git a/apps/user_ldap/lib/Connection.php b/apps/user_ldap/lib/Connection.php
index 77ae34f9f6c..6666da1e933 100644
--- a/apps/user_ldap/lib/Connection.php
+++ b/apps/user_ldap/lib/Connection.php
@@ -74,6 +74,9 @@ use Psr\Log\LoggerInterface;
* @property string ldapMatchingRuleInChainState
*/
class Connection extends LDAPUtility {
+ /**
+ * @var resource|\LDAP\Connection|null
+ */
private $ldapConnectionRes = null;
private $configPrefix;
private $configID;
@@ -202,7 +205,7 @@ class Connection extends LDAPUtility {
}
/**
- * Returns the LDAP handler
+ * @return resource|\LDAP\Connection The LDAP resource
*/
public function getConnectionResource() {
if (!$this->ldapConnectionRes) {
@@ -408,7 +411,7 @@ class Connection extends LDAPUtility {
}
}
- if ((stripos($this->configuration->ldapHost, 'ldaps://') === 0)
+ if ((stripos((string)$this->configuration->ldapHost, 'ldaps://') === 0)
&& $this->configuration->ldapTLS) {
$this->configuration->ldapTLS = false;
$this->logger->info(
@@ -487,7 +490,7 @@ class Connection extends LDAPUtility {
$configurationOK = false;
}
- if (mb_strpos($this->configuration->ldapLoginFilter, '%uid', 0, 'UTF-8')
+ if (mb_strpos((string)$this->configuration->ldapLoginFilter, '%uid', 0, 'UTF-8')
=== false) {
$this->logger->warning(
$errorStr.'login filter does not contain %uid place holder.',
diff --git a/apps/user_ldap/lib/Group_LDAP.php b/apps/user_ldap/lib/Group_LDAP.php
index 744f921c6dd..9172b5fa25f 100644
--- a/apps/user_ldap/lib/Group_LDAP.php
+++ b/apps/user_ldap/lib/Group_LDAP.php
@@ -83,7 +83,7 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I
$this->cachedNestedGroups = new CappedMemoryCache();
$this->groupPluginManager = $groupPluginManager;
$this->logger = OC::$server->get(LoggerInterface::class);
- $this->ldapGroupMemberAssocAttr = strtolower($gAssoc);
+ $this->ldapGroupMemberAssocAttr = strtolower((string)$gAssoc);
}
/**
@@ -202,7 +202,7 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I
* @throws ServerNotAvailableException
*/
public function getDynamicGroupMembers(string $dnGroup): array {
- $dynamicGroupMemberURL = strtolower($this->access->connection->ldapDynamicGroupMemberURL);
+ $dynamicGroupMemberURL = strtolower((string)$this->access->connection->ldapDynamicGroupMemberURL);
if (empty($dynamicGroupMemberURL)) {
return [];
@@ -1312,7 +1312,7 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I
* of the current access.
*
* @param string $gid
- * @return resource of the LDAP connection
+ * @return resource|\LDAP\Connection The LDAP connection
* @throws ServerNotAvailableException
*/
public function getNewLDAPConnection($gid) {
diff --git a/apps/user_ldap/lib/Group_Proxy.php b/apps/user_ldap/lib/Group_Proxy.php
index 3f9bb9013eb..92a9041949e 100644
--- a/apps/user_ldap/lib/Group_Proxy.php
+++ b/apps/user_ldap/lib/Group_Proxy.php
@@ -290,7 +290,7 @@ class Group_Proxy extends Proxy implements \OCP\GroupInterface, IGroupLDAP, IGet
* The connection needs to be closed manually.
*
* @param string $gid
- * @return resource of the LDAP connection
+ * @return resource|\LDAP\Connection The LDAP connection
*/
public function getNewLDAPConnection($gid) {
return $this->handleRequest($gid, 'getNewLDAPConnection', [$gid]);
diff --git a/apps/user_ldap/lib/IGroupLDAP.php b/apps/user_ldap/lib/IGroupLDAP.php
index 33636dd8f55..2face1aa907 100644
--- a/apps/user_ldap/lib/IGroupLDAP.php
+++ b/apps/user_ldap/lib/IGroupLDAP.php
@@ -36,7 +36,7 @@ interface IGroupLDAP {
/**
* Return a new LDAP connection for the specified group.
* @param string $gid
- * @return resource of the LDAP connection
+ * @return resource|\LDAP\Connection The LDAP connection
*/
public function getNewLDAPConnection($gid);
}
diff --git a/apps/user_ldap/lib/ILDAPWrapper.php b/apps/user_ldap/lib/ILDAPWrapper.php
index c82df09d234..3f600a40cc0 100644
--- a/apps/user_ldap/lib/ILDAPWrapper.php
+++ b/apps/user_ldap/lib/ILDAPWrapper.php
@@ -35,7 +35,7 @@ interface ILDAPWrapper {
/**
* Bind to LDAP directory
- * @param resource $link LDAP link resource
+ * @param resource|\LDAP\Connection $link LDAP link resource
* @param string $dn an RDN to log in with
* @param string $password the password
* @return bool true on success, false otherwise
@@ -54,7 +54,7 @@ interface ILDAPWrapper {
/**
* Send LDAP pagination control
- * @param resource $link LDAP link resource
+ * @param resource|\LDAP\Connection $link LDAP link resource
* @param int $pageSize number of results per page
* @param bool $isCritical Indicates whether the pagination is critical of not.
* @param string $cookie structure sent by LDAP server
@@ -64,8 +64,8 @@ interface ILDAPWrapper {
/**
* Retrieve the LDAP pagination cookie
- * @param resource $link LDAP link resource
- * @param resource $result LDAP result resource
+ * @param resource|\LDAP\Connection $link LDAP link resource
+ * @param resource|\LDAP\Result $result LDAP result resource
* @param string $cookie structure sent by LDAP server
* @return bool true on success, false otherwise
*
@@ -75,22 +75,22 @@ interface ILDAPWrapper {
/**
* Count the number of entries in a search
- * @param resource $link LDAP link resource
- * @param resource $result LDAP result resource
+ * @param resource|\LDAP\Connection $link LDAP link resource
+ * @param resource|\LDAP\Result $result LDAP result resource
* @return int|false number of results on success, false otherwise
*/
public function countEntries($link, $result);
/**
* Return the LDAP error number of the last LDAP command
- * @param resource $link LDAP link resource
+ * @param resource|\LDAP\Connection $link LDAP link resource
* @return int error code
*/
public function errno($link);
/**
* Return the LDAP error message of the last LDAP command
- * @param resource $link LDAP link resource
+ * @param resource|\LDAP\Connection $link LDAP link resource
* @return string error message
*/
public function error($link);
@@ -106,69 +106,69 @@ interface ILDAPWrapper {
/**
* Return first result id
- * @param resource $link LDAP link resource
- * @param resource $result LDAP result resource
- * @return Resource an LDAP search result resource
+ * @param resource|\LDAP\Connection $link LDAP link resource
+ * @param resource|\LDAP\Result $result LDAP result resource
+ * @return resource|\LDAP\ResultEntry an LDAP entry resource
* */
public function firstEntry($link, $result);
/**
* Get attributes from a search result entry
- * @param resource $link LDAP link resource
- * @param resource $result LDAP result resource
+ * @param resource|\LDAP\Connection $link LDAP link resource
+ * @param resource|\LDAP\ResultEntry $result LDAP result resource
* @return array containing the results, false on error
* */
public function getAttributes($link, $result);
/**
* Get the DN of a result entry
- * @param resource $link LDAP link resource
- * @param resource $result LDAP result resource
+ * @param resource|\LDAP\Connection $link LDAP link resource
+ * @param resource|\LDAP\ResultEntry $result LDAP result resource
* @return string containing the DN, false on error
*/
public function getDN($link, $result);
/**
* Get all result entries
- * @param resource $link LDAP link resource
- * @param resource $result LDAP result resource
+ * @param resource|\LDAP\Connection $link LDAP link resource
+ * @param resource|\LDAP\Result $result LDAP result resource
* @return array containing the results, false on error
*/
public function getEntries($link, $result);
/**
* Return next result id
- * @param resource $link LDAP link resource
- * @param resource $result LDAP entry result resource
- * @return resource an LDAP search result resource
+ * @param resource|\LDAP\Connection $link LDAP link resource
+ * @param resource|\LDAP\ResultEntry $result LDAP result resource
+ * @return resource|\LDAP\ResultEntry an LDAP entry resource
* */
public function nextEntry($link, $result);
/**
* Read an entry
- * @param resource $link LDAP link resource
- * @param array $baseDN The DN of the entry to read from
+ * @param resource|\LDAP\Connection $link LDAP link resource
+ * @param string $baseDN The DN of the entry to read from
* @param string $filter An LDAP filter
* @param array $attr array of the attributes to read
- * @return resource an LDAP search result resource
+ * @return resource|\LDAP\Result an LDAP search result resource
*/
public function read($link, $baseDN, $filter, $attr);
/**
* Search LDAP tree
- * @param resource $link LDAP link resource
+ * @param resource|\LDAP\Connection $link LDAP link resource
* @param string $baseDN The DN of the entry to read from
* @param string $filter An LDAP filter
* @param array $attr array of the attributes to read
* @param int $attrsOnly optional, 1 if only attribute types shall be returned
* @param int $limit optional, limits the result entries
- * @return resource|false an LDAP search result resource, false on error
+ * @return resource|\LDAP\Result|false an LDAP search result resource, false on error
*/
public function search($link, $baseDN, $filter, $attr, $attrsOnly = 0, $limit = 0);
/**
* Replace the value of a userPassword by $password
- * @param resource $link LDAP link resource
+ * @param resource|\LDAP\Connection $link LDAP link resource
* @param string $userDN the DN of the user whose password is to be replaced
* @param string $password the new value for the userPassword
* @return bool true on success, false otherwise
@@ -177,7 +177,7 @@ interface ILDAPWrapper {
/**
* Sets the value of the specified option to be $value
- * @param resource $link LDAP link resource
+ * @param resource|\LDAP\Connection $link LDAP link resource
* @param string $option a defined LDAP Server option
* @param int $value the new value for the option
* @return bool true on success, false otherwise
@@ -186,14 +186,14 @@ interface ILDAPWrapper {
/**
* establish Start TLS
- * @param resource $link LDAP link resource
+ * @param resource|\LDAP\Connection $link LDAP link resource
* @return bool true on success, false otherwise
*/
public function startTls($link);
/**
* Unbind from LDAP directory
- * @param resource $link LDAP link resource
+ * @param resource|\LDAP\Connection $link LDAP link resource
* @return bool true on success, false otherwise
*/
public function unbind($link);
@@ -208,8 +208,8 @@ interface ILDAPWrapper {
/**
* Checks whether the submitted parameter is a resource
- * @param resource $resource the resource variable to check
- * @return bool true if it is a resource, false otherwise
+ * @param mixed $resource the resource variable to check
+ * @return bool true if it is a resource or LDAP object, false otherwise
*/
public function isResource($resource);
}
diff --git a/apps/user_ldap/lib/IUserLDAP.php b/apps/user_ldap/lib/IUserLDAP.php
index 201bbfd75a2..dfba11c5d34 100644
--- a/apps/user_ldap/lib/IUserLDAP.php
+++ b/apps/user_ldap/lib/IUserLDAP.php
@@ -37,7 +37,7 @@ interface IUserLDAP {
/**
* Return a new LDAP connection for the specified user.
* @param string $uid
- * @return resource of the LDAP connection
+ * @return resource|\LDAP\Connection of the LDAP connection
*/
public function getNewLDAPConnection($uid);
diff --git a/apps/user_ldap/lib/LDAP.php b/apps/user_ldap/lib/LDAP.php
index 900f5a7030f..e33facd0889 100644
--- a/apps/user_ldap/lib/LDAP.php
+++ b/apps/user_ldap/lib/LDAP.php
@@ -51,19 +51,14 @@ class LDAP implements ILDAPWrapper {
}
/**
- * @param resource $link
- * @param string $dn
- * @param string $password
- * @return bool|mixed
+ * {@inheritDoc}
*/
public function bind($link, $dn, $password) {
return $this->invokeLDAPMethod('bind', $link, $dn, $password);
}
/**
- * @param string $host
- * @param string $port
- * @return mixed
+ * {@inheritDoc}
*/
public function connect($host, $port) {
if (strpos($host, '://') === false) {
@@ -76,6 +71,9 @@ class LDAP implements ILDAPWrapper {
return $this->invokeLDAPMethod('connect', $host);
}
+ /**
+ * {@inheritDoc}
+ */
public function controlPagedResultResponse($link, $result, &$cookie): bool {
$this->preFunctionCall(
$this->pagedResultsAdapter->getResponseCallFunc(),
@@ -93,10 +91,7 @@ class LDAP implements ILDAPWrapper {
}
/**
- * @param LDAP $link
- * @param int $pageSize
- * @param bool $isCritical
- * @return mixed|true
+ * {@inheritDoc}
*/
public function controlPagedResult($link, $pageSize, $isCritical) {
$fn = $this->pagedResultsAdapter->getRequestCallFunc();
@@ -116,25 +111,21 @@ class LDAP implements ILDAPWrapper {
}
/**
- * @param LDAP $link
- * @param LDAP $result
- * @return mixed
+ * {@inheritDoc}
*/
public function countEntries($link, $result) {
return $this->invokeLDAPMethod('count_entries', $link, $result);
}
/**
- * @param LDAP $link
- * @return integer
+ * {@inheritDoc}
*/
public function errno($link) {
return $this->invokeLDAPMethod('errno', $link);
}
/**
- * @param LDAP $link
- * @return string
+ * {@inheritDoc}
*/
public function error($link) {
return $this->invokeLDAPMethod('error', $link);
@@ -152,56 +143,42 @@ class LDAP implements ILDAPWrapper {
}
/**
- * @param LDAP $link
- * @param LDAP $result
- * @return mixed
+ * {@inheritDoc}
*/
public function firstEntry($link, $result) {
return $this->invokeLDAPMethod('first_entry', $link, $result);
}
/**
- * @param LDAP $link
- * @param LDAP $result
- * @return array|mixed
+ * {@inheritDoc}
*/
public function getAttributes($link, $result) {
return $this->invokeLDAPMethod('get_attributes', $link, $result);
}
/**
- * @param LDAP $link
- * @param LDAP $result
- * @return mixed|string
+ * {@inheritDoc}
*/
public function getDN($link, $result) {
return $this->invokeLDAPMethod('get_dn', $link, $result);
}
/**
- * @param LDAP $link
- * @param LDAP $result
- * @return array|mixed
+ * {@inheritDoc}
*/
public function getEntries($link, $result) {
return $this->invokeLDAPMethod('get_entries', $link, $result);
}
/**
- * @param LDAP $link
- * @param resource $result
- * @return mixed
+ * {@inheritDoc}
*/
public function nextEntry($link, $result) {
return $this->invokeLDAPMethod('next_entry', $link, $result);
}
/**
- * @param LDAP $link
- * @param string $baseDN
- * @param string $filter
- * @param array $attr
- * @return mixed
+ * {@inheritDoc}
*/
public function read($link, $baseDN, $filter, $attr) {
$this->pagedResultsAdapter->setReadArgs($link, $baseDN, $filter, $attr);
@@ -209,14 +186,7 @@ class LDAP implements ILDAPWrapper {
}
/**
- * @param LDAP $link
- * @param string[] $baseDN
- * @param string $filter
- * @param array $attr
- * @param int $attrsOnly
- * @param int $limit
- * @return mixed
- * @throws \Exception
+ * {@inheritDoc}
*/
public function search($link, $baseDN, $filter, $attr, $attrsOnly = 0, $limit = 0) {
$oldHandler = set_error_handler(function ($no, $message, $file, $line) use (&$oldHandler) {
@@ -239,47 +209,35 @@ class LDAP implements ILDAPWrapper {
}
/**
- * @param LDAP $link
- * @param string $userDN
- * @param string $password
- * @return bool
+ * {@inheritDoc}
*/
public function modReplace($link, $userDN, $password) {
return $this->invokeLDAPMethod('mod_replace', $link, $userDN, ['userPassword' => $password]);
}
/**
- * @param LDAP $link
- * @param string $userDN
- * @param string $oldPassword
- * @param string $password
- * @return bool
+ * {@inheritDoc}
*/
public function exopPasswd($link, $userDN, $oldPassword, $password) {
return $this->invokeLDAPMethod('exop_passwd', $link, $userDN, $oldPassword, $password);
}
/**
- * @param LDAP $link
- * @param string $option
- * @param int $value
- * @return bool|mixed
+ * {@inheritDoc}
*/
public function setOption($link, $option, $value) {
return $this->invokeLDAPMethod('set_option', $link, $option, $value);
}
/**
- * @param LDAP $link
- * @return mixed|true
+ * {@inheritDoc}
*/
public function startTls($link) {
return $this->invokeLDAPMethod('start_tls', $link);
}
/**
- * @param resource $link
- * @return bool|mixed
+ * {@inheritDoc}
*/
public function unbind($link) {
return $this->invokeLDAPMethod('unbind', $link);
@@ -294,12 +252,10 @@ class LDAP implements ILDAPWrapper {
}
/**
- * Checks whether the submitted parameter is a resource
- * @param Resource $resource the resource variable to check
- * @return bool true if it is a resource, false otherwise
+ * {@inheritDoc}
*/
public function isResource($resource) {
- return is_resource($resource);
+ return is_resource($resource) || is_object($resource);
}
/**
@@ -368,7 +324,7 @@ class LDAP implements ILDAPWrapper {
/**
* Analyzes the returned LDAP error and acts accordingly if not 0
*
- * @param resource $resource the LDAP Connection resource
+ * @param resource|\LDAP\Connection $resource the LDAP Connection resource
* @throws ConstraintViolationException
* @throws ServerNotAvailableException
* @throws \Exception
diff --git a/apps/user_ldap/lib/LDAPProvider.php b/apps/user_ldap/lib/LDAPProvider.php
index dd86ce486ac..751ebf68768 100644
--- a/apps/user_ldap/lib/LDAPProvider.php
+++ b/apps/user_ldap/lib/LDAPProvider.php
@@ -149,7 +149,7 @@ class LDAPProvider implements ILDAPProvider, IDeletionFlagSupport {
* Return a new LDAP connection resource for the specified user.
* The connection must be closed manually.
* @param string $uid user id
- * @return resource of the LDAP connection
+ * @return resource|\LDAP\Connection The LDAP connection
* @throws \Exception if user id was not found in LDAP
*/
public function getLDAPConnection($uid) {
@@ -163,7 +163,7 @@ class LDAPProvider implements ILDAPProvider, IDeletionFlagSupport {
* Return a new LDAP connection resource for the specified user.
* The connection must be closed manually.
* @param string $gid group id
- * @return resource of the LDAP connection
+ * @return resource|\LDAP\Connection The LDAP connection
* @throws \Exception if group id was not found in LDAP
*/
public function getGroupLDAPConnection($gid) {
diff --git a/apps/user_ldap/lib/PagedResults/IAdapter.php b/apps/user_ldap/lib/PagedResults/IAdapter.php
index 2dd9ffe80a1..31338126e40 100644
--- a/apps/user_ldap/lib/PagedResults/IAdapter.php
+++ b/apps/user_ldap/lib/PagedResults/IAdapter.php
@@ -82,7 +82,7 @@ interface IAdapter {
/**
* the adapter should do it's LDAP function call and return success state
*
- * @param resource $link LDAP resource
+ * @param resource|\LDAP\Connection $link LDAP resource
* @return bool
*/
public function responseCall($link): bool;
@@ -123,7 +123,7 @@ interface IAdapter {
/**
* Returns the current paged results cookie
*
- * @param resource $link LDAP resource
+ * @param resource|\LDAP\Connection $link LDAP resource
* @return string
*/
public function getCookie($link): string;
diff --git a/apps/user_ldap/lib/PagedResults/TLinkId.php b/apps/user_ldap/lib/PagedResults/TLinkId.php
index 6f320705e67..02c36da97f9 100644
--- a/apps/user_ldap/lib/PagedResults/TLinkId.php
+++ b/apps/user_ldap/lib/PagedResults/TLinkId.php
@@ -28,10 +28,16 @@ namespace OCA\User_LDAP\PagedResults;
trait TLinkId {
public function getLinkId($link) {
- if (is_resource($link)) {
+ if (is_object($link)) {
+ return spl_object_id($link);
+ } elseif (is_resource($link)) {
return (int)$link;
- } elseif (is_array($link) && isset($link[0]) && is_resource($link[0])) {
- return (int)$link[0];
+ } elseif (is_array($link) && isset($link[0])) {
+ if (is_object($link[0])) {
+ return spl_object_id($link[0]);
+ } elseif (is_resource($link[0])) {
+ return (int)$link[0];
+ }
}
throw new \RuntimeException('No resource provided');
}
diff --git a/apps/user_ldap/lib/User/Manager.php b/apps/user_ldap/lib/User/Manager.php
index 63af3cf1770..e752b113e3f 100644
--- a/apps/user_ldap/lib/User/Manager.php
+++ b/apps/user_ldap/lib/User/Manager.php
@@ -177,7 +177,7 @@ class Manager {
$this->access->getConnection()->ldapExtStorageHomeAttribute,
];
- $homeRule = $this->access->getConnection()->homeFolderNamingRule;
+ $homeRule = (string)$this->access->getConnection()->homeFolderNamingRule;
if (strpos($homeRule, 'attr:') === 0) {
$attributes[] = substr($homeRule, strlen('attr:'));
}
diff --git a/apps/user_ldap/lib/User/User.php b/apps/user_ldap/lib/User/User.php
index a0955f94bb4..ab1500ff368 100644
--- a/apps/user_ldap/lib/User/User.php
+++ b/apps/user_ldap/lib/User/User.php
@@ -464,9 +464,9 @@ class User {
* bytes), '1234 MB' (quota in MB - check the \OC_Helper::computerFileSize method for more info)
*
* fetches the quota from LDAP and stores it as Nextcloud user value
- * @param string $valueFromLDAP the quota attribute's value can be passed,
+ * @param ?string $valueFromLDAP the quota attribute's value can be passed,
* to save the readAttribute request
- * @return null
+ * @return void
*/
public function updateQuota($valueFromLDAP = null) {
if ($this->wasRefreshed('quota')) {
@@ -487,7 +487,7 @@ class User {
} elseif (is_array($aQuota) && isset($aQuota[0])) {
$this->logger->debug('no suitable LDAP quota found for user ' . $this->uid . ': [' . $aQuota[0] . ']', ['app' => 'user_ldap']);
}
- } elseif ($this->verifyQuotaValue($valueFromLDAP)) {
+ } elseif (!is_null($valueFromLDAP) && $this->verifyQuotaValue($valueFromLDAP)) {
$quota = $valueFromLDAP;
} else {
$this->logger->debug('no suitable LDAP quota found for user ' . $this->uid . ': [' . $valueFromLDAP . ']', ['app' => 'user_ldap']);
@@ -509,7 +509,7 @@ class User {
}
}
- private function verifyQuotaValue($quotaValue) {
+ private function verifyQuotaValue(string $quotaValue) {
return $quotaValue === 'none' || $quotaValue === 'default' || \OC_Helper::computerFileSize($quotaValue) !== false;
}
diff --git a/apps/user_ldap/lib/User_LDAP.php b/apps/user_ldap/lib/User_LDAP.php
index b1d4da9514d..9cd90451ea3 100644
--- a/apps/user_ldap/lib/User_LDAP.php
+++ b/apps/user_ldap/lib/User_LDAP.php
@@ -617,7 +617,7 @@ class User_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn
* The cloned connection needs to be closed manually.
* of the current access.
* @param string $uid
- * @return resource of the LDAP connection
+ * @return resource|\LDAP\Connection The LDAP connection
*/
public function getNewLDAPConnection($uid) {
$connection = clone $this->access->getConnection();
diff --git a/apps/user_ldap/lib/User_Proxy.php b/apps/user_ldap/lib/User_Proxy.php
index 5731f314aed..183c90493cf 100644
--- a/apps/user_ldap/lib/User_Proxy.php
+++ b/apps/user_ldap/lib/User_Proxy.php
@@ -368,7 +368,7 @@ class User_Proxy extends Proxy implements \OCP\IUserBackend, \OCP\UserInterface,
* The connection needs to be closed manually.
*
* @param string $uid
- * @return resource of the LDAP connection
+ * @return resource|\LDAP\Connection The LDAP connection
*/
public function getNewLDAPConnection($uid) {
return $this->handleRequest($uid, 'getNewLDAPConnection', [$uid]);
diff --git a/apps/user_ldap/lib/Wizard.php b/apps/user_ldap/lib/Wizard.php
index 9b037b47134..98d399b77b9 100644
--- a/apps/user_ldap/lib/Wizard.php
+++ b/apps/user_ldap/lib/Wizard.php
@@ -820,7 +820,7 @@ class Wizard extends LDAPUtility {
return false;
}
$er = $this->ldap->firstEntry($cr, $rr);
- while (is_resource($er)) {
+ while ($this->ldap->isResource($er)) {
$this->ldap->getDN($cr, $er);
$attrs = $this->ldap->getAttributes($cr, $er);
$result = [];
@@ -1066,7 +1066,7 @@ class Wizard extends LDAPUtility {
['app' => 'user_ldap']
);
$cr = $this->ldap->connect($host, $port);
- if (!is_resource($cr)) {
+ if (!$this->ldap->isResource($cr)) {
throw new \Exception(self::$l->t('Invalid Host'));
}
@@ -1276,7 +1276,7 @@ class Wizard extends LDAPUtility {
/**
* appends a list of values fr
- * @param resource $result the return value from ldap_get_attributes
+ * @param array $result the return value from ldap_get_attributes
* @param string $attribute the attribute values to look for
* @param array &$known new values will be appended here
* @return int, state on of the class constants LRESULT_PROCESSED_OK,
diff --git a/apps/user_ldap/tests/AccessTest.php b/apps/user_ldap/tests/AccessTest.php
index e1f262165f5..16f79d7819d 100644
--- a/apps/user_ldap/tests/AccessTest.php
+++ b/apps/user_ldap/tests/AccessTest.php
@@ -559,7 +559,7 @@ class AccessTest extends TestCase {
->expects($this->any())
->method('isResource')
->willReturnCallback(function ($resource) {
- return is_resource($resource);
+ return is_resource($resource) || is_object($resource);
});
$this->ldap
->expects($this->any())
diff --git a/apps/user_ldap/tests/Integration/ExceptionOnLostConnection.php b/apps/user_ldap/tests/Integration/ExceptionOnLostConnection.php
index c171fa06b55..fa46f73054c 100644
--- a/apps/user_ldap/tests/Integration/ExceptionOnLostConnection.php
+++ b/apps/user_ldap/tests/Integration/ExceptionOnLostConnection.php
@@ -146,7 +146,7 @@ class ExceptionOnLostConnection {
* tests whether a curl operation ran successfully. If not, an exception
* is thrown
*
- * @param resource $ch
+ * @param resource|\CurlHandle $ch
* @param mixed $result
* @throws \Exception
*/
@@ -182,7 +182,7 @@ class ExceptionOnLostConnection {
/**
* initializes a curl handler towards the toxiproxy LDAP proxy service
- * @return resource
+ * @return resource|\CurlHandle
*/
private function getCurl() {
$ch = curl_init();
diff --git a/lib/private/Updater/ChangesCheck.php b/lib/private/Updater/ChangesCheck.php
index 600c8db9a3c..e3ced6e5b12 100644
--- a/lib/private/Updater/ChangesCheck.php
+++ b/lib/private/Updater/ChangesCheck.php
@@ -138,9 +138,13 @@ class ChangesCheck {
protected function extractData($body):array {
$data = [];
if ($body) {
- $loadEntities = libxml_disable_entity_loader(true);
- $xml = @simplexml_load_string($body);
- libxml_disable_entity_loader($loadEntities);
+ if (\LIBXML_VERSION < 20900) {
+ $loadEntities = libxml_disable_entity_loader(true);
+ $xml = @simplexml_load_string($body);
+ libxml_disable_entity_loader($loadEntities);
+ } else {
+ $xml = @simplexml_load_string($body);
+ }
if ($xml !== false) {
$data['changelogURL'] = (string)$xml->changelog['href'];
$data['whatsNew'] = [];
diff --git a/lib/private/Updater/VersionCheck.php b/lib/private/Updater/VersionCheck.php
index ffa707d8990..d9f795796b8 100644
--- a/lib/private/Updater/VersionCheck.php
+++ b/lib/private/Updater/VersionCheck.php
@@ -95,9 +95,13 @@ class VersionCheck {
}
if ($xml) {
- $loadEntities = libxml_disable_entity_loader(true);
- $data = @simplexml_load_string($xml);
- libxml_disable_entity_loader($loadEntities);
+ if (\LIBXML_VERSION < 20900) {
+ $loadEntities = libxml_disable_entity_loader(true);
+ $data = @simplexml_load_string($xml);
+ libxml_disable_entity_loader($loadEntities);
+ } else {
+ $data = @simplexml_load_string($xml);
+ }
if ($data !== false) {
$tmp['version'] = (string)$data->version;
$tmp['versionstring'] = (string)$data->versionstring;
diff --git a/lib/public/LDAP/ILDAPProvider.php b/lib/public/LDAP/ILDAPProvider.php
index 0355a0052c4..8fad3bd2266 100644
--- a/lib/public/LDAP/ILDAPProvider.php
+++ b/lib/public/LDAP/ILDAPProvider.php
@@ -79,7 +79,7 @@ interface ILDAPProvider {
/**
* Return a new LDAP connection resource for the specified user.
* @param string $uid user id
- * @return resource of the LDAP connection
+ * @return \LDAP\Connection|resource
* @since 11.0.0
*/
public function getLDAPConnection($uid);
@@ -87,7 +87,7 @@ interface ILDAPProvider {
/**
* Return a new LDAP connection resource for the specified group.
* @param string $gid group id
- * @return resource of the LDAP connection
+ * @return \LDAP\Connection|resource
* @since 13.0.0
*/
public function getGroupLDAPConnection($gid);
diff --git a/lib/versioncheck.php b/lib/versioncheck.php
index 4b1d9dec4d7..3e840ff5b46 100644
--- a/lib/versioncheck.php
+++ b/lib/versioncheck.php
@@ -33,10 +33,10 @@ if (PHP_VERSION_ID < 70300) {
exit(1);
}
-// Show warning if > PHP 8.0 is used as Nextcloud is not compatible with > PHP 8.0 for now
-if (PHP_VERSION_ID >= 80100) {
+// Show warning if >= PHP 8.2 is used as Nextcloud is not compatible with >= PHP 8.2 for now
+if (PHP_VERSION_ID >= 80200) {
http_response_code(500);
- echo 'This version of Nextcloud is not compatible with > PHP 8.0.<br/>';
+ echo 'This version of Nextcloud is not compatible with PHP>=8.2.<br/>';
echo 'You are currently running ' . PHP_VERSION . '.';
exit(1);
}
diff --git a/psalm.xml b/psalm.xml
index 4f75af61dde..85ed49c77ee 100644
--- a/psalm.xml
+++ b/psalm.xml
@@ -128,6 +128,9 @@
<referencedClass name="OCA\Talk\Share\Helper\DeletedShareAPIController" />
<!-- Classes from PHP>=8 -->
<referencedClass name="GdImage" />
+ <referencedClass name="LDAP\Connection" />
+ <referencedClass name="LDAP\Result" />
+ <referencedClass name="LDAP\ResultEntry" />
</errorLevel>
</UndefinedDocblockClass>
</issueHandlers>
diff --git a/tests/lib/Archive/ZIPTest.php b/tests/lib/Archive/ZIPTest.php
index 17a639c9f5f..14443471da1 100644
--- a/tests/lib/Archive/ZIPTest.php
+++ b/tests/lib/Archive/ZIPTest.php
@@ -17,6 +17,6 @@ class ZIPTest extends TestBase {
}
protected function getNew() {
- return new ZIP(\OC::$server->getTempManager()->getTemporaryFile('.zip'));
+ return new ZIP(\OC::$server->getTempManager()->getTempBaseDir().'/newArchive.zip');
}
}
diff --git a/tests/lib/Files/ViewTest.php b/tests/lib/Files/ViewTest.php
index eed8bca957f..15c9400864b 100644
--- a/tests/lib/Files/ViewTest.php
+++ b/tests/lib/Files/ViewTest.php
@@ -12,6 +12,7 @@ use OC\Files\Cache\Watcher;
use OC\Files\Filesystem;
use OC\Files\Mount\MountPoint;
use OC\Files\Storage\Common;
+use OC\Files\Storage\Storage;
use OC\Files\Storage\Temporary;
use OC\Files\View;
use OCP\Constants;
@@ -1576,9 +1577,11 @@ class ViewTest extends \Test\TestCase {
private function createTestMovableMountPoints($mountPoints) {
$mounts = [];
foreach ($mountPoints as $mountPoint) {
- $storage = $this->getMockBuilder(Temporary::class)
+ $storage = $this->getMockBuilder(Storage::class)
->setMethods([])
+ ->setConstructorArgs([[]])
->getMock();
+ $storage->method('getId')->willReturn('non-null-id');
$mounts[] = $this->getMockBuilder(TestMoveableMountPoint::class)
->setMethods(['moveMount'])