password-manager-mirror/frontend/beta/js/Clipperz/KeePassExportProcessor.js

247 lines
9.9 KiB
JavaScript

/*
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, {
//-------------------------------------------------------------------------
/*
'parse': function(aValue) {
var result;
//MochiKit.Logging.logDebug(">>> KeePassExportProcessor.parse");
result = [];
//MochiKit.Logging.logDebug("--- KeePassExportProcessor.parse - result: " + Clipperz.Base.serializeJSON(result));
//MochiKit.Logging.logDebug("<<< KeePassExportProcessor.parse");
return result;
},
*/
//-------------------------------------------------------------------------
'deferredParse_core': function(aContext) {
var deferredResult;
//MochiKit.Logging.logDebug(">>> KeePassExportProcessor.deferredParse_core");
//MochiKit.Logging.logDebug("--- KeePassExportProcessor.deferredParse_core - (1) aContext.line: " + aContext.line.replace(/\n/g, "\\n").substring(0,50));
//MochiKit.Logging.logDebug("--- KeePassExportProcessor.deferredParse_core - aContext: " + Clipperz.Base.serializeJSON(aContext).substring(0,50));
//MochiKit.Logging.logDebug("--- KeePassExportProcessor.deferredParse_core - (2) aContext.line: " + aContext.line.replace(/\n/g, "\\n").substring(0,50));
//console.log("deferredParse_core - aContext", aContext);
//MochiKit.Logging.logDebug("--- KeePassExportProcessor.deferredParse_core - (3) aContext.line: " + aContext.line.replace(/\n/g, "\\n").substring(0,50));
if (aContext.line == "") {
deferredResult = MochiKit.Async.succeed(aContext.result);
} else {
var record;
record = this.parseRecord(aContext);
if (record != null) {
aContext.result.push(record);
}
//MochiKit.Logging.logDebug("--> KeePassExportProcessor.deferredParse_core - aContext.line: " + aContext.line.replace(/\n/g, "\\n").substring(0,50));
aContext.line = aContext.line.replace(/^\n*/g, "").replace(/\n$/g, "");
//MochiKit.Logging.logDebug("<-- KeePassExportProcessor.deferredParse_core - aContext.line: " + aContext.line.replace(/\n/g, "\\n").substring(0,50));
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassExportProcessor.deferredParse_core - 1.1 " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'importProcessorProgressUpdate', {status:'processing', size:aContext.size, progress:(aContext.size - aContext.line.length)});
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassExportProcessor.deferredParse_core - 1.2 " + res); return res;});
deferredResult.addCallback(MochiKit.Async.wait, 0.2);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassExportProcessor.deferredParse_core - 1.3 " + res); return res;});
//deferredResult.addBoth(function(res) {console.log("KeePassExportProcessor.deferredParse_core - 1.3 ", res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'deferredParse_core'))
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassExportProcessor.deferredParse_core - 1.4 " + res); return res;});
deferredResult.callback(aContext);
}
//MochiKit.Logging.logDebug("<<< KeePassExportProcessor.deferredParse_core");
return deferredResult;
},
//.........................................................................
'deferredParse': function(aValue) {
var deferredResult;
var lines;
var context;
//MochiKit.Logging.logDebug(">>> KeePassExportProcessor.deferredParse");
//MochiKit.Logging.logDebug("--- KeePassExportProcessor.deferredParse - aValue: " + aValue.length);
lines = aValue.replace(/\r?\n/g, "\n");
//MochiKit.Logging.logDebug("--- KeePassExportProcessor.deferredParse - lines: " + lines.length);
context = {
line: lines,
size: lines.length,
result: []
}
//MochiKit.Logging.logDebug("--- KeePassExportProcessor.deferredParse - context: " + Clipperz.Base.serializeJSON(context).substring(0,50));
//console.log("--- KeePassExportProcessor.deferredParse - context: ", context);
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassExportProcessor.deferredParse - 1 " + res); return res;});
//deferredResult.addBoth(function(res) {console.log("KeePassExportProcessor.deferredParse - 1 ", res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'deferredParse_core'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassExportProcessor.deferredParse - 2 " + res); return res;});
deferredResult.callback(context);
//MochiKit.Logging.logDebug("<<< KeePassExportProcessor.deferredParse");
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");
// recordLabelRegexp = new RegExp("^\\[(.*)\\]$", "m");
fieldLabelRegexp = new RegExp("^(Group|Group Tree|UserName|URL|Password|Notes|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;
//MochiKit.Logging.logDebug("1.0");
line = aContext.line;
//MochiKit.Logging.logDebug("0 - line: " + line.replace(/\n/g, "\\n").substring(0,50));
result = {};
result['Title'] = line.match(recordLabelRegexp)[1];
//MochiKit.Logging.logDebug("1 - title: " + result['Title']);
line = line.replace(/^.*\n/, "");
//MochiKit.Logging.logDebug("2 - line: " + line.replace(/\n/g, "\\n").substring(0,50));
//MochiKit.Logging.logDebug("=======================================");
while (fieldLabelRegexp.test(line) == true) {
var fieldName;
var fieldValue;
fieldName = RegExp.$1;
//MochiKit.Logging.logDebug("3 - fieldName: " + fieldName);
line = RegExp.rightContext;
//MochiKit.Logging.logDebug("4 - line: " + line.replace(/\n/g, "\\n").substring(0,50));
fieldValue = line.match(fieldValueRegexp)[1];
//MochiKit.Logging.logDebug("5 - fieldValue: " + fieldValue);
line = RegExp.rightContext;
//MochiKit.Logging.logDebug("6 - line: " + line.replace(/\n/g, "\\n").substring(0,50));
if (fieldName == 'Notes') {
var isMultiline;
isMultiline = false;
//MochiKit.Logging.logDebug("7 - fieldLabelRegexp.test(line): " + fieldLabelRegexp.test(line) + " - recordLabelRegexp.test(line): " + recordLabelRegexp.test(line));
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;
//MochiKit.Logging.logDebug("8 - fieldValue: " + fieldValue);
line = RegExp.rightContext;
//MochiKit.Logging.logDebug("9 - line: " + line.replace(/\n/g, "\\n").substring(0,50));
//MochiKit.Logging.logDebug("10 - fieldLabelRegexp.test(line): " + fieldLabelRegexp.test(line) + " - recordLabelRegexp.test(line): " + recordLabelRegexp.test(line));
}
if (isMultiline) {
fieldValue = fieldValue.replace(/\n$/g, "");
} else {
fieldValue = fieldValue.replace(/\n\n$/g, "");
}
line = line.replace(/^\n/, '');
}
//MochiKit.Logging.logDebug("5 - fieldValue: " + fieldValue);
result[fieldName] = fieldValue;
//MochiKit.Logging.logDebug("6 - line: " + line.replace(/\n/g, "\\n").substring(0,50));
//MochiKit.Logging.logDebug("---------------------------------------");
}
} else {
//MochiKit.Logging.logDebug("2.0");
result = null;
}
aContext.line = line;
//MochiKit.Logging.logDebug("#######################################");
return result;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});