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
#