Skip to content

Commit 5ae1ddc

Browse files
authored
User: Make email required at all times, password required for new users (#10938)
* User: Make email required at all times, password required for new users * fix tests * update tests
1 parent 8bc624d commit 5ae1ddc

6 files changed

Lines changed: 32 additions & 12 deletions

File tree

dojo/api_v2/serializers.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,7 @@ class Meta:
429429
class UserSerializer(serializers.ModelSerializer):
430430
date_joined = serializers.DateTimeField(read_only=True)
431431
last_login = serializers.DateTimeField(read_only=True, allow_null=True)
432+
email = serializers.EmailField(required=True)
432433
password = serializers.CharField(
433434
write_only=True,
434435
style={"input_type": "password"},
@@ -549,12 +550,12 @@ def validate(self, data):
549550
msg = "Only superusers are allowed to add or edit superusers."
550551
raise ValidationError(msg)
551552

552-
if (
553-
self.context["request"].method in ["PATCH", "PUT"]
554-
and "password" in data
555-
):
553+
if self.context["request"].method in ["PATCH", "PUT"] and "password" in data:
556554
msg = "Update of password though API is not allowed"
557555
raise ValidationError(msg)
556+
if self.context["request"].method == "POST" and "password" not in data:
557+
msg = "Passwords must be supplied for new users"
558+
raise ValidationError(msg)
558559
else:
559560
return super().validate(data)
560561

dojo/forms.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2168,8 +2168,9 @@ def clean(self):
21682168

21692169

21702170
class AddDojoUserForm(forms.ModelForm):
2171+
email = forms.EmailField(required=True)
21712172
password = forms.CharField(widget=forms.PasswordInput,
2172-
required=False,
2173+
required=True,
21732174
validators=[validate_password],
21742175
help_text="")
21752176

@@ -2186,6 +2187,7 @@ def __init__(self, *args, **kwargs):
21862187

21872188

21882189
class EditDojoUserForm(forms.ModelForm):
2190+
email = forms.EmailField(required=True)
21892191

21902192
class Meta:
21912193
model = Dojo_User

tests/user_test.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ def test_create_user_with_writer_global_role(self):
5959
# username
6060
driver.find_element(By.ID, "id_username").clear()
6161
driver.find_element(By.ID, "id_username").send_keys("userWriter")
62+
# password
63+
driver.find_element(By.ID, "id_password").clear()
64+
driver.find_element(By.ID, "id_password").send_keys("Def3ctD0jo&")
6265
# First Name
6366
driver.find_element(By.ID, "id_first_name").clear()
6467
driver.find_element(By.ID, "id_first_name").send_keys("Writer")

unittests/test_apiv2_notifications.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ def create_test_user(self):
3333
password = "testTEST1234!@#$"
3434
r = self.client.post(reverse("user-list"), {
3535
"username": "api-user-notification",
36+
"email": "admin@dojo.com",
3637
"password": password,
3738
}, format="json")
3839
return r.json()["id"]

unittests/test_apiv2_user.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,11 @@ def test_user_list(self):
2626
self.assertNotIn(item, user, r.content[:1000])
2727

2828
def test_user_add(self):
29-
# simple user without password
30-
r = self.client.post(reverse("user-list"), {
31-
"username": "api-user-1",
32-
}, format="json")
33-
self.assertEqual(r.status_code, 201, r.content[:1000])
34-
3529
# user with good password
3630
password = "testTEST1234!@#$"
3731
r = self.client.post(reverse("user-list"), {
3832
"username": "api-user-2",
33+
"email": "admin@dojo.com",
3934
"password": password,
4035
}, format="json")
4136
self.assertEqual(r.status_code, 201, r.content[:1000])
@@ -50,6 +45,7 @@ def test_user_add(self):
5045
# user with weak password
5146
r = self.client.post(reverse("user-list"), {
5247
"username": "api-user-3",
48+
"email": "admin@dojo.com",
5349
"password": "weakPassword",
5450
}, format="json")
5551
self.assertEqual(r.status_code, 400, r.content[:1000])
@@ -59,30 +55,36 @@ def test_user_change_password(self):
5955
# some user
6056
r = self.client.post(reverse("user-list"), {
6157
"username": "api-user-4",
58+
"email": "admin@dojo.com",
59+
"password": "testTEST1234!@#$",
6260
}, format="json")
6361
self.assertEqual(r.status_code, 201, r.content[:1000])
6462
user_id = r.json()["id"]
6563

6664
r = self.client.put("{}{}/".format(reverse("user-list"), user_id), {
6765
"username": "api-user-4",
6866
"first_name": "first",
67+
"email": "admin@dojo.com",
6968
}, format="json")
7069
self.assertEqual(r.status_code, 200, r.content[:1000])
7170

7271
r = self.client.patch("{}{}/".format(reverse("user-list"), user_id), {
7372
"last_name": "last",
73+
"email": "admin@dojo.com",
7474
}, format="json")
7575
self.assertEqual(r.status_code, 200, r.content[:1000])
7676

7777
r = self.client.put("{}{}/".format(reverse("user-list"), user_id), {
7878
"username": "api-user-4",
79+
"email": "admin@dojo.com",
7980
"password": "testTEST1234!@#$",
8081
}, format="json")
8182
self.assertEqual(r.status_code, 400, r.content[:1000])
8283
self.assertIn("Update of password though API is not allowed", r.content.decode("utf-8"))
8384

8485
r = self.client.patch("{}{}/".format(reverse("user-list"), user_id), {
8586
"password": "testTEST1234!@#$",
87+
"email": "admin@dojo.com",
8688
}, format="json")
8789
self.assertEqual(r.status_code, 400, r.content[:1000])
8890
self.assertIn("Update of password though API is not allowed", r.content.decode("utf-8"))

unittests/test_rest_framework.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1699,8 +1699,19 @@ def __init__(self, *args, **kwargs):
16991699
self.deleted_objects = 25
17001700
BaseClass.RESTEndpointTest.__init__(self, *args, **kwargs)
17011701

1702+
def test_create(self):
1703+
payload = self.payload.copy() | {
1704+
"password": "testTEST1234!@#$",
1705+
}
1706+
length = self.endpoint_model.objects.count()
1707+
response = self.client.post(self.url, payload)
1708+
self.assertEqual(201, response.status_code, response.content[:1000])
1709+
self.assertEqual(self.endpoint_model.objects.count(), length + 1)
1710+
17021711
def test_create_user_with_non_configuration_permissions(self):
1703-
payload = self.payload.copy()
1712+
payload = self.payload.copy() | {
1713+
"password": "testTEST1234!@#$",
1714+
}
17041715
payload["configuration_permissions"] = [25, 26] # these permissions exist but user can not assign them becaause they are not "configuration_permissions"
17051716
response = self.client.post(self.url, payload)
17061717
self.assertEqual(response.status_code, 400)

0 commit comments

Comments
 (0)