Skip to content

Commit de44555

Browse files
authored
api_app: AnalysisResponseSerializer, md5 calc fixes (#731)
1 parent aa8c27f commit de44555

File tree

3 files changed

+53
-58
lines changed

3 files changed

+53
-58
lines changed

api_app/api.py

Lines changed: 17 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -91,19 +91,25 @@ def _analysis_request(
9191
),
9292
)
9393

94-
response_dict = {
95-
"status": "accepted",
96-
"job_id": job.pk,
97-
"warnings": warnings,
98-
"analyzers_running": cleaned_analyzer_list,
99-
"connectors_running": cleaned_connectors_list,
100-
}
94+
ser = serializers.AnalysisResponseSerializer(
95+
data={
96+
"status": "accepted",
97+
"job_id": job.pk,
98+
"warnings": warnings,
99+
"analyzers_running": cleaned_analyzer_list,
100+
"connectors_running": cleaned_connectors_list,
101+
}
102+
)
103+
ser.is_valid(raise_exception=True)
104+
105+
response_dict = ser.data
101106

102107
logger.debug(response_dict)
103108

104109
return Response(
105-
response_dict, status=status.HTTP_200_OK
106-
) # lgtm [py/stack-trace-exposure]
110+
response_dict,
111+
status=status.HTTP_200_OK,
112+
)
107113

108114

109115
""" REST API endpoints """
@@ -188,18 +194,7 @@ def ask_analysis_availability(request):
188194
@add_docs(
189195
description="This endpoint allows to start a Job related to a file",
190196
request=serializers.FileAnalysisSerializer,
191-
responses={
192-
200: inline_serializer(
193-
"FileAnalysisResponseSerializer",
194-
fields={
195-
"status": rfs.StringRelatedField(),
196-
"job_id": rfs.IntegerField(),
197-
"warnings": OpenApiTypes.OBJECT,
198-
"analyzers_running": OpenApiTypes.OBJECT,
199-
"connectors_running": OpenApiTypes.OBJECT,
200-
},
201-
),
202-
},
197+
responses={200: serializers.AnalysisResponseSerializer},
203198
)
204199
@api_view(["POST"])
205200
@permission_required_or_403("api_app.add_job")
@@ -210,18 +205,7 @@ def analyze_file(request):
210205
@add_docs(
211206
description="This endpoint allows to start a Job related to an observable",
212207
request=serializers.ObservableAnalysisSerializer,
213-
responses={
214-
200: inline_serializer(
215-
"ObservableAnalysisResponseSerializer",
216-
fields={
217-
"status": rfs.StringRelatedField(),
218-
"job_id": rfs.IntegerField(),
219-
"warnings": OpenApiTypes.OBJECT,
220-
"analyzers_running": OpenApiTypes.OBJECT,
221-
"connectors_running": OpenApiTypes.OBJECT,
222-
},
223-
),
224-
},
208+
responses={200: serializers.AnalysisResponseSerializer},
225209
)
226210
@api_view(["POST"])
227211
@permission_required_or_403("api_app.add_job")

api_app/serializers.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"JobSerializer",
2929
"FileAnalysisSerializer",
3030
"ObservableAnalysisSerializer",
31+
"AnalysisResponseSerializer",
3132
]
3233

3334

@@ -221,7 +222,9 @@ def validate(self, attrs: dict) -> dict:
221222
# calculate ``file_mimetype``
222223
attrs["file_mimetype"] = calculate_mimetype(attrs["file"], attrs["file_name"])
223224
# calculate ``md5``
224-
file_buffer = attrs["file"].file.read()
225+
file_obj = attrs["file"].file
226+
file_obj.seek(0)
227+
file_buffer = file_obj.read()
225228
attrs["md5"] = calculate_md5(file_buffer)
226229
logger.debug(f"after attrs: {attrs}")
227230
return attrs
@@ -268,3 +271,11 @@ def validate(self, attrs: dict) -> dict:
268271
attrs["md5"] = calculate_md5(attrs["observable_name"].encode("utf-8"))
269272
logger.debug(f"after attrs: {attrs}")
270273
return attrs
274+
275+
276+
class AnalysisResponseSerializer(serializers.Serializer):
277+
job_id = serializers.IntegerField()
278+
status = serializers.CharField()
279+
warnings = serializers.ListField()
280+
analyzers_running = serializers.ListField()
281+
connectors_running = serializers.ListField()

docs/source/schema.yml

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ paths:
2828
content:
2929
application/json:
3030
schema:
31-
$ref: '#/components/schemas/FileAnalysisResponse'
31+
$ref: '#/components/schemas/AnalysisResponse'
3232
description: ''
3333
/api/analyze_observable:
3434
post:
@@ -55,7 +55,7 @@ paths:
5555
content:
5656
application/json:
5757
schema:
58-
$ref: '#/components/schemas/ObservableAnalysisResponse'
58+
$ref: '#/components/schemas/AnalysisResponse'
5959
description: ''
6060
/api/analyzer/{name}/healthcheck:
6161
get:
@@ -593,6 +593,28 @@ paths:
593593
description: No response body
594594
components:
595595
schemas:
596+
AnalysisResponse:
597+
type: object
598+
properties:
599+
job_id:
600+
type: integer
601+
status:
602+
type: string
603+
warnings:
604+
type: array
605+
items: {}
606+
analyzers_running:
607+
type: array
608+
items: {}
609+
connectors_running:
610+
type: array
611+
items: {}
612+
required:
613+
- analyzers_running
614+
- connectors_running
615+
- job_id
616+
- status
617+
- warnings
596618
AnalyzerConfig:
597619
type: object
598620
description: Serializer for `analyzer_config.json`.
@@ -840,17 +862,6 @@ components:
840862
- file
841863
- file_name
842864
- id
843-
FileAnalysisResponse:
844-
type: object
845-
properties:
846-
status:
847-
type: string
848-
readOnly: true
849-
job_id:
850-
type: integer
851-
required:
852-
- job_id
853-
- status
854865
GetAnalyzerConfigsFailedResponse:
855866
type: object
856867
properties:
@@ -1126,17 +1137,6 @@ components:
11261137
required:
11271138
- id
11281139
- observable_name
1129-
ObservableAnalysisResponse:
1130-
type: object
1131-
properties:
1132-
status:
1133-
type: string
1134-
readOnly: true
1135-
job_id:
1136-
type: integer
1137-
required:
1138-
- job_id
1139-
- status
11401140
ObservableSupportedEnum:
11411141
enum:
11421142
- ip

0 commit comments

Comments
 (0)