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/objects/login_rows.py
2022-04-16 06:23:04 -04:00

126 lines
3.2 KiB
Python

from ..config import dirs
from ..database import db
from ..functions import TimeoutCallback, connect, run_in_gui_thread
from ..passwords import passdb
class LoginRowBase:
def __getitem__(self, key):
return self.ui.get_object(key)
@property
def app(self):
return Gio.Application.get_default()
@property
def window(self):
return self.app.window
def connect(self, name, signal, callback, *args, original_args=False, **kwargs):
if original_args:
connect(self[name], signal, lambda *origargs: callback(*origargs, *args, **kwargs))
else:
connect(self[name], signal, lambda *origargs: callback(*args, **kwargs))
class SavedLoginRow(LoginRowBase):
def __init__(self, row, page_url):
self.ui = Gtk.Builder.new_from_file(dirs.resources.join('password_saved.ui'))
self.row = row
with db.session as s:
self.dbrow = s.get_passfield(page_url)
self['username'].set_text(self.row['username'])
#if self.row.url != page_url or not self.dbrow:
#self['fill'].set_sensitive(False)
self.connect('fill', 'clicked', self.handle_fill_password)
self.connect('copy-password', 'clicked', self.handle_copy_password)
self.connect('copy-username', 'clicked', self.row.copy_username)
self['container'].show_all()
@property
def tab(self):
return self.window.active_tab
def handle_copy_password(self):
self.row.copy_password(60)
self.window.notification('Copied password to clipboard for 5 seconds')
self.window['statusbar-logins-popover'].popdown()
def handle_fill_password(self):
with dirs.resources.join('ext_js/autofill.js').open() as fd:
self.tab.run_js(fd.read().replace('USERNAME_VALUE', self.row.username).replace('PASSWORD_VALUE', self.row.password))
self.window['statusbar-logins-popover'].popdown()
class UnsavedLoginRow(LoginRowBase):
def __init__(self, ext, form):
self.ui = Gtk.Builder.new_from_file(dirs.resources.join('password_unsaved.ui'))
self.ext = ext
self.form = form
with db.session as s:
self.row = s.get_passfield(form.form_url)
self.set_data(form.username[1], form.password[1])
self.connect('save', 'clicked', self.handle_save)
self.connect('cancel', 'clicked', self.handle_cancel)
self.connect('password', 'icon-press', self.handle_pass_visibility)
self['container'].show_all()
def get_data(self):
url = Url(self.form.url)
data = DotDict(
url = url,
form_url = url.without_query,
username = self.form.username[1],
password = self.form.password[1],
userfield = self.form.username[0],
passfield = self.form.password[0],
note = None
)
if data.url.endswith('/'):
data.url = data.url[:-1]
return data
def set_data(self, username, password):
self['username'].set_text(username or '')
self['password'].set_text(password or '')
def handle_cancel(self):
self.window['statusbar-logins-unsaved-list'].remove(self['container'])
self['container'].destroy()
del self.ext.unsaved_forms[self.form.form_url]
def handle_pass_visibility(self):
self['password'].set_visibility(not self['password'].get_visibility())
def handle_save(self):
data = self.get_data()
passdb.insert(data.username, data.url.domain, data.password, data.url, data.note)
self.window.passwords.refresh()
self.handle_cancel()