/
item.py
75 lines (64 loc) · 2.11 KB
/
item.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import simplejson
import datetime
C_CATEGORIES = {
'001': 'Login',
'002': 'Credit Card',
'003': 'Secure Note',
'004': 'Identity',
'005': 'Password',
'099': 'Tombstone',
'100': 'Software License',
'101': 'Bank Account',
'102': 'Database',
'103': 'Driver License',
'104': 'Outdoor License',
'105': 'Membership',
'106': 'Passport',
'107': 'Rewards',
'108': 'SSN',
'109': 'Router',
'110': 'Server',
'111': 'Email',
}
class AItem(object):
def __init__(self, keychain):
self.keychain = keychain
@classmethod
def new_from_file(cls, path, keychain):
o = cls(keychain)
o.load_from(path)
return o
def load_from(self, path):
with open(path, "r") as f:
data = simplejson.load(f)
self.uuid = data['uuid']
self.data = data
self.title = self.data['title']
if 'keyID' in data:
identifier = data['keyID']
elif 'securityLevel' in data:
identifier = self.keychain.levels[data['securityLevel']]
else:
raise KeyError("Neither keyID or securityLevel present in %s" % self.uuid)
self.key_identifier = identifier
def decrypt(self):
return simplejson.loads(self.keychain.decrypt(self.key_identifier, self.data['encrypted']))
def __repr__(self):
return '%s<uuid=%s, keyid=%s>' % (self.__class__.__name__, self.uuid, self.key_identifier)
class CItem(object):
def __init__(self, keychain, d):
self.keychain = keychain
self.uuid = d['uuid']
self.category = C_CATEGORIES[d['category']]
self.updated_at = datetime.datetime.fromtimestamp(d['updated'])
self.overview = simplejson.loads(self.keychain.decrypt_overview(d['o']))
self.title = self.overview['title']
self.encrypted_data = d['k'], d['d']
def __repr__(self):
return '%s<uuid=%s, cat=%s>' % (
self.__class__.__name__,
self.uuid,
self.category,
)
def decrypt(self):
return simplejson.loads(self.keychain.decrypt_data(*self.encrypted_data))