troubadix 25.6.0__py3-none-any.whl → 25.6.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- troubadix/__version__.py +1 -1
- troubadix/helper/date_format.py +93 -0
- troubadix/helper/patterns.py +17 -2
- troubadix/plugins/__init__.py +6 -0
- troubadix/plugins/creation_date.py +27 -63
- troubadix/plugins/cvss_format.py +4 -15
- troubadix/plugins/script_tags_mandatory.py +6 -1
- troubadix/plugins/severity_date.py +53 -0
- troubadix/plugins/severity_format.py +33 -0
- troubadix/plugins/severity_origin.py +33 -0
- {troubadix-25.6.0.dist-info → troubadix-25.6.1.dist-info}/METADATA +1 -1
- {troubadix-25.6.0.dist-info → troubadix-25.6.1.dist-info}/RECORD +15 -11
- {troubadix-25.6.0.dist-info → troubadix-25.6.1.dist-info}/LICENSE +0 -0
- {troubadix-25.6.0.dist-info → troubadix-25.6.1.dist-info}/WHEEL +0 -0
- {troubadix-25.6.0.dist-info → troubadix-25.6.1.dist-info}/entry_points.txt +0 -0
troubadix/__version__.py
CHANGED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
2
|
+
# SPDX-FileCopyrightText: 2025 Greenbone AG
|
|
3
|
+
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from typing import Iterator
|
|
6
|
+
|
|
7
|
+
from troubadix.plugin import LinterError, LinterResult
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def parse_date(date: str) -> datetime:
|
|
11
|
+
return datetime.strptime(date[:25], "%Y-%m-%d %H:%M:%S %z")
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def check_date(
|
|
15
|
+
date: str, date_name: str, file: str, plugin: str
|
|
16
|
+
) -> Iterator[LinterResult]:
|
|
17
|
+
"""
|
|
18
|
+
Checks if a given date string is correctly formatted.
|
|
19
|
+
Example: "2017-11-29 13:56:41 +0100 (Wed, 29 Nov 2017)"
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
if not date:
|
|
23
|
+
yield LinterError(
|
|
24
|
+
f"No {date_name} has been found.",
|
|
25
|
+
file=file,
|
|
26
|
+
plugin=plugin,
|
|
27
|
+
)
|
|
28
|
+
return
|
|
29
|
+
|
|
30
|
+
try:
|
|
31
|
+
# 2017-11-29 13:56:41 +0100
|
|
32
|
+
date_left = parse_date(date)
|
|
33
|
+
|
|
34
|
+
# Wed, 29 Nov 2017
|
|
35
|
+
date_right = datetime.strptime(date[27:43], "%a, %d %b %Y")
|
|
36
|
+
|
|
37
|
+
week_day_parsed = date_right.strftime("%a")
|
|
38
|
+
|
|
39
|
+
except ValueError:
|
|
40
|
+
yield LinterError(
|
|
41
|
+
f"Missing or incorrectly formatted {date_name}.",
|
|
42
|
+
file=file,
|
|
43
|
+
plugin=plugin,
|
|
44
|
+
)
|
|
45
|
+
return
|
|
46
|
+
|
|
47
|
+
# Position of the 3 char day of the week abbreviation: Mon, Tue, Wed...
|
|
48
|
+
week_day_str = date[27:30]
|
|
49
|
+
|
|
50
|
+
if date_left.date() != date_right.date():
|
|
51
|
+
yield LinterError(
|
|
52
|
+
f"The {date_name} consists of two different dates.",
|
|
53
|
+
file=file,
|
|
54
|
+
plugin=plugin,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
# Check correct weekday
|
|
58
|
+
elif week_day_str != week_day_parsed:
|
|
59
|
+
formatted_date = week_day_parsed
|
|
60
|
+
yield LinterError(
|
|
61
|
+
f"Wrong day of week. Please change it from '{week_day_str}"
|
|
62
|
+
f"' to '{formatted_date}'.",
|
|
63
|
+
file=file,
|
|
64
|
+
plugin=plugin,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def compare_date_with_last_modification_date(
|
|
69
|
+
date: str, date_name: str, last_mod_date: str, file: str, plugin: str
|
|
70
|
+
) -> Iterator[LinterResult]:
|
|
71
|
+
|
|
72
|
+
yield from check_date(
|
|
73
|
+
last_mod_date,
|
|
74
|
+
"last_modification",
|
|
75
|
+
file=file,
|
|
76
|
+
plugin=plugin,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
try:
|
|
80
|
+
if parse_date(date) > parse_date(last_mod_date):
|
|
81
|
+
yield LinterError(
|
|
82
|
+
f"The {date_name} must not be greater than "
|
|
83
|
+
"last_modification date.",
|
|
84
|
+
file=file,
|
|
85
|
+
plugin=plugin,
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
except ValueError:
|
|
89
|
+
yield LinterError(
|
|
90
|
+
f"Could not compare {date_name} with last_modification date.",
|
|
91
|
+
file=file,
|
|
92
|
+
plugin=plugin,
|
|
93
|
+
)
|
troubadix/helper/patterns.py
CHANGED
|
@@ -87,12 +87,27 @@ class ScriptTag(Enum):
|
|
|
87
87
|
__script_tag_pattern = None
|
|
88
88
|
|
|
89
89
|
__DATE_VALUE = r"[A-Za-z0-9\:\-\+\,\s\(\)]{44}"
|
|
90
|
+
__CVSS_V2_BASE_VECTOR = r"AV:[LAN]/AC:[HML]/Au:[NSM]/C:[NPC]/I:[NPC]/A:[NPC]"
|
|
91
|
+
__CVSS_V3_BASE_VECTOR = (
|
|
92
|
+
r"CVSS:3.[01]/AV:[NALP]/AC:[LH]/PR:[NLH]/UI:[NR]/S:[UC]"
|
|
93
|
+
r"/C:[HLN]/I:[HLN]/A:[HLN]"
|
|
94
|
+
)
|
|
95
|
+
__CVSS_V4_BASE_VECTOR = (
|
|
96
|
+
r"CVSS:4.0/AV:[NALP]/AC:[LH]/AT:[NP]/PR:[NLH]/UI:[NPA]"
|
|
97
|
+
r"/VC:[HLN]/VI:[HLN]/VA:[HLN]/SC:[HLN]/SI:[HLN]/SA:[HLN]"
|
|
98
|
+
)
|
|
90
99
|
|
|
91
100
|
__script_tag_values = {
|
|
92
101
|
ScriptTag.DEPRECATED: r"TRUE",
|
|
93
|
-
ScriptTag.CVSS_BASE_VECTOR: r"AV:[LAN]/AC:[HML]/Au:[NSM]/C:[NPC]/I:"
|
|
94
|
-
r"[NPC]/A:[NPC]",
|
|
95
102
|
ScriptTag.CVSS_BASE: r"(10\.0|[0-9]\.[0-9])",
|
|
103
|
+
ScriptTag.CVSS_BASE_VECTOR: __CVSS_V2_BASE_VECTOR,
|
|
104
|
+
ScriptTag.SEVERITY_VECTOR: (
|
|
105
|
+
rf"({__CVSS_V2_BASE_VECTOR})|"
|
|
106
|
+
rf"({__CVSS_V3_BASE_VECTOR})|"
|
|
107
|
+
rf"({__CVSS_V4_BASE_VECTOR})"
|
|
108
|
+
),
|
|
109
|
+
ScriptTag.SEVERITY_ORIGIN: r"(NVD|Vendor|Third Party|Greenbone)",
|
|
110
|
+
ScriptTag.SEVERITY_DATE: __DATE_VALUE,
|
|
96
111
|
ScriptTag.CREATION_DATE: __DATE_VALUE,
|
|
97
112
|
ScriptTag.LAST_MODIFICATION: __DATE_VALUE,
|
|
98
113
|
}
|
troubadix/plugins/__init__.py
CHANGED
|
@@ -68,6 +68,9 @@ from .script_xref_form import CheckScriptXrefForm
|
|
|
68
68
|
from .script_xref_url import CheckScriptXrefUrl
|
|
69
69
|
from .security_messages import CheckSecurityMessages
|
|
70
70
|
from .set_get_kb_calls import CheckWrongSetGetKBCalls
|
|
71
|
+
from .severity_date import CheckSeverityDate
|
|
72
|
+
from .severity_format import CheckSeverityFormat
|
|
73
|
+
from .severity_origin import CheckSeverityOrigin
|
|
71
74
|
from .solution_text import CheckSolutionText
|
|
72
75
|
from .solution_type import CheckSolutionType
|
|
73
76
|
from .spaces_in_filename import CheckSpacesInFilename
|
|
@@ -128,6 +131,9 @@ _FILE_PLUGINS = [
|
|
|
128
131
|
CheckScriptXrefForm,
|
|
129
132
|
CheckScriptXrefUrl,
|
|
130
133
|
CheckSecurityMessages,
|
|
134
|
+
CheckSeverityDate,
|
|
135
|
+
CheckSeverityFormat,
|
|
136
|
+
CheckSeverityOrigin,
|
|
131
137
|
CheckSolutionText,
|
|
132
138
|
CheckSolutionType,
|
|
133
139
|
CheckSpacesInFilename,
|
|
@@ -15,15 +15,16 @@
|
|
|
15
15
|
# You should have received a copy of the GNU General Public License
|
|
16
16
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
|
|
18
|
-
from datetime import datetime
|
|
19
18
|
from pathlib import Path
|
|
20
19
|
from typing import Iterator
|
|
21
20
|
|
|
21
|
+
from troubadix.helper.date_format import (
|
|
22
|
+
check_date,
|
|
23
|
+
compare_date_with_last_modification_date,
|
|
24
|
+
)
|
|
22
25
|
from troubadix.helper.patterns import ScriptTag, get_script_tag_pattern
|
|
23
26
|
from troubadix.plugin import FileContentPlugin, LinterError, LinterResult
|
|
24
27
|
|
|
25
|
-
LENGTH = 44
|
|
26
|
-
|
|
27
28
|
|
|
28
29
|
class CheckCreationDate(FileContentPlugin):
|
|
29
30
|
name = "creation_date"
|
|
@@ -39,72 +40,35 @@ class CheckCreationDate(FileContentPlugin):
|
|
|
39
40
|
):
|
|
40
41
|
return
|
|
41
42
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
plugin=self.name,
|
|
47
|
-
)
|
|
48
|
-
return
|
|
49
|
-
|
|
50
|
-
tag_pattern = get_script_tag_pattern(ScriptTag.CREATION_DATE)
|
|
51
|
-
|
|
52
|
-
# Example: "2017-11-29 13:56:41 +0100 (Wed, 29 Nov 2017)"
|
|
53
|
-
match = tag_pattern.search(file_content)
|
|
54
|
-
|
|
55
|
-
if not match:
|
|
56
|
-
yield LinterError(
|
|
57
|
-
"False or incorrectly formatted creation_date.",
|
|
58
|
-
file=nasl_file,
|
|
59
|
-
plugin=self.name,
|
|
60
|
-
)
|
|
61
|
-
return
|
|
43
|
+
creation_date_pattern = get_script_tag_pattern(ScriptTag.CREATION_DATE)
|
|
44
|
+
last_modification_pattern = get_script_tag_pattern(
|
|
45
|
+
ScriptTag.LAST_MODIFICATION
|
|
46
|
+
)
|
|
62
47
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
)
|
|
67
|
-
# 2017-11-29 13:56:41 +0100 (error if no timezone)
|
|
68
|
-
date_right = datetime.strptime(
|
|
69
|
-
match.group("value")[27:43], "%a, %d %b %Y"
|
|
70
|
-
)
|
|
71
|
-
week_day_parsed = date_right.strftime("%a")
|
|
72
|
-
except ValueError:
|
|
48
|
+
if not (
|
|
49
|
+
match_creation_date := creation_date_pattern.search(file_content)
|
|
50
|
+
):
|
|
73
51
|
yield LinterError(
|
|
74
|
-
"
|
|
52
|
+
"No creation_date has been found.",
|
|
75
53
|
file=nasl_file,
|
|
76
54
|
plugin=self.name,
|
|
77
55
|
)
|
|
78
56
|
return
|
|
79
57
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
file=nasl_file,
|
|
86
|
-
plugin=self.name,
|
|
87
|
-
)
|
|
88
|
-
# Check correct weekday
|
|
89
|
-
elif week_day_str != week_day_parsed:
|
|
90
|
-
formatted_date = week_day_parsed
|
|
91
|
-
yield LinterError(
|
|
92
|
-
f"Wrong day of week. Please change it from '{week_day_str}"
|
|
93
|
-
f"' to '{formatted_date}'.",
|
|
94
|
-
file=nasl_file,
|
|
95
|
-
plugin=self.name,
|
|
96
|
-
)
|
|
97
|
-
|
|
98
|
-
last_modification_pattern = get_script_tag_pattern(
|
|
99
|
-
ScriptTag.LAST_MODIFICATION
|
|
58
|
+
yield from check_date(
|
|
59
|
+
match_creation_date.group("value"),
|
|
60
|
+
"creation_date",
|
|
61
|
+
nasl_file,
|
|
62
|
+
self.name,
|
|
100
63
|
)
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
64
|
+
|
|
65
|
+
if match_last_mod_date := last_modification_pattern.search(
|
|
66
|
+
file_content
|
|
67
|
+
):
|
|
68
|
+
yield from compare_date_with_last_modification_date(
|
|
69
|
+
match_creation_date.group("value"),
|
|
70
|
+
"creation_date",
|
|
71
|
+
match_last_mod_date.group("value"),
|
|
72
|
+
nasl_file,
|
|
73
|
+
self.name,
|
|
104
74
|
)
|
|
105
|
-
if date_left > last_modification:
|
|
106
|
-
yield LinterError(
|
|
107
|
-
"The creation_date must not be greater than the last modification date.",
|
|
108
|
-
file=nasl_file,
|
|
109
|
-
plugin=self.name,
|
|
110
|
-
)
|
troubadix/plugins/cvss_format.py
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
#
|
|
15
15
|
# You should have received a copy of the GNU General Public License
|
|
16
16
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
|
-
|
|
17
|
+
|
|
18
18
|
from pathlib import Path
|
|
19
19
|
from typing import Iterator
|
|
20
20
|
|
|
@@ -41,25 +41,14 @@ class CheckCVSSFormat(FileContentPlugin):
|
|
|
41
41
|
ScriptTag.CVSS_BASE_VECTOR
|
|
42
42
|
)
|
|
43
43
|
|
|
44
|
-
|
|
45
|
-
if missing_cvss_base:
|
|
44
|
+
if not cvss_base_pattern.search(file_content):
|
|
46
45
|
yield LinterError(
|
|
47
|
-
"VT has a missing cvss_base value.",
|
|
46
|
+
"VT has a missing or invalid cvss_base value.",
|
|
48
47
|
file=nasl_file,
|
|
49
48
|
plugin=self.name,
|
|
50
49
|
)
|
|
51
|
-
else:
|
|
52
|
-
cvss_detect = cvss_base_pattern.search(file_content)
|
|
53
|
-
if not cvss_detect:
|
|
54
|
-
yield LinterError(
|
|
55
|
-
"VT has an invalid cvss_base value.",
|
|
56
|
-
file=nasl_file,
|
|
57
|
-
plugin=self.name,
|
|
58
|
-
)
|
|
59
|
-
|
|
60
|
-
vector_match = cvss_base_vector_pattern.search(file_content)
|
|
61
50
|
|
|
62
|
-
if not
|
|
51
|
+
if not cvss_base_vector_pattern.search(file_content):
|
|
63
52
|
yield LinterError(
|
|
64
53
|
"VT has a missing or invalid cvss_base_vector value.",
|
|
65
54
|
file=nasl_file,
|
|
@@ -26,7 +26,12 @@ from troubadix.helper.patterns import (
|
|
|
26
26
|
)
|
|
27
27
|
from troubadix.plugin import FileContentPlugin, LinterError, LinterResult
|
|
28
28
|
|
|
29
|
-
MANDATORY_TAGS = [
|
|
29
|
+
MANDATORY_TAGS = [
|
|
30
|
+
ScriptTag.SUMMARY,
|
|
31
|
+
ScriptTag.CVSS_BASE,
|
|
32
|
+
ScriptTag.CVSS_BASE_VECTOR,
|
|
33
|
+
]
|
|
34
|
+
|
|
30
35
|
MANDATORY_SPECIAL_TAGS = [
|
|
31
36
|
SpecialScriptTag.NAME,
|
|
32
37
|
SpecialScriptTag.VERSION,
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
2
|
+
# SPDX-FileCopyrightText: 2025 Greenbone AG
|
|
3
|
+
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import Iterator
|
|
6
|
+
|
|
7
|
+
from troubadix.helper import ScriptTag, get_script_tag_pattern
|
|
8
|
+
from troubadix.helper.date_format import (
|
|
9
|
+
check_date,
|
|
10
|
+
compare_date_with_last_modification_date,
|
|
11
|
+
)
|
|
12
|
+
from troubadix.plugin import FileContentPlugin, LinterResult
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class CheckSeverityDate(FileContentPlugin):
|
|
16
|
+
name = "check_severity_date"
|
|
17
|
+
|
|
18
|
+
def check_content(
|
|
19
|
+
self,
|
|
20
|
+
nasl_file: Path,
|
|
21
|
+
file_content: str,
|
|
22
|
+
) -> Iterator[LinterResult]:
|
|
23
|
+
|
|
24
|
+
if nasl_file.suffix == ".inc":
|
|
25
|
+
return
|
|
26
|
+
|
|
27
|
+
severity_date_pattern = get_script_tag_pattern(ScriptTag.SEVERITY_DATE)
|
|
28
|
+
last_modification_pattern = get_script_tag_pattern(
|
|
29
|
+
ScriptTag.LAST_MODIFICATION
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
if not (
|
|
33
|
+
match_severity_date := severity_date_pattern.search(file_content)
|
|
34
|
+
):
|
|
35
|
+
return
|
|
36
|
+
|
|
37
|
+
yield from check_date(
|
|
38
|
+
match_severity_date.group("value"),
|
|
39
|
+
"severity_date",
|
|
40
|
+
nasl_file,
|
|
41
|
+
self.name,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
if match_last_mod_date := last_modification_pattern.search(
|
|
45
|
+
file_content
|
|
46
|
+
):
|
|
47
|
+
yield from compare_date_with_last_modification_date(
|
|
48
|
+
match_severity_date.group("value"),
|
|
49
|
+
"severity_date",
|
|
50
|
+
match_last_mod_date.group("value"),
|
|
51
|
+
nasl_file,
|
|
52
|
+
self.name,
|
|
53
|
+
)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
2
|
+
# SPDX-FileCopyrightText: 2025 Greenbone AG
|
|
3
|
+
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import Iterator
|
|
6
|
+
|
|
7
|
+
from troubadix.helper import ScriptTag, get_script_tag_pattern
|
|
8
|
+
from troubadix.plugin import FileContentPlugin, LinterError, LinterResult
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class CheckSeverityFormat(FileContentPlugin):
|
|
12
|
+
name = "check_severity_format"
|
|
13
|
+
|
|
14
|
+
def check_content(
|
|
15
|
+
self,
|
|
16
|
+
nasl_file: Path,
|
|
17
|
+
file_content: str,
|
|
18
|
+
) -> Iterator[LinterResult]:
|
|
19
|
+
|
|
20
|
+
if nasl_file.suffix == ".inc" or "severity_vector" not in file_content:
|
|
21
|
+
return
|
|
22
|
+
|
|
23
|
+
severity_vector_pattern = get_script_tag_pattern(
|
|
24
|
+
ScriptTag.SEVERITY_VECTOR
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
severity_vector_match = severity_vector_pattern.search(file_content)
|
|
28
|
+
if not severity_vector_match:
|
|
29
|
+
yield LinterError(
|
|
30
|
+
"VT has an invalid severity_vector value.",
|
|
31
|
+
file=nasl_file,
|
|
32
|
+
plugin=self.name,
|
|
33
|
+
)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
2
|
+
# SPDX-FileCopyrightText: 2025 Greenbone AG
|
|
3
|
+
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import Iterator
|
|
6
|
+
|
|
7
|
+
from troubadix.helper import ScriptTag, get_script_tag_pattern
|
|
8
|
+
from troubadix.plugin import FileContentPlugin, LinterError, LinterResult
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class CheckSeverityOrigin(FileContentPlugin):
|
|
12
|
+
name = "check_severity_origin"
|
|
13
|
+
|
|
14
|
+
def check_content(
|
|
15
|
+
self,
|
|
16
|
+
nasl_file: Path,
|
|
17
|
+
file_content: str,
|
|
18
|
+
) -> Iterator[LinterResult]:
|
|
19
|
+
|
|
20
|
+
if nasl_file.suffix == ".inc" or "severity_origin" not in file_content:
|
|
21
|
+
return
|
|
22
|
+
|
|
23
|
+
severity_origin_pattern = get_script_tag_pattern(
|
|
24
|
+
ScriptTag.SEVERITY_ORIGIN
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
severity_origin_match = severity_origin_pattern.search(file_content)
|
|
28
|
+
if not severity_origin_match:
|
|
29
|
+
yield LinterError(
|
|
30
|
+
"VT has an invalid severity_origin value.",
|
|
31
|
+
file=nasl_file,
|
|
32
|
+
plugin=self.name,
|
|
33
|
+
)
|
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
troubadix/__init__.py,sha256=K7sIXXDrC7YRb7BvIpdQ6ZfG_QkT0qUH_wAlHROVRfM,716
|
|
2
|
-
troubadix/__version__.py,sha256=
|
|
2
|
+
troubadix/__version__.py,sha256=2JsvA-ZUAmnlYulTht-dHiCPoWdAAwJ4kZzLSqfgQkA,103
|
|
3
3
|
troubadix/argparser.py,sha256=-H07Jhqh68_M4Mbjq9qJjTr3MShy_N2pxl2qHA6cfRU,7481
|
|
4
4
|
troubadix/codespell/codespell.additions,sha256=E62zoHJavUhcbMoyBqO2rOUe3OqIXikh7uAiGmNs5uw,524
|
|
5
5
|
troubadix/codespell/codespell.exclude,sha256=8blBv8KRrKU4KQhneHOPth1tSCYdrEoOCI5kYRfhOEA,147451
|
|
6
6
|
troubadix/codespell/codespell.ignore,sha256=2CP8u6O2VENcDpt2FfEDNmfa1Eh3D80yeYHT54GM1X4,1512
|
|
7
7
|
troubadix/helper/__init__.py,sha256=tp2fPLzwGEA_2eiJbvuePiY6rjYSFxx7VUsCV4fSwvw,1110
|
|
8
|
+
troubadix/helper/date_format.py,sha256=2m8EWZPmTQ1kxgv4i5hrPoPlAA8usjz28aRff352zNU,2488
|
|
8
9
|
troubadix/helper/helper.py,sha256=GXapYLii2rLKwkX2ok31YoAdUSizBnyPjWz-aPP6HM8,3105
|
|
9
10
|
troubadix/helper/linguistic_exception_handler.py,sha256=Bq7ULjDdWTKUpFNTUX6XMPdD4s4v8eIjZPyqBe8VLws,6811
|
|
10
|
-
troubadix/helper/patterns.py,sha256=
|
|
11
|
+
troubadix/helper/patterns.py,sha256=qhiAtNQs89Hk6-yRGrjjRO4DdVIMhYLd8IEQ48REpu4,9752
|
|
11
12
|
troubadix/plugin.py,sha256=3fQPj3Qe_hgwHerlYE4hbdzYMzRU557NxJ-UwtE9mOI,3525
|
|
12
|
-
troubadix/plugins/__init__.py,sha256=
|
|
13
|
+
troubadix/plugins/__init__.py,sha256=w5ItmwNALfW4tIHuPuxqi2PMExA6eKbLiXCmviY9CSE,8661
|
|
13
14
|
troubadix/plugins/badwords.py,sha256=k1A1d2pdXzie87FGGXrykP2BgdZbY5QtmQItupHtNyw,4701
|
|
14
15
|
troubadix/plugins/copyright_text.py,sha256=jYsLWmTbT_A78XQQxQFK-5kMMHkh3xdvlh7mEF2dZGU,3583
|
|
15
16
|
troubadix/plugins/copyright_year.py,sha256=XzM9MHVzOXwNLwHpfuaWj8PUOmswr56SBVOLBdvxjd4,5478
|
|
16
|
-
troubadix/plugins/creation_date.py,sha256=
|
|
17
|
+
troubadix/plugins/creation_date.py,sha256=PRM5z_7cgQhRQ7Kx7ufF8E8LzVNGP5hLSeH25UWJEn8,2403
|
|
17
18
|
troubadix/plugins/cve_format.py,sha256=Ue6b9RzuQZWOdBd6y5ruqdEq2zyRb2_FSUQScnjHOUQ,3400
|
|
18
|
-
troubadix/plugins/cvss_format.py,sha256=
|
|
19
|
+
troubadix/plugins/cvss_format.py,sha256=KxZ1n_4hU4BCxlABD1rsHrQMHlEElOWcxr-802ItgFI,1926
|
|
19
20
|
troubadix/plugins/dependencies.py,sha256=zLCioIiHlBYO6ViO3vXOIQboESyHaIQ9y6pSuoYP9aU,4118
|
|
20
21
|
troubadix/plugins/dependency_category_order.py,sha256=CrEWJHDeuD4zdSnKghsjf_D5EICQDN2Dv72OsVrYgnU,7010
|
|
21
22
|
troubadix/plugins/deprecated_dependency.py,sha256=TFTe9fO4A0S3JTXpxdHaVnQ9ZSHR3lLQjggS_FjGY-s,3831
|
|
@@ -49,12 +50,15 @@ troubadix/plugins/script_copyright.py,sha256=z8TjoDDMonne1xEUjEmwOVKvuGJ0CkEk9rt
|
|
|
49
50
|
troubadix/plugins/script_family.py,sha256=Nhro0DrGm7MLaLZWYEMPGKZg5xDjoCoUotyOMS8Ml80,4098
|
|
50
51
|
troubadix/plugins/script_tag_form.py,sha256=J5vZcwgvvyeMa4sulfQinEQpU7braKhDWdZ9j3UfoM0,1773
|
|
51
52
|
troubadix/plugins/script_tag_whitespaces.py,sha256=2ZqiNufPIyr5Wmcuap3Wy8RXO_CHGUepvYOL_2za59c,2319
|
|
52
|
-
troubadix/plugins/script_tags_mandatory.py,sha256=
|
|
53
|
+
troubadix/plugins/script_tags_mandatory.py,sha256=NTAxypWalrfyd2YjzK-kH4BHeah4MZiFNeyNaKHNz-c,2695
|
|
53
54
|
troubadix/plugins/script_version_and_last_modification_tags.py,sha256=Yz9dQwrsRfIqXwPd8Re8aDu--SBjgufWOA6U7tW4JW4,7638
|
|
54
55
|
troubadix/plugins/script_xref_form.py,sha256=5L1KPUHiKbe-71o-X0cUBT844XvIOsAJbB14gnYTod0,1848
|
|
55
56
|
troubadix/plugins/script_xref_url.py,sha256=dUTq0ghreVBHFJnwSInmMoQAQwU0oh959mMz4l6rWA0,5331
|
|
56
57
|
troubadix/plugins/security_messages.py,sha256=EPu3-YB0iP5_hfbQjrfvvTrQRiPgDjC85GTz3V-by0Q,4629
|
|
57
58
|
troubadix/plugins/set_get_kb_calls.py,sha256=WGu1CKLjn3VhbDo33IJ4TtWQ-kz9gInkJskTqOSMM6k,3415
|
|
59
|
+
troubadix/plugins/severity_date.py,sha256=PtVQrZfJNZ23FO-hDFbAaA5YZdv5gm4Se0llFL7sKLM,1492
|
|
60
|
+
troubadix/plugins/severity_format.py,sha256=5NSuAE8HH5BesDtVfbuLCv0Dd9PGw9jNRKXPvKhr0oQ,980
|
|
61
|
+
troubadix/plugins/severity_origin.py,sha256=OsHfkLPLd8UQkEyBXcJ8v_woV1aL-iTSXexTq_4_Y0I,980
|
|
58
62
|
troubadix/plugins/solution_text.py,sha256=4Gs84Qsyg-1iTDP7Y7o8Bo5AH4hKlwGPW0NfwMpx2fU,5852
|
|
59
63
|
troubadix/plugins/solution_type.py,sha256=6wq7lj0bCL6tTaZ-d_aGKq6a_jVlCD73GltHJsJhmm8,2602
|
|
60
64
|
troubadix/plugins/spaces_before_dots.py,sha256=8metqLHLN3y259CzZckrglatwA0Uwn4mvV_bkFZZbT4,4844
|
|
@@ -98,8 +102,8 @@ troubadix/standalone_plugins/last_modification.py,sha256=ROzwVzzYilXJ0llVt4Lv0w8
|
|
|
98
102
|
troubadix/standalone_plugins/no_solution.py,sha256=p_-az9Igl4GH6HnhLLYbYlWIiEP64OTQLpX-z3JAshs,8760
|
|
99
103
|
troubadix/standalone_plugins/version_updated.py,sha256=6YHF0OjL5NWszQdsSh7XzlSji1e6Uaqwu_Y6m3R0mvI,4203
|
|
100
104
|
troubadix/troubadix.py,sha256=5__Jz3bYSrya4aG6RCBWxqnsDepXfwXZ3v0bjCzEFi0,6039
|
|
101
|
-
troubadix-25.6.
|
|
102
|
-
troubadix-25.6.
|
|
103
|
-
troubadix-25.6.
|
|
104
|
-
troubadix-25.6.
|
|
105
|
-
troubadix-25.6.
|
|
105
|
+
troubadix-25.6.1.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
106
|
+
troubadix-25.6.1.dist-info/METADATA,sha256=9rwqkTrr9ZEMC4n54tWbDu0A3bwBj7_HKKsmpBzZgpg,4462
|
|
107
|
+
troubadix-25.6.1.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
108
|
+
troubadix-25.6.1.dist-info/entry_points.txt,sha256=SnhEUe4W76P-ADmO9J355gRztTyHU_PTxRewKy3-e5o,832
|
|
109
|
+
troubadix-25.6.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|