Skip to content

Commit b484c3d

Browse files
committed
Do not lowercase User.names, keep the capital letters, but login by name is case-insensitive.
1 parent 5b9bd4c commit b484c3d

4 files changed

Lines changed: 84 additions & 55 deletions

File tree

genesis_core/tests/functional/restapi/iam/test_users.py

Lines changed: 23 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,14 @@ class TestUsers(base.BaseIamResourceTest):
3030

3131
USERS_ENDPOINT = "iam/users"
3232

33-
def test_create_user_success(self, user_api_noauth_client):
33+
@pytest.mark.parametrize("name", ["test", "Spider-Man"])
34+
def test_create_user_success(self, name, user_api_noauth_client):
3435
client = user_api_noauth_client()
3536

36-
user = client.create_user(username="test", password="test")
37+
user = client.create_user(username=name, password="test")
3738

3839
assert user["password"] == "*******"
39-
assert user["username"] == "test"
40+
assert user["username"] == name
4041

4142
def test_create_user_400_error(self, user_api_noauth_client):
4243
client = user_api_noauth_client()
@@ -182,24 +183,16 @@ def test_update_my_user_test1_auth_success(
182183
self, user_api_client, auth_test1_user
183184
):
184185
client = user_api_client(auth_test1_user)
185-
186-
result = client.update_user(
187-
auth_test1_user.uuid,
188-
username="testXXX",
189-
)
190-
191-
assert result["username"] == "testxxx"
186+
name = "testXXX"
187+
result = client.update_user(auth_test1_user.uuid, username=name)
188+
assert result["username"] == name
192189

193190
def test_update_other_user_test1_auth_forbidden(
194191
self, user_api_client, auth_test1_user, auth_test2_user
195192
):
196193
client = user_api_client(auth_test1_user)
197-
198194
with pytest.raises(bazooka_exc.ForbiddenError):
199-
client.update_user(
200-
auth_test2_user.uuid,
201-
username="testXXX",
202-
)
195+
client.update_user(auth_test2_user.uuid, username="testXXX")
203196

204197
def test_update_other_user_test1_auth_access(
205198
self, user_api_client, auth_test1_user, auth_test2_user
@@ -210,13 +203,9 @@ def test_update_other_user_test1_auth_access(
210203
c.PERMISSION_USER_WRITE_ALL,
211204
],
212205
)
213-
214-
result = client.update_user(
215-
auth_test2_user.uuid,
216-
username="testXXX",
217-
)
218-
219-
assert result["username"] == "testxxx"
206+
name = "testXXX"
207+
result = client.update_user(auth_test2_user.uuid, username=name)
208+
assert result["username"] == name
220209

221210
def test_update_my_user_update_password_test1_auth_bad_request(
222211
self, user_api_client, auth_test1_user
@@ -483,28 +472,24 @@ def test_auth_with_login(
483472
def test_auth_case_insensitivity(
484473
self, user_api, auth_test1_user, grant_type, use_email, field_name
485474
):
486-
# Set up email if needed
475+
user = iam_models.User.objects.get_one(
476+
filters={"uuid": auth_test1_user.uuid}
477+
)
478+
user.name = user.name.title()
479+
user.email = "Test1@mail.com"
480+
user.save()
481+
487482
if use_email:
488-
user = iam_models.User.objects.get_one(
489-
filters={"uuid": auth_test1_user.uuid}
490-
)
491-
user.email = "test1@mail.com"
492-
user.save()
493-
email_value = user.email.upper()
483+
login = user.email.upper()
484+
else:
485+
login = auth_test1_user.username.upper()
494486

495487
params = {
496-
"username": "dummy_username",
488+
"username": None,
497489
"password": auth_test1_user.password,
498490
"grant_type": grant_type,
499491
}
500-
if grant_type == c.GRANT_TYPE_PASSWORD_USERNAME:
501-
params[field_name] = auth_test1_user.username.upper()
502-
elif grant_type == c.GRANT_TYPE_PASSWORD_EMAIL:
503-
params[field_name] = email_value
504-
elif grant_type == c.GRANT_TYPE_PASSWORD_LOGIN:
505-
params[field_name] = (
506-
email_value if use_email else auth_test1_user.username.upper()
507-
)
492+
params[field_name] = login
508493

509494
# Test authentication
510495
auth = iam_clients.GenesisCoreAuth(**params)

genesis_core/user_api/iam/dm/models.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1036,20 +1036,22 @@ def get_token_by_password(self, username, **kwargs):
10361036
"""
10371037
Get auth token by username + password (default approach).
10381038
"""
1039-
users_query = User.objects.get_all(
1040-
filters={"name": ra_filters.EQ(username)}
1039+
users_query = User.objects.query(
1040+
where_conditions="LOWER(name) = %s",
1041+
where_values=[username.lower()],
1042+
limit=1,
10411043
)
10421044
return self._get_token_by_password_and_smth(
10431045
users_query=users_query, **kwargs
10441046
)
10451047

1046-
def get_token_by_password_username(self, **kwargs):
1048+
def get_token_by_password_username(self, username, **kwargs):
10471049
"""
10481050
Get auth token by username + password.
10491051
This is just an alias for get_token_by_password_username,
10501052
to ensure consistency.
10511053
"""
1052-
return self.get_token_by_password(**kwargs)
1054+
return self.get_token_by_password(username, **kwargs)
10531055

10541056
def get_token_by_password_email(self, email, **kwargs):
10551057
"""
@@ -1062,7 +1064,7 @@ def get_token_by_password_email(self, email, **kwargs):
10621064
users_query=users_query, **kwargs
10631065
)
10641066

1065-
def get_token_by_password_phone(self, **kwargs):
1067+
def get_token_by_password_phone(self, phone, **kwargs):
10661068
"""
10671069
Get auth token by phone + password.
10681070
Will be added later.
@@ -1077,12 +1079,10 @@ def get_token_by_password_login(self, login, **kwargs):
10771079
- by username (if no "@")
10781080
- by phone [to be done later]
10791081
"""
1080-
lookup_field = "email" if "@" in login else "name"
1081-
filters = {lookup_field: ra_filters.EQ(login)}
1082-
users_query = User.objects.get_all(filters=filters)
1083-
return self._get_token_by_password_and_smth(
1084-
users_query=users_query, **kwargs
1085-
)
1082+
if "@" in login:
1083+
return self.get_token_by_password_email(login, **kwargs)
1084+
else:
1085+
return self.get_token_by_password_username(login, **kwargs)
10861086

10871087
def get_token_by_refresh_token(self, refresh_token, scope=None):
10881088
context = contexts.get_context()

genesis_core/user_api/iam/dm/types.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,6 @@ def min_length(self):
3838
def max_length(self):
3939
return self._max_length
4040

41-
def to_simple_type(self, value):
42-
return value.lower()
43-
44-
def from_simple_type(self, value):
45-
return value.lower()
46-
4741
def from_unicode(self, value):
4842
return self.from_simple_type(value)
4943

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# Copyright 2016 Eugene Frolov <eugene@frolov.net.ru>
2+
#
3+
# All Rights Reserved.
4+
#
5+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
6+
# not use this file except in compliance with the License. You may obtain
7+
# a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing, software
12+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14+
# License for the specific language governing permissions and limitations
15+
# under the License.
16+
17+
from restalchemy.storage.sql import migrations
18+
19+
20+
class MigrationStep(migrations.AbstarctMigrationStep):
21+
22+
def __init__(self):
23+
self._depends = ["0023-nullable_fio-c9cb3a.py"]
24+
25+
@property
26+
def migration_id(self):
27+
return "41f4b995-d237-4b89-bec9-046a50de8d27"
28+
29+
@property
30+
def is_manual(self):
31+
return False
32+
33+
def upgrade(self, session):
34+
expression = """
35+
DROP INDEX IF EXISTS iam_users_name_idx;
36+
CREATE UNIQUE INDEX iam_users_name_lower_idx ON iam_users (
37+
LOWER(name)
38+
);
39+
"""
40+
session.execute(expression)
41+
42+
def downgrade(self, session):
43+
expression = """
44+
DROP INDEX IF EXISTS iam_users_name_lower_idx;
45+
CREATE UNIQUE INDEX iam_users_name_idx ON iam_users (name);
46+
"""
47+
session.execute(expression)
48+
49+
50+
migration_step = MigrationStep()

0 commit comments

Comments
 (0)