feat: adds onions list to api

This commit is contained in:
Iain Learmonth 2024-11-10 21:41:54 +00:00
parent 2ca4ddffb0
commit 04f5a0345b
2 changed files with 65 additions and 6 deletions

View file

@ -2,7 +2,7 @@ import base64
import binascii
import logging
import re
from typing import Optional, List, Callable, Any, Type, Dict, Union
from typing import Optional, List, Callable, Any, Type, Dict, Union, Literal
from flask import Blueprint, request, jsonify, abort
from flask.typing import ResponseReturnValue
@ -12,6 +12,7 @@ from werkzeug.exceptions import HTTPException
from app.extensions import db
from app.models.base import Group
from app.models.mirrors import Origin, Proxy
from app.models.onions import Onion
api = Blueprint('api', __name__)
logger = logging.getLogger(__name__)
@ -70,6 +71,16 @@ def validate_marker(marker_str: str) -> int:
abort(400, description="Marker must be a valid token.")
TLPMarkings = Union[
Literal["default"],
Literal["clear"],
Literal["green"],
Literal["amber"],
Literal["amber+strict"],
Literal["red"],
]
def list_resources(
model: Type[Any],
serialize_func: Callable[[Any], Dict[str, Any]],
@ -78,7 +89,8 @@ def list_resources(
resource_name: str = 'ResourceList',
max_items_param: str = 'MaxItems',
marker_param: str = 'Marker',
max_allowed_items: int = 100
max_allowed_items: int = 100,
protective_marking: TLPMarkings = 'default',
) -> ResponseReturnValue:
try:
marker = request.args.get(marker_param)
@ -108,6 +120,7 @@ def list_resources(
"Quantity": len(items_list),
"Items": items_list,
"IsTruncated": is_truncated,
"ProtectiveMarking": protective_marking,
}
}
@ -128,7 +141,8 @@ def list_groups() -> ResponseReturnValue:
model=Group,
serialize_func=lambda group: group.to_dict(),
resource_name='OriginGroupList',
max_allowed_items=MAX_ALLOWED_ITEMS
max_allowed_items=MAX_ALLOWED_ITEMS,
protective_marking='amber',
)
@ -157,7 +171,8 @@ def list_origins() -> ResponseReturnValue:
serialize_func=lambda origin: origin.to_dict(),
filters=filters,
resource_name='OriginsList',
max_allowed_items=MAX_ALLOWED_ITEMS
max_allowed_items=MAX_ALLOWED_ITEMS,
protective_marking='amber',
)
@ -187,5 +202,36 @@ def list_mirrors() -> ResponseReturnValue:
serialize_func=lambda proxy: proxy.to_dict(),
filters=filters,
resource_name='MirrorsList',
max_allowed_items=MAX_ALLOWED_ITEMS
max_allowed_items=MAX_ALLOWED_ITEMS,
protective_marking='amber',
)
@api.route('/web/onion', methods=['GET'])
def list_onions() -> ResponseReturnValue:
domain_name_filter = request.args.get('DomainName')
group_id_filter = request.args.get('GroupId')
filters: List[ListFilter] = []
if domain_name_filter:
if len(domain_name_filter) > MAX_DOMAIN_NAME_LENGTH:
abort(400, description=f"DomainName cannot exceed {MAX_DOMAIN_NAME_LENGTH} characters.")
if not DOMAIN_NAME_REGEX.match(domain_name_filter):
abort(400, description="DomainName contains invalid characters.")
filters.append(Onion.domain_name.ilike(f"%{domain_name_filter}%"))
if group_id_filter:
try:
filters.append(Onion.group_id == int(group_id_filter))
except ValueError:
abort(400, description="GroupId must be a valid integer.")
return list_resources(
model=Onion,
serialize_func=lambda onion: onion.to_dict(),
filters=filters,
resource_name='OnionsList',
max_allowed_items=MAX_ALLOWED_ITEMS,
protective_marking='amber',
)