File size: 2,230 Bytes
d965a0a f474e49 d965a0a f474e49 d965a0a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
"""
User Context and Permission Module
Handles permission checks for API key authentication
"""
from typing import Optional
def check_permission(user_scopes: list, required_scope: str) -> bool:
"""
Check if user has required permission
Args:
user_scopes: List of scopes user has
required_scope: Scope needed for this operation
Returns:
True if user has permission
"""
# Admin has all permissions
if 'admin' in user_scopes:
return True
# Check specific scope
return required_scope in user_scopes
# Scope requirements for each tool
SCOPE_REQUIREMENTS = {
# Order operations
'create_order': 'orders:write',
'fetch_orders': 'orders:read',
'update_order': 'orders:write',
'delete_order': 'orders:write',
'search_orders': 'orders:read',
'get_order_details': 'orders:read',
'count_orders': 'orders:read',
'get_incomplete_orders': 'orders:read',
# Driver operations
'create_driver': 'drivers:write',
'fetch_drivers': 'drivers:read',
'update_driver': 'drivers:write',
'delete_driver': 'drivers:write',
'search_drivers': 'drivers:read',
'get_driver_details': 'drivers:read',
'count_drivers': 'drivers:read',
'get_available_drivers': 'drivers:read',
# Assignment operations
'create_assignment': 'assignments:manage',
'auto_assign_order': 'assignments:manage',
'intelligent_assign_order': 'assignments:manage',
'get_assignment_details': 'assignments:manage',
'update_assignment': 'assignments:manage',
'unassign_order': 'assignments:manage',
'complete_delivery': 'assignments:manage',
'fail_delivery': 'assignments:manage',
# Routing (public - no scope required)
'geocode_address': None,
'calculate_route': None,
'calculate_intelligent_route': None,
# Dangerous operations (admin only)
'delete_all_orders': 'admin',
'delete_all_drivers': 'admin',
}
def get_required_scope(tool_name: str) -> Optional[str]:
"""
Get the scope required for a tool
Args:
tool_name: Name of the tool
Returns:
Required scope or None if tool is public
"""
return SCOPE_REQUIREMENTS.get(tool_name, 'admin')
|