79 lines
2.0 KiB
Python
79 lines
2.0 KiB
Python
from enum import IntEnum
|
|
from urllib.parse import urlsplit, parse_qsl
|
|
|
|
|
|
class Types(IntEnum):
|
|
LOGIN = 1
|
|
SECURE_NOTE = 2
|
|
CARD = 3
|
|
IDENTITY = 4
|
|
|
|
|
|
class Item:
|
|
def __init__(self, item):
|
|
self.item = item
|
|
|
|
def get_id(self) -> str:
|
|
return self.item['id']
|
|
|
|
def get_name(self) -> str:
|
|
return self.item['name']
|
|
|
|
def get_folder_id(self) -> str:
|
|
return self.item['folderId']
|
|
|
|
def get_username(self) -> str:
|
|
if 'login' not in self.item:
|
|
return ''
|
|
|
|
return self.item['login']['username'] if self.item['login']['username'] else ''
|
|
|
|
def get_password(self) -> str:
|
|
if 'login' not in self.item:
|
|
return ''
|
|
|
|
return self.item['login']['password'] if self.item['login']['password'] else ''
|
|
|
|
def get_notes(self):
|
|
return self.item['notes']
|
|
|
|
def get_uris(self):
|
|
if 'login' not in self.item or 'uris' not in self.item['login']:
|
|
return []
|
|
|
|
for uri in self.item['login']['uris']:
|
|
uri['uri'] = uri['uri'] if uri['uri'] is not None else ''
|
|
|
|
return self.item['login']['uris']
|
|
|
|
def get_custom_fields(self):
|
|
if 'fields' not in self.item:
|
|
return []
|
|
|
|
for field in self.item['fields']:
|
|
field['name'] = field['name'] if field['name'] is not None else ''
|
|
field['value'] = field['value'] if field['value'] is not None else ''
|
|
|
|
return self.item['fields']
|
|
|
|
def get_attachments(self):
|
|
if 'attachments' not in self.item:
|
|
return []
|
|
|
|
return self.item['attachments']
|
|
|
|
def get_totp(self):
|
|
if 'login' not in self.item:
|
|
return None, None
|
|
|
|
if not self.item['login']['totp']:
|
|
return None, None
|
|
|
|
params = urlsplit(self.item['login']['totp']).query
|
|
params = dict(parse_qsl(params))
|
|
period = params.get('period', 30)
|
|
digits = params.get('digits', 6)
|
|
secret = params.get('secret', self.item['login']['totp'])
|
|
|
|
return secret, f'{period};{digits}'
|