Skip to content

Commit 6d8304c

Browse files
author
electis
committed
ValidateMixin, validate password
1 parent aa6f563 commit 6d8304c

3 files changed

Lines changed: 47 additions & 6 deletions

File tree

genesis_core/tests/functional/conftest.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ def auth_test1_user(
134134
default_client_id: str,
135135
default_client_secret: str,
136136
):
137-
password = "test1"
137+
password = "test1test"
138138
client = user_api_client(auth_user_admin)
139139
user = client.create_user(username="test1", password=password)
140140
user_obj = iam_models.User.objects.get_one(filters={"uuid": user["uuid"]})
@@ -162,7 +162,7 @@ def auth_test2_user(
162162
default_client_id: str,
163163
default_client_secret: str,
164164
):
165-
password = "test2"
165+
password = "test2test"
166166
client = user_api_client(auth_user_admin)
167167
user = client.create_user(username="test2", password=password)
168168
user_obj = iam_models.User.objects.get_one(filters={"uuid": user["uuid"]})
@@ -190,7 +190,7 @@ def auth_test1_p1_user(
190190
default_client_id: str,
191191
default_client_secret: str,
192192
):
193-
password = "test1p1"
193+
password = "testtest1p1"
194194
client = user_api_client(auth_user_admin)
195195
user = client.create_user(username="test1p1", password=password)
196196
user_obj = iam_models.User.objects.get_one(filters={"uuid": user["uuid"]})
@@ -239,7 +239,7 @@ def auth_test2_p1_user(
239239
default_client_id: str,
240240
default_client_secret: str,
241241
):
242-
password = "test2p1"
242+
password = "testtest2p1"
243243
client = user_api_client(auth_user_admin)
244244
user = client.create_user(username="test2p1", password=password)
245245
user_obj = iam_models.User.objects.get_one(filters={"uuid": user["uuid"]})

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class TestUsers(base.BaseIamResourceTest):
3333
def test_create_user_success(self, user_api_noauth_client):
3434
client = user_api_noauth_client()
3535

36-
user = client.create_user(username="test", password="test")
36+
user = client.create_user(username="test", password="testtest")
3737

3838
assert user["password"] == "*******"
3939
assert user["username"] == "test"
@@ -43,6 +43,10 @@ def test_create_user_400_error(self, user_api_noauth_client):
4343

4444
with pytest.raises(bazooka_exc.BadRequestError):
4545
client.create_user(username="", password="test")
46+
with pytest.raises(bazooka_exc.BadRequestError):
47+
client.create_user(username="test400", password="test")
48+
with pytest.raises(bazooka_exc.BadRequestError):
49+
client.create_user(username="test400", password="test test")
4650

4751
def test_create_user_space_login_400_error(self, user_api_noauth_client):
4852
client = user_api_noauth_client()

genesis_core/user_api/iam/api/controllers.py

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import errno
1818
from os import path as os_path
1919
import mimetypes
20+
import re
21+
import string
2022
from urllib import parse as urllib_parse
2123

2224
from authlib.integrations import requests_client
@@ -45,6 +47,37 @@ def enforce(self, rule, do_raise=False, exc=None):
4547
return iam.enforcer.enforce(rule, do_raise, exc)
4648

4749

50+
class ValidateMixin:
51+
min_length = 8
52+
not_contain: str = string.whitespace
53+
must_contain: list[str] = None # [digits, ascii_uppercase, punctuation]
54+
regex: str = None
55+
56+
def validate(self, value):
57+
error = None
58+
if value is None:
59+
error = "Value is required"
60+
elif self.min_length and len(value) < self.min_length:
61+
error = f"Value must be at least {self.min_length} characters long"
62+
elif self.not_contain and set(self.not_contain) & set(value):
63+
error = f"Value must not contain {self.not_contain}"
64+
elif self.must_contain:
65+
for required in self.must_contain:
66+
if not set(required) & set(value):
67+
error = f"Value must contain one of {required}"
68+
break
69+
elif self.regex and not re.match(self.regex, value):
70+
error = f"Value must match regex {self.regex}"
71+
if error:
72+
exc = ValidationErrorException()
73+
exc.message = error
74+
raise exc
75+
76+
def validate_secret(self, kwargs: dict):
77+
if "secret" in kwargs:
78+
self.validate(kwargs["secret"])
79+
80+
4881
class IamController(controllers.RoutesListController):
4982

5083
__TARGET_PATH__ = "/v1/iam/"
@@ -69,7 +102,7 @@ def _get_app_endpoint(req):
69102

70103

71104
class UserController(
72-
controllers.BaseResourceControllerPaginated, EnforceMixin
105+
controllers.BaseResourceControllerPaginated, EnforceMixin, ValidateMixin
73106
):
74107
__resource__ = resources.ResourceByModelWithCustomProps(
75108
models.User,
@@ -119,6 +152,7 @@ class UserController(
119152
)
120153

121154
def create(self, **kwargs):
155+
self.validate_secret(kwargs)
122156
kwargs.pop("email_verified", None)
123157
user = super().create(**kwargs)
124158
app_endpoint = _get_app_endpoint(req=self._req)
@@ -132,6 +166,7 @@ def filter(self, filters, **kwargs):
132166
return super().filter(filters, **kwargs)
133167

134168
def update(self, uuid, **kwargs):
169+
self.validate_secret(kwargs)
135170
kwargs.pop("email_verified", None)
136171
is_me = models.User.me().uuid == uuid
137172
if self.enforce(c.PERMISSION_USER_WRITE_ALL) or is_me:
@@ -154,6 +189,7 @@ def delete(self, uuid):
154189

155190
@actions.post
156191
def change_password(self, resource, old_password, new_password):
192+
self.validate(new_password)
157193
is_me = models.User.me() == resource
158194
if self.enforce(c.PERMISSION_USER_WRITE_ALL) or is_me:
159195
resource.change_secret_safe(
@@ -237,6 +273,7 @@ def confirm_email(self, resource, code=None):
237273
def reset_password(self, resource, new_password=None, code=None):
238274
code = code or self._req.params.get("code")
239275
new_secret = new_password or self._req.params.get("new_password")
276+
self.validate(new_secret)
240277
resource.reset_secret_by_code(
241278
new_secret=new_secret,
242279
code=code,

0 commit comments

Comments
 (0)