summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLukas Reschke <lukas@statuscode.ch>2016-05-03 13:44:38 +0200
committerLukas Reschke <lukas@statuscode.ch>2016-05-03 13:44:38 +0200
commitdf2eb96cc40893f60a1b63abbe585c448e0a6d9f (patch)
tree5d9d118788fbe3b2bbc054d090764c88c145bcec
parent06293783e0d291a5595b55a3268d8bc0704277db (diff)
parent7aca13f14c2974a5e3f78cff628209c3964aaf04 (diff)
downloadnextcloud-server-df2eb96cc40893f60a1b63abbe585c448e0a6d9f.tar.gz
nextcloud-server-df2eb96cc40893f60a1b63abbe585c448e0a6d9f.zip
Merge pull request #24389 from owncloud/login-by-email
Allow login by email address
-rw-r--r--apps/dav/lib/connector/sabre/principal.php8
-rw-r--r--apps/dav/lib/server.php3
-rw-r--r--apps/dav/tests/unit/connector/sabre/principal.php15
-rw-r--r--core/templates/login.php4
-rw-r--r--lib/private/legacy/user.php14
-rw-r--r--lib/private/user/manager.php14
-rw-r--r--lib/public/iusermanager.php7
7 files changed, 60 insertions, 5 deletions
diff --git a/apps/dav/lib/connector/sabre/principal.php b/apps/dav/lib/connector/sabre/principal.php
index 18f28a916f1..787bcdf469b 100644
--- a/apps/dav/lib/connector/sabre/principal.php
+++ b/apps/dav/lib/connector/sabre/principal.php
@@ -196,6 +196,14 @@ class Principal implements BackendInterface {
* @return string
*/
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 '';
}
diff --git a/apps/dav/lib/server.php b/apps/dav/lib/server.php
index 73e24c9a292..edaa7ac8552 100644
--- a/apps/dav/lib/server.php
+++ b/apps/dav/lib/server.php
@@ -84,6 +84,9 @@ class Server {
// acl
$acl = new DavAclPlugin();
+ $acl->principalCollectionSet = [
+ 'principals/users', 'principals/groups'
+ ];
$acl->defaultUsernamePath = 'principals/users';
$this->server->addPlugin($acl);
diff --git a/apps/dav/tests/unit/connector/sabre/principal.php b/apps/dav/tests/unit/connector/sabre/principal.php
index 1747885240a..75076e9618b 100644
--- a/apps/dav/tests/unit/connector/sabre/principal.php
+++ b/apps/dav/tests/unit/connector/sabre/principal.php
@@ -255,4 +255,19 @@ class Principal extends TestCase {
public function testSearchPrincipals() {
$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);
+ }
}
diff --git a/core/templates/login.php b/core/templates/login.php
index 8405bac6890..86c186928cc 100644
--- a/core/templates/login.php
+++ b/core/templates/login.php
@@ -40,11 +40,11 @@ script('core', [
</div>
<p class="grouptop">
<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']); ?>"
<?php p($_['user_autofocus'] ? 'autofocus' : ''); ?>
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 class="groupbottom">
diff --git a/lib/private/legacy/user.php b/lib/private/legacy/user.php
index 11c35daa0de..78eb4bab126 100644
--- a/lib/private/legacy/user.php
+++ b/lib/private/legacy/user.php
@@ -152,14 +152,22 @@ class OC_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
* @return boolean|null
*
* Log in a user and regenerate a new session - if the password is ok
*/
- public static function login($loginname, $password) {
- $result = self::getUserSession()->login($loginname, $password);
+ public static function 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) {
// Refresh the token
\OC::$server->getCsrfTokenManager()->refreshToken();
diff --git a/lib/private/user/manager.php b/lib/private/user/manager.php
index 4371be134aa..37a3e5ba134 100644
--- a/lib/private/user/manager.php
+++ b/lib/private/user/manager.php
@@ -33,6 +33,7 @@
namespace OC\User;
use OC\Hooks\PublicEmitter;
+use OCP\IUser;
use OCP\IUserBackend;
use OCP\IUserManager;
use OCP\IConfig;
@@ -354,4 +355,17 @@ class Manager extends PublicEmitter implements IUserManager {
} 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);
+ }
}
diff --git a/lib/public/iusermanager.php b/lib/public/iusermanager.php
index 6442938a99b..00c0bbc8721 100644
--- a/lib/public/iusermanager.php
+++ b/lib/public/iusermanager.php
@@ -142,4 +142,11 @@ interface IUserManager {
* @since 9.0.0
*/
public function callForAllUsers (\Closure $callback, $search = '');
+
+ /**
+ * @param string $email
+ * @return IUser[]
+ * @since 9.1.0
+ */
+ public function getByEmail($email);
}