Implementing Permissions for Orders API in Open Event API Server
Open Event API Server Orders API is one of the core APIs. The permissions in Orders API are robust and secure enough to ensure no leak on payment and ticketing.The permission manager provides the permissions framework to implement the permissions and proper access controls based on the dev handbook.
The following table is the permissions in the developer handbook.
List | View | Create | Update | Delete | |
Superadmin/admin | ✓ | ✓ | ✓ | ✓ | ✓ |
Event organizer | ✓ [1] | ✓ [1] | ✓ [1] | ✓ [1][2] | ✓ [1][3] |
Registered user | ✓ [4] | ||||
Everyone else |
- Only self-owned events
- Can only change order status
- A refund will also be initiated if paid ticket
- Only if order placed by self
Super Admins and admins are allowed to create any order with any amount but any coupon they apply is not consumed on creating order. They can update almost every field of the order and can provide any custom status to the order. Permissions are applied with the help of Permission Manager which takes care the authorization roles. For example, if a permission is set based on admin access then it is automatically set for super admin as well i.e., to the people with higher rank.
Self-owned events
This allows the event admins, Organizer and Co-Organizer to manage the orders of the event they own. This allows then to view all orders and create orders with or without discount coupon with any custom price and update status of orders. Event admins can provide specific status while others cannot
if not has_access('is_coorganizer', event_id=data['event']): data['status'] = 'pending'
And Listing requires Co-Organizer access
elif not has_access('is_coorganizer', event_id=kwargs['event_id']): raise ForbiddenException({'source': ''}, "Co-Organizer Access Required")
Can only change order status
The organizer cannot change the order fields except the status of the order. Only Server Admin and Super Admins are allowed to update any field of the order.
if not has_access('is_admin'): for element in data: if element != 'status': setattr(data, element, getattr(order, element))
And Delete access is prohibited to event admins thus only Server admins can delete orders by providing a cancelling note which will be provided to the Attendee/Buyer.
def before_delete_object(self, order, view_kwargs): if not has_access('is_coorganizer', event_id=order.event.id): raise ForbiddenException({'source': ''}, 'Access Forbidden')
Registered User
A registered user can create order with basic details like the attendees’ records and payment method with fields like country and city. They are not allowed to provide any custom status to the order they are creating. All orders will be set by default to “pending”
Also, they are not allowed to update any field in their order. Any status update will be done internally thus maintaining the security of Order System. Although they are allowed to view their place orders. This is done by comparing their logged in user id with the user id of the purchaser.
if not has_access('is_coorganizer_or_user_itself', event_id=order.event_id, user_id=order.user_id): return ForbiddenException({'source': ''}, 'Access Forbidden')
Event Admins
The event admins have one more restriction, as an event admin, you cannot provide discount coupon and even if you do it will be ignored.
# Apply discount only if the user is not event admin if data.get('discount') and not has_access('is_coorganizer', event_id=data['event']):
Also an event admin any amount you will provide on creating order will be final and there will be no further calculation of the amount will take place
if not has_access('is_coorganizer', event_id=data['event']): TicketingManager.calculate_update_amount(order)
Creating Attendees Records
Before sending a request to Orders API it is required to create to attendees mapped to some ticket and for this registered users are allowed to create the attendees without adding a relationship of the order. The mapping with the order is done internally by Orders API and its helpers.
Resources
- Dev Handbook – Niranjan R
The Open Event Developer Handbook - Flask-REST-JSONAPI Docs
Permissions and Data layer | Flask-REST-JSONAPI - A guide to use permission manager in API Server
https://blog.fossasia.org/a-guide-to-use-permission-manager-in-open-event-api-server/