Subversion Repositories pub

Compare Revisions

No changes between revisions

Ignore whitespace Rev 624 → Rev 625

/relevation/branches/1.3.1/relevation.spec.in
46,7 → 46,7
%files
%defattr(-,root,root,-)
%doc CHANGELOG LICENSE
%doc src/gui.py devtools/*.py
%doc devtools/*.py
%{_bindir}/relevation
%{_mandir}/man1/relevation.1*
%{python2_sitelib}/relevation/
/relevation/branches/1.3.1/CHANGELOG
2,6 → 2,7
 
1.3.1 (?):
- Refactor into a package [#235]
- Include minimalistic GUI into package
 
1.3 (2014-05-24):
- Check file magic [#230] and reject unsupported data formats
/relevation/branches/1.3.1/src/gui.py
File deleted
Property changes:
Deleted: svn:executable
-*
\ No newline at end of property
Deleted: svn:keywords
-Rev Id Date
\ No newline at end of property
/relevation/branches/1.3.1/src/relevation/gui.py
0,0 → 1,194
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
 
"""
Relevation Password Printer
a command line interface to Revelation Password Manager.
 
Simplistic Graphical User Interface.
This GUI is mainly intended to be used in systems where command-lines
are less common, like Windows.
 
$Id$
"""
# Relevation Password Printer
#
# Copyright (c) 2011, 2013, Toni Corvera
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
 
import sys
import re
import Tkinter as tk
from Tkinter import Frame, Button, Entry, Listbox, Scrollbar, Label, Radiobutton, StringVar
 
import relevation.__main__ as rlv
 
__author__ = 'Toni Corvera'
__date__ = '$Date$'
__revision__ = '$Rev$'
__version_info__ = ( 1, 2, 1 )
__version__ = '.'.join(map(str, __version_info__))
 
old_fn = rlv.dump_result
 
def append_result(typeName, name, descr, notes, fields):
global gui
gui.lst.insert(tk.END, name)
s = '\n'
s += 'Type: %s\n' % typeName
s += 'Name: %s\n' % name
s += 'Description: %s\n' % descr
s += 'Notes: %s\n' % notes
for field in fields:
s += '%s %s\n' % field
gui.items.append(s)
 
def dump_result_override(res, query_desc):
return old_fn(res, query_desc, append_result)
 
rlv.dump_result = dump_result_override
 
class ResultDialog:
def __init__(self, parent, result):
top = self.top = tk.Toplevel(parent)
 
self.value = tk.Text(top)
self.value.insert(tk.END, result)
self.value.config(state=tk.DISABLED)
self.value.pack()
b = Button(top, text='OK', command=self.ok)
b.pack(pady=5)
 
top.bind('<Return>', lambda event: self.ok())
top.focus_set()
 
def ok(self):
self.top.destroy()
 
class GUI(object):
def do_find(self):
global rootw
search = self.search_text.get()
self.lst.delete(0, tk.END)
self.items = []
mode = '-O'
args = sys.argv[1:] + [ '-s', ]
if self.mode.get() == rlv.MODE_AND:
mode = '-A'
search = search.split(' ')
args += search
args += [ mode, ]
else:
args += [ search, mode ]
print args
try:
rlv.main(args)
except SystemExit:
# No matches -> Exit with 80
gui.lst.insert(tk.END, '<No matches>')
self.items.append('<No passwords matched search>')
 
def display(self):
global rootw
selected = self.lst.curselection()
if not selected:
return
selected = int(selected[0])
item = self.items[selected]
print item
dlg = ResultDialog(rootw, item)
rootw.wait_window(dlg.top)
 
def __init__(self, master=None):
self.master = master
frame = Frame(master)
frame.pack(expand=1, fill=tk.BOTH)
self.items = []
self.frame = frame
#top = master
top = frame.winfo_toplevel()
top.rowconfigure(0, weight=1)
top.columnconfigure(0, weight=1, pad=5)
frame.rowconfigure(0, weight=1, pad=5)
frame.columnconfigure(0, weight=1)
 
# Avoid printing to stderr
def ignoreme(s):
pass
rlv.printe = ignoreme
FILL = tk.N+tk.S+tk.E+tk.W
BTNROW = 3
MODEROW = 2
RESROW = 1
# Populate
self.search_text = Entry(self.frame)
#self.search_text.pack({'expand': 1, 'side': 'top'})
self.search_text.grid(row=0, column=0, columnspan=4, padx=5, sticky=tk.N+tk.E+tk.W)
self.search_text.bind('<Return>', lambda event: self.do_find())
self.quit = Button(self.frame, text='Quit', fg='red', command=frame.quit)
#self.quit.pack(side=tk.LEFT)
self.quit.grid(row=BTNROW, column=0, padx=10)
self.search = Button(self.frame, text='Search', command=self.do_find)
#self.search.pack(side=tk.RIGHT)
self.search.grid(row=BTNROW, column=2, padx=5)
 
self.mode = StringVar()
 
mode = rlv.load_config()[2]
self.mode.set(mode)
 
rbO = Radiobutton(self.frame, text="OR/Literal", variable=self.mode, value=rlv.MODE_OR)
rbA = Radiobutton(self.frame, text="AND", variable=self.mode, value=rlv.MODE_AND)
rbO.grid(row=MODEROW, column=0)
rbA.grid(row=MODEROW, column=1)
self.view = Button(self.frame, text='View', command=self.display)
#self.view.pack(side=tk.RIGHT)
self.view.grid(row=BTNROW, column=1)
 
## FIXME
scrollbar = Scrollbar(self.frame, orient=tk.VERTICAL)
scrollbar.grid(row=RESROW, column=4, sticky=FILL)
self.lst = Listbox(self.frame)
#self.lst.pack()
self.lst.grid(row=RESROW, column=0, columnspan=3, sticky=FILL)
self.lst.bind('<Double-Button-1>', lambda event: self.display())
 
self.lst.config(yscrollcommand=scrollbar.set)
scrollbar.config(command=self.lst.yview)
 
self.search_text.focus_set()
 
if __name__ == '__main__':
rootw = tk.Tk()
rootw.title('Relevation search v' + __version__)
gui = GUI(master=rootw)
rootw.mainloop()
#rootw.destroy()
 
# vim:set ts=4 et ai fileencoding=utf-8: #
Property changes:
Added: svn:keywords
+Rev Id Date
\ No newline at end of property
/relevation/branches/1.3.1/devtools/setup.py.in
40,7 → 40,7
data_files=[
('share/man/man1', ['relevation.1']),
#('share/doc/relevation', ['CHANGELOG']),
('share/doc/relevation/extra', ['src/gui.py','devtools/checkpw.py','devtools/genpw.py']),
('share/doc/relevation/extra', ['devtools/checkpw.py','devtools/genpw.py']),
]
)
 
/relevation/branches/1.3.1/devtools/devenv.bash
9,6 → 9,7
echo "# PYTHONPATH=\"$pp\""
echo "#"
echo "# alias: rel -> src/relevation/__main__.py"
echo "# alias: gui -> src/relevation/gui.py"
echo "#"
 
env PYTHONPATH="$pp" bash --rcfile <(cat <<EOF
16,6 → 17,7
[[ -f ~/.bashrc ]] && source ~/.bashrc
PS1="[RLV]\\u@\\h:\\w\\$ "
alias rel='python -m relevation'
alias gui='python -m relevation.gui'
EOF
)