Skip to content

Commit

Permalink
Merge pull request #501 from grycap/input_map
Browse files Browse the repository at this point in the history
Input map
  • Loading branch information
micafer authored Feb 16, 2024
2 parents e7dfacf + 72da964 commit fee742c
Show file tree
Hide file tree
Showing 5 changed files with 108 additions and 38 deletions.
11 changes: 6 additions & 5 deletions app/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -904,17 +904,18 @@ def set_inputs_to_template(template, inputs):
value["default"] = True
else:
value["default"] = False
elif value["type"] == "list" and value["entry_schema"]["type"] not in ["map", "list"]:
elif value["type"] in ["map", "list"] and value["entry_schema"]["type"] not in ["map", "list"]:
try:
value["default"] = utils.get_list_values(name, inputs, value["entry_schema"]["type"])
value["default"] = utils.get_list_values(name, inputs, value["entry_schema"]["type"],
value["type"])
except Exception as ex:
flash("Invalid input value '%s' specified: '%s'." % (name, ex), "warning")
value["default"] = []
# Special case for ports, convert a list of strings like 80,443,8080-8085,9000-10000/udp
# to a PortSpec map
elif value["type"] == "map" and value["entry_schema"]["type"] in utils.PORT_SPECT_TYPES:
# to a PortSpec map or list
elif value["type"] in ["map", "list"] and value["entry_schema"]["type"] in utils.PORT_SPECT_TYPES:
try:
value["default"] = utils.get_list_values(name, inputs, "PortSpec")
value["default"] = utils.get_list_values(name, inputs, "PortSpec", value["type"])
except Exception as ex:
flash("Invalid input value '%s' specified: '%s'." % (name, ex), "warning")
value["default"] = {}
Expand Down
2 changes: 1 addition & 1 deletion app/templates/input_types.html
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@
{% else %}

<!-- list type -->
{% if value.type == "list" %}
{% if value.type in ["list", "map"] %}
<fieldset class="border p-2">
{% include 'list.html' %}
</fieldset>
Expand Down
63 changes: 51 additions & 12 deletions app/templates/list.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,29 +11,60 @@
function addItem_{{key}}(object=null, value='') {
var tagname = document.getElementById('add-new-item-{{key}}').getAttribute('data-tag-name');

{% if value.entry_schema.type == "integer" %}
var pattern = "[0-9]+";
{% elif value.entry_schema.type == "float" %}
var pattern = "[0-9]+\.{0,1}[0-9]+";
{% elif value.entry_schema.type == "boolean" %}
var pattern = "true|false";
{% else %}
var pattern = ".*";
{% endif %}


{% if value.entry_schema.type in utils.PORT_SPECT_TYPES %}
var parts = value.split('-');
var range = parts[0];
var cidr = "";
var target = "";
var input_template = ""
if (parts.length > 1) {
range = parts[1]
if (parts[0].includes('/') && parts[0].includes('.')) {
cidr = parts[0]
} else {
target = parts[0]
}
}
if (parts.length > 2) {
range = parts[2]
target = parts[1]
cidr = parts[0]
}

let input_template = `
// this can be done better
{% if value.type == "map" %}
input_template = `
<input type="text" class="mr-1 col-5 form-control" name="${tagname}_list_value_${num__{{key}}}_range" class="form-control" pattern="([0-9]+:{0,1}[0-9]+)" required value="${range}" placeholder="Port Range">
<input type="text" class="mr-1 col-6 form-control" name="${tagname}_list_value_${num__{{key}}}_cidr" class="form-control" pattern="(([0-9]{1,3}\.){3}[0-9]{1,3}(\/([0-9]|[1-2][0-9]|3[0-2]))){0,1}" value="${cidr}" placeholder="CIDR">`;
{% else %}
{% if value.entry_schema.type == "integer" %}
var pattern = "[0-9]+";
{% elif value.entry_schema.type == "float" %}
var pattern = "[0-9]+\.{0,1}[0-9]+";
{% elif value.entry_schema.type == "boolean" %}
var pattern = "true|false";
{% else %}
var pattern = ".*";
input_template = `
<input type="text" class="mr-1 col-5 form-control" name="${tagname}_list_value_${num__{{key}}}_target" class="form-control" pattern="([0-9]{1,5})" value="${target}" placeholder="Target Port">
<input type="text" class="mr-1 col-6 form-control" name="${tagname}_list_value_${num__{{key}}}_range" class="form-control" pattern="([0-9]{1,5})" required value="${range}" placeholder="Source Port">`;
{% endif %}
let input_template = `

{% elif value.type == "map" %}
var parts = value.split(':');
var k = parts[0];
var v = ""
if (parts.length > 1) {
v = parts[1]
}
input_template = `
<input type="text" class="mr-1 col-4 form-control" name="${tagname}_list_value_${num__{{key}}}_key" class="form-control" required value="${k}" placeholder="Key">
<input type="text" class="mr-1 col-7 form-control" name="${tagname}_list_value_${num__{{key}}}_value" class="form-control" required pattern="${pattern}" value="${v}" placeholder="Value">`;
{% else %}
input_template = `
<input type="text" class="col-11 form-control" name="${tagname}_list_value_${num__{{key}}}" class="form-control" required pattern="${pattern}" value="${value}">`;
{% endif %}

Expand All @@ -59,12 +90,20 @@
element.parentNode.removeChild(element);
}

{% if value.entry_schema.type in utils.PORT_SPECT_TYPES %}
{% if input_value %}
{% if input_value %}
{% if value.entry_schema.type in utils.PORT_SPECT_TYPES %}
{% set ports = utils.formatPortSpec(input_value) %}
{% for k, v in ports.items() %}
addItem_{{key}}(null, value='{{v}}')
{% endfor %}
{% elif value.type == "map" %}
{% for k, v in input_value.items() %}
addItem_{{key}}(null, value='{{k}}:{{v}}')
{% endfor %}
{% else %}
{% for item in input_value %}
addItem_{{key}}(null, value='{{item}}')
{% endfor %}
{% endif %}
{% endif %}

Expand Down
68 changes: 49 additions & 19 deletions app/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -886,54 +886,84 @@ def valid_template_vos(user_vos, template_metadata):
return ['all']


def get_list_values(name, inputs, value_type="string"):
def convert_value(value, value_type):
if value_type == "integer":
value = int(value)
elif value_type == "float":
value = float(value)
elif value_type == "boolean":
value = value.lower() in ["true", "yes", "1"]
return value


def get_list_values(name, inputs, value_type="string", retun_type="list"):

cont = 1
# Special case for ports
if value_type in PORT_SPECT_TYPES:
ports_value = {}
while "%s_list_value_%d_range" % (name, cont) in inputs:
port_num = inputs["%s_list_value_%d_range" % (name, cont)]
remote_cidr = inputs["%s_list_value_%d_cidr" % (name, cont)]
remote_cidr = inputs.get("%s_list_value_%d_cidr" % (name, cont))
target_port = inputs.get("%s_list_value_%d_target" % (name, cont))
port_name = "port_%s" % port_num.replace(":", "_")
# Should we also open UDP?
ports_value["port_%s" % port_num.replace(":", "_")] = {"protocol": "tcp"}
ports_value[port_name] = {"protocol": "tcp"}

if target_port:
ports_value[port_name]["target"] = int(target_port)
if ":" in port_num:
port_range = port_num.split(":")
ports_value["port_%s" % port_num.replace(":", "_")]["source_range"] = [int(port_range[0]),
int(port_range[1])]
ports_value[port_name]["source_range"] = [int(port_range[0]), int(port_range[1])]
else:
ports_value["port_%s" % port_num.replace(":", "_")]["source"] = int(port_num)
ports_value[port_name]["source"] = int(port_num)
if remote_cidr:
ports_value["port_%s" % port_num.replace(":", "_")]["remote_cidr"] = remote_cidr
ports_value[port_name]["remote_cidr"] = remote_cidr
cont += 1
return ports_value
else:
if retun_type == "map":
return ports_value
else:
return list(ports_value.values())
elif retun_type == "list":
values = []
while "%s_list_value_%d" % (name, cont) in inputs:
value = inputs["%s_list_value_%d" % (name, cont)]
if value_type == "integer":
value = int(value)
elif value_type == "float":
value = float(value)
elif value_type == "boolean":
value = value.lower() in ["true", "yes", "1"]
values.append(value)
values.append(convert_value(value, value_type))
cont += 1
return values
else:
values = {}
while "%s_list_value_%d_key" % (name, cont) in inputs:
key = inputs["%s_list_value_%d_key" % (name, cont)]
value = inputs["%s_list_value_%d_value" % (name, cont)]
values[key] = convert_value(value, value_type)
cont += 1
return values


def formatPortSpec(ports):
res = {}
for port_name, port_value in ports.items():
if isinstance(ports, dict):
ports_list = list(ports.values())
elif isinstance(ports, list):
ports_list = ports
for num, port_value in enumerate(ports_list):
port_name = "port_%s" % num
if 'remote_cidr' in port_value and port_value['remote_cidr']:
res[port_name] = str(port_value['remote_cidr']) + "-"
else:
res[port_name] = ""
if 'source_range' in port_value:

if 'target' in port_value and port_value['target']:
res[port_name] += "%s-" % port_value['target']

# if target is defined, source_range should not be defined
if 'source_range' in port_value and port_value['source_range']:
res[port_name] += "%s:%s" % (port_value['source_range'][0],
port_value['source_range'][1])
elif 'source' in port_value:
elif 'source' in port_value and port_value['source']:
res[port_name] += "%s" % port_value['source']

return res


Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ PyYAML==6.0.1
packaging==23.1
xmltodict==0.13.0
radl==1.3.2
cryptography==41.0.7
cryptography==42.0.3
apscheduler==3.10.4 # 3.8.1 version fails
Flask-APScheduler==1.13.1
Flask-WTF==1.2.1
Expand Down

0 comments on commit fee742c

Please sign in to comment.