Skip to content

Commit 8fa7e78

Browse files
committed
Handle errors at submission time for VMRay
1 parent 8117dd3 commit 8fa7e78

File tree

3 files changed

+180
-1
lines changed

3 files changed

+180
-1
lines changed

sandboxapi/vmray.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def analyze(self, handle, filename):
4040
response = self._request("/sample/submit", method='POST', files=files, headers=self.headers)
4141

4242
try:
43-
if response.status_code == 200:
43+
if response.status_code == 200 and not response.json()['data']['errors']:
4444
# only support single-file submissions; just grab the first one.
4545
return response.json()['data']['samples'][0]['sample_id']
4646
else:
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
{
2+
"data": {
3+
"errors": [
4+
{
5+
"error_msg": "Denied: The vmray quota for account 100 (AAAA (Account)) is exceeded. (00/000 used, 10 requested at 1000-00-00 10:00 (UTC+0) by aaaa@aaaa.com)",
6+
"submission_filename": "aaaa"
7+
}
8+
],
9+
"jobs": [],
10+
"md_jobs": [],
11+
"reputation_jobs": [
12+
{
13+
"reputation_job_created": "0000-00-00T00:00:00",
14+
"reputation_job_id": 10000,
15+
"reputation_job_priority": 1,
16+
"reputation_job_sample_id": 1000000,
17+
"reputation_job_sample_md5": "aaaa",
18+
"reputation_job_sample_sha1": "aaaa",
19+
"reputation_job_sample_sha256": "aaaa",
20+
"reputation_job_sample_ssdeep": "aaaa",
21+
"reputation_job_status": "queued",
22+
"reputation_job_statuschanged": "0000-00-00T00:00:00",
23+
"reputation_job_submission_id": 1000000,
24+
"reputation_job_user_email": "aaaa@aaaa.com",
25+
"reputation_job_user_id": 100
26+
},
27+
{
28+
"reputation_job_created": "0000-00-00T00:00:00",
29+
"reputation_job_id": 10000,
30+
"reputation_job_priority": 1,
31+
"reputation_job_sample_id": 1000000,
32+
"reputation_job_sample_md5": "aaaa",
33+
"reputation_job_sample_sha1": "aaaa",
34+
"reputation_job_sample_sha256": "aaaa",
35+
"reputation_job_sample_ssdeep": "aaaa",
36+
"reputation_job_status": "queued",
37+
"reputation_job_statuschanged": "0000-00-00T00:00:00",
38+
"reputation_job_submission_id": 1000000,
39+
"reputation_job_user_email": "aaaa@aaaa.com",
40+
"reputation_job_user_id": 100
41+
}
42+
],
43+
"samples": [
44+
{
45+
"sample_created": "0000-00-00T00:00:00",
46+
"sample_filename": "aaaa",
47+
"sample_filesize": 10000,
48+
"sample_id": 1000000,
49+
"sample_imphash": null,
50+
"sample_is_multipart": false,
51+
"sample_md5hash": "aaaa",
52+
"sample_priority": 1,
53+
"sample_sha1hash": "aaaa",
54+
"sample_sha256hash": "aaaa",
55+
"sample_ssdeephash": "aaaa",
56+
"sample_type": "Python script",
57+
"sample_url": null,
58+
"sample_webif_url": "https://cloud.vmray.com/user/sample/view?id=0000000",
59+
"submission_filename": "aaaa"
60+
},
61+
{
62+
"sample_created": "0000-00-00T00:00:00",
63+
"sample_filename": "aaaa",
64+
"sample_filesize": 1000,
65+
"sample_id": 1000000,
66+
"sample_imphash": null,
67+
"sample_is_multipart": false,
68+
"sample_md5hash": "aaaa",
69+
"sample_priority": 1,
70+
"sample_sha1hash": "aaaa",
71+
"sample_sha256hash": "aaaa",
72+
"sample_ssdeephash": "aaaa",
73+
"sample_type": "aaaa",
74+
"sample_url": null,
75+
"sample_webif_url": "https://cloud.vmray.com/user/sample/view?id=0000000",
76+
"submission_filename": "aaaa"
77+
}
78+
],
79+
"static_jobs": [],
80+
"submissions": [
81+
{
82+
"submission_analyzer_mode_analyzer_mode": "reputation_static_dynamic",
83+
"submission_analyzer_mode_enable_reputation": true,
84+
"submission_analyzer_mode_enable_triage": false,
85+
"submission_analyzer_mode_enable_whois": true,
86+
"submission_analyzer_mode_id": 100,
87+
"submission_analyzer_mode_triage_error_handling": null,
88+
"submission_comment": null,
89+
"submission_created": "0000-00-00T00:00:00",
90+
"submission_dll_call_mode": null,
91+
"submission_dll_calls": null,
92+
"submission_document_password": null,
93+
"submission_filename": "aaaa",
94+
"submission_finish_time": null,
95+
"submission_finished": false,
96+
"submission_has_errors": null,
97+
"submission_id": 1000000,
98+
"submission_ip_id": 1000,
99+
"submission_ip_ip": "00.00.000.0",
100+
"submission_known_configuration": false,
101+
"submission_original_filename": "aaaa",
102+
"submission_prescript_force_admin": false,
103+
"submission_prescript_id": null,
104+
"submission_priority": 1,
105+
"submission_reputation_mode": "disabled",
106+
"submission_sample_id": 1000000,
107+
"submission_sample_md5": "aaaa",
108+
"submission_sample_sha1": "aaaa",
109+
"submission_sample_sha256": "aaaa",
110+
"submission_sample_ssdeep": "aaaa",
111+
"submission_shareable": false,
112+
"submission_system_time": null,
113+
"submission_tags": [],
114+
"submission_triage_error_handling": null,
115+
"submission_type": "api",
116+
"submission_user_account_id": 10,
117+
"submission_user_account_name": "AAAA",
118+
"submission_user_account_subscription_mode": "aaaa",
119+
"submission_user_email": "aaaa@aaaa.com",
120+
"submission_user_id": 100,
121+
"submission_webif_url": "https://cloud.vmray.com/user/sample/view?id=0000000",
122+
"submission_whois_mode": "disabled"
123+
},
124+
{
125+
"submission_analyzer_mode_analyzer_mode": "reputation_static_dynamic",
126+
"submission_analyzer_mode_enable_reputation": true,
127+
"submission_analyzer_mode_enable_triage": false,
128+
"submission_analyzer_mode_enable_whois": true,
129+
"submission_analyzer_mode_id": 100,
130+
"submission_analyzer_mode_triage_error_handling": null,
131+
"submission_comment": null,
132+
"submission_created": "0000-00-00T00:00:00",
133+
"submission_dll_call_mode": null,
134+
"submission_dll_calls": null,
135+
"submission_document_password": null,
136+
"submission_filename": "aaaa",
137+
"submission_finish_time": null,
138+
"submission_finished": false,
139+
"submission_has_errors": null,
140+
"submission_id": 1000000,
141+
"submission_ip_id": 1000,
142+
"submission_ip_ip": "00.00.000.0",
143+
"submission_known_configuration": false,
144+
"submission_original_filename": "aaaa",
145+
"submission_prescript_force_admin": false,
146+
"submission_prescript_id": null,
147+
"submission_priority": 1,
148+
"submission_reputation_mode": "disabled",
149+
"submission_sample_id": 1000000,
150+
"submission_sample_md5": "aaaa",
151+
"submission_sample_sha1": "aaaa",
152+
"submission_sample_sha256": "aaaa",
153+
"submission_sample_ssdeep": "aaaa",
154+
"submission_shareable": false,
155+
"submission_system_time": null,
156+
"submission_tags": [],
157+
"submission_triage_error_handling": null,
158+
"submission_type": "api",
159+
"submission_user_account_id": 10,
160+
"submission_user_account_name": "AAAA",
161+
"submission_user_account_subscription_mode": "aaaa",
162+
"submission_user_email": "aaaa@aaaa.com",
163+
"submission_user_id": 100,
164+
"submission_webif_url": "https://cloud.vmray.com/user/sample/view?id=0000000",
165+
"submission_whois_mode": "disabled"
166+
}
167+
],
168+
"vt_jobs": [],
169+
"whois_jobs": []
170+
},
171+
"result": "ok"
172+
}

tests/tests.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,13 @@ def test_analyze(self):
262262
json=read_resource('vmray_sample_submit'))
263263
self.assertEquals(self.sandbox.analyze(io.BytesIO('test'.encode('ascii')), 'filename'), 1169850)
264264

265+
@responses.activate
266+
def test_analyze_with_errors(self):
267+
responses.add(responses.POST, 'http://vmray.mock/rest/sample/submit',
268+
json=read_resource('vmray_sample_submit_errors'))
269+
with self.assertRaises(sandboxapi.SandboxError):
270+
self.assertEquals(self.sandbox.analyze(io.BytesIO('test'.encode('ascii')), 'filename'))
271+
265272
@responses.activate
266273
def test_check(self):
267274
responses.add(responses.GET, 'http://vmray.mock/rest/submission/sample/1',

0 commit comments

Comments
 (0)