This repository has been archived on 2023-02-02. You can view files and clone it, but cannot push or open issues or pull requests.
barkshark-web/barkshark_web/passwords/bitwarden/item.py

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())