Skip to content

Commit dcca83e

Browse files
committed
fix(user_ldap): allow editing profile fields not managed by LDAP
canEditProperty() was returning true (editable) when an LDAP attribute was configured for a field, and false when no attribute was configured. This is inverted: a field with an LDAP attribute mapping is owned by LDAP and should not be user-editable, while a field with no mapping is not sourced from LDAP and the user should be free to set it themselves. Fixes profile fields being uneditable for all LDAP users whose admin has not configured attribute mappings for those fields. Assisted-by: ClaudeCode:claude-sonnet-4-6 Signed-off-by: Anna Larch <anna@nextcloud.com>
1 parent 58be173 commit dcca83e

2 files changed

Lines changed: 44 additions & 11 deletions

File tree

apps/user_ldap/lib/User_LDAP.php

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -690,17 +690,17 @@ public function canEditProperty(string $uid, string $property): bool {
690690
return match($property) {
691691
// Display name is always set by LDAP
692692
IAccountManager::PROPERTY_DISPLAYNAME => false,
693-
IAccountManager::PROPERTY_EMAIL => ((string)$this->access->connection->ldapEmailAttribute !== ''),
694-
IAccountManager::PROPERTY_PHONE => ((string)$this->access->connection->ldapAttributePhone !== ''),
695-
IAccountManager::PROPERTY_WEBSITE => ((string)$this->access->connection->ldapAttributeWebsite !== ''),
696-
IAccountManager::PROPERTY_ADDRESS => ((string)$this->access->connection->ldapAttributeAddress !== ''),
697-
IAccountManager::PROPERTY_FEDIVERSE => ((string)$this->access->connection->ldapAttributeFediverse !== ''),
698-
IAccountManager::PROPERTY_ORGANISATION => ((string)$this->access->connection->ldapAttributeOrganisation !== ''),
699-
IAccountManager::PROPERTY_ROLE => ((string)$this->access->connection->ldapAttributeRole !== ''),
700-
IAccountManager::PROPERTY_HEADLINE => ((string)$this->access->connection->ldapAttributeHeadline !== ''),
701-
IAccountManager::PROPERTY_BIOGRAPHY => ((string)$this->access->connection->ldapAttributeBiography !== ''),
702-
IAccountManager::PROPERTY_BIRTHDATE => ((string)$this->access->connection->ldapAttributeBirthDate !== ''),
703-
IAccountManager::PROPERTY_PRONOUNS => ((string)$this->access->connection->ldapAttributePronouns !== ''),
693+
IAccountManager::PROPERTY_EMAIL => ((string)$this->access->connection->ldapEmailAttribute === ''),
694+
IAccountManager::PROPERTY_PHONE => ((string)$this->access->connection->ldapAttributePhone === ''),
695+
IAccountManager::PROPERTY_WEBSITE => ((string)$this->access->connection->ldapAttributeWebsite === ''),
696+
IAccountManager::PROPERTY_ADDRESS => ((string)$this->access->connection->ldapAttributeAddress === ''),
697+
IAccountManager::PROPERTY_FEDIVERSE => ((string)$this->access->connection->ldapAttributeFediverse === ''),
698+
IAccountManager::PROPERTY_ORGANISATION => ((string)$this->access->connection->ldapAttributeOrganisation === ''),
699+
IAccountManager::PROPERTY_ROLE => ((string)$this->access->connection->ldapAttributeRole === ''),
700+
IAccountManager::PROPERTY_HEADLINE => ((string)$this->access->connection->ldapAttributeHeadline === ''),
701+
IAccountManager::PROPERTY_BIOGRAPHY => ((string)$this->access->connection->ldapAttributeBiography === ''),
702+
IAccountManager::PROPERTY_BIRTHDATE => ((string)$this->access->connection->ldapAttributeBirthDate === ''),
703+
IAccountManager::PROPERTY_PRONOUNS => ((string)$this->access->connection->ldapAttributePronouns === ''),
704704
default => true,
705705
};
706706
}

apps/user_ldap/tests/User_LDAPTest.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1460,4 +1460,37 @@ public function testImplementsAction(string $configurable, string|int $value, in
14601460

14611461
$this->assertSame($expected, $this->backend->implementsActions($actionCode));
14621462
}
1463+
1464+
public static function canEditPropertyProvider(): array {
1465+
return [
1466+
// Display name is always managed by LDAP
1467+
[\OCP\Accounts\IAccountManager::PROPERTY_DISPLAYNAME, '', false],
1468+
[\OCP\Accounts\IAccountManager::PROPERTY_DISPLAYNAME, 'cn', false],
1469+
// Fields with no LDAP attribute configured are user-editable
1470+
[\OCP\Accounts\IAccountManager::PROPERTY_EMAIL, '', true],
1471+
[\OCP\Accounts\IAccountManager::PROPERTY_PHONE, '', true],
1472+
[\OCP\Accounts\IAccountManager::PROPERTY_WEBSITE, '', true],
1473+
[\OCP\Accounts\IAccountManager::PROPERTY_ADDRESS, '', true],
1474+
[\OCP\Accounts\IAccountManager::PROPERTY_FEDIVERSE, '', true],
1475+
[\OCP\Accounts\IAccountManager::PROPERTY_ORGANISATION, '', true],
1476+
[\OCP\Accounts\IAccountManager::PROPERTY_ROLE, '', true],
1477+
[\OCP\Accounts\IAccountManager::PROPERTY_HEADLINE, '', true],
1478+
[\OCP\Accounts\IAccountManager::PROPERTY_BIOGRAPHY, '', true],
1479+
[\OCP\Accounts\IAccountManager::PROPERTY_BIRTHDATE, '', true],
1480+
[\OCP\Accounts\IAccountManager::PROPERTY_PRONOUNS, '', true],
1481+
// Fields with an LDAP attribute configured are managed by LDAP, not user-editable
1482+
[\OCP\Accounts\IAccountManager::PROPERTY_EMAIL, 'mail', false],
1483+
[\OCP\Accounts\IAccountManager::PROPERTY_PHONE, 'telephoneNumber', false],
1484+
[\OCP\Accounts\IAccountManager::PROPERTY_WEBSITE, 'labeledURI', false],
1485+
];
1486+
}
1487+
1488+
#[\PHPUnit\Framework\Attributes\DataProvider(methodName: 'canEditPropertyProvider')]
1489+
public function testCanEditProperty(string $property, string $ldapAttributeValue, bool $expected): void {
1490+
$this->connection->expects($this->any())
1491+
->method('__get')
1492+
->willReturn($ldapAttributeValue);
1493+
1494+
$this->assertSame($expected, $this->backend->canEditProperty('uid', $property));
1495+
}
14631496
}

0 commit comments

Comments
 (0)