troubadix 25.5.1__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 CHANGED
@@ -2,4 +2,4 @@
2
2
 
3
3
  # THIS IS AN AUTOGENERATED FILE. DO NOT TOUCH!
4
4
 
5
- __version__ = "25.5.1"
5
+ __version__ = "25.6.1"
@@ -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
+ )
@@ -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
  }
@@ -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
- if "creation_date" not in file_content:
43
- yield LinterError(
44
- "No creation date has been found.",
45
- file=nasl_file,
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
- try:
64
- date_left = datetime.strptime(
65
- match.group("value")[:25], "%Y-%m-%d %H:%M:%S %z"
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
- "False or incorrectly formatted creation_date.",
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
- week_day_str = match.group("value")[27:30]
81
- # Wed, 29 Nov 2017
82
- if date_left.date() != date_right.date():
83
- yield LinterError(
84
- "The creation_date consists of two different dates.",
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
- if match := last_modification_pattern.search(file_content):
102
- last_modification = datetime.strptime(
103
- match.group("value")[:25], "%Y-%m-%d %H:%M:%S %z"
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
- )
@@ -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
- import re
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
- missing_cvss_base = re.search('"cvss_base", value:""', file_content)
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 vector_match:
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,
@@ -92,7 +92,10 @@ class CheckForkingNaslFunctions(FileContentPlugin):
92
92
  return
93
93
 
94
94
  # This one is using if/else calls similar to the examples above.
95
- if "2013/gb_sap_netweaver_portal_rce_04_13.nasl" in str(nasl_file):
95
+ if (
96
+ "2011/zohocorp/gb_manageengine_adselfservice_plus_xss_vuln.nasl"
97
+ in str(nasl_file)
98
+ ):
96
99
  return
97
100
 
98
101
  # Another example using if/else calls
@@ -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 = [ScriptTag.SUMMARY]
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,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: troubadix
3
- Version: 25.5.1
3
+ Version: 25.6.1
4
4
  Summary: A linting and QA check tool for NASL files
5
5
  License: GPL-3.0-or-later
6
6
  Author: Greenbone
@@ -1,21 +1,22 @@
1
1
  troubadix/__init__.py,sha256=K7sIXXDrC7YRb7BvIpdQ6ZfG_QkT0qUH_wAlHROVRfM,716
2
- troubadix/__version__.py,sha256=LXQfstQONlY3yqClCAoDXTa7YfdROuMDSJQJ7Fz7Gjg,103
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=_ifRnwHsPee9B0yRYSCsyFms4StWVWJq7I9YnQwToa8,9174
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=v328Yxgd8dU8g69Jpe4li-HM0iaqoT9_bOxfA7hP8jU,8445
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=TyYnbCdmuBuPYNE79Y5hnoQUr5BIOnvJwpHovu8xE98,3793
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=GrZfZxkxSh9OVixmBBnHQ4NzF9nN2tCK1vepz_-U60g,2309
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
@@ -24,7 +25,7 @@ troubadix/plugins/double_end_points.py,sha256=1TLVc8HFYEKS870zaIoKmsAjBsRU9WZpaM
24
25
  troubadix/plugins/duplicate_oid.py,sha256=lemYl3CUoOMFtRTLnlfjwPptnN51sQby3D9YjFtOv2Q,2652
25
26
  troubadix/plugins/duplicated_script_tags.py,sha256=UPBR2jbU15JLKJlVk1e2GFREH5Wj5Ax2yDFrmRKq74Y,3123
26
27
  troubadix/plugins/encoding.py,sha256=zNzqNpP39TUwOklnc8OJ3OIUelAN_hvnuBYoa3Pz764,2104
27
- troubadix/plugins/forking_nasl_functions.py,sha256=pYUebqPBWuqfLmnRYJgpGnrmx4YbnKIiRG8cmsIgmq4,6014
28
+ troubadix/plugins/forking_nasl_functions.py,sha256=IUtCrTK_sGDx79jAPS8lF_aN8zSG2AkzfC6duTMvJOw,6069
28
29
  troubadix/plugins/get_kb_on_services.py,sha256=oFmcjiF7ZD3x5tEbJEoZNn80y1qUzNgeSZNsogSqaZ0,3401
29
30
  troubadix/plugins/grammar.py,sha256=9VPdf4nO-UOE2P8fiAKgh_8GwjGbLztPEixb2AQyeFU,9642
30
31
  troubadix/plugins/http_links_in_tags.py,sha256=yKT5SgLo__TJKAfudfIHkoMF0g9VtOP4VI77dANj014,7221
@@ -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=t9GiueHwCjWq-2jQszYNufWpfIKTLdUbbvXPyiw3HeY,2630
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.5.1.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
102
- troubadix-25.5.1.dist-info/METADATA,sha256=8sobP8uVeENf538OPVi3C1WwJCM6GwIwIn-12e5DjBU,4462
103
- troubadix-25.5.1.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
104
- troubadix-25.5.1.dist-info/entry_points.txt,sha256=SnhEUe4W76P-ADmO9J355gRztTyHU_PTxRewKy3-e5o,832
105
- troubadix-25.5.1.dist-info/RECORD,,
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,,