Merge pull request #24389 from owncloud/login-by-email
Allow login by email address
This commit is contained in:
commit
df2eb96cc4
|
@ -196,6 +196,14 @@ class Principal implements BackendInterface {
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function findByUri($uri, $principalPrefix) {
|
function findByUri($uri, $principalPrefix) {
|
||||||
|
if (substr($uri, 0, 7) === 'mailto:') {
|
||||||
|
$email = substr($uri, 7);
|
||||||
|
$users = $this->userManager->getByEmail($email);
|
||||||
|
if (count($users) === 1) {
|
||||||
|
return $this->principalPrefix . '/' . $users[0]->getUID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -84,6 +84,9 @@ class Server {
|
||||||
|
|
||||||
// acl
|
// acl
|
||||||
$acl = new DavAclPlugin();
|
$acl = new DavAclPlugin();
|
||||||
|
$acl->principalCollectionSet = [
|
||||||
|
'principals/users', 'principals/groups'
|
||||||
|
];
|
||||||
$acl->defaultUsernamePath = 'principals/users';
|
$acl->defaultUsernamePath = 'principals/users';
|
||||||
$this->server->addPlugin($acl);
|
$this->server->addPlugin($acl);
|
||||||
|
|
||||||
|
|
|
@ -255,4 +255,19 @@ class Principal extends TestCase {
|
||||||
public function testSearchPrincipals() {
|
public function testSearchPrincipals() {
|
||||||
$this->assertSame([], $this->connector->searchPrincipals('principals/users', []));
|
$this->assertSame([], $this->connector->searchPrincipals('principals/users', []));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testFindByUri() {
|
||||||
|
$fooUser = $this->getMockBuilder('\OC\User\User')
|
||||||
|
->disableOriginalConstructor()->getMock();
|
||||||
|
$fooUser
|
||||||
|
->expects($this->exactly(1))
|
||||||
|
->method('getUID')
|
||||||
|
->will($this->returnValue('foo'));
|
||||||
|
|
||||||
|
$this->userManager->expects($this->once())->method('getByEmail')->willReturn([
|
||||||
|
$fooUser
|
||||||
|
]);
|
||||||
|
$ret = $this->connector->findByUri('mailto:foo@bar.net', 'principals/users');
|
||||||
|
$this->assertSame('principals/users/foo', $ret);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,11 +40,11 @@ script('core', [
|
||||||
</div>
|
</div>
|
||||||
<p class="grouptop">
|
<p class="grouptop">
|
||||||
<input type="text" name="user" id="user"
|
<input type="text" name="user" id="user"
|
||||||
placeholder="<?php p($l->t('Username')); ?>"
|
placeholder="<?php p($l->t('Username or email')); ?>"
|
||||||
value="<?php p($_['loginName']); ?>"
|
value="<?php p($_['loginName']); ?>"
|
||||||
<?php p($_['user_autofocus'] ? 'autofocus' : ''); ?>
|
<?php p($_['user_autofocus'] ? 'autofocus' : ''); ?>
|
||||||
autocomplete="on" autocapitalize="off" autocorrect="off" required>
|
autocomplete="on" autocapitalize="off" autocorrect="off" required>
|
||||||
<label for="user" class="infield"><?php p($l->t('Username')); ?></label>
|
<label for="user" class="infield"><?php p($l->t('Username or email')); ?></label>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p class="groupbottom">
|
<p class="groupbottom">
|
||||||
|
|
|
@ -152,14 +152,22 @@ class OC_User {
|
||||||
/**
|
/**
|
||||||
* Try to login a user
|
* Try to login a user
|
||||||
*
|
*
|
||||||
* @param string $loginname The login name of the user to log in
|
* @param string $loginName The login name of the user to log in
|
||||||
* @param string $password The password of the user
|
* @param string $password The password of the user
|
||||||
* @return boolean|null
|
* @return boolean|null
|
||||||
*
|
*
|
||||||
* Log in a user and regenerate a new session - if the password is ok
|
* Log in a user and regenerate a new session - if the password is ok
|
||||||
*/
|
*/
|
||||||
public static function login($loginname, $password) {
|
public static function login($loginName, $password) {
|
||||||
$result = self::getUserSession()->login($loginname, $password);
|
|
||||||
|
$result = self::getUserSession()->login($loginName, $password);
|
||||||
|
if (!$result) {
|
||||||
|
$users = \OC::$server->getUserManager()->getByEmail($loginName);
|
||||||
|
// we only allow login by email if unique
|
||||||
|
if (count($users) === 1) {
|
||||||
|
$result = self::getUserSession()->login($users[0]->getUID(), $password);
|
||||||
|
}
|
||||||
|
}
|
||||||
if ($result) {
|
if ($result) {
|
||||||
// Refresh the token
|
// Refresh the token
|
||||||
\OC::$server->getCsrfTokenManager()->refreshToken();
|
\OC::$server->getCsrfTokenManager()->refreshToken();
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
namespace OC\User;
|
namespace OC\User;
|
||||||
|
|
||||||
use OC\Hooks\PublicEmitter;
|
use OC\Hooks\PublicEmitter;
|
||||||
|
use OCP\IUser;
|
||||||
use OCP\IUserBackend;
|
use OCP\IUserBackend;
|
||||||
use OCP\IUserManager;
|
use OCP\IUserManager;
|
||||||
use OCP\IConfig;
|
use OCP\IConfig;
|
||||||
|
@ -354,4 +355,17 @@ class Manager extends PublicEmitter implements IUserManager {
|
||||||
} while (count($users) >= $limit);
|
} while (count($users) >= $limit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $email
|
||||||
|
* @return IUser[]
|
||||||
|
* @since 9.1.0
|
||||||
|
*/
|
||||||
|
public function getByEmail($email) {
|
||||||
|
$userIds = $this->config->getUsersForUserValue('settings', 'email', $email);
|
||||||
|
|
||||||
|
return array_map(function($uid) {
|
||||||
|
return $this->get($uid);
|
||||||
|
}, $userIds);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -142,4 +142,11 @@ interface IUserManager {
|
||||||
* @since 9.0.0
|
* @since 9.0.0
|
||||||
*/
|
*/
|
||||||
public function callForAllUsers (\Closure $callback, $search = '');
|
public function callForAllUsers (\Closure $callback, $search = '');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $email
|
||||||
|
* @return IUser[]
|
||||||
|
* @since 9.1.0
|
||||||
|
*/
|
||||||
|
public function getByEmail($email);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue