summaryrefslogtreecommitdiff
path: root/frontend/delta/js/Clipperz/KeePassExportProcessor.js
Side-by-side diff
Diffstat (limited to 'frontend/delta/js/Clipperz/KeePassExportProcessor.js') (more/less context) (ignore whitespace changes)
-rw-r--r--frontend/delta/js/Clipperz/KeePassExportProcessor.js191
1 files changed, 191 insertions, 0 deletions
diff --git a/frontend/delta/js/Clipperz/KeePassExportProcessor.js b/frontend/delta/js/Clipperz/KeePassExportProcessor.js
new file mode 100644
index 0000000..e35d729
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/KeePassExportProcessor.js
@@ -0,0 +1,191 @@
+/*
+
+Copyright 2008-2013 Clipperz Srl
+
+This file is part of Clipperz, the online password manager.
+For further information about its features and functionalities please
+refer to http://www.clipperz.com.
+
+* Clipperz is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+* Clipperz 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 Affero General Public License for more details.
+
+* You should have received a copy of the GNU Affero General Public
+ License along with Clipperz. If not, see http://www.gnu.org/licenses/.
+
+*/
+
+if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
+
+
+Clipperz.KeePassExportProcessor = function(args) {
+ args = args || {};
+
+ return this;
+}
+
+//=============================================================================
+
+Clipperz.KeePassExportProcessor.prototype = MochiKit.Base.update(null, {
+
+ //-------------------------------------------------------------------------
+
+ 'deferredParse_core': function(aContext) {
+ var deferredResult;
+
+ if (aContext.line == "") {
+ deferredResult = MochiKit.Async.succeed(aContext.result);
+ } else {
+ var record;
+
+ record = this.parseRecord(aContext);
+ if (record != null) {
+ aContext.result.push(record);
+ }
+
+ aContext.line = aContext.line.replace(/^\n*/g, "").replace(/\n$/g, "");
+
+ deferredResult = new Clipperz.Async.Deferred("KeePassExportProcessor.deferredParse_core");
+ deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'importProcessorProgressUpdate', {status:'processing', size:aContext.size, progress:(aContext.size - aContext.line.length)});
+ deferredResult.addCallback(MochiKit.Async.wait, 0.2);
+ deferredResult.addMethod(this, 'deferredParse_core');
+ deferredResult.callback(aContext);
+ }
+
+ return deferredResult;
+ },
+
+ //.........................................................................
+
+ 'deferredParse': function(aValue) {
+ var deferredResult;
+ var lines;
+ var context;
+
+ lines = aValue.replace(/\r?\n/g, "\n");
+ context = {
+ line: lines,
+ size: lines.length,
+ result: []
+ }
+
+ deferredResult = new Clipperz.Async.Deferred("KeePassExportProcessor.deferredResult");
+ deferredResult.addMethod(this, 'deferredParse_core');
+ deferredResult.callback(context);
+
+ return deferredResult;
+ },
+
+ //-------------------------------------------------------------------------
+
+ 'parseRecord': function(aContext) {
+ var result;
+ var recordLabelRegexp;
+ var fieldLabelRegexp;
+ var fieldValueRegexp;
+ var fullLineRegexp;
+/*
+[Record name]
+Group Tree:
+UserName:
+URL:
+Password:
+Notes: test
+UUID: 525f62430079bae48b79ed2961924b05
+Icon: 0
+Creation Time: 2007-06-26 17:56:03
+Last Access: 2007-10-25 16:23:51
+Last Modification: 2007-10-25 16:23:51
+Expires: 2999-12-28 23:59:59
+
+[Record name] ==> Title
+Group: General ==> Group
+Group Tree: ==> Group Tree
+UserName: ==> UserName
+URL: ==> URL
+Password: ==> Password
+Notes: test ==> Notes
+UUID: 525f62430079bae48b79ed2961924b05 ==> UUID
+Icon: 0 ==> Icon
+Creation Time: 2007-06-26 17:56:03 ==> Creation Time
+Last Access: 2007-10-25 16:23:51 ==> Last Access
+Last Modification: 2007-10-25 16:23:51 ==> Last Modification
+Expires: 2999-12-28 23:59:59 ==> Expires
+Attachment Description: ==> Attachment Description
+Attachment: ==> Attachment
+*/
+// recordLabelRegexp = new RegExp("(^\\[(.*)\\]\\n|^Title:\s*(.*)\\n)");
+ recordLabelRegexp = new RegExp("^\\[(.*)\\]\\n|^Title:\s*(.*)\\n");
+ fieldLabelRegexp = new RegExp("^\s?(Group|Group Tree|Username|UserName|User Name|Url|URL|Password|Notes|Comment|UUID|Icon|Creation Time|Last Access|Last Modification|Expires|Attachment Description|Attachment|Valid until): ");
+ fieldValueRegexp = new RegExp("(.*)(\\n|$)");
+ fullLineRegexp = new RegExp("^(.*\\n)");
+
+ if (recordLabelRegexp.test(aContext.line) == true) {
+ var line;
+
+ line = aContext.line;
+
+ result = {};
+ result['Title'] = line.match(recordLabelRegexp)[1];
+ line = line.replace(/^.*\n/, "");
+ while (fieldLabelRegexp.test(line) == true) {
+ var fieldName;
+ var fieldValue;
+
+ fieldName = RegExp.$1;
+ line = RegExp.rightContext;
+
+ fieldValue = line.match(fieldValueRegexp)[1];
+ line = RegExp.rightContext;
+
+ if (fieldName == 'Notes') {
+ var isMultiline;
+
+ isMultiline = false;
+
+ if ((line != "") && (fieldLabelRegexp.test(line) == false) && (recordLabelRegexp.test(line) == false)) {
+ fieldValue += '\n';
+ }
+
+ while ((line != "") && (fieldLabelRegexp.test(line) == false) && (recordLabelRegexp.test(line) == false)) {
+ var newLineValue;
+
+ newLineValue = line.match(fullLineRegexp)[1];
+ if (newLineValue != "\n") {
+ isMultiline = true;
+ }
+ fieldValue += newLineValue;
+ line = RegExp.rightContext;
+ }
+
+ if (isMultiline) {
+ fieldValue = fieldValue.replace(/\n$/g, "");
+ } else {
+ fieldValue = fieldValue.replace(/\n\n$/g, "");
+ }
+
+ line = line.replace(/^\n/, '');
+ }
+
+ result[fieldName] = fieldValue;
+ }
+ } else {
+ result = null;
+ }
+
+ aContext.line = line;
+
+ return result;
+ },
+
+ //-------------------------------------------------------------------------
+ __syntaxFix__: "syntax fix"
+});
+
+