From 636f13bc0740cf5f3078c0c632882b01193704d6 Mon Sep 17 00:00:00 2001
From: Nils G <nils.gondermann@ruhr-uni-bochum.de>
Date: Thu, 30 Apr 2020 14:35:22 +0200
Subject: [PATCH] Add definition rule for input field maxlength. Enforce on
 Client and Server side

---
 controllers/player.py         | 12 ++++++++++++
 static/game/debug/renderer.js |  4 ++++
 2 files changed, 16 insertions(+)

diff --git a/controllers/player.py b/controllers/player.py
index e7b1106..329b249 100644
--- a/controllers/player.py
+++ b/controllers/player.py
@@ -79,6 +79,15 @@ def submit():
     new_input = {"submit": parameters["submit"]}
 
     if JSON_CONTAINS(parameters, [('inputs', dict)]):
+
+        #Load role definitions for additional validation (e.g. maxlength)
+        elements = B64_TO_JSON(room_record.roles)[player_record.role]["elements"]
+        input_definitions = {}
+        for element in elements:
+            if element["type"] == "input":
+                input_definitions[element["name"]] = element
+
+
         inputs = parameters["inputs"]
         for key in inputs:
 
@@ -87,6 +96,9 @@ def submit():
             if (not isinstance(inputs[key], str)) or (keytest != key):
                 return(FAIL(CODE_MISSING))
 
+            if input_definitions[key]["length"] and len(inputs[key]) > input_definitions[key]["length"]:
+                return(FAIL(CODE_MISSING))
+
             inputs[key] = ''.join(c for c in inputs[key] if (c.isalnum() or c == " "))
 
         new_input["inputs"] = inputs
diff --git a/static/game/debug/renderer.js b/static/game/debug/renderer.js
index c4c971c..def0bac 100644
--- a/static/game/debug/renderer.js
+++ b/static/game/debug/renderer.js
@@ -63,6 +63,7 @@ function renderRole(_definition, _roleIdle) {
         var c = element["class"];
         var name = element["name"];
         var value = element["value"];
+        var length = element["length"];
 
         if(prompt){
             for(var varname in prompt){
@@ -81,6 +82,9 @@ function renderRole(_definition, _roleIdle) {
             case "input":
                 e = $("<input class='game_input' type='text'/>");
                 e.attr("placeholder", value);
+                if(length) {
+                    e.attr("maxlength", length);
+                }
                 if(!prompt) {
                     e.attr("disabled", "true");
                 }
-- 
GitLab