1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-01 07:01:12 +00:00

[api2] Support username login

This commit is contained in:
zhengxie
2015-11-10 14:07:56 +08:00
parent b316c4decc
commit 238d3d28d4
3 changed files with 63 additions and 9 deletions

View File

@@ -1,11 +1,9 @@
import re
from rest_framework import serializers from rest_framework import serializers
from seahub.auth import authenticate from seahub.auth import authenticate
from seahub.api2.models import Token, TokenV2, DESKTOP_PLATFORMS from seahub.api2.models import Token, TokenV2, DESKTOP_PLATFORMS
from seahub.api2.utils import get_token_v1, get_token_v2 from seahub.api2.utils import get_token_v1, get_token_v2
from seahub.utils import is_valid_username from seahub.profile.models import Profile
def all_none(values): def all_none(values):
for value in values: for value in values:
@@ -35,7 +33,7 @@ class AuthTokenSerializer(serializers.Serializer):
platform_version = serializers.CharField(required=False) platform_version = serializers.CharField(required=False)
def validate(self, attrs): def validate(self, attrs):
username = attrs.get('username') login_id = attrs.get('username')
password = attrs.get('password') password = attrs.get('password')
platform = attrs.get('platform', None) platform = attrs.get('platform', None)
@@ -54,10 +52,9 @@ class AuthTokenSerializer(serializers.Serializer):
else: else:
raise serializers.ValidationError('invalid params') raise serializers.ValidationError('invalid params')
# first check username and password username = Profile.objects.get_username_by_login_id(login_id)
if username: if username is None:
if not is_valid_username(username): username = login_id
raise serializers.ValidationError('username is not valid.')
if username and password: if username and password:
user = authenticate(username=username, password=password) user = authenticate(username=username, password=password)

View File

@@ -47,6 +47,9 @@ class ProfileManager(models.Manager):
def get_username_by_login_id(self, login_id): def get_username_by_login_id(self, login_id):
"""Convert a user's login id to username(login email). """Convert a user's login id to username(login email).
""" """
if not login_id:
return None
try: try:
return super(ProfileManager, self).get(login_id=login_id).user return super(ProfileManager, self).get(login_id=login_id).user
except Profile.DoesNotExist: except Profile.DoesNotExist:
@@ -55,7 +58,7 @@ class ProfileManager(models.Manager):
def get_user_language(self, username): def get_user_language(self, username):
"""Get user's language from profile. Return default language code if """Get user's language from profile. Return default language code if
user has no preferred language. user has no preferred language.
Arguments: Arguments:
- `self`: - `self`:
- `username`: - `username`:

View File

@@ -0,0 +1,54 @@
import json
from seahub.profile.models import Profile
from seahub.test_utils import BaseTestCase
from .urls import TOKEN_URL
class ObtainAuthTokenTest(BaseTestCase):
def setUp(self):
self.p = Profile.objects.add_or_update(self.user.username, '', '')
self.p.login_id = 'test_login_id'
self.p.save()
def test_correct_email_passwd(self):
resp = self.client.post(TOKEN_URL, {
'username': self.user.username,
'password': self.user_password,
})
json_resp = json.loads(resp.content)
assert json_resp['token'] is not None
assert len(json_resp['token']) == 40
def test_correct_loginID_password(self):
resp = self.client.post(TOKEN_URL, {
'username': self.p.login_id,
'password': self.user_password,
})
json_resp = json.loads(resp.content)
assert json_resp['token'] is not None
assert len(json_resp['token']) == 40
def test_invalid_password(self):
resp = self.client.post(TOKEN_URL, {
'username': self.user.username,
'password': 'random_password',
})
self.assertEqual(400, resp.status_code)
json_resp = json.loads(resp.content)
assert json_resp['non_field_errors'] == ['Unable to login with provided credentials.']
def test_empty_login_id(self):
self.p.login_id = ""
self.p.save()
resp = self.client.post(TOKEN_URL, {
'username': self.p.login_id,
'password': self.user_password,
})
self.assertEqual(400, resp.status_code)
json_resp = json.loads(resp.content)
assert json_resp['non_field_errors'] == ['Must include "username" and "password"']