|
29 | 29 | from dojo.authorization.roles_permissions import Permissions |
30 | 30 | from dojo.endpoint.utils import endpoint_filter, endpoint_meta_import |
31 | 31 | from dojo.finding.helper import ( |
| 32 | + save_endpoints_template, |
32 | 33 | save_vulnerability_ids, |
33 | 34 | save_vulnerability_ids_template, |
34 | 35 | ) |
|
111 | 112 | User, |
112 | 113 | UserContactInfo, |
113 | 114 | Vulnerability_Id, |
114 | | - Vulnerability_Id_Template, |
115 | 115 | get_current_date, |
116 | 116 | ) |
117 | 117 | from dojo.notifications.helper import create_notification |
@@ -2029,57 +2029,80 @@ def validate_severity(self, value: str) -> str: |
2029 | 2029 | return value |
2030 | 2030 |
|
2031 | 2031 |
|
2032 | | -class VulnerabilityIdTemplateSerializer(serializers.ModelSerializer): |
2033 | | - class Meta: |
2034 | | - model = Vulnerability_Id_Template |
2035 | | - fields = ["vulnerability_id"] |
2036 | | - |
2037 | | - |
2038 | 2032 | class FindingTemplateSerializer(serializers.ModelSerializer): |
2039 | 2033 | tags = TagListSerializerField(required=False) |
2040 | | - vulnerability_ids = VulnerabilityIdTemplateSerializer( |
2041 | | - source="vulnerability_id_template_set", many=True, required=False, |
2042 | | - ) |
| 2034 | + vulnerability_ids = serializers.SerializerMethodField() |
| 2035 | + endpoints = serializers.SerializerMethodField() |
2043 | 2036 |
|
2044 | 2037 | class Meta: |
2045 | 2038 | model = Finding_Template |
2046 | | - exclude = ("cve",) |
| 2039 | + exclude = ("cve", "vulnerability_ids_text") |
| 2040 | + |
| 2041 | + @extend_schema_field(serializers.ListField(child=serializers.CharField())) |
| 2042 | + def get_vulnerability_ids(self, obj): |
| 2043 | + """Return vulnerability IDs as a list of strings.""" |
| 2044 | + return obj.vulnerability_ids |
| 2045 | + |
| 2046 | + @extend_schema_field(serializers.ListField(child=serializers.CharField())) |
| 2047 | + def get_endpoints(self, obj): |
| 2048 | + """Return endpoints as a list of URL strings.""" |
| 2049 | + return obj.endpoints if hasattr(obj, "endpoints") else [] |
2047 | 2050 |
|
2048 | 2051 | def create(self, validated_data): |
2049 | 2052 |
|
2050 | | - # Save vulnerability ids and pop them |
2051 | | - if "vulnerability_id_template_set" in validated_data: |
2052 | | - vulnerability_id_set = validated_data.pop( |
2053 | | - "vulnerability_id_template_set", |
2054 | | - ) |
2055 | | - else: |
2056 | | - vulnerability_id_set = None |
| 2053 | + # Handle vulnerability_ids if provided as list |
| 2054 | + vulnerability_ids = None |
| 2055 | + if "vulnerability_ids" in self.initial_data: |
| 2056 | + vulnerability_ids = self.initial_data.get("vulnerability_ids", []) |
| 2057 | + if isinstance(vulnerability_ids, str): |
| 2058 | + # If it's a string, split by newlines |
| 2059 | + vulnerability_ids = [vid.strip() for vid in vulnerability_ids.split("\n") if vid.strip()] |
| 2060 | + elif not isinstance(vulnerability_ids, list): |
| 2061 | + vulnerability_ids = [] |
| 2062 | + |
| 2063 | + # Handle endpoints if provided as list |
| 2064 | + endpoint_urls = None |
| 2065 | + if "endpoints" in self.initial_data: |
| 2066 | + endpoint_urls = self.initial_data.get("endpoints", []) |
| 2067 | + if isinstance(endpoint_urls, str): |
| 2068 | + # If it's a string, split by newlines |
| 2069 | + endpoint_urls = [url.strip() for url in endpoint_urls.split("\n") if url.strip()] |
| 2070 | + elif not isinstance(endpoint_urls, list): |
| 2071 | + endpoint_urls = [] |
2057 | 2072 |
|
2058 | 2073 | new_finding_template = super().create( |
2059 | 2074 | validated_data, |
2060 | 2075 | ) |
2061 | 2076 |
|
2062 | | - if vulnerability_id_set: |
2063 | | - vulnerability_ids = [vulnerability_id["vulnerability_id"] for vulnerability_id in vulnerability_id_set] |
2064 | | - validated_data["cve"] = vulnerability_ids[0] |
2065 | | - save_vulnerability_ids_template( |
2066 | | - new_finding_template, vulnerability_ids, |
2067 | | - ) |
2068 | | - new_finding_template.save() |
| 2077 | + # Save vulnerability IDs using helper |
| 2078 | + if vulnerability_ids: |
| 2079 | + save_vulnerability_ids_template(new_finding_template, vulnerability_ids) |
| 2080 | + |
| 2081 | + # Save endpoints using helper |
| 2082 | + if endpoint_urls: |
| 2083 | + save_endpoints_template(new_finding_template, endpoint_urls) |
2069 | 2084 |
|
2070 | 2085 | return new_finding_template |
2071 | 2086 |
|
2072 | 2087 | def update(self, instance, validated_data): |
2073 | | - # Save vulnerability ids and pop them |
2074 | | - if "vulnerability_id_template_set" in validated_data: |
2075 | | - vulnerability_id_set = validated_data.pop( |
2076 | | - "vulnerability_id_template_set", |
2077 | | - ) |
2078 | | - vulnerability_ids = [] |
2079 | | - if vulnerability_id_set: |
2080 | | - vulnerability_ids.extend(vulnerability_id["vulnerability_id"] for vulnerability_id in vulnerability_id_set) |
| 2088 | + # Handle vulnerability_ids if provided |
| 2089 | + if "vulnerability_ids" in self.initial_data: |
| 2090 | + vulnerability_ids = self.initial_data.get("vulnerability_ids", []) |
| 2091 | + if isinstance(vulnerability_ids, str): |
| 2092 | + vulnerability_ids = [vid.strip() for vid in vulnerability_ids.split("\n") if vid.strip()] |
| 2093 | + elif not isinstance(vulnerability_ids, list): |
| 2094 | + vulnerability_ids = [] |
2081 | 2095 | save_vulnerability_ids_template(instance, vulnerability_ids) |
2082 | 2096 |
|
| 2097 | + # Handle endpoints if provided |
| 2098 | + if "endpoints" in self.initial_data: |
| 2099 | + endpoint_urls = self.initial_data.get("endpoints", []) |
| 2100 | + if isinstance(endpoint_urls, str): |
| 2101 | + endpoint_urls = [url.strip() for url in endpoint_urls.split("\n") if url.strip()] |
| 2102 | + elif not isinstance(endpoint_urls, list): |
| 2103 | + endpoint_urls = [] |
| 2104 | + save_endpoints_template(instance, endpoint_urls) |
| 2105 | + |
2083 | 2106 | return super().update(instance, validated_data) |
2084 | 2107 |
|
2085 | 2108 |
|
|
0 commit comments