Skip to content

Commit 32a4c21

Browse files
committed
2.3.0: support for blobs and sharing with other users
1 parent 8d0717b commit 32a4c21

File tree

8 files changed

+397
-100
lines changed

8 files changed

+397
-100
lines changed

Diff for: setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from distutils.core import setup
77

88
setup(name="mwdblib",
9-
version="2.2.2",
9+
version="2.3.0",
1010
description="malwaredb API bindings for Python",
1111
author="psrok1",
1212
package_dir={'mwdblib': 'src'},

Diff for: src/__init__.py

+1-91
Original file line numberDiff line numberDiff line change
@@ -1,92 +1,2 @@
1-
import itertools
2-
import json
3-
4-
import requests
5-
1+
from .core import Malwarecage
62
from .api import MalwarecageAPI
7-
from .obj import MalwarecageObject
8-
from .file import MalwarecageFile
9-
from .config import MalwarecageConfig
10-
from .blob import MalwarecageBlob
11-
12-
13-
class Malwarecage(object):
14-
def __init__(self, api=None):
15-
self.api = api or MalwarecageAPI()
16-
17-
def login(self, username, password):
18-
result = self.api.post("auth/login", json={
19-
"login": username,
20-
"password": password
21-
}, noauth=True)
22-
self.api.set_api_key(result["token"])
23-
24-
def _recent(self, endpoint):
25-
try:
26-
for page in itertools.count(start=1):
27-
result = self.api.get(endpoint, params={"page": page})
28-
key = endpoint+"s"
29-
if key not in result or len(result[key]) == 0:
30-
return
31-
for obj in result[key]:
32-
yield MalwarecageObject.create(self.api, obj)
33-
except requests.exceptions.HTTPError as e:
34-
if e.response.status_code >= 500:
35-
raise e
36-
37-
def recent_objects(self):
38-
return self._recent("object")
39-
40-
def recent_files(self):
41-
return self._recent("file")
42-
43-
def recent_configs(self):
44-
return self._recent("config")
45-
46-
def recent_blobs(self):
47-
return self._recent("blob")
48-
49-
def query(self, hash):
50-
result = self.api.get("object/{}".format(hash))
51-
return MalwarecageObject.create(self.api, result)
52-
53-
def query_file(self, hash):
54-
result = self.api.get("file/{}".format(hash))
55-
return MalwarecageFile(self.api, result)
56-
57-
def query_config(self, hash):
58-
result = self.api.get("config/{}".format(hash))
59-
return MalwarecageConfig(self.api, result)
60-
61-
def query_blob(self, hash):
62-
result = self.api.get("blob/{}".format(hash))
63-
return MalwarecageConfig(self.api, result)
64-
65-
def search(self, query):
66-
result = self.api.post("search", json={"query": query})
67-
for file in result:
68-
yield MalwarecageObject.create(self.api, file)
69-
70-
def upload_file(self, name, content, parent=None, metakeys=None):
71-
parent = parent or "root"
72-
result = self.api.post("file/{}".format(parent), data={
73-
'metakeys': json.dumps({'metakeys': metakeys or []})
74-
}, files={'file': (name, content)})
75-
return MalwarecageFile(self.api, result)
76-
77-
def upload_config(self, family, cfg, parent=None):
78-
parent = parent or "root"
79-
result = self.api.put("config/{}".format(parent), json={
80-
"family": family,
81-
"cfg": cfg
82-
})
83-
return MalwarecageConfig(self.api, result)
84-
85-
def upload_blob(self, name, type, content, parent=None):
86-
parent = parent or "root"
87-
result = self.api.put("blob/{}".format(parent), json={
88-
"blob_name": name,
89-
"blob_type": type,
90-
"content": content
91-
})
92-
return MalwarecageBlob(self.api, result)

Diff for: src/api.py

+8
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import base64
2+
import json
3+
14
try:
25
from urlparse import urljoin
36
except ImportError:
@@ -22,6 +25,11 @@ def set_api_key(self, api_key):
2225
self.api_key = api_key
2326
self.session.headers.update({'Authorization': 'Bearer {}'.format(self.api_key)})
2427

28+
def logged_user(self):
29+
if self.api_key is None:
30+
return None
31+
return json.loads(base64.b64decode(self.api_key.split(".")[1]+"=="))["login"]
32+
2533
def request(self, method, url, noauth=False, raw=False, *args, **kwargs):
2634
# Check if authenticated yet
2735
if not noauth and self.api_key is None:

Diff for: src/blob.py

+22-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from .obj import MalwarecageObject, lazy_property
1+
from .object import MalwarecageObject, lazy_property
22

33

44
class MalwarecageBlob(MalwarecageObject):
@@ -16,6 +16,27 @@ def blob_size(self):
1616
def blob_type(self):
1717
return self.data.get("blob_type")
1818

19+
@property
20+
def name(self):
21+
"""
22+
Alias for blob_name property
23+
"""
24+
return self.blob_name
25+
26+
@property
27+
def size(self):
28+
"""
29+
Alias for blob_size property
30+
"""
31+
return self.blob_size
32+
33+
@property
34+
def type(self):
35+
"""
36+
Alias for blob_type property
37+
"""
38+
return self.blob_type
39+
1940
@lazy_property()
2041
def content(self):
2142
return self.data.get("content")

Diff for: src/config.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from .obj import MalwarecageObject, lazy_property
1+
from .object import MalwarecageObject, lazy_property
22

33

44
class MalwarecageConfig(MalwarecageObject):

0 commit comments

Comments
 (0)