mirror of
http://git.whoc.org.uk/git/password-manager.git
synced 2024-11-10 23:47:16 +01:00
192 lines
5.4 KiB
JavaScript
192 lines
5.4 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, {
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
'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"
|
|
});
|
|
|
|
|