126 lines
3.2 KiB
Python
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()
|