201 lines
4.2 KiB
Python
201 lines
4.2 KiB
Python
from izzylib import logging
|
|
from izzylib.datestring import DateString
|
|
from izzylib.misc import convert_to_boolean
|
|
|
|
from ..base import PasswordItem
|
|
from ...enums import *
|
|
|
|
|
|
class BitwardenItem(PasswordItem):
|
|
def __init__(self, storage, item):
|
|
PasswordItem.__init__(self, storage, DotDict(item))
|
|
|
|
|
|
@classmethod
|
|
def new(cls, *args, **kwargs):
|
|
return cls.new_login(*args, **kwargs)
|
|
|
|
@classmethod
|
|
def new_login(cls, username, password, url, label=None, note=None, storage=None, **kwargs):
|
|
if not isinstance(url, Url):
|
|
url = Url(url)
|
|
|
|
data = DotDict(
|
|
type = BitwardenItemType.LOGIN,
|
|
organizationId = kwargs.get('organization_id'),
|
|
collectionIds = kwargs.get('collection_ids'),
|
|
name = label or url.domain,
|
|
notes = note,
|
|
favorite = convert_to_boolean(kwargs.get('favourite')),
|
|
reprompt = 0,
|
|
login = DotDict(
|
|
username = username,
|
|
password = password,
|
|
totp = None,
|
|
uris = [
|
|
DotDict(match=BitwardenUrlMatchType.DOMAIN, uri=url)
|
|
]
|
|
),
|
|
fields = [
|
|
DotDict(
|
|
name = 'created',
|
|
value = kwargs.get('created') or DateString.now('http'),
|
|
type = BitwardenFieldType.TEXT
|
|
)
|
|
]
|
|
)
|
|
|
|
return cls(storage, data)
|
|
|
|
|
|
def _get_value(self, key):
|
|
if key == 'id':
|
|
return self._data['id']
|
|
|
|
elif key == 'label':
|
|
return self._data['name']
|
|
|
|
elif key == 'url':
|
|
try:
|
|
return self._data['login']['uris'][0]['uri']
|
|
|
|
except KeyError:
|
|
return
|
|
|
|
elif key == 'domain':
|
|
try:
|
|
return self.url.domain
|
|
|
|
except AttributeError:
|
|
return None
|
|
|
|
elif key == 'username':
|
|
return self._data['login']['username']
|
|
|
|
elif key == 'password':
|
|
return self._data['login']['password']
|
|
|
|
elif key == 'note':
|
|
return self._data['notes']
|
|
|
|
elif key == 'created':
|
|
return self.get_field('created')
|
|
|
|
elif key == 'modified':
|
|
return self._data['revisionDate']
|
|
|
|
elif key == 'deleted':
|
|
return self._data['deletedDate']
|
|
|
|
|
|
def _set_value(self, key, value):
|
|
if key == 'label':
|
|
self._data['name'] = value
|
|
|
|
elif key == 'url':
|
|
try:
|
|
self._data['login']['uris'][0]['uri'] = value
|
|
|
|
except (KeyError, IndexError):
|
|
self._data['login']['uris'] = [{'uri': value, 'match': BitwardenUrlMatchType.DOMAIN}]
|
|
|
|
elif key == 'username':
|
|
try:
|
|
self._data['login']['username'] = value
|
|
|
|
except KeyError:
|
|
self._data['login'] = {'username': value}
|
|
|
|
elif key == 'password':
|
|
try:
|
|
self._data['login']['password'] = value
|
|
|
|
except KeyError:
|
|
self._data['login'] = {'password': value}
|
|
|
|
elif key == 'note':
|
|
self._data['notes'] = value
|
|
|
|
elif key == 'created':
|
|
self.set_field(key, value)
|
|
|
|
elif key == 'modified':
|
|
self._data['revisionDate'] = value
|
|
|
|
elif key == 'deleted':
|
|
self._data['deletedDate'] = value
|
|
|
|
elif key in ['id', 'domain']:
|
|
pass
|
|
|
|
else:
|
|
raise KeyError(key)
|
|
|
|
|
|
@property
|
|
def trash(self):
|
|
return True if self.deleted else False
|
|
|
|
|
|
def compare(self, **kwargs):
|
|
for key, value in kwargs.items():
|
|
item_value = self[key]
|
|
|
|
if item_value != value and (isinstance(item_value, str) and value not in item_value):
|
|
#print(value, item_value, item_value != value, (isinstance(item_value, str) and value not in item_value))
|
|
return False
|
|
|
|
return True
|
|
|
|
|
|
def get_field(self, key, default=None):
|
|
try:
|
|
for item in self._data['fields']:
|
|
if item['name'].lower() == key.lower():
|
|
return item['value']
|
|
|
|
except AttributeError:
|
|
pass
|
|
|
|
return default
|
|
|
|
|
|
def set_field(self, key, value, type=BitwardenFieldType.TEXT):
|
|
if not isinstance(self._data['fields'], list):
|
|
self._data['fields'] = []
|
|
|
|
for item in self._data['fields']:
|
|
if item['name'].lower() == key.lower():
|
|
item['value'] = value
|
|
item['type'] = type
|
|
|
|
return
|
|
|
|
self._data['fields'].append(dict(
|
|
name = key,
|
|
value = value,
|
|
type = type
|
|
))
|
|
|
|
|
|
def generate_password(self, *args, **kwargs):
|
|
self._data.login.password = self._storage.generate_password(*args, **kwargs)
|
|
|
|
|
|
def generate_passphrase(self, *args, **kwargs):
|
|
self._data.login.password = self._storage.generate_passphrase(*args, **kwargs)
|
|
|
|
|
|
def purge(self):
|
|
self._storage.purge(self.id)
|
|
|
|
|
|
def to_json(self, indent=None):
|
|
return self._data.to_json(indent)
|
|
|
|
|
|
def update_row(self, **kwargs):
|
|
self.update(kwargs)
|
|
self._data = self._storage.send(f'object/item/{self.id}', 'PUT', self.to_json())
|
|
|