# HG changeset patch # User Erik Grinaker # Date 1107348397 0 # Node ID c335973efe9fd949bbc9d643747f1d90d5464996 # Parent cff0e6f7ef3497dee93934d154f4b038f0aceda9 added plaintext datahandler module diff -r cff0e6f7ef3497dee93934d154f4b038f0aceda9 -r c335973efe9fd949bbc9d643747f1d90d5464996 ChangeLog --- a/ChangeLog Tue Feb 01 18:25:12 2005 +0000 +++ b/ChangeLog Wed Feb 02 12:46:37 2005 +0000 @@ -1,5 +1,16 @@ Revelation changelog +---------------[ xxxx-xx-xx : 0.4.0 ]--------------- + +2005-02-02 Erik Grinaker + + * set default button of "overwrite file?" dialog to Cancel + + * use STOCK_OVERWRITE instead of STOCK_OK for overwrite dialog + + * added plain text datahandler + + ---------------[ 2005-02-01 : 0.4.0-pre2 ]--------------- 2005-02-01 Erik Grinaker diff -r cff0e6f7ef3497dee93934d154f4b038f0aceda9 -r c335973efe9fd949bbc9d643747f1d90d5464996 NEWS --- a/NEWS Tue Feb 01 18:25:12 2005 +0000 +++ b/NEWS Wed Feb 02 12:46:37 2005 +0000 @@ -1,3 +1,13 @@ +2005-02-01: Revelation 0.4.0-pre2 +================================= + +New features: +- added export to plain text + +Bugfixes: +- set default button for overwrite dialog to cancel + + 2005-02-01: Revelation 0.4.0-pre2 ================================= diff -r cff0e6f7ef3497dee93934d154f4b038f0aceda9 -r c335973efe9fd949bbc9d643747f1d90d5464996 TODO --- a/TODO Tue Feb 01 18:25:12 2005 +0000 +++ b/TODO Wed Feb 02 12:46:37 2005 +0000 @@ -1,11 +1,10 @@ -.4.x: +0.4.x: - string cleanups - don't use modal dialogs unless absolutely necessary - password strength check - build python-crack as part of revelation - add import/export of PasswordSafe files - add import/export of GPasMan files - add import/export of zsafe files -- add export to clear-text (normal ASCII text) - option for autolocking the file after a period of inactivity - sorting of the tree - update documentation diff -r cff0e6f7ef3497dee93934d154f4b038f0aceda9 -r c335973efe9fd949bbc9d643747f1d90d5464996 src/lib/datahandler/Makefile.am --- a/src/lib/datahandler/Makefile.am Tue Feb 01 18:25:12 2005 +0000 +++ b/src/lib/datahandler/Makefile.am Wed Feb 02 12:46:37 2005 +0000 @@ -6,5 +6,6 @@ gpass.py \ netrc.py \ rvl.py \ + text.py \ xhtml.py diff -r cff0e6f7ef3497dee93934d154f4b038f0aceda9 -r c335973efe9fd949bbc9d643747f1d90d5464996 src/lib/datahandler/__init__.py --- a/src/lib/datahandler/__init__.py Tue Feb 01 18:25:12 2005 +0000 +++ b/src/lib/datahandler/__init__.py Wed Feb 02 12:46:37 2005 +0000 @@ -28,12 +28,14 @@ from gpass import GPass from netrc import NetRC from rvl import RevelationXML, Revelation +from text import PlainText from xhtml import XHTML HANDLERS = [ FPM, GPass, NetRC, + PlainText, Revelation, XHTML, RevelationXML diff -r cff0e6f7ef3497dee93934d154f4b038f0aceda9 -r c335973efe9fd949bbc9d643747f1d90d5464996 src/lib/datahandler/text.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib/datahandler/text.py Wed Feb 02 12:46:37 2005 +0000 @@ -0,0 +1,79 @@ +# +# Revelation 0.4.0 - a password manager for GNOME 2 +# http://oss.codepoet.no/revelation/ +# $Id$ +# +# Module for handling plain text files +# +# +# Copyright (c) 2003-2005 Erik Grinaker +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# + +import base +from revelation import data, entry + +import time + + +class PlainText(base.DataHandler): + "Data handler for plain text files" + + name = "Plain text" + importer = False + exporter = True + encryption = False + + + def export_data(self, entrystore, password = None): + "Exports data to a plain text file" + + # fetch and sort entries + entries = [] + iter = entrystore.iter_nth_child(None, 0) + + while iter is not None: + e = entrystore.get_entry(iter) + + if type(e) != entry.FolderEntry: + entries.append(e) + + iter = entrystore.iter_traverse_next(iter) + + entries.sort(lambda x,y: cmp(x.name.lower(), y.name.lower())) + + + # generate the text + text = "" + + for e in entries: + text += "%s [%s]\n" % ( e.name, e.typename ) + text += e.description != "" and "%s\n" % e.description or "" + text += "%s\n" % time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(e.updated)) + + fields = [ field for field in e.fields if field.value != "" ] + + if len(fields) > 0: + text += "\n" + maxlen = max([ len(field.name) for field in fields ]) + + for field in fields: + text += "- " + field.name + ": " + (" " * (maxlen - len(field.name))) + field.value + "\n" + + text += "\n\n" + + return text + diff -r cff0e6f7ef3497dee93934d154f4b038f0aceda9 -r c335973efe9fd949bbc9d643747f1d90d5464996 src/lib/dialog.py --- a/src/lib/dialog.py Tue Feb 01 18:25:12 2005 +0000 +++ b/src/lib/dialog.py Wed Feb 02 12:46:37 2005 +0000 @@ -253,7 +253,8 @@ Warning.__init__( self, parent, "Overwrite existing file?", "The file '%s' already exists - do you wish to replace this file?" % file, - ( ( gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL ), ( gtk.STOCK_OK, gtk.RESPONSE_OK ) ) + ( ( gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL ), ( ui.STOCK_OVERWRITE, gtk.RESPONSE_OK ) ), + gtk.RESPONSE_CANCEL ) diff -r cff0e6f7ef3497dee93934d154f4b038f0aceda9 -r c335973efe9fd949bbc9d643747f1d90d5464996 test/Makefile.am --- a/test/Makefile.am Tue Feb 01 18:25:12 2005 +0000 +++ b/test/Makefile.am Wed Feb 02 12:46:37 2005 +0000 @@ -6,6 +6,7 @@ datahandler_gpass.py \ datahandler_netrc.py \ datahandler_rvl.py \ + datahandler_text.py \ datahandler_xhtml.py \ entry.py \ io.py \ @@ -20,6 +21,7 @@ python datahandler_gpass.py -v python datahandler_netrc.py -v python datahandler_rvl.py -v + python datahandler_text.py -v python datahandler_xhtml.py -v python entry.py -v python io.py -v diff -r cff0e6f7ef3497dee93934d154f4b038f0aceda9 -r c335973efe9fd949bbc9d643747f1d90d5464996 test/datahandler_text.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/datahandler_text.py Wed Feb 02 12:46:37 2005 +0000 @@ -0,0 +1,89 @@ +#!/usr/bin/env python + +# +# Revelation 0.4.0 - a password manager for GNOME 2 +# http://oss.codepoet.no/revelation/ +# $Id$ +# +# Unit tests for PlainText datahandler module +# +# +# Copyright (c) 2003-2005 Erik Grinaker +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# + +import unittest + +from revelation import data, datahandler, entry + + +class PlainText(unittest.TestCase): + "PlainText" + + def test_attrs(self): + "PlainText has sane attrs" + + self.assertEquals(datahandler.PlainText.name, "Plain text") + self.assertEquals(datahandler.PlainText.importer, False) + self.assertEquals(datahandler.PlainText.exporter, True) + self.assertEquals(datahandler.PlainText.encryption, False) + + + +class Plaintext_export_data(unittest.TestCase): + "PlainText.export_data()" + + def test_data(self): + "PlainText.export_data() exports data" + + s = data.EntryStore() + + e = entry.GenericEntry() + e.name = "name" + e.description = "description" + e.updated = 1107348151 + e[entry.HostnameField] = "hostname" + e[entry.UsernameField] = "username" + e[entry.PasswordField] = "password" + s.add_entry(e) + + text = datahandler.PlainText().export_data(s) + + self.assertEquals(e.typename in text, True) + self.assertEquals("name" in text, True) + self.assertEquals("description" in text, True) + self.assertEquals("2005-02-02 13:42:31" in text, True) + self.assertEquals("hostname" in text, True) + self.assertEquals("username" in text, True) + self.assertEquals("password" in text, True) + + + def test_folder(self): + "PlainText.export_data() ignores folders" + + s = data.EntryStore() + e = entry.FolderEntry() + e.name = "testfolder" + s.add_entry(e) + + text = datahandler.PlainText().export_data(s) + self.assertEquals(text, "") + + + +if __name__ == "__main__": + unittest.main() +