diff --git a/CHANGELOG.md b/CHANGELOG.md index fe261b3..68b9747 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # ChangeLog +## 3.2.1 - 2024-05-21 + +Changes: +- adjust to BBB 2.7.8 API changes + - forbid POST request for `join` endpoint () + - adjustments for POST headers are already handled +- meeting name check: + - add check for meeting name length for faster response without sending a request to backend systems + - meeting name length must be between 2 and 256 characters as given by BBB API restrictions + ## 3.2.0 - 2024-05-16 Changes: diff --git a/b3lb/rest/b3lb/constants.py b/b3lb/rest/b3lb/constants.py index 0d12bc4..287b2a9 100644 --- a/b3lb/rest/b3lb/constants.py +++ b/b3lb/rest/b3lb/constants.py @@ -11,7 +11,7 @@ CONTENT_TYPE = "text/xml" HOST_REGEX = compile(r'([^:]+)(:\d+)?$') MEETING_ID_LENGTH = 100 -MEETING_NAME_LENGTH = 500 +MEETING_NAME_LENGTH = 256 NONCE_CHAR_POOL = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@*(-_)' NONCE_LENGTH = 64 RECORD_PROFILE_DESCRIPTION_LENGTH = 255 @@ -29,6 +29,7 @@ RETURN_STRING_RECORD_PUBLISHED = '\r\nSUCCESS\r\n{}\r\n' RETURN_STRING_RECORD_DELETED = '\r\nSUCCESS\r\ntrue\r\n' RETURN_STRING_RECORD_UPDATED = '\r\nSUCCESS\r\ntrue\r\n' +RETURN_STRING_WRONG_MEETING_NAME_LENGTH = '\r\nFAILED\r\nsizeError\r\nMeeting name must be between 2 and 256 characters\r\n' SHA1 = "sha1" SHA256 = "sha256" SHA384 = "sha384" diff --git a/b3lb/rest/classes/api.py b/b3lb/rest/classes/api.py index 54ebefb..fb3ee30 100644 --- a/b3lb/rest/classes/api.py +++ b/b3lb/rest/classes/api.py @@ -34,7 +34,7 @@ from rest.b3lb.metrics import incr_metric, update_create_metrics from rest.b3lb.parameters import ALLOW_START_STOP_RECORDING, AUTO_START_RECORDING, BLOCK, LOGO, OVERRIDE, PARAMETERS_CREATE, PARAMETERS_JOIN, RECORD, SET, USERDATA_BBB_CUSTOM_STYLE_URL from rest.b3lb.utils import get_checksum -from rest.models import check_room_name, ClusterGroupRelation, Meeting, Metric, Node, Parameter, Record, RecordSet, Secret, SecretMeetingList, SecretMetricsList, Stats +from rest.models import is_meeting_name_length_fine, ClusterGroupRelation, Meeting, Metric, Node, Parameter, Record, RecordSet, Secret, SecretMeetingList, SecretMetricsList, Stats from typing import Any, Dict, List, Literal, Union from uuid import UUID from urllib.parse import urlencode @@ -68,6 +68,9 @@ async def create(self) -> HttpResponse: if not self.meeting_id: return HttpResponse(cst.RETURN_STRING_MISSING_MEETING_ID, content_type=cst.CONTENT_TYPE) + if not is_meeting_name_length_fine(self.parameters.get("name", "")): + return HttpResponse(cst.RETURN_STRING_WRONG_MEETING_NAME_LENGTH, content_type=cst.CONTENT_TYPE) + if not await self.is_meeting(): if not await sync_to_async(self.is_node_free)(): return HttpResponse(cst.RETURN_STRING_CREATE_NO_NODE_AVAILABE, content_type=cst.CONTENT_TYPE) @@ -275,7 +278,7 @@ async def stats(self) -> HttpResponse: #### Class Routines #### def allowed_methods(self) -> List[Literal["GET", "POST", "DELETE", "PATCH", "PUT"]]: - if self.endpoint in ["b3lb_metrics", "b3lb_stats"]: + if self.endpoint in ["b3lb_metrics", "b3lb_stats", "join"]: return ["GET"] return ["GET", "POST"] @@ -432,7 +435,7 @@ def is_node_free(self) -> bool: ## Getter Routines ## def get_meeting_defaults(self) -> Dict[str, Any]: - return {"id": self.meeting_id, "secret": self.secret, "node": self.node, "room_name": check_room_name(self.parameters.get("name", "Unknown")), "end_callback_url": self.parameters.get("meta_endCallbackUrl", "")} + return {"id": self.meeting_id, "secret": self.secret, "node": self.node, "room_name": self.parameters.get("name", "Unknown"), "end_callback_url": self.parameters.get("meta_endCallbackUrl", "")} def get_node_endpoint_url(self) -> str: parameter_str = "" diff --git a/b3lb/rest/migrations/0016_resize_meeting_name_length.py b/b3lb/rest/migrations/0016_resize_meeting_name_length.py new file mode 100644 index 0000000..577e54a --- /dev/null +++ b/b3lb/rest/migrations/0016_resize_meeting_name_length.py @@ -0,0 +1,28 @@ +# Generated by Django 3.2.23 on 2024-05-21 09:17 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('rest', '0015_alter_parameter_parameter'), + ] + + operations = [ + migrations.AlterField( + model_name='meeting', + name='room_name', + field=models.CharField(max_length=256), + ), + migrations.AlterField( + model_name='record', + name='name', + field=models.CharField(max_length=514), + ), + migrations.AlterField( + model_name='recordset', + name='meta_meeting_name', + field=models.CharField(default='', max_length=256), + ), + ] diff --git a/b3lb/rest/models.py b/b3lb/rest/models.py index 86081c1..9453085 100644 --- a/b3lb/rest/models.py +++ b/b3lb/rest/models.py @@ -45,11 +45,6 @@ # # FUNCTIONS # -def check_room_name(name: str) -> str: - if len(name) > cst.MEETING_NAME_LENGTH: - return name[:cst.MEETING_NAME_LENGTH] - return name - def get_nonce(): return get_random_string(cst.NONCE_LENGTH, cst.NONCE_CHAR_POOL) @@ -69,6 +64,10 @@ def get_storage(): return used_storage +def is_meeting_name_length_fine(name: str) -> bool: + return 2 <= len(name) < cst.MEETING_NAME_LENGTH + + # # ADMIN ACTIONS #