1+ from platform import python_version
2+ from .errors import *
3+ import os
4+ import requests
5+ import logging
6+
7+ __version__ = "0.0.1"
8+ logger = logging .getLogger ("fireeye" )
9+
10+ class Detection :
11+ def __init__ (self ,key = None ):
12+ self .api_key = key or os .environ .get ("FIREEYE_API_KEY" , None )
13+ self .api_host = "feapi.marketplace.apps.fireeye.com"
14+ user_agent = "fireeye-python/{version} python/{python_version}" .format (
15+ version = __version__ , python_version = python_version ()
16+ )
17+ self .headers = {"User-Agent" : user_agent , "feye-auth-key" : key }
18+ self .session = requests .Session ()
19+
20+ def submit_file (self , body = None , files = None ):
21+ return self .post (self .api_host , "/file-submit" , body , files )
22+
23+ def get_file_result (self , submission_id ):
24+ return self .get (self .api_host , "/file-result" , {"submission_id" : submission_id })
25+
26+ def get_hash_lookup (self , hash ):
27+ return self .get (self .api_host , "/hash-lookup" , {"hash" : hash })
28+
29+ def get_submissions (self ):
30+ return self .get (self .api_host , "/get-submissions" )
31+
32+ def get (self , host , request_uri , params = None ):
33+ uri = "https://{host}{request_uri}" .format (host = host , request_uri = request_uri )
34+ headers = self .headers
35+
36+ logger .debug ("GET to %r with params %r, headers %r" , uri , params , headers )
37+ return self .parse (host , self .session .get (uri , params = params , headers = headers ))
38+
39+ def post (self , host , request_uri , data = None , files = None ):
40+ uri = "https://{host}{request_uri}" .format (host = host , request_uri = request_uri )
41+ headers = self .headers
42+
43+ logger .debug ("POST to %r with data %r, files %r, headers %r" , uri , data , files , headers )
44+ return self .parse (host , self .session .post (uri , data = data , files = files , headers = headers ))
45+
46+ def parse (self , host , response ):
47+ logger .debug ("Response headers %r" , response .headers )
48+ if response .status_code == 401 :
49+ raise AuthenticationError
50+ elif response .status_code == 204 :
51+ return None
52+ elif 200 <= response .status_code < 300 :
53+ content_mime = response .headers .get ("content-type" ).split (";" , 1 )[0 ]
54+ if content_mime == "application/json" :
55+ return response .json ()
56+ else :
57+ return response .content
58+ elif 400 <= response .status_code < 500 :
59+ logger .warning (
60+ "Client error: %s %r" , response .status_code , response .content
61+ )
62+ message = "{code} response from {host}" .format (
63+ code = response .status_code , host = host
64+ )
65+ raise ClientError (message )
66+ elif 500 <= response .status_code < 600 :
67+ logger .warning (
68+ "Server error: %s %r" , response .status_code , response .content
69+ )
70+ message = "{code} response from {host}" .format (
71+ code = response .status_code , host = host
72+ )
73+ raise ServerError (message )
0 commit comments