Skip to content

Commit e2e038c

Browse files
authored
fix: Make attendee info editable only by admin or that user itself (#7108)
1 parent 289cd58 commit e2e038c

File tree

2 files changed

+79
-28
lines changed

2 files changed

+79
-28
lines changed

app/api/attendees.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,12 @@ def before_update_object(self, obj, data, kwargs):
207207
:return:
208208
"""
209209
order = safe_query_by_id(Order, obj.order_id)
210+
211+
if not (current_user.is_staff or current_user.id == order.user_id):
212+
raise ForbiddenError(
213+
'Only admin or that user itself can update attendee info',
214+
)
215+
210216
if order.status != 'initializing':
211217
raise UnprocessableEntityError(
212218
{'pointer': '/data/id'},

tests/all/integration/api/attendee/test_attendee_api.py

Lines changed: 73 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@
66
from tests.factories.ticket import TicketSubFactory
77

88

9-
def get_minimal_attendee(db):
9+
def get_minimal_attendee(db, user):
1010
attendee = AttendeeOrderTicketSubFactory(
11-
email=None, address=None, city=None, state=None, country=None
11+
email=None, address=None, city=None, state=None, country=None, order__user=user
1212
)
1313
db.session.commit()
1414

1515
return attendee
1616

1717

18-
def test_edit_attendee_minimum_fields(db, client, jwt):
19-
attendee = get_minimal_attendee(db)
18+
def test_edit_attendee_minimum_fields(db, client, jwt, user):
19+
attendee = get_minimal_attendee(db, user)
2020

2121
data = json.dumps(
2222
{
@@ -41,8 +41,8 @@ def test_edit_attendee_minimum_fields(db, client, jwt):
4141
assert attendee.lastname == 'Jamal'
4242

4343

44-
def get_simple_custom_form_attendee(db):
45-
attendee = get_minimal_attendee(db)
44+
def get_simple_custom_form_attendee(db, user):
45+
attendee = get_minimal_attendee(db, user)
4646
CustomForms(
4747
event=attendee.event,
4848
form='attendee',
@@ -64,8 +64,8 @@ def get_simple_custom_form_attendee(db):
6464
return attendee
6565

6666

67-
def test_edit_attendee_required_fields_missing(db, client, jwt):
68-
attendee = get_simple_custom_form_attendee(db)
67+
def test_edit_attendee_required_fields_missing(db, client, jwt, user):
68+
attendee = get_simple_custom_form_attendee(db, user)
6969

7070
data = json.dumps(
7171
{
@@ -108,8 +108,8 @@ def test_edit_attendee_required_fields_missing(db, client, jwt):
108108
assert attendee.email is None
109109

110110

111-
def test_edit_attendee_required_fields_complete(db, client, jwt):
112-
attendee = get_simple_custom_form_attendee(db)
111+
def test_edit_attendee_required_fields_complete(db, client, jwt, user):
112+
attendee = get_simple_custom_form_attendee(db, user)
113113

114114
data = json.dumps(
115115
{
@@ -147,8 +147,8 @@ def test_edit_attendee_required_fields_complete(db, client, jwt):
147147
assert attendee.complex_field_values is None
148148

149149

150-
def get_complex_custom_form_attendee(db):
151-
attendee = get_minimal_attendee(db)
150+
def get_complex_custom_form_attendee(db, user):
151+
attendee = get_minimal_attendee(db, user)
152152
CustomForms(
153153
event=attendee.event,
154154
form='attendee',
@@ -182,8 +182,8 @@ def get_complex_custom_form_attendee(db):
182182
return attendee
183183

184184

185-
def test_custom_form_complex_fields_missing_required(db, client, jwt):
186-
attendee = get_complex_custom_form_attendee(db)
185+
def test_custom_form_complex_fields_missing_required(db, client, jwt, user):
186+
attendee = get_complex_custom_form_attendee(db, user)
187187

188188
data = json.dumps(
189189
{
@@ -222,8 +222,8 @@ def test_custom_form_complex_fields_missing_required(db, client, jwt):
222222
assert attendee.complex_field_values is None
223223

224224

225-
def test_custom_form_complex_fields_missing_required_one(db, client, jwt):
226-
attendee = get_complex_custom_form_attendee(db)
225+
def test_custom_form_complex_fields_missing_required_one(db, client, jwt, user):
226+
attendee = get_complex_custom_form_attendee(db, user)
227227

228228
data = json.dumps(
229229
{
@@ -267,8 +267,8 @@ def test_custom_form_complex_fields_missing_required_one(db, client, jwt):
267267
assert attendee.complex_field_values is None
268268

269269

270-
def test_custom_form_complex_fields_complete(db, client, jwt):
271-
attendee = get_complex_custom_form_attendee(db)
270+
def test_custom_form_complex_fields_complete(db, client, jwt, user):
271+
attendee = get_complex_custom_form_attendee(db, user)
272272

273273
data = json.dumps(
274274
{
@@ -302,9 +302,9 @@ def test_custom_form_complex_fields_complete(db, client, jwt):
302302
assert attendee.complex_field_values['best_friend'] == 'Tester'
303303

304304

305-
def test_ignore_complex_custom_form_fields(db, client, jwt):
305+
def test_ignore_complex_custom_form_fields(db, client, jwt, user):
306306
"""Test to see that extra data from complex JSON is dropped"""
307-
attendee = get_complex_custom_form_attendee(db)
307+
attendee = get_complex_custom_form_attendee(db, user)
308308

309309
data = json.dumps(
310310
{
@@ -344,8 +344,8 @@ def test_ignore_complex_custom_form_fields(db, client, jwt):
344344
assert attendee.complex_field_values.get('shalimar') is None
345345

346346

347-
def test_throw_complex_custom_form_fields(db, client, jwt):
348-
attendee = get_complex_custom_form_attendee(db)
347+
def test_throw_complex_custom_form_fields(db, client, jwt, user):
348+
attendee = get_complex_custom_form_attendee(db, user)
349349
CustomForms(
350350
event=attendee.event,
351351
form='attendee',
@@ -400,8 +400,8 @@ def test_throw_complex_custom_form_fields(db, client, jwt):
400400
}
401401

402402

403-
def test_throw_invalid_complex_custom_form_fields(db, client, jwt):
404-
attendee = get_complex_custom_form_attendee(db)
403+
def test_throw_invalid_complex_custom_form_fields(db, client, jwt, user):
404+
attendee = get_complex_custom_form_attendee(db, user)
405405
CustomForms(
406406
event=attendee.event,
407407
form='attendee',
@@ -522,8 +522,8 @@ def test_edit_attendee_order(db, client, jwt):
522522
assert attendee.order.id == attendee_order.id
523523

524524

525-
def test_edit_attendee_when_order_is_pending(db, client, jwt):
526-
attendee = AttendeeOrderTicketSubFactory()
525+
def test_edit_attendee_when_order_is_pending(db, client, jwt, user):
526+
attendee = AttendeeOrderTicketSubFactory(order__user=user)
527527
order = attendee.order
528528

529529
order.status = "pending"
@@ -557,8 +557,8 @@ def test_edit_attendee_when_order_is_pending(db, client, jwt):
557557
assert attendee.lastname != "Ali"
558558

559559

560-
def test_edit_attendee_when_order_is_completed(db, client, jwt):
561-
attendee = AttendeeOrderTicketSubFactory()
560+
def test_edit_attendee_when_order_is_completed(db, client, jwt, user):
561+
attendee = AttendeeOrderTicketSubFactory(order__user=user)
562562
order = attendee.order
563563

564564
order.status = "completed"
@@ -590,3 +590,48 @@ def test_edit_attendee_when_order_is_completed(db, client, jwt):
590590
# Attendee should not be updated
591591
assert response.status_code == 422
592592
assert attendee.firstname != "Haider"
593+
594+
595+
def test_edit_attendee_by_some_other_user(db, client, jwt):
596+
attendee = AttendeeOrderTicketSubFactory()
597+
order = attendee.order
598+
599+
db.session.commit()
600+
601+
data = json.dumps(
602+
{
603+
'data': {
604+
'type': 'attendee',
605+
'id': str(attendee.id),
606+
'attributes': {"firstname": "Haider"},
607+
"relationships": {
608+
"order": {"data": {"id": str(order.id), "type": "order"}}
609+
},
610+
}
611+
}
612+
)
613+
614+
response = client.patch(
615+
f'/v1/attendees/{attendee.id}',
616+
content_type='application/vnd.api+json',
617+
headers=jwt,
618+
data=data,
619+
)
620+
621+
db.session.refresh(attendee)
622+
623+
assert response.status_code == 403
624+
625+
assert attendee.firstname != "Haider"
626+
627+
assert json.loads(response.data) == {
628+
'errors': [
629+
{
630+
'status': 403,
631+
'source': None,
632+
'title': 'Access Forbidden',
633+
'detail': 'Only admin or that user itself can update attendee info',
634+
}
635+
],
636+
'jsonapi': {'version': '1.0'},
637+
}

0 commit comments

Comments
 (0)