Skip to content

Commit 2d13322

Browse files
authored
Remove scheduled_in and scheduled_time_unit from tasks (#305)
* Remove scheduled_in and scheduled_time_unit from tasks * Fix code style * Fix code style * Fix typo * Remove debug input * Fix input validation
1 parent 1bb62b0 commit 2d13322

File tree

8 files changed

+21
-50
lines changed

8 files changed

+21
-50
lines changed

Diff for: src/backend/http_headers/models.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,12 @@ class HttpHeader(BaseInput):
2626
null=True,
2727
)
2828
key = models.TextField(
29-
max_length=100, validators=[Validator(Regex.NAME.value, code="key", deny_injections=True)]
29+
max_length=100,
30+
validators=[Validator(Regex.NAME.value, code="key", deny_injections=True)],
3031
)
3132
value = models.TextField(
32-
max_length=500, validators=[Validator(Regex.TEXT.value, code="value", deny_injections=True)]
33+
max_length=500,
34+
validators=[Validator(Regex.TEXT.value, code="value", deny_injections=True)],
3335
)
3436

3537
filters = [BaseInput.Filter(type=str, field="key")]

Diff for: src/backend/parameters/models.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ class InputTechnology(BaseInput):
1616
Target, related_name="input_technologies", on_delete=models.CASCADE
1717
)
1818
name = models.TextField(
19-
max_length=100, validators=[Validator(Regex.NAME.value, code="name", deny_injections=True)]
19+
max_length=100,
20+
validators=[Validator(Regex.NAME.value, code="name", deny_injections=True)],
2021
)
2122
version = models.TextField(
2223
max_length=100,
@@ -69,7 +70,8 @@ class InputVulnerability(BaseInput):
6970
Target, related_name="input_vulnerabilities", on_delete=models.CASCADE
7071
)
7172
cve = models.TextField(
72-
max_length=20, validators=[Validator(Regex.CVE.value, code="cve", deny_injections=True)]
73+
max_length=20,
74+
validators=[Validator(Regex.CVE.value, code="cve", deny_injections=True)],
7375
)
7476

7577
filters = [

Diff for: src/backend/security/validators/input_validator.py

+8-4
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class Regex(Enum):
2121
PATH_WITH_QUERYPARAMS = r"[\w\.\-_/\\#?&%$]{0,500}"
2222
CVE = r"CVE-\d{4}-\d{1,7}"
2323
SECRET = r"[\w\./\-=\+,:<>¿?¡!#&$()@%\[\]\{\}\*]{1,500}"
24-
IS_INJECTION = r"[^;\"&</>$]*"
24+
INJECTION = r"[;\"&</>$]+"
2525

2626

2727
class Validator(RegexValidator):
@@ -32,7 +32,7 @@ def __init__(
3232
code: str | None = None,
3333
inverse_match: bool | None = ..., # type: ignore
3434
flags: RegexFlag | None = None,
35-
deny_injections: bool = False
35+
deny_injections: bool = False,
3636
) -> None:
3737
self.deny_injections = deny_injections
3838
super().__init__(regex, message, code, inverse_match, flags)
@@ -46,10 +46,14 @@ def __call__(self, value: str | None) -> None:
4646
invalid_input = (
4747
not bool(regex_matches) if self.inverse_match else bool(regex_matches)
4848
)
49-
is_injection = bool(re.fullmatch(Regex.IS_INJECTION, value)) if self.deny_injections else False
49+
is_injection = (
50+
bool(re.findall(Regex.INJECTION.value, value))
51+
if self.deny_injections
52+
else False
53+
)
5054
if invalid_input or is_injection:
5155
logger.warning(
52-
f"[Security] Invalid value that doesn't match the regex '{self.regex}'"
56+
f"[Security] Value '{value}' doesn't match the allowed regex"
5357
)
5458
raise ValidationError(self.message, code=self.code, params={"value": value})
5559

Diff for: src/backend/tasks/models.py

-11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from django.db import models
2-
32
from framework.models import BaseModel
43
from processes.models import Process
54
from rekono.settings import AUTH_USER_MODEL
@@ -38,16 +37,6 @@ class Task(BaseModel):
3837
null=True,
3938
validators=[FutureDatetimeValidator(code="scheduled_at")],
4039
)
41-
# Amount of time before task execution
42-
scheduled_in = models.IntegerField(
43-
blank=True,
44-
null=True,
45-
validators=[TimeAmountValidator(code="scheduled_in")],
46-
)
47-
# Time unit to apply to the 'sheduled in' value
48-
scheduled_time_unit = models.TextField(
49-
max_length=10, choices=TimeUnit.choices, blank=True, null=True
50-
)
5140
# Amount of time to wait until repeating the task execution
5241
repeat_in = models.IntegerField(
5342
blank=True,

Diff for: src/backend/tasks/queues.py

-12
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,6 @@ def enqueue(self, task: Task) -> Job:
3434
logger.info(
3535
f"[Task] Task {task.id} will be enqueued at {task.scheduled_at}"
3636
)
37-
elif task.scheduled_in and task.scheduled_time_unit:
38-
delay = {task.scheduled_time_unit.lower(): task.scheduled_in}
39-
task.enqueued_at = timezone.now() + timedelta(**delay)
40-
job = queue.enqueue_in(
41-
timedelta(**delay),
42-
self.consume,
43-
task=task,
44-
on_success=self._scheduled_callback,
45-
)
46-
logger.info(
47-
f"[Task] Task {task.id} will be enqueued in {task.scheduled_in} {task.scheduled_time_unit}"
48-
)
4937
else:
5038
task.enqueued_at = timezone.now()
5139
job = queue.enqueue(

Diff for: src/backend/tasks/serializers.py

+4-11
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
from typing import Any, Dict, cast
22

33
from django.core.exceptions import ValidationError
4-
from rest_framework.serializers import ModelSerializer, PrimaryKeyRelatedField
5-
64
from processes.models import Process
75
from processes.serializers import SimpleProcessSerializer
6+
from rest_framework.serializers import ModelSerializer, PrimaryKeyRelatedField
87
from targets.models import Target
98
from targets.serializers import SimpleTargetSerializer
109
from tasks.models import Task
@@ -57,8 +56,6 @@ class Meta:
5756
"intensity",
5857
"executor",
5958
"scheduled_at",
60-
"scheduled_in",
61-
"scheduled_time_unit",
6259
"repeat_in",
6360
"repeat_time_unit",
6461
"creation",
@@ -99,13 +96,9 @@ def validate(self, attrs: Dict[str, Any]) -> Dict[str, Any]:
9996
"process": "Invalid task. Process or configuration is required",
10097
}
10198
)
102-
for field, unit in [
103-
("scheduled_in", "scheduled_time_unit"),
104-
("repeat_in", "repeat_time_unit"),
105-
]:
106-
if not attrs.get(field) or not attrs.get(unit):
107-
attrs[field] = None
108-
attrs[unit] = None
99+
if not attrs.get("repeat_in") or not attrs.get("repeat_time_unit"):
100+
attrs["repeat_in"] = None
101+
attrs["repeat_time_unit"] = None
109102
return super().validate(attrs)
110103

111104
def create(self, validated_data: Dict[str, Any]) -> Task:

Diff for: src/backend/tests/cases.py

+1-5
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,7 @@ def test_case(self, *args: Any, **kwargs: Any) -> None:
6060
data=self.data,
6161
format=self.format,
6262
)
63-
try:
64-
self.tc.assertEqual(self.status_code, response.status_code)
65-
except Exception as ex:
66-
input(response.content)
67-
raise ex
63+
self.tc.assertEqual(self.status_code, response.status_code)
6864
if self.expected is not None:
6965
content = json.loads((response.content or "{}".encode()).decode())
7066
if isinstance(self.expected, dict):

Diff for: src/backend/tests/test_tasks.py

-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from typing import Any
22

33
from executions.enums import Status
4-
from tasks.enums import TimeUnit
54
from tests.cases import ApiTestCase
65
from tests.framework import ApiTest
76
from tools.enums import Intensity
@@ -19,7 +18,6 @@
1918
"configuration_id": 25,
2019
"intensity": Intensity.SNEAKY.name.capitalize(),
2120
}
22-
invalid_task4 = {**task1, "scheduled_in": -1, "scheduled_time_unit": TimeUnit.MINUTES}
2321

2422

2523
class TaskTest(ApiTest):
@@ -122,7 +120,6 @@ class TaskTest(ApiTest):
122120
ApiTestCase(["admin1", "auditor1"], "post", 400, invalid_task1),
123121
ApiTestCase(["admin1", "auditor1"], "post", 400, invalid_task2),
124122
ApiTestCase(["admin1", "auditor1"], "post", 400, invalid_task3),
125-
ApiTestCase(["admin1", "auditor1"], "post", 400, invalid_task4),
126123
ApiTestCase(["admin2", "auditor2", "reader1", "reader2"], "post", 403, task1),
127124
ApiTestCase(
128125
["admin1"],

0 commit comments

Comments
 (0)