1
0
mirror of http://git.whoc.org.uk/git/password-manager.git synced 2026-03-18 06:08:45 +01:00

First version of the newly restructured repository

This commit is contained in:
Giulio Cesare Solaroli
2011-10-03 00:56:18 +01:00
parent 597ecfbc02
commit ef68436ac0
729 changed files with 232898 additions and 0 deletions

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,47 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
// 18f820faffcdb5e847d4c5d5c4a1de6743baa1a0
// 9b30434c73fb009b15fecaa904b44f9ced807577
// 9b30434c73fb009b15fecaa904b44f9ced807577
var xh;
var documentText;
try {
xh=new XMLHttpRequest();
} catch(e) {
xh=new ActiveXObject("Msxml2.XMLHTTP");
}
xh.open("GET", window.location, false);
xh.send(null);
documentText = "#####" + xh.responseText + "####";
//documentText = document.body.innerHTML;
console.log(documentText);

View File

@@ -0,0 +1,23 @@
//
// IE limit: 508 characters!!!!!
//
loadClipperzBookmarklet = function() {
var headNode;
var clipperzScriptNode;
clipperzScriptNode = document.getElementById('clipperzScript');
headNode = document.getElementsByTagName('head').item(0);
if (clipperzScriptNode) {
headNode.removeChild(clipperzScriptNode);
}
clipperzScriptNode = document.createElement('script');
clipperzScriptNode.setAttribute('src', 'http%3a%2f%2fclipperz.com%2ffiles%2fclipperz.com%2fbookmarklet%2fBookmarklet.js');
clipperzScriptNode.setAttribute('type', 'text/javascript');
clipperzScriptNode.setAttribute('defer', true);
headNode.appendChild(clipperzScriptNode);
};
loadClipperzBookmarklet();

View File

@@ -0,0 +1,308 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.Base) == 'undefined') { Clipperz.Base = {}; }
Clipperz.Base.VERSION = "0.1";
Clipperz.Base.NAME = "Clipperz.Base";
MochiKit.Base.update(Clipperz.Base, {
//-------------------------------------------------------------------------
'__repr__': function () {
return "[" + this.NAME + " " + this.VERSION + "]";
},
//-------------------------------------------------------------------------
'toString': function () {
return this.__repr__();
},
//-------------------------------------------------------------------------
'trim': function (aValue) {
return aValue.replace(/^\s+|\s+$/g, "");
},
//-------------------------------------------------------------------------
'stringToByteArray': function (aValue) {
var result;
var i, c;
result = [];
c = aValue.length;
for (i=0; i<c; i++) {
result[i] = aValue.charCodeAt(i);
}
return result;
},
//.........................................................................
'byteArrayToString': function (anArrayOfBytes) {
var result;
var i, c;
result = "";
c = anArrayOfBytes.length;
for (i=0; i<c; i++) {
result += String.fromCharCode(anArrayOfBytes[i]);
}
return result;
},
//-------------------------------------------------------------------------
'getValueForKeyInFormContent': function (aFormContent, aKey) {
return aFormContent[1][MochiKit.Base.find(aFormContent[0], aKey)];
},
//-------------------------------------------------------------------------
'indexOfObjectInArray': function(anObject, anArray) {
var result;
var i, c;
result = -1;
c = anArray.length;
for (i=0; ((i<c) && (result < 0)); i++) {
if (anArray[i] === anObject) {
result = i;
}
}
return result;
},
'removeObjectAtIndexFromArray': function(anIndex, anArray) {
anArray.splice(anIndex, 1);
},
'removeObjectFromArray': function(anObject, anArray) {
var objectIndex;
objectIndex = Clipperz.Base.indexOfObjectInArray(anObject, anArray);
if (objectIndex > -1) {
Clipperz.Base.removeObjectAtIndexFromArray(objectIndex, anArray);
} else {
// jslog.error("Trying to remove an object not present in the array");
// TODO: raise an exception
}
},
'removeFromArray': function(anArray, anObject) {
return Clipperz.Base.removeObjectFromArray(anObject, anArray);
},
//-------------------------------------------------------------------------
'splitStringAtFixedTokenSize': function(aString, aTokenSize) {
var result;
var stringToProcess;
stringToProcess = aString;
result = [];
if (stringToProcess != null) {
while (stringToProcess.length > aTokenSize) {
result.push(stringToProcess.substring(0, aTokenSize));
stringToProcess = stringToProcess.substring(aTokenSize);
}
result.push(stringToProcess);
}
return result;
},
//-------------------------------------------------------------------------
'objectType': function(anObject) {
var result;
if (anObject == null) {
result = null;
} else {
result = typeof(anObject);
if (result == "object") {
if (anObject instanceof Array) {
result = 'array'
} else if (anObject.constructor == Boolean) {
result = 'boolean'
} else if (anObject instanceof Date) {
result = 'date'
} else if (anObject instanceof Error) {
result = 'error'
} else if (anObject instanceof Function) {
result = 'function'
} else if (anObject.constructor == Number) {
result = 'number'
} else if (anObject.constructor == String) {
result = 'string'
} else if (anObject instanceof Object) {
result = 'object'
} else {
throw Clipperz.Base.exception.UnknownType;
}
}
}
return result;
},
//-------------------------------------------------------------------------
'escapeHTML': function(aValue) {
var result;
result = aValue;
result = result.replace(/</g, "&lt;");
result = result.replace(/>/g, "&gt;");
return result;
},
//-------------------------------------------------------------------------
'deepClone': function(anObject) {
var result;
result = Clipperz.Base.evalJSON(Clipperz.Base.serializeJSON(anObject));
return result;
},
//-------------------------------------------------------------------------
'evalJSON': function(aString) {
/*
var result;
// check for XSS injection
if (/<script>/.test(aString)) {
throw "error";
}
if (/<iframe>/.test(aString)) {
throw "error";
}
result = MochiKit.Base.evalJSON(aString);
return result;
*/
// return MochiKit.Base.evalJSON(aString);
return JSON2.parse(aString);
},
'serializeJSON': function(anObject) {
// return MochiKit.Base.serializeJSON(anObject);
return JSON2.stringify(anObject);
},
//-------------------------------------------------------------------------
'sanitizeString': function(aValue) {
var result;
if (Clipperz.Base.objectType(aValue) == 'string') {
result = aValue;
result = result.replace(/</img,"&lt;");
result = result.replace(/>/img,"&gt;");
} else {
result = aValue;
}
return result;
},
//-------------------------------------------------------------------------
'exception': {
'AbstractMethod': new MochiKit.Base.NamedError("Clipperz.Base.exception.AbstractMethod"),
'UnknownType': new MochiKit.Base.NamedError("Clipperz.Base.exception.UnknownType"),
'VulnerabilityIssue': new MochiKit.Base.NamedError("Clipperz.Base.exception.VulnerabilityIssue")
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
MochiKit.Base.registerComparator('Object dummy comparator',
function(a, b) {
return ((a.constructor == Object) && (b.constructor == Object));
},
function(a, b) {
var result;
var aKeys;
var bKeys;
//MochiKit.Logging.logDebug(">>> comparator");
//MochiKit.Logging.logDebug("- a: " + Clipperz.Base.serializeJSON(a));
//MochiKit.Logging.logDebug("- b: " + Clipperz.Base.serializeJSON(a));
aKeys = MochiKit.Base.keys(a).sort();
bKeys = MochiKit.Base.keys(b).sort();
result = MochiKit.Base.compare(aKeys, bKeys);
//if (result != 0) {
// MochiKit.Logging.logDebug("- comparator 'keys':");
// MochiKit.Logging.logDebug("- comparator aKeys: " + Clipperz.Base.serializeJSON(aKeys));
// MochiKit.Logging.logDebug("- comparator bKeys: " + Clipperz.Base.serializeJSON(bKeys));
//}
if (result == 0) {
var i, c;
c = aKeys.length;
for (i=0; (i<c) && (result == 0); i++) {
result = MochiKit.Base.compare(a[aKeys[i]], b[bKeys[i]]);
//if (result != 0) {
// MochiKit.Logging.logDebug("- comparator 'values':");
// MochiKit.Logging.logDebug("- comparator a[aKeys[i]]: " + Clipperz.Base.serializeJSON(a[aKeys[i]]));
// MochiKit.Logging.logDebug("- comparator b[bKeys[i]]: " + Clipperz.Base.serializeJSON(b[bKeys[i]]));
//}
}
}
//MochiKit.Logging.logDebug("<<< comparator - result: " + result);
return result;
},
true
);

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,348 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
Clipperz.CSVProcessor = function(args) {
args = args || {};
// this._status = undefined;
// this._error_input = undefined;
// this._string = undefined;
// this._fields = undefined;
this._quoteChar = args['quoteChar'] || "\042";
this._eol = args['eol'] || "";
this._escapeChar = args['escapeChar'] || "\042";
this._separatorChar = args['separatorChar'] || ",";
this._binary = args['binary'] || false;
this._alwaysQuote = args['alwaysQuote'] || false;
return this;
}
//=============================================================================
Clipperz.CSVProcessor.prototype = MochiKit.Base.update(null, {
//-------------------------------------------------------------------------
'quoteChar': function() {
return this._quoteChar;
},
//-------------------------------------------------------------------------
'eol': function() {
return this._eol;
},
//-------------------------------------------------------------------------
'escapeChar': function() {
return this._escapeChar;
},
//-------------------------------------------------------------------------
'separatorChar': function() {
return this._separatorChar;
},
'setSeparatorChar': function(aValue) {
this._separatorChar = aValue;
},
//-------------------------------------------------------------------------
'binary': function() {
return this._binary;
},
//-------------------------------------------------------------------------
'alwaysQuote': function() {
return this._alwaysQuote;
},
//-------------------------------------------------------------------------
/*
'parse': function(aValue) {
var result;
var lines;
var parameter;
//MochiKit.Logging.logDebug(">>> CSVProcessor.parse");
result = [];
lines = aValue.replace(/\r?\n/g, "\n").replace(/^\n* /g, "").replace(/\n$/g, "");;
parameter = {
line: lines
}
do {
var fields;
fields = this.parseLine(parameter);
if (fields != null) {
result.push(fields);
}
parameter.line = parameter.line.replace(/^\n* /g, "").replace(/\n$/g, "");
//MochiKit.Logging.logDebug("line: '" + parameter.line + "'");
} while (parameter.line != "");
//MochiKit.Logging.logDebug("--- CSVProcessor.parse - result: " + Clipperz.Base.serializeJSON(result));
//MochiKit.Logging.logDebug("<<< CSVProcessor.parse");
return result;
},
*/
//-------------------------------------------------------------------------
'deferredParse_core': function(aContext) {
var deferredResult;
if (aContext.line == "") {
deferredResult = MochiKit.Async.succeed(aContext.result);
} else {
var fields;
fields = this.parseLine(aContext);
if (fields != null) {
aContext.result.push(fields);
}
aContext.line = aContext.line.replace(/^\n*/g, "").replace(/\n$/g, "");
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'importProcessorProgressUpdate', {status:'processing', size:aContext.size, progress:(aContext.size - aContext.line.length)});
deferredResult.addCallback(MochiKit.Async.wait, 0.2);
deferredResult.addCallback(MochiKit.Base.method(this, 'deferredParse_core'))
deferredResult.callback(aContext);
}
return deferredResult;
},
//.........................................................................
'deferredParse': function(aValue) {
var deferredResult;
var lines;
var context;
lines = aValue.replace(/\r?\n/g, "\n").replace(/^\n*/g, "").replace(/\n$/g, "");
context = {
line: lines,
size: lines.length,
result: []
}
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(MochiKit.Base.method(this, 'deferredParse_core'));
deferredResult.callback(context);
return deferredResult;
},
//-------------------------------------------------------------------------
'parseLine': function(aParameter) {
var result;
var palatable;
var line;
var processedField;
result = [];
do {
processedField = this.parseField(aParameter);
if (processedField != null) {
result.push(processedField)
};
} while (processedField != null);
return result;
},
//-------------------------------------------------------------------------
'parseField': function(aParameter) {
var result;
var inQuotes;
var validRegExp;
var singleQuoteBeginRegexp;
var escapedQuoteBeginRegexp;
var singleQuoteCommaEndRegexp;
var singleQuoteNewLineEndRegexp;
var commaBeginRegexp;
var newlineRegexp;
singleQuoteBeginRegexp = new RegExp("^" + '\\' + this.quoteChar());
escapedQuoteBeginRegexp = new RegExp("^" + '\\' + this.escapeChar() + '\\' + this.quoteChar());
singleQuoteCommaEndRegexp = new RegExp("^" + '\\' + this.quoteChar() + '\\' + this.separatorChar());
singleQuoteNewLineEndRegexp = new RegExp("^" + '\\' + this.quoteChar() + "\n");
commaBeginRegexp = new RegExp("^" + '\\' + this.separatorChar());
newlineRegexp = new RegExp("^\n");
inQuotes = false;
//MochiKit.Logging.logDebug("#################################### '" + aParameter.line + "'");
if (aParameter.line == "") {
if (aParameter.isThereAnEmptyFinalField == true) {
aParameter.isThereAnEmptyFinalField = false;
result = "";
} else {
result = null;
}
} else {
if (this.binary()) {
validRegexp = /^./;
// validRegexp = /^[^\\]/;
} else {
validRegexp = /^[\t\040-\176]/;
}
try {
var done;
done = false;
result = "";
while (!done) {
if (aParameter.line.length < 1) {
//MochiKit.Logging.logDebug("---> 1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
if (inQuotes == true) {
//MochiKit.Logging.logDebug("---> 1.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
throw new Error("CSV Parsing error; end of string, missing closing double-quote...");
} else {
//MochiKit.Logging.logDebug("---> 1.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
done = true;
}
} else if (escapedQuoteBeginRegexp.test(aParameter.line)) {
//MochiKit.Logging.logDebug("---> 2.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
result += this.quoteChar();
aParameter.line = aParameter.line.substr(2, aParameter.line.length - 1);
//MochiKit.Logging.logDebug("<--- 2.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
} else if (singleQuoteBeginRegexp.test(aParameter.line)) {
//MochiKit.Logging.logDebug("---> 3: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
if (inQuotes == true) {
if (aParameter.line.length == 1) {
//MochiKit.Logging.logDebug("---> 3.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
aParameter.line = '';
done = true;
} else if (singleQuoteCommaEndRegexp.test(aParameter.line)) {
//MochiKit.Logging.logDebug("---> 3.3: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
aParameter.line = aParameter.line.substr(2, aParameter.line.length - 1);
done = true;
//MochiKit.Logging.logDebug("<--- 3.3: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
} else if (singleQuoteNewLineEndRegexp.test(aParameter.line)) {
aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
done = true;
} else {
throw new Error("CSV Parsing error; double-quote, followed by undesirable character (bad character sequence)... " + aParameter.line);
}
} else {
//MochiKit.Logging.logDebug("---> 4: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
if (result == "") {
//MochiKit.Logging.logDebug("---> 4.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
inQuotes = true;
aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
//MochiKit.Logging.logDebug("<--- 4.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
} else {
throw new Error("CSV Parsing error; double-quote, outside of double-quotes (bad character sequence)...");
}
}
} else if (commaBeginRegexp.test(aParameter.line)) {
//MochiKit.Logging.logDebug("---> 5: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
if (inQuotes) {
//MochiKit.Logging.logDebug("---> 5.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
result += aParameter.line.substr(0 ,1);
aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
//MochiKit.Logging.logDebug("<--- 5.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
} else {
//MochiKit.Logging.logDebug("---> 5.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
if (newlineRegexp.test(aParameter.line) || aParameter.line == "") {
//MochiKit.Logging.logDebug("######");
aParameter.isThereAnEmptyFinalField = true;
};
done = true;
//MochiKit.Logging.logDebug("<--- 5.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
}
} else if (validRegexp.test(aParameter.line)) {
//MochiKit.Logging.logDebug("---> 6: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
result += aParameter.line.substr(0, 1);
aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
//MochiKit.Logging.logDebug("<--- 6: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
} else if (newlineRegexp.test(aParameter.line)) {
if (inQuotes == true) {
result += aParameter.line.substr(0 ,1);
aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
} else {
if (result == "") {
if (aParameter.isThereAnEmptyFinalField == true) {
aParameter.isThereAnEmptyFinalField = false;
} else {
result = null;
}
}
done = true;
}
} else {
throw new Error("CSV Parsing error; an undesirable character... '" + aParameter.line.substr(0,1) + "'");
}
}
} catch(exception) {
MochiKit.Logging.logError(exception.message);
// result = null;
throw exception;
}
}
//if (result != null) {
// MochiKit.Logging.logDebug("<=== result: '" + result.replace(/\n/g, "\\n") + "'");
//} else {
// MochiKit.Logging.logDebug("<=== result: NULL");
//}
return result;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,836 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
throw "Clipperz.Crypto.AES depends on Clipperz.ByteArray!";
}
// Dependency commented to avoid a circular reference
//try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) {
// throw "Clipperz.Crypto.AES depends on Clipperz.Crypto.PRNG!";
//}
if (typeof(Clipperz.Crypto.AES) == 'undefined') { Clipperz.Crypto.AES = {}; }
//#############################################################################
Clipperz.Crypto.AES.DeferredExecutionContext = function(args) {
args = args || {};
this._key = args.key;
this._message = args.message;
this._result = args.message.clone();
this._nonce = args.nonce;
this._messageLength = this._message.length();
this._messageArray = this._message.arrayValues();
this._resultArray = this._result.arrayValues();
this._nonceArray = this._nonce.arrayValues();
this._executionStep = 0;
return this;
}
Clipperz.Crypto.AES.DeferredExecutionContext.prototype = MochiKit.Base.update(null, {
'key': function() {
return this._key;
},
'message': function() {
return this._message;
},
'messageLength': function() {
return this._messageLength;
},
'result': function() {
return new Clipperz.ByteArray(this.resultArray());
},
'nonce': function() {
return this._nonce;
},
'messageArray': function() {
return this._messageArray;
},
'resultArray': function() {
return this._resultArray;
},
'nonceArray': function() {
return this._nonceArray;
},
'elaborationChunkSize': function() {
return Clipperz.Crypto.AES.DeferredExecution.chunkSize;
},
'executionStep': function() {
return this._executionStep;
},
'setExecutionStep': function(aValue) {
this._executionStep = aValue;
},
'pause': function(aValue) {
return MochiKit.Async.wait(Clipperz.Crypto.AES.DeferredExecution.pauseTime, aValue);
},
//-----------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//#############################################################################
Clipperz.Crypto.AES.Key = function(args) {
args = args || {};
this._key = args.key;
this._keySize = args.keySize || this.key().length();
if (this.keySize() == 128/8) {
this._b = 176;
this._numberOfRounds = 10;
} else if (this.keySize() == 256/8) {
this._b = 240;
this._numberOfRounds = 14;
} else {
MochiKit.Logging.logError("AES unsupported key size: " + (this.keySize() * 8) + " bits");
throw Clipperz.Crypto.AES.exception.UnsupportedKeySize;
}
this._stretchedKey = null;
return this;
}
Clipperz.Crypto.AES.Key.prototype = MochiKit.Base.update(null, {
'asString': function() {
return "Clipperz.Crypto.AES.Key (" + this.key().toHexString() + ")";
},
//-----------------------------------------------------------------------------
'key': function() {
return this._key;
},
'keySize': function() {
return this._keySize;
},
'b': function() {
return this._b;
},
'numberOfRounds': function() {
return this._numberOfRounds;
},
//=========================================================================
'keyScheduleCore': function(aWord, aRoundConstantsIndex) {
var result;
var sbox;
sbox = Clipperz.Crypto.AES.sbox();
result = [ sbox[aWord[1]] ^ Clipperz.Crypto.AES.roundConstants()[aRoundConstantsIndex],
sbox[aWord[2]],
sbox[aWord[3]],
sbox[aWord[0]] ];
return result;
},
//-----------------------------------------------------------------------------
'xorWithPreviousStretchValues': function(aKey, aWord, aPreviousWordIndex) {
var result;
var i,c;
result = [];
c = 4;
for (i=0; i<c; i++) {
result[i] = aWord[i] ^ aKey.byteAtIndex(aPreviousWordIndex + i);
}
return result;
},
//-----------------------------------------------------------------------------
'sboxShakeup': function(aWord) {
var result;
var sbox;
var i,c;
result = [];
sbox = Clipperz.Crypto.AES.sbox();
c =4;
for (i=0; i<c; i++) {
result[i] = sbox[aWord[i]];
}
return result;
},
//-----------------------------------------------------------------------------
'stretchKey': function(aKey) {
var currentWord;
var keyLength;
var previousStretchIndex;
var i,c;
keyLength = aKey.length();
previousStretchIndex = keyLength - this.keySize();
currentWord = [ aKey.byteAtIndex(keyLength - 4),
aKey.byteAtIndex(keyLength - 3),
aKey.byteAtIndex(keyLength - 2),
aKey.byteAtIndex(keyLength - 1) ];
currentWord = this.keyScheduleCore(currentWord, keyLength / this.keySize());
if (this.keySize() == 256/8) {
c = 8;
} else if (this.keySize() == 128/8){
c = 4;
}
for (i=0; i<c; i++) {
if (i == 4) {
// fifth streatch word
currentWord = this.sboxShakeup(currentWord);
}
currentWord = this.xorWithPreviousStretchValues(aKey, currentWord, previousStretchIndex + (i*4));
aKey.appendBytes(currentWord);
}
return aKey;
},
//-----------------------------------------------------------------------------
'stretchedKey': function() {
if (this._stretchedKey == null) {
var stretchedKey;
stretchedKey = this.key().clone();
while (stretchedKey.length() < this.keySize()) {
stretchedKey.appendByte(0);
}
while (stretchedKey.length() < this.b()) {
stretchedKey = this.stretchKey(stretchedKey);
}
this._stretchedKey = stretchedKey.split(0, this.b());
}
return this._stretchedKey;
},
//=========================================================================
__syntaxFix__: "syntax fix"
});
//#############################################################################
Clipperz.Crypto.AES.State = function(args) {
args = args || {};
this._data = args.block;
this._key = args.key;
return this;
}
Clipperz.Crypto.AES.State.prototype = MochiKit.Base.update(null, {
'key': function() {
return this._key;
},
//-----------------------------------------------------------------------------
'data': function() {
return this._data;
},
'setData': function(aValue) {
this._data = aValue;
},
//=========================================================================
'addRoundKey': function(aRoundNumber) {
// each byte of the state is combined with the round key; each round key is derived from the cipher key using a key schedule.
var data;
var stretchedKey;
var firstStretchedKeyIndex;
var i,c;
data = this.data();
stretchedKey = this.key().stretchedKey();
firstStretchedKeyIndex = aRoundNumber * (128/8);
c = 128/8;
for (i=0; i<c; i++) {
data[i] = data[i] ^ stretchedKey.byteAtIndex(firstStretchedKeyIndex + i);
}
},
//-----------------------------------------------------------------------------
'subBytes': function() {
// a non-linear substitution step where each byte is replaced with another according to a lookup table.
var i,c;
var data;
var sbox;
data = this.data();
sbox = Clipperz.Crypto.AES.sbox();
c = 16;
for (i=0; i<c; i++) {
data[i] = sbox[data[i]];
}
},
//-----------------------------------------------------------------------------
'shiftRows': function() {
// a transposition step where each row of the state is shifted cyclically a certain number of steps.
var newValue;
var data;
var shiftMapping;
var i,c;
newValue = new Array(16);
data = this.data();
shiftMapping = Clipperz.Crypto.AES.shiftRowMapping();
// [0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11];
c = 16;
for (i=0; i<c; i++) {
newValue[i] = data[shiftMapping[i]];
}
for (i=0; i<c; i++) {
data[i] = newValue[i];
}
},
//-----------------------------------------------------------------------------
/*
'mixColumnsWithValues': function(someValues) {
var result;
var a;
var i,c;
c = 4;
result = [];
a = [];
for (i=0; i<c; i++) {
a[i] = [];
a[i][1] = someValues[i]
if ((a[i][1] & 0x80) == 0x80) {
a[i][2] = (a[i][1] << 1) ^ 0x11b;
} else {
a[i][2] = a[i][1] << 1;
}
a[i][3] = a[i][2] ^ a[i][1];
}
for (i=0; i<c; i++) {
var x;
x = Clipperz.Crypto.AES.mixColumnsMatrix()[i];
result[i] = a[0][x[0]] ^ a[1][x[1]] ^ a[2][x[2]] ^ a[3][x[3]];
}
return result;
},
'mixColumns': function() {
// a mixing operation which operates on the columns of the state, combining the four bytes in each column using a linear transformation.
var data;
var i, c;
data = this.data();
c = 4;
for(i=0; i<c; i++) {
var blockIndex;
var mixedValues;
blockIndex = i * 4;
mixedValues = this.mixColumnsWithValues([ data[blockIndex + 0],
data[blockIndex + 1],
data[blockIndex + 2],
data[blockIndex + 3]]);
data[blockIndex + 0] = mixedValues[0];
data[blockIndex + 1] = mixedValues[1];
data[blockIndex + 2] = mixedValues[2];
data[blockIndex + 3] = mixedValues[3];
}
},
*/
'mixColumns': function() {
// a mixing operation which operates on the columns of the state, combining the four bytes in each column using a linear transformation.
var data;
var i, c;
var a_1;
var a_2;
a_1 = new Array(4);
a_2 = new Array(4);
data = this.data();
c = 4;
for(i=0; i<c; i++) {
var blockIndex;
var ii, cc;
blockIndex = i * 4;
cc = 4;
for (ii=0; ii<cc; ii++) {
var value;
value = data[blockIndex + ii];
a_1[ii] = value;
a_2[ii] = (value & 0x80) ? ((value << 1) ^ 0x011b) : (value << 1);
}
data[blockIndex + 0] = a_2[0] ^ a_1[1] ^ a_2[1] ^ a_1[2] ^ a_1[3];
data[blockIndex + 1] = a_1[0] ^ a_2[1] ^ a_1[2] ^ a_2[2] ^ a_1[3];
data[blockIndex + 2] = a_1[0] ^ a_1[1] ^ a_2[2] ^ a_1[3] ^ a_2[3];
data[blockIndex + 3] = a_1[0] ^ a_2[0] ^ a_1[1] ^ a_1[2] ^ a_2[3];
}
},
//=========================================================================
'spinRound': function(aRoundNumber) {
this.addRoundKey(aRoundNumber);
this.subBytes();
this.shiftRows();
this.mixColumns();
},
'spinLastRound': function() {
this.addRoundKey(this.key().numberOfRounds() - 1);
this.subBytes();
this.shiftRows();
this.addRoundKey(this.key().numberOfRounds());
},
//=========================================================================
'encrypt': function() {
var i,c;
c = this.key().numberOfRounds() - 1;
for (i=0; i<c; i++) {
this.spinRound(i);
}
this.spinLastRound();
},
//=========================================================================
__syntaxFix__: "syntax fix"
});
//#############################################################################
Clipperz.Crypto.AES.VERSION = "0.1";
Clipperz.Crypto.AES.NAME = "Clipperz.Crypto.AES";
MochiKit.Base.update(Clipperz.Crypto.AES, {
// http://www.cs.eku.edu/faculty/styer/460/Encrypt/JS-AES.html
// http://en.wikipedia.org/wiki/Advanced_Encryption_Standard
// http://en.wikipedia.org/wiki/Rijndael_key_schedule
// http://en.wikipedia.org/wiki/Rijndael_S-box
'__repr__': function () {
return "[" + this.NAME + " " + this.VERSION + "]";
},
'toString': function () {
return this.__repr__();
},
//=============================================================================
'_sbox': null,
'sbox': function() {
if (Clipperz.Crypto.AES._sbox == null) {
Clipperz.Crypto.AES._sbox = [
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
];
}
return Clipperz.Crypto.AES._sbox;
},
//-----------------------------------------------------------------------------
//
// 0 4 8 12 0 4 8 12
// 1 5 9 13 => 5 9 13 1
// 2 6 10 14 10 14 2 6
// 3 7 11 15 15 3 7 11
//
'_shiftRowMapping': null,
'shiftRowMapping': function() {
if (Clipperz.Crypto.AES._shiftRowMapping == null) {
Clipperz.Crypto.AES._shiftRowMapping = [0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11];
}
return Clipperz.Crypto.AES._shiftRowMapping;
},
//-----------------------------------------------------------------------------
'_mixColumnsMatrix': null,
'mixColumnsMatrix': function() {
if (Clipperz.Crypto.AES._mixColumnsMatrix == null) {
Clipperz.Crypto.AES._mixColumnsMatrix = [ [2, 3, 1 ,1],
[1, 2, 3, 1],
[1, 1, 2, 3],
[3, 1, 1, 2] ];
}
return Clipperz.Crypto.AES._mixColumnsMatrix;
},
'_roundConstants': null,
'roundConstants': function() {
if (Clipperz.Crypto.AES._roundConstants == null) {
Clipperz.Crypto.AES._roundConstants = [ , 1, 2, 4, 8, 16, 32, 64, 128, 27, 54, 108, 216, 171, 77, 154];
// Clipperz.Crypto.AES._roundConstants = [ , 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a];
}
return Clipperz.Crypto.AES._roundConstants;
},
//=============================================================================
'incrementNonce': function(aNonce) {
//Clipperz.Profile.start("Clipperz.Crypto.AES.incrementNonce");
var i;
var done;
done = false;
i = aNonce.length - 1;
while ((i>=0) && (done == false)) {
var currentByteValue;
currentByteValue = aNonce[i];
if (currentByteValue == 0xff) {
aNonce[i] = 0;
if (i>= 0) {
i --;
} else {
done = true;
}
} else {
aNonce[i] = currentByteValue + 1;
done = true;
}
}
//Clipperz.Profile.stop("Clipperz.Crypto.AES.incrementNonce");
},
//-----------------------------------------------------------------------------
'encryptBlock': function(aKey, aBlock) {
var result;
var state;
state = new Clipperz.Crypto.AES.State({block:aBlock, key:aKey});
//is(state.data(), 'before');
state.encrypt();
result = state.data();
return result;
},
//-----------------------------------------------------------------------------
'encryptBlocks': function(aKey, aMessage, aNonce) {
var result;
var nonce;
var self;
var messageIndex;
var messageLength;
var blockSize;
self = Clipperz.Crypto.AES;
blockSize = 128/8;
messageLength = aMessage.length;
nonce = aNonce;
result = aMessage;
messageIndex = 0;
while (messageIndex < messageLength) {
var encryptedBlock;
var i,c;
self.incrementNonce(nonce);
encryptedBlock = self.encryptBlock(aKey, nonce);
if ((messageLength - messageIndex) > blockSize) {
c = blockSize;
} else {
c = messageLength - messageIndex;
}
for (i=0; i<c; i++) {
result[messageIndex + i] = result[messageIndex + i] ^ encryptedBlock[i];
}
messageIndex += blockSize;
}
return result;
},
//-----------------------------------------------------------------------------
'encrypt': function(aKey, someData, aNonce) {
var result;
var nonce;
var encryptedData;
var key;
key = new Clipperz.Crypto.AES.Key({key:aKey});
nonce = aNonce ? aNonce.clone() : Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(128/8);
encryptedData = Clipperz.Crypto.AES.encryptBlocks(key, someData.arrayValues(), nonce.arrayValues());
result = nonce.appendBytes(encryptedData);
return result;
},
//-----------------------------------------------------------------------------
'decrypt': function(aKey, someData) {
var result;
var nonce;
var encryptedData;
var decryptedData;
var dataIterator;
var key;
key = new Clipperz.Crypto.AES.Key({key:aKey});
encryptedData = someData.arrayValues();
nonce = encryptedData.slice(0, (128/8));
encryptedData = encryptedData.slice(128/8);
decryptedData = Clipperz.Crypto.AES.encryptBlocks(key, encryptedData, nonce);
result = new Clipperz.ByteArray(decryptedData);
return result;
},
//=============================================================================
'deferredEncryptExecutionChunk': function(anExecutionContext) {
var result;
var nonce;
var self;
var messageIndex;
var messageLength;
var blockSize;
var executionLimit;
self = Clipperz.Crypto.AES;
blockSize = 128/8;
messageLength = anExecutionContext.messageArray().length;
nonce = anExecutionContext.nonceArray();
result = anExecutionContext.resultArray();
messageIndex = anExecutionContext.executionStep();
executionLimit = messageIndex + anExecutionContext.elaborationChunkSize();
executionLimit = Math.min(executionLimit, messageLength);
while (messageIndex < executionLimit) {
var encryptedBlock;
var i,c;
self.incrementNonce(nonce);
encryptedBlock = self.encryptBlock(anExecutionContext.key(), nonce);
if ((executionLimit - messageIndex) > blockSize) {
c = blockSize;
} else {
c = executionLimit - messageIndex;
}
for (i=0; i<c; i++) {
result[messageIndex + i] = result[messageIndex + i] ^ encryptedBlock[i];
}
messageIndex += blockSize;
}
anExecutionContext.setExecutionStep(messageIndex);
return anExecutionContext;
},
//-----------------------------------------------------------------------------
'deferredEncryptBlocks': function(anExecutionContext) {
var deferredResult;
var messageSize;
var i,c;
var now;
messageSize = anExecutionContext.messageLength();
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Clipperz.Crypto.AES.deferredEncryptBlocks - START: " + res); return res;});
// deferredResult.addCallback(MochiKit.Base.method(anExecutionContext, 'pause'));
c = Math.ceil(messageSize / anExecutionContext.elaborationChunkSize());
for (i=0; i<c; i++) {
//deferredResult.addBoth(function(res) {now = new Date(); return res;});
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Clipperz.Crypto.AES.deferredEncryptBlocks - : (" + i + ") - " + res); return res;});
deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncryptExecutionChunk);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("[" + (new Date() - now) + "]Clipperz.Crypto.AES.deferredEncryptBlocks"); return res;});
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Clipperz.Crypto.AES.deferredEncryptBlocks - : (" + i + ") -- " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(anExecutionContext, 'pause'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Clipperz.Crypto.AES.deferredEncryptBlocks - : (" + i + ") --- " + res); return res;});
}
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Clipperz.Crypto.AES.deferredEncryptBlocks - END: " + res); return res;});
deferredResult.callback(anExecutionContext);
return deferredResult;
},
//-----------------------------------------------------------------------------
'deferredEncrypt': function(aKey, someData, aNonce) {
var deferredResult;
var executionContext;
var result;
var nonce;
var key;
key = new Clipperz.Crypto.AES.Key({key:aKey});
nonce = aNonce ? aNonce.clone() : Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(128/8);
executionContext = new Clipperz.Crypto.AES.DeferredExecutionContext({key:key, message:someData, nonce:nonce});
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Clipperz.Crypto.AES.deferredEncrypt - 1: " + res); return res;});
deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncryptBlocks);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Clipperz.Crypto.AES.deferredEncrypt - 2: " + res); return res;});
deferredResult.addCallback(function(anExecutionContext) {
var result;
result = anExecutionContext.nonce().clone();
result.appendBytes(anExecutionContext.resultArray());
return result;
});
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Clipperz.Crypto.AES.deferredEncrypt - 3: " + res); return res;});
deferredResult.callback(executionContext)
return deferredResult;
},
//-----------------------------------------------------------------------------
'deferredDecrypt': function(aKey, someData) {
var deferredResult
var nonce;
var message;
var key;
key = new Clipperz.Crypto.AES.Key({key:aKey});
nonce = someData.split(0, (128/8));
message = someData.split(128/8);
executionContext = new Clipperz.Crypto.AES.DeferredExecutionContext({key:key, message:message, nonce:nonce});
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncryptBlocks);
deferredResult.addCallback(function(anExecutionContext) {
return anExecutionContext.result();
});
deferredResult.callback(executionContext);
return deferredResult;
},
//-----------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//#############################################################################
Clipperz.Crypto.AES.DeferredExecution = {
'chunkSize': 4096, // 1024 4096 8192 16384 32768;
'pauseTime': 0.2
}
Clipperz.Crypto.AES.exception = {
'UnsupportedKeySize': new MochiKit.Base.NamedError("Clipperz.Crypto.AES.exception.UnsupportedKeySize")
};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,960 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
/*
try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
}
if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
//#############################################################################
Clipperz.Crypto.ECC.BinaryField = {};
//#############################################################################
Clipperz.Crypto.ECC.BinaryField.AbstractValue = function(aValue, aBase) {
return this;
}
Clipperz.Crypto.ECC.BinaryField.AbstractValue.prototype = MochiKit.Base.update(null, {
'asString': function(aBase) {
throw Clipperz.Base.exception.AbstractMethod;
},
'isZero': function() {
throw Clipperz.Base.exception.AbstractMethod;
},
'shiftLeft': function(aNumberOfBitsToShift) {
throw Clipperz.Base.exception.AbstractMethod;
},
'bitSize': function() {
throw Clipperz.Base.exception.AbstractMethod;
},
'isBitSet': function(aBitPosition) {
throw Clipperz.Base.exception.AbstractMethod;
},
'xor': function(aValue) {
throw Clipperz.Base.exception.AbstractMethod;
},
'compare': function(aValue) {
throw Clipperz.Base.exception.AbstractMethod;
},
//-----------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//*****************************************************************************
/ *
Clipperz.Crypto.ECC.BinaryField.BigIntValue = function(aValue, aBase) {
this._value = new Clipperz.Crypto.BigInt(aValue, aBase);
return this;
}
Clipperz.Crypto.ECC.BinaryField.BigIntValue.prototype = MochiKit.Base.update(new Clipperz.Crypto.ECC.BinaryField.AbstractValue(), {
'value': function() {
return this._value;
},
//-----------------------------------------------------------------------------
'isZero': function() {
return (this.value().compare(Clipperz.Crypto.ECC.BinaryField.BigIntValue.O) == 0);
},
//-----------------------------------------------------------------------------
'asString': function(aBase) {
return this.value().asString(aBase);
},
//-----------------------------------------------------------------------------
'shiftLeft': function(aNumberOfBitsToShift) {
return new Clipperz.Crypto.ECC.BinaryField.BigIntValue(this.value().shiftLeft(aNumberOfBitsToShift));
},
//-----------------------------------------------------------------------------
'bitSize': function() {
return this.value().bitSize();
},
//-----------------------------------------------------------------------------
'isBitSet': function(aBitPosition) {
return this.value().isBitSet(aBitPosition);
},
//-----------------------------------------------------------------------------
'xor': function(aValue) {
return new Clipperz.Crypto.ECC.BinaryField.BigIntValue(this.value().xor(aValue.value()));
},
//-----------------------------------------------------------------------------
'compare': function(aValue) {
return this.value().compare(aValue.value());
},
//-----------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
Clipperz.Crypto.ECC.BinaryField.BigIntValue.O = new Clipperz.Crypto.BigInt(0);
Clipperz.Crypto.ECC.BinaryField.BigIntValue.I = new Clipperz.Crypto.BigInt(1);
* /
//*****************************************************************************
Clipperz.Crypto.ECC.BinaryField.WordArrayValue = function(aValue, aBase) {
if (aValue.constructor == String) {
var value;
var stringLength;
var numberOfWords;
var i,c;
if (aBase != 16) {
throw Clipperz.Crypto.ECC.BinaryField.WordArrayValue.exception.UnsupportedBase;
}
value = aValue.replace(/ /g, '');
stringLength = value.length;
numberOfWords = Math.ceil(stringLength / 8);
this._value = new Array(numberOfWords);
c = numberOfWords;
for (i=0; i<c; i++) {
var word;
if (i < (c-1)) {
word = parseInt(value.substr(stringLength-((i+1)*8), 8), 16);
} else {
word = parseInt(value.substr(0, stringLength-(i*8)), 16);
}
this._value[i] = word;
}
} else if (aValue.constructor == Array) {
var itemsToCopy;
itemsToCopy = aValue.length;
while (aValue[itemsToCopy - 1] == 0) {
itemsToCopy --;
}
this._value = aValue.slice(0, itemsToCopy);
} else if (aValue.constructor == Number) {
this._value = [aValue];
} else {
// throw Clipperz.Crypto.ECC.BinaryField.WordArrayValue.exception.UnsupportedConstructorValueType;
}
return this;
}
Clipperz.Crypto.ECC.BinaryField.WordArrayValue.prototype = MochiKit.Base.update(new Clipperz.Crypto.ECC.BinaryField.AbstractValue(), {
'value': function() {
return this._value;
},
//-----------------------------------------------------------------------------
'wordSize': function() {
return this._value.length
},
//-----------------------------------------------------------------------------
'clone': function() {
return new Clipperz.Crypto.ECC.BinaryField.WordArrayValue(this._value.slice(0));
},
//-----------------------------------------------------------------------------
'isZero': function() {
return (this.compare(Clipperz.Crypto.ECC.BinaryField.WordArrayValue.O) == 0);
},
//-----------------------------------------------------------------------------
'asString': function(aBase) {
var result;
var i,c;
if (aBase != 16) {
throw Clipperz.Crypto.ECC.BinaryField.WordArrayValue.exception.UnsupportedBase;
}
result = "";
c = this.wordSize();
for (i=0; i<c; i++) {
var wordAsString;
// wordAsString = ("00000000" + this.value()[i].toString(16));
wordAsString = ("00000000" + this._value[i].toString(16));
wordAsString = wordAsString.substring(wordAsString.length - 8);
result = wordAsString + result;
}
result = result.replace(/^(00)* SPACEs THAT SHOULD BE REMOVED TO FIX THIS REGEX /, "");
if (result == "") {
result = "0";
}
return result;
},
//-----------------------------------------------------------------------------
'shiftLeft': function(aNumberOfBitsToShift) {
return new Clipperz.Crypto.ECC.BinaryField.WordArrayValue(Clipperz.Crypto.ECC.BinaryField.WordArrayValue.shiftLeft(this._value, aNumberOfBitsToShift));
},
//-----------------------------------------------------------------------------
'bitSize': function() {
return Clipperz.Crypto.ECC.BinaryField.WordArrayValue.bitSize(this._value);
},
//-----------------------------------------------------------------------------
'isBitSet': function(aBitPosition) {
return Clipperz.Crypto.ECC.BinaryField.WordArrayValue.isBitSet(this._value, aBitPosition);
},
//-----------------------------------------------------------------------------
'xor': function(aValue) {
return new Clipperz.Crypto.ECC.BinaryField.WordArrayValue(Clipperz.Crypto.ECC.BinaryField.WordArrayValue.xor(this._value, aValue._value));
},
//-----------------------------------------------------------------------------
'compare': function(aValue) {
return Clipperz.Crypto.ECC.BinaryField.WordArrayValue.compare(this._value, aValue._value);
},
//-----------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
Clipperz.Crypto.ECC.BinaryField.WordArrayValue.O = new Clipperz.Crypto.ECC.BinaryField.WordArrayValue('0', 16);
Clipperz.Crypto.ECC.BinaryField.WordArrayValue.I = new Clipperz.Crypto.ECC.BinaryField.WordArrayValue('1', 16);
Clipperz.Crypto.ECC.BinaryField.WordArrayValue.xor = function(a, b) {
var result;
var resultSize;
var i,c;
resultSize = Math.max(a.length, b.length);
result = new Array(resultSize);
c = resultSize;
for (i=0; i<c; i++) {
// resultValue[i] = (((this.value()[i] || 0) ^ (aValue.value()[i] || 0)) >>> 0);
result[i] = (((a[i] || 0) ^ (b[i] || 0)) >>> 0);
}
return result;
};
Clipperz.Crypto.ECC.BinaryField.WordArrayValue.shiftLeft = function(aWordArray, aNumberOfBitsToShift) {
var numberOfWordsToShift;
var numberOfBitsToShift;
var result;
var overflowValue;
var i,c;
numberOfWordsToShift = Math.floor(aNumberOfBitsToShift / 32);
numberOfBitsToShift = aNumberOfBitsToShift % 32;
result = new Array(aWordArray.length + numberOfWordsToShift);
c = numberOfWordsToShift;
for (i=0; i<c; i++) {
result[i] = 0;
}
overflowValue = 0;
nextOverflowValue = 0;
c = aWordArray.length;
for (i=0; i<c; i++) {
var value;
var resultWord;
// value = this.value()[i];
value = aWordArray[i];
if (numberOfBitsToShift > 0) {
var nextOverflowValue;
nextOverflowValue = (value >>> (32 - numberOfBitsToShift));
value = value & (0xffffffff >>> numberOfBitsToShift);
resultWord = (((value << numberOfBitsToShift) | overflowValue) >>> 0);
} else {
resultWord = value;
}
result[i+numberOfWordsToShift] = resultWord;
overflowValue = nextOverflowValue;
}
if (overflowValue != 0) {
result[aWordArray.length + numberOfWordsToShift] = overflowValue;
}
return result;
};
Clipperz.Crypto.ECC.BinaryField.WordArrayValue.bitSize = function(aWordArray) {
var result;
var notNullElements;
var mostValuableWord;
var matchingBitsInMostImportantWord;
var mask;
var i,c;
notNullElements = aWordArray.length;
if ((aWordArray.length == 1) && (aWordArray[0] == 0)) {
result = 0;
} else {
while((aWordArray[notNullElements - 1] == 0) && (notNullElements > 0)) {
notNullElements --;
}
result = (notNullElements - 1) * 32;
mostValuableWord = aWordArray[notNullElements - 1];
matchingBits = 32;
mask = 0x80000000;
while ((matchingBits > 0) && ((mostValuableWord & mask) == 0)) {
matchingBits --;
mask >>>= 1;
}
result += matchingBits;
}
return result;
};
Clipperz.Crypto.ECC.BinaryField.WordArrayValue.isBitSet = function(aWordArray, aBitPosition) {
var result;
var byteIndex;
var bitIndexInSelectedByte;
byteIndex = Math.floor(aBitPosition / 32);
bitIndexInSelectedByte = aBitPosition % 32;
if (byteIndex <= aWordArray.length) {
result = ((aWordArray[byteIndex] & (1 << bitIndexInSelectedByte)) != 0);
} else {
result = false;
}
return result;
};
Clipperz.Crypto.ECC.BinaryField.WordArrayValue.compare = function(a,b) {
var result;
var i,c;
result = MochiKit.Base.compare(a.length, b.length);
c = a.length;
for (i=0; (i<c) && (result==0); i++) {
//console.log("compare[" + c + " - " + i + " - 1] " + this.value()[c-i-1] + ", " + aValue.value()[c-i-1]);
// result = MochiKit.Base.compare(this.value()[c-i-1], aValue.value()[c-i-1]);
result = MochiKit.Base.compare(a[c-i-1], b[c-i-1]);
}
return result;
};
Clipperz.Crypto.ECC.BinaryField.WordArrayValue['exception']= {
'UnsupportedBase': new MochiKit.Base.NamedError("Clipperz.Crypto.ECC.BinaryField.WordArrayValue.exception.UnsupportedBase"),
'UnsupportedConstructorValueType': new MochiKit.Base.NamedError("Clipperz.Crypto.ECC.BinaryField.WordArrayValue.exception.UnsupportedConstructorValueType")
};
//*****************************************************************************
//Clipperz.Crypto.ECC.BinaryField.Value = Clipperz.Crypto.ECC.BinaryField.BigIntValue;
Clipperz.Crypto.ECC.BinaryField.Value = Clipperz.Crypto.ECC.BinaryField.WordArrayValue;
//#############################################################################
Clipperz.Crypto.ECC.BinaryField.Point = function(args) {
args = args || {};
this._x = args.x;
this._y = args.y;
return this;
}
Clipperz.Crypto.ECC.BinaryField.Point.prototype = MochiKit.Base.update(null, {
'asString': function() {
return "Clipperz.Crypto.ECC.BinaryField.Point (" + this.x() + ", " + this.y() + ")";
},
//-----------------------------------------------------------------------------
'x': function() {
return this._x;
},
'y': function() {
return this._y;
},
//-----------------------------------------------------------------------------
'isZero': function() {
return (this.x().isZero() && this.y().isZero())
},
//-----------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//#############################################################################
Clipperz.Crypto.ECC.BinaryField.FiniteField = function(args) {
args = args || {};
this._modulus = args.modulus;
return this;
}
Clipperz.Crypto.ECC.BinaryField.FiniteField.prototype = MochiKit.Base.update(null, {
'asString': function() {
return "Clipperz.Crypto.ECC.BinaryField.FiniteField (" + this.modulus().asString() + ")";
},
//-----------------------------------------------------------------------------
'modulus': function() {
return this._modulus;
},
//-----------------------------------------------------------------------------
'_module': function(aValue) {
var result;
var modulusComparison;
//console.log(">>> binaryField.finiteField.(standard)module");
modulusComparison = Clipperz.Crypto.ECC.BinaryField.WordArrayValue.compare(aValue, this.modulus()._value);
if (modulusComparison < 0) {
result = aValue;
} else if (modulusComparison == 0) {
result = [0];
} else {
var modulusBitSize;
var resultBitSize;
result = aValue;
modulusBitSize = this.modulus().bitSize();
resultBitSize = Clipperz.Crypto.ECC.BinaryField.WordArrayValue.bitSize(result);
while (resultBitSize >= modulusBitSize) {
result = Clipperz.Crypto.ECC.BinaryField.WordArrayValue.xor(result, Clipperz.Crypto.ECC.BinaryField.WordArrayValue.shiftLeft(this.modulus()._value, resultBitSize - modulusBitSize));
resultBitSize = Clipperz.Crypto.ECC.BinaryField.WordArrayValue.bitSize(result);
}
}
//console.log("<<< binaryField.finiteField.(standard)module");
return result;
},
'module': function(aValue) {
return new Clipperz.Crypto.ECC.BinaryField.Value(this._module(aValue._value));
},
//-----------------------------------------------------------------------------
'_add': function(a, b) {
return Clipperz.Crypto.ECC.BinaryField.WordArrayValue.xor(a, b);
},
'add': function(a, b) {
return new Clipperz.Crypto.ECC.BinaryField.Value(this._add(a._value, b._value));
},
//-----------------------------------------------------------------------------
'negate': function(aValue) {
return aValue.clone();
},
//-----------------------------------------------------------------------------
/ *
'multiply': function(a, b) {
var result;
var valueToXor;
var i,c;
result = Clipperz.Crypto.ECC.BinaryField.Value.O;
valueToXor = b;
c = a.bitSize();
for (i=0; i<c; i++) {
if (a.isBitSet(i) === true) {
result = result.xor(valueToXor);
}
valueToXor = valueToXor.shiftLeft(1);
}
result = this.module(result);
return result;
},
* /
'_multiply': function(a, b) {
var result;
var valueToXor;
var i,c;
result = [0];
valueToXor = b;
c = Clipperz.Crypto.ECC.BinaryField.WordArrayValue.bitSize(a);
for (i=0; i<c; i++) {
if (Clipperz.Crypto.ECC.BinaryField.WordArrayValue.isBitSet(a, i) === true) {
result = Clipperz.Crypto.ECC.BinaryField.WordArrayValue.xor(result, valueToXor);
}
valueToXor = Clipperz.Crypto.ECC.BinaryField.WordArrayValue.shiftLeft(valueToXor, 1);
}
result = this._module(result);
return result;
},
'multiply': function(a, b) {
return new Clipperz.Crypto.ECC.BinaryField.Value(this._multiply(a._value, b._value));
},
//-----------------------------------------------------------------------------
//
// Guide to Elliptic Curve Cryptography
// Darrel Hankerson, Alfred Menezes, Scott Vanstone
// - Pag: 49, Alorithm 2.34
//
//-----------------------------------------------------------------------------
/ *
'square': function(aValue) {
var result;
var t;
var i,c;
result = [0];
t = Math.max(a)
c = 32;
for (i=0; i<c; i++) {
var ii, cc;
cc =
}
return result;
},
* /
//-----------------------------------------------------------------------------
'inverse': function(aValue) {
var result;
var b, c;
var u, v;
b = Clipperz.Crypto.ECC.BinaryField.Value.I;
c = Clipperz.Crypto.ECC.BinaryField.Value.O;
u = this.module(aValue);
v = this.modulus();
while (u.bitSize() > 1) {
var bitDifferenceSize;
bitDifferenceSize = u.bitSize() - v.bitSize();
if (bitDifferenceSize < 0) {
var swap;
swap = u;
u = v;
v = swap;
swap = c;
c = b;
b = swap;
bitDifferenceSize = -bitDifferenceSize;
}
u = this.add(u, v.shiftLeft(bitDifferenceSize));
b = this.add(b, c.shiftLeft(bitDifferenceSize))
}
result = this.module(b);
return result;
},
//-----------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//#############################################################################
Clipperz.Crypto.ECC.BinaryField.Curve = function(args) {
args = args || {};
this._modulus = args.modulus;
this._a = args.a;
this._b = args.b;
this._G = args.G;
this._r = args.r;
this._h = args.h;
this._finiteField = null;
return this;
}
Clipperz.Crypto.ECC.BinaryField.Curve.prototype = MochiKit.Base.update(null, {
'asString': function() {
return "Clipperz.Crypto.ECC.BinaryField.Curve";
},
//-----------------------------------------------------------------------------
'modulus': function() {
return this._modulus;
},
'a': function() {
return this._a;
},
'b': function() {
return this._b;
},
'G': function() {
return this._G;
},
'r': function() {
return this._r;
},
'h': function() {
return this._h;
},
//-----------------------------------------------------------------------------
'finiteField': function() {
if (this._finiteField == null) {
this._finiteField = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:this.modulus()})
}
return this._finiteField;
},
//-----------------------------------------------------------------------------
'negate': function(aPointA) {
var result;
result = new Clipperz.Crypto.ECC.Point({x:aPointA.x(), y:this.finiteField().add(aPointA.y(), aPointA.x())})
return result;
},
//-----------------------------------------------------------------------------
'add': function(aPointA, aPointB) {
var result;
//console.log(">>> ECC.BinaryField.Curve.add");
if (aPointA.isZero()) {
//console.log("--- pointA == zero");
result = aPointB;
} else if (aPointB.isZero()) {
//console.log("--- pointB == zero");
result = aPointA;
} else if ( (aPointA.x().compare(aPointB.x()) == 0) &&
((aPointA.y().compare(aPointB.y()) != 0) || aPointB.x().isZero()))
{
//console.log("compare A.x - B.x: ", aPointA.x().compare(aPointB.x()));
//console.log("compare A.y - B.y: ", (aPointA.y().compare(aPointB.y()) != 0));
//console.log("compare B.x.isZero(): ", aPointB.x().isZero());
//console.log("--- result = zero");
result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
} else {
//console.log("--- result = ELSE");
var f2m;
var x, y;
var lambda;
f2m = this.finiteField();
if (aPointA.x().compare(aPointB.x()) != 0) {
//console.log(" a.x != b.x");
lambda = f2m.multiply(
f2m.add(aPointA.y(), aPointB.y()),
f2m.inverse(f2m.add(aPointA.x(), aPointB.x()))
);
x = f2m.add(this.a(), f2m.multiply(lambda, lambda));
x = f2m.add(x, lambda);
x = f2m.add(x, aPointA.x());
x = f2m.add(x, aPointB.x());
} else {
//console.log(" a.x == b.x");
lambda = f2m.add(aPointB.x(), f2m.multiply(aPointB.y(), f2m.inverse(aPointB.x())));
//console.log(" lambda: " + lambda.asString(16));
x = f2m.add(this.a(), f2m.multiply(lambda, lambda));
//console.log(" x (step 1): " + x.asString(16));
x = f2m.add(x, lambda);
//console.log(" x (step 2): " + x.asString(16));
}
y = f2m.multiply(f2m.add(aPointB.x(), x), lambda);
//console.log(" y (step 1): " + y.asString(16));
y = f2m.add(y, x);
//console.log(" y (step 2): " + y.asString(16));
y = f2m.add(y, aPointB.y());
//console.log(" y (step 3): " + y.asString(16));
result = new Clipperz.Crypto.ECC.BinaryField.Point({x:x, y:y})
}
//console.log("<<< ECC.BinaryField.Curve.add");
return result;
},
//-----------------------------------------------------------------------------
'multiply': function(aValue, aPoint) {
var result;
console.profile();
result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
if (aValue.isZero() == false) {
var k, Q;
var i;
var countIndex; countIndex = 0;
if (aValue.compare(Clipperz.Crypto.ECC.BinaryField.WordArrayValue.O) > 0) {
k = aValue;
Q = aPoint;
} else {
MochiKit.Logging.logError("The Clipperz.Crypto.ECC.BinaryFields.Value does not work with negative values!!!!");
k = aValue.negate();
Q = this.negate(aPoint);
}
//console.log("k: " + k.toString(16));
//console.log("k.bitSize: " + k.bitSize());
for (i=k.bitSize()-1; i>=0; i--) {
result = this.add(result, result);
if (k.isBitSet(i)) {
result = this.add(result, Q);
}
// if (countIndex==100) {console.log("multiply.break"); break;} else countIndex++;
}
}
console.profileEnd();
return result;
},
//-----------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//#############################################################################
//#############################################################################
/ *
Clipperz.Crypto.ECC.Key = function(args) {
args = args || {};
return this;
}
Clipperz.Crypto.ECC.Key.prototype = MochiKit.Base.update(null, {
'asString': function() {
return "Clipperz.Crypto.ECC.Key";
},
//-----------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
* /
//#############################################################################
//#############################################################################
Clipperz.Crypto.ECC.StandardCurves = {};
MochiKit.Base.update(Clipperz.Crypto.ECC.StandardCurves, {
/ *
'_K571': null,
'K571': function() {
if (Clipperz.Crypto.ECC.StandardCurves._K571 == null) {
Clipperz.Crypto.ECC.StandardCurves._K571 = new Clipperz.Crypto.ECC.Curve.Koblitz({
exadecimalForm: '80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425',
a: new Clipperz.Crypto.BigInt(0),
G: new Clipperz.Crypto.ECC.Point({
x: new Clipperz.Crypto.BigInt('26eb7a859923fbc82189631f8103fe4ac9ca2970012d5d46024804801841ca44370958493b205e647da304db4ceb08cbbd1ba39494776fb988b47174dca88c7e2945283a01c8972', 16),
y: new Clipperz.Crypto.BigInt('349dc807f4fbf374f4aeade3bca95314dd58cec9f307a54ffc61efc006d8a2c9d4979c0ac44aea74fbebbb9f772aedcb620b01a7ba7af1b320430c8591984f601cd4c143ef1c7a3', 16)
}),
n: new Clipperz.Crypto.BigInt('1932268761508629172347675945465993672149463664853217499328617625725759571144780212268133978522706711834706712800825351461273674974066617311929682421617092503555733685276673', 16),
h: new Clipperz.Crypto.BigInt(4)
});
}
return Clipperz.Crypto.ECC.StandardCurves._K571;
},
* /
//-----------------------------------------------------------------------------
'_B571': null,
'B571': function() { // f(z) = z^571 + z^10 + z^5 + z^2 + 1
if (Clipperz.Crypto.ECC.StandardCurves._B571 == null) {
Clipperz.Crypto.ECC.StandardCurves._B571 = new Clipperz.Crypto.ECC.BinaryField.Curve({
modulus: new Clipperz.Crypto.ECC.BinaryField.Value('80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425', 16),
a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
b: new Clipperz.Crypto.ECC.BinaryField.Value('02f40e7e2221f295de297117b7f3d62f5c6a97ffcb8ceff1cd6ba8ce4a9a18ad84ffabbd8efa59332be7ad6756a66e294afd185a78ff12aa520e4de739baca0c7ffeff7f2955727a', 16),
G: new Clipperz.Crypto.ECC.BinaryField.Point({
x: new Clipperz.Crypto.ECC.BinaryField.Value('0303001d34b856296c16c0d40d3cd7750a93d1d2955fa80aa5f40fc8db7b2abdbde53950f4c0d293cdd711a35b67fb1499ae60038614f1394abfa3b4c850d927e1e7769c8eec2d19', 16),
y: new Clipperz.Crypto.ECC.BinaryField.Value('037bf27342da639b6dccfffeb73d69d78c6c27a6009cbbca1980f8533921e8a684423e43bab08a576291af8f461bb2a8b3531d2f0485c19b16e2f1516e23dd3c1a4827af1b8ac15b', 16)
}),
// r: new Clipperz.Crypto.ECC.BinaryField.Value('3864537523017258344695351890931987344298927329706434998657235251451519142289560424536143999389415773083133881121926944486246872462816813070234528288303332411393191105285703', 10),
r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16),
h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16)
// S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10),
// n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16),
});
//-----------------------------------------------------------------------------
//
// Guide to Elliptic Curve Cryptography
// Darrel Hankerson, Alfred Menezes, Scott Vanstone
// - Pag: 56, Alorithm 2.45 (with a typo!!!)
//
//-----------------------------------------------------------------------------
//
// http://www.milw0rm.com/papers/136
//
// -------------------------------------------------------------------------
// Polynomial Reduction Algorithm Modulo f571
// -------------------------------------------------------------------------
//
// Input: Polynomial p(x) of degree 1140 or less, stored as
// an array of 2T machinewords.
// Output: p(x) mod f571(x)
//
// FOR i = T-1, ..., 0 DO
// SET X := P[i+T]
// P[i] := P[i] ^ (X<<5) ^ (X<<7) ^ (X<<10) ^ (X<<15)
// P[i+1] := P[i+1] ^ (X>>17) ^ (X>>22) ^ (X>>25) ^ (X>>27)
//
// SET X := P[T-1] >> 27
// P[0] := P[0] ^ X ^ (X<<2) ^ (X<<5) ^ (X<<10)
// P[T-1] := P[T-1] & 0x07ffffff
//
// RETURN P[T-1],...,P[0]
//
// -------------------------------------------------------------------------
//
Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module = function(aValue) {
var result;
var C, T;
var i;
//console.log(">>> binaryField.finiteField.(improved)module");
// C = aValue.value().slice(0);
C = aValue._value.slice(0);
for (i=35; i>=18; i--) {
T = C[i];
C[i-18] = (((C[i-18] ^ (T<<5) ^ (T<<7) ^ (T<<10) ^ (T<<15)) & 0xffffffff) >>> 0);
C[i-17] = ((C[i-17] ^ (T>>>27) ^ (T>>>25) ^ (T>>>22) ^ (T>>>17)) >>> 0);
}
T = (C[17] >>> 27);
C[0] = ((C[0] ^ T ^ ((T<<2) ^ (T<<5) ^ (T<<10)) & 0xffffffff) >>> 0);
C[17] = (C[17] & 0x07ffffff);
for(i=18; i<=35; i++) {
C[i] = 0;
}
result = new Clipperz.Crypto.ECC.BinaryField.WordArrayValue(C);
//console.log("<<< binaryField.finiteField.(improved)module");
return result;
};
}
return Clipperz.Crypto.ECC.StandardCurves._B571;
},
//-----------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//#############################################################################
*/

View File

@@ -0,0 +1,461 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
}
if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; }
Clipperz.Crypto.ECC.BinaryField.Curve = function(args) {
args = args || {};
this._modulus = args.modulus;
this._a = args.a;
this._b = args.b;
this._G = args.G;
this._r = args.r;
this._h = args.h;
this._finiteField = null;
return this;
}
Clipperz.Crypto.ECC.BinaryField.Curve.prototype = MochiKit.Base.update(null, {
'asString': function() {
return "Clipperz.Crypto.ECC.BinaryField.Curve";
},
//-----------------------------------------------------------------------------
'modulus': function() {
return this._modulus;
},
'a': function() {
return this._a;
},
'b': function() {
return this._b;
},
'G': function() {
return this._G;
},
'r': function() {
return this._r;
},
'h': function() {
return this._h;
},
//-----------------------------------------------------------------------------
'finiteField': function() {
if (this._finiteField == null) {
this._finiteField = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:this.modulus()})
}
return this._finiteField;
},
//-----------------------------------------------------------------------------
'negate': function(aPointA) {
var result;
result = new Clipperz.Crypto.ECC.Point({x:aPointA.x(), y:this.finiteField().add(aPointA.y(), aPointA.x())})
return result;
},
//-----------------------------------------------------------------------------
'add': function(aPointA, aPointB) {
var result;
//console.log(">>> ECC.BinaryField.Curve.add");
if (aPointA.isZero()) {
//console.log("--- pointA == zero");
result = aPointB;
} else if (aPointB.isZero()) {
//console.log("--- pointB == zero");
result = aPointA;
} else if ( (aPointA.x().compare(aPointB.x()) == 0) && ((aPointA.y().compare(aPointB.y()) != 0) || aPointB.x().isZero())) {
//console.log("compare A.x - B.x: ", aPointA.x().compare(aPointB.x()));
//console.log("compare A.y - B.y: ", (aPointA.y().compare(aPointB.y()) != 0));
//console.log("compare B.x.isZero(): ", aPointB.x().isZero());
//console.log("--- result = zero");
result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
} else {
//console.log("--- result = ELSE");
var f2m;
var x, y;
var lambda;
var aX, aY, bX, bY;
aX = aPointA.x()._value;
aY = aPointA.y()._value;
bX = aPointB.x()._value;
bY = aPointB.y()._value;
f2m = this.finiteField();
if (aPointA.x().compare(aPointB.x()) != 0) {
//console.log(" a.x != b.x");
lambda = f2m._fastMultiply(
f2m._add(aY, bY),
f2m._inverse(f2m._add(aX, bX))
);
x = f2m._add(this.a()._value, f2m._square(lambda));
f2m._overwriteAdd(x, lambda);
f2m._overwriteAdd(x, aX);
f2m._overwriteAdd(x, bX);
} else {
//console.log(" a.x == b.x");
lambda = f2m._add(bX, f2m._fastMultiply(bY, f2m._inverse(bX)));
//console.log(" lambda: " + lambda.asString(16));
x = f2m._add(this.a()._value, f2m._square(lambda));
//console.log(" x (step 1): " + x.asString(16));
f2m._overwriteAdd(x, lambda);
//console.log(" x (step 2): " + x.asString(16));
}
y = f2m._fastMultiply(f2m._add(bX, x), lambda);
//console.log(" y (step 1): " + y.asString(16));
f2m._overwriteAdd(y, x);
//console.log(" y (step 2): " + y.asString(16));
f2m._overwriteAdd(y, bY);
//console.log(" y (step 3): " + y.asString(16));
result = new Clipperz.Crypto.ECC.BinaryField.Point({x:new Clipperz.Crypto.ECC.BinaryField.Value(x), y:new Clipperz.Crypto.ECC.BinaryField.Value(y)})
}
//console.log("<<< ECC.BinaryField.Curve.add");
return result;
},
//-----------------------------------------------------------------------------
'overwriteAdd': function(aPointA, aPointB) {
if (aPointA.isZero()) {
// result = aPointB;
aPointA._x._value = aPointB._x._value;
aPointA._y._value = aPointB._y._value;
} else if (aPointB.isZero()) {
// result = aPointA;
} else if ( (aPointA.x().compare(aPointB.x()) == 0) && ((aPointA.y().compare(aPointB.y()) != 0) || aPointB.x().isZero())) {
// result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
aPointA._x = Clipperz.Crypto.ECC.BinaryField.Value.O;
aPointA._y = Clipperz.Crypto.ECC.BinaryField.Value.O;
} else {
var f2m;
var x, y;
var lambda;
var aX, aY, bX, bY;
aX = aPointA.x()._value;
aY = aPointA.y()._value;
bX = aPointB.x()._value;
bY = aPointB.y()._value;
f2m = this.finiteField();
if (aPointA.x().compare(aPointB.x()) != 0) {
//console.log(" a.x != b.x");
lambda = f2m._fastMultiply(
f2m._add(aY, bY),
f2m._inverse(f2m._add(aX, bX))
);
x = f2m._add(this.a()._value, f2m._square(lambda));
f2m._overwriteAdd(x, lambda);
f2m._overwriteAdd(x, aX);
f2m._overwriteAdd(x, bX);
} else {
//console.log(" a.x == b.x");
lambda = f2m._add(bX, f2m._fastMultiply(bY, f2m._inverse(bX)));
//console.log(" lambda: " + lambda.asString(16));
x = f2m._add(this.a()._value, f2m._square(lambda));
//console.log(" x (step 1): " + x.asString(16));
f2m._overwriteAdd(x, lambda);
//console.log(" x (step 2): " + x.asString(16));
}
y = f2m._fastMultiply(f2m._add(bX, x), lambda);
//console.log(" y (step 1): " + y.asString(16));
f2m._overwriteAdd(y, x);
//console.log(" y (step 2): " + y.asString(16));
f2m._overwriteAdd(y, bY);
//console.log(" y (step 3): " + y.asString(16));
// result = new Clipperz.Crypto.ECC.BinaryField.Point({x:new Clipperz.Crypto.ECC.BinaryField.Value(x), y:new Clipperz.Crypto.ECC.BinaryField.Value(y)})
aPointA._x._value = x;
aPointA._y._value = y;
}
//console.log("<<< ECC.BinaryField.Curve.add");
return result;
},
//-----------------------------------------------------------------------------
'multiply': function(aValue, aPoint) {
var result;
//console.profile();
result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
if (aValue.isZero() == false) {
var k, Q;
var i;
var countIndex; countIndex = 0;
if (aValue.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) > 0) {
k = aValue;
Q = aPoint;
} else {
MochiKit.Logging.logError("The Clipperz.Crypto.ECC.BinaryFields.Value does not work with negative values!!!!");
k = aValue.negate();
Q = this.negate(aPoint);
}
//console.log("k: " + k.toString(16));
//console.log("k.bitSize: " + k.bitSize());
for (i=k.bitSize()-1; i>=0; i--) {
result = this.add(result, result);
// this.overwriteAdd(result, result);
if (k.isBitSet(i)) {
result = this.add(result, Q);
// this.overwriteAdd(result, Q);
}
// if (countIndex==100) {console.log("multiply.break"); break;} else countIndex++;
}
}
//console.profileEnd();
return result;
},
//-----------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//#############################################################################
Clipperz.Crypto.ECC.StandardCurves = {};
MochiKit.Base.update(Clipperz.Crypto.ECC.StandardCurves, {
/*
'_K571': null,
'K571': function() {
if (Clipperz.Crypto.ECC.StandardCurves._K571 == null) {
Clipperz.Crypto.ECC.StandardCurves._K571 = new Clipperz.Crypto.ECC.Curve.Koblitz({
exadecimalForm: '80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425',
a: new Clipperz.Crypto.BigInt(0),
G: new Clipperz.Crypto.ECC.Point({
x: new Clipperz.Crypto.BigInt('26eb7a859923fbc82189631f8103fe4ac9ca2970012d5d46024804801841ca44370958493b205e647da304db4ceb08cbbd1ba39494776fb988b47174dca88c7e2945283a01c8972', 16),
y: new Clipperz.Crypto.BigInt('349dc807f4fbf374f4aeade3bca95314dd58cec9f307a54ffc61efc006d8a2c9d4979c0ac44aea74fbebbb9f772aedcb620b01a7ba7af1b320430c8591984f601cd4c143ef1c7a3', 16)
}),
n: new Clipperz.Crypto.BigInt('1932268761508629172347675945465993672149463664853217499328617625725759571144780212268133978522706711834706712800825351461273674974066617311929682421617092503555733685276673', 16),
h: new Clipperz.Crypto.BigInt(4)
});
}
return Clipperz.Crypto.ECC.StandardCurves._K571;
},
*/
//-----------------------------------------------------------------------------
'_B571': null,
'B571': function() { // f(z) = z^571 + z^10 + z^5 + z^2 + 1
if (Clipperz.Crypto.ECC.StandardCurves._B571 == null) {
Clipperz.Crypto.ECC.StandardCurves._B571 = new Clipperz.Crypto.ECC.BinaryField.Curve({
modulus: new Clipperz.Crypto.ECC.BinaryField.Value('80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425', 16),
a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
b: new Clipperz.Crypto.ECC.BinaryField.Value('02f40e7e2221f295de297117b7f3d62f5c6a97ffcb8ceff1cd6ba8ce4a9a18ad84ffabbd8efa59332be7ad6756a66e294afd185a78ff12aa520e4de739baca0c7ffeff7f2955727a', 16),
G: new Clipperz.Crypto.ECC.BinaryField.Point({
x: new Clipperz.Crypto.ECC.BinaryField.Value('0303001d 34b85629 6c16c0d4 0d3cd775 0a93d1d2 955fa80a a5f40fc8 db7b2abd bde53950 f4c0d293 cdd711a3 5b67fb14 99ae6003 8614f139 4abfa3b4 c850d927 e1e7769c 8eec2d19', 16),
y: new Clipperz.Crypto.ECC.BinaryField.Value('037bf273 42da639b 6dccfffe b73d69d7 8c6c27a6 009cbbca 1980f853 3921e8a6 84423e43 bab08a57 6291af8f 461bb2a8 b3531d2f 0485c19b 16e2f151 6e23dd3c 1a4827af 1b8ac15b', 16)
}),
r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff e661ce18 ff559873 08059b18 6823851e c7dd9ca1 161de93d 5174d66e 8382e9bb 2fe84e47', 16),
h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16)
// S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10),
// n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16),
});
//-----------------------------------------------------------------------------
//
// Guide to Elliptic Curve Cryptography
// Darrel Hankerson, Alfred Menezes, Scott Vanstone
// - Pag: 56, Alorithm 2.45 (with a typo!!!)
//
//-----------------------------------------------------------------------------
//
// http://www.milw0rm.com/papers/136
//
// -------------------------------------------------------------------------
// Polynomial Reduction Algorithm Modulo f571
// -------------------------------------------------------------------------
//
// Input: Polynomial p(x) of degree 1140 or less, stored as
// an array of 2T machinewords.
// Output: p(x) mod f571(x)
//
// FOR i = T-1, ..., 0 DO
// SET X := P[i+T]
// P[i] := P[i] ^ (X<<5) ^ (X<<7) ^ (X<<10) ^ (X<<15)
// P[i+1] := P[i+1] ^ (X>>17) ^ (X>>22) ^ (X>>25) ^ (X>>27)
//
// SET X := P[T-1] >> 27
// P[0] := P[0] ^ X ^ (X<<2) ^ (X<<5) ^ (X<<10)
// P[T-1] := P[T-1] & 0x07ffffff
//
// RETURN P[T-1],...,P[0]
//
// -------------------------------------------------------------------------
//
Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module;
Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module = function(aValue) {
var result;
if (aValue.bitSize() > 1140) {
MochiKit.Logging.logWarning("ECC.StandarCurves.B571.finiteField().module: falling back to default implementation");
result = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule(aValue);
} else {
var C, T;
var i;
//console.log(">>> binaryField.finiteField.(improved)module");
// C = aValue.value().slice(0);
C = aValue._value.slice(0);
for (i=35; i>=18; i--) {
T = C[i];
C[i-18] = (((C[i-18] ^ (T<<5) ^ (T<<7) ^ (T<<10) ^ (T<<15)) & 0xffffffff) >>> 0);
C[i-17] = ((C[i-17] ^ (T>>>27) ^ (T>>>25) ^ (T>>>22) ^ (T>>>17)) >>> 0);
}
T = (C[17] >>> 27);
C[0] = ((C[0] ^ T ^ ((T<<2) ^ (T<<5) ^ (T<<10)) & 0xffffffff) >>> 0);
C[17] = (C[17] & 0x07ffffff);
for(i=18; i<=35; i++) {
C[i] = 0;
}
result = new Clipperz.Crypto.ECC.BinaryField.Value(C);
//console.log("<<< binaryField.finiteField.(improved)module");
}
return result;
};
}
return Clipperz.Crypto.ECC.StandardCurves._B571;
},
//-----------------------------------------------------------------------------
'_B283': null,
'B283': function() { // f(z) = z^283 + z^12 + z^7 + z^5 + 1
if (Clipperz.Crypto.ECC.StandardCurves._B283 == null) {
Clipperz.Crypto.ECC.StandardCurves._B283 = new Clipperz.Crypto.ECC.BinaryField.Curve({
// modulus: new Clipperz.Crypto.ECC.BinaryField.Value('10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
b: new Clipperz.Crypto.ECC.BinaryField.Value('027b680a c8b8596d a5a4af8a 19a0303f ca97fd76 45309fa2 a581485a f6263e31 3b79a2f5', 16),
G: new Clipperz.Crypto.ECC.BinaryField.Point({
x: new Clipperz.Crypto.ECC.BinaryField.Value('05f93925 8db7dd90 e1934f8c 70b0dfec 2eed25b8 557eac9c 80e2e198 f8cdbecd 86b12053', 16),
y: new Clipperz.Crypto.ECC.BinaryField.Value('03676854 fe24141c b98fe6d4 b20d02b4 516ff702 350eddb0 826779c8 13f0df45 be8112f4', 16)
}),
r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffef90 399660fc 938a9016 5b042a7c efadb307', 16),
h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16)
// S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10),
// n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16),
});
//-----------------------------------------------------------------------------
//
// Guide to Elliptic Curve Cryptography
// Darrel Hankerson, Alfred Menezes, Scott Vanstone
// - Pag: 56, Alorithm 2.43
//
//-----------------------------------------------------------------------------
Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module;
Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module = function(aValue) {
var result;
if (aValue.bitSize() > 564) {
MochiKit.Logging.logWarning("ECC.StandarCurves.B283.finiteField().module: falling back to default implementation");
result = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule(aValue);
} else {
var C, T;
var i;
//console.log(">>> binaryField.finiteField.(improved)module");
C = aValue._value.slice(0);
for (i=17; i>=9; i--) {
T = C[i];
C[i-9] = (((C[i-9] ^ (T<<5) ^ (T<<10) ^ (T<<12) ^ (T<<17)) & 0xffffffff) >>> 0);
C[i-8] = ((C[i-8] ^ (T>>>27) ^ (T>>>22) ^ (T>>>20) ^ (T>>>15)) >>> 0);
}
T = (C[8] >>> 27);
C[0] = ((C[0] ^ T ^ ((T<<5) ^ (T<<7) ^ (T<<12)) & 0xffffffff) >>> 0);
C[8] = (C[8] & 0x07ffffff);
for(i=9; i<=17; i++) {
C[i] = 0;
}
result = new Clipperz.Crypto.ECC.BinaryField.Value(C);
//console.log("<<< binaryField.finiteField.(improved)module");
}
return result;
};
}
return Clipperz.Crypto.ECC.StandardCurves._B283;
},
//-----------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//#############################################################################

View File

@@ -0,0 +1,526 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
}
if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; }
Clipperz.Crypto.ECC.BinaryField.FiniteField = function(args) {
args = args || {};
this._modulus = args.modulus;
return this;
}
Clipperz.Crypto.ECC.BinaryField.FiniteField.prototype = MochiKit.Base.update(null, {
'asString': function() {
return "Clipperz.Crypto.ECC.BinaryField.FiniteField (" + this.modulus().asString() + ")";
},
//-----------------------------------------------------------------------------
'modulus': function() {
return this._modulus;
},
//-----------------------------------------------------------------------------
'_module': function(aValue) {
var result;
var modulusComparison;
//console.log(">>> binaryField.finiteField.(standard)module");
modulusComparison = Clipperz.Crypto.ECC.BinaryField.Value._compare(aValue, this.modulus()._value);
if (modulusComparison < 0) {
result = aValue;
} else if (modulusComparison == 0) {
result = [0];
} else {
var modulusBitSize;
var resultBitSize;
result = aValue;
modulusBitSize = this.modulus().bitSize();
resultBitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(result);
while (resultBitSize >= modulusBitSize) {
Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(this.modulus()._value, resultBitSize - modulusBitSize));
resultBitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(result);
}
}
//console.log("<<< binaryField.finiteField.(standard)module");
return result;
},
'module': function(aValue) {
return new Clipperz.Crypto.ECC.BinaryField.Value(this._module(aValue._value.slice(0)));
},
//-----------------------------------------------------------------------------
'_add': function(a, b) {
return Clipperz.Crypto.ECC.BinaryField.Value._xor(a, b);
},
'_overwriteAdd': function(a, b) {
Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(a, b);
},
'add': function(a, b) {
return new Clipperz.Crypto.ECC.BinaryField.Value(this._add(a._value, b._value));
},
//-----------------------------------------------------------------------------
'negate': function(aValue) {
return aValue.clone();
},
//-----------------------------------------------------------------------------
'_multiply': function(a, b) {
var result;
var valueToXor;
var i,c;
result = [0];
valueToXor = b;
c = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(a);
for (i=0; i<c; i++) {
if (Clipperz.Crypto.ECC.BinaryField.Value._isBitSet(a, i) === true) {
Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, valueToXor);
}
valueToXor = Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft(valueToXor, 1);
}
result = this._module(result);
return result;
},
'multiply': function(a, b) {
return new Clipperz.Crypto.ECC.BinaryField.Value(this._multiply(a._value, b._value));
},
//-----------------------------------------------------------------------------
'_fastMultiply': function(a, b) {
var result;
var B;
var i,c;
result = [0];
B = b.slice(0); // Is this array copy avoidable?
c = 32;
for (i=0; i<c; i++) {
var ii, cc;
cc = a.length;
for (ii=0; ii<cc; ii++) {
if (((a[ii] >>> i) & 0x01) == 1) {
Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, B, ii);
}
}
if (i < (c-1)) {
B = Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft(B, 1);
}
}
result = this._module(result);
return result;
},
'fastMultiply': function(a, b) {
return new Clipperz.Crypto.ECC.BinaryField.Value(this._fastMultiply(a._value, b._value));
},
//-----------------------------------------------------------------------------
//
// Guide to Elliptic Curve Cryptography
// Darrel Hankerson, Alfred Menezes, Scott Vanstone
// - Pag: 49, Alorithm 2.34
//
//-----------------------------------------------------------------------------
'_square': function(aValue) {
var result;
var value;
var c,i;
var precomputedValues;
value = aValue;
result = new Array(value.length * 2);
precomputedValues = Clipperz.Crypto.ECC.BinaryField.FiniteField.squarePrecomputedBytes;
c = value.length;
for (i=0; i<c; i++) {
result[i*2] = precomputedValues[(value[i] & 0x000000ff)];
result[i*2] |= ((precomputedValues[(value[i] & 0x0000ff00) >>> 8]) << 16);
result[i*2 + 1] = precomputedValues[(value[i] & 0x00ff0000) >>> 16];
result[i*2 + 1] |= ((precomputedValues[(value[i] & 0xff000000) >>> 24]) << 16);
}
return this._module(result);
},
'square': function(aValue) {
return new Clipperz.Crypto.ECC.BinaryField.Value(this._square(aValue._value));
},
//-----------------------------------------------------------------------------
'_inverse': function(aValue) {
var result;
var b, c;
var u, v;
// b = Clipperz.Crypto.ECC.BinaryField.Value.I._value;
b = [1];
// c = Clipperz.Crypto.ECC.BinaryField.Value.O._value;
c = [0];
u = this._module(aValue);
v = this.modulus()._value.slice(0);
while (Clipperz.Crypto.ECC.BinaryField.Value._bitSize(u) > 1) {
var bitDifferenceSize;
bitDifferenceSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(u) - Clipperz.Crypto.ECC.BinaryField.Value._bitSize(v);
if (bitDifferenceSize < 0) {
var swap;
swap = u;
u = v;
v = swap;
swap = c;
c = b;
b = swap;
bitDifferenceSize = -bitDifferenceSize;
}
u = this._add(u, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(v, bitDifferenceSize));
b = this._add(b, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(c, bitDifferenceSize));
// this._overwriteAdd(u, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(v, bitDifferenceSize));
// this._overwriteAdd(b, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(c, bitDifferenceSize));
}
result = this._module(b);
return result;
},
'inverse': function(aValue) {
return new Clipperz.Crypto.ECC.BinaryField.Value(this._inverse(aValue._value));
},
//-----------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
Clipperz.Crypto.ECC.BinaryField.FiniteField.squarePrecomputedBytes = [
0x0000, // 0 = 0000 0000 -> 0000 0000 0000 0000
0x0001, // 1 = 0000 0001 -> 0000 0000 0000 0001
0x0004, // 2 = 0000 0010 -> 0000 0000 0000 0100
0x0005, // 3 = 0000 0011 -> 0000 0000 0000 0101
0x0010, // 4 = 0000 0100 -> 0000 0000 0001 0000
0x0011, // 5 = 0000 0101 -> 0000 0000 0001 0001
0x0014, // 6 = 0000 0110 -> 0000 0000 0001 0100
0x0015, // 7 = 0000 0111 -> 0000 0000 0001 0101
0x0040, // 8 = 0000 1000 -> 0000 0000 0100 0000
0x0041, // 9 = 0000 1001 -> 0000 0000 0100 0001
0x0044, // 10 = 0000 1010 -> 0000 0000 0100 0100
0x0045, // 11 = 0000 1011 -> 0000 0000 0100 0101
0x0050, // 12 = 0000 1100 -> 0000 0000 0101 0000
0x0051, // 13 = 0000 1101 -> 0000 0000 0101 0001
0x0054, // 14 = 0000 1110 -> 0000 0000 0101 0100
0x0055, // 15 = 0000 1111 -> 0000 0000 0101 0101
0x0100, // 16 = 0001 0000 -> 0000 0001 0000 0000
0x0101, // 17 = 0001 0001 -> 0000 0001 0000 0001
0x0104, // 18 = 0001 0010 -> 0000 0001 0000 0100
0x0105, // 19 = 0001 0011 -> 0000 0001 0000 0101
0x0110, // 20 = 0001 0100 -> 0000 0001 0001 0000
0x0111, // 21 = 0001 0101 -> 0000 0001 0001 0001
0x0114, // 22 = 0001 0110 -> 0000 0001 0001 0100
0x0115, // 23 = 0001 0111 -> 0000 0001 0001 0101
0x0140, // 24 = 0001 1000 -> 0000 0001 0100 0000
0x0141, // 25 = 0001 1001 -> 0000 0001 0100 0001
0x0144, // 26 = 0001 1010 -> 0000 0001 0100 0100
0x0145, // 27 = 0001 1011 -> 0000 0001 0100 0101
0x0150, // 28 = 0001 1100 -> 0000 0001 0101 0000
0x0151, // 28 = 0001 1101 -> 0000 0001 0101 0001
0x0154, // 30 = 0001 1110 -> 0000 0001 0101 0100
0x0155, // 31 = 0001 1111 -> 0000 0001 0101 0101
0x0400, // 32 = 0010 0000 -> 0000 0100 0000 0000
0x0401, // 33 = 0010 0001 -> 0000 0100 0000 0001
0x0404, // 34 = 0010 0010 -> 0000 0100 0000 0100
0x0405, // 35 = 0010 0011 -> 0000 0100 0000 0101
0x0410, // 36 = 0010 0100 -> 0000 0100 0001 0000
0x0411, // 37 = 0010 0101 -> 0000 0100 0001 0001
0x0414, // 38 = 0010 0110 -> 0000 0100 0001 0100
0x0415, // 39 = 0010 0111 -> 0000 0100 0001 0101
0x0440, // 40 = 0010 1000 -> 0000 0100 0100 0000
0x0441, // 41 = 0010 1001 -> 0000 0100 0100 0001
0x0444, // 42 = 0010 1010 -> 0000 0100 0100 0100
0x0445, // 43 = 0010 1011 -> 0000 0100 0100 0101
0x0450, // 44 = 0010 1100 -> 0000 0100 0101 0000
0x0451, // 45 = 0010 1101 -> 0000 0100 0101 0001
0x0454, // 46 = 0010 1110 -> 0000 0100 0101 0100
0x0455, // 47 = 0010 1111 -> 0000 0100 0101 0101
0x0500, // 48 = 0011 0000 -> 0000 0101 0000 0000
0x0501, // 49 = 0011 0001 -> 0000 0101 0000 0001
0x0504, // 50 = 0011 0010 -> 0000 0101 0000 0100
0x0505, // 51 = 0011 0011 -> 0000 0101 0000 0101
0x0510, // 52 = 0011 0100 -> 0000 0101 0001 0000
0x0511, // 53 = 0011 0101 -> 0000 0101 0001 0001
0x0514, // 54 = 0011 0110 -> 0000 0101 0001 0100
0x0515, // 55 = 0011 0111 -> 0000 0101 0001 0101
0x0540, // 56 = 0011 1000 -> 0000 0101 0100 0000
0x0541, // 57 = 0011 1001 -> 0000 0101 0100 0001
0x0544, // 58 = 0011 1010 -> 0000 0101 0100 0100
0x0545, // 59 = 0011 1011 -> 0000 0101 0100 0101
0x0550, // 60 = 0011 1100 -> 0000 0101 0101 0000
0x0551, // 61 = 0011 1101 -> 0000 0101 0101 0001
0x0554, // 62 = 0011 1110 -> 0000 0101 0101 0100
0x0555, // 63 = 0011 1111 -> 0000 0101 0101 0101
0x1000, // 64 = 0100 0000 -> 0001 0000 0000 0000
0x1001, // 65 = 0100 0001 -> 0001 0000 0000 0001
0x1004, // 66 = 0100 0010 -> 0001 0000 0000 0100
0x1005, // 67 = 0100 0011 -> 0001 0000 0000 0101
0x1010, // 68 = 0100 0100 -> 0001 0000 0001 0000
0x1011, // 69 = 0100 0101 -> 0001 0000 0001 0001
0x1014, // 70 = 0100 0110 -> 0001 0000 0001 0100
0x1015, // 71 = 0100 0111 -> 0001 0000 0001 0101
0x1040, // 72 = 0100 1000 -> 0001 0000 0100 0000
0x1041, // 73 = 0100 1001 -> 0001 0000 0100 0001
0x1044, // 74 = 0100 1010 -> 0001 0000 0100 0100
0x1045, // 75 = 0100 1011 -> 0001 0000 0100 0101
0x1050, // 76 = 0100 1100 -> 0001 0000 0101 0000
0x1051, // 77 = 0100 1101 -> 0001 0000 0101 0001
0x1054, // 78 = 0100 1110 -> 0001 0000 0101 0100
0x1055, // 79 = 0100 1111 -> 0001 0000 0101 0101
0x1100, // 80 = 0101 0000 -> 0001 0001 0000 0000
0x1101, // 81 = 0101 0001 -> 0001 0001 0000 0001
0x1104, // 82 = 0101 0010 -> 0001 0001 0000 0100
0x1105, // 83 = 0101 0011 -> 0001 0001 0000 0101
0x1110, // 84 = 0101 0100 -> 0001 0001 0001 0000
0x1111, // 85 = 0101 0101 -> 0001 0001 0001 0001
0x1114, // 86 = 0101 0110 -> 0001 0001 0001 0100
0x1115, // 87 = 0101 0111 -> 0001 0001 0001 0101
0x1140, // 88 = 0101 1000 -> 0001 0001 0100 0000
0x1141, // 89 = 0101 1001 -> 0001 0001 0100 0001
0x1144, // 90 = 0101 1010 -> 0001 0001 0100 0100
0x1145, // 91 = 0101 1011 -> 0001 0001 0100 0101
0x1150, // 92 = 0101 1100 -> 0001 0001 0101 0000
0x1151, // 93 = 0101 1101 -> 0001 0001 0101 0001
0x1154, // 94 = 0101 1110 -> 0001 0001 0101 0100
0x1155, // 95 = 0101 1111 -> 0001 0001 0101 0101
0x1400, // 96 = 0110 0000 -> 0001 0100 0000 0000
0x1401, // 97 = 0110 0001 -> 0001 0100 0000 0001
0x1404, // 98 = 0110 0010 -> 0001 0100 0000 0100
0x1405, // 99 = 0110 0011 -> 0001 0100 0000 0101
0x1410, // 100 = 0110 0100 -> 0001 0100 0001 0000
0x1411, // 101 = 0110 0101 -> 0001 0100 0001 0001
0x1414, // 102 = 0110 0110 -> 0001 0100 0001 0100
0x1415, // 103 = 0110 0111 -> 0001 0100 0001 0101
0x1440, // 104 = 0110 1000 -> 0001 0100 0100 0000
0x1441, // 105 = 0110 1001 -> 0001 0100 0100 0001
0x1444, // 106 = 0110 1010 -> 0001 0100 0100 0100
0x1445, // 107 = 0110 1011 -> 0001 0100 0100 0101
0x1450, // 108 = 0110 1100 -> 0001 0100 0101 0000
0x1451, // 109 = 0110 1101 -> 0001 0100 0101 0001
0x1454, // 110 = 0110 1110 -> 0001 0100 0101 0100
0x1455, // 111 = 0110 1111 -> 0001 0100 0101 0101
0x1500, // 112 = 0111 0000 -> 0001 0101 0000 0000
0x1501, // 113 = 0111 0001 -> 0001 0101 0000 0001
0x1504, // 114 = 0111 0010 -> 0001 0101 0000 0100
0x1505, // 115 = 0111 0011 -> 0001 0101 0000 0101
0x1510, // 116 = 0111 0100 -> 0001 0101 0001 0000
0x1511, // 117 = 0111 0101 -> 0001 0101 0001 0001
0x1514, // 118 = 0111 0110 -> 0001 0101 0001 0100
0x1515, // 119 = 0111 0111 -> 0001 0101 0001 0101
0x1540, // 120 = 0111 1000 -> 0001 0101 0100 0000
0x1541, // 121 = 0111 1001 -> 0001 0101 0100 0001
0x1544, // 122 = 0111 1010 -> 0001 0101 0100 0100
0x1545, // 123 = 0111 1011 -> 0001 0101 0100 0101
0x1550, // 124 = 0111 1100 -> 0001 0101 0101 0000
0x1551, // 125 = 0111 1101 -> 0001 0101 0101 0001
0x1554, // 126 = 0111 1110 -> 0001 0101 0101 0100
0x1555, // 127 = 0111 1111 -> 0001 0101 0101 0101
0x4000, // 128 = 1000 0000 -> 0100 0000 0000 0000
0x4001, // 129 = 1000 0001 -> 0100 0000 0000 0001
0x4004, // 130 = 1000 0010 -> 0100 0000 0000 0100
0x4005, // 131 = 1000 0011 -> 0100 0000 0000 0101
0x4010, // 132 = 1000 0100 -> 0100 0000 0001 0000
0x4011, // 133 = 1000 0101 -> 0100 0000 0001 0001
0x4014, // 134 = 1000 0110 -> 0100 0000 0001 0100
0x4015, // 135 = 1000 0111 -> 0100 0000 0001 0101
0x4040, // 136 = 1000 1000 -> 0100 0000 0100 0000
0x4041, // 137 = 1000 1001 -> 0100 0000 0100 0001
0x4044, // 138 = 1000 1010 -> 0100 0000 0100 0100
0x4045, // 139 = 1000 1011 -> 0100 0000 0100 0101
0x4050, // 140 = 1000 1100 -> 0100 0000 0101 0000
0x4051, // 141 = 1000 1101 -> 0100 0000 0101 0001
0x4054, // 142 = 1000 1110 -> 0100 0000 0101 0100
0x4055, // 143 = 1000 1111 -> 0100 0000 0101 0101
0x4100, // 144 = 1001 0000 -> 0100 0001 0000 0000
0x4101, // 145 = 1001 0001 -> 0100 0001 0000 0001
0x4104, // 146 = 1001 0010 -> 0100 0001 0000 0100
0x4105, // 147 = 1001 0011 -> 0100 0001 0000 0101
0x4110, // 148 = 1001 0100 -> 0100 0001 0001 0000
0x4111, // 149 = 1001 0101 -> 0100 0001 0001 0001
0x4114, // 150 = 1001 0110 -> 0100 0001 0001 0100
0x4115, // 151 = 1001 0111 -> 0100 0001 0001 0101
0x4140, // 152 = 1001 1000 -> 0100 0001 0100 0000
0x4141, // 153 = 1001 1001 -> 0100 0001 0100 0001
0x4144, // 154 = 1001 1010 -> 0100 0001 0100 0100
0x4145, // 155 = 1001 1011 -> 0100 0001 0100 0101
0x4150, // 156 = 1001 1100 -> 0100 0001 0101 0000
0x4151, // 157 = 1001 1101 -> 0100 0001 0101 0001
0x4154, // 158 = 1001 1110 -> 0100 0001 0101 0100
0x4155, // 159 = 1001 1111 -> 0100 0001 0101 0101
0x4400, // 160 = 1010 0000 -> 0100 0100 0000 0000
0x4401, // 161 = 1010 0001 -> 0100 0100 0000 0001
0x4404, // 162 = 1010 0010 -> 0100 0100 0000 0100
0x4405, // 163 = 1010 0011 -> 0100 0100 0000 0101
0x4410, // 164 = 1010 0100 -> 0100 0100 0001 0000
0x4411, // 165 = 1010 0101 -> 0100 0100 0001 0001
0x4414, // 166 = 1010 0110 -> 0100 0100 0001 0100
0x4415, // 167 = 1010 0111 -> 0100 0100 0001 0101
0x4440, // 168 = 1010 1000 -> 0100 0100 0100 0000
0x4441, // 169 = 1010 1001 -> 0100 0100 0100 0001
0x4444, // 170 = 1010 1010 -> 0100 0100 0100 0100
0x4445, // 171 = 1010 1011 -> 0100 0100 0100 0101
0x4450, // 172 = 1010 1100 -> 0100 0100 0101 0000
0x4451, // 173 = 1010 1101 -> 0100 0100 0101 0001
0x4454, // 174 = 1010 1110 -> 0100 0100 0101 0100
0x4455, // 175 = 1010 1111 -> 0100 0100 0101 0101
0x4500, // 176 = 1011 0000 -> 0100 0101 0000 0000
0x4501, // 177 = 1011 0001 -> 0100 0101 0000 0001
0x4504, // 178 = 1011 0010 -> 0100 0101 0000 0100
0x4505, // 179 = 1011 0011 -> 0100 0101 0000 0101
0x4510, // 180 = 1011 0100 -> 0100 0101 0001 0000
0x4511, // 181 = 1011 0101 -> 0100 0101 0001 0001
0x4514, // 182 = 1011 0110 -> 0100 0101 0001 0100
0x4515, // 183 = 1011 0111 -> 0100 0101 0001 0101
0x4540, // 184 = 1011 1000 -> 0100 0101 0100 0000
0x4541, // 185 = 1011 1001 -> 0100 0101 0100 0001
0x4544, // 186 = 1011 1010 -> 0100 0101 0100 0100
0x4545, // 187 = 1011 1011 -> 0100 0101 0100 0101
0x4550, // 188 = 1011 1100 -> 0100 0101 0101 0000
0x4551, // 189 = 1011 1101 -> 0100 0101 0101 0001
0x4554, // 190 = 1011 1110 -> 0100 0101 0101 0100
0x4555, // 191 = 1011 1111 -> 0100 0101 0101 0101
0x5000, // 192 = 1100 0000 -> 0101 0000 0000 0000
0x5001, // 193 = 1100 0001 -> 0101 0000 0000 0001
0x5004, // 194 = 1100 0010 -> 0101 0000 0000 0100
0x5005, // 195 = 1100 0011 -> 0101 0000 0000 0101
0x5010, // 196 = 1100 0100 -> 0101 0000 0001 0000
0x5011, // 197 = 1100 0101 -> 0101 0000 0001 0001
0x5014, // 198 = 1100 0110 -> 0101 0000 0001 0100
0x5015, // 199 = 1100 0111 -> 0101 0000 0001 0101
0x5040, // 200 = 1100 1000 -> 0101 0000 0100 0000
0x5041, // 201 = 1100 1001 -> 0101 0000 0100 0001
0x5044, // 202 = 1100 1010 -> 0101 0000 0100 0100
0x5045, // 203 = 1100 1011 -> 0101 0000 0100 0101
0x5050, // 204 = 1100 1100 -> 0101 0000 0101 0000
0x5051, // 205 = 1100 1101 -> 0101 0000 0101 0001
0x5054, // 206 = 1100 1110 -> 0101 0000 0101 0100
0x5055, // 207 = 1100 1111 -> 0101 0000 0101 0101
0x5100, // 208 = 1101 0000 -> 0101 0001 0000 0000
0x5101, // 209 = 1101 0001 -> 0101 0001 0000 0001
0x5104, // 210 = 1101 0010 -> 0101 0001 0000 0100
0x5105, // 211 = 1101 0011 -> 0101 0001 0000 0101
0x5110, // 212 = 1101 0100 -> 0101 0001 0001 0000
0x5111, // 213 = 1101 0101 -> 0101 0001 0001 0001
0x5114, // 214 = 1101 0110 -> 0101 0001 0001 0100
0x5115, // 215 = 1101 0111 -> 0101 0001 0001 0101
0x5140, // 216 = 1101 1000 -> 0101 0001 0100 0000
0x5141, // 217 = 1101 1001 -> 0101 0001 0100 0001
0x5144, // 218 = 1101 1010 -> 0101 0001 0100 0100
0x5145, // 219 = 1101 1011 -> 0101 0001 0100 0101
0x5150, // 220 = 1101 1100 -> 0101 0001 0101 0000
0x5151, // 221 = 1101 1101 -> 0101 0001 0101 0001
0x5154, // 222 = 1101 1110 -> 0101 0001 0101 0100
0x5155, // 223 = 1101 1111 -> 0101 0001 0101 0101
0x5400, // 224 = 1110 0000 -> 0101 0100 0000 0000
0x5401, // 225 = 1110 0001 -> 0101 0100 0000 0001
0x5404, // 226 = 1110 0010 -> 0101 0100 0000 0100
0x5405, // 227 = 1110 0011 -> 0101 0100 0000 0101
0x5410, // 228 = 1110 0100 -> 0101 0100 0001 0000
0x5411, // 229 = 1110 0101 -> 0101 0100 0001 0001
0x5414, // 230 = 1110 0110 -> 0101 0100 0001 0100
0x5415, // 231 = 1110 0111 -> 0101 0100 0001 0101
0x5440, // 232 = 1110 1000 -> 0101 0100 0100 0000
0x5441, // 233 = 1110 1001 -> 0101 0100 0100 0001
0x5444, // 234 = 1110 1010 -> 0101 0100 0100 0100
0x5445, // 235 = 1110 1011 -> 0101 0100 0100 0101
0x5450, // 236 = 1110 1100 -> 0101 0100 0101 0000
0x5451, // 237 = 1110 1101 -> 0101 0100 0101 0001
0x5454, // 238 = 1110 1110 -> 0101 0100 0101 0100
0x5455, // 239 = 1110 1111 -> 0101 0100 0101 0101
0x5500, // 240 = 1111 0000 -> 0101 0101 0000 0000
0x5501, // 241 = 1111 0001 -> 0101 0101 0000 0001
0x5504, // 242 = 1111 0010 -> 0101 0101 0000 0100
0x5505, // 243 = 1111 0011 -> 0101 0101 0000 0101
0x5510, // 244 = 1111 0100 -> 0101 0101 0001 0000
0x5511, // 245 = 1111 0101 -> 0101 0101 0001 0001
0x5514, // 246 = 1111 0110 -> 0101 0101 0001 0100
0x5515, // 247 = 1111 0111 -> 0101 0101 0001 0101
0x5540, // 248 = 1111 1000 -> 0101 0101 0100 0000
0x5541, // 249 = 1111 1001 -> 0101 0101 0100 0001
0x5544, // 250 = 1111 1010 -> 0101 0101 0100 0100
0x5545, // 251 = 1111 1011 -> 0101 0101 0100 0101
0x5550, // 252 = 1111 1100 -> 0101 0101 0101 0000
0x5551, // 253 = 1111 1101 -> 0101 0101 0101 0001
0x5554, // 254 = 1111 1110 -> 0101 0101 0101 0100
0x5555 // 255 = 1111 1111 -> 0101 0101 0101 0101
]

View File

@@ -0,0 +1,67 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
}
if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; }
Clipperz.Crypto.ECC.BinaryField.Point = function(args) {
args = args || {};
this._x = args.x;
this._y = args.y;
return this;
}
Clipperz.Crypto.ECC.BinaryField.Point.prototype = MochiKit.Base.update(null, {
'asString': function() {
return "Clipperz.Crypto.ECC.BinaryField.Point (" + this.x() + ", " + this.y() + ")";
},
//-----------------------------------------------------------------------------
'x': function() {
return this._x;
},
'y': function() {
return this._y;
},
//-----------------------------------------------------------------------------
'isZero': function() {
return (this.x().isZero() && this.y().isZero())
},
//-----------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,377 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
}
if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; }
Clipperz.Crypto.ECC.BinaryField.Value = function(aValue, aBase) {
if (aValue.constructor == String) {
var value;
var stringLength;
var numberOfWords;
var i,c;
if (aBase != 16) {
throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase;
}
value = aValue.replace(/ /g, '');
stringLength = value.length;
numberOfWords = Math.ceil(stringLength / 8);
this._value = new Array(numberOfWords);
c = numberOfWords;
for (i=0; i<c; i++) {
var word;
if (i < (c-1)) {
word = parseInt(value.substr(stringLength-((i+1)*8), 8), 16);
} else {
word = parseInt(value.substr(0, stringLength-(i*8)), 16);
}
this._value[i] = word;
}
} else if (aValue.constructor == Array) {
var itemsToCopy;
itemsToCopy = aValue.length;
while (aValue[itemsToCopy - 1] == 0) {
itemsToCopy --;
}
this._value = aValue.slice(0, itemsToCopy);
} else if (aValue.constructor == Number) {
this._value = [aValue];
} else {
// throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedConstructorValueType;
}
return this;
}
Clipperz.Crypto.ECC.BinaryField.Value.prototype = MochiKit.Base.update(null, {
'value': function() {
return this._value;
},
//-----------------------------------------------------------------------------
'wordSize': function() {
return this._value.length
},
//-----------------------------------------------------------------------------
'clone': function() {
return new Clipperz.Crypto.ECC.BinaryField.Value(this._value.slice(0));
},
//-----------------------------------------------------------------------------
'isZero': function() {
return (this.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) == 0);
},
//-----------------------------------------------------------------------------
'asString': function(aBase) {
var result;
var i,c;
if (aBase != 16) {
throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase;
}
result = "";
c = this.wordSize();
for (i=0; i<c; i++) {
var wordAsString;
// wordAsString = ("00000000" + this.value()[i].toString(16));
wordAsString = ("00000000" + this._value[i].toString(16));
wordAsString = wordAsString.substring(wordAsString.length - 8);
result = wordAsString + result;
}
result = result.replace(/^(00)*/, "");
if (result == "") {
result = "0";
}
return result;
},
//-----------------------------------------------------------------------------
'shiftLeft': function(aNumberOfBitsToShift) {
return new Clipperz.Crypto.ECC.BinaryField.Value(Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(this._value, aNumberOfBitsToShift));
},
//-----------------------------------------------------------------------------
'bitSize': function() {
return Clipperz.Crypto.ECC.BinaryField.Value._bitSize(this._value);
},
//-----------------------------------------------------------------------------
'isBitSet': function(aBitPosition) {
return Clipperz.Crypto.ECC.BinaryField.Value._isBitSet(this._value, aBitPosition);
},
//-----------------------------------------------------------------------------
'xor': function(aValue) {
return new Clipperz.Crypto.ECC.BinaryField.Value(Clipperz.Crypto.ECC.BinaryField.Value._xor(this._value, aValue._value));
},
//-----------------------------------------------------------------------------
'compare': function(aValue) {
return Clipperz.Crypto.ECC.BinaryField.Value._compare(this._value, aValue._value);
},
//-----------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
Clipperz.Crypto.ECC.BinaryField.Value.O = new Clipperz.Crypto.ECC.BinaryField.Value('0', 16);
Clipperz.Crypto.ECC.BinaryField.Value.I = new Clipperz.Crypto.ECC.BinaryField.Value('1', 16);
Clipperz.Crypto.ECC.BinaryField.Value._xor = function(a, b, aFirstItemOffset) {
var result;
var resultSize;
var i,c;
var firstItemOffset;
firstItemOffset = aFirstItemOffset || 0;
resultSize = Math.max((a.length - firstItemOffset), b.length) + firstItemOffset;
result = new Array(resultSize);
c = firstItemOffset;
for (i=0; i<c; i++) {
result[i] = a[i];
}
c = resultSize;
for (i=firstItemOffset; i<c; i++) {
result[i] = (((a[i] || 0) ^ (b[i - firstItemOffset] || 0)) >>> 0);
}
return result;
};
Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor = function(a, b, aFirstItemOffset) {
var i,c;
var firstItemOffset;
firstItemOffset = aFirstItemOffset || 0;
c = Math.max((a.length - firstItemOffset), b.length) + firstItemOffset;
for (i=firstItemOffset; i<c; i++) {
a[i] = (((a[i] || 0) ^ (b[i - firstItemOffset] || 0)) >>> 0);
}
};
Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft = function(aWordArray, aNumberOfBitsToShift) {
var numberOfWordsToShift;
var numberOfBitsToShift;
var result;
var overflowValue;
var i,c;
numberOfWordsToShift = Math.floor(aNumberOfBitsToShift / 32);
numberOfBitsToShift = aNumberOfBitsToShift % 32;
result = new Array(aWordArray.length + numberOfWordsToShift);
c = numberOfWordsToShift;
for (i=0; i<c; i++) {
result[i] = 0;
}
overflowValue = 0;
nextOverflowValue = 0;
c = aWordArray.length;
for (i=0; i<c; i++) {
var value;
var resultWord;
// value = this.value()[i];
value = aWordArray[i];
if (numberOfBitsToShift > 0) {
var nextOverflowValue;
nextOverflowValue = (value >>> (32 - numberOfBitsToShift));
value = value & (0xffffffff >>> numberOfBitsToShift);
resultWord = (((value << numberOfBitsToShift) | overflowValue) >>> 0);
} else {
resultWord = value;
}
result[i+numberOfWordsToShift] = resultWord;
overflowValue = nextOverflowValue;
}
if (overflowValue != 0) {
result[aWordArray.length + numberOfWordsToShift] = overflowValue;
}
return result;
};
Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft = function(aWordArray, aNumberOfBitsToShift) {
var numberOfWordsToShift;
var numberOfBitsToShift;
var result;
var overflowValue;
var i,c;
numberOfWordsToShift = Math.floor(aNumberOfBitsToShift / 32);
numberOfBitsToShift = aNumberOfBitsToShift % 32;
result = new Array(aWordArray.length + numberOfWordsToShift);
c = numberOfWordsToShift;
for (i=0; i<c; i++) {
result[i] = 0;
}
overflowValue = 0;
nextOverflowValue = 0;
c = aWordArray.length;
for (i=0; i<c; i++) {
var value;
var resultWord;
// value = this.value()[i];
value = aWordArray[i];
if (numberOfBitsToShift > 0) {
var nextOverflowValue;
nextOverflowValue = (value >>> (32 - numberOfBitsToShift));
value = value & (0xffffffff >>> numberOfBitsToShift);
resultWord = (((value << numberOfBitsToShift) | overflowValue) >>> 0);
} else {
resultWord = value;
}
result[i+numberOfWordsToShift] = resultWord;
overflowValue = nextOverflowValue;
}
if (overflowValue != 0) {
result[aWordArray.length + numberOfWordsToShift] = overflowValue;
}
return result;
};
Clipperz.Crypto.ECC.BinaryField.Value._bitSize = function(aWordArray) {
var result;
var notNullElements;
var mostValuableWord;
var matchingBitsInMostImportantWord;
var mask;
var i,c;
notNullElements = aWordArray.length;
if ((aWordArray.length == 1) && (aWordArray[0] == 0)) {
result = 0;
} else {
while((aWordArray[notNullElements - 1] == 0) && (notNullElements > 0)) {
notNullElements --;
}
result = (notNullElements - 1) * 32;
mostValuableWord = aWordArray[notNullElements - 1];
matchingBits = 32;
mask = 0x80000000;
while ((matchingBits > 0) && ((mostValuableWord & mask) == 0)) {
matchingBits --;
mask >>>= 1;
}
result += matchingBits;
}
return result;
};
Clipperz.Crypto.ECC.BinaryField.Value._isBitSet = function(aWordArray, aBitPosition) {
var result;
var byteIndex;
var bitIndexInSelectedByte;
byteIndex = Math.floor(aBitPosition / 32);
bitIndexInSelectedByte = aBitPosition % 32;
if (byteIndex <= aWordArray.length) {
result = ((aWordArray[byteIndex] & (1 << bitIndexInSelectedByte)) != 0);
} else {
result = false;
}
return result;
};
Clipperz.Crypto.ECC.BinaryField.Value._compare = function(a,b) {
var result;
var i,c;
result = MochiKit.Base.compare(a.length, b.length);
c = a.length;
for (i=0; (i<c) && (result==0); i++) {
//console.log("compare[" + c + " - " + i + " - 1] " + this.value()[c-i-1] + ", " + aValue.value()[c-i-1]);
// result = MochiKit.Base.compare(this.value()[c-i-1], aValue.value()[c-i-1]);
result = MochiKit.Base.compare(a[c-i-1], b[c-i-1]);
}
return result;
};
Clipperz.Crypto.ECC.BinaryField.Value['exception']= {
'UnsupportedBase': new MochiKit.Base.NamedError("Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase"),
'UnsupportedConstructorValueType': new MochiKit.Base.NamedError("Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedConstructorValueType")
};

View File

@@ -0,0 +1,854 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!";
}
try { if (typeof(Clipperz.Crypto.SHA) == 'undefined') { throw ""; }} catch (e) {
throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.SHA!";
}
try { if (typeof(Clipperz.Crypto.AES) == 'undefined') { throw ""; }} catch (e) {
throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.AES!";
}
if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { Clipperz.Crypto.PRNG = {}; }
//#############################################################################
Clipperz.Crypto.PRNG.EntropyAccumulator = function(args) {
args = args || {};
// MochiKit.Base.bindMethods(this);
this._stack = new Clipperz.ByteArray();
this._maxStackLengthBeforeHashing = args.maxStackLengthBeforeHashing || 256;
return this;
}
Clipperz.Crypto.PRNG.EntropyAccumulator.prototype = MochiKit.Base.update(null, {
'toString': function() {
return "Clipperz.Crypto.PRNG.EntropyAccumulator";
},
//-------------------------------------------------------------------------
'stack': function() {
return this._stack;
},
'setStack': function(aValue) {
this._stack = aValue;
},
'resetStack': function() {
this.stack().reset();
},
'maxStackLengthBeforeHashing': function() {
return this._maxStackLengthBeforeHashing;
},
//-------------------------------------------------------------------------
'addRandomByte': function(aValue) {
this.stack().appendByte(aValue);
if (this.stack().length() > this.maxStackLengthBeforeHashing()) {
this.setStack(Clipperz.Crypto.SHA.sha_d256(this.stack()));
}
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//#############################################################################
Clipperz.Crypto.PRNG.RandomnessSource = function(args) {
args = args || {};
MochiKit.Base.bindMethods(this);
this._generator = args.generator || null;
this._sourceId = args.sourceId || null;
this._boostMode = args.boostMode || false;
this._nextPoolIndex = 0;
return this;
}
Clipperz.Crypto.PRNG.RandomnessSource.prototype = MochiKit.Base.update(null, {
'generator': function() {
return this._generator;
},
'setGenerator': function(aValue) {
this._generator = aValue;
},
//-------------------------------------------------------------------------
'boostMode': function() {
return this._boostMode;
},
'setBoostMode': function(aValue) {
this._boostMode = aValue;
},
//-------------------------------------------------------------------------
'sourceId': function() {
return this._sourceId;
},
'setSourceId': function(aValue) {
this._sourceId = aValue;
},
//-------------------------------------------------------------------------
'nextPoolIndex': function() {
return this._nextPoolIndex;
},
'incrementNextPoolIndex': function() {
this._nextPoolIndex = ((this._nextPoolIndex + 1) % this.generator().numberOfEntropyAccumulators());
},
//-------------------------------------------------------------------------
'updateGeneratorWithValue': function(aRandomValue) {
if (this.generator() != null) {
this.generator().addRandomByte(this.sourceId(), this.nextPoolIndex(), aRandomValue);
this.incrementNextPoolIndex();
}
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//#############################################################################
Clipperz.Crypto.PRNG.TimeRandomnessSource = function(args) {
args = args || {};
// MochiKit.Base.bindMethods(this);
this._intervalTime = args.intervalTime || 1000;
Clipperz.Crypto.PRNG.RandomnessSource.call(this, args);
this.collectEntropy();
return this;
}
Clipperz.Crypto.PRNG.TimeRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, {
'intervalTime': function() {
return this._intervalTime;
},
//-------------------------------------------------------------------------
'collectEntropy': function() {
var now;
var entropyByte;
var intervalTime;
now = new Date();
entropyByte = (now.getTime() & 0xff);
intervalTime = this.intervalTime();
if (this.boostMode() == true) {
intervalTime = intervalTime / 9;
}
this.updateGeneratorWithValue(entropyByte);
setTimeout(this.collectEntropy, intervalTime);
},
//-------------------------------------------------------------------------
'numberOfRandomBits': function() {
return 5;
},
//-------------------------------------------------------------------------
'pollingFrequency': function() {
return 10;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//*****************************************************************************
Clipperz.Crypto.PRNG.MouseRandomnessSource = function(args) {
args = args || {};
Clipperz.Crypto.PRNG.RandomnessSource.call(this, args);
this._numberOfBitsToCollectAtEachEvent = 4;
this._randomBitsCollector = 0;
this._numberOfRandomBitsCollected = 0;
MochiKit.Signal.connect(document, 'onmousemove', this, 'collectEntropy');
return this;
}
Clipperz.Crypto.PRNG.MouseRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, {
//-------------------------------------------------------------------------
'numberOfBitsToCollectAtEachEvent': function() {
return this._numberOfBitsToCollectAtEachEvent;
},
//-------------------------------------------------------------------------
'randomBitsCollector': function() {
return this._randomBitsCollector;
},
'setRandomBitsCollector': function(aValue) {
this._randomBitsCollector = aValue;
},
'appendRandomBitsToRandomBitsCollector': function(aValue) {
var collectedBits;
var numberOfRandomBitsCollected;
numberOfRandomBitsCollected = this.numberOfRandomBitsCollected();
collectetBits = this.randomBitsCollector() | (aValue << numberOfRandomBitsCollected);
this.setRandomBitsCollector(collectetBits);
numberOfRandomBitsCollected += this.numberOfBitsToCollectAtEachEvent();
if (numberOfRandomBitsCollected == 8) {
this.updateGeneratorWithValue(collectetBits);
numberOfRandomBitsCollected = 0;
this.setRandomBitsCollector(0);
}
this.setNumberOfRandomBitsCollected(numberOfRandomBitsCollected)
},
//-------------------------------------------------------------------------
'numberOfRandomBitsCollected': function() {
return this._numberOfRandomBitsCollected;
},
'setNumberOfRandomBitsCollected': function(aValue) {
this._numberOfRandomBitsCollected = aValue;
},
//-------------------------------------------------------------------------
'collectEntropy': function(anEvent) {
var mouseLocation;
var randomBit;
var mask;
mask = 0xffffffff >>> (32 - this.numberOfBitsToCollectAtEachEvent());
mouseLocation = anEvent.mouse().client;
randomBit = ((mouseLocation.x ^ mouseLocation.y) & mask);
this.appendRandomBitsToRandomBitsCollector(randomBit)
},
//-------------------------------------------------------------------------
'numberOfRandomBits': function() {
return 1;
},
//-------------------------------------------------------------------------
'pollingFrequency': function() {
return 10;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//*****************************************************************************
Clipperz.Crypto.PRNG.KeyboardRandomnessSource = function(args) {
args = args || {};
Clipperz.Crypto.PRNG.RandomnessSource.call(this, args);
this._randomBitsCollector = 0;
this._numberOfRandomBitsCollected = 0;
MochiKit.Signal.connect(document, 'onkeypress', this, 'collectEntropy');
return this;
}
Clipperz.Crypto.PRNG.KeyboardRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, {
//-------------------------------------------------------------------------
'randomBitsCollector': function() {
return this._randomBitsCollector;
},
'setRandomBitsCollector': function(aValue) {
this._randomBitsCollector = aValue;
},
'appendRandomBitToRandomBitsCollector': function(aValue) {
var collectedBits;
var numberOfRandomBitsCollected;
numberOfRandomBitsCollected = this.numberOfRandomBitsCollected();
collectetBits = this.randomBitsCollector() | (aValue << numberOfRandomBitsCollected);
this.setRandomBitsCollector(collectetBits);
numberOfRandomBitsCollected ++;
if (numberOfRandomBitsCollected == 8) {
this.updateGeneratorWithValue(collectetBits);
numberOfRandomBitsCollected = 0;
this.setRandomBitsCollector(0);
}
this.setNumberOfRandomBitsCollected(numberOfRandomBitsCollected)
},
//-------------------------------------------------------------------------
'numberOfRandomBitsCollected': function() {
return this._numberOfRandomBitsCollected;
},
'setNumberOfRandomBitsCollected': function(aValue) {
this._numberOfRandomBitsCollected = aValue;
},
//-------------------------------------------------------------------------
'collectEntropy': function(anEvent) {
/*
var mouseLocation;
var randomBit;
mouseLocation = anEvent.mouse().client;
randomBit = ((mouseLocation.x ^ mouseLocation.y) & 0x1);
this.appendRandomBitToRandomBitsCollector(randomBit);
*/
},
//-------------------------------------------------------------------------
'numberOfRandomBits': function() {
return 1;
},
//-------------------------------------------------------------------------
'pollingFrequency': function() {
return 10;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//#############################################################################
Clipperz.Crypto.PRNG.Fortuna = function(args) {
var i,c;
args = args || {};
this._key = args.seed || null;
if (this._key == null) {
this._counter = 0;
this._key = new Clipperz.ByteArray();
} else {
this._counter = 1;
}
this._aesKey = null;
this._firstPoolReseedLevel = args.firstPoolReseedLevel || 32 || 64;
this._numberOfEntropyAccumulators = args.numberOfEntropyAccumulators || 32;
this._accumulators = [];
c = this.numberOfEntropyAccumulators();
for (i=0; i<c; i++) {
this._accumulators.push(new Clipperz.Crypto.PRNG.EntropyAccumulator());
}
this._randomnessSources = [];
this._reseedCounter = 0;
return this;
}
Clipperz.Crypto.PRNG.Fortuna.prototype = MochiKit.Base.update(null, {
'toString': function() {
return "Clipperz.Crypto.PRNG.Fortuna";
},
//-------------------------------------------------------------------------
'key': function() {
return this._key;
},
'setKey': function(aValue) {
this._key = aValue;
this._aesKey = null;
},
'aesKey': function() {
if (this._aesKey == null) {
this._aesKey = new Clipperz.Crypto.AES.Key({key:this.key()});
}
return this._aesKey;
},
'accumulators': function() {
return this._accumulators;
},
'firstPoolReseedLevel': function() {
return this._firstPoolReseedLevel;
},
//-------------------------------------------------------------------------
'reseedCounter': function() {
return this._reseedCounter;
},
'incrementReseedCounter': function() {
this._reseedCounter = this._reseedCounter +1;
},
//-------------------------------------------------------------------------
'reseed': function() {
var newKeySeed;
var reseedCounter;
var reseedCounterMask;
var i, c;
newKeySeed = this.key();
this.incrementReseedCounter();
reseedCounter = this.reseedCounter();
c = this.numberOfEntropyAccumulators();
reseedCounterMask = 0xffffffff >>> (32 - c);
for (i=0; i<c; i++) {
if ((i == 0) || ((reseedCounter & (reseedCounterMask >>> (c - i))) == 0)) {
newKeySeed.appendBlock(this.accumulators()[i].stack());
this.accumulators()[i].resetStack();
}
}
if (reseedCounter == 1) {
c = this.randomnessSources().length;
for (i=0; i<c; i++) {
this.randomnessSources()[i].setBoostMode(false);
}
}
this.setKey(Clipperz.Crypto.SHA.sha_d256(newKeySeed));
if (reseedCounter == 1) {
MochiKit.Logging.logDebug("### PRNG.readyToGenerateRandomBytes");
MochiKit.Signal.signal(this, 'readyToGenerateRandomBytes');
}
MochiKit.Signal.signal(this, 'reseeded');
},
//-------------------------------------------------------------------------
'isReadyToGenerateRandomValues': function() {
return this.reseedCounter() != 0;
},
//-------------------------------------------------------------------------
'entropyLevel': function() {
return this.accumulators()[0].stack().length() + (this.reseedCounter() * this.firstPoolReseedLevel());
},
//-------------------------------------------------------------------------
'counter': function() {
return this._counter;
},
'incrementCounter': function() {
this._counter += 1;
},
'counterBlock': function() {
var result;
result = new Clipperz.ByteArray().appendWords(this.counter(), 0, 0, 0);
return result;
},
//-------------------------------------------------------------------------
'getRandomBlock': function() {
var result;
result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(this.aesKey(), this.counterBlock().arrayValues()));
this.incrementCounter();
return result;
},
//-------------------------------------------------------------------------
'getRandomBytes': function(aSize) {
var result;
if (this.isReadyToGenerateRandomValues()) {
var i,c;
var newKey;
result = new Clipperz.ByteArray();
c = Math.ceil(aSize / (128 / 8));
for (i=0; i<c; i++) {
result.appendBlock(this.getRandomBlock());
}
if (result.length() != aSize) {
result = result.split(0, aSize);
}
newKey = this.getRandomBlock().appendBlock(this.getRandomBlock());
this.setKey(newKey);
} else {
MochiKit.Logging.logWarning("Fortuna generator has not enough entropy, yet!");
throw Clipperz.Crypto.PRNG.exception.NotEnoughEntropy;
}
return result;
},
//-------------------------------------------------------------------------
'addRandomByte': function(aSourceId, aPoolId, aRandomValue) {
var selectedAccumulator;
selectedAccumulator = this.accumulators()[aPoolId];
selectedAccumulator.addRandomByte(aRandomValue);
if (aPoolId == 0) {
MochiKit.Signal.signal(this, 'addedRandomByte')
if (selectedAccumulator.stack().length() > this.firstPoolReseedLevel()) {
this.reseed();
}
}
},
//-------------------------------------------------------------------------
'numberOfEntropyAccumulators': function() {
return this._numberOfEntropyAccumulators;
},
//-------------------------------------------------------------------------
'randomnessSources': function() {
return this._randomnessSources;
},
'addRandomnessSource': function(aRandomnessSource) {
aRandomnessSource.setGenerator(this);
aRandomnessSource.setSourceId(this.randomnessSources().length);
this.randomnessSources().push(aRandomnessSource);
if (this.isReadyToGenerateRandomValues() == false) {
aRandomnessSource.setBoostMode(true);
}
},
//-------------------------------------------------------------------------
'deferredEntropyCollection': function(aValue) {
var result;
//MochiKit.Logging.logDebug(">>> PRNG.deferredEntropyCollection");
if (this.isReadyToGenerateRandomValues()) {
//MochiKit.Logging.logDebug("--- PRNG.deferredEntropyCollection - 1");
result = aValue;
} else {
//MochiKit.Logging.logDebug("--- PRNG.deferredEntropyCollection - 2");
var deferredResult;
Clipperz.NotificationCenter.notify(this, 'updatedProgressState', 'collectingEntropy', true);
deferredResult = new MochiKit.Async.Deferred();
// deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.2.1 - PRNG.deferredEntropyCollection - 1: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.partial(MochiKit.Async.succeed, aValue));
// deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.2.2 - PRNG.deferredEntropyCollection - 2: " + res); return res;});
MochiKit.Signal.connect(this,
'readyToGenerateRandomBytes',
deferredResult,
'callback');
result = deferredResult;
}
//MochiKit.Logging.logDebug("<<< PRNG.deferredEntropyCollection - result: " + result);
return result;
},
//-------------------------------------------------------------------------
'fastEntropyAccumulationForTestingPurpose': function() {
while (! this.isReadyToGenerateRandomValues()) {
this.addRandomByte(Math.floor(Math.random() * 32), Math.floor(Math.random() * 32), Math.floor(Math.random() * 256));
}
},
//-------------------------------------------------------------------------
'dump': function(appendToDoc) {
var tbl;
var i,c;
tbl = document.createElement("table");
tbl.border = 0;
with (tbl.style) {
border = "1px solid lightgrey";
fontFamily = 'Helvetica, Arial, sans-serif';
fontSize = '8pt';
//borderCollapse = "collapse";
}
var hdr = tbl.createTHead();
var hdrtr = hdr.insertRow(0);
// document.createElement("tr");
{
var ntd;
ntd = hdrtr.insertCell(0);
ntd.style.borderBottom = "1px solid lightgrey";
ntd.style.borderRight = "1px solid lightgrey";
ntd.appendChild(document.createTextNode("#"));
ntd = hdrtr.insertCell(1);
ntd.style.borderBottom = "1px solid lightgrey";
ntd.style.borderRight = "1px solid lightgrey";
ntd.appendChild(document.createTextNode("s"));
ntd = hdrtr.insertCell(2);
ntd.colSpan = this.firstPoolReseedLevel();
ntd.style.borderBottom = "1px solid lightgrey";
ntd.style.borderRight = "1px solid lightgrey";
ntd.appendChild(document.createTextNode("base values"));
ntd = hdrtr.insertCell(3);
ntd.colSpan = 20;
ntd.style.borderBottom = "1px solid lightgrey";
ntd.appendChild(document.createTextNode("extra values"));
}
c = this.accumulators().length;
for (i=0; i<c ; i++) {
var currentAccumulator;
var bdytr;
var bdytd;
var ii, cc;
currentAccumulator = this.accumulators()[i]
bdytr = tbl.insertRow(true);
bdytd = bdytr.insertCell(0);
bdytd.style.borderRight = "1px solid lightgrey";
bdytd.style.color = "lightgrey";
bdytd.appendChild(document.createTextNode("" + i));
bdytd = bdytr.insertCell(1);
bdytd.style.borderRight = "1px solid lightgrey";
bdytd.style.color = "gray";
bdytd.appendChild(document.createTextNode("" + currentAccumulator.stack().length()));
cc = Math.max(currentAccumulator.stack().length(), this.firstPoolReseedLevel());
for (ii=0; ii<cc; ii++) {
var cellText;
bdytd = bdytr.insertCell(ii + 2);
if (ii < currentAccumulator.stack().length()) {
cellText = Clipperz.ByteArray.byteToHex(currentAccumulator.stack().byteAtIndex(ii));
} else {
cellText = "_";
}
if (ii == (this.firstPoolReseedLevel() - 1)) {
bdytd.style.borderRight = "1px solid lightgrey";
}
bdytd.appendChild(document.createTextNode(cellText));
}
}
if (appendToDoc) {
var ne = document.createElement("div");
ne.id = "entropyGeneratorStatus";
with (ne.style) {
fontFamily = "Courier New, monospace";
fontSize = "12px";
lineHeight = "16px";
borderTop = "1px solid black";
padding = "10px";
}
if (document.getElementById(ne.id)) {
MochiKit.DOM.swapDOM(ne.id, ne);
} else {
document.body.appendChild(ne);
}
ne.appendChild(tbl);
}
return tbl;
},
//-----------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//#############################################################################
Clipperz.Crypto.PRNG.Random = function(args) {
args = args || {};
// MochiKit.Base.bindMethods(this);
return this;
}
Clipperz.Crypto.PRNG.Random.prototype = MochiKit.Base.update(null, {
'toString': function() {
return "Clipperz.Crypto.PRNG.Random";
},
//-------------------------------------------------------------------------
'getRandomBytes': function(aSize) {
//Clipperz.Profile.start("Clipperz.Crypto.PRNG.Random.getRandomBytes");
var result;
var i,c;
result = new Clipperz.ByteArray()
c = aSize || 1;
for (i=0; i<c; i++) {
result.appendByte((Math.random()*255) & 0xff);
}
//Clipperz.Profile.stop("Clipperz.Crypto.PRNG.Random.getRandomBytes");
return result;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//#############################################################################
_clipperz_crypt_prng_defaultPRNG = null;
Clipperz.Crypto.PRNG.defaultRandomGenerator = function() {
if (_clipperz_crypt_prng_defaultPRNG == null) {
_clipperz_crypt_prng_defaultPRNG = new Clipperz.Crypto.PRNG.Fortuna();
//.............................................................
//
// TimeRandomnessSource
//
//.............................................................
{
var newRandomnessSource;
newRandomnessSource = new Clipperz.Crypto.PRNG.TimeRandomnessSource({intervalTime:111});
_clipperz_crypt_prng_defaultPRNG.addRandomnessSource(newRandomnessSource);
}
//.............................................................
//
// MouseRandomnessSource
//
//.............................................................
{
var newRandomnessSource;
newRandomnessSource = new Clipperz.Crypto.PRNG.MouseRandomnessSource();
_clipperz_crypt_prng_defaultPRNG.addRandomnessSource(newRandomnessSource);
}
//.............................................................
//
// KeyboardRandomnessSource
//
//.............................................................
{
var newRandomnessSource;
newRandomnessSource = new Clipperz.Crypto.PRNG.KeyboardRandomnessSource();
_clipperz_crypt_prng_defaultPRNG.addRandomnessSource(newRandomnessSource);
}
}
return _clipperz_crypt_prng_defaultPRNG;
};
//#############################################################################
Clipperz.Crypto.PRNG.exception = {
NotEnoughEntropy: new MochiKit.Base.NamedError("Clipperz.Crypto.PRNG.exception.NotEnoughEntropy")
};
MochiKit.DOM.addLoadEvent(Clipperz.Crypto.PRNG.defaultRandomGenerator);

View File

@@ -0,0 +1,151 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
try { if (typeof(Clipperz.Crypto.BigInt) == 'undefined') { throw ""; }} catch (e) {
throw "Clipperz.Crypto.RSA depends on Clipperz.Crypto.BigInt!";
}
if (typeof(Clipperz.Crypto.RSA) == 'undefined') { Clipperz.Crypto.RSA = {}; }
Clipperz.Crypto.RSA.VERSION = "0.1";
Clipperz.Crypto.RSA.NAME = "Clipperz.RSA";
//#############################################################################
MochiKit.Base.update(Clipperz.Crypto.RSA, {
//-------------------------------------------------------------------------
'publicKeyWithValues': function (e, d, n) {
var result;
result = {};
if (e.isBigInt) {
result.e = e;
} else {
result.e = new Clipperz.Crypto.BigInt(e, 16);
}
if (d.isBigInt) {
result.d = d;
} else {
result.d = new Clipperz.Crypto.BigInt(d, 16);
}
if (n.isBigInt) {
result.n = n;
} else {
result.n = new Clipperz.Crypto.BigInt(n, 16);
}
return result;
},
'privateKeyWithValues': function(e, d, n) {
return Clipperz.Crypto.RSA.publicKeyWithValues(e, d, n);
},
//-----------------------------------------------------------------------------
'encryptUsingPublicKey': function (aKey, aMessage) {
var messageValue;
var result;
messageValue = new Clipperz.Crypto.BigInt(aMessage, 16);
result = messageValue.powerModule(aKey.e, aKey.n);
return result.asString(16);
},
//.............................................................................
'decryptUsingPublicKey': function (aKey, aMessage) {
return Clipperz.Crypto.RSA.encryptUsingPublicKey(aKey, aMessage);
},
//-----------------------------------------------------------------------------
'encryptUsingPrivateKey': function (aKey, aMessage) {
var messageValue;
var result;
messageValue = new Clipperz.Crypto.BigInt(aMessage, 16);
result = messageValue.powerModule(aKey.d, aKey.n);
return result.asString(16);
},
//.............................................................................
'decryptUsingPrivateKey': function (aKey, aMessage) {
return Clipperz.Crypto.RSA.encryptUsingPrivateKey(aKey, aMessage);
},
//-----------------------------------------------------------------------------
'generatePublicKey': function(aNumberOfBits) {
var result;
var e;
var d;
var n;
e = new Clipperz.Crypto.BigInt("10001", 16);
{
var p, q;
var phi;
do {
p = Clipperz.Crypto.BigInt.randomPrime(aNumberOfBits);
} while (p.module(e).equals(1));
do {
q = Clipperz.Crypto.BigInt.randomPrime(aNumberOfBits);
} while ((q.equals(p)) || (q.module(e).equals(1)));
n = p.multiply(q);
phi = (p.subtract(1).multiply(q.subtract(1)));
d = e.powerModule(-1, phi);
}
result = Clipperz.Crypto.RSA.publicKeyWithValues(e, d, n);
return result;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
//-------------------------------------------------------------------------
});
//#############################################################################

View File

@@ -0,0 +1,296 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!";
}
if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
if (typeof(Clipperz.Crypto.SHA) == 'undefined') { Clipperz.Crypto.SHA = {}; }
Clipperz.Crypto.SHA.VERSION = "0.3";
Clipperz.Crypto.SHA.NAME = "Clipperz.Crypto.SHA";
MochiKit.Base.update(Clipperz.Crypto.SHA, {
'__repr__': function () {
return "[" + this.NAME + " " + this.VERSION + "]";
},
'toString': function () {
return this.__repr__();
},
//-----------------------------------------------------------------------------
'rotateRight': function(aValue, aNumberOfBits) {
//Clipperz.Profile.start("Clipperz.Crypto.SHA.rotateRight");
var result;
result = (aValue >>> aNumberOfBits) | (aValue << (32 - aNumberOfBits));
//Clipperz.Profile.stop("Clipperz.Crypto.SHA.rotateRight");
return result;
},
'shiftRight': function(aValue, aNumberOfBits) {
//Clipperz.Profile.start("Clipperz.Crypto.SHA.shiftRight");
var result;
result = aValue >>> aNumberOfBits;
//Clipperz.Profile.stop("Clipperz.Crypto.SHA.shiftRight");
return result;
},
//-----------------------------------------------------------------------------
'safeAdd': function() {
//Clipperz.Profile.start("Clipperz.Crypto.SHA.safeAdd");
var result;
var i, c;
result = arguments[0];
c = arguments.length;
for (i=1; i<c; i++) {
var lowerBytesSum;
lowerBytesSum = (result & 0xffff) + (arguments[i] & 0xffff);
result = (((result >> 16) + (arguments[i] >> 16) + (lowerBytesSum >> 16)) << 16) | (lowerBytesSum & 0xffff);
}
//Clipperz.Profile.stop("Clipperz.Crypto.SHA.safeAdd");
return result;
},
//-----------------------------------------------------------------------------
'sha256_array': function(aValue) {
//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha256_array");
var result;
var message;
var h0, h1, h2, h3, h4, h5, h6, h7;
var k;
var messageLength;
var messageLengthInBits;
var _i, _c;
var charBits;
var rotateRight;
var shiftRight;
var safeAdd;
var bytesPerBlock;
var currentMessageIndex;
bytesPerBlock = 512/8;
rotateRight = Clipperz.Crypto.SHA.rotateRight;
shiftRight = Clipperz.Crypto.SHA.shiftRight;
safeAdd = Clipperz.Crypto.SHA.safeAdd;
charBits = 8;
h0 = 0x6a09e667;
h1 = 0xbb67ae85;
h2 = 0x3c6ef372;
h3 = 0xa54ff53a;
h4 = 0x510e527f;
h5 = 0x9b05688c;
h6 = 0x1f83d9ab;
h7 = 0x5be0cd19;
k = [ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];
message = aValue;
messageLength = message.length;
//Pre-processing:
message.push(0x80); // append a single "1" bit to message
_c = (512 - (((messageLength + 1) * charBits) % 512) - 64) / charBits;
for (_i=0; _i<_c; _i++) {
message.push(0x00); // append "0" bits until message length ≡ 448 ≡ -64 (mod 512)
}
messageLengthInBits = messageLength * charBits;
message.push(0x00); // the 4 most high byte are alway 0 as message length is represented with a 32bit value;
message.push(0x00);
message.push(0x00);
message.push(0x00);
message.push((messageLengthInBits >> 24) & 0xff);
message.push((messageLengthInBits >> 16) & 0xff);
message.push((messageLengthInBits >> 8) & 0xff);
message.push( messageLengthInBits & 0xff);
currentMessageIndex = 0;
while(currentMessageIndex < message.length) {
var w;
var a, b, c, d, e, f, g, h;
w = Array(64);
_c = 16;
for (_i=0; _i<_c; _i++) {
var _j;
_j = currentMessageIndex + _i*4;
w[_i] = (message[_j] << 24) | (message[_j + 1] << 16) | (message[_j + 2] << 8) | (message[_j + 3] << 0);
}
_c = 64;
for (_i=16; _i<_c; _i++) {
var s0, s1;
s0 = (rotateRight(w[_i-15], 7)) ^ (rotateRight(w[_i-15], 18)) ^ (shiftRight(w[_i-15], 3));
s1 = (rotateRight(w[_i-2], 17)) ^ (rotateRight(w[_i-2], 19)) ^ (shiftRight(w[_i-2], 10));
w[_i] = safeAdd(w[_i-16], s0, w[_i-7], s1);
}
a=h0; b=h1; c=h2; d=h3; e=h4; f=h5; g=h6; h=h7;
_c = 64;
for (_i=0; _i<_c; _i++) {
var s0, s1, ch, maj, t1, t2;
s0 = (rotateRight(a, 2)) ^ (rotateRight(a, 13)) ^ (rotateRight(a, 22));
maj = (a & b) ^ (a & c) ^ (b & c);
t2 = safeAdd(s0, maj);
s1 = (rotateRight(e, 6)) ^ (rotateRight(e, 11)) ^ (rotateRight(e, 25));
ch = (e & f) ^ ((~e) & g);
t1 = safeAdd(h, s1, ch, k[_i], w[_i]);
h = g;
g = f;
f = e;
e = safeAdd(d, t1);
d = c;
c = b;
b = a;
a = safeAdd(t1, t2);
}
h0 = safeAdd(h0, a);
h1 = safeAdd(h1, b);
h2 = safeAdd(h2, c);
h3 = safeAdd(h3, d);
h4 = safeAdd(h4, e);
h5 = safeAdd(h5, f);
h6 = safeAdd(h6, g);
h7 = safeAdd(h7, h);
currentMessageIndex += bytesPerBlock;
}
result = new Array(256/8);
result[0] = (h0 >> 24) & 0xff;
result[1] = (h0 >> 16) & 0xff;
result[2] = (h0 >> 8) & 0xff;
result[3] = h0 & 0xff;
result[4] = (h1 >> 24) & 0xff;
result[5] = (h1 >> 16) & 0xff;
result[6] = (h1 >> 8) & 0xff;
result[7] = h1 & 0xff;
result[8] = (h2 >> 24) & 0xff;
result[9] = (h2 >> 16) & 0xff;
result[10] = (h2 >> 8) & 0xff;
result[11] = h2 & 0xff;
result[12] = (h3 >> 24) & 0xff;
result[13] = (h3 >> 16) & 0xff;
result[14] = (h3 >> 8) & 0xff;
result[15] = h3 & 0xff;
result[16] = (h4 >> 24) & 0xff;
result[17] = (h4 >> 16) & 0xff;
result[18] = (h4 >> 8) & 0xff;
result[19] = h4 & 0xff;
result[20] = (h5 >> 24) & 0xff;
result[21] = (h5 >> 16) & 0xff;
result[22] = (h5 >> 8) & 0xff;
result[23] = h5 & 0xff;
result[24] = (h6 >> 24) & 0xff;
result[25] = (h6 >> 16) & 0xff;
result[26] = (h6 >> 8) & 0xff;
result[27] = h6 & 0xff;
result[28] = (h7 >> 24) & 0xff;
result[29] = (h7 >> 16) & 0xff;
result[30] = (h7 >> 8) & 0xff;
result[31] = h7 & 0xff;
//Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256_array");
return result;
},
//-----------------------------------------------------------------------------
'sha256': function(aValue) {
//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha256");
var result;
var resultArray;
var valueArray;
valueArray = aValue.arrayValues();
resultArray = Clipperz.Crypto.SHA.sha256_array(valueArray);
result = new Clipperz.ByteArray(resultArray);
//Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256");
return result;
},
//-----------------------------------------------------------------------------
'sha_d256': function(aValue) {
//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha_d256");
var result;
var resultArray;
var valueArray;
valueArray = aValue.arrayValues();
resultArray = Clipperz.Crypto.SHA.sha256_array(valueArray);
resultArray = Clipperz.Crypto.SHA.sha256_array(resultArray);
result = new Clipperz.ByteArray(resultArray);
//Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256");
return result;
},
//-----------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,331 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!";
}
try { if (typeof(Clipperz.Crypto.BigInt) == 'undefined') { throw ""; }} catch (e) {
throw "Clipperz.Crypto.SRP depends on Clipperz.Crypto.BigInt!";
}
try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) {
throw "Clipperz.Crypto.SRP depends on Clipperz.Crypto.PRNG!";
}
if (typeof(Clipperz.Crypto.SRP) == 'undefined') { Clipperz.Crypto.SRP = {}; }
Clipperz.Crypto.SRP.VERSION = "0.1";
Clipperz.Crypto.SRP.NAME = "Clipperz.Crypto.SRP";
//#############################################################################
MochiKit.Base.update(Clipperz.Crypto.SRP, {
'_n': null,
'_g': null,
//-------------------------------------------------------------------------
'n': function() {
if (Clipperz.Crypto.SRP._n == null) {
Clipperz.Crypto.SRP._n = new Clipperz.Crypto.BigInt("115b8b692e0e045692cf280b436735c77a5a9e8a9e7ed56c965f87db5b2a2ece3", 16);
}
return Clipperz.Crypto.SRP._n;
},
//-------------------------------------------------------------------------
'g': function() {
if (Clipperz.Crypto.SRP._g == null) {
Clipperz.Crypto.SRP._g = new Clipperz.Crypto.BigInt(2); // eventually 5 (as suggested on the Diffi-Helmann documentation)
}
return Clipperz.Crypto.SRP._g;
},
//-----------------------------------------------------------------------------
'exception': {
'InvalidValue': new MochiKit.Base.NamedError("Clipperz.Crypto.SRP.exception.InvalidValue")
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//#############################################################################
//
// S R P C o n n e c t i o n version 1.0
//
//=============================================================================
Clipperz.Crypto.SRP.Connection = function (args) {
args = args || {};
this._C = args.C;
this._P = args.P;
this.hash = args.hash;
this._a = null;
this._A = null;
this._s = null;
this._B = null;
this._x = null;
this._u = null;
this._K = null;
this._M1 = null;
this._M2 = null;
this._sessionKey = null;
return this;
}
Clipperz.Crypto.SRP.Connection.prototype = MochiKit.Base.update(null, {
'toString': function () {
return "Clipperz.Crypto.SRP.Connection (username: " + this.username() + "). Status: " + this.statusDescription();
},
//-------------------------------------------------------------------------
'C': function () {
return this._C;
},
//-------------------------------------------------------------------------
'P': function () {
return this._P;
},
//-------------------------------------------------------------------------
'a': function () {
if (this._a == null) {
this._a = new Clipperz.Crypto.BigInt(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2), 16);
// this._a = new Clipperz.Crypto.BigInt("37532428169486597638072888476611365392249575518156687476805936694442691012367", 10);
//MochiKit.Logging.logDebug("SRP a: " + this._a);
}
return this._a;
},
//-------------------------------------------------------------------------
'A': function () {
if (this._A == null) {
// Warning: this value should be strictly greater than zero: how should we perform this check?
this._A = Clipperz.Crypto.SRP.g().powerModule(this.a(), Clipperz.Crypto.SRP.n());
if (this._A.equals(0)) {
MochiKit.Logging.logError("Clipperz.Crypto.SRP.Connection: trying to set 'A' to 0.");
throw Clipperz.Crypto.SRP.exception.InvalidValue;
}
//MochiKit.Logging.logDebug("SRP A: " + this._A);
}
return this._A;
},
//-------------------------------------------------------------------------
's': function () {
return this._s;
//MochiKit.Logging.logDebug("SRP s: " + this._S);
},
'set_s': function(aValue) {
this._s = aValue;
},
//-------------------------------------------------------------------------
'B': function () {
return this._B;
},
'set_B': function(aValue) {
// Warning: this value should be strictly greater than zero: how should we perform this check?
if (! aValue.equals(0)) {
this._B = aValue;
//MochiKit.Logging.logDebug("SRP B: " + this._B);
} else {
MochiKit.Logging.logError("Clipperz.Crypto.SRP.Connection: trying to set 'B' to 0.");
throw Clipperz.Crypto.SRP.exception.InvalidValue;
}
},
//-------------------------------------------------------------------------
'x': function () {
if (this._x == null) {
this._x = new Clipperz.Crypto.BigInt(this.stringHash(this.s().asString(16, 64) + this.P()), 16);
//MochiKit.Logging.logDebug("SRP x: " + this._x);
}
return this._x;
},
//-------------------------------------------------------------------------
'u': function () {
if (this._u == null) {
this._u = new Clipperz.Crypto.BigInt(this.stringHash(this.B().asString()), 16);
//MochiKit.Logging.logDebug("SRP u: " + this._u);
}
return this._u;
},
//-------------------------------------------------------------------------
'S': function () {
if (this._S == null) {
var bigint;
var srp;
bigint = Clipperz.Crypto.BigInt;
srp = Clipperz.Crypto.SRP;
this._S = bigint.powerModule(
bigint.subtract(this.B(), bigint.powerModule(srp.g(), this.x(), srp.n())),
bigint.add(this.a(), bigint.multiply(this.u(), this.x())),
srp.n()
)
//MochiKit.Logging.logDebug("SRP S: " + this._S);
}
return this._S;
},
//-------------------------------------------------------------------------
'K': function () {
if (this._K == null) {
this._K = this.stringHash(this.S().asString());
//MochiKit.Logging.logDebug("SRP K: " + this._K);
}
return this._K;
},
//-------------------------------------------------------------------------
'M1': function () {
if (this._M1 == null) {
this._M1 = this.stringHash(this.A().asString(10) + this.B().asString(10) + this.K());
//MochiKit.Logging.logDebug("SRP M1: " + this._M1);
}
return this._M1;
},
//-------------------------------------------------------------------------
'M2': function () {
if (this._M2 == null) {
this._M2 = this.stringHash(this.A().asString(10) + this.M1() + this.K());
//MochiKit.Logging.logDebug("SRP M2: " + this._M2);
}
return this._M2;
},
//=========================================================================
'serverSideCredentialsWithSalt': function(aSalt) {
var result;
var s, x, v;
s = aSalt;
x = this.stringHash(s + this.P());
v = Clipperz.Crypto.SRP.g().powerModule(new Clipperz.Crypto.BigInt(x, 16), Clipperz.Crypto.SRP.n());
result = {};
result['C'] = this.C();
result['s'] = s;
result['v'] = v.asString(16);
return result;
},
'serverSideCredentials': function() {
var result;
var s;
s = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
result = this.serverSideCredentialsWithSalt(s);
return result;
},
//=========================================================================
/*
'computeServerSide_S': function(b) {
var result;
var v;
var bigint;
var srp;
bigint = Clipperz.Crypto.BigInt;
srp = Clipperz.Crypto.SRP;
v = new Clipperz.Crypto.BigInt(srpConnection.serverSideCredentialsWithSalt(this.s().asString(16, 64)).v, 16);
// _S = (this.A().multiply(this.v().modPow(this.u(), this.n()))).modPow(this.b(), this.n());
result = bigint.powerModule(
bigint.multiply(
this.A(),
bigint.powerModule(v, this.u(), srp.n())
), new Clipperz.Crypto.BigInt(b, 10), srp.n()
);
return result;
},
*/
//=========================================================================
'stringHash': function(aValue) {
var result;
result = this.hash(new Clipperz.ByteArray(aValue)).toHexString().substring(2);
return result;
},
//=========================================================================
__syntaxFix__: "syntax fix"
});
//#############################################################################

View File

@@ -0,0 +1,131 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.DOM) == 'undefined') { Clipperz.DOM = {}; }
Clipperz.DOM.VERSION = "0.1";
Clipperz.DOM.NAME = "Clipperz.DOM";
MochiKit.Base.update(Clipperz.DOM, {
//-------------------------------------------------------------------------
'__repr__': function () {
return "[" + this.NAME + " " + this.VERSION + "]";
},
//-------------------------------------------------------------------------
'toString': function () {
return this.__repr__();
},
//-------------------------------------------------------------------------
'selectOptionMatchingValue': function (aSelectElement, aValue, shouldUseCaseInsensitiveTest) {
var selectedOptionIndex;
var i, c;
selectedOptionIndex = -1;
c = aSelectElement.options.length;
for (i=0; (i<c) && (selectedOptionIndex == -1); i++) {
if (shouldUseCaseInsensitiveTest == true) {
if (aSelectElement.options[i].value.toLowerCase() == aValue.toLowerCase()) {
selectedOptionIndex = i;
}
} else {
if (aSelectElement.options[i].value == aValue) {
selectedOptionIndex = i;
}
}
}
if (selectedOptionIndex != -1) {
aSelectElement.selectedIndex = selectedOptionIndex;
}
},
//-------------------------------------------------------------------------
'setFormContents': function(aNode, someValues) {
var node;
var values;
var i, c;
values = {};
c = someValues[0].length;
for (i=0; i<c; i++) {
values[someValues[0][i]] = someValues[1][i];
}
// var m = MochiKit.Base;
// var self = MochiKit.DOM;
if (typeof(aNode) == "undefined" || aNode === null) {
node = MochiKit.DOM._document.body;
} else {
node = MochiKit.DOM.getElement(aNode);
}
MochiKit.Base.nodeWalk(node, function(aNode) {
var result;
var name;
result = null;
name = aNode.name;
if (MochiKit.Base.isNotEmpty(name) && (typeof(values[name]) != 'undefined')) {
var tagName;
tagName = aNode.tagName.toUpperCase();
if (tagName === "INPUT" && (aNode.type == "radio" || aNode.type == "checkbox")) {
aNode.checked = values[name];
} else if (tagName === "SELECT") {
if (aNode.type == "select-one") {
Clipperz.DOM.selectOptionMatchingValue(aNode, values[name]);
} else { // aNode.type == "select-multiple"
MochiKit.Logging.logWarning("### unhandled Select.type = 'select-multiple' condition");
}
} else if (tagName === "FORM" || tagName === "P" || tagName === "SPAN" || tagName === "DIV") {
result = aNode.childNodes;
} else {
aNode.value = values[name]
}
} else {
result = aNode.childNodes;
}
return result;
});
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,305 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.Date) == 'undefined') { Clipperz.Date = {}; }
Clipperz.Date.VERSION = "0.1";
Clipperz.Date.NAME = "Clipperz.Date";
MochiKit.Base.update(Clipperz.Date, {
//-------------------------------------------------------------------------
'__repr__': function () {
return "[" + this.NAME + " " + this.VERSION + "]";
},
//-------------------------------------------------------------------------
'toString': function () {
return this.__repr__();
},
//-------------------------------------------------------------------------
'daysInMonth': [31,28,31,30,31,30,31,31,30,31,30,31],
//-------------------------------------------------------------------------
'englishOrdinalDaySuffixForDate': function(aDate) {
var result;
switch (aDate.getDate()) {
case 1:
case 21:
case 31:
result = "st";
break;
case 2:
case 22:
result = "nd";
break;
case 3:
case 23:
result = "rd";
break;
default:
result = "th";
break;
}
return result;
},
//-------------------------------------------------------------------------
'isLeapYear': function(aDate) {
var year;
var result;
year = aDate.getFullYear();
result = ((year & 0x03) == 0 && (year % 100 || (year % 400 == 0 && year)));
return result;
},
//-------------------------------------------------------------------------
'getDaysInMonth': function(aDate) {
var result;
if (aDate.getMonth() == 1) {
Clipperz.Date.isLeapYear(aDate)
result += Clipperz.Date.isLeapYear(aDate) ? 29 : 28;
} else {
result = Clipperz.Date.daysInMonth[aDate.getMonth()];
}
return result;
},
//-------------------------------------------------------------------------
'getTimezone': function(aDate) {
var result;
result = aDate.toString();
result = result.replace(/([A-Z]{3}) [0-9]{4}/, '$1');
result = result.replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, "$1$2$3");
return result;
},
'getGMTOffset': function(aDate) {
return (aDate.getTimezoneOffset() > 0 ? "-" : "+") + MochiKit.Format.numberFormatter('00')(Math.floor(this.getTimezoneOffset() / 60))
+ MochiKit.Format.numberFormatter('00')(this.getTimezoneOffset() % 60);
},
//-------------------------------------------------------------------------
'dayOfYear': function(aDate) {
var result;
var i,c;
result = 0;
c = aDate.getMonth();
for (i=0; i<c; i++) {
if (i == 1) {
result += Clipperz.Date.isLeapYear(aDate) ? 29 : 28;
} else {
result += Clipperz.Date.daysInMonth[i];
}
}
return num + this.getDate() - 1;
},
//-------------------------------------------------------------------------
'getPHPLikeFormatCode': function(aCharacter) {
var result;
switch (aCharacter) {
case "d":
result = " + MochiKit.Format.numberFormatter('00')(aDate.getDate())";
break;
case "D":
result = " + aLocale['shortDays'][aDate.getDay()]";
break;
case "j":
result = " + aDate.getDate()";
break;
case "l":
result = " + aLocale['days'][aDate.getDay()]";
break;
case "S":
result = " + Clipperz.Date.englishOrdinalDaySuffixForDate(aDate)";
break;
case "w":
result = " + aDate.getDay()";
break;
case "z":
result = " + aDate.getDayOfYear()";
break;
case "W":
result = " + aDate.getWeekOfYear()";
break;
case "F":
result = " + aLocale['months'][aDate.getMonth()]";
break;
case "m":
result = " + MochiKit.Format.numberFormatter('00')(aDate.getMonth() + 1)";
break;
case "M":
result = " + aLocale['shortMonths'][aDate.getMonth()]";
break;
case "n":
result = " + (aDate.getMonth() + 1)";
break;
case "t":
result = " + Clipperz.Date.getDaysInMonth(aDate)";
break;
case "L":
result = " + (Clipperz.Date.isLeapYear(aDate) ? 1 : 0)";
break;
case "Y":
result = " + aDate.getFullYear()";
break;
case "y":
result = " + ('' + aDate.getFullYear()).substring(2, 4)";
break;
case "a":
result = " + (aDate.getHours() < 12 ? aLocale['amDesignation'] : aLocale['pmDesignation'])";
break;
case "A":
result = " + (aDate.getHours() < 12 ? aLocale['amDesignation'].toUpperCase() : aLocale['pmDesignation'].toUpperCase())";
break;
case "g":
result = " + ((aDate.getHours() %12) ? aDate.getHours() % 12 : 12)";
break;
case "G":
result = " + aDate.getHours()";
break;
case "h":
result = " + MochiKit.Format.numberFormatter('00')((aDate.getHours() %12) ? aDate.getHours() % 12 : 12)";
break;
case "H":
result = " + MochiKit.Format.numberFormatter('00')(aDate.getHours())";
break;
case "i":
result = " + MochiKit.Format.numberFormatter('00')(aDate.getMinutes())";
break;
case "s":
result = " + MochiKit.Format.numberFormatter('00')(aDate.getSeconds())";
break;
case "O":
result = " + aDate.getGMTOffset()";
break;
case "T":
result = " + Clipperz.Date.getTimezone(aDate)";
break;
case "Z":
result = " + ( + aDate.getTimezoneOffset() * -60)";
break;
default:
result = " + '" + aCharacter + "'";
break;
};
return result;
},
//=========================================================================
'formatDateWithPHPLikeTemplateAndLocale': function(aDate, aFormat, aLocale) {
var result;
var formatterCode;
var formatter;
var i,c;
//MochiKit.Logging.logDebug(">>> Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale");
formatterCode = "Clipperz.Date.__scratchFormatter = function(aDate, aLocale){return ''";
c = aFormat.length;
i = 0;
while (i<c) {
var character;
character = aFormat.charAt(i);
if (character == "\\") {
i++;
character = aFormat.charAt(i);
formatterCode += " + '" + character + "'"
} else {
formatterCode += Clipperz.Date.getPHPLikeFormatCode(character);
}
i++;
}
formatterCode += ";}";
//MochiKit.Logging.logDebug("--- Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale - formatterCode: " + formatterCode);
eval(formatterCode);
result = Clipperz.Date.__scratchFormatter.call(this, aDate, aLocale);
delete Clipperz.Date.__scratchFormatter;
//MochiKit.Logging.logDebug("<<< Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale");
return result;
},
//-------------------------------------------------------------------------
'parseDateWithPHPLikeTemplateAndLocale': function(aString, aFormat, aLocale) {
return new Date();
},
//=========================================================================
'formatDateWithUTCFormatAndLocale': function(aDate, aLocale) {
// return Clipperz.Date.formatWithJavaLikeTemplateAndLocale(aDate, "EEE, dd MMMM yyyy HH:mm:ss zzz", aLocale);
return aDate.toString();
},
'parseDateWithUTCFormatAndLocale': function(aValue, aLocale) {
return new Date(Date.parse(aValue));
},
//=========================================================================
'exception': {
// 'AbstractMethod': new MochiKit.Base.NamedError("Clipperz.Base.exception.AbstractMethod"),
// 'UnknownType': new MochiKit.Base.NamedError("Clipperz.Base.exception.UnknownType")
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,251 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. 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"
});

View File

@@ -0,0 +1,325 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.NotificationCenter) == 'undefined') { Clipperz.NotificationCenter = {}; }
//#############################################################################
Clipperz.NotificationCenterEvent = function(args) {
args = args || {};
// MochiKit.Base.bindMethods(this);
this._source = args.source || null;
this._event = args.event || null;
this._parameters = args.parameters || null;
this._isSynchronous = args.isSynchronous || false;
return this;
}
//=============================================================================
Clipperz.NotificationCenterEvent.prototype = MochiKit.Base.update(null, {
//-------------------------------------------------------------------------
'toString': function() {
return "Clipperz.NotificationCenterEvent";
//return "Clipperz.NotificationCenterEvent {source: " + this.source() + ", event: " + this.event() + ", parameters: " + this.parameters() + "}";
},
//-------------------------------------------------------------------------
'source': function() {
return this._source;
},
'setSource': function(aValue) {
this._source = aValue;
},
//-------------------------------------------------------------------------
'event': function() {
return this._event;
},
'setEvent': function(aValue) {
this._event = aValue;
},
//-------------------------------------------------------------------------
'parameters': function() {
return this._parameters;
},
'setParameters': function(aValue) {
this._parameters = aValue;
},
//-------------------------------------------------------------------------
'isSynchronous': function() {
return this._isSynchronous;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//#############################################################################
//#############################################################################
Clipperz.NotificationCenter = function(args) {
args = args || {};
// MochiKit.Base.bindMethods(this);
this._listeners = {};
this._useSynchronousListenerInvocation = args.useSynchronousListenerInvocation || false;
this._timeoutDelay = args.timeoutDelay || 0.1;
return this;
}
//=============================================================================
Clipperz.NotificationCenter.prototype = MochiKit.Base.update(null, {
//-------------------------------------------------------------------------
'toString': function() {
return "Clipperz.NotificationCenter";
},
//-------------------------------------------------------------------------
'useSynchronousListenerInvocation': function() {
return this._useSynchronousListenerInvocation;
},
'setUseSynchronousListenerInvocation': function(aValue) {
this._useSynchronousListenerInvocation = aValue;
},
//-------------------------------------------------------------------------
'timeoutDelay': function() {
return this._timeoutDelay;
},
'setTimeoutDelay': function(aValue) {
this._timeoutDelay = aValue;
},
//-------------------------------------------------------------------------
'listeners': function() {
return this._listeners;
},
//-------------------------------------------------------------------------
'register': function(aSource, anEvent, aListener, aMethod) {
var eventListeners;
var listenerInfo;
var eventKey;
if (anEvent != null) {
eventKey = anEvent;
} else {
eventKey = '_notificationCenter_matchAnyEvent_key_';
}
eventListeners = this.listeners()[eventKey];
if (eventListeners == null) {
eventListeners = [];
this.listeners()[eventKey] = eventListeners;
}
listenerInfo = {};
if (aSource != null) {
listenerInfo['source'] = aSource;
} else {
listenerInfo['source'] = 'any';
}
listenerInfo['listener'] = aListener;
listenerInfo['method'] = aMethod;
eventListeners.push(listenerInfo);
return listenerInfo;
},
//-------------------------------------------------------------------------
'removeListenerInfoFromListeners': function(aListener, someListeners) {
var listenerIndex;
var i,c;
if (someListeners != null) {
listenerIndex = -1;
c = someListeners.length;
for (i=0; i<c; i++) {
var listenerInfo;
listenerInfo = someListeners[i];
if (listenerInfo['listener'] === aListener) {
listenerIndex = i;
}
}
if (listenerIndex != -1) {
Clipperz.Base.removeObjectAtIndexFromArray(listenerIndex, someListeners);
}
}
},
//-------------------------------------------------------------------------
'unregister': function(aListener, anEvent) {
if (anEvent == null) {
var allListenerList;
var i, c;
// allListenerList = Clipperz.Base.values(this.listeners());
allListenerList = MochiKit.Base.values(this.listeners());
c = allListenerList.length;
for (i=0; i<c; i++) {
this.removeListenerInfoFromListeners(aListener, allListenerList[i]);
}
} else {
this.removeListenerInfoFromListeners(aListener, this.listeners()[anEvent]);
}
},
//-------------------------------------------------------------------------
'asysnchronousListenerNotification': function(anEventInfo, aMethod, aListener) {
MochiKit.Async.callLater(this.timeoutDelay(), MochiKit.Base.partial(MochiKit.Base.methodcaller(aMethod, anEventInfo), aListener));
// setTimeout(MochiKit.Base.partial(MochiKit.Base.methodcaller(aMethod, anEventInfo), aListener), this.timeoutDelay());
},
//-------------------------------------------------------------------------
'processListenerInfo': function(anEventInfo, aListenerInfo) {
var shouldInvokeListenerMethod;
if (aListenerInfo['source'] == 'any') {
shouldInvokeListenerMethod = true;
} else {
if (aListenerInfo['source'] === anEventInfo.source()) {
shouldInvokeListenerMethod = true;
} else {
shouldInvokeListenerMethod = false;
}
}
if (shouldInvokeListenerMethod) {
if (this.useSynchronousListenerInvocation() || anEventInfo.isSynchronous()) {
//MochiKit.Logging.logDebug("syncrhronous listener invocation");
try {
// MochiKit.Base.map(MochiKit.Base.methodcaller(aListenerInfo['method'], anEventInfo), [aListenerInfo['listener']]);
//console.log("notification: ", aListenerInfo['listener'], aListenerInfo['method'], anEventInfo);
MochiKit.Base.method(aListenerInfo['listener'], aListenerInfo['method'], anEventInfo)();
} catch(exception) {
MochiKit.Logging.logError('NotificationCenter ERROR: unable to invoke method \'' + aListenerInfo['method'] + '\' on object ' + aListenerInfo['listener']);
}
} else {
var asyncMethod;
//MochiKit.Logging.logDebug("asyncrhronous listener invocation");
asyncMethod = MochiKit.Base.bind(this.asysnchronousListenerNotification, this)
MochiKit.Base.map(MochiKit.Base.partial(asyncMethod, anEventInfo, aListenerInfo['method']), [aListenerInfo['listener']]);
}
}
},
//-------------------------------------------------------------------------
'notify': function(aSource, anEvent, someEventParameters, isSynchronous) {
var eventInfo;
var processInfoMethod;
//MochiKit.Logging.logDebug(">>> NotificationCenter.notify");
eventInfo = new Clipperz.NotificationCenterEvent({source:aSource, event:anEvent, parameters:someEventParameters, isSynchronous:isSynchronous});
//MochiKit.Logging.logDebug("--- NotificationCenter.notify - 1");
processInfoMethod = MochiKit.Base.bind(this.processListenerInfo, this);
//MochiKit.Logging.logDebug("--- NotificationCenter.notify - 2");
MochiKit.Base.map(MochiKit.Base.partial(processInfoMethod, eventInfo), this.listeners()[anEvent] || []);
//MochiKit.Logging.logDebug("--- NotificationCenter.notify - 3");
MochiKit.Base.map(MochiKit.Base.partial(processInfoMethod, eventInfo), this.listeners()['_notificationCenter_matchAnyEvent_key_'] || []);
//MochiKit.Logging.logDebug("<<< NotificationCenter.notify");
},
//-------------------------------------------------------------------------
'deferredNotification': function(aSource, anEvent, someEventParameters, aDeferredResult) {
this.notify(aSource, anEvent, someEventParameters, true);
return aDeferredResult;
// return MochiKit.Async.wait(1, aDeferredResult);
},
//-------------------------------------------------------------------------
'resetStatus': function() {
this._listeners = {};
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//#############################################################################
Clipperz.NotificationCenter.defaultNotificationCenter = new Clipperz.NotificationCenter();
Clipperz.NotificationCenter.notify = MochiKit.Base.method(Clipperz.NotificationCenter.defaultNotificationCenter, 'notify');
Clipperz.NotificationCenter.register = MochiKit.Base.method(Clipperz.NotificationCenter.defaultNotificationCenter, 'register');
Clipperz.NotificationCenter.unregister = MochiKit.Base.method(Clipperz.NotificationCenter.defaultNotificationCenter, 'unregister');
Clipperz.NotificationCenter.deferredNotification = MochiKit.Base.method(Clipperz.NotificationCenter.defaultNotificationCenter, 'deferredNotification');
/*
_clipperz_notificationCenter_defaultNotificationCenter = null;
Clipperz.NotificationCenter.defaultNotificationCenter = function() {
if (_clipperz_notificationCenter_defaultNotificationCenter == null) {
_clipperz_notificationCenter_defaultNotificationCenter = new Clipperz.NotificationCenter();
}
return _clipperz_notificationCenter_defaultNotificationCenter;
};
*/

View File

@@ -0,0 +1,288 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
//if (typeof(Clipperz.PM.BookmarkletProcessor) == 'undefined') { Clipperz.PM.BookmarkletProcessor = {}; }
//if (typeof(Clipperz.PM.BookmarkletProcessor.versions) == 'undefined') { Clipperz.PM.BookmarkletProcessor.versions = {}; }
/*
Clipperz.PM.BookmarkletProcessor.versions['abstract'] = function(anUser, aConfiguration) {
this._user = anUser;
this._configuration = aConfiguration;
this._recordTitle = null;
this._record = null;
this._editableFields = null;
return this;
}
Clipperz.PM.BookmarkletProcessor.versions['abstract'].prototype = MochiKit.Base.update(null, {
'toString': function() {
return "BookmarkletProcessor - " + this.user();
},
//-------------------------------------------------------------------------
'user': function() {
return this._user;
},
//-------------------------------------------------------------------------
'configuration': function() {
return this._configuration;
},
//-------------------------------------------------------------------------
'record': function() {
throw Clipperz.Base.exception.AbstractMethod;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
*/
Clipperz.PM.BookmarkletProcessor = function(anUser, aConfiguration) {
this._user = anUser;
this._configuration = aConfiguration;
this._recordTitle = null;
this._record = null;
this._editableFields = null;
this._favicon = null;
return this;
}
Clipperz.PM.BookmarkletProcessor.prototype = MochiKit.Base.update(null, {
'toString': function() {
return "BookmarkletProcessor - " + this.user();
},
//-------------------------------------------------------------------------
'user': function() {
return this._user;
},
//-------------------------------------------------------------------------
'configuration': function() {
return this._configuration;
},
//-------------------------------------------------------------------------
'recordTitle': function() {
if (this._recordTitle == null) {
this._recordTitle = this.configuration().page.title;
}
return this._recordTitle;
},
//-------------------------------------------------------------------------
'fields': function() {
return this.configuration().form.inputs;
},
//-------------------------------------------------------------------------
'editableFields': function() {
if (this._editableFields == null) {
this._editableFields = MochiKit.Base.filter(function(aField) {
var result;
var type;
type = aField['type'].toLowerCase();
result = ((type != 'hidden') && (type != 'submit') && (type != 'checkbox') && (type != 'radio') && (type != 'select'));
return result;
}, this.fields())
}
return this._editableFields;
},
//-------------------------------------------------------------------------
'hostname': function() {
if (this._hostname == null) {
var actionUrl;
actionUrl = this.configuration()['form']['attributes']['action'];
//MochiKit.Logging.logDebug("+++ actionUrl: " + actionUrl);
this._hostname = actionUrl.replace(/^https?:\/\/([^\/]*)\/.*/, '$1');
}
return this._hostname;
},
'favicon': function() {
if (this._favicon == null) {
this._favicon = "http://" + this.hostname() + "/favicon.ico";
//MochiKit.Logging.logDebug("+++ favicon: " + this._favicon);
}
return this._favicon;
},
//-------------------------------------------------------------------------
'record': function() {
if (this._record == null) {
var record;
var recordVersion;
var directLogin;
var bindings;
var i,c;
record = new Clipperz.PM.DataModel.Record({
label:this.recordTitle(),
notes:"",
user:this.user()
});
recordVersion = new Clipperz.PM.DataModel.RecordVersion(record, {})
record.setCurrentVersion(recordVersion);
bindings = {};
c = this.editableFields().length;
for (i=0; i<c; i++) {
var formField;
var recordField;
//MochiKit.Logging.logDebug(">>> adding a field");
formField = this.editableFields()[i];
recordField = new Clipperz.PM.DataModel.RecordField({
recordVersion:recordVersion,
label:formField['name'],
value:formField['value'],
type:Clipperz.PM.Strings.inputTypeToRecordFieldType[formField['type']],
hidden:false
});
recordVersion.addField(recordField);
bindings[formField['name']] = recordField.key();
//MochiKit.Logging.logDebug("<<< adding a field");
}
directLogin = new Clipperz.PM.DataModel.DirectLogin({
record:record,
label:this.recordTitle() + Clipperz.PM.Strings['newDirectLoginLabelSuffix'],
// bookmarkletVersion:this.version(),
bookmarkletVersion:'0.2',
favicon:this.favicon(),
formData:this.configuration()['form'],
bindingData:bindings
});
record.addDirectLogin(directLogin);
this.user().addRecord(record);
this._record = record;
}
return this._record;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//#############################################################################
Clipperz.PM.BookmarkletProcessor.createRecordFromBookmarkletConfiguration = function(anUser, aConfiguration) {
var processor;
processor = new Clipperz.PM.BookmarkletProcessor(anUser, aConfiguration);
return processor.record();
};
//-----------------------------------------------------------------------------
Clipperz.PM.BookmarkletProcessor.sanitizeBookmarkletConfiguration = function(aConfiguration) {
var result;
// throw "XSS Bookmarklet attempt";
result = aConfiguration;
return result;
};
//-----------------------------------------------------------------------------
Clipperz.PM.BookmarkletProcessor.checkBookmarkletConfiguration = function(aConfiguration, aButton, aCallback) {
var result;
try {
result = Clipperz.Base.evalJSON(aConfiguration);
result = Clipperz.PM.BookmarkletProcessor.sanitizeBookmarkletConfiguration(result);
if (result['version'] != '0.2.3') {
throw "WrongBookmarkletVersion";
}
} catch (exception) {
var title;
var message;
if (exception == "WrongBookmarkletVersion") {
title = Clipperz.PM.Strings['newRecordPanelWrongBookmarkletVersionExceptionTitle'];
message = Clipperz.PM.Strings['newRecordPanelWrongBookmarkletVersionExceptionMessage'];
} else {
title = Clipperz.PM.Strings['newRecordPanelGeneralExceptionTitle'];
message = Clipperz.PM.Strings['newRecordPanelGeneralExceptionMessage'];
}
Clipperz.PM.Components.MessageBox().show({
title:title,
text:message,
width:240,
fn:aCallback,
closable:false,
showProgressBar:false,
showCloseButton:false,
buttons:{'ok':Clipperz.PM.Strings['newRecordPanelExceptionPanelCloseButtonLabel']}
}, aButton);
throw exception;
}
return result;
};
//-----------------------------------------------------------------------------

View File

@@ -0,0 +1,124 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
//#############################################################################
var _Clipperz_PM_Components_Panels_base_id_ = 0;
//#############################################################################
Clipperz.PM.Components.BaseComponent = function(anElement, args) {
args = args || {};
// MochiKit.Base.bindMethods(this);
// Clipperz.PM.Components.BaseComponent.superclass.constructor.call(this, args);
this._element = anElement;
this._ids = {};
return this;
}
//=============================================================================
//MochiKit.Base.update(Clipperz.PM.Components.BaseComponent.prototype, {
YAHOO.extendX(Clipperz.PM.Components.BaseComponent, YAHOO.ext.util.Observable, {
'isClipperzPMComponent': true,
//-------------------------------------------------------------------------
'toString': function () {
return "Clipperz.PM.Components.BaseComponent component";
},
//-------------------------------------------------------------------------
'domHelper': function() {
return Clipperz.YUI.DomHelper;
},
//-------------------------------------------------------------------------
'element': function() {
//MochiKit.Logging.logDebug(">>> BaseComponent.element");
return this._element;
},
'setElement': function(aValue) {
this._element = aValue;
},
//-----------------------------------------------------
'remove': function() {
//MochiKit.Logging.logDebug(">>> BaseComponent.remove");
Clipperz.NotificationCenter.unregister(this);
MochiKit.Signal.disconnectAllTo(this);
//MochiKit.Logging.logDebug("<<< BaseComponent.remove");
},
//-------------------------------------------------------------------------
'getId': function(aValue) {
var result;
result = this._ids[aValue];
if (typeof(result) == 'undefined') {
_Clipperz_PM_Components_Panels_base_id_ ++;
result = "Clipperz_PM_Components_Panels_" + aValue + "_" + _Clipperz_PM_Components_Panels_base_id_;
this._ids[aValue] = result;
//MochiKit.Logging.logDebug(">>> getId(" + aValue + ") = " + result);
} else {
//MochiKit.Logging.logDebug("<<< getId(" + aValue + ") = " + result);
}
return result;
},
'getDom': function(aValue) {
return YAHOO.util.Dom.get(this.getId(aValue));
},
'getElement': function(aValue) {
return YAHOO.ext.Element.get(this.getId(aValue));
},
'getActor': function(aValue, anAnimator) {
return new YAHOO.ext.Actor(this.getDom(aValue), anAnimator);
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,86 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.Compact) == 'undefined') { Clipperz.PM.Components.Compact = {}; }
Clipperz.PM.Components.Compact.CompactHeader = function(anElement, args) {
Clipperz.PM.Components.Compact.CompactHeader.superclass.constructor.call(this, anElement, args);
this.render();
return this;
};
YAHOO.extendX(Clipperz.PM.Components.Compact.CompactHeader, Clipperz.PM.Components.BaseComponent, {
'toString': function() {
return "Clipperz.PM.Components.Compact.CompactHeader";
},
//-----------------------------------------------------
'render': function() {
this.element().update("");
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'div', children:[
{tag:'img', src:'./images/logo.gif'},
{tag:'div', id:'lockBlock', children:[
{tag:'input', type:'checkbox', id:'autolock'},
{tag:'span', html:'auto'},
{tag:'a', href:'#', htmlString:Clipperz.PM.Strings['lockMenuLabel'], id:'lock'}
]}
]});
Clipperz.YUI.DomHelper.append(this.element().dom,
{tag:'div', id:'compactMiscLinks', children:[
{tag:'a', id:'donateHeaderIconLink', target:'_blank', href:Clipperz.PM.Strings['donateHeaderLinkUrl'], children:[
{tag:'img', id:'donateHeaderLinkIcon', src:'./images/smiles_small.gif'}
]},
{tag:'ul', children:[
{tag:'li', children:[{tag:'a', id:'donateHeaderLink', html:'donate', target:'_blank'}]},
{tag:'li', children:[{tag:'a', id:'creditsHeaderLink', html:'credits', target:'_blank'}]},
{tag:'li', children:[{tag:'a', id:'feedbackHeaderLink', html:'feedback', target:'_blank'}]},
{tag:'li', children:[{tag:'a', id:'helpHeaderLink', html:'help', target:'_blank'}]},
{tag:'li', children:[{tag:'a', id:'forumHeaderLink', html:'forum', target:'_blank'}]}
]}
]}
);
YAHOO.ext.Element.get('lockBlock').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
Clipperz.NotificationCenter.notify(this, 'switchLanguage');
},
//-----------------------------------------------------
__syntaxFix__: '__syntaxFix__'
});

View File

@@ -0,0 +1,312 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.Compact) == 'undefined') { Clipperz.PM.Components.Compact = {}; }
Clipperz.PM.Components.Compact.CompactInterface = function(anElement, args) {
Clipperz.PM.Components.Compact.CompactInterface.superclass.constructor.call(this, anElement, args);
this._directLoginItemTemplate = null;
this._user = args.user;
this._autoLockTimer = null;
Clipperz.NotificationCenter.register(null, 'updatedProgressState', this, 'userNotificationHandler')
Clipperz.NotificationCenter.register(null, 'directLoginAdded', this, 'directLoginAddedHandler');
this.render();
return this;
};
YAHOO.extendX(Clipperz.PM.Components.Compact.CompactInterface, Clipperz.PM.Components.BaseComponent, {
'toString': function() {
return "Clipperz.PM.Components.Compact.CompactInterface";
},
//-----------------------------------------------------
'render': function() {
var result;
var layout;
var registerButton;
//MochiKit.Logging.logDebug(">>> CompactInterface.render");
this.element().update("");
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'div', children:[
{tag:'div', id:this.getId('cantentPanel'), children:[
{tag:'h4', id:this.getId('message')},
{tag:'ul', id:'directLogins', children:[]}
]},
{tag:'div', id:this.getId('lockPanel'), cls:'lockPanel', children:[
{tag:'div', htmlString:Clipperz.PM.Strings['lockDescription']},
{tag:'form', id:'lockDialogForm', children:[
{tag:'input', type:'password', id:this.getId('lockPassphrase')}
]},
{tag:'div', id:this.getId('unlock')}
]}
]});
this.getElement('lockPanel').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
YAHOO.ext.Element.get('lockBlock').show();
MochiKit.Signal.connect(YAHOO.ext.Element.get('lock').dom, 'onclick', this, 'doLockEventHandler');
new YAHOO.ext.Button(this.getId('unlock'), {text:Clipperz.PM.Strings['unlockButtonLabel'], handler:this.doUnlockEventHandler, scope:this, minWidth:0});
this.getElement('unlock').swallowEvent('click', true);
new Clipperz.PM.Components.PasswordEntropyDisplay(this.getElement('lockPassphrase'));
MochiKit.Signal.connect('lockDialogForm', 'onsubmit', this, 'doUnlockEventHandler');
this.getElement('cantentPanel').setVisibilityMode(YAHOO.ext.Element.DISPLAY);
//MochiKit.Logging.logDebug("<<< CompactInterface.render");
return result;
},
//-----------------------------------------------------
'directLoginAddedHandler': function(anEvent) {
this.redrawDirectLoginItems();
},
//-----------------------------------------------------
'compareDirectLogins': function(a, b) {
return MochiKit.Base.compare(a.label().toLowerCase(), b.label().toLowerCase());
},
//-----------------------------------------------------
'redrawDirectLoginItems': function() {
var template;
var allDirectLogins;
this.getElement('message').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
//MochiKit.Logging.logDebug(">>> CompactInterface.redrawDirectLoginItems");
//MochiKit.Logging.logDebug("--- CompactInterface.redrawDirectLoginItems - 0");
MochiKit.Iter.forEach(YAHOO.ext.Element.get('directLogins').getChildrenByTagName('li'), function(aDirectLoginElement) {
MochiKit.Signal.disconnectAll(aDirectLoginElement.dom);
//MochiKit.Logging.logDebug("disconnecting IMG " + aDirectLoginElement.getChildrenByTagName('img')[0].dom.src);
MochiKit.Signal.disconnectAll(aDirectLoginElement.getChildrenByTagName('img')[0].dom);
})
//MochiKit.Logging.logDebug("--- CompactInterface.redrawDirectLoginItems - 1");
YAHOO.ext.Element.get('directLogins').update("");
//MochiKit.Logging.logDebug("--- CompactInterface.redrawDirectLoginItems - 2");
allDirectLogins = MochiKit.Base.values(this.user().directLoginReferences());
//MochiKit.Logging.logDebug("--- CompactInterface.redrawDirectLoginItems - 3");
allDirectLogins.sort(this.compareDirectLogins);
//MochiKit.Logging.logDebug("--- CompactInterface.redrawDirectLoginItems - 4");
template = this.directLoginItemTemplate();
//MochiKit.Logging.logDebug("--- CompactInterface.redrawDirectLoginItems - 5");
MochiKit.Iter.forEach(allDirectLogins, MochiKit.Base.bind(function(aDirectLogin) {
var directLoginElement;
var faviconImageElementID;
faviconImageElementID = aDirectLogin.reference() + "_faviconIMG";
directLoginElement = template.append('directLogins', {
elementID:faviconImageElementID,
faviconUrl:aDirectLogin.fixedFavicon(),
directLoginTitle:aDirectLogin.label(),
directLoginReference:aDirectLogin.reference()
}, true);
//MochiKit.Logging.logDebug("--- CompactInterface.redrawDirectLoginItems - 6: " + recordElement.dom);
directLoginElement.addClassOnOver("hover");
MochiKit.Signal.connect(directLoginElement.dom, 'onclick', this, 'handleDirectLoginClick');
MochiKit.Signal.connect(faviconImageElementID, 'onload', this, 'handleLoadedFaviconImage');
MochiKit.Signal.connect(faviconImageElementID, 'onerror', aDirectLogin, 'handleMissingFaviconImage');
MochiKit.Signal.connect(faviconImageElementID, 'onabort', aDirectLogin, 'handleMissingFaviconImage');
// YAHOO.ext.Element.get(faviconImageElementID).dom.src = aDirectLogin.fixedFavicon();
}, this));
this.resetAutoLockTimer();
//MochiKit.Logging.logDebug("<<< CompactInterface.redrawDirectLoginItems");
},
//-----------------------------------------------------
'directLoginItemTemplate': function() {
if (this._directLoginItemTemplate == null) {
this._directLoginItemTemplate = Clipperz.YUI.DomHelper.createTemplate({tag:'li', id:'{directLoginReference}', children:[
{tag:'table', border:'0', cellpadding:'0', cellspacing:'0', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', width:'20', align:'center', valign:'top', children:[
{tag:'img', id:'{elementID}', src:'{faviconUrl}'}
]},
{tag:'td', valign:'top', children:[
{tag:'a', cls:'directLoginItemTitle', html:'{directLoginTitle}'}
]}
]}
]}
]}
]});
this._directLoginItemTemplate.compile();
}
return this._directLoginItemTemplate;
},
//-------------------------------------------------------------------------
'handleDirectLoginClick': function(anEvent) {
var directLoginReference;
//MochiKit.Logging.logDebug(">>> MainPanel.handleDirectLoginClick !!!");
directLoginReference = this.user().directLoginReferences()[anEvent.src().id];
this.openDirectLogin(directLoginReference);
this.resetAutoLockTimer();
//MochiKit.Logging.logDebug("<<< MainPanel.handleDirectLoginClick");
},
//-----------------------------------------------------
'openDirectLogin': function(aDirectLoginReference) {
var deferredResult;
var newWindow;
//MochiKit.Logging.logDebug(">>> MainPanel.openDirectLogin - " + aDirectLoginReference.label());
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("MainPanel.openDirectLogin - 1: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(aDirectLoginReference, 'setupJumpPageWindow'));
deferredResult.addCallback(MochiKit.Base.method(aDirectLoginReference, 'deferredDirectLogin'));
deferredResult.addCallback(function(aDirectLogin) {
aDirectLogin.runDirectLogin(newWindow);
});
newWindow = window.open(Clipperz.PM.Strings['directLoginJumpPageUrl'], "");
// MochiKit.Signal.connect(newWindow, 'onload', MochiKit.Base.method(deferredResult, 'callback', newWindow))
// MochiKit.Signal.connect(newWindow, 'onload', MochiKit.Base.partial(alert, "done"));
deferredResult.callback(newWindow);
//MochiKit.Logging.logDebug("<<< MainPanel.openDirectLogin");
},
//-------------------------------------------------------------------------
'handleLoadedFaviconImage': function(anEvent) {
//MochiKit.Logging.logDebug(">>> MainPanel.handleLoadedFaviconImage");
MochiKit.Signal.disconnectAll(anEvent.src())
//MochiKit.Logging.logDebug("<<< MainPanel.handleLoadedFaviconImage");
},
//-------------------------------------------------------------------------
'doLockEventHandler': function(anEvent) {
anEvent.stop();
this.lock();
},
'doUnlockEventHandler': function(anEvent) {
if (typeof(anEvent.stop) != 'undefined') {
anEvent.stop();
}
this.unlock();
},
//-------------------------------------------------------------------------
'autolock': function() {
var shouldAutoLock;
shouldAutoLock = YAHOO.ext.Element.get('autolock').dom.checked;
if (shouldAutoLock) {
this.lock();
} else {
this.resetAutoLockTimer();
}
},
'lock': function() {
//MochiKit.Logging.logDebug(">>> lock");
this.getDom('lockPassphrase').value = "";
this.getElement('lockPanel').show();
this.getElement('cantentPanel').hide();
YAHOO.ext.Element.get('lockBlock').hide();
//this.getElement('lockPassphrase').focus();
//MochiKit.Logging.logDebug("<<< lock");
},
'unlock': function(anEvent) {
//MochiKit.Logging.logDebug(">>> unlock");
if (this.getDom('lockPassphrase').value == this.user().passphrase()) {
this.getElement('lockPanel').hide();
this.getElement('cantentPanel').show();
YAHOO.ext.Element.get('lockBlock').show();
this.resetAutoLockTimer();
} else {
this.getDom('lockPassphrase').value = "";
this.getElement('lockPassphrase').focus();
}
//MochiKit.Logging.logDebug("<<< unlock");
},
//-------------------------------------------------------------------------
'user': function() {
return this._user;
},
//-----------------------------------------------------
'autoLockTimer': function() {
if (this._autoLockTimer == null) {
//MochiKit.Logging.logDebug("--- timer started - 1");
this._autoLockTimer = MochiKit.Async.callLater(60, MochiKit.Base.method(this, 'autolock'));
//MochiKit.Logging.logDebug("--- timer started - 2");
}
return this._autoLockTimer;
},
'resetAutoLockTimer': function() {
//MochiKit.Logging.logDebug(">>> timer resetted");
this.autoLockTimer().cancel();
this._autoLockTimer = null;
//MochiKit.Logging.logDebug("--- timer resetted - 1");
this.autoLockTimer();
//MochiKit.Logging.logDebug("<<< timer resetted");
},
//-----------------------------------------------------
'userNotificationHandler': function(anEvent) {
this.getElement('message').update(anEvent.parameters().text);
},
//-----------------------------------------------------
__syntaxFix__: '__syntaxFix__'
});

View File

@@ -0,0 +1,189 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.Compact) == 'undefined') { Clipperz.PM.Components.Compact = {}; }
Clipperz.PM.Components.Compact.LoginForm = function(anElement, args) {
Clipperz.PM.Components.Compact.LoginForm.superclass.constructor.call(this, anElement, args);
this.render();
Clipperz.NotificationCenter.register(null, 'updatedProgressState', this, 'userNotificationHandler')
return this;
};
YAHOO.extendX(Clipperz.PM.Components.Compact.LoginForm, Clipperz.PM.Components.BaseComponent, {
'toString': function() {
return "Clipperz.PM.Components.Compact.LoginForm";
},
//-----------------------------------------------------
'render': function() {
var result;
var layout;
MochiKit.Signal.disconnectAllTo(this);
this.element().update("");
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'div', id:this.getId('baseDiv'), cls:'LoginPanel', children:[
{tag:'div', id:'compactHeader'},
{tag:'div', id:'compactBody', children:[
{tag:'form', id:this.getId('loginForm_form'), children:[
{tag:'dl', children:[
{tag:'dt', htmlString:Clipperz.PM.Strings['loginFormUsernameLabel']},
{tag:'dd', children:[
{tag:'input', id:this.getId('login_username'), type:'text', size:'30', name:'username'}
]},
{tag:'dt', htmlString:Clipperz.PM.Strings['loginFormPassphraseLabel']},
{tag:'dd', children:[
{tag:'input', id:this.getId('login_passphrase'), type:'password', size:'30', name:'passphrase'}
]}
]},
{tag:'div', id:this.getId('login_submit')}
]},
{tag:'h4', id:this.getId('message')}
]}
]});
new Clipperz.PM.Components.Compact.CompactHeader(YAHOO.ext.Element.get('compactHeader'));
MochiKit.Signal.connect(this.getId('loginForm_form'), 'onsubmit', this, 'stopFormSubmit');
new YAHOO.ext.Button(this.getId('login_submit'), {text:Clipperz.PM.Strings['loginFormButtonLabel'], handler:this.doLogin, scope:this, minWidth:0});
this.getElement('login_submit').swallowEvent('click', true);
MochiKit.Signal.connect(this.getId('loginForm_form'), 'onkeydown', this, 'onkeydown');
new Clipperz.PM.Components.PasswordEntropyDisplay(this.getElement('login_passphrase'));
this.getElement('login_username').focus();
return result;
},
//-----------------------------------------------------
'doLogin': function(e) {
//MochiKit.Logging.logDebug(">>> compact.LoginForm.doLogin");
if (this.checkLoginForm()) {
this.doLoginWithUsernameAndPassphrase(this.getDom('login_username').value, this.getDom('login_passphrase').value);
}
//MochiKit.Logging.logDebug("<<< compact.LoginForm.doLogin");
},
//.........................................................................
'doLoginWithUsernameAndPassphrase': function(anUsername, aPassphrase) {
var deferredResult;
var user;
//MochiKit.Logging.logDebug(">>> compact.LoginForm.doLoginWithUsernameAndPassphrase");
user = new Clipperz.PM.DataModel.User({username:anUsername, passphrase:aPassphrase});
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(MochiKit.Base.method(user, 'connect'));
deferredResult.addCallback(MochiKit.Base.method(user, 'loadPreferences'));
deferredResult.addCallback(MochiKit.Base.method(user, 'loadRecords'));
deferredResult.addCallback(MochiKit.Base.method(user, 'loadDirectLogins'));
deferredResult.addErrback(MochiKit.Base.bind(function() {
this.getElement('loginForm_form').setVisibilityMode(YAHOO.ext.Element.DISPLAY).show();
this.getElement('message').update(Clipperz.PM.Strings['loginMessagePanelFailureText']);
this.getDom('login_passphrase').value = "";
this.getElement('login_passphrase').focus();
}, this))
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("compact.LoginForm.doLogin - 6: " + res); return res;});
deferredResult.callback("token");
//MochiKit.Logging.logDebug("<<< compact.LoginForm.doLoginWithUsernameAndPassphrase");
return deferredResult;
},
//.........................................................................
'checkLoginForm': function() {
var result;
var username
var passphrase;
//MochiKit.Logging.logDebug(">>> checkLoginForm");
username = this.getDom('login_username').value;
passphrase = this.getDom('login_passphrase').value;
if ((username != "") && (passphrase != "")) {
result = true;
} else {
if (username == "") {
this.getElement('login_username').focus();
} else if (passphrase == "") {
this.getElement('login_passphrase').focus();
}
result = false;
}
//MochiKit.Logging.logDebug("<<< checkLoginForm - " + result);
return result;
},
//-------------------------------------------------------------------------
'stopFormSubmit': function(anEvent) {
anEvent.stop();
},
//-------------------------------------------------------------------------
'onkeydown': function(anEvent) {
//MochiKit.Logging.logDebug(">>> onkeydown - " + anEvent.src().id);
if (anEvent.key().code == 13) {
this.doLogin();
anEvent.stop();
}
},
//-----------------------------------------------------
'userNotificationHandler': function(anEvent) {
//MochiKit.Logging.logDebug(">>> compact.LoginForm.userNotificationHandler");
//MochiKit.Logging.logDebug("userNotificationHandler - event: " + anEvent.event());
this.getElement('loginForm_form').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
if (this.getDom('message') != null) {
this.getElement('message').update(Clipperz.PM.Strings.messagePanelConfigurations[anEvent.parameters()]()['text']);
}
//MochiKit.Logging.logDebug("<<< compact.LoginForm.userNotificationHandler");
},
//-----------------------------------------------------
__syntaxFix__: '__syntaxFix__'
});

View File

@@ -0,0 +1,174 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.Import) == 'undefined') { Clipperz.PM.Components.Import = {}; }
if (typeof(Clipperz.PM.Components.Import.CSVImport) == 'undefined') { Clipperz.PM.Components.Import.CSVImport = {}; }
//#############################################################################
Clipperz.PM.Components.Import.CSVImport.CSVImportColumns = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.Import.CSVImport.CSVImportColumns.superclass.constructor.call(this, anElement, args);
this._mainComponent = args.mainComponent;
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.Import.CSVImport.CSVImportColumns, Clipperz.PM.Components.BaseComponent, {
'toString': function() {
return "Clipperz.PM.Components.Import.CSVImport.CSVImportColumns component";
},
//-------------------------------------------------------------------------
'mainComponent': function() {
return this._mainComponent;
},
//-------------------------------------------------------------------------
'render': function() {
var i,c;
var columnSelectorCheckboxCells;
var checkboxes;
var data;
//MochiKit.Logging.logDebug(">>> CSVImportColumns.render");
Clipperz.NotificationCenter.unregister(this);
MochiKit.Signal.disconnectAllTo(this);
this.element().update("");
data = this.mainComponent().parsedValues();
columnSelectorCheckboxCells = [];
c = data[0].length;
for (i=0; i<c; i++) {
columnSelectorCheckboxCells.push({tag:'th', valign:'top', cls:(this.mainComponent().isColumnSelected(i) ? 'selectedColumn': 'skippedColumn'), children:[
{tag:'input', type:'checkbox', id:this.getId('columnCheckbox_' + i), value:i}
]})
}
this.domHelper().append(this.element(), {tag:'div', children:[
{tag:'div', cls:'importStepDescription', htmlString:Clipperz.PM.Strings['CSV_ImportWizard_Columns']},
{tag:'div', id:this.getId('dataDiv'), cls:'csvImportPreview', children:[
{tag:'table', id:this.getId('previewDada'), cls:'csvImportPreview columns', cellspacing:'0', children:[
{tag:'thead', id:this.getId('previewData_thead'), children:[
{tag:'tr', children:columnSelectorCheckboxCells}
]},
{tag:'tbody', id:this.getId('previewData_tbody'), children:[]}
]}
]}
]});
c = data[0].length;
for (i=0; i<c; i++) {
if (this.mainComponent().isColumnSelected(i)) {
this.getDom('columnCheckbox_' + i).checked = true;
}
}
this.renderData(this.getElement('previewData_tbody'), data);
checkboxes = MochiKit.DOM.getElementsByTagAndClassName('input', null, this.getDom('previewData_thead'));
c = checkboxes.length;
for (i=0; i<c; i++) {
MochiKit.Signal.connect(checkboxes[i], 'onclick', this, 'renderDataHandler');
}
//MochiKit.Logging.logDebug("<<< CSVImportColumns.render");
},
//-------------------------------------------------------------------------
'renderData': function(anElement, someData) {
var config;
var i,c;
//MochiKit.Logging.logDebug(">>> CSVImportColumns.renderData");
// anElement.update("");
MochiKit.DOM.replaceChildNodes(anElement.dom);
config = MochiKit.Base.map(MochiKit.Base.bind(function(aRowData) {
var result;
var i,c;
result = {tag:'tr', children:[]};
c = aRowData.length;
for (i=0; i<c; i++) {
var field;
field = aRowData[i];
result.children.push({tag:'td', valign:'top', cls:(this.mainComponent().isColumnSelected(i) ? 'selectedColumn': 'skippedColumn'), html:(MochiKit.Base.isNotEmpty(field) ? field.replace(/\n/g, '<br>') : '&nbsp;')});
}
return result;
}, this), someData);
MochiKit.Base.map(function(aRowConfig) {Clipperz.YUI.DomHelper.append(anElement, aRowConfig);}, config);
Clipperz.Style.applyZebraStylesToTable(this.getId('previewDada'));
//MochiKit.Logging.logDebug("<<< CSVImportColumns.renderData");
},
//-------------------------------------------------------------------------
'renderDataHandler': function(anEvent) {
var thElement;
thElement = YAHOO.ext.Element.get(anEvent.src().parentNode);
if (anEvent.src().checked == true) {
this.mainComponent().skippedColumns().remove(anEvent.src().value);
thElement.addClass('selectedColumn');
thElement.removeClass('skippedColumn');
} else {
this.mainComponent().skippedColumns().add(anEvent.src().value);
thElement.removeClass('selectedColumn');
thElement.addClass('skippedColumn');
}
if (this.mainComponent().skippedColumns().allItems().length == this.mainComponent().parsedValues()[0].length) {
this.mainComponent().nextButton().disable();
} else {
this.mainComponent().nextButton().enable();
}
this.renderData(this.getElement('previewData_tbody'), this.mainComponent().parsedValues());
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,247 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.Import) == 'undefined') { Clipperz.PM.Components.Import = {}; }
if (typeof(Clipperz.PM.Components.Import.CSVImport) == 'undefined') { Clipperz.PM.Components.Import.CSVImport = {}; }
//#############################################################################
Clipperz.PM.Components.Import.CSVImport.CSVImportFields = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.Import.CSVImport.CSVImportFields.superclass.constructor.call(this, anElement, args);
this._mainComponent = args.mainComponent;
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.Import.CSVImport.CSVImportFields, Clipperz.PM.Components.BaseComponent, {
'toString': function() {
return "Clipperz.PM.Components.Import.CSVImport.CSVImportFields component";
},
//-------------------------------------------------------------------------
'mainComponent': function() {
return this._mainComponent;
},
//-------------------------------------------------------------------------
'render': function() {
var fieldsHeaderCells;
var titleColumnIndex;
var notesColumnIndex;
var i,c;
Clipperz.NotificationCenter.unregister(this);
MochiKit.Signal.disconnectAllTo(this);
this.element().update("");
titleColumnIndex = this.mainComponent().titleColumnIndex()
notesColumnIndex = this.mainComponent().notesColumnIndex()
fieldsHeaderCells = [];
fieldsHeaderCells.push({tag:'td', valign:'top', cls:'title', html:this.mainComponent().labelForColumn(titleColumnIndex)});
c = this.mainComponent().parsedValues()[0].length;
for (i=0; i<c; i++) {
if ((i != titleColumnIndex) && (i != notesColumnIndex) && (this.mainComponent().isColumnSelected(i))) {
var trimmedLabel;
trimmedLabel = Clipperz.Base.trim(this.mainComponent().labelForColumn(i));
fieldsHeaderCells.push({tag:'td', valign:'top', id:this.getId('fieldHeaderTD_' + i), cls:((trimmedLabel == "") ? 'missingLabelWarning' : (this.isColumnSetup(i) ? 'configuredColumn': 'unconfiguredColumn')), children:[
{tag:'span', html:((trimmedLabel == "") ? Clipperz.PM.Strings['CSV_ImportWizard_Fields_MissingLabelWarning'] : trimmedLabel)/*, cls:((trimmedLabel == "") ? 'missingLabelWarning' : '')*/},
{tag:'select', id:this.getId('select_' + i), name:i, children:[
{tag:'option', value:'UNDEFINED', html:"select data type", cls:'disabledOption'},
{tag:'option', value:'TXT', htmlString:Clipperz.PM.Strings['recordFieldTypologies']['TXT']['shortDescription']},
{tag:'option', value:'PWD', htmlString:Clipperz.PM.Strings['recordFieldTypologies']['PWD']['shortDescription']},
{tag:'option', value:'URL', htmlString:Clipperz.PM.Strings['recordFieldTypologies']['URL']['shortDescription']},
{tag:'option', value:'DATE', htmlString:Clipperz.PM.Strings['recordFieldTypologies']['DATE']['shortDescription']},
{tag:'option', value:'ADDR', htmlString:Clipperz.PM.Strings['recordFieldTypologies']['ADDR']['shortDescription']}
]}
]})
}
}
if (notesColumnIndex != -1) {
fieldsHeaderCells.push({tag:'td', valign:'top', cls:'notes', html:this.mainComponent().labelForColumn(notesColumnIndex)});
}
this.domHelper().append(this.element(), {tag:'div', children:[
{tag:'div', cls:'importStepDescription', htmlString:Clipperz.PM.Strings['CSV_ImportWizard_Fields']},
{tag:'div', id:this.getId('dataDiv'), children:[
{tag:'div', children:[
]},
{tag:'div', cls:'csvImportPreview', children:[
{tag:'table', id:this.getId('previewDada'), cls:'csvImportPreview', cellspacing:'0', children:[
{tag:'thead', id:this.getId('previewData_thead'), children:[
{tag:'tr', cls:'CSV_previewData_header', children:fieldsHeaderCells}
]},
{tag:'tbody', id:this.getId('previewData_tbody'), children:[]}
]}
]}
]}
]});
for (i=0; i<c; i++) {
if ((i != titleColumnIndex) && (i != notesColumnIndex) && (this.mainComponent().isColumnSelected(i))) {
Clipperz.DOM.selectOptionMatchingValue(this.getDom('select_' + i), this.mainComponent().typeForColumn(i));
MochiKit.Signal.connect(this.getDom('select_' + i), 'onchange', this, 'renderDataRowsHandler');
}
}
this.renderDataRows(this.getElement('previewData_tbody'));
// Clipperz.NotificationCenter.register(null, 'updatedCSVImportColumnHeader', this, 'renderDataRowsHandler');
},
//-------------------------------------------------------------------------
'isColumnSetup': function(aColumnIndex) {
return ((Clipperz.Base.trim(this.mainComponent().labelForColumn(aColumnIndex)) != "") && (this.mainComponent().typeForColumn(aColumnIndex) != 'UNDEFINED'));
},
//-------------------------------------------------------------------------
'renderDataRowsHandler': function(anEvent) {
var columnIndex;
var tdElement;
//MochiKit.Logging.logDebug(">>> renderDataRowsHandler")
columnIndex = anEvent.src().name;
this.mainComponent().setTypeForColumn(anEvent.src().value, columnIndex);
tdElement = this.getElement('fieldHeaderTD_' + columnIndex);
if (this.isColumnSetup(columnIndex)) {
tdElement.removeClass('unconfiguredColumn');
tdElement.addClass('configuredColumn');
} else {
tdElement.addClass('unconfiguredColumn');
tdElement.removeClass('configuredColumn');
}
this.renderDataRows(this.getElement('previewData_tbody'));
},
//-------------------------------------------------------------------------
'renderDataRows': function(anElement) {
var titleColumnIndex;
var notesColumnIndex;
var data
var i,c;
//MochiKit.Logging.logDebug("#### >> renderDataRows");
// anElement.update("");
MochiKit.DOM.replaceChildNodes(anElement.dom);
if (this.mainComponent().isFirstRowHeader()) {
data = this.mainComponent().parsedValues().slice(1);
} else {
data = this.mainComponent().parsedValues();
}
titleColumnIndex = this.mainComponent().titleColumnIndex();
notesColumnIndex = this.mainComponent().notesColumnIndex();
c = data.length;
for (i=0; i<c; i++) {
var rowData;
var rowConfig;
var ii, cc;
rowData = data[i];
rowConfig = {tag:'tr', children:[
{tag:'td', valign:'top', cls:'title', html:(MochiKit.Base.isNotEmpty(rowData[titleColumnIndex]) ? rowData[titleColumnIndex].replace(/\n/g, '<br>') : '&nbsp;')}
]};
cc = rowData.length;
for (ii=0; ii<cc; ii++) {
// if ((ii != titleColumnIndex) && (ii != notesColumnIndex)) {
if ((ii != titleColumnIndex) && (ii != notesColumnIndex) && (this.mainComponent().isColumnSelected(ii))) {
rowConfig.children.push({
tag:'td',
valign:'top',
cls:(this.isColumnSetup(ii) ? 'configuredColumn' : 'unconfiguredColumn'),
html:(MochiKit.Base.isNotEmpty(rowData[ii]) ? rowData[ii].replace(/\n/g, '<br>') : '&nbsp;')
});
}
}
if (notesColumnIndex != -1) {
rowConfig.children.push({tag:'td', valign:'top', cls:'notes', html:(MochiKit.Base.isNotEmpty(rowData[notesColumnIndex]) ? rowData[notesColumnIndex].replace(/\n/g, '<br>') : '&nbsp;')});
}
this.domHelper().append(anElement, rowConfig);
}
Clipperz.Style.applyZebraStylesToTable(this.getId('previewDada'));
this.checkWetherToEnableNextButton();
//MochiKit.Logging.logDebug("#### << renderDataRows");
},
//-------------------------------------------------------------------------
'checkWetherToEnableNextButton': function() {
var result;
var titleColumnIndex;
var notesColumnIndex;
var i,c;
titleColumnIndex = this.mainComponent().titleColumnIndex()
notesColumnIndex = this.mainComponent().notesColumnIndex()
result = true;
c = this.mainComponent().parsedValues()[0].length;
for (i=0; i<c; i++) {
if ((i != titleColumnIndex) && (i != notesColumnIndex) && (this.mainComponent().isColumnSelected(i))) {
result = result && this.isColumnSetup(i);
}
}
if (result) {
this.mainComponent().nextButton().enable();
} else {
this.mainComponent().nextButton().disable();
}
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,240 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.Import) == 'undefined') { Clipperz.PM.Components.Import = {}; }
if (typeof(Clipperz.PM.Components.Import.CSVImport) == 'undefined') { Clipperz.PM.Components.Import.CSVImport = {}; }
//#############################################################################
Clipperz.PM.Components.Import.CSVImport.CSVImportHeader = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.Import.CSVImport.CSVImportHeader.superclass.constructor.call(this, anElement, args);
this._mainComponent = args.mainComponent;
this._pendingDeferredLabelFieldHandlerEvents = 0;
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.Import.CSVImport.CSVImportHeader, Clipperz.PM.Components.BaseComponent, {
'toString': function() {
return "Clipperz.PM.Components.Import.CSVImport.CSVImportHeader component";
},
//-------------------------------------------------------------------------
'mainComponent': function() {
return this._mainComponent;
},
//-------------------------------------------------------------------------
'render': function() {
var thConfigs;
var i,c;
//MochiKit.Logging.logDebug(">>> CSVImportHeader.render");
Clipperz.NotificationCenter.unregister(this);
MochiKit.Signal.disconnectAllTo(this);
thConfigs = [];
c = this.mainComponent().parsedValues()[0].length;
for (i=0; i<c; i++) {
if (this.mainComponent().isColumnSelected(i)) {
// thConfigs.push({tag:'th', children:[{tag:'input', type:'text', id:this.getId('headerTextField_' + i), value:this.mainComponent().labelForColumn(i)}]});
thConfigs.push({tag:'th', children:[{tag:'input', type:'text', id:this.getId('headerTextField_' + i), value:""}]});
}
}
this.element().update("");
this.domHelper().append(this.element(), {tag:'div', children:[
{tag:'div', cls:'importStepDescription', htmlString:Clipperz.PM.Strings['CSV_ImportWizard_Header']},
{tag:'div', cls:'importStepParameters', children:[
{tag:'input', type:'checkbox', name:'isFistRowHeader', id:this.getId('isFirstRowHeader_checkbox')},
{tag:'span', id:this.getId('isFirstRowHeader_span'), cls:'clickableSpan', htmlString:Clipperz.PM.Strings['CSV_ImportWizard_Header_Settings_firstRowHeaderLabel']}
]},
{tag:'div', id:this.getId('dataDiv'), children:[
{tag:'div', cls:'csvImportPreview', children:[
{tag:'table', id:this.getId('previewDada'), cls:'csvImportPreview header', cellspacing:'0', children:[
{tag:'thead', children:[{tag:'tr', children:thConfigs}]},
{tag:'tbody', id:this.getId('previewData_tbody')}
]}
]}
]}
]});
for (i=0; i<c; i++) {
if (this.mainComponent().isColumnSelected(i)) {
this.getElement('headerTextField_' + i).dom.value = this.mainComponent().labelForColumn(i);
}
}
this.renderData(this.getElement('previewData_tbody'), this.mainComponent().parsedValues());
if (this.mainComponent().isFirstRowHeader()) {
this.getDom('isFirstRowHeader_checkbox').click();
}
c = this.mainComponent().parsedValues()[0].length;
for (i=0; i<c; i++) {
if (this.mainComponent().isColumnSelected(i)) {
MochiKit.Signal.connect(this.getDom('headerTextField_' + i), 'onchange', MochiKit.Base.partial(MochiKit.Base.method(this, 'labelFieldHandler'), i));
MochiKit.Signal.connect(this.getDom('headerTextField_' + i), 'onkeypress', MochiKit.Base.partial(MochiKit.Base.method(this, 'deferredLabelFieldHandler'), i));
}
}
MochiKit.Signal.connect(this.getDom('isFirstRowHeader_checkbox'), 'onclick', this, 'toggleFirstRowHeaderCheckboxHandler');
if (Clipperz_IEisBroken != true) {
MochiKit.Signal.connect(this.getDom('isFirstRowHeader_span'), 'onclick', this.getDom('isFirstRowHeader_checkbox'), 'click');
}
//MochiKit.Logging.logDebug("<<< CSVImportHeader.render");
},
//-------------------------------------------------------------------------
'renderData': function(anElement, someData) {
var trConfigs;
var data;
var i,c;
// anElement.update("");
MochiKit.DOM.replaceChildNodes(anElement.dom);
if (this.mainComponent().isFirstRowHeader()) {
data = someData.slice(1);
} else {
data = someData;
}
trConfigs = MochiKit.Base.map(MochiKit.Base.bind(function(aRowData) {
var result;
var i,c;
result = {tag:'tr', children:[]};
c = aRowData.length;
for (i=0; i<c; i++) {
if (this.mainComponent().isColumnSelected(i)) {
result.children.push({tag:'td', valign:'top', html:(MochiKit.Base.isNotEmpty(aRowData[i]) ? aRowData[i].replace(/\n/g, '<br>') : '&nbsp;')});
}
}
return result;
}, this), data);
MochiKit.Base.map(function(aRowConfig) {Clipperz.YUI.DomHelper.append(anElement, aRowConfig);}, trConfigs);
Clipperz.Style.applyZebraStylesToTable(this.getId('previewDada'));
},
//-------------------------------------------------------------------------
'toggleFirstRowHeaderCheckboxHandler': function() {
var firstRowData;
var i,c;
//MochiKit.Logging.logDebug(">>> toggleFirstRowHeaderCheckboxHandler");
this.mainComponent().setIsFirstRowHeader(this.getDom('isFirstRowHeader_checkbox').checked);
firstRowData = this.mainComponent().parsedValues()[0];
c = firstRowData.length;
for (i=0; i<c; i++) {
if (this.mainComponent().isColumnSelected(i)) {
var label;
if (this.mainComponent().isFirstRowHeader()) {
label = firstRowData[i];
} else {
label = null;
}
this.mainComponent().setLabelForColumn(label, i);
}
};
this.updateInputFieldValues();
this.renderData(this.getElement('previewData_tbody'), this.mainComponent().parsedValues());
//MochiKit.Logging.logDebug("<<< toggleFirstRowHeaderCheckboxHandler");
},
//-------------------------------------------------------------------------
'updateInputFieldValues': function() {
var i,c;
//MochiKit.Logging.logDebug(">>> updateInputFieldValues");
c = this.mainComponent().parsedValues()[0].length;
for (i=0; i<c; i++) {
if (this.mainComponent().isColumnSelected(i)) {
this.getDom('headerTextField_' + i).value = this.mainComponent().labelForColumn(i);
}
}
//console.log('[1] fieldSettings', fieldSettings);
//MochiKit.Logging.logDebug("<<< updateInputFieldValues");
},
//-------------------------------------------------------------------------
'labelFieldHandler': function(aColumnIndex, anEvent) {
var inputField;
//MochiKit.Logging.logDebug(">>> labelFieldHandler");
inputField = anEvent.src();
this.mainComponent().setLabelForColumn(inputField.value, aColumnIndex);
//MochiKit.Logging.logDebug("##### [" + anEvent.src().id + "] -> label[" + aColumnIndex + "]: '" + inputField.value + "'");
//MochiKit.Logging.logDebug("<<< labelFieldHandler");
},
'deferredLabelFieldHandler': function(aColumnIndex, anEvent) {
//MochiKit.Logging.logDebug(">>> deferredLabelFieldHandler");
this._pendingDeferredLabelFieldHandlerEvents ++;
MochiKit.Async.callLater(1, MochiKit.Base.partial(MochiKit.Base.method(this, 'deferredLabelFieldHandlerCatcher'), aColumnIndex, anEvent));
//MochiKit.Logging.logDebug("<<< deferredLabelFieldHandler");
},
'deferredLabelFieldHandlerCatcher': function(aColumnIndex, anEvent) {
//MochiKit.Logging.logDebug(">>> deferredLabelFieldHandlerCatcher");
this._pendingDeferredLabelFieldHandlerEvents --;
if (this._pendingDeferredLabelFieldHandlerEvents == 0) {
this.labelFieldHandler(aColumnIndex, anEvent);
}
//MochiKit.Logging.logDebug("<<< deferredLabelFieldHandlerCatcher");
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,212 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.Import) == 'undefined') { Clipperz.PM.Components.Import = {}; }
if (typeof(Clipperz.PM.Components.Import.CSVImport) == 'undefined') { Clipperz.PM.Components.Import.CSVImport = {}; }
//#############################################################################
Clipperz.PM.Components.Import.CSVImport.CSVImportNotes = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.Import.CSVImport.CSVImportNotes.superclass.constructor.call(this, anElement, args);
this._mainComponent = args.mainComponent;
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.Import.CSVImport.CSVImportNotes, Clipperz.PM.Components.BaseComponent, {
'toString': function() {
return "Clipperz.PM.Components.Import.CSVImport.CSVImportNotes component";
},
//-------------------------------------------------------------------------
'mainComponent': function() {
return this._mainComponent;
},
//-------------------------------------------------------------------------
'render': function() {
var notesSelectorCheckboxCells;
var totalNumberOfColumns;
var titleColumnIndex;
var notesColumnIndex;
var i,c;
Clipperz.NotificationCenter.unregister(this);
MochiKit.Signal.disconnectAllTo(this);
this.element().update("");
titleColumnIndex = this.mainComponent().titleColumnIndex()
notesColumnIndex = this.mainComponent().notesColumnIndex()
totalNumberOfColumns = this.mainComponent().parsedValues()[0].length;
notesSelectorCheckboxCells = [{tag:'th', cls:'title', html:this.mainComponent().labelForColumn(titleColumnIndex)}];
c = totalNumberOfColumns;
for (i=0; i<c; i++) {
if ((i != titleColumnIndex) && (this.mainComponent().isColumnSelected(i))) {
notesSelectorCheckboxCells.push({tag:'th', id:this.getId('th_' + i), valign:'top', children:[
{tag:'input', type:'radio', id:this.getId('radio_' + i), name:'CSVImportNotesColumn', value:i},
{tag:'span', cls:'clickableSpan', id:this.getId('columnLabel_' + i), html:this.mainComponent().labelForColumn(i)}
]})
}
}
this.domHelper().append(this.element(), {tag:'div', children:[
{tag:'div', cls:'importStepDescription', htmlString:Clipperz.PM.Strings['CSV_ImportWizard_Notes']},
{tag:'div', id:this.getId('dataDiv'), children:[
{tag:'div', cls:'importStepParameters', children:[
{tag:'input', id:this.getId('doNotSetNotes_radio'), type:'radio', name:'CSVImportNotesColumn', value:-1},
{tag:'span', id:this.getId('doNotSetNotes_span'), cls:'clickableSpan', htmlString:Clipperz.PM.Strings['CSV_ImportWizard_Notes_Settings_noSelectionLabel']}
]},
{tag:'div', cls:'csvImportPreview', children:[
{tag:'table', id:this.getId('previewDada'), cls:'csvImportPreview', cellspacing:'0', children:[
{tag:'thead', id:this.getId('previewData_thead'), children:[
{tag:'tr', children:notesSelectorCheckboxCells}
]},
{tag:'tbody', id:this.getId('previewData_tbody'), children:[]}
]}
]}
]}
]});
this.renderData(this.getElement('previewData_tbody'), this.mainComponent().parsedValues());
if ((notesColumnIndex >= totalNumberOfColumns) || (notesColumnIndex == titleColumnIndex) || !(this.mainComponent().isColumnSelected(notesColumnIndex))) {
this.mainComponent().setNotesColumnIndex(-1);
notesColumnIndex = -1;
}
c = totalNumberOfColumns;
for (i=0; i<c; i++) {
if ((i != titleColumnIndex) && (this.mainComponent().isColumnSelected(i))) {
MochiKit.Signal.connect(this.getDom('radio_' + i), 'onclick', this, 'renderDataHandler');
if (Clipperz_IEisBroken != true) {
MochiKit.Signal.connect(this.getDom('columnLabel_' + i), 'onclick', this.getDom('radio_' + i), 'click');
}
}
}
MochiKit.Signal.connect(this.getDom('doNotSetNotes_radio'), 'onclick', this, 'renderDataHandler');
if (Clipperz_IEisBroken != true) {
MochiKit.Signal.connect(this.getDom('doNotSetNotes_span'), 'onclick', this.getDom('doNotSetNotes_radio'), 'click');
}
if (notesColumnIndex == -1) {
this.getDom('doNotSetNotes_radio').click();
} else {
this.getDom('radio_' + notesColumnIndex).click();
}
},
//-------------------------------------------------------------------------
'renderData': function(anElement, someData) {
var data;
var config;
var titleColumnIndex;
var notesColumnIndex;
var i,c;
// anElement.update("");
MochiKit.DOM.replaceChildNodes(anElement.dom);
titleColumnIndex = this.mainComponent().titleColumnIndex();
notesColumnIndex = this.mainComponent().notesColumnIndex();
if (this.mainComponent().isFirstRowHeader()) {
data = someData.slice(1);
} else {
data = someData;
}
// config = [{tag:'tr', cls:'CSV_previewData_header', children:[{tag:'td', valign:'top', html:header[titleColumnIndex], cls:'title'}]}];
// c = header.length;
// for (i=0; i<c; i++) {
// if (i != titleColumnIndex) {
// config[0].children.push({tag:'td', valign:'top', html:header[i], cls:((notesColumnIndex == i) ? 'notesColumn': '')})
// }
// }
config = MochiKit.Base.map(MochiKit.Base.bind(function(aTitleColumnIndex, aRowData) {
var result;
var i,c;
result = {tag:'tr', children:[{tag:'td', valign:'top', cls:'title', html:(MochiKit.Base.isNotEmpty(aRowData[aTitleColumnIndex]) ? aRowData[aTitleColumnIndex].replace(/\n/g, '<br>') : '&nbsp;')}]};
c = aRowData.length;
for (i=0; i<c; i++) {
if ((i != titleColumnIndex) && (this.mainComponent().isColumnSelected(i))) {
result.children.push({tag:'td', valign:'top', cls:((notesColumnIndex == i) ? 'notesColumn': ''), html:(MochiKit.Base.isNotEmpty(aRowData[i]) ? aRowData[i].replace(/\n/g, '<br>') : '&nbsp;')});
}
}
return result;
}, this, titleColumnIndex), data);
MochiKit.Base.map(function(aRowConfig) {Clipperz.YUI.DomHelper.append(anElement, aRowConfig);}, config);
Clipperz.Style.applyZebraStylesToTable(this.getId('previewDada'));
},
//-------------------------------------------------------------------------
'renderDataHandler': function(anEvent) {
var titleColumnIndex;
var i,c;
this.mainComponent().setNotesColumnIndex(anEvent.src().value);
titleColumnIndex = this.mainComponent().titleColumnIndex();
c = this.mainComponent().parsedValues()[0].length;
for (i=0; i<c; i++) {
if ((i != titleColumnIndex) && (this.mainComponent().isColumnSelected(i))) {
this.getElement('th_' + i).removeClass('notesColumn');
}
}
if (anEvent.src().value != -1) {
this.getElement('th_' + anEvent.src().value).addClass('notesColumn');
}
this.renderData(this.getElement('previewData_tbody'), this.mainComponent().parsedValues());
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,189 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.Import) == 'undefined') { Clipperz.PM.Components.Import = {}; }
if (typeof(Clipperz.PM.Components.Import.CSVImport) == 'undefined') { Clipperz.PM.Components.Import.CSVImport = {}; }
//#############################################################################
Clipperz.PM.Components.Import.CSVImport.CSVImportTitle = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.Import.CSVImport.CSVImportTitle.superclass.constructor.call(this, anElement, args);
this._mainComponent = args.mainComponent;
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.Import.CSVImport.CSVImportTitle, Clipperz.PM.Components.BaseComponent, {
'toString': function() {
return "Clipperz.PM.Components.Import.CSVImport.CSVImportTitle component";
},
//-------------------------------------------------------------------------
'mainComponent': function() {
return this._mainComponent;
},
//-------------------------------------------------------------------------
'render': function() {
var titleSelectorCheckboxCells;
var titleColumnIndex;
var i,c;
Clipperz.NotificationCenter.unregister(this);
MochiKit.Signal.disconnectAllTo(this);
this.element().update("");
titleColumnIndex = this.mainComponent().titleColumnIndex()
titleSelectorCheckboxCells = [];
c = this.mainComponent().parsedValues()[0].length;
for (i=0; i<c; i++) {
if (this.mainComponent().isColumnSelected(i)) {
titleSelectorCheckboxCells.push({tag:'th', valign:'top', id:this.getId('th_' + i), children:[
{tag:'input', type:'radio', id:this.getId('radio_' + i), name:'CSVImportTitleColumn', value:i},
{tag:'span', cls:'clickableSpan', id:this.getId('columnLabel_' + i), html:this.mainComponent().labelForColumn(i)}
]})
}
}
if (titleColumnIndex >= titleSelectorCheckboxCells.length) {
this.mainComponent().setTitleColumnIndex(-1);
}
this.domHelper().append(this.element(), {tag:'div', children:[
{tag:'div', cls:'importStepDescription', htmlString:Clipperz.PM.Strings['CSV_ImportWizard_Title']},
{tag:'div', id:this.getId('dataDiv'), cls:'csvImportPreview', children:[
{tag:'table', id:this.getId('previewDada'), cls:'csvImportPreview', cellspacing:'0', children:[
{tag:'thead', id:this.getId('previewData_thead'), children:[
{tag:'tr', children:titleSelectorCheckboxCells}
]},
{tag:'tbody', id:this.getId('previewData_tbody'), children:[]}
]}
]}
]});
this.renderData(this.getElement('previewData_tbody'), this.mainComponent().parsedValues());
c = this.mainComponent().parsedValues()[0].length;
for (i=0; i<c; i++) {
if (this.mainComponent().isColumnSelected(i)) {
MochiKit.Signal.connect(this.getDom('radio_' + i), 'onclick', this, 'renderDataHandler');
if (Clipperz_IEisBroken != true) {
MochiKit.Signal.connect(this.getDom('columnLabel_' + i), 'onclick', this.getDom('radio_' + i), 'click');
}
}
}
if (titleColumnIndex != -1) {
this.getDom('radio_' + titleColumnIndex).click();
} else {
this.mainComponent().nextButton().disable();
}
},
//-------------------------------------------------------------------------
'renderData': function(anElement, someData) {
var data;
var config;
var titleColumnIndex;
var i,c;
// anElement.update("");
MochiKit.DOM.replaceChildNodes(anElement.dom);
titleColumnIndex = this.mainComponent().titleColumnIndex()
if (this.mainComponent().isFirstRowHeader()) {
data = someData.slice(1);
} else {
data = someData;
}
config = MochiKit.Base.map(MochiKit.Base.bind(function(aRowData) {
var result;
var i,c;
result = {tag:'tr', children:[]};
c = aRowData.length;
for (i=0; i<c; i++) {
if (this.mainComponent().isColumnSelected(i)) {
var field;
field = aRowData[i];
result.children.push({tag:'td', valign:'top', cls:((titleColumnIndex == i) ? 'titleColumn': ''), html:(MochiKit.Base.isNotEmpty(field) ? field.replace(/\n/g, '<br>') : '&nbsp;')});
}
}
return result;
}, this), data);
MochiKit.Base.map(function(aRowConfig) {Clipperz.YUI.DomHelper.append(anElement, aRowConfig);}, config);
Clipperz.Style.applyZebraStylesToTable(this.getId('previewDada'));
},
//-------------------------------------------------------------------------
'renderDataHandler': function(anEvent) {
var i,c;
this.mainComponent().setTitleColumnIndex(anEvent.src().value);
c = this.mainComponent().parsedValues()[0].length;
for (i=0; i<c; i++) {
if (this.mainComponent().isColumnSelected(i)) {
this.getElement('th_' + i).removeClass('titleColumn');
}
}
this.getElement('th_' + anEvent.src().value).addClass('titleColumn');
if (anEvent.src().value != -1) {
this.mainComponent().nextButton().enable();
} else {
this.mainComponent().nextButton().disable();
}
this.renderData(this.getElement('previewData_tbody'), this.mainComponent().parsedValues());
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,548 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.Import) == 'undefined') { Clipperz.PM.Components.Import = {}; }
//#############################################################################
Clipperz.PM.Components.Import.CSVImportComponent = function(anElement, args) {
args = args || {};
this._steps = this._steps || ['CSV_EDIT', 'CSV_COLUMNS', 'CSV_HEADER', 'CSV_TITLE', 'CSV_NOTES', 'CSV_FIELDS', 'PREVIEW', 'IMPORT'];
Clipperz.PM.Components.Import.CSVImportComponent.superclass.constructor.call(this, anElement, args);
this._step1Component = null;
this._step2Component = null;
this._step3Component = null;
this._step4Component = null;
this._step5Component = null;
this._isFirstRowHeader = false;
this._titleColumnIndex = -1;
this._notesColumnIndex = -1;
this._fieldSettings = {};
this._skippedColumns = new Clipperz.Set();
this.render();
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.Import.CSVImportComponent, Clipperz.PM.Components.Import.GenericImportComponent, {
'toString': function() {
return "Clipperz.PM.Components.Import.CSVImportComponent component";
},
//-------------------------------------------------------------------------
'render': function() {
this.domHelper().append(this.element(), {tag:'div', cls:'csvImportWizard', children:[
{tag:'h3', htmlString:Clipperz.PM.Strings['CSV_ImportWizard_Title']},
{tag:'div', cls:'importSteps', id:this.getId('importSteps')},
{tag:'div', cls:'importStepBlocks', children:[
{tag:'div', cls:'step_0', id:this.getId('step_0'), children:[
{tag:'div', children:[
{tag:'div', cls:'importOptionsDescription', htmlString:Clipperz.PM.Strings['importOptions_csv_description']},
{tag:'div', cls:'importOptionsParameters', children:[
{tag:'div', cls:'CSVImportOptionsParameters', children:[
{tag:'ul', children:[
{tag:'li', children:[
{tag:'label', 'for':this.getId('CSV_inputOptions_separator'), html:"separator"},
{tag:'select', name:this.getId('CSV_inputOptions_separator'), id:this.getId('CSV_inputOptions_separator'), children:[
{tag:'option', name:'comma', value:',', html:"comma (,)", selected:true},
{tag:'option', name:'tab', value:'\t', html:"tab"}
]}
]},
{tag:'li', children:[
{tag:'label', 'for':this.getId('CSV_inputOptions_quote'), html:"quote"},
{tag:'select', name:this.getId('CSV_inputOptions_quote'), id:this.getId('CSV_inputOptions_quote'), children:[
{tag:'option', name:'doubleQuote', value:'\"', html:"double quote (\")", selected:true},
{tag:'option', name:'singleQuote', value:'\'', html:"single quote (\')"}
]}
]},
{tag:'li', children:[
{tag:'label', 'for':this.getId('CSV_inputOptions_escape'), html:"escape"},
{tag:'select', name:this.getId('CSV_inputOptions_escape'), id:this.getId('CSV_inputOptions_escape'), children:[
{tag:'option', name:'doubleQuote', value:'\"', html:"double quote (\")", selected:true},
{tag:'option', name:'slash', value:'\/', html:"slash (\/)"},
{tag:'option', name:'backslash', value:'\\', html:"backslash (\\)"}
]}
]}
]}
]}
]},
this.textAreaConfig()
]}
]},
{tag:'div', cls:'step_1', id:this.getId('step_1'), children:[]},
{tag:'div', cls:'step_2', id:this.getId('step_2'), children:[]},
{tag:'div', cls:'step_3', id:this.getId('step_3'), children:[]},
{tag:'div', cls:'step_4', id:this.getId('step_4'), children:[]},
{tag:'div', cls:'step_5', id:this.getId('step_5'), children:[]},
{tag:'div', cls:'step_6', id:this.getId('step_6'), children:[
{tag:'div', children:[
{tag:'div', id:this.getId('previewDiv'), html:"preview"}
]}
]},
{tag:'div', cls:'step_7', id:this.getId('step_7'), children:[
{tag:'div', children:[
{tag:'h4', html:"done"}
]}
]}
]},
{tag:'div', cls:'importOptionsButtons', children:[
{tag:'table', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', html:'&nbsp;'},
{tag:'td', children:[
{tag:'div', id:this.getId('backActionButton')}
]},
{tag:'td', html:'&nbsp;'},
{tag:'td', children:[
{tag:'div', id:this.getId('nextActionButton')}
]},
{tag:'td', html:'&nbsp;'}
]}
]}
]}
]}
]});
this.setBackButton(new YAHOO.ext.Button(this.getDom('backActionButton'), {text:"back", handler:this.backAction, scope:this}));
this.setNextButton(new YAHOO.ext.Button(this.getDom('nextActionButton'), {text:"next", handler:this.nextAction, scope:this}));
this.updateSteps();
this.getElement('step_0').setVisibilityMode(YAHOO.ext.Element.DISPLAY).show()
this.getElement('step_1').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
this.getElement('step_2').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
this.getElement('step_3').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
this.getElement('step_4').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
this.getElement('step_5').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
this.getElement('step_6').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
this.getElement('step_7').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
// this.backButton().disable();
},
//-------------------------------------------------------------------------
'nextAction': function() {
switch (this.currentStep()) {
case 0: // -> 1
Clipperz.PM.Components.MessageBox.showProgressPanel(
MochiKit.Base.method(this, 'deferredParseValues'),
MochiKit.Base.method(this, 'handleParseError'),
this.getDom('nextActionButton')
);
break;
case 1: // -> 2
this.getElement('step_1').hide();
this.step2Component().render();
this.setCurrentStep(2);
this.getElement('step_2').show();
break;
case 2: // -> 3
this.getElement('step_2').hide();
this.step3Component().render();
this.setCurrentStep(3);
this.getElement('step_3').show();
break;
case 3: // -> 4
this.getElement('step_3').hide();
this.step4Component().render();
this.setCurrentStep(4);
this.getElement('step_4').show();
break;
case 4: // -> 5
this.getElement('step_4').hide();
this.step5Component().render();
this.setCurrentStep(5);
this.getElement('step_5').show();
break;
case 5: // -> 6
this.previewValues();
break;
case 6: // -> 7
this.importValues();
break;
}
},
//-------------------------------------------------------------------------
'deferredParseValues': function() {
var deferredResult;
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("CSVImportComponent.deferredParseValues - 1 " + res.substring(0,50)); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'parseImportData');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("CSVImportComponent.deferredParseValues - 2 " + res.substring(0,50)); return res;});
deferredResult.addCallback(MochiKit.Base.bind(function(res) {
this.startProcessing();
return res;
}, this));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("CSVImportComponent.deferredParseValues - 3 " + res.substring(0,50)); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'parseCSVValues'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("CSVImportComponent.deferredParseValues - 4 " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'setParsedValues'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("CSVImportComponent.deferredParseValues - 5 " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.step1Component(), 'render'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("CSVImportComponent.deferredParseValues - 6 " + res); return res;});
deferredResult.addCallback(MochiKit.Base.bind(function(res) {
this.processingDone();
this.getElement('step_0').hide();
this.getElement('step_1').show();
this.backButton().enable();
return res;
}, this));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("CSVImportComponent.deferredParseValues - 7 " + res); return res;});
deferredResult.callback(this.textAreaContent());
return deferredResult;
},
//-------------------------------------------------------------------------
'deferredPreviewValues': function() {
var deferredResult;
//MochiKit.Logging.logDebug(">>> CSVImportComponent.deferredPreviewValues");
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.deferredPreviewValues - 1 " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'previewImportData');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.deferredPreviewValues - 2 " + res); return res;});
deferredResult.addCallback(MochiKit.Base.bind(function(res) {
this.startProcessing();
return res;
}, this));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.deferredPreviewValues - 3 " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'processCSVParsedValues'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.deferredPreviewValues - 4 " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'setProcessedValues'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.deferredPreviewValues - 5 " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'previewRecordValues'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.deferredPreviewValues - 6 " + res); return res;});
deferredResult.addCallback(MochiKit.Base.bind(function(res) {
this.processingDone();
this.getElement('step_5').hide();
this.getElement('step_6').show();
this.backButton().enable();
return res;
}, this));
deferredResult.callback(this.parsedValues());
//MochiKit.Logging.logDebug("<<< CSVImportComponent.deferredPreviewValues");
return deferredResult;
},
//-------------------------------------------------------------------------
'csvProcessor': function() {
return new Clipperz.CSVProcessor({
quoteChar: this.getDom('CSV_inputOptions_quote').value,
escapeChar: this.getDom('CSV_inputOptions_escape').value,
separatorChar: this.getDom('CSV_inputOptions_separator').value,
binary:true
});
},
//-------------------------------------------------------------------------
'parseCSVValues': function(someData) {
var deferredResult;
var csvProcessor;
csvProcessor = this.csvProcessor();
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.parseKeePassValues - 1 " + res.substring(0,50)); return res;});
deferredResult.addCallback(function(res) {
return Clipperz.NotificationCenter.deferredNotification(this, 'updatedProgressState', {steps:(res.length)}, res);
})
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.parseKeePassValues - 2 " + res.substring(0,50)); return res;});
deferredResult.addCallback(MochiKit.Base.method(csvProcessor, 'deferredParse'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.parseKeePassValues - 3 " + res); return res;});
deferredResult.callback(someData);
return deferredResult;
},
//-------------------------------------------------------------------------
'processCSVParsedValues': function (someValues) {
var deferredResult;
var records;
var titleColumnIndex;
var notesColumnIndex;
var i,c;
deferredResult = new MochiKit.Async.Deferred();
records = [];
titleColumnIndex = this.titleColumnIndex();
notesColumnIndex = this.notesColumnIndex();
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', {steps:(someValues.length)});
c = someValues.length;
if (this.isFirstRowHeader()) {
i = 1;
} else {
i = 0;
}
for( ; i<c; i++) {
deferredResult.addCallback(MochiKit.Async.wait, 0.2);
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', {});
deferredResult.addCallback(MochiKit.Base.bind(function(someRecords, someData) {
var record;
var recordVersion;
var ii;
record = new Clipperz.PM.DataModel.Record({user:this.user()});
record.setLabel(someData[titleColumnIndex]);
if (notesColumnIndex != -1) {
record.setNotes(someData[notesColumnIndex]);
}
recordVersion = record.currentVersion()
for (ii in someData) {
// if ((ii != titleColumnIndex) && (ii != notesColumnIndex) && (typeof(this.fieldSettings()[ii]) != 'undefined')) {
if ((ii != titleColumnIndex) && (ii != notesColumnIndex) && (this.isColumnSelected(ii))) {
var recordField;
recordField = new Clipperz.PM.DataModel.RecordField({
recordVersion: recordVersion,
label: this.labelForColumn(ii),
value: someData[ii],
type: this.typeForColumn(ii)
});
recordVersion.addField(recordField);
}
}
someRecords.push(record);
return someRecords;
}, this), records, someValues[i]);
}
deferredResult.addCallback(MochiKit.Async.succeed, records);
deferredResult.callback();
return deferredResult;
},
//-------------------------------------------------------------------------
'step1Component': function() {
if (this._step1Component == null) {
this._step1Component = new Clipperz.PM.Components.Import.CSVImport.CSVImportColumns(this.getElement('step_1'), {mainComponent:this});
}
return this._step1Component;
},
'step2Component': function() {
if (this._step2Component == null) {
this._step2Component = new Clipperz.PM.Components.Import.CSVImport.CSVImportHeader(this.getElement('step_2'), {mainComponent:this});
}
return this._step2Component;
},
'step3Component': function() {
if (this._step3Component == null) {
this._step3Component = new Clipperz.PM.Components.Import.CSVImport.CSVImportTitle(this.getElement('step_3'), {mainComponent:this});
}
return this._step3Component;
},
'step4Component': function() {
if (this._step4Component == null) {
this._step4Component = new Clipperz.PM.Components.Import.CSVImport.CSVImportNotes(this.getElement('step_4'), {mainComponent:this});
}
return this._step4Component;
},
'step5Component': function() {
if (this._step5Component == null) {
this._step5Component = new Clipperz.PM.Components.Import.CSVImport.CSVImportFields(this.getElement('step_5'), {mainComponent:this});
}
return this._step5Component;
},
//-------------------------------------------------------------------------
'isFirstRowHeader': function() {
return this._isFirstRowHeader;
},
'setIsFirstRowHeader': function(aValue) {
this._isFirstRowHeader = aValue;
},
//-------------------------------------------------------------------------
'titleColumnIndex': function() {
return this._titleColumnIndex;
},
'setTitleColumnIndex': function(aValue) {
this._titleColumnIndex = aValue;
},
//-------------------------------------------------------------------------
'notesColumnIndex': function() {
return this._notesColumnIndex;
},
'setNotesColumnIndex': function(aValue) {
this._notesColumnIndex = aValue;
},
//-------------------------------------------------------------------------
'fieldSettings': function() {
return this._fieldSettings;
},
//-------------------------------------------------------------------------
'skippedColumns': function() {
return this._skippedColumns;
},
//-------------------------------------------------------------------------
'isColumnSelected': function(aColumnIndex) {
return !this.skippedColumns().contains("" + aColumnIndex);
},
//=========================================================================
'labelForColumn': function(aColumnIndex) {
var result;
if ((typeof(this.fieldSettings()) != 'undefined') && (typeof(this.fieldSettings()[aColumnIndex]) != 'undefined')) {
if (this.isFirstRowHeader()) {
result = this.fieldSettings()[aColumnIndex]['_firstRowLabel'];
//MochiKit.Logging.logDebug("--- updateInputFieldValues - [" + aColumnIndex + "] _firstRowLabel: " + label);
} else {
result = this.fieldSettings()[aColumnIndex]['_emptyLabel'];
//MochiKit.Logging.logDebug("--- updateInputFieldValues - [" + aColumnIndex + "] _emptyLabel: " + label);
}
} else {
result = "";
}
return result;
},
//-------------------------------------------------------------------------
'setLabelForColumn': function(aLabel, aColumnIndex) {
var fieldSettings;
//MochiKit.Logging.logDebug(">>> setLabelForColumn[" + aColumnIndex + "]: " + aLabel);
fieldSettings = this.fieldSettings();
if (typeof(fieldSettings[aColumnIndex]) == 'undefined') {
fieldSettings[aColumnIndex] = {}
}
if (this.isFirstRowHeader()) {
//MochiKit.Logging.logDebug("--- setLabelForColumn -> _firstRowLabel");
fieldSettings[aColumnIndex]['_firstRowLabel'] = aLabel;
} else {
if (typeof(fieldSettings[aColumnIndex]['_emptyLabel']) == 'undefined') {
if (aLabel == null) {
//MochiKit.Logging.logDebug("--- setLabelForColumn -> _emptyLabel = \"\"");
fieldSettings[aColumnIndex]['_emptyLabel'] = "";
} else {
fieldSettings[aColumnIndex]['_emptyLabel'] = aLabel;
}
} else {
//MochiKit.Logging.logDebug("--- setLabelForColumn -> _emptyLabel = " + aLabel);
if (aLabel != null) {
fieldSettings[aColumnIndex]['_emptyLabel'] = aLabel;
}
}
}
//MochiKit.Logging.logDebug("<<< setLabelForColumn[" + aColumnIndex + "]: " + aLabel);
},
//=========================================================================
'typeForColumn': function(aColumnIndex) {
var result;
if ((typeof(this.fieldSettings()) != 'undefined') && (typeof(this.fieldSettings()[aColumnIndex]) != 'undefined') && (typeof(this.fieldSettings()[aColumnIndex]['type']) != 'undefined')) {
result = this.fieldSettings()[aColumnIndex]['type'];
} else {
result = 'UNDEFINED';
}
return result;
},
//-------------------------------------------------------------------------
'setTypeForColumn': function(aType, aColumnIndex) {
var fieldSettings;
fieldSettings = this.fieldSettings();
if (typeof(fieldSettings[aColumnIndex]) == 'undefined') {
fieldSettings[aColumnIndex] = {}
}
fieldSettings[aColumnIndex]['type'] = aType;
},
//=========================================================================
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,212 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.Import) == 'undefined') { Clipperz.PM.Components.Import = {}; }
//#############################################################################
Clipperz.PM.Components.Import.ClipperzImportComponent = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.Import.ClipperzImportComponent.superclass.constructor.call(this, anElement, args);
this.render();
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.Import.ClipperzImportComponent, Clipperz.PM.Components.Import.GenericImportComponent, {
'toString': function() {
return "Clipperz.PM.Components.Import.ClipperzImportComponent component";
},
//-------------------------------------------------------------------------
'render': function() {
//MochiKit.Logging.logDebug(">>> Import.ClipperzImportComponent.render");
this.domHelper().append(this.element(), {tag:'div', cls:'clipperzImportWizard', children:[
{tag:'h3', htmlString:Clipperz.PM.Strings['Clipperz_ImportWizard_Title']},
{tag:'div', cls:'importSteps', id:this.getId('importSteps')},
{tag:'div', cls:'importStepBlocks', children:[
{tag:'div', cls:'step_0', id:this.getId('step_0'), children:[
{tag:'div', children:[
{tag:'div', cls:'importOptionsDescription', htmlString:Clipperz.PM.Strings['importOptions_clipperz_description']},
{tag:'div', cls:'importOptionsParameters', children:[]},
this.textAreaConfig()
]}
]},
{tag:'div', cls:'step_1', id:this.getId('step_1'), children:[
{tag:'div', children:[
{tag:'div', id:this.getId('previewDiv'), html:"preview"}
]}
]},
{tag:'div', cls:'step_2', id:this.getId('step_2'), children:[
{tag:'div', children:[
{tag:'h4', html:"done"}
]}
]}
]},
{tag:'div', cls:'importOptionsButtons', children:[
{tag:'table', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', html:'&nbsp;'},
{tag:'td', children:[
{tag:'div', id:this.getId('backActionButton')}
]},
{tag:'td', html:'&nbsp;'},
{tag:'td', children:[
{tag:'div', id:this.getId('nextActionButton')}
]},
{tag:'td', html:'&nbsp;'}
]}
]}
]}
]}
]});
this.updateSteps();
this.setBackButton(new YAHOO.ext.Button(this.getDom('backActionButton'), {text:"back", handler:this.backAction, scope:this}));
this.setNextButton(new YAHOO.ext.Button(this.getDom('nextActionButton'), {text:"next", handler:this.nextAction, scope:this}));
this.getElement('step_0').setVisibilityMode(YAHOO.ext.Element.DISPLAY).show()
this.getElement('step_1').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
this.getElement('step_2').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
//MochiKit.Logging.logDebug("<<< Import.ClipperzImportComponent.render");
},
//-------------------------------------------------------------------------
'nextAction': function() {
switch (this.currentStep()) {
case 0: // -> 1
this.previewValues();
break;
case 1: // -> 2
this.importValues();
break;
}
},
//-------------------------------------------------------------------------
'deferredPreviewValues': function() {
var deferredResult;
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(MochiKit.Base.bind(function(res) {
this.startProcessing();
return res;
}, this));
deferredResult.addCallback(MochiKit.Base.method(this, 'processClipperzValues'));
deferredResult.addCallback(MochiKit.Base.method(this, 'setProcessedValues'));
deferredResult.addCallback(MochiKit.Base.method(this, 'previewRecordValues'));
deferredResult.addCallback(MochiKit.Base.bind(function(res) {
this.processingDone();
this.getElement('step_0').hide();
this.getElement('step_1').show();
this.backButton().enable();
return res;
}, this));
// deferredResult.addErrback(MochiKit.Base.bind(function() {
// this.processingAborted();
// }, this))
deferredResult.callback(this.textAreaContent());
return deferredResult;
},
//-------------------------------------------------------------------------
'processClipperzValues': function(someData) {
var deferredResult;
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Record.processClipperzValues - 1: " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'parseImportData');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Record.processClipperzValues - 2: " + res); return res;});
deferredResult.addCallback(Clipperz.Base.evalJSON);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Record.processClipperzValues - 3: " + res); return res;});
deferredResult.addCallback(function(res) {
return Clipperz.NotificationCenter.deferredNotification(this, 'updatedProgressState', {steps:(res.length)}, res);
})
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Record.processClipperzValues - 4: " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'previewImportData');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Record.processClipperzValues - 5: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.bind(function(someClipperzValues) {
var innerDeferredResult;
var records;
var i,c;
innerDeferredResult = new MochiKit.Async.Deferred();
records = [];
c = someClipperzValues.length;
for(i=0; i<c; i++) {
innerDeferredResult.addCallback(MochiKit.Async.wait, 0.2);
innerDeferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', {});
innerDeferredResult.addCallback(MochiKit.Base.bind(function(someRecords, someData) {
var record;
var recordVersion;
//MochiKit.Logging.logDebug("=== someData: " + Clipperz.Base.serializeJSON(someData));
record = new Clipperz.PM.DataModel.Record({user:this.user()});
record.setLabel(someData['label']);
record.setShouldProcessData(true);
record.processData(someData);
someRecords.push(record);
return someRecords;
}, this), records, someClipperzValues[i]);
}
innerDeferredResult.addCallback(MochiKit.Async.succeed, records);
innerDeferredResult.callback();
return innerDeferredResult;
}, this));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Record.processClipperzValues - 6: " + res); return res;});
deferredResult.callback(someData);
return deferredResult;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,134 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.Import) == 'undefined') { Clipperz.PM.Components.Import = {}; }
//#############################################################################
Clipperz.PM.Components.Import.ExcelImportComponent = function(anElement, args) {
args = args || {};
this._steps = ['EXCEL_EDIT', 'CSV_COLUMNS', 'CSV_HEADER', 'CSV_TITLE', 'CSV_NOTES', 'CSV_FIELDS', 'PREVIEW', 'IMPORT'];
Clipperz.PM.Components.Import.ExcelImportComponent.superclass.constructor.call(this, anElement, args);
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.Import.ExcelImportComponent, Clipperz.PM.Components.Import.CSVImportComponent, {
'toString': function() {
return "Clipperz.PM.Components.Import.ExcelImportComponent component";
},
//-------------------------------------------------------------------------
'render': function() {
//MochiKit.Logging.logDebug(">>> Import.ExcelImportComponent.render");
this.domHelper().append(this.element(), {tag:'div', cls:'excelImportWizard', children:[
{tag:'h3', htmlString:Clipperz.PM.Strings['Excel_ImportWizard_Title']},
{tag:'div', cls:'importSteps', id:this.getId('importSteps')},
{tag:'div', cls:'importStepBlocks', children:[
{tag:'div', cls:'step_0', id:this.getId('step_0'), children:[
{tag:'div', children:[
{tag:'div', cls:'importOptionsDescription', htmlString:Clipperz.PM.Strings['importOptions_excel_description']},
{tag:'div', cls:'importOptionsParameters', children:[]},
this.textAreaConfig()
]}
]},
{tag:'div', cls:'step_1', id:this.getId('step_1'), children:[]},
{tag:'div', cls:'step_2', id:this.getId('step_2'), children:[]},
{tag:'div', cls:'step_3', id:this.getId('step_3'), children:[]},
{tag:'div', cls:'step_4', id:this.getId('step_4'), children:[]},
{tag:'div', cls:'step_5', id:this.getId('step_5'), children:[]},
{tag:'div', cls:'step_6', id:this.getId('step_6'), children:[
{tag:'div', children:[
{tag:'div', id:this.getId('previewDiv'), html:"preview"}
]}
]},
{tag:'div', cls:'step_7', id:this.getId('step_7'), children:[
{tag:'div', children:[
{tag:'h4', html:"done"}
]}
]}
]},
{tag:'div', cls:'importOptionsButtons', children:[
{tag:'table', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', html:'&nbsp;'},
{tag:'td', children:[
{tag:'div', id:this.getId('backActionButton')}
]},
{tag:'td', html:'&nbsp;'},
{tag:'td', children:[
{tag:'div', id:this.getId('nextActionButton')}
]},
{tag:'td', html:'&nbsp;'}
]}
]}
]}
]}
]});
this.updateSteps();
this.setBackButton(new YAHOO.ext.Button(this.getDom('backActionButton'), {text:"back", handler:this.backAction, scope:this}));
this.setNextButton(new YAHOO.ext.Button(this.getDom('nextActionButton'), {text:"next", handler:this.nextAction, scope:this}));
this.getElement('step_0').setVisibilityMode(YAHOO.ext.Element.DISPLAY).show()
this.getElement('step_1').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
this.getElement('step_2').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
this.getElement('step_3').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
this.getElement('step_4').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
this.getElement('step_5').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
this.getElement('step_6').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
this.getElement('step_7').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
//MochiKit.Logging.logDebug("<<< Import.ExcelImportComponent.render");
},
//-------------------------------------------------------------------------
'csvProcessor': function() {
return new Clipperz.CSVProcessor({
// quoteChar: this.getDom('CSV_inputOptions_quote').value,
// escapeChar: this.getDom('CSV_inputOptions_escape').value,
separatorChar: '\t',
binary:true
});
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,523 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.Import) == 'undefined') { Clipperz.PM.Components.Import = {}; }
//#############################################################################
Clipperz.PM.Components.Import.GenericImportComponent = function(anElement, args) {
args = args || {};
this._steps = this._steps || ['EDIT', 'PREVIEW', 'IMPORT'];
Clipperz.PM.Components.Import.GenericImportComponent.superclass.constructor.call(this, anElement, args);
this._user = args['user'];
this._currentStep = 0;
this._currentStatus = 'IDLE'; // 'PROCESSING'
this._parsedValues = null;
this._processedValues = null;
this._backButton = null;
this._nextButton = null;
Clipperz.NotificationCenter.register(null, 'importProcessorProgressUpdate', this, 'updateProgressDialogStatus');
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.Import.GenericImportComponent, Clipperz.PM.Components.BaseComponent, {
'toString': function() {
return "Clipperz.PM.Components.Import.GenericImportComponent component";
},
//-------------------------------------------------------------------------
'user': function() {
return this._user;
},
//-------------------------------------------------------------------------
'textAreaConfig': function() {
return {tag:'textarea', name:this.getId('importTextArea'), cls:'importTextArea', id:this.getId('importTextArea'), cols:60, rows:15, html:""};
},
'textAreaContent': function() {
return this.getDom('importTextArea').value
},
//-------------------------------------------------------------------------
'steps': function() {
return this._steps;
},
'currentStep': function() {
return this._currentStep;
},
'setCurrentStep': function(aValue) {
this._currentStep = aValue;
this.updateSteps();
},
//-------------------------------------------------------------------------
'currentStatus': function() {
return this._currentStatus;
},
'startProcessing': function() {
this._currentStatus = 'PROCESSING';
this.updateSteps();
},
'processingDone': function() {
this._currentStatus = 'IDLE';
this.setCurrentStep(this.currentStep() + 1);
},
'processingAborted': function() {
this._currentStatus = 'IDLE';
this.updateSteps();
},
//-------------------------------------------------------------------------
'stepsConfig': function() {
var result;
var i,c;
result = [];
c = this.steps().length;
for (i=0; i<c; i++) {
var cls;
if (this.currentStep() == i) {
if (this.currentStatus() == 'IDLE') {
cls = 'current';
} else {
cls = 'currentProcessing';
}
} else {
cls = "";
}
result.push({tag:'td', cls:cls, children:[
{tag:'div', children:[{tag:'span', htmlString:Clipperz.PM.Strings['ImportWizard'][this.steps()[i]]}]}
]})
if (i < (c-1)) {
if ((this.currentStep() == i) && (this.currentStatus() == 'PROCESSING')) {
cls = 'stepSeparatorProcessing';
} else {
cls = 'stepSeparator';
}
result.push({tag:'td', cls:cls, children:[
{tag:'div', children:[{tag:'span', html:">"}]}
]});
}
}
result = [{tag:'div', cls:'importWizardStepsBox', children:[
{tag:'div', cls:'importWizardStepsInnerBox', children:[
{tag:'table', cls:'importWizardSteps', children:[
{tag:'tbody', children:[
{tag:'tr', children:result}
]}
]}
]},
{tag:'div', cls:'importWizardStepsBoxFooter'}
]}];
return result;
},
'updateSteps': function() {
this.getElement('importSteps').update("");
Clipperz.YUI.DomHelper.append(this.getDom('importSteps'), {tag:'div', children:this.stepsConfig()});
},
//-------------------------------------------------------------------------
'backAction': function() {
//MochiKit.Logging.logDebug(">>> backAction");
if (this.currentStep() == 0) {
Clipperz.NotificationCenter.notify(this, 'importCancelled');
} else {
this.getElement('step_' + this.currentStep()).hide();
this.setCurrentStep(this.currentStep() - 1);
this.getElement('step_' + this.currentStep()).show();
this.nextButton().enable();
}
//MochiKit.Logging.logDebug("<<< backAction");
},
//-------------------------------------------------------------------------
'backButton': function() {
return this._backButton;
},
'setBackButton': function(aValue) {
this._backButton = aValue;
},
'nextButton': function() {
return this._nextButton;
},
'setNextButton': function(aValue) {
this._nextButton = aValue;
},
//-------------------------------------------------------------------------
'render': function() {
//MochiKit.Logging.logDebug(">>> Import.GenericImportComponent.render");
this.domHelper().append(this.element(), {tag:'div', children:[
{tag:'h2', html:this.toString()}
]});
//MochiKit.Logging.logDebug("<<< Import.GenericImportComponent.render");
},
//-------------------------------------------------------------------------
'previewValues': function() {
Clipperz.PM.Components.MessageBox.showProgressPanel(
MochiKit.Base.method(this, 'deferredPreviewValues'),
MochiKit.Base.method(this, 'handlePreviewError'),
this.getDom('nextActionButton')
);
},
'deferredPreviewValues': function() {
throw Clipperz.Base.exception.AbstractMethod;
},
'handlePreviewError': function(anError) {
console.log("anError", anError);
MochiKit.Logging.logError("An error occurred while previewing the data: " + anError);
alert("An error occurred while previewing the data");
Clipperz.PM.Components.MessageBox().hide();
},
//-------------------------------------------------------------------------
'previewRecordValues': function(someProcessedRecords) {
//MochiKit.Logging.logDebug(">>> previewRecordValues");
this.getElement('previewDiv').update("");
//MochiKit.Logging.logDebug("--- previewRecordValues - 1");
this.domHelper().append(this.getElement('previewDiv'), {tag:'div', cls:'importPreviewDiv', children:[{tag:'table', id:'importPreview', cellspacing:'0', children:[
{tag:'tbody', children:
MochiKit.Base.map(MochiKit.Base.bind(function(aRecord) {
var result;
//MochiKit.Logging.logDebug("--- previewRecordValues - 1.1");
//console.log("fields", aRecord.currentVersion().fields());
result = {tag:'tr', children:[{tag:'td', children:[
{tag:'table', cls:'importPreview_record', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', rowspan:'2', valign:'top', children:[
{tag:'input', type:'checkbox', id:this.getId(aRecord.reference()), value:"aRecord.reference()", checked:true}
]},
{tag:'td', colspan:'2', children:[
{tag:'span', cls:'importPreview_title', html:aRecord.label()}
]}
]},
{tag:'tr', children:[
{tag:'td', valign:'top', children:[
{tag:'span', cls:'importPreview_notes', html:(MochiKit.Base.isNotEmpty(aRecord.notes()) ? aRecord.notes().replace(/\n/g, '<br>') : '&nbsp;')}
]},
{tag:'td', valign:'top', cls:'importPreview_fieds', children:[
{tag:'table', cls:'importPreview_fields', children:[
{tag:'tbody', children:MochiKit.Base.map(function(aField) {
var result;
//MochiKit.Logging.logDebug("--- previewRecordValues - 1.1.1");
result = {tag:'tr', children:[
{tag:'td', valign:'top', children:[
{tag:'span', cls:'importPreview_fields_label', html:aField.label()}
]},
{tag:'td', valign:'top', children:[
{tag:'span', cls:'importPreview_fields_value', html:aField.value()}
]}
]};
//MochiKit.Logging.logDebug("--- previewRecordValues - 1.1.2");
return result;
}, MochiKit.Base.values(aRecord.currentVersion().fields()))}
]}
]}
]}
]}
]}
]}]};
//MochiKit.Logging.logDebug("--- previewRecordValues - 1.2");
return result;
}, this), someProcessedRecords)
}
]}]});
//MochiKit.Logging.logDebug("--- previewRecordValues - 2");
MochiKit.Base.map(MochiKit.Base.bind(function(aRecord) {
this.getElement(aRecord.reference()).dom.value = aRecord.reference();
}, this), someProcessedRecords);
Clipperz.Style.applyZebraStylesToTable('importPreview');
//MochiKit.Logging.logDebug("<<< previewRecordValues");
},
//-------------------------------------------------------------------------
'updateProgressDialogStatus': function(anEvent) {
Clipperz.PM.Components.MessageBox().update({step:anEvent.parameters().progress});
},
//-------------------------------------------------------------------------
'parsedValues': function() {
return this._parsedValues;
},
'setParsedValues': function(aValue) {
this._parsedValues = aValue;
return this._parsedValues;
},
//-------------------------------------------------------------------------
'processedValues': function() {
return this._processedValues;
},
'setProcessedValues': function(aValue) {
this._processedValues = aValue;
return this._processedValues;
},
//-------------------------------------------------------------------------
'importValues': function() {
var deferredResult;
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(MochiKit.Base.bind(function() {
this.nextButton().disable();
this.startProcessing();
},this));
deferredResult.addCallback(MochiKit.Base.method(this, 'importProcessedValues'));
deferredResult.addCallback(MochiKit.Base.method(this, 'processingDone'));
deferredResult.addErrback (MochiKit.Base.method(this, 'processingAborted'));
deferredResult.callback();
return deferredResult;
},
//-------------------------------------------------------------------------
'importProcessedValues': function() {
var deferredResult;
var processedValues;
var selectedRecords;
var i,c;
//MochiKit.Logging.logDebug(">>> GenericImportComponent.importProcessedValues");
processedValues = this.processedValues();
selectedRecords = [];
c = processedValues.length;
for (i=0; i<c; i++) {
var currentRecord;
currentRecord = processedValues[i];
if (this.getDom(currentRecord.reference()).checked == true) {
selectedRecords.push(currentRecord);
}
}
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("GenericImportComponent - 1: " + res); return res;});
deferredResult.addCallback(function(someRecords) {
var innerDeferredResult;
var text;
text = Clipperz.PM.Strings['importData_importConfirmation_text'];
text = text.replace(/__numberOfRecords__/, someRecords.length);
innerDeferredResult = new MochiKit.Async.Deferred();
//innerDeferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("GenericImportComponent - 1.1: " + res); return res;});
innerDeferredResult.addCallback(MochiKit.Async.succeed, someRecords);
//innerDeferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("GenericImportComponent - 1.2: " + res); return res;});
Clipperz.PM.Components.MessageBox().deferredShow({
title:Clipperz.PM.Strings['importData_importConfirmation_title'],
text:text,
width:240,
showProgressBar:false,
showCloseButton:false,
buttons:{
'yes':"yes", // Clipperz.PM.Strings['mainPanelDeleteRecordPanelConfirmButtonLabel'],
'no':"no" // Clipperz.PM.Strings['mainPanelDeleteRecordPanelDenyButtonLabel']
},
fn:MochiKit.Base.partial(function(aDeferred, aResult) {
if (aResult == 'yes') {
aDeferred.callback(aResult);
} else {
aDeferred.errback(aResult);
}
}, innerDeferredResult)
}/*, this.getId('nextActionButton')*/);
return innerDeferredResult;
});
//-------------------
// deferredResult.addCallback(MochiKit.Base.bind(function(someRecords) {
// Clipperz.PM.Components.MessageBox.showProgressPanel(
// MochiKit.Base.method(this, 'importProcessedValues_core', someRecords),
// MochiKit.Base.method(this, 'handleProcessError'),
// this.getDom('mainDiv')
// );
// }, this));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("GenericImportComponent - 2: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Components.MessageBox(), 'deferredShow'),
{
// title:Clipperz.PM.Strings['accountPanelDeletingAccountPanelProgressTitle'],
// text:Clipperz.PM.Strings['accountPanelDeletingAccountPanelProgressText'],
width:240,
showProgressBar:true,
showCloseButton:false
}
);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("GenericImportComponent - 3: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.bind(function(someRecords) {
var innerDeferredResult;
//MochiKit.Logging.logDebug(">>> inner deferred");
innerDeferredResult = new MochiKit.Async.Deferred();
//innerDeferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("GenericImportComponent - 3.1: " + res); return res;});
innerDeferredResult.addCallback(MochiKit.Base.method(this, 'importProcessedValues_core', someRecords));
//innerDeferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("GenericImportComponent - 3.2: " + res); return res;});
innerDeferredResult.addErrback(MochiKit.Base.method(this, 'handleProcessError'));
//innerDeferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("GenericImportComponent - 3.3: " + res); return res;});
innerDeferredResult.callback(someRecords);
//MochiKit.Logging.logDebug("<<< inner deferred");
return innerDeferredResult;
}, this), selectedRecords);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("GenericImportComponent - 4: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Components.MessageBox(), 'hide'), 'mainDiv');
deferredResult.addErrback(MochiKit.Base.bind(function() {
this.nextButton().enable();
this.setCurrentStep(this.currentStep() -1);
}, this));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("GenericImportComponent - 5: " + res); return res;});
deferredResult.callback(selectedRecords);
//MochiKit.Logging.logDebug("<<< GenericImportComponent.importProcessedValues");
return deferredResult;
},
//-------------------------------------------------------------------------
'importProcessedValues_core': function(someRecords) {
var deferredResult;
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'processingImportData');
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', {steps:(someRecords.length + 6 + 1)});
deferredResult.addCallback(MochiKit.Async.wait, 0.5);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("importProcessedValues_core - 3: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.bind(function(someRecords) {
var i,c;
c = someRecords.length;
for (i=0; i<c; i++) {
this.user().addRecord(someRecords[i], true);
}
return someRecords;
}, this));
deferredResult.addCallback(MochiKit.Async.wait, 0.5);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("importProcessedValues_core - 4: " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'recordAdded', null);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("importProcessedValues_core - 5: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.user(), 'saveRecords'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("importProcessedValues_core - 6: " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'selectTab', 'mainTabPanel.recordsTab');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("importProcessedValues_core - 7: " + res); return res;});
if (this.user().preferences().shouldShowDonationPanel()) {
deferredResult.addCallback(Clipperz.PM.showDonationSplashScreen, this.user(), 'mainDiv');
}
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'importCompleted', null);
deferredResult.callback(someRecords);
return deferredResult;
},
//-------------------------------------------------------------------------
'handleParseError': function(res) {
this.processingAborted();
MochiKit.Logging.logError("An error occurred while parsing the values: " + res);
alert("An error occurred while parsing the values: " + res);
Clipperz.PM.Components.MessageBox().hide();
},
'handleProcessError': function(res) {
this.processingAborted();
MochiKit.Logging.logError("An error occurred while processing the values: " + res);
alert("An error occurred while processing the values: " + res);
Clipperz.PM.Components.MessageBox().hide();
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,450 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.Import) == 'undefined') { Clipperz.PM.Components.Import = {}; }
//#############################################################################
Clipperz.PM.Components.Import.KeePassImportComponent = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.Import.KeePassImportComponent.superclass.constructor.call(this, anElement, args);
this._steps = ['EDIT', 'KEEPASS_SETTINGS', 'PREVIEW', 'IMPORT'];
this._definedFields = ['Group', 'Group Tree', 'UserName', 'URL', 'Password', 'Notes', 'UUID', 'Icon', 'Creation Time', 'Last Access', 'Last Modification', 'Expires', 'Attachment Description', 'Attachment'];
this.render();
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.Import.KeePassImportComponent, Clipperz.PM.Components.Import.GenericImportComponent, {
'toString': function() {
return "Clipperz.PM.Components.Import.KeePassImportComponent component";
},
//-------------------------------------------------------------------------
'render': function() {
//MochiKit.Logging.logDebug(">>> Import.KeePassImportComponent.render");
this.domHelper().append(this.element(), {tag:'div', cls:'keePassImportWizard', children:[
{tag:'h3', htmlString:Clipperz.PM.Strings['KeePass_ImportWizard_Title']},
{tag:'div', cls:'importSteps', id:this.getId('importSteps')},
{tag:'div', cls:'importStepBlocks', children:[
{tag:'div', cls:'step_0', id:this.getId('step_0'), children:[
{tag:'div', children:[
{tag:'div', cls:'importOptionsDescription', htmlString:Clipperz.PM.Strings['importOptions_keePass_description']},
{tag:'div', cls:'importOptionsParameters', children:[]},
this.textAreaConfig()
]}
]},
{tag:'div', cls:'step_1', id:this.getId('step_1'), children:[
{tag:'div', children:[
{tag:'div', id:this.getId('settingsDiv'), children:[
{tag:'table', id:'KeePassSettings', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', width:'50%', valign:'top', children:[
{tag:'table', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', valign:'top', children:[{tag:'input', type:'checkbox', id:this.getId('Group_checkbox'), name:'Group'/*, checked:true*/}]},
{tag:'td', width:'150', valign:'top', children:[{tag:'span', cls:'keePassFieldLabel', id:this.getId('Group_label'), html:"Group"}]}
]},
{tag:'tr', children:[
{tag:'td', valign:'top', children:[{tag:'input', type:'checkbox', id:this.getId('Group Tree_checkbox'), name:'Group Tree'/*, checked:true*/}]},
{tag:'td', valign:'top', children:[{tag:'span', cls:'keePassFieldLabel', id:this.getId('Group Tree_label'), html:"Group Tree"}]}
]},
{tag:'tr', children:[
{tag:'td', valign:'top', children:[{tag:'input', type:'checkbox', id:this.getId('UserName_checkbox'), name:'UserName', checked:true}]},
{tag:'td', valign:'top', children:[{tag:'span', cls:'keePassFieldLabel', id:this.getId('UserName_label'), html:"UserName"}]}
]},
{tag:'tr', children:[
{tag:'td', valign:'top', children:[{tag:'input', type:'checkbox', id:this.getId('URL_checkbox'), name:'URL', checked:true}]},
{tag:'td', valign:'top', children:[{tag:'span', cls:'keePassFieldLabel', id:this.getId('URL_label'), html:"URL"}]}
]},
{tag:'tr', children:[
{tag:'td', valign:'top', children:[{tag:'input', type:'checkbox', id:this.getId('Password_checkbox'), name:'Password', checked:true}]},
{tag:'td', valign:'top', children:[{tag:'span', cls:'keePassFieldLabel', id:this.getId('Password_label'), html:"Password"}]}
]},
{tag:'tr', children:[
{tag:'td', valign:'top', children:[{tag:'input', type:'checkbox', id:this.getId('Notes_checkbox'), name:'Notes', checked:true}]},
{tag:'td', valign:'top', children:[{tag:'span', cls:'keePassFieldLabel', id:this.getId('Notes_label'), html:"Notes"}]}
]},
{tag:'tr', children:[
{tag:'td', valign:'top', children:[{tag:'input', type:'checkbox', id:this.getId('UUID_checkbox'), name:'UUID'/*, checked:true*/}]},
{tag:'td', valign:'top', children:[{tag:'span', cls:'keePassFieldLabel', id:this.getId('UUID_label'), html:"UUID"}]}
]}
]}
]}
]},
{tag:'td', width:'50%', valign:'top', children:[
{tag:'table', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', valign:'top', children:[{tag:'input', type:'checkbox', id:this.getId('Icon_checkbox'), name:'Icon'/*, checked:true*/}]},
{tag:'td', width:'150', valign:'top', children:[{tag:'span', cls:'keePassFieldLabel', id:this.getId('Icon_label'), html:"Icon"}]}
]},
{tag:'tr', children:[
{tag:'td', valign:'top', children:[{tag:'input', type:'checkbox', id:this.getId('Creation Time_checkbox'), name:'Creation Time'/*, checked:true*/}]},
{tag:'td', valign:'top', children:[{tag:'span', cls:'keePassFieldLabel', id:this.getId('Creation Time_label'), html:"Creation Time"}]}
]},
{tag:'tr', children:[
{tag:'td', valign:'top', children:[{tag:'input', type:'checkbox', id:this.getId('Last Access_checkbox'), name:'Last Access'/*, checked:true*/}]},
{tag:'td', valign:'top', children:[{tag:'span', cls:'keePassFieldLabel', id:this.getId('Last Access_label'), html:"Last Access"}]}
]},
{tag:'tr', children:[
{tag:'td', valign:'top', children:[{tag:'input', type:'checkbox', id:this.getId('Last Modification_checkbox'), name:'Last Modification'/*, checked:true*/}]},
{tag:'td', valign:'top', children:[{tag:'span', cls:'keePassFieldLabel', id:this.getId('Last Modification_label'), html:"Last Modification"}]}
]},
{tag:'tr', children:[
{tag:'td', valign:'top', children:[{tag:'input', type:'checkbox', id:this.getId('Expires_checkbox'), name:'Expires'/*, checked:true*/}]},
{tag:'td', valign:'top', children:[{tag:'span', cls:'keePassFieldLabel', id:this.getId('Expires_label'), html:"Expires"}]}
]},
{tag:'tr', children:[
{tag:'td', valign:'top', children:[{tag:'input', type:'checkbox', id:this.getId('Attachment Description_checkbox'), name:'Attachment Description', checked:true}]},
{tag:'td', valign:'top', children:[{tag:'span', cls:'keePassFieldLabel', id:this.getId('Attachment Description_label'), html:"Attachment Description"}]}
]},
{tag:'tr', children:[
{tag:'td', valign:'top', children:[{tag:'input', type:'checkbox', id:this.getId('Attachment_checkbox'), name:'Attachment', checked:true}]},
{tag:'td', valign:'top', children:[{tag:'span', cls:'keePassFieldLabel', id:this.getId('Attachment_label'), html:"Attachment"}]}
]}
]}
]}
]}
]}
]}
]}
]}
]}
]},
{tag:'div', cls:'step_2', id:this.getId('step_2'), children:[
{tag:'div', children:[
{tag:'div', id:this.getId('previewDiv'), html:"preview"}
]}
]},
{tag:'div', cls:'step_3', id:this.getId('step_3'), children:[
{tag:'div', children:[
{tag:'h4', html:"done"}
]}
]}
]},
{tag:'div', cls:'importOptionsButtons', children:[
{tag:'table', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', html:'&nbsp;'},
{tag:'td', children:[
{tag:'div', id:this.getId('backActionButton')}
]},
{tag:'td', html:'&nbsp;'},
{tag:'td', children:[
{tag:'div', id:this.getId('nextActionButton')}
]},
{tag:'td', html:'&nbsp;'}
]}
]}
]}
]}
]});
this.updateSteps();
this.setBackButton(new YAHOO.ext.Button(this.getDom('backActionButton'), {text:"back", handler:this.backAction, scope:this}));
this.setNextButton(new YAHOO.ext.Button(this.getDom('nextActionButton'), {text:"next", handler:this.nextAction, scope:this}));
this.getElement('step_0').setVisibilityMode(YAHOO.ext.Element.DISPLAY).show()
this.getElement('step_1').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
this.getElement('step_2').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
this.getElement('step_3').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
//MochiKit.Logging.logDebug("<<< Import.KeePassImportComponent.render");
},
//-------------------------------------------------------------------------
'nextAction': function() {
switch (this.currentStep()) {
case 0: // -> 1
Clipperz.PM.Components.MessageBox.showProgressPanel(
MochiKit.Base.method(this, 'deferredParseValues'),
MochiKit.Base.method(this, 'handleParseError'),
this.getDom('nextActionButton')
);
break;
case 1: // -> 2
this.previewValues();
break;
case 2: // -> 3
this.importValues();
break;
}
},
//-------------------------------------------------------------------------
'deferredParseValues': function() {
var deferredResult;
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.deferredParseValues - 1 " + res.substring(0,50)); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'parseImportData');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.deferredParseValues - 2 " + res.substring(0,50)); return res;});
deferredResult.addCallback(MochiKit.Base.bind(function(res) {
this.startProcessing();
return res;
}, this));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.deferredParseValues - 3 " + res.substring(0,50)); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'parseKeePassValues')); // processPasswordPlusValues
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.deferredParseValues - 4 " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'setParsedValues')); // setProcessedValues
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.deferredParseValues - 5 " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'showSettings')); // previewRecordValues
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.deferredParseValues - 6 " + res); return res;});
deferredResult.addCallback(MochiKit.Base.bind(function(res) {
this.processingDone();
this.getElement('step_0').hide();
this.getElement('step_1').show();
this.backButton().enable();
return res;
}, this));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.deferredParseValues - 7 " + res); return res;});
deferredResult.callback(this.textAreaContent());
return deferredResult;
},
//-------------------------------------------------------------------------
'deferredPreviewValues': function() {
var deferredResult;
//MochiKit.Logging.logDebug(">>> KeePassImportComonent.deferredPreviewValues");
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.deferredPreviewValues - 1 " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'previewImportData');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.deferredPreviewValues - 2 " + res); return res;});
deferredResult.addCallback(MochiKit.Base.bind(function(res) {
this.startProcessing();
return res;
}, this));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.deferredPreviewValues - 3 " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'processKeePassParsedValues'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.deferredPreviewValues - 4 " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'setProcessedValues'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.deferredPreviewValues - 5 " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'previewRecordValues'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.deferredPreviewValues - 6 " + res); return res;});
deferredResult.addCallback(MochiKit.Base.bind(function(res) {
this.processingDone();
this.getElement('step_1').hide();
this.getElement('step_2').show();
this.backButton().enable();
return res;
}, this));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.deferredPreviewValues - 7 " + res); return res;});
// deferredResult.addErrback(MochiKit.Base.bind(function() {
// this.processingAborted();
// }, this))
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.deferredPreviewValues - 8 " + res); return res;});
deferredResult.callback(this.parsedValues());
//MochiKit.Logging.logDebug("<<< KeePassImportComonent.deferredPreviewValues");
return deferredResult;
},
//-------------------------------------------------------------------------
'definedFields': function() {
return this._definedFields;
},
//-------------------------------------------------------------------------
'parseKeePassValues': function(someData) {
var deferredResult;
var keePassProcessor;
keePassProcessor = new Clipperz.KeePassExportProcessor();
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.parseKeePassValues - 1 " + res.substring(0,50)); return res;});
deferredResult.addCallback(function(res) {
return Clipperz.NotificationCenter.deferredNotification(this, 'updatedProgressState', {steps:(res.length)}, res);
})
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.parseKeePassValues - 2 " + res.substring(0,50)); return res;});
deferredResult.addCallback(MochiKit.Base.method(keePassProcessor, 'deferredParse'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("KeePassImportComponent.parseKeePassValues - 3 " + res); return res;});
deferredResult.callback(someData);
return deferredResult;
},
//-------------------------------------------------------------------------
'showSettings': function(someValues) {
var availableFields;
var i,c;
//MochiKit.Logging.logDebug(">>> KeePassImportCOmponent.showSettings");
availableFields = new Clipperz.Set();
c = this.parsedValues().length;
for (i=0; i<c; i++) {
var fieldLabel;
for (fieldLabel in this.parsedValues()[i]) {
availableFields.add(fieldLabel);
}
}
c = this.definedFields().length;
for (i=0; i<c; i++) {
var definedField;
definedField = this.definedFields()[i];
if (availableFields.contains(definedField)) {
//MochiKit.Logging.logDebug("enabling field " + definedField);
this.getDom(definedField + '_checkbox').disabled = false;
this.getElement(definedField + '_label').removeClass('disabled');
} else {
//MochiKit.Logging.logDebug("disabling field " + definedField);
this.getDom(definedField + '_checkbox').disabled = true;
this.getDom(definedField + '_checkbox').checked = false; // ????
this.getElement(definedField + '_label').addClass('disabled');
}
}
//MochiKit.Logging.logDebug("<<< KeePassImportCOmponent.showSettings");
return MochiKit.Async.succeed(someValues);
},
//-------------------------------------------------------------------------
'shouldImportField': function(aFieldName) {
var fieldCheckbox;
var result;
//MochiKit.Logging.logDebug(">>> shouldImportField: " + aFieldName);
// fieldCheckbox = this.getDom(aFieldName + '_checkbox');
fieldCheckbox = MochiKit.DOM.getElement(this.getId(aFieldName + '_checkbox'));
if (fieldCheckbox != null) {
result = fieldCheckbox.checked;
} else {
result = false;
}
//MochiKit.Logging.logDebug("<<< shouldImportField: " + result);
return result;
},
//-------------------------------------------------------------------------
'processKeePassParsedValues': function(someValues) {
var deferredResult;
var records;
var i,c;
//MochiKit.Logging.logDebug(">>> processKeePassParsedValues");
deferredResult = new MochiKit.Async.Deferred();
records = [];
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("processKeePassParsedValues - 1: " + res); return res;});
c = someValues.length;
deferredResult.addCallback(function(res) {
return Clipperz.NotificationCenter.deferredNotification(this, 'updatedProgressState', {steps:c}, res);
})
for(i=0; i<c; i++) {
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("[" + i + "] processKeePassParsedValues - 1.1: " + res); return res;});
deferredResult.addCallback(MochiKit.Async.wait, 0.2);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("[" + i + "] processKeePassParsedValues - 1.2: " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', {});
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("[" + i + "] processKeePassParsedValues - 1.3: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.bind(function(someRecords, someData) {
var record;
var recordVersion;
var ii;
record = new Clipperz.PM.DataModel.Record({user:this.user()});
record.setLabel(someData['Title']);
if (this.shouldImportField('Notes')) {
record.setNotes(someData['Notes']);
}
recordVersion = record.currentVersion()
for (ii in someData) {
if ((ii != 'Title') && (ii != 'Notes') && (typeof(someData[ii]) != "undefined") && (this.shouldImportField(ii))) {
var recordField;
var recordFieldType;
recordFieldType = 'TXT';
if (ii == 'Password') {
recordFieldType = 'PWD';
} else if (ii == 'URL') {
recordFieldType = 'URL';
} else if ((ii == 'Creation Time') || (ii == 'Last Access') || (ii == 'Last Modification') || (ii == 'Expires')) {
recordFieldType = 'Date';
}
recordField = new Clipperz.PM.DataModel.RecordField({
recordVersion: recordVersion,
label: ii,
value: someData[ii],
type: recordFieldType
});
recordVersion.addField(recordField);
}
}
someRecords.push(record);
return someRecords;
}, this), records, someValues[i]);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("[" + i + "] processKeePassParsedValues - 1.4: " + res); return res;});
}
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("processKeePassParsedValues - 2: " + res); return res;});
deferredResult.addCallback(MochiKit.Async.succeed, records);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("processKeePassParsedValues - 3: " + res); return res;});
deferredResult.callback();
//MochiKit.Logging.logDebug("<<< processKeePassParsedValues");
return deferredResult;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,332 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.Import) == 'undefined') { Clipperz.PM.Components.Import = {}; }
//#############################################################################
Clipperz.PM.Components.Import.MainComponent = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.Import.MainComponent.superclass.constructor.call(this, anElement, args);
this._user = args.user;
this._wizardComponent = null;
this._backButton = null;
this._nextButton = null;
this._selectedComponent = null;
this.render();
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.Import.MainComponent, Clipperz.PM.Components.BaseComponent, {
'toString': function() {
return "Clipperz.PM.Components.Import.MainComponent component";
},
//-------------------------------------------------------------------------
'user': function() {
return this._user;
},
//-------------------------------------------------------------------------
'wizardComponent': function() {
return this._wizardComponent;
},
'setWizardComponent': function(aValue) {
if (this._wizardComponent != null) {
this._wizardComponent.remove();
}
if (aValue != null) {
this.getElement('importCover').hide();
this.getElement('importWizard').show();
}
this._wizardComponent = aValue;
},
'resetImportComponent': function() {
//MochiKit.Logging.logDebug(">>> resetImportComponent");
this.setWizardComponent(null);
this.getElement('wizardComponent').update("");
this.getElement('importCover').show();
this.getElement('importWizard').hide();
//MochiKit.Logging.logDebug("<<< resetImportComponent");
},
//-------------------------------------------------------------------------
'backButton': function() {
return this._backButton;
},
'setBackButton': function(aValue) {
this._backButton = aValue;
},
'nextButton': function() {
return this._nextButton;
},
'setNextButton': function(aValue) {
this._nextButton = aValue;
},
//-------------------------------------------------------------------------
'render': function() {
//MochiKit.Logging.logDebug(">>> Import.MainComponent.render");
Clipperz.NotificationCenter.unregister(this);
MochiKit.Signal.disconnectAllTo(this);
this.element().update("");
this.domHelper().append(this.element(), {tag:'div', id:this.getId('mainDiv'), children:[
{tag:'div', id:this.getId('importCover'), children:[
{tag:'h5', htmlString:Clipperz.PM.Strings['importTabTitle']},
{tag:'div', cls:'panelDescription', htmlString:Clipperz.PM.Strings['importTabDescription']},
{tag:'div', cls:'importFormats', children:[
{tag:'ul', cls:'radioList', children:[
{tag:'li', children:[
{tag:'table', children:[{tag:'tbody', children:[{tag:'tr', children:[
{tag:'td', valign:'top', children:[
{tag:'input', id:this.getId('CSV_radio'), type:'radio', name:'importFormat', value:'CSV'}
]},
{tag:'td', valign:'top', children:[
{tag:'h4', id:this.getId('CSV_title'), htmlString:Clipperz.PM.Strings['importFormats']['CSV']['label']},
{tag:'div', cls:'templateDescription', htmlString:Clipperz.PM.Strings['importFormats']['CSV']['description']}
]}
]}]}]}
]},
{tag:'li', children:[
{tag:'table', children:[{tag:'tbody', children:[{tag:'tr', children:[
{tag:'td', valign:'top', children:[
{tag:'input', id:this.getId('Excel_radio'), type:'radio', name:'importFormat', value:'EXCEL'}
]},
{tag:'td', valign:'top', children:[
{tag:'h4', id:this.getId('Excel_title'), htmlString:Clipperz.PM.Strings['importFormats']['Excel']['label']},
{tag:'div', cls:'templateDescription', htmlString:Clipperz.PM.Strings['importFormats']['Excel']['description']}
]}
]}]}]}
]},
{tag:'li', children:[
{tag:'table', children:[{tag:'tbody', children:[{tag:'tr', children:[
{tag:'td', valign:'top', children:[
{tag:'input', id:this.getId('KeePass_radio'), type:'radio', name:'importFormat', value:'KEEPASS'}
]},
{tag:'td', valign:'top', children:[
{tag:'h4', id:this.getId('KeePass_title'), htmlString:Clipperz.PM.Strings['importFormats']['KeePass']['label']},
{tag:'div', cls:'templateDescription', htmlString:Clipperz.PM.Strings['importFormats']['KeePass']['description']}
]}
]}]}]}
]},
{tag:'li', children:[
{tag:'table', children:[{tag:'tbody', children:[{tag:'tr', children:[
{tag:'td', valign:'top', children:[
{tag:'input', id:this.getId('Roboform_radio'), type:'radio', name:'importFormat', value:'ROBOFORM'}
]},
{tag:'td', valign:'top', children:[
{tag:'h4', id:this.getId('Roboform_title'), htmlString:Clipperz.PM.Strings['importFormats']['Roboform']['label']},
{tag:'div', cls:'templateDescription', htmlString:Clipperz.PM.Strings['importFormats']['Roboform']['description']}
]}
]}]}]}
]},
{tag:'li', children:[
{tag:'table', children:[{tag:'tbody', children:[{tag:'tr', children:[
{tag:'td', valign:'top', children:[
{tag:'input', id:this.getId('PasswordPlus_radio'), type:'radio', name:'importFormat', value:'PASSWORD_PLUS'}
]},
{tag:'td', valign:'top', children:[
{tag:'h4', id:this.getId('PasswordPlus_title'), htmlString:Clipperz.PM.Strings['importFormats']['PasswordPlus']['label']},
{tag:'div', cls:'templateDescription', htmlString:Clipperz.PM.Strings['importFormats']['PasswordPlus']['description']}
]}
]}]}]}
]},
{tag:'li', children:[
{tag:'table', children:[{tag:'tbody', children:[{tag:'tr', children:[
{tag:'td', valign:'top', children:[
{tag:'input', id:this.getId('ClipperzExport_radio'), type:'radio', name:'importFormat', value:'CLIPPERZ_EXPORT'}
]},
{tag:'td', valign:'top', children:[
{tag:'h4', id:this.getId('ClipperzExport_title'), htmlString:Clipperz.PM.Strings['importFormats']['ClipperzExport']['label']},
{tag:'div', cls:'templateDescription', htmlString:Clipperz.PM.Strings['importFormats']['ClipperzExport']['description']}
]}
]}]}]}
]}
]},
{tag:'div', cls:'importOptionsButtons', children:[
{tag:'table', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', html:'&nbsp;'},
{tag:'td', children:[
{tag:'div', id:this.getId('backActionButton')}
]},
{tag:'td', html:'&nbsp;'},
{tag:'td', children:[
{tag:'div', id:this.getId('nextActionButton')}
]},
{tag:'td', html:'&nbsp;'}
]}
]}
]}
]}
]}
]},
{tag:'div', id:this.getId('importWizard'), children:[
{tag:'form', id:this.getId('importWizardForm'), children:[
{tag:'div', cls:'wizardComponent', id:this.getId('wizardComponent'), children:[]}
]}
]}
]});
this.setBackButton(new YAHOO.ext.Button(this.getDom('backActionButton'), {text:"back", handler:this.backAction, scope:this}));
this.setNextButton(new YAHOO.ext.Button(this.getDom('nextActionButton'), {text:"next", handler:this.nextAction, scope:this}));
this.backButton().disable();
this.nextButton().disable();
this.getElement('importCover').setVisibilityMode(YAHOO.ext.Element.DISPLAY).show();
this.getElement('importWizard').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
if (Clipperz.PM.Proxy.defaultProxy.isReadOnly()) {
this.getElement('mainDiv').addClass('read-only');
this.getDom('ClipperzExport_radio').disabled = true;
this.getDom('CSV_radio').disabled = true;
this.getDom('Excel_radio').disabled = true;
this.getDom('PasswordPlus_radio').disabled = true;
this.getDom('Roboform_radio').disabled = true;
this.getDom('KeePass_radio').disabled = true;
} else {
MochiKit.Signal.connect(this.getId('ClipperzExport_radio'), 'onclick', MochiKit.Base.method(this, 'selectComponent'));
MochiKit.Signal.connect(this.getId('CSV_radio'), 'onclick', MochiKit.Base.method(this, 'selectComponent'));
MochiKit.Signal.connect(this.getId('Excel_radio'), 'onclick', MochiKit.Base.method(this, 'selectComponent'));
MochiKit.Signal.connect(this.getId('PasswordPlus_radio'), 'onclick', MochiKit.Base.method(this, 'selectComponent'));
MochiKit.Signal.connect(this.getId('Roboform_radio'), 'onclick', MochiKit.Base.method(this, 'selectComponent'));
MochiKit.Signal.connect(this.getId('KeePass_radio'), 'onclick', MochiKit.Base.method(this, 'selectComponent'));
if (Clipperz_IEisBroken != true) {
MochiKit.Signal.connect(this.getId('ClipperzExport_title'), 'onclick', this.getDom('ClipperzExport_radio'), 'click');
MochiKit.Signal.connect(this.getId('CSV_title'), 'onclick', this.getDom('CSV_radio'), 'click');
MochiKit.Signal.connect(this.getId('Excel_title'), 'onclick', this.getDom('Excel_radio'), 'click');
MochiKit.Signal.connect(this.getId('PasswordPlus_title'), 'onclick', this.getDom('PasswordPlus_radio'), 'click');
MochiKit.Signal.connect(this.getId('Roboform_title'), 'onclick', this.getDom('Roboform_radio'), 'click');
MochiKit.Signal.connect(this.getId('KeePass_title'), 'onclick', this.getDom('KeePass_radio'), 'click');
}
Clipperz.NotificationCenter.register(null, 'importCompleted', this, 'resetImportComponent');
Clipperz.NotificationCenter.register(null, 'importCancelled', this, 'resetImportComponent');
}
//MochiKit.Logging.logDebug("<<< Import.MainComponent.render");
},
//-------------------------------------------------------------------------
/*
'selectedFormat': function() {
return this.getDom('importSelectionOptions').value;
},
*/
//-------------------------------------------------------------------------
'updateSelectedImportWizardComponent': function(aComponent) {
var newWizardComponent;
//MochiKit.Logging.logDebug(">>> Import.MainComponent.updateSelectedImportWizardComponent");
this.getElement('wizardComponent').update("");
switch(aComponent) {
case 'CLIPPERZ_EXPORT':
newWizardComponent = new Clipperz.PM.Components.Import.ClipperzImportComponent(this.getElement('wizardComponent'), {user:this.user()});
break;
case 'CSV':
newWizardComponent = new Clipperz.PM.Components.Import.CSVImportComponent(this.getElement('wizardComponent'), {user:this.user()});
break;
case 'EXCEL':
newWizardComponent = new Clipperz.PM.Components.Import.ExcelImportComponent(this.getElement('wizardComponent'), {user:this.user()});
break;
case 'PASSWORD_PLUS':
newWizardComponent = new Clipperz.PM.Components.Import.PasswordPlusImportComponent(this.getElement('wizardComponent'), {user:this.user()});
break;
case 'ROBOFORM':
newWizardComponent = new Clipperz.PM.Components.Import.RoboFormImportComponent(this.getElement('wizardComponent'), {user:this.user()});;
break;
case 'KEEPASS':
newWizardComponent = new Clipperz.PM.Components.Import.KeePassImportComponent(this.getElement('wizardComponent'), {user:this.user()});
break;
}
this.setWizardComponent(newWizardComponent);
//MochiKit.Logging.logDebug("<<< Import.MainComponent.updateSelectedWizardComponent");
},
//-------------------------------------------------------------------------
'selectComponent': function(anEvent) {
this.setSelectedComponent(anEvent.src().value);
this.nextButton().enable();
},
'selectedComponent': function() {
return this._selectedComponent;
},
'setSelectedComponent': function(aValue) {
this._selectedComponent = aValue;
},
//-------------------------------------------------------------------------
'backAction': function() {
},
//-------------------------------------------------------------------------
'nextAction': function() {
this.updateSelectedImportWizardComponent(this.selectedComponent());
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,315 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.Import) == 'undefined') { Clipperz.PM.Components.Import = {}; }
//#############################################################################
Clipperz.PM.Components.Import.PasswordPlusImportComponent = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.Import.PasswordPlusImportComponent.superclass.constructor.call(this, anElement, args);
this.render();
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.Import.PasswordPlusImportComponent, Clipperz.PM.Components.Import.GenericImportComponent, {
'toString': function() {
return "Clipperz.PM.Components.Import.PasswordPlusImportComponent component";
},
//-------------------------------------------------------------------------
'render': function() {
//MochiKit.Logging.logDebug(">>> Import.PasswordPlusImportComponent.render");
this.domHelper().append(this.element(), {tag:'div', cls:'passwordPlusImportWizard', children:[
{tag:'h3', htmlString:Clipperz.PM.Strings['PasswordPlus_ImportWizard_Title']},
{tag:'div', cls:'importSteps', id:this.getId('importSteps')},
{tag:'div', cls:'importStepBlocks', children:[
{tag:'div', cls:'step_0', id:this.getId('step_0'), children:[
{tag:'div', children:[
{tag:'div', cls:'importOptionsDescription', htmlString:Clipperz.PM.Strings['importOptions_passwordPlus_description']},
{tag:'div', cls:'importOptionsParameters', children:[]},
this.textAreaConfig()
]}
]},
{tag:'div', cls:'step_1', id:this.getId('step_1'), children:[
{tag:'div', children:[
{tag:'div', id:this.getId('previewDiv'), html:"preview"}
]}
]},
{tag:'div', cls:'step_2', id:this.getId('step_2'), children:[
{tag:'div', children:[
{tag:'h4', html:"done"}
]}
]}
]},
{tag:'div', cls:'importOptionsButtons', children:[
{tag:'table', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', html:'&nbsp;'},
{tag:'td', children:[
{tag:'div', id:this.getId('backActionButton')}
]},
{tag:'td', html:'&nbsp;'},
{tag:'td', children:[
{tag:'div', id:this.getId('nextActionButton')}
]},
{tag:'td', html:'&nbsp;'}
]}
]}
]}
]}
]});
this.updateSteps();
this.setBackButton(new YAHOO.ext.Button(this.getDom('backActionButton'), {text:"back", handler:this.backAction, scope:this}));
this.setNextButton(new YAHOO.ext.Button(this.getDom('nextActionButton'), {text:"next", handler:this.nextAction, scope:this}));
this.getElement('step_0').setVisibilityMode(YAHOO.ext.Element.DISPLAY).show()
this.getElement('step_1').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
this.getElement('step_2').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
//MochiKit.Logging.logDebug("<<< Import.PasswordPlusImportComponent.render");
},
//-------------------------------------------------------------------------
/*
'backAction': function() {
switch (this.currentStep()) {
case 1: // -> 0
this.backButton().disable();
this.getElement('step_1').hide();
this.setCurrentStep(0);
this.getElement('step_0').show();
break;
}
},
*/
//-------------------------------------------------------------------------
'nextAction': function() {
switch (this.currentStep()) {
case 0: // -> 1
this.previewValues();
break;
case 1: // -> 2
this.importValues();
break;
}
},
//-------------------------------------------------------------------------
'deferredPreviewValues': function() {
var deferredResult;
// this.setFormValues(MochiKit.DOM.formContents(this.getDom('dataForm')));
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(MochiKit.Base.bind(function(res) {
this.startProcessing();
return res;
}, this));
deferredResult.addCallback(MochiKit.Base.method(this, 'processPasswordPlusValues'));
deferredResult.addCallback(MochiKit.Base.method(this, 'setProcessedValues'));
deferredResult.addCallback(MochiKit.Base.method(this, 'previewRecordValues'));
deferredResult.addCallback(MochiKit.Base.bind(function(res) {
this.processingDone();
this.getElement('step_0').hide();
this.getElement('step_1').show();
this.backButton().enable();
return res;
}, this));
// deferredResult.addErrback(MochiKit.Base.bind(function() {
// this.processingAborted();
// }, this))
deferredResult.callback(this.textAreaContent());
return deferredResult;
},
//-------------------------------------------------------------------------
'processPasswordPlusValues': function(someData) {
var deferredResult;
var csvProcessor;
csvProcessor = new Clipperz.CSVProcessor({binary:true});
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'parseImportData');
deferredResult.addCallback(function(res) {
return Clipperz.NotificationCenter.deferredNotification(this, 'updatedProgressState', {steps:(res.length * 2)}, res);
})
deferredResult.addCallback(MochiKit.Base.method(csvProcessor, 'deferredParse'));
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'previewImportData');
deferredResult.addCallback(function(res) {
return Clipperz.NotificationCenter.deferredNotification(this, 'updatedProgressState', {steps:(res.length * 2), step:res.length}, res);
})
deferredResult.addCallback(MochiKit.Base.bind(function(someCSVValues) {
var innerDeferredResult;
var records;
var i,c;
innerDeferredResult = new MochiKit.Async.Deferred();
records = [];
c = someCSVValues.length;
i=0;
i++; // Dataviz Passwords Plus Export, Version,1, Minimum Version To Read,1
i++; // Is Template,Title,Category,Field 1 Label,Field 1 Value,Field 1 Hidden,Field 2 Label,Field 2 Value,Field 2 Hidden,Field 3 Label,Field 3 Value,Field 3 Hidden,Field 4 Label,Field 4 Value,Field 4 Hidden,Field 5 Label,Field 5 Value,Field 5 Hidden,Field 6 Label,Field 6 Value,Field 6 Hidden,Field 7 Label,Field 7 Value,Field 7 Hidden,Field 8 Label,Field 8 Value,Field 8 Hidden,Field 9 Label,Field 9 Value,Field 9 Hidden,Field 10 Label,Field 10 Value,Field 10 Hidden,Note
for( ; i<c; i++) {
innerDeferredResult.addCallback(MochiKit.Async.wait, 0.2);
innerDeferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', {});
innerDeferredResult.addCallback(MochiKit.Base.bind(function(someRecords, someData) {
if (someData[0] == '0') {
var record;
var recordVersion;
var ii, cc;
record = new Clipperz.PM.DataModel.Record({user:this.user()});
if (someData[1] != "") {
record.setLabel(someData[1]);
} else {
record.setLabel("imported record [" + (i+1) + "]");
}
record.setNotes(someData[33]);
recordVersion = record.currentVersion()
cc = 10;
for (ii=0; ii<cc; ii++) {
var currentFieldValueIndex;
var currentType;
currentFieldValueIndex = (ii * 3) + 4;
if (someData[currentFieldValueIndex] != "") {
var recordField;
var recordFieldType;
recordFieldType = 'TXT';
if (someData[currentFieldValueIndex + 1] == 1) {
recordFieldType = 'PWD';
} else if (/^http/.test(someData[currentFieldValueIndex])) {
recordFieldType = 'URL';
}
recordField = new Clipperz.PM.DataModel.RecordField({
recordVersion: recordVersion,
label: someData[currentFieldValueIndex - 1],
value: someData[currentFieldValueIndex],
type: recordFieldType
});
recordVersion.addField(recordField);
}
}
// this.user().addRecord(record, true);
someRecords.push(record);
}
return someRecords;
}, this), records, someCSVValues[i]);
}
innerDeferredResult.addCallback(MochiKit.Async.succeed, records);
innerDeferredResult.callback();
return innerDeferredResult;
}, this));
deferredResult.callback(someData);
return deferredResult;
/*
0 Is Template
1 Title
2 Category
3 Field 1 Label
4 Field 1 Value
5 Field 1 Hidden
6 Field 2 Label
7 Field 2 Value
8 Field 2 Hidden
9 Field 3 Label
10 Field 3 Value
11 Field 3 Hidden
12 Field 4 Label
13 Field 4 Value
14 Field 4 Hidden
15 Field 5 Label
16 Field 5 Value
17 Field 5 Hidden
18 Field 6 Label
19 Field 6 Value
20 Field 6 Hidden
21 Field 7 Label
22 Field 7 Value
23 Field 7 Hidden
24 Field 8 Label
25 Field 8 Value
26 Field 8 Hidden
27 Field 9 Label
28 Field 9 Value
29 Field 9 Hidden
30 Field 10 Label
31 Field 10 Value
32 Field 10 Hidden
33 Note
*/
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,392 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.Import) == 'undefined') { Clipperz.PM.Components.Import = {}; }
//#############################################################################
Clipperz.PM.Components.Import.RoboFormImportComponent = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.Import.RoboFormImportComponent.superclass.constructor.call(this, anElement, args);
this.render();
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.Import.RoboFormImportComponent, Clipperz.PM.Components.Import.GenericImportComponent, {
'toString': function() {
return "Clipperz.PM.Components.Import.RoboFormImportComponent component";
},
//-------------------------------------------------------------------------
'render': function() {
//MochiKit.Logging.logDebug(">>> Import.RoboFormImportComponent.render");
this.domHelper().append(this.element(), {tag:'div', cls:'roboFormImportWizard', children:[
{tag:'h3', htmlString:Clipperz.PM.Strings['RoboForm_ImportWizard_Title']},
{tag:'div', cls:'importSteps', id:this.getId('importSteps')},
{tag:'div', cls:'importStepBlocks', children:[
{tag:'div', cls:'step_0', id:this.getId('step_0'), children:[
{tag:'div', children:[
{tag:'div', cls:'importOptionsDescription', htmlString:Clipperz.PM.Strings['importOptions_roboForm_description']},
{tag:'div', cls:'importOptionsParameters', children:[]},
this.textAreaConfig()
]}
]},
{tag:'div', cls:'step_1', id:this.getId('step_1'), children:[
{tag:'div', children:[
{tag:'div', id:this.getId('previewDiv'), html:"preview"}
]}
]},
{tag:'div', cls:'step_2', id:this.getId('step_2'), children:[
{tag:'div', children:[
{tag:'h4', html:"done"}
]}
]}
]},
{tag:'div', cls:'importOptionsButtons', children:[
{tag:'table', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', html:'&nbsp;'},
{tag:'td', children:[
{tag:'div', id:this.getId('backActionButton')}
]},
{tag:'td', html:'&nbsp;'},
{tag:'td', children:[
{tag:'div', id:this.getId('nextActionButton')}
]},
{tag:'td', html:'&nbsp;'}
]}
]}
]}
]}
]});
this.updateSteps();
this.setBackButton(new YAHOO.ext.Button(this.getDom('backActionButton'), {text:"back", handler:this.backAction, scope:this}));
this.setNextButton(new YAHOO.ext.Button(this.getDom('nextActionButton'), {text:"next", handler:this.nextAction, scope:this}));
this.getElement('step_0').setVisibilityMode(YAHOO.ext.Element.DISPLAY).show()
this.getElement('step_1').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
this.getElement('step_2').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
//MochiKit.Logging.logDebug("<<< Import.RoboFormImportComponent.render");
},
//-------------------------------------------------------------------------
'nextAction': function() {
switch (this.currentStep()) {
case 0: // -> 1
this.previewValues();
break;
case 1: // -> 2
this.importValues();
break;
}
},
//-------------------------------------------------------------------------
'deferredPreviewValues': function() {
var deferredResult;
// this.setFormValues(MochiKit.DOM.formContents(this.getDom('dataForm')));
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(MochiKit.Base.bind(function(res) {
this.startProcessing();
return res;
}, this));
deferredResult.addCallback(MochiKit.Base.method(this, 'processRoboFormValues'));
deferredResult.addCallback(MochiKit.Base.method(this, 'setProcessedValues'));
deferredResult.addCallback(MochiKit.Base.method(this, 'previewRecordValues'));
deferredResult.addCallback(MochiKit.Base.bind(function(res) {
this.processingDone();
this.getElement('step_0').hide();
this.getElement('step_1').show();
this.backButton().enable();
return res;
}, this));
// deferredResult.addErrback(MochiKit.Base.bind(function() {
// this.processingAborted();
// }, this))
deferredResult.callback(this.textAreaContent());
return deferredResult;
},
//-------------------------------------------------------------------------
'processRoboFormValues': function(someData) {
var result;
if (someData.match(/^\<HTML\>\<HEAD\>\<TITLE\>RoboForm Passcards List /g)) {
result = this.processRoboFormPasscardsValues(someData);
} else if (someData.match(/\<HTML\>\<HEAD\>\<TITLE\>RoboForm Safenotes List /g)) {
result = this.processRoboFormSafenotesValues(someData);
}
return result;
},
//.........................................................................
'processRoboFormPasscardsValues': function(someData) {
var deferredResult;
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RoboFormImportComponent.processRoboFormValues - 1: "/* + res*/); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'parseImportData');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RoboFormImportComponent.processRoboFormValues - 2: "/* + res*/); return res;});
deferredResult.addCallback(function(someData) {
var result;
var data;
data = someData.replace(/\r?\n/g, "");
result = data.match(/\<TABLE width\=\"100\%\"\>.*?\<\/TABLE\>/g);
return result;
});
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RoboFormImportComponent.processRoboFormValues - 3: "/* + res*/); return res;});
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RoboFormImportComponent.processRoboFormValues - 3.1: " + res.length); return res;});
deferredResult.addCallback(function(res) {
return Clipperz.NotificationCenter.deferredNotification(this, 'updatedProgressState', {steps:(res.length)}, res);
})
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RoboFormImportComponent.processRoboFormValues - 4: "/* + res*/); return res;});
deferredResult.addCallback(MochiKit.Base.bind(function(someRecordValues) {
var innerDeferredResult;
var records;
var i,c;
innerDeferredResult = new MochiKit.Async.Deferred();
records = [];
c = someRecordValues.length;
for(i=0; i<c; i++) {
//innerDeferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RoboFormImportComponent.processRoboFormValues __inner loop__ - 1: " + res); return res;});
innerDeferredResult.addCallback(MochiKit.Async.wait, 0.2);
//innerDeferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RoboFormImportComponent.processRoboFormValues __inner loop__ - 2: " + res); return res;});
innerDeferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', {});
//innerDeferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RoboFormImportComponent.processRoboFormValues __inner loop__ - 3: " + res); return res;});
innerDeferredResult.addCallback(MochiKit.Base.bind(function(someRecords, someData) {
var data;
var record;
var recordVersion;
var fields;
var ii, cc;
var hasNotes;
var caption;
var subcaption;
//MochiKit.Logging.logDebug("data: " + someData);
data = someData.replace(/\<WBR\>/g, "");
hasNotes = false;
/\<TD class\=caption colSpan\=3\>(.*?)\<\/TD\>/.test(data); // <TD class=caption colSpan=3>110mb</TD>
caption = RegExp.$1;
//MochiKit.Logging.logDebug("caption: " + caption);
/\<TD class\=subcaption colSpan\=3\>(.*?)\<\/TD\>/.test(data); // <TD class=subcaption colSpan=3>110<WBR>mb.com</TD>
subcaption = RegExp.$1;
//MochiKit.Logging.logDebug("subcaption: " + subcaption);
record = new Clipperz.PM.DataModel.Record({user:this.user()});
recordVersion = record.currentVersion()
record.setLabel(caption);
// record.setNotes(subcaption);
if (subcaption != null) {
var recordField;
recordField = new Clipperz.PM.DataModel.RecordField({
recordVersion: recordVersion,
label: "url",
value: subcaption,
type: 'URL'
});
recordVersion.addField(recordField);
}
fields = data.match(/\<TR\>.*?\<\/TR\>/g) || [];
cc = fields.length;
//MochiKit.Logging.logDebug("fields.length: " + cc);
for (ii=0; ii<cc; ii++) {
var recordField;
var fieldString;
var fieldName;
var fieldValue;
//MochiKit.Logging.logDebug("fieldString: " + fields[ii]);
fieldString = fields[ii];
//MochiKit.Logging.logDebug("fieldString (cleaned): " + fieldString);
/\<TD class\=field vAlign\=top align\=left width\=\"40\%\"\>(.*?)\<\/TD\>/.test(fieldString);
fieldName = RegExp.$1;
/\<TD class\=wordbreakfield vAlign\=top align\=left width\=\"55\%\"\>(.*?)\<\/TD\>/.test(fieldString);
fieldValue = RegExp.$1;
if (fieldName == "Note$") {
record.setNotes(fieldValue);
hasNotes = true;
} else {
var fieldType;
if (((ii == 1) && (hasNotes == false)) || ((ii == 2) && (hasNotes == true))) {
fieldType = 'PWD';
} else {
fieldType = 'TXT';
}
recordField = new Clipperz.PM.DataModel.RecordField({
recordVersion: recordVersion,
label: fieldName,
value: fieldValue,
type: fieldType
});
recordVersion.addField(recordField);
}
}
someRecords.push(record);
return someRecords;
}, this), records, someRecordValues[i]);
}
//innerDeferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RoboFormImportComponent.processRoboFormValues __inner loop__ - 4: " + res); return res;});
innerDeferredResult.addCallback(MochiKit.Async.succeed, records);
//innerDeferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RoboFormImportComponent.processRoboFormValues __inner loop__ - 5: " + res); return res;});
innerDeferredResult.callback();
return innerDeferredResult;
}, this));
deferredResult.callback(someData);
return deferredResult;
},
//.........................................................................
'processRoboFormSafenotesValues': function(someData) {
var deferredResult;
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RoboFormImportComponent.processRoboFormValues - 1: "/* + res*/); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'parseImportData');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RoboFormImportComponent.processRoboFormValues - 2: "/* + res*/); return res;});
deferredResult.addCallback(function(someData) {
var result;
var data;
data = someData.replace(/\r?\n/g, "");
result = data.match(/\<TABLE width\=\"100\%\"\>.*?\<\/TABLE\>/g);
return result;
});
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RoboFormImportComponent.processRoboFormValues - 3: "/* + res*/); return res;});
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RoboFormImportComponent.processRoboFormValues - 3.1: " + res.length); return res;});
deferredResult.addCallback(function(res) {
return Clipperz.NotificationCenter.deferredNotification(this, 'updatedProgressState', {steps:(res.length)}, res);
})
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RoboFormImportComponent.processRoboFormValues - 4: "/* + res*/); return res;});
deferredResult.addCallback(MochiKit.Base.bind(function(someRecordValues) {
var innerDeferredResult;
var records;
var i,c;
innerDeferredResult = new MochiKit.Async.Deferred();
records = [];
c = someRecordValues.length;
for(i=0; i<c; i++) {
//innerDeferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RoboFormImportComponent.processRoboFormValues __inner loop__ - 1: " + res); return res;});
innerDeferredResult.addCallback(MochiKit.Async.wait, 0.2);
//innerDeferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RoboFormImportComponent.processRoboFormValues __inner loop__ - 2: " + res); return res;});
innerDeferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', {});
//innerDeferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RoboFormImportComponent.processRoboFormValues __inner loop__ - 3: " + res); return res;});
innerDeferredResult.addCallback(MochiKit.Base.bind(function(someRecords, someData) {
var data;
var record;
var recordVersion;
var caption;
var wordbreakfield;
//MochiKit.Logging.logDebug("data: " + someData);
data = someData.replace(/\<WBR\>/g, "");
hasNotes = false;
/\<TD class\=caption colSpan\=3\>(.*?)\<\/TD\>/.test(data); // <TD class=caption colSpan=3>110mb</TD>
caption = RegExp.$1;
//MochiKit.Logging.logDebug("caption: " + caption);
/\<TD class\=wordbreakfield vAlign=top align\=left width\=\"\1\0\0\%\"\>(.*?)\<\/TD\>/.test(data); // <TD class=wordbreakfield vAlign=top align=left width="100%">7759500</TD>
wordbreakfield = RegExp.$1;
//MochiKit.Logging.logDebug("subcaption: " + subcaption);
record = new Clipperz.PM.DataModel.Record({user:this.user()});
recordVersion = record.currentVersion()
record.setLabel(caption);
record.setNotes(wordbreakfield);
someRecords.push(record);
return someRecords;
}, this), records, someRecordValues[i]);
}
//innerDeferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RoboFormImportComponent.processRoboFormValues __inner loop__ - 4: " + res); return res;});
innerDeferredResult.addCallback(MochiKit.Async.succeed, records);
//innerDeferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RoboFormImportComponent.processRoboFormValues __inner loop__ - 5: " + res); return res;});
innerDeferredResult.callback();
return innerDeferredResult;
}, this));
deferredResult.callback(someData);
return deferredResult;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,224 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
Clipperz.PM.Components.MessageBoxImplementation = function() {
this._step = 0;
this._steps = 0;
return this;
};
//YAHOO.extendX(Clipperz.PM.Components.MessageBoxImplementation, Clipperz.PM.Components.BaseComponent, {
Clipperz.PM.Components.MessageBoxImplementation.prototype = MochiKit.Base.update(null, {
'toString': function() {
return "Clipperz.PM.Components.MessageBox";
},
//-----------------------------------------------------
'step': function() {
return this._step;
},
'setStep': function(aValue) {
if (aValue == 'next') {
this._step = this._step + 1;
} else {
this._step = aValue;
}
if (this._step > this.steps()) {
//MochiKit.Logging.logDebug("overstepping: " + this._step + " (" + this.steps() + ")");
this._step = this.steps();
}
},
//-----------------------------------------------------
'steps': function() {
return this._steps;
},
'setSteps': function(aValue) {
if (aValue.constructor == String) {
if (aValue.charAt(0) == '+') {
this._steps += aValue.substring(1)*1;
} else if (aValue.charAt(0) == '-') {
this._steps -= aValue.substring(1)*1;
} else {
this._steps = aValue.substring(1)*1;
}
} else {
this._steps = aValue;
}
},
//-----------------------------------------------------
'deferredShow': function(aConfiguration, anAnimationTargetElement, aValue) {
this.show(aConfiguration, anAnimationTargetElement);
return aValue;
},
'show': function(aConfiguration, anAnimationTargetElement) {
var messageBoxConfiguration;
messageBoxConfiguration = MochiKit.Base.clone(aConfiguration);
messageBoxConfiguration.msg = messageBoxConfiguration.text;
messageBoxConfiguration.animEl = anAnimationTargetElement;
messageBoxConfiguration.progress = messageBoxConfiguration.showProgressBar;
messageBoxConfiguration.closable = messageBoxConfiguration.showCloseButton;
this.setSteps(aConfiguration.steps || 0);
this.setStep(aConfiguration.step || 0);
delete messageBoxConfiguration.buttons;
Clipperz.YUI.MessageBox.show(messageBoxConfiguration);
},
//-----------------------------------------------------
'update': function(someValues) {
//MochiKit.Logging.logDebug(">>> MessageBox.update");
if (someValues.title) {
Clipperz.YUI.MessageBox.getDialog().setTitle(someValues.title);
};
if (someValues.text) {
Clipperz.YUI.MessageBox.updateText(someValues.text);
};
if (typeof(someValues.showProgressBar) != 'undefined') {
Clipperz.YUI.MessageBox.progressElement().setDisplayed(someValues.showProgressBar);
Clipperz.YUI.MessageBox.updateProgress(0);
};
if (typeof(someValues.steps) != 'undefined') {
this.setSteps(someValues.steps);
};
if (typeof(someValues.step) != 'undefined') {
this.setStep(someValues.step);
} else {
this.setStep('next');
}
Clipperz.YUI.MessageBox.updateProgress(this.step() / this.steps());
if (typeof(someValues.fn) != 'undefined') {
Clipperz.YUI.MessageBox.opt().fn = someValues.fn;
};
if (typeof(someValues.scope) != 'undefined') {
Clipperz.YUI.MessageBox.opt().scope = someValues.scope;
};
if (someValues.buttons) {
Clipperz.YUI.MessageBox.updateButtons(someValues.buttons);
};
// if (someValues.title) {
// Clipperz.YUI.MessageBox.getDialog().setTitle(someValues.title + " [" + this.step() + " / " + this.steps() + "]");
// };
//MochiKit.Logging.logDebug("--- MessageBox.update - step: " + this.step() + " / " + this.steps() + " - " + someValues.text);
//MochiKit.Logging.logDebug("<<< MessageBox.update");
},
//-----------------------------------------------------
'hide': function(anAnimationTargetElement) {
if (anAnimationTargetElement) {
Clipperz.YUI.MessageBox.getDialog().animateTarget = anAnimationTargetElement;
}
Clipperz.YUI.MessageBox.hide();
},
//-----------------------------------------------------
__syntaxFix__: '__syntaxFix__'
});
//##########################################################
_clipperz_pm_components_messageBox = null;
Clipperz.PM.Components.MessageBox = function() {
if (_clipperz_pm_components_messageBox == null) {
_clipperz_pm_components_messageBox = new Clipperz.PM.Components.MessageBoxImplementation();
}
return _clipperz_pm_components_messageBox;
}
//---------------------------------------------------------
Clipperz.PM.Components.MessageBox.showProgressPanel = function(aCallback, anErrback, anActivationItem) {
var deferredResult;
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Clipperz.PM.Components.MessageBox.showProgressPanel - 0: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Components.MessageBox(), 'deferredShow'),
{
title: "",
text: "",
width:240,
showProgressBar:true,
showCloseButton:false,
fn:MochiKit.Base.method(deferredResult, 'cancel'),
scope:this,
buttons:{
// 'ok':Clipperz.PM.Strings['loginMessagePanelInitialButtonLabel']
}
},
anActivationItem
);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Clipperz.PM.Components.MessageBox.showProgressPanel - 1: " + res); return res;});
deferredResult.addCallback(aCallback);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Clipperz.PM.Components.MessageBox.showProgressPanel - 2: " + res); return res;});
deferredResult.addCallback(MochiKit.Async.wait, 0.5);
deferredResult.addCallback(function(res) {
Clipperz.PM.Components.MessageBox().hide(YAHOO.ext.Element.get(anActivationItem));
return res;
});
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Clipperz.PM.Components.MessageBox.showProgressPanel - 3: " + res); return res;});
deferredResult.addErrback(anErrback);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Clipperz.PM.Components.MessageBox.showProgressPanel - 4: " + res); return res;});
deferredResult.callback();
return deferredResult;
};

View File

@@ -0,0 +1,490 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.OTP) == 'undefined') { Clipperz.PM.Components.OTP = {}; }
//#############################################################################
Clipperz.PM.Components.OTP.MainComponent = function(anElement, args) {
args = args || {};
//MochiKit.Logging.logDebug("new OTP.MainComponent");
Clipperz.PM.Components.OTP.MainComponent.superclass.constructor.call(this, anElement, args);
this._user = args.user;
this._shouldRender = true;
this._deleteButton = null;
this._printButton = null;
Clipperz.NotificationCenter.register(null, 'tabSelected', this, 'tabSelectedHandler');
// Clipperz.NotificationCenter.register(null, 'oneTimePasswordAdded', this, 'render');
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.OTP.MainComponent, Clipperz.PM.Components.BaseComponent, {
'toString': function() {
return "Clipperz.PM.Components.OTP.MainComponent component";
},
//-------------------------------------------------------------------------
'render': function() {
//MochiKit.Logging.logDebug("### OTP.MainComponent.render");
Clipperz.NotificationCenter.unregister(this);
MochiKit.Signal.disconnectAllTo(this);
if (Clipperz.PM.Proxy.defaultProxy.isReadOnly()) {
this.element().update("");
this.domHelper().append(this.element(), {tag:'div', cls:'oneTimePasswordReadOnlyMessage', htmlString:Clipperz.PM.Strings['oneTimePasswordReadOnlyMessage']});
} else {
var deferredResult;
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OTP.MainComponent.render - 1: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.bind(function() {
this.element().update("");
Clipperz.YUI.DomHelper.append(this.element(), {tag:'div', htmlString:Clipperz.PM.Strings['oneTimePasswordLoadingMessage']});
}, this));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OTP.MainComponent.render - 2: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.user(), 'loadOneTimePasswords'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OTP.MainComponent.render - 3: " + res); return res;});
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OTP.MainComponent.render - 3.1: " + Clipperz.Base.serializeJSON(res.serializedData())); return res;});
deferredResult.addCallback(MochiKit.Base.bind(function(aResult) {
var tbodyElement;
var oneTimePasswordReferenceKeys;
var imageExtension;
var isThereAnyActiveOneTimePassword;
isThereAnyActiveOneTimePassword = false;
this.element().update("");
Clipperz.YUI.DomHelper.append(this.element(), {tag:'div', id:'oneTimePasswordList', children:[
{tag:'div', id:'oneTimePasswords_header', children:[
{tag:'table', width:'100%', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', width:'10%', children:[
{tag:'div', id:this.getId('createNewOneTimePasswordButton')}
]},
{tag:'td', width:'40%', children:[
{tag:'div', id:this.getId('deleteSelectedOneTimePasswordButton')}
]},
{tag:'td', width:'50%', align:'right', children:[
{tag:'div', id:this.getId('printOneTimePasswordButton')}
]}
]}
]}
]},
{tag:'div', children:[
{tag:'ul', children:[
{tag:'li', children:[
{tag:'span', htmlString:Clipperz.PM.Strings['oneTimePasswordSelectionLink_selectLabel']}
]},
{tag:'li', children:[
{tag:'a', href:'#', id:this.getId('selectAllOneTimePasswords_link'), htmlString:Clipperz.PM.Strings['oneTimePasswordSelectionLink_all']}
]},
{tag:'li', children:[
{tag:'a', href:'#', id:this.getId('selectNoneOneTimePasswords_link'), htmlString:Clipperz.PM.Strings['oneTimePasswordSelectionLink_none']}
]},
{tag:'li', children:[
{tag:'a', href:'#', id:this.getId('selectUsedOneTimePasswords_link'), htmlString:Clipperz.PM.Strings['oneTimePasswordSelectionLink_used']}
]},
{tag:'li', children:[
{tag:'a', href:'#', id:this.getId('selectUnusedOneTimePasswords_link'), htmlString:Clipperz.PM.Strings['oneTimePasswordSelectionLink_unused']}
]}
]}
]}
]},
{tag:'form', id:this.getId('oneTimePasswords_form'), children:[
{tag:'table', cls:'oneTimePassword', cellspacing:'0', cellpadding:'2', children:[
{tag:'tbody', id:this.getId('oneTimePasswords_tbody'), children:[
]}
]}
]}
]});
imageExtension = (Clipperz_IEisBroken == true) ? 'gif': 'png';
tbodyElement = this.getElement('oneTimePasswords_tbody');
oneTimePasswordReferenceKeys = MochiKit.Base.keys(this.user().oneTimePasswordManager().oneTimePasswords()).reverse();
c = oneTimePasswordReferenceKeys.length;
if (c>0) {
for (i=0; i<c; i++) {
var otpReference;
var currentOTP;
var loginSessionInfoConfig;
imageExtension = (Clipperz_IEisBroken == true) ? 'gif': 'png';
otpReference = oneTimePasswordReferenceKeys[i];
currentOTP = this.user().oneTimePasswordManager().oneTimePasswords()[otpReference];
switch (currentOTP.status()) {
case 'USED':
var loginSessionInfo;
loginSessionInfo = currentOTP.connectionInfo();
try {
var ip;
ip = (currentOTP.connectionInfo()['ip'].match(/^\d{1,3}(.\d{1,3}){3}$/)) ? currentOTP.connectionInfo()['ip'] : Clipperz.PM.Strings['unknown_ip'];
loginSessionInfoConfig = [
{tag:'div', cls:'oneTimePassword_usageDateDescription', children:[
{tag:'span', cls:'value', html:Clipperz.PM.Date.getElapsedTimeDescription(currentOTP.usageDate())}
]},
{tag:'div', cls:'oneTimePassword_usageDetails', children:[
{tag:'img', cls:'flag', title:Clipperz.PM.Strings['countries'][ loginSessionInfo['country']], src:Clipperz.PM.Strings['icons_baseUrl'] + "/flags/" + loginSessionInfo['country'].toLowerCase() + "." + imageExtension, width:'32', height:'32'},
{tag:'img', cls:'browser', title:Clipperz.PM.Strings['browsers'][ loginSessionInfo['browser']], src:Clipperz.PM.Strings['icons_baseUrl'] + "/browsers/" + loginSessionInfo['browser'].toLowerCase() + "." + imageExtension, width:'32', height:'32'},
{tag:'img', cls:'operatingSystem', title:Clipperz.PM.Strings['operatingSystems'][loginSessionInfo['operatingSystem']], src:Clipperz.PM.Strings['icons_baseUrl'] + "/operatingSystems/" + loginSessionInfo['operatingSystem'].toLowerCase() + "." + imageExtension, width:'32', height:'32'}
]},
{tag:'div', cls:'oneTimePassword_usageDate', html:Clipperz.PM.Date.formatDateWithTemplate(currentOTP.usageDate(), Clipperz.PM.Strings['fullDate_format'])},
{tag:'div', cls:'oneTimePassword_IP', children:[
{tag:'span', cls:'oneTimePassword_IPLabel', htmlString:Clipperz.PM.Strings['loginHistoryIPLabel']},
{tag:'span', cls:'oneTimePassword_IPValue', html:ip}
]}
];
} catch(exception) {
MochiKit.Logging.logWarning("an error occured while showing the One Time Password session details");
loginSessionInfoConfig = [];
}
break;
case 'DISABLED':
loginSessionInfoConfig = [
{tag:'span', cls:'disabledOneTimePassword', htmlString:Clipperz.PM.Strings['disabledOneTimePassword_warning']}
];
break;
case 'ACTIVE':
default:
loginSessionInfoConfig = [];
break;
}
if (currentOTP.isExpired() == false) {
isThereAnyActiveOneTimePassword = true;
};
this.domHelper().append(tbodyElement, {tag:'tr', cls:(currentOTP.isExpired() ? 'oneTimePassword_used': 'oneTimePassword_new'), children:[
{tag:'td', valign:'top', children:[
{tag:'input', type:'checkbox', cls:'otpCheckbox', name:currentOTP.reference()}
]},
{tag:'td', valign:'top', children:[
{tag:'span', cls:'oneTimePassword_value', html:currentOTP.password()}
]},
{tag:'td', valign:'top', children:[
{tag:'div', cls:'oneTimePassword_usageStats', children:loginSessionInfoConfig}
]}
]});
}
} else {
this.domHelper().append(tbodyElement, {tag:'tr', children:[
{tag:'td', children:[
{tag:'div', cls:'oneTimePassword_noPasswordPresent', htmlString:Clipperz.PM.Strings['oneTimePasswordNoPasswordAvailable']}
]}
]});
}
new YAHOO.ext.Button(this.getDom('createNewOneTimePasswordButton'), {text:Clipperz.PM.Strings['createNewOTPButtonLabel'], handler:this.createNewOneTimePassword, scope:this});
this.setDeleteButton(new YAHOO.ext.Button(this.getDom('deleteSelectedOneTimePasswordButton'), {text:Clipperz.PM.Strings['deleteOTPButtonLabel'], handler:this.deleteSelectedOneTimePasswords, scope:this}));
this.setPrintButton(new YAHOO.ext.Button(this.getDom('printOneTimePasswordButton'), {text:Clipperz.PM.Strings['printOTPButtonLabel'], handler:this.printOneTimePasswords, scope:this}));
MochiKit.Signal.connect(this.getId('selectAllOneTimePasswords_link'), 'onclick', this, 'selectAllOneTimePasswords');
MochiKit.Signal.connect(this.getId('selectNoneOneTimePasswords_link'), 'onclick', this, 'selectNoneOneTimePasswords');
MochiKit.Signal.connect(this.getId('selectUsedOneTimePasswords_link'), 'onclick', this, 'selectUsedOneTimePasswords');
MochiKit.Signal.connect(this.getId('selectUnusedOneTimePasswords_link'),'onclick', this, 'selectUnusedOneTimePasswords');
MochiKit.Base.map(MochiKit.Base.bind(function(aCheckbox) {
MochiKit.Signal.connect(aCheckbox, 'onclick', this, 'handleCheckboxClick');
}, this), this.oneTimePasswordCheckboxes());
this.updateDeleteButtonStatus();
if (isThereAnyActiveOneTimePassword == true) {
this.printButton().enable();
} else {
this.printButton().disable();
}
// Clipperz.NotificationCenter.register(null, 'oneTimePasswordAdded', this, 'render');
Clipperz.NotificationCenter.register(null, 'oneTimePassword_saveChanges_done', this, 'render');
}, this));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OTP.MainComponent.render - 4: " + res); return res;});
deferredResult.callback();
}
},
//-------------------------------------------------------------------------
'printOneTimePasswords': function() {
var newWindow;
var activeOneTimePasswords;
//MochiKit.Logging.logDebug(">>> printAllData");
newWindow = window.open("", "");
newWindow.document.write(
"<html>" +
"<header>" +
" <title>Clipperz One Time Password</title>" +
"<style>" +
"div.oneTimePassword_print h2 {" +
" font-family: monospace;" +
" font-weight: normal;" +
" padding: 10px 20px;" +
"}" +
"</style>" +
"" +
"<!--[if IE]>" +
"<style>" +
"</style>" +
"<![endif]-->" +
"" +
"</header>" +
"<body>" +
"</body>" +
"</html>"
);
activeOneTimePasswords = MochiKit.Base.filter(function(aOneTimePassword) {return (aOneTimePassword.isExpired() == false)}, MochiKit.Base.values(this.user().oneTimePasswordManager().oneTimePasswords()).reverse());
MochiKit.Iter.forEach(activeOneTimePasswords, MochiKit.Base.partial(function(aWindow, aOneTimePassword) {
MochiKit.DOM.withWindow(aWindow, MochiKit.Base.partial(function(aOneTimePassword) {
var newBlock;
newBlock = MochiKit.DOM.DIV({'class': 'oneTimePassword_print'},
MochiKit.DOM.H2(null, aOneTimePassword.password())
);
MochiKit.DOM.appendChildNodes(MochiKit.DOM.currentDocument().body, newBlock);
}, aOneTimePassword));
}, newWindow));
},
//-------------------------------------------------------------------------
'generateRandomBase32OTPValue': function(aButton) {
var randomValue;
var result;
randomValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(160/8);
result = randomValue.toBase32String();
result = result.replace(/.{4}\B/g, '$&' + ' ');
result = result.replace(/(.{4} ){2}/g, '$&' + '- ');
return result;
},
//-------------------------------------------------------------------------
'createNewOneTimePassword': function() {
var newOneTimePassword;
var password;
password = this.generateRandomBase32OTPValue();
newOneTimePassword = new Clipperz.PM.DataModel.OneTimePassword({
user:this.user(),
password:password
});
this.user().oneTimePasswordManager().addOneTimePassword(newOneTimePassword);
Clipperz.PM.Components.MessageBox.showProgressPanel(MochiKit.Base.method(newOneTimePassword, 'saveChanges'), null, this.getDom('createNewOneTimePasswordButton'));
},
//-------------------------------------------------------------------------
'oneTimePasswordCheckboxes': function() {
return MochiKit.DOM.getElementsByTagAndClassName('input', 'otpCheckbox', this.getId('oneTimePasswords_tbody'));
},
'checkedOneTimePasswordCheckboxes': function() {
return MochiKit.Base.filter(function(aCheckbox) {return (aCheckbox.checked == true)}, this.oneTimePasswordCheckboxes());
},
//-------------------------------------------------------------------------
'selectAllOneTimePasswords': function(anEvent) {
var checkboxes;
var i,c;
anEvent.stop();
checkboxes = this.oneTimePasswordCheckboxes();
c = checkboxes.length;
for (i=0; i<c; i++) {
checkboxes[i].checked = true;
}
this.updateDeleteButtonStatus();
},
'selectNoneOneTimePasswords': function(anEvent) {
var checkboxes;
var i,c;
anEvent.stop();
checkboxes = this.oneTimePasswordCheckboxes();
c = checkboxes.length;
for (i=0; i<c; i++) {
checkboxes[i].checked = false;
}
this.updateDeleteButtonStatus();
},
'selectUsedOneTimePasswords': function(anEvent) {
var checkboxes;
var oneTimePasswordManager;
var i,c;
anEvent.stop();
oneTimePasswordManager = this.user().oneTimePasswordManager();
checkboxes = this.oneTimePasswordCheckboxes();
c = checkboxes.length;
for (i=0; i<c; i++) {
var matchingOneTimePassword;
matchingOneTimePassword = oneTimePasswordManager.oneTimePasswordWithReference(checkboxes[i].name);
checkboxes[i].checked = matchingOneTimePassword.isExpired();
}
this.updateDeleteButtonStatus();
},
'selectUnusedOneTimePasswords': function(anEvent) {
var checkboxes;
var oneTimePasswordManager;
var i,c;
anEvent.stop();
oneTimePasswordManager = this.user().oneTimePasswordManager();
checkboxes = this.oneTimePasswordCheckboxes();
c = checkboxes.length;
for (i=0; i<c; i++) {
var matchingOneTimePassword;
matchingOneTimePassword = oneTimePasswordManager.oneTimePasswordWithReference(checkboxes[i].name);
checkboxes[i].checked = !matchingOneTimePassword.isExpired();
}
this.updateDeleteButtonStatus();
},
//-------------------------------------------------------------------------
'handleCheckboxClick': function(anEvent) {
this.updateDeleteButtonStatus();
},
//-------------------------------------------------------------------------
'deleteSelectedOneTimePasswords': function() {
var deferredResult;
var otpToDelete;
var i,c;
otpToDelete = this.checkedOneTimePasswordCheckboxes();
c = otpToDelete.length;
for (i=0; i<c; i++) {
//MochiKit.Logging.logDebug("otp to delete: " + otpToDelete[i].name);
this.user().oneTimePasswordManager().deleteOneTimePasswordWithReference(otpToDelete[i].name);
};
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("ActiveOTPPanel.deleteSelectedOneTimePasswords - 0: " + res); return res;});
deferredResult.addCallback(Clipperz.PM.Components.MessageBox.showProgressPanel, MochiKit.Base.method(this.user().oneTimePasswordManager(), 'saveChanges'), null, null);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("ActiveOTPPanel.deleteSelectedOneTimePasswords - 1: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'render'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("ActiveOTPPanel.deleteSelectedOneTimePasswords - 2: " + res); return res;});
deferredResult.callback();
},
//-------------------------------------------------------------------------
'user': function() {
return this._user;
},
//-------------------------------------------------------------------------
'shouldRender': function() {
return this._shouldRender;
},
'setShouldRender': function(aValue) {
this._shouldRender = aValue;
},
'tabSelectedHandler': function(anEvent) {
if ((this.shouldRender()) && (anEvent.source().selectedTab() == 'manageOTPTab')) {
this.render();
this.setShouldRender(false);
}
},
//-------------------------------------------------------------------------
'deleteButton': function() {
return this._deleteButton;
},
'setDeleteButton': function(aValue) {
this._deleteButton = aValue;
},
'updateDeleteButtonStatus': function() {
if (this.checkedOneTimePasswordCheckboxes().length > 0) {
this.deleteButton().enable();
} else {
this.deleteButton().disable();
}
},
//-------------------------------------------------------------------------
'printButton': function() {
return this._printButton;
},
'setPrintButton': function(aValue) {
this._printButton = aValue;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,784 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.Panels) == 'undefined') { Clipperz.PM.Components.Panels = {}; }
//#############################################################################
Clipperz.PM.Components.Panels.AccountPanel = function(anElement, args) {
//MochiKit.Logging.logDebug(">>> new AccountPanel");
args = args || {};
Clipperz.PM.Components.Panels.AccountPanel.superclass.constructor.call(this, anElement, args);
Clipperz.NotificationCenter.register(null, 'setupDone', this, 'render');
this._shouldLoadLoginHistory = true;
// this.render();
//MochiKit.Logging.logDebug("<<< new AccountPanel");
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.Panels.AccountPanel, Clipperz.PM.Components.Panels.BasePanel, {
'toString': function() {
return "Clipperz.PM.Components.AccountPanel component";
},
//-------------------------------------------------------------------------
'render': function() {
var errorMessageActor;
var changePasswordButton;
var deleteAccountButton;
try {
//MochiKit.Logging.logDebug(">>> AccountPanel.render");
Clipperz.NotificationCenter.unregister(this);
MochiKit.Signal.disconnectAllTo(this);
this.element().update("");
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'table', border:'0', cellspacing:'0', cellpadding:'0', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', valign:'top', width:'200', children:[
{tag:'ul', id:"accountSubMenu", cls:'subMenu', children:[
{tag:'li', id:'changePassphraseTab', htmlString:Clipperz.PM.Strings['changePasswordTabLabel']},
{tag:'li', id:'manageOTPTab', htmlString:Clipperz.PM.Strings['manageOTPTabLabel']},
{tag:'li', id:'accountPreferencesTab', htmlString:Clipperz.PM.Strings['accountPreferencesLabel']},
{tag:'li', id:'loginHistoryTab', htmlString:Clipperz.PM.Strings['accountLoginHistoryLabel']},
{tag:'li', id:'deleteAccountTab', htmlString:Clipperz.PM.Strings['deleteAccountTabLabel']}
// {tag:'li', id:'paidAccountTab'), htmlString:Clipperz.PM.Strings['paidAccountTabLabel']}
]}
]},
{tag:'td', valign:'top', children:[
{tag:'ul', cls:'clipperzTabPanels', children:[
{tag:'li', id:this.getId('changePassphrasePanel'), children:[
{tag:'div', cls:'clipperzSubPanel', children:[
{tag:'h5', htmlString:Clipperz.PM.Strings['changePasswordTabTitle']},
{tag:'div', cls:'panelBody', id:'changePassphraseBlock', children:[
{tag:'form', id:this.getId('changePassphraseForm'), children:[
{tag:'h5', cls:'errorMessage', id:this.getId('changePassphrase_errorMessage')},
{tag:'table', cls:'panelBody', children:[
{tag:'tr', children:[
{tag:'td', children:[
{tag:'span', cls:'formLabel', htmlString:Clipperz.PM.Strings['changePasswordFormUsernameLabel']}
]},
{tag:'td', children:[
{tag:'input', type:'text', name:'username', id:this.getId('changePassphrase_username')}
]}
]},
{tag:'tr', children:[
{tag:'td', children:[
{tag:'span', cls:'formLabel', htmlString:Clipperz.PM.Strings['changePasswordFormOldPassphraseLabel']}
]},
{tag:'td', children:[
{tag:'input', type:'password', name:'oldPassphrase', id:this.getId('changePassphrase_oldPassphrase')}
]}
]},
{tag:'tr', children:[
{tag:'td', children:[
{tag:'span', cls:'formLabel', htmlString:Clipperz.PM.Strings['changePasswordFormNewPassphraseLabel']}
]},
{tag:'td', children:[
{tag:'input', type:'password', name:'newPassphrase', id:this.getId('changePassphrase_newPassphrase')}
]}
]},
{tag:'tr', children:[
{tag:'td', children:[
{tag:'span', cls:'formLabel', htmlString:Clipperz.PM.Strings['changePasswordFormRetypePassphraseLabel']}
]},
{tag:'td', children:[
{tag:'input', type:'password', name:'renewPassphrase', id:this.getId('changePassphrase_renewPassphrase')}
]}
]},
{tag:'tr', children:[
{tag:'td', align:'right', children:[
{tag:'input', type:'checkbox', id:this.getId('changePassphrase_safetyCheck')}
]},
{tag:'td', children:[
{tag:'span', htmlString:Clipperz.PM.Strings['changePasswordFormSafetyCheckboxLabel']}
]}
]}
]},
{tag:'div', cls:'clipperzSubPanelButtonBox', children:[
{tag:'div', id:this.getId('changePassphraseButton')}
]}
]}
]}
]}
]},
{tag:'li', id:this.getId('manageOTPPanel'), children:[
{tag:'div', cls:'clipperzSubPanel', children:[
{tag:'h5', htmlString:Clipperz.PM.Strings['manageOTPTabTitle']},
{tag:'div', cls:'panelDescription', htmlString:Clipperz.PM.Strings['manageOTPTabDescription']},
{tag:'div', id:'OTPComponent'}
]}
]},
{tag:'li', id:this.getId('accountPreferencesPanel'), children:[
{tag:'div', cls:'clipperzSubPanel', children:[
{tag:'h5', htmlString:Clipperz.PM.Strings['accountPreferencesTabTitle']},
{tag:'div', cls:'panelBody', id:this.getId('preferencesPanelBody')}
]}
]},
{tag:'li', id:this.getId('loginHistoryAccountPanel'), children:[
{tag:'div', cls:'clipperzSubPanel', children:[
{tag:'h5', htmlString:Clipperz.PM.Strings['loginHistoryTabTitle']},
{tag:'div', cls:'panelBody', id:'loginHistoryAccountBlock'}
]}
]},
{tag:'li', id:this.getId('deleteAccountPanel'), children:[
{tag:'div', cls:'clipperzSubPanel', children:[
{tag:'h5', htmlString:Clipperz.PM.Strings['deleteAccountTabTitle']},
{tag:'div', cls:'panelBody', id:'deleteAccountBlock', children:[
{tag:'form', id:this.getId('deleteAccountForm'), children:[
{tag:'h5', cls:'errorMessage', id:this.getId('deleteAccount_errorMessage')},
{tag:'table', cls:'panelBody', children:[
{tag:'tr', children:[
{tag:'td', children:[
{tag:'span', cls:'formLabel', htmlString:Clipperz.PM.Strings['deleteAccountFormUsernameLabel']}
]},
{tag:'td', children:[
{tag:'input', type:'text', name:'username', id:this.getId('deleteAccount_username')}
]}
]},
{tag:'tr', children:[
{tag:'td', children:[
{tag:'span', cls:'formLabel', htmlString:Clipperz.PM.Strings['deleteAccountFormPassphraseLabel']}
]},
{tag:'td', children:[
{tag:'input', type:'password', name:'passphrase', id:this.getId('deleteAccount_passphrase')}
]}
]},
{tag:'tr', children:[
{tag:'td', align:'right', children:[
{tag:'input', type:'checkbox', id:this.getId('deleteAccount_safetyCheck')}
]},
{tag:'td', children:[
{tag:'span', htmlString:Clipperz.PM.Strings['deleteAccountFormSafetyCheckboxLabel']}
]}
]}
]},
{tag:'div', cls:'clipperzSubPanelButtonBox', children:[
{tag:'div', id:this.getId('deleteAccountButton')}
]}
]}
]}
]}
]}
/*
{tag:'li', id:this.getId('paidAccountPanel'), children:[
{tag:'div', cls:'clipperzSubPanel', children:[
{tag:'h5', htmlString:Clipperz.PM.Strings['upgradeAccountTabTitle']},
{tag:'div', htmlString:Clipperz.PM.Strings['comingSoon']}
]}
]}
*/
]}
]}
]}
]}
]});
//MochiKit.Logging.logDebug("--- AccountPanel.render - 1");
MochiKit.Signal.connect(this.getId('changePassphraseForm'), 'onkeydown', this, 'onkeydown');
errorMessageActor = this.getActor('changePassphrase_errorMessage');
errorMessageActor.setVisibilityMode(YAHOO.ext.Element.DISPLAY);
errorMessageActor.update("---");
errorMessageActor.hide();
changePasswordButton = new YAHOO.ext.Button(this.getDom('changePassphraseButton'), {text:Clipperz.PM.Strings['changePasswordFormSubmitLabel'], handler:this.doChangePassphrase, scope:this});
//MochiKit.Logging.logDebug("--- AccountPanel.render - 2");
MochiKit.Signal.connect(this.getId('deleteAccountForm'), 'onkeydown', this, 'onkeydown');
errorMessageActor = this.getActor('deleteAccount_errorMessage');
errorMessageActor.setVisibilityMode(YAHOO.ext.Element.DISPLAY);
errorMessageActor.update(Clipperz.PM.Strings['deleteAccountFormEmptyErrorMessage']);
errorMessageActor.hide();
deleteAccountButton = new YAHOO.ext.Button(this.getDom('deleteAccountButton'), {text:Clipperz.PM.Strings['deleteAccountFormSubmitLabel'], handler:this.doDeleteAccount, scope:this});
//MochiKit.Logging.logDebug("--- AccountPanel.render - 5");
if (Clipperz.PM.Proxy.defaultProxy.isReadOnly()) {
this.getElement('changePassphraseForm').addClass('read-only');
// this.getElement('accountPreferencesForm').addClass('read-only');
this.getElement('deleteAccountForm').addClass('read-only');
changePasswordButton.disable();
deleteAccountButton.disable();
}
//MochiKit.Logging.logDebug("--- AccountPanel.render - 6");
new Clipperz.PM.Components.PasswordEntropyDisplay(this.getElement('changePassphrase_oldPassphrase'));
new Clipperz.PM.Components.PasswordEntropyDisplay(this.getElement('changePassphrase_newPassphrase'));
new Clipperz.PM.Components.OTP.MainComponent(YAHOO.ext.Element.get('OTPComponent'), {user:this.user()});
this.tabPanelController().setUp();
Clipperz.NotificationCenter.register(null, 'tabSelected', this, 'tabSelectedHandler');
Clipperz.NotificationCenter.register(null, 'updatedPreferences', this, 'renderPreferences');
Clipperz.NotificationCenter.register(null, 'switchLanguage', this, 'switchLanguageHandler');
//MochiKit.Logging.logDebug("<<< AccountPanel.render");
} catch(exception) {
MochiKit.Logging.logError("### " + exception);
throw exception;
}
},
//-------------------------------------------------------------------------
'tabPanelController': function() {
if (this._tabPanelController == null) {
var tabPanelControllerConfig;
tabPanelControllerConfig = {}
tabPanelControllerConfig['changePassphraseTab'] = this.getId('changePassphrasePanel');
tabPanelControllerConfig['manageOTPTab'] = this.getId('manageOTPPanel');
tabPanelControllerConfig['accountPreferencesTab'] = this.getId('accountPreferencesPanel');
tabPanelControllerConfig['loginHistoryTab'] = this.getId('loginHistoryAccountPanel');
tabPanelControllerConfig['deleteAccountTab'] = this.getId('deleteAccountPanel');
// tabPanelControllerConfig['paidAccountTab'] = this.getId('paidAccountPanel');
this._tabPanelController = new Clipperz.PM.Components.TabPanel.TabPanelController({
name:'accountTabPanel',
config:tabPanelControllerConfig,
selectedTab:'changePassphraseTab'
});
}
return this._tabPanelController;
},
//-------------------------------------------------------------------------
'doChangePassphrase': function() {
if (Clipperz.PM.Proxy.defaultProxy.isReadOnly() == false) {
var username;
var oldPassphrase;
var newPassphrase;
var renewPassphrase;
var safetyCheck;
var areThereAnyErrors;
var errorMessageActor;
errorMessageActor = this.getActor('changePassphrase_errorMessage');
areThereAnyErrors = false;
username = this.getDom('changePassphrase_username').value;
oldPassphrase= this.getDom('changePassphrase_oldPassphrase').value;
newPassphrase= this.getDom('changePassphrase_newPassphrase').value;
renewPassphrase= this.getDom('changePassphrase_renewPassphrase').value;
safetyCheck = this.getDom('changePassphrase_safetyCheck').checked;
if (this.user().username() != username) {
this.showFormErrorMessageAnimation(errorMessageActor, Clipperz.PM.Strings['changePasswordFormWrongUsernameWarning']);
this.getElement('changePassphrase_username').focus().dom.select();
areThereAnyErrors = true;
} else if (this.user().passphrase() != oldPassphrase) {
this.showFormErrorMessageAnimation(errorMessageActor, Clipperz.PM.Strings['changePasswordFormWrongPassphraseWarning']);
this.getElement('changePassphrase_oldPassphrase').focus().dom.select();
areThereAnyErrors = true;
} else if (newPassphrase != renewPassphrase) {
this.showFormErrorMessageAnimation(errorMessageActor, Clipperz.PM.Strings['changePasswordFormWrongRetypePassphraseWarning']);
this.getElement('changePassphrase_renewPassphrase').focus().dom.select();
areThereAnyErrors = true;
} else if (safetyCheck != true) {
this.showFormErrorMessageAnimation(errorMessageActor, Clipperz.PM.Strings['changePasswordFormSafetyCheckWarning']);
this.getElement('changePassphrase_safetyCheck').focus();
areThereAnyErrors = true;
}
if (areThereAnyErrors == false) {
errorMessageActor.hide();
this.doChangePassphraseWithUsernameAndPassphrase(username, newPassphrase);
}
}
},
//-------------------------------------------------------------------------
'doChangePassphraseWithUsernameAndPassphrase': function(anUsername, aPassphrase) {
var deferredResult;
//MochiKit.Logging.logDebug(">>> AccountPanel.doChangePassphraseWithUsernameAndPassphrase - this.user: " + this.user());
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug(" AccountPanel.doChangePassphraseWithUsernameAndPassphrase 1: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Components.MessageBox(), 'deferredShow'),
{
title:Clipperz.PM.Strings['changePasswordFormProgressDialogTitle'],
text:Clipperz.PM.Strings['changePasswordFormProgressDialogEmptyText'],
width:240,
showProgressBar:true,
showCloseButton:false,
steps:4
},
this.getDom('changePassphraseButton')
);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug(" AccountPanel.doChangePassphraseWithUsernameAndPassphrase 2: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.user(), 'changeCredentials'), anUsername, aPassphrase);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug(" AccountPanel.doChangePassphraseWithUsernameAndPassphrase 3: " + res); return res;});
deferredResult.addCallback(function() {
Clipperz.PM.Components.MessageBox().update({
title:Clipperz.PM.Strings['changePasswordFormProgressDialogConnectedMessageTitle'],
text:Clipperz.PM.Strings['changePasswordFormProgressDialogConnectedMessageText'],
/*showProgressBar:false,*/
step:'next'
});
});
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug(" AccountPanel.doChangePassphraseWithUsernameAndPassphrase 4: " + res); return res;});
deferredResult.addCallback(MochiKit.Async.wait, 1);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug(" AccountPanel.doChangePassphraseWithUsernameAndPassphrase 5: " + res); return res;});
deferredResult.addCallback(function(anAccountPanel, res) {
Clipperz.PM.Components.MessageBox().hide(YAHOO.ext.Element.get('main'));
anAccountPanel.getDom('changePassphrase_username').value = "";
anAccountPanel.getDom('changePassphrase_oldPassphrase').value = "";
anAccountPanel.getElement('changePassphrase_oldPassphrase').focus();
anAccountPanel.getDom('changePassphrase_newPassphrase').value = "";
anAccountPanel.getElement('changePassphrase_newPassphrase').focus();
anAccountPanel.getDom('changePassphrase_renewPassphrase').value = "";
anAccountPanel.getDom('changePassphrase_safetyCheck').checked = false;
anAccountPanel.getElement('changePassphrase_username').focus();
return res;
}, this);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug(" AccountPanel.doChangePassphraseWithUsernameAndPassphrase 6: " + res); return res;});
deferredResult.addErrback(function() {
Clipperz.PM.Components.MessageBox().update({
title:Clipperz.PM.Strings['changePasswordFormProgressDialogErrorMessageTitle'],
text:Clipperz.PM.Strings['changePasswordFormProgressDialogErrorMessageText'],
buttons:{'ok':"close"}
});
});
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug(" AccountPanel.doChangePassphraseWithUsernameAndPassphrase 7: " + res); return res;});
deferredResult.callback();
//MochiKit.Logging.logDebug("<<< AccountPanel.doChangePassphraseWithUsernameAndPassphrase");
},
//-------------------------------------------------------------------------
'doDeleteAccount': function() {
if (Clipperz.PM.Proxy.defaultProxy.isReadOnly() == false) {
var username;
var passphrase;
var safetyCheck;
var areThereAnyErrors;
var errorMessageActor;
errorMessageActor = this.getActor('deleteAccount_errorMessage');
areThereAnyErrors = false;
username = this.getDom('deleteAccount_username').value;
passphrase= this.getDom('deleteAccount_passphrase').value;
safetyCheck = this.getDom('deleteAccount_safetyCheck').checked;
if (this.user().username() != username) {
this.showFormErrorMessageAnimation(errorMessageActor, Clipperz.PM.Strings['deleteAccountFormWrongUsernameWarning']);
this.getElement('deleteAccount_username').focus().dom.select();
areThereAnyErrors = true;
} else if (this.user().passphrase() != passphrase) {
this.showFormErrorMessageAnimation(errorMessageActor, Clipperz.PM.Strings['deleteAccountFormWrongPassphraseWarning']);
this.getElement('deleteAccount_passphrase').focus().dom.select();
areThereAnyErrors = true;
} else if (safetyCheck != true) {
this.showFormErrorMessageAnimation(errorMessageActor, Clipperz.PM.Strings['deleteAccountFormSafetyCheckWarning']);
this.getElement('deleteAccount_safetyCheck').focus();
areThereAnyErrors = true;
}
if (areThereAnyErrors == false) {
var deferred;
deferred = new MochiKit.Async.Deferred();
errorMessageActor.hide();
deferred.addCallback(function() {
var deferredResult;
// TODO: if the form is submitted with the return key, the confirmation dialog is skipped!?
deferredResult = new MochiKit.Async.Deferred();
Clipperz.PM.Components.MessageBox().deferredShow({
title:Clipperz.PM.Strings['accountPanelDeletingAccountPanelConfirmationTitle'],
text:Clipperz.PM.Strings['accountPanelDeleteAccountPanelConfirmationText'],
width:240,
showProgressBar:false,
showCloseButton:false,
buttons:{
'yes':Clipperz.PM.Strings['accountPanelDeleteAccountPanelConfirmButtonLabel'],
'no':Clipperz.PM.Strings['accountPanelDeleteAccountPanelDenyButtonLabel']
},
fn:MochiKit.Base.partial(function(aDeferred, aResult) {
if (aResult == 'yes') {
aDeferred.callback(aResult);
} else {
aDeferred.errback(aResult);
}
}, deferredResult)
});
return deferredResult;
});
deferred.addCallback(MochiKit.Base.method(Clipperz.PM.Components.MessageBox(), 'deferredShow'),
{
title:Clipperz.PM.Strings['accountPanelDeletingAccountPanelProgressTitle'],
text:Clipperz.PM.Strings['accountPanelDeletingAccountPanelProgressText'],
width:240,
showProgressBar:true,
showCloseButton:false
}
);
deferred.addCallback(MochiKit.Base.method(this.user(), 'deleteAccountAction'));
deferred.addCallback(Clipperz.PM.exit, 'accountDeleted.html');
deferred.addErrback(function(res) {
alert(res);
})
deferred.callback();
}
}
},
//-------------------------------------------------------------------------
'showFormErrorMessageAnimation': function(anActor, anErrorMessage, aCallback) {
anActor.update(anErrorMessage);
anActor.show(true);
anActor.play(aCallback);
},
//-------------------------------------------------------------------------
'onkeydown': function(anEvent) {
//MochiKit.Logging.logDebug(">>> onkeydown - " + anEvent.src().id);
if (anEvent.key().code == 13) {
anEvent.stop();
if (anEvent.src() == this.getDom('changePassphraseForm')) {
this.doChangePassphrase();
} else if (anEvent.src() == this.getDom('deleteAccountForm')) {
this.doDeleteAccount();
} else {
}
}
},
//-------------------------------------------------------------------------
'selectSelectedLanguageOption': function() {
var userSelectedLanguage;
userSelectedLanguage = this.user().preferences().preferredLanguage() || "default";
MochiKit.Base.filter(function(anOption) {return (anOption.value == userSelectedLanguage)}, this.getDom('languageSelector').childNodes)[0].selected = true;
},
//-------------------------------------------------------------------------
'doSaveUserPreferences': function() {
var selectedLanguage;
var showDonationReminderDialog;
// var disableUnsecureFaviconLoadingForIE;
//MochiKit.Logging.logDebug(">>> AccountPanel.doSaveUserPreferences");
selectedLanguage = this.getDom('languageSelector').value;
if (selectedLanguage == "default") {
selectedLanguage = null;
}
this.user().preferences().setPreferredLanguage(selectedLanguage);
showDonationReminderDialog = this.getDom('showDonationReminderCheckbox').checked;
this.user().preferences().setShouldShowDonationPanel(showDonationReminderDialog);
// disableUnsecureFaviconLoadingForIE = this.getDom('disableFaviconForIECheckbox').checked;
// this.user().preferences().setDisableUnsecureFaviconLoadingForIE(disableUnsecureFaviconLoadingForIE);
this.user().preferences().saveChanges(this.getDom('saveUserPreferences'));
},
'doCancelUserPreferences': function() {
this.renderPreferences();
},
// 'switchLanguage': function(anEvent) {
// Clipperz.PM.Strings.Languages.setSelectedLanguage(anEvent.src().value);
// },
//-------------------------------------------------------------------------
'renderLoginHistory': function() {
var element;
//MochiKit.Logging.logDebug(">>> AccountPanel.renderLoginHistory");
element = YAHOO.ext.Element.get('loginHistoryAccountBlock');
if (Clipperz.PM.Proxy.defaultProxy.isReadOnly()) {
element.update("");
this.domHelper().append(element, {tag:'div', cls:'loginHistoryReadOnlyMessage', htmlString:Clipperz.PM.Strings['loginHistoryReadOnlyMessage']});
} else {
var deferredResult;
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(MochiKit.Base.bind(function(anElement) {
anElement.update("");
Clipperz.YUI.DomHelper.append(anElement, {tag:'div', cls:'loadingMessage', htmlString:Clipperz.PM.Strings['loginHistoryLoadingMessage']});
}, this), element);
deferredResult.addCallback(MochiKit.Base.method(this.user(), 'loadLoginHistory'));
deferredResult.addCallback(MochiKit.Base.bind(function(anElement, aResult) {
var loginListItems;
var tBodyElement;
var imageExtension;
var now;
var i, c;
loginListItems = aResult;
//MochiKit.Logging.logDebug("=== loginListItems: " + Clipperz.Base.serializeJSON(loginListItems));
imageExtension = (Clipperz_IEisBroken == true) ? 'gif': 'png';
now = new Date();
anElement.update("");
Clipperz.YUI.DomHelper.append(anElement, {tag:'div', cls:'panelDescription', htmlString:Clipperz.PM.Strings['loginHistoryLoadedMessage']});
Clipperz.YUI.DomHelper.append(anElement, {tag:'table', id:'loginHistoryTable', cellspacing:'0', cellpadding:'2', border:'0', children:[
{tag:'tbody', id:this.getId('loginHistoryTBody'), children:[]}
]});
//# Clipperz.YUI.DomHelper.append(anElement, {tag:'div', id:'loginHistoryFooter', children:[
Clipperz.YUI.DomHelper.append(anElement, {tag:'div', cls:'clipperzSubPanelButtonBox', children:[
{tag:'div', id:this.getId('reloadHistoryButton')}
]});
new YAHOO.ext.Button(this.getDom('reloadHistoryButton'), {text:Clipperz.PM.Strings['loginHistoryReloadButtonLabel'], handler:this.reloadHistory, scope:this});
tBodyElement = this.getElement('loginHistoryTBody');
c = loginListItems.length;
for (i=0; i<c; i++) {
var ip;
var date;
var mainText;
date = Clipperz.PM.Date.parseDateWithUTCFormat(loginListItems[i]['date']);
if (loginListItems[i]['isCurrent'] === true) {
mainText ={tag:'div', cls:'currentSession', htmlString:Clipperz.PM.Strings['loginHistoryCurrentSessionText']}
} else {
mainText = {tag:'div', cls:'elapsedTime', html:Clipperz.PM.Date.getElapsedTimeDescription(date)}
}
if (loginListItems[i]['connectionType'] == "ONE_TIME_PASSPHRASE") {
optionalInfo = [
{tag:'span', html:"OTP"}
];
} else {
optionalInfo = [];
}
ip = (loginListItems[i]['ip'].match(/^\d{1,3}(.\d{1,3}){3}$/)) ? loginListItems[i]['ip'] : Clipperz.PM.Strings['unknown_ip'];
Clipperz.YUI.DomHelper.append(tBodyElement, {tag:'tr', children:[
{tag:'td', cls:'loginHistoryValues', valign:'top', children:[
mainText,
{tag:'div', cls:'fullDate', html:Clipperz.PM.Date.formatDateWithTemplate(date, Clipperz.PM.Strings['fullDate_format'])},
{tag:'div', cls:'loginHistoryIP', children:[
{tag:'span', cls:'loginHistoryIPLabel', htmlString:Clipperz.PM.Strings['loginHistoryIPLabel']},
{tag:'span', cls:'loginHistoryIPValue', html:ip}
]}
]},
{tag:'td', cls:'loginHistoryCountry', valign:'top', children:optionalInfo},
{tag:'td', cls:'loginHistoryCountry', valign:'top', align:'center', children:[
{tag:'img', title:Clipperz.PM.Strings['countries'][loginListItems[i]['country']], cls:'flag', src:Clipperz.PM.Strings['icons_baseUrl'] + "/flags/" + loginListItems[i]['country'].toLowerCase() + "." + imageExtension, width:'32', height:'32'}
// {tag:'span', cls:'label', htmlString:Clipperz.PM.Strings['countries'][loginListItems[i]['country']]}
]},
{tag:'td', cls:'loginHistoryBrowser', valign:'top', align:'center', children:[
{tag:'img', title:Clipperz.PM.Strings['browsers'][loginListItems[i]['browser']], cls:'browser', src:Clipperz.PM.Strings['icons_baseUrl'] + "/browsers/" + loginListItems[i]['browser'].toLowerCase() + "." + imageExtension, width:'32', height:'32'}
// {tag:'span', cls:'label', htmlString:Clipperz.PM.Strings['browsers'][loginListItems[i]['browser']]}
]},
{tag:'td', cls:'loginHistoryOperatingSystem', valign:'top', align:'center', children:[
{tag:'img', title:Clipperz.PM.Strings['operatingSystems'][loginListItems[i]['operatingSystem']], cls:'operatingSystem', src:Clipperz.PM.Strings['icons_baseUrl'] + "/operatingSystems/" + loginListItems[i]['operatingSystem'].toLowerCase() + "." + imageExtension, width:'32', height:'32'}
// {tag:'span', cls:'label', htmlString:Clipperz.PM.Strings['operatingSystems'][loginListItems[i]['operatingSystem']]}
]}
]});
}
Clipperz.Style.applyZebraStylesToTable('loginHistoryTable');
}, this), element);
deferredResult.callback();
}
//MochiKit.Logging.logDebug("<<< AccountPanel.renderLoginHistory");
},
//-------------------------------------------------------------------------
'renderPreferences': function() {
var saveUserPreferencesButton;
var cancelUserPreferencesButton;
var preferencedPanelBodyElement;
preferencedPanelBodyElement = this.getElement('preferencesPanelBody');
preferencedPanelBodyElement.update("");
Clipperz.YUI.DomHelper.append(preferencedPanelBodyElement,
{tag:'form', id:this.getId('accountPreferencesForm'), children:[
{tag:'table', cls:'panelBody', children:[
{tag:'tr', cls:'openPreferenceBlock', children:[
{tag:'td', children:[
{tag:'div', cls:'preferenceBlockTitle', htmlString:Clipperz.PM.Strings['accountPreferencesLanguageTitle']},
{tag:'div', cls:'panelDescription', htmlString:Clipperz.PM.Strings['accountPreferencesLanguageDescription']},
{tag:'div', cls:'panelDescription', children:[
{tag:'select',
id:this.getId('languageSelector'),
children:MochiKit.Base.concat([{tag:'option', value:"default", html:"---"}], Clipperz.PM.Strings['loginPanelSwitchLanguageSelectOptions'])
}
]}
]}
]},
{tag:'tr', cls:'openPreferenceBlock', children:[
{tag:'td', children:[
{tag:'div', cls:'preferenceBlockTitle', htmlString:Clipperz.PM.Strings['showDonationReminderPanelTitle']},
{tag:'table', cellpadding:'0', cellspacing:'0', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', valign:'top', children:[
{tag:'div', cls:'panelDescription', children:[
{tag:'input', type:'checkbox', id:this.getId('showDonationReminderCheckbox')}
]}
]},
{tag:'td', valign:'top', children:[
{tag:'div', cls:'panelDescription', htmlString:Clipperz.PM.Strings['showDonationReminderPanelDescription']}
]}
]}
]}
]}
]}
]} //,
/*
{tag:'tr', cls:'openPreferenceBlock', children:[
{tag:'td', children:[
{tag:'div', cls:'preferenceBlockTitle', htmlString:Clipperz.PM.Strings['disableFaviconForIETitle']},
{tag:'table', cellpadding:'0', cellspacing:'0', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', valign:'top', children:[
{tag:'div', cls:'panelDescription', children:[
{tag:'input', type:'checkbox', id:this.getId('disableFaviconForIECheckbox')}
]}
]},
{tag:'td', valign:'top', children:[
{tag:'div', cls:'panelDescription', children:Clipperz.PM.Strings['disableFaviconForIEDescriptionConfig']}
]}
]}
]}
]}
]}
]},
*/
// {tag:'tr', cls:'openPreferenceBlock', children:[
// {tag:'td', children:[
// {tag:'div', cls:'preferenceBlockTitle', htmlString:Clipperz.PM.Strings['accountPreferencesInterfaceTitle']},
// {tag:'div', cls:'panelDescription', children:Clipperz.PM.Strings['accountPreferencesInterfaceDescriptionConfig']}
// ]}
// ]}
]},
{tag:'div', cls:'clipperzSubPanelButtonBox', children:[
{tag:'table', border:'0', cellspacing:'0', cellpadding:'0', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', width:'100', align:'right', cls:'newRecordPanelButtonTD', children:[
{tag:'div', id:this.getId('saveUserPreferences')}
]},
{tag:'td', width:'10', html:"&nbsp;"},
{tag:'td', cls:'newRecordPanelButtonTD', children:[
{tag:'div', id:this.getId('cancelUserPreferences')}
]}
]}
]}
]}
]}
]}
);
this.selectSelectedLanguageOption();
if (this.user().preferences().shouldShowDonationPanel()) {
this.getDom('showDonationReminderCheckbox').checked = true;
}
// if (this.user().preferences().disableUnsecureFaviconLoadingForIE()) {
// this.getDom('disableFaviconForIECheckbox').checked = true;
// }
//MochiKit.Logging.logDebug("--- AccountPanel.render - 3");
//# saveUserPreferencesButton = new YAHOO.ext.Button(this.getDom('saveUserPreferences'), {text:Clipperz.PM.Strings['saveUserPreferencesFormSubmitLabel'], handler:this.doSaveUserPreferences, scope:this});
saveUserPreferencesButton = new YAHOO.ext.Button(this.getDom('saveUserPreferences'), {text:'-----------------', handler:this.doSaveUserPreferences, scope:this});
saveUserPreferencesButton.setText(Clipperz.PM.Strings['saveUserPreferencesFormSubmitLabel']);
//# cancelUserPreferencesButton = new YAHOO.ext.Button(this.getDom('cancelUserPreferences'), {text:Clipperz.PM.Strings['cancelUserPreferencesFormSubmitLabel'], handler:this.doCancelUserPreferences, scope:this});
cancelUserPreferencesButton = new YAHOO.ext.Button(this.getDom('cancelUserPreferences'), {text:'-----------------', handler:this.doCancelUserPreferences, scope:this});
cancelUserPreferencesButton.setText(Clipperz.PM.Strings['cancelUserPreferencesFormSubmitLabel']);
//MochiKit.Logging.logDebug("--- AccountPanel.render - 4");
if (Clipperz.PM.Proxy.defaultProxy.isReadOnly()) {
this.getElement('accountPreferencesForm').addClass('read-only');
saveUserPreferencesButton.disable();
cancelUserPreferencesButton.disable();
}
},
//-------------------------------------------------------------------------
'reloadHistory': function() {
this.setShouldLoadLoginHistory(true);
this.renderLoginHistory();
},
'shouldLoadLoginHistory': function() {
return this._shouldLoadLoginHistory;
},
'setShouldLoadLoginHistory': function(aValue) {
this._shouldLoadLoginHistory = aValue;
},
'tabSelectedHandler': function(anEvent) {
if (anEvent.parameters() == 'accountPreferencesTab') {
this.renderPreferences();
}
if ((this.shouldLoadLoginHistory()) && (anEvent.parameters() == 'loginHistoryTab')) {
this.renderLoginHistory();
this.setShouldLoadLoginHistory(false);
}
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,96 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.Panels) == 'undefined') { Clipperz.PM.Components.Panels = {}; }
//var _Clipperz_PM_Components_Panels_base_id_ = 0;
//#############################################################################
Clipperz.PM.Components.Panels.BasePanel = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.Panels.BasePanel.superclass.constructor.call(this, anElement, args);
this._user = args.user || null;
this._delegate = args.delegate || null;
this._tabPanelController = null;
// Clipperz.NotificationCenter.register(null, 'switchLanguage', this, 'switchLanguageHandler');
// this._ids = {};
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.Panels.BasePanel, Clipperz.PM.Components.BaseComponent, {
'toString': function() {
return "Clipperz.PM.Components.Panels.BasePanel component";
},
//-------------------------------------------------------------------------
'user': function() {
return this._user;
},
'setUser': function(aValue) {
this._user = aValue;
},
//-------------------------------------------------------------------------
'delegate': function() {
return this._delegate;
},
'setDelegate': function(aValue) {
this._delegate = aValue;
},
//-------------------------------------------------------------------------
'tabPanelController': function() {
return this._tabPanelController;
},
'switchLanguageHandler': function() {
//MochiKit.Logging.logDebug(">>> BasePanel.switchLanguageHandler [" + this.toString() + "]");
this.render();
//MochiKit.Logging.logDebug("<<< BasePanel.switchLanguageHandler [" + this.toString() + "]");
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,105 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.Panels) == 'undefined') { Clipperz.PM.Components.Panels = {}; }
//#############################################################################
Clipperz.PM.Components.Panels.ContactsPanel = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.Panels.ContactsPanel.superclass.constructor.call(this, anElement, args);
this.render();
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.Panels.ContactsPanel, Clipperz.PM.Components.Panels.BasePanel, {
'toString': function() {
return "Clipperz.PM.Components.ContactsPanel component";
},
//-------------------------------------------------------------------------
'render': function() {
// var tabPanelControllerConfig;
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'table', border:'0', cellspacing:'0', cellpadding:'0', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', valign:'top', width:'200', children:[
{tag:'ul', id:"dataSubMenu", cls:'subMenu', children:[
{tag:'li', id:this.getId('contacts'), htmlString:Clipperz.PM.Strings['contactsTabLabel']},
]}
]},
{tag:'td', valign:'top', children:[
{tag:'ul', cls:'clipperzTabPanels', children:[
{tag:'li', id:this.getId('contactsPanel'), children:[
{tag:'div', cls:'clipperzSubPanel', children:[
{tag:'h5', htmlString:Clipperz.PM.Strings['contactsTabTitle']},
{tag:'div', htmlString:Clipperz.PM.Strings['comingSoon']}
]}
]}
]}
]}
]}
]}
]});
// tabPanelControllerConfig = {}
// tabPanelControllerConfig[this.getId('contacts')] = this.getId('contactsPanel');
// new Clipperz.PM.Components.TabPanel.TabPanelController({ config:tabPanelControllerConfig, selectedTab:this.getId('contacts') });
this.tabPanelController().setUp();
},
//-------------------------------------------------------------------------
'tabPanelController': function() {
if (this._tabPanelController == null) {
var tabPanelControllerConfig;
tabPanelControllerConfig = {}
tabPanelControllerConfig[this.getId('contacts')] = this.getId('contactsPanel');
this._tabPanelController = new Clipperz.PM.Components.TabPanel.TabPanelController({ config:tabPanelControllerConfig, selectedTab:this.getId('contacts') });
}
return this._tabPanelController;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,73 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.Panels) == 'undefined') { Clipperz.PM.Components.Panels = {}; }
//#############################################################################
Clipperz.PM.Components.Panels.LogoutPanel = function(args) {
args = args || {};
Clipperz.PM.Components.Panels.LogoutPanel.superclass.constructor.call(this, args);
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.Panels.LogoutPanel, Clipperz.PM.Components.Panels.BasePanel, {
'toString': function() {
return "Clipperz.PM.Components.LogoutPanel component";
},
//-------------------------------------------------------------------------
'initPanel': function() {
var result;
var layout;
result = new YAHOO.ext.ContentPanel(this.getId('panel'), {title:'logout', closable:false, autoCreate:true});
Clipperz.YUI.DomHelper.append(result.getEl().dom,
{tag:'div', children:[
{tag:'h2', html:'Logout panel'}
]}
);
return result;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,906 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.Panels) == 'undefined') { Clipperz.PM.Components.Panels = {}; }
//#############################################################################
Clipperz.PM.Components.Panels.MainPanel = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.Panels.MainPanel.superclass.constructor.call(this, anElement, args);
this._recordListDataModel = null;
this._selectedRecord = null;
this._recordDetailComponent = null;
this._recordListGrid = null;
this._directLinkItemTemplate = null;
this._recordItemTemplate = null;
this._addNewRecordButton = null;
this._deleteRecordButton = null;
this._creationWizard = null;
Clipperz.NotificationCenter.register(null, 'selectAndEnterEditMode', this, 'selectRecordAndEnterEditModeHandler');
Clipperz.NotificationCenter.register(null, 'recordAdded', this, 'recordAddedHandler');
Clipperz.NotificationCenter.register(null, 'recordUpdated', this, 'recordUpdatedHandler');
Clipperz.NotificationCenter.register(null, 'recordRemoved', this, 'recordRemovedHandler');
Clipperz.NotificationCenter.register(null, 'directLoginAdded', this, 'directLoginAddedHandler');
Clipperz.NotificationCenter.register(null, 'directLoginUpdated', this, 'directLoginUpdatedHandler');
Clipperz.NotificationCenter.register(null, 'directLoginRemoved', this, 'directLoginRemovedHandler');
Clipperz.NotificationCenter.register(null, 'accountLocked', this, 'accountLockedHandler');
MochiKit.Signal.connect(MochiKit.DOM.currentWindow(), 'onresize', this, 'resizeModalMask');
this.render();
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.Panels.MainPanel, Clipperz.PM.Components.Panels.BasePanel, {
'toString': function() {
return "Clipperz.PM.Components.Panels.MainPanel component";
},
//-------------------------------------------------------------------------
'render': function() {
this.element().update("");
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'table', id:'mainPanelTABLE', border:'0', cellspacing:'0', cellpadding:'0', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', width:'15', children:[
{tag:'div', cls:'mainPanelMinHeightDiv'}
]},
{tag:'td', valign:'top', id:'directLoginsTD', width:'200', children:[
{tag:'div', id:'directLoginsBlock', children:[
{tag:'div', cls:'directLoginsBlockHeaderBox', children:[{tag:'h3', id:'directLoginTitle', htmlString:Clipperz.PM.Strings['mainPanelDirectLoginBlockLabel']}]},
{tag:'div', id:'directLoginsDescription', htmlString:Clipperz.PM.Strings['mainPanelDirectLoginBlockDescription']},
{tag:'ul', id:'directLogins'}
]}
]},
{tag:'td', width:'15', children:[
{tag:'div', cls:'mainPanelMinHeightDiv'}
]},
{tag:'td', valign:'top', children:[
{tag:'div', id:'mainContent', children:[
{tag:'div', id:'recordListBlockHeader'},
{tag:'div', id:'recordListAndDetailBlock', children:[
{tag:'table', id:'recordListAndDetailBlockTABLE', border:'0', cellspacing:'0', cellpadding:'0', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', valign:'top', width:'250', children:[
{tag:'div', id:'recordListBlock', children:[
{tag:'div', id:'recordListFilterHeader'},
{tag:'ul', id:'records'}
]}
]},
{tag:'td', id:'recordDetailSeparatorTD', rowspan:'2', valign:'top', bgcolor:'#ddddff', html:'&nbsp;'},
{tag:'td', valign:'top', children:[
{tag:'div', id:'recordDetailMainBlock', children:[
{tag:'div', id:'recordTitleTopBlock'},
{tag:'div', id:'recordDetailBlock', children:[
{tag:'div', id:'recordDetail'}
]}
]},
{tag:'div', id:'recordCreationWizardMainBlock', children:[
{tag:'div', id:'recordCreationWizard', html:"WIZARD"}
]}
]}
]},
{tag:'tr', children:[
{tag:'td', id:'cardBoxLowerLeftTD', html:'&nbsp;'},
{tag:'td', id:'cardBoxLowerRightTD', html:'&nbsp;'}
]}
]}
]}
]}
]}
]},
{tag:'td', width:'15', html:"&nbsp;"}
]}
]}
]});
this.renderRecordListBlockHeader();
// this.renderRecordListFilterHeader();
YAHOO.ext.Element.get('directLogins').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
this.recordDetailComponent();
YAHOO.ext.Element.get('recordDetailMainBlock').setVisibilityMode(YAHOO.ext.Element.DISPLAY).show();
YAHOO.ext.Element.get('recordCreationWizardMainBlock').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
},
//-------------------------------------------------------------------------
'addNewRecordButton': function() {
return this._addNewRecordButton;
},
'setAddNewRecordButton': function(aValue) {
this._addNewRecordButton = aValue;
},
'deleteRecordButton': function() {
return this._deleteRecordButton;
},
'setDeleteRecordButton': function(aValue) {
this._deleteRecordButton = aValue;
},
//-------------------------------------------------------------------------
'addNewRecord': function(anEvent) {
var deferredResult;
// var currentNumberOfRecords;
deferredResult = new MochiKit.Async.Deferred();
// currentNumberOfRecords = MochiKit.Base.keys(this.user().records()).length;
/*
// if ((this.user().preferences().shouldShowDonationPanel()) && (currentNumberOfRecords > 0) && ((currentNumberOfRecords%10) == 0)) {
// if (true) {
if ((this.user().preferences().shouldShowDonationPanel()) && (currentNumberOfRecords >= 5)) {
deferredResult.addCallback(Clipperz.PM.showDonationSplashScreen, this.user(), 'recordListAddRecordButton');
}
*/
deferredResult.addCallback(MochiKit.Base.bind(function() {
var currentlySelectedRecord;
currentlySelecedRecord = this.selectedRecord();
this.setSelectedRecord(null);
YAHOO.ext.Element.get('recordDetailMainBlock').hide();
YAHOO.ext.Element.get('recordCreationWizardMainBlock').show();
this.setCreationWizard(new Clipperz.PM.Components.RecordDetail.CreationWizard(YAHOO.ext.Element.get('recordCreationWizardMainBlock'), {previouslySelectedRecord:currentlySelecedRecord, mainComponent:this}));
this.enterModalView();
}, this));
deferredResult.callback();
},
//-------------------------------------------------------------------------
'creationWizard': function() {
return this._creationWizard;
},
'setCreationWizard': function(aValue) {
this._creationWizard = aValue;
},
//-------------------------------------------------------------------------
'exitWizard': function(aSelectedRecord, shouldEnterEditMode) {
//MochiKit.Logging.logDebug(">>> MainPanel.exitWizard - " + aSelectedRecord)
YAHOO.ext.Element.get('recordCreationWizardMainBlock').hide();
YAHOO.ext.Element.get('recordDetailMainBlock').show();
if (shouldEnterEditMode == true) {
this.selectRecordAndEnterEditMode(aSelectedRecord);
} else {
this.setSelectedRecord(aSelectedRecord);
this.exitModalView();
}
this.creationWizard().remove();
this.setCreationWizard(null);
//MochiKit.Logging.logDebug("<<< MainPanel.exitWizard");
},
//-------------------------------------------------------------------------
'selectRecordAndEnterEditMode': function(aRecord) {
this.setSelectedRecord(aRecord);
this.recordDetailComponent().setEditMode('EDIT');
},
'selectRecordAndEnterEditModeHandler': function(anEvent) {
this.selectRecordAndEnterEditMode(anEvent.source());
},
//-------------------------------------------------------------------------
'resizeModalMask': function() {
//MochiKit.Logging.logDebug(">>> MainPanel.resizeModalMask");
MochiKit.Style.setElementDimensions('recordDetailEditModeHeaderMask', {w:MochiKit.Style.getElementDimensions('mainDiv').w, h:119});
MochiKit.Style.setElementDimensions('recordDetailEditModeVerticalMask', {w:511, h:MochiKit.Style.getElementDimensions('mainDiv').h - 119});
//MochiKit.Logging.logDebug("<<< MainPanel.resizeModalMask");
},
//-------------------------------------------------------------------------
'enterModalView': function() {
if (this.user().preferences().useSafeEditMode()) {
var headerMaskElement;
var verticalMaskElement;
this.resizeModalMask();
headerMaskElement = YAHOO.ext.Element.get('recordDetailEditModeHeaderMask');
headerMaskElement.show();
headerMaskElement.mask();
verticalMaskElement = YAHOO.ext.Element.get('recordDetailEditModeVerticalMask');
verticalMaskElement.show();
verticalMaskElement.mask();
}
},
//-------------------------------------------------------------------------
'exitModalView': function() {
if (this.user().preferences().useSafeEditMode()) {
var headerMaskElement;
var verticalMaskElement;
headerMaskElement = YAHOO.ext.Element.get('recordDetailEditModeHeaderMask');
headerMaskElement.unmask();
headerMaskElement.hide();
verticalMaskElement = YAHOO.ext.Element.get('recordDetailEditModeVerticalMask');
verticalMaskElement.unmask();
verticalMaskElement.hide();
}
},
//-------------------------------------------------------------------------
'removeSelectedRecord': function() {
var selectedRecordReferences;
//MochiKit.Logging.logDebug(">>> MainPanel.removeSelectedRecord");
if (this.selectedRecord() != null) {
selectedRecordReferences = [this.selectedRecord().reference()];
} else {
selectedRecordReferences = [];
}
if (selectedRecordReferences.length > 0 ) {
var recordReference;
var records;
var deferred;
records = [];
for (recordReference in selectedRecordReferences) {
var record;
//MochiKit.Logging.logDebug("### MainPanel.removeSelectedRecord - recordReference: " + selectedRecordReferences[recordReference]);
record = this.user().records()[selectedRecordReferences[recordReference]];
//MochiKit.Logging.logDebug("### MainPanel.removeSelectedRecord - record: " + record);
records.push(record);
}
//MochiKit.Logging.logDebug("### MainPanel.removeSelectedRecord - records.length: " + records.length);
deferred = new MochiKit.Async.Deferred();
//MochiKit.Logging.logDebug("--- MainPanel.removeSelectedRecord - 1:");
//deferred.addBoth(function(res) {MochiKit.Logging.logDebug("MainPanel.removeSelectedRecord - 1: " + res); return res;});
//MochiKit.Logging.logDebug("--- MainPanel.removeSelectedRecord - 2:");
deferred.addCallback(function() {
var deferredResult;
deferredResult = new MochiKit.Async.Deferred();
Clipperz.PM.Components.MessageBox().deferredShow({
title:Clipperz.PM.Strings['mainPanelDeletingRecordPanelConfirmationTitle'],
text:Clipperz.PM.Strings['mainPanelDeleteRecordPanelConfirmationText'],
width:240,
showProgressBar:false,
showCloseButton:false,
buttons:{
'yes':Clipperz.PM.Strings['mainPanelDeleteRecordPanelConfirmButtonLabel'],
'no':Clipperz.PM.Strings['mainPanelDeleteRecordPanelDenyButtonLabel']
},
fn:MochiKit.Base.partial(function(aDeferred, aResult) {
if (aResult == 'yes') {
aDeferred.callback(aResult);
} else {
aDeferred.errback(aResult);
}
}, deferredResult)
}, 'recordListRemoveRecordButton');
return deferredResult;
});
//MochiKit.Logging.logDebug("--- MainPanel.removeSelectedRecord - 3:");
//deferred.addBoth(function(res) {MochiKit.Logging.logDebug("MainPanel.removeSelectedRecord - 2: " + res); return res;});
//MochiKit.Logging.logDebug("--- MainPanel.removeSelectedRecord - 4:");
//deferred.addBoth(function(res) {MochiKit.Logging.logDebug("MainPanel.removeSelectedRecord - 3: " + res); return res;});
deferred.addCallback(MochiKit.Base.method(Clipperz.PM.Components.MessageBox(), 'deferredShow'),
{
title:Clipperz.PM.Strings['mainPanelDeletingRecordPanelInitialTitle'],
text:Clipperz.PM.Strings['mainPanelDeletingRecordPanelInitialText'],
width:240,
showProgressBar:true,
showCloseButton:false,
steps:5
}
);
//MochiKit.Logging.logDebug("--- MainPanel.removeSelectedRecord - 5:");
//deferred.addBoth(function(res) {MochiKit.Logging.logDebug("MainPanel.removeSelectedRecord - 4: " + res); return res;});
deferred.addCallback(MochiKit.Base.method(this.user(), 'deleteRecordsAction'), records);
//MochiKit.Logging.logDebug("--- MainPanel.removeSelectedRecord - 6:");
//deferred.addBoth(function(res) {MochiKit.Logging.logDebug("MainPanel.removeSelectedRecord - 5: " + res); return res;});
//MochiKit.Logging.logDebug("--- MainPanel.removeSelectedRecord - 7:");
//deferred.addBoth(function(res) {MochiKit.Logging.logDebug("MainPanel.removeSelectedRecord - 6: " + res); return res;});
deferred.addCallback(function() {
Clipperz.PM.Components.MessageBox().update({
title:null,
text:Clipperz.PM.Strings['mainPanelDeletingRecordPanelCompletedText'],
step:'next',
buttons:{}
});
});
//MochiKit.Logging.logDebug("--- MainPanel.removeSelectedRecord - 8:");
//deferred.addBoth(function(res) {MochiKit.Logging.logDebug("MainPanel.removeSelectedRecord - 7: " + res); return res;});
deferred.addCallback(MochiKit.Async.wait, 1);
//MochiKit.Logging.logDebug("--- MainPanel.removeSelectedRecord - 9:");
//deferred.addBoth(function(res) {MochiKit.Logging.logDebug("MainPanel.removeSelectedRecord - 8: " + res); return res;});
deferred.addCallback(function(res) {
Clipperz.PM.Components.MessageBox().hide(YAHOO.ext.Element.get('main'));
return res;
});
//MochiKit.Logging.logDebug("--- MainPanel.removeSelectedRecord - 10:");
//deferred.addBoth(function(res) {MochiKit.Logging.logDebug("MainPanel.removeSelectedRecord - 9: " + res); return res;});
deferred.callback();
} else {
//MochiKit.Logging.logDebug("+++ MainPanel.removeSelectedRecord - nothing selected");
}
},
//-------------------------------------------------------------------------
'recordDetailComponent': function() {
//MochiKit.Logging.logDebug(">>> MainPanel.recordDetailComponent");
if (this._recordDetailComponent == null) {
//MochiKit.Logging.logDebug("--- MainPanel.recordDetailComponent - 1");
//MochiKit.Logging.logDebug("--- MainPanel.recordDetailComponent - 1 - user: " + this.user());
this._recordDetailComponent = new Clipperz.PM.Components.RecordDetail.MainComponent(
YAHOO.ext.Element.get('recordDetail'),
{user:this.user(), mainPanel:this}
);
}
//MochiKit.Logging.logDebug("<<< MainPanel.recordDetailComponent");
return this._recordDetailComponent;
},
//-------------------------------------------------------------------------
'selectedRecord': function() {
return this._selectedRecord;
},
'setSelectedRecord': function(aValue) {
// this.hideNewRecordPanel();
//MochiKit.Logging.logDebug(">>> MainPanel.setSelectedRecord");
if (aValue != this._selectedRecord) {
//MochiKit.Logging.logDebug("--- MainPanel.setSelectedRecord - 1");
this._selectedRecord = aValue;
//MochiKit.Logging.logDebug("--- MainPanel.setSelectedRecord - 2");
this.redrawRecordItems();
//MochiKit.Logging.logDebug("--- MainPanel.setSelectedRecord - 3");
this.recordDetailComponent().setRecord(aValue);
//MochiKit.Logging.logDebug("--- MainPanel.setSelectedRecord - 4");
}
if ((aValue == null) || (Clipperz.PM.Proxy.defaultProxy.isReadOnly())) {
this.deleteRecordButton().disable();
} else {
this.deleteRecordButton().enable();
}
//MochiKit.Logging.logDebug("<<< MainPanel.setSelectedRecord");
},
//-------------------------------------------------------------------------
'recordAddedHandler': function(anEvent) {
//MochiKit.Logging.logDebug(">>> MainPanel.recordAddedHandler");
this.recordDetailComponent();
this.redrawRecordItems();
//MochiKit.Logging.logDebug("<<< MainPanel.recordAddedHandler");
},
'recordUpdatedHandler': function(anEvent) {
//MochiKit.Logging.logDebug(">>> MainPanel.recordUpdatedHandler");
this.redrawRecordItems();
//MochiKit.Logging.logDebug("<<< MainPanel.recordUpdatedHandler");
},
'recordRemovedHandler': function(anEvent) {
//MochiKit.Logging.logDebug(">>> MainPanel.recordRemovedHandler");
this.setSelectedRecord(null);
//MochiKit.Logging.logDebug("--- MainPanel.recordRemovedHandler - 1");
this.redrawRecordItems();
//MochiKit.Logging.logDebug("<<< MainPanel.recordRemovedHandler");
},
'compareRecords': function(a, b) {
//MochiKit.Logging.logDebug("=== compareRecords: " + a.toString() + " - " + b.toString());
return MochiKit.Base.compare(a.label().toLowerCase(), b.label().toLowerCase());
},
'redrawRecordItems': function() {
var template;
var allRecords;
//MochiKit.Logging.logDebug(">>> MainPanel.redrawRecordItems");
MochiKit.Iter.forEach(YAHOO.ext.Element.get('records').getChildrenByTagName('li'), function(aRecordElement) {
MochiKit.Signal.disconnectAll(aRecordElement.dom);
})
//MochiKit.Logging.logDebug("--- MainPanel.redrawRecordItems - 1");
YAHOO.ext.Element.get('records').update("");
//MochiKit.Logging.logDebug("--- MainPanel.redrawRecordItems - 2");
allRecords = MochiKit.Base.values(this.user().records());
//MochiKit.Logging.logDebug("--- MainPanel.redrawRecordItems - 3");
allRecords.sort(this.compareRecords);
//MochiKit.Logging.logDebug("--- MainPanel.redrawRecordItems - 4");
template = this.recordItemTemplate();
//MochiKit.Logging.logDebug("--- MainPanel.redrawRecordItems - 5");
MochiKit.Iter.forEach(allRecords, MochiKit.Base.bind(function(aRecord) {
var recordElement;
recordElement = template.append('records', {
recordTitle:aRecord.label(),
recordReference:aRecord.reference(),
cls:((aRecord == this.selectedRecord()) ? 'selected': '')
}, true);
//MochiKit.Logging.logDebug("--- MainPanel.redrawRecordItems - 6: " + recordElement.dom);
recordElement.addClassOnOver('hover');
MochiKit.Signal.connect(recordElement.dom, 'onclick', this, 'selectRecord');
}, this));
//MochiKit.Logging.logDebug("<<< MainPanel.redrawRecordItems");
},
'selectRecord': function(anEvent) {
//MochiKit.Logging.logDebug(">>> MainPanel.selectRecord");
//MochiKit.Logging.logDebug("--- MainPanel.selectRecord !!! - ", this.user().records()[anEvent.src().id].label());
this.setSelectedRecord(this.user().records()[anEvent.src().id]);
//MochiKit.Logging.logDebug("<<< MainPanel.selectRecord");
},
//-------------------------------------------------------------------------
'directLoginAddedHandler': function(anEvent) {
//MochiKit.Logging.logDebug(">>> MainPanel.recordRemovedHandler");
this.redrawDirectLoginItems();
//MochiKit.Logging.logDebug("<<< MainPanel.recordRemovedHandler");
},
'directLoginUpdatedHandler': function(anEvent) {
//MochiKit.Logging.logDebug(">>> MainPanel.directLoginUpdatedHandler");
this.redrawDirectLoginItems();
//MochiKit.Logging.logDebug("<<< MainPanel.directLoginUpdatedHandler");
},
'directLoginRemovedHandler': function(anEvent) {
//MochiKit.Logging.logDebug(">>> MainPanel.directLoginRemovedHandler");
this.redrawDirectLoginItems();
//MochiKit.Logging.logDebug("<<< MainPanel.directLoginRemovedHandler");
},
'compareDirectLogins': function(a, b) {
return MochiKit.Base.compare(a.label().toLowerCase(), b.label().toLowerCase());
},
'redrawDirectLoginItems': function() {
var template;
var allDirectLogins;
//MochiKit.Logging.logDebug(">>> MainPanel.redrawDirectLoginItems");
MochiKit.Iter.forEach(YAHOO.ext.Element.get('directLogins').getChildrenByTagName('li'), function(aDirectLoginElement) {
MochiKit.Signal.disconnectAll(aDirectLoginElement.dom);
//MochiKit.Logging.logDebug("disconnecting IMG " + aDirectLoginElement.getChildrenByTagName('img')[0].dom.src);
MochiKit.Signal.disconnectAll(aDirectLoginElement.getChildrenByTagName('img')[0].dom);
})
//MochiKit.Logging.logDebug("--- MainPanel.redrawDirectLoginItems - 1");
YAHOO.ext.Element.get('directLogins').update("");
//MochiKit.Logging.logDebug("--- MainPanel.redrawDirectLoginItems - 2");
allDirectLogins = MochiKit.Base.values(this.user().directLoginReferences());
//MochiKit.Logging.logDebug("--- MainPanel.redrawDirectLoginItems - 3");
allDirectLogins.sort(this.compareDirectLogins);
if (allDirectLogins.length == 0) {
YAHOO.ext.Element.get('directLoginsDescription').show();
YAHOO.ext.Element.get('directLogins').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
} else {
YAHOO.ext.Element.get('directLoginsDescription').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
YAHOO.ext.Element.get('directLogins').show();
}
//MochiKit.Logging.logDebug("--- MainPanel.redrawDirectLoginItems - 4");
template = this.directLoginItemTemplate();
//MochiKit.Logging.logDebug("--- MainPanel.redrawDirectLoginItems - 5");
MochiKit.Iter.forEach(allDirectLogins, MochiKit.Base.bind(function(aDirectLogin) {
var directLoginElement;
var faviconImageElementID;
faviconImageElementID = aDirectLogin.reference() + "_faviconIMG";
directLoginElement = template.append('directLogins', {
elementID:faviconImageElementID,
faviconUrl:aDirectLogin.fixedFavicon(),
directLoginTitle:aDirectLogin.label(),
directLoginReference:aDirectLogin.reference()
}, true);
//MochiKit.Logging.logDebug("--- MainPanel.redrawDirectLoginItems - 6: " + recordElement.dom);
directLoginElement.addClassOnOver("hover");
MochiKit.Signal.connect(directLoginElement.dom, 'onclick', this, 'handleDirectLoginClick');
MochiKit.Signal.connect(faviconImageElementID, 'onload', this, 'handleLoadedFaviconImage');
MochiKit.Signal.connect(faviconImageElementID, 'onerror', aDirectLogin, 'handleMissingFaviconImage');
MochiKit.Signal.connect(faviconImageElementID, 'onabort', aDirectLogin, 'handleMissingFaviconImage');
// YAHOO.ext.Element.get(faviconImageElementID).dom.src = aDirectLogin.fixedFavicon();
}, this));
//MochiKit.Logging.logDebug("<<< MainPanel.redrawDirectLoginItems");
},
//-------------------------------------------------------------------------
'handleDirectLoginClick': function(anEvent) {
var directLoginReference;
//MochiKit.Logging.logDebug(">>> MainPanel.handleDirectLoginClick !!!");
directLoginReference = this.user().directLoginReferences()[anEvent.src().id];
if (anEvent.target().className == 'directLoginItemEditButton') {
this.editDirectLogin(directLoginReference);
} else {
this.openDirectLogin(directLoginReference);
}
//MochiKit.Logging.logDebug("<<< MainPanel.handleDirectLoginClick");
},
'editDirectLogin': function(aDirectLoginReference) {
//MochiKit.Logging.logDebug("=== MainPanel.editDirectLogin - " + aDirectLoginReference.label());
this.setSelectedRecord(aDirectLoginReference.record());
},
'openDirectLogin': function(aDirectLoginReference) {
var deferredResult;
var newWindow;
//MochiKit.Logging.logDebug(">>> MainPanel.openDirectLogin - " + aDirectLoginReference.label());
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("MainPanel.openDirectLogin - 1: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(aDirectLoginReference, 'setupJumpPageWindow'));
deferredResult.addCallback(MochiKit.Base.method(aDirectLoginReference, 'deferredDirectLogin'));
deferredResult.addCallback(function(aDirectLogin) {
aDirectLogin.runDirectLogin(newWindow);
});
newWindow = window.open(Clipperz.PM.Strings['directLoginJumpPageUrl'], "");
// MochiKit.Signal.connect(newWindow, 'onload', MochiKit.Base.method(deferredResult, 'callback', newWindow))
// MochiKit.Signal.connect(newWindow, 'onload', MochiKit.Base.partial(alert, "done"));
deferredResult.callback(newWindow);
//MochiKit.Logging.logDebug("<<< MainPanel.openDirectLogin");
},
//-------------------------------------------------------------------------
'handleLoadedFaviconImage': function(anEvent) {
//MochiKit.Logging.logDebug(">>> MainPanel.handleLoadedFaviconImage");
MochiKit.Signal.disconnectAll(anEvent.src())
//MochiKit.Logging.logDebug("<<< MainPanel.handleLoadedFaviconImage");
},
//-------------------------------------------------------------------------
'recordItemTemplate': function() {
if (this._recordItemTemplate == null) {
this._recordItemTemplate = Clipperz.YUI.DomHelper.createTemplate({tag:'li', cls:'{cls}', id:'{recordReference}', children:[
{tag:'span', html:'{recordTitle}'}
]});
this._recordItemTemplate.compile();
}
return this._recordItemTemplate;
},
'directLoginItemTemplate': function() {
if (this._directLoginItemTemplate == null) {
this._directLoginItemTemplate = Clipperz.YUI.DomHelper.createTemplate({tag:'li', id:'{directLoginReference}', children:[
{tag:'table', border:'0', cellpadding:'0', cellspacing:'0', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', width:'20', align:'center', valign:'top', children:[
{tag:'img', id:'{elementID}', src:'{faviconUrl}'}
]},
{tag:'td', valign:'top', children:[
{tag:'a', cls:'directLoginItemTitle', html:'{directLoginTitle}'}
]},
{tag:'td', valign:'top', align:'right', children:[
// {tag:'span', cls:'directLoginItemEditButton', htmlString:Clipperz.PM.Strings['directLinkReferenceShowButtonLabel']}
{tag:'a', cls:'directLoginItemEditButton', htmlString:Clipperz.PM.Strings['directLinkReferenceShowButtonLabel']}
]}
]}
]}
]}
]});
this._directLoginItemTemplate.compile();
}
return this._directLoginItemTemplate;
},
//-------------------------------------------------------------------------
/*
'newRecordButton': function() {
return this._newRecordButton;
},
'setNewRecordButton': function(aValue) {
this._newRecordButton = aValue;
},
'newRecordCancelButton': function() {
return this._newRecordCancelButton;
},
'setNewRecordCancelButton': function(aValue) {
this._newRecordCancelButton = aValue;
},
*/
//-------------------------------------------------------------------------
'onkeydown': function(anEvent) {
//MochiKit.Logging.logDebug(">>> onkeydown - " + anEvent.src().id + ": " + anEvent.key().code);
switch (anEvent.src().id) {
/*
case this.getId('newRecordForm'):
if (anEvent.key().code == 13) {
this.newRecordButton().focus();
// this.addNewRecord();
} else if (anEvent.key().code == 27) {
this.newRecordCancelButton().focus();
this.hideNewRecordPanel(true);
}
break;
*/
case "recordFilterSearchForm":
if (anEvent.key().code == 13) {
//MochiKit.Logging.logDebug("SEARCH");
this.filterCardsWithName(YAHOO.ext.Element.get('recordFilterSearchValue').dom.value);
anEvent.event().stopPropagation();
YAHOO.ext.Element.get('recordFilterSearchValue').focus();
} else if (anEvent.key().code == 27) {
this.hideRecordFilterSearchPanel(true);
this.showRecordFilterAllPanel();
}
break;
}
},
//-------------------------------------------------------------------------
'renderRecordListBlockHeader': function(){
var recordListBlockHeaderElement;
recordListBlockHeaderElement = YAHOO.ext.Element.get('recordListBlockHeader');
recordListBlockHeaderElement.update("");
Clipperz.YUI.DomHelper.append(recordListBlockHeaderElement.dom,
{tag:'table', cls:'recordListBlockHeaderTABLE', border:'0', cellspacing:'0', cellpadding:'0', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', /*width:'50%',*/ cls:'recordBlockTitleTD', children:[
{tag:'h3', id:'recordBlockTitle', htmlString:Clipperz.PM.Strings['mainPanelRecordsBlockLabel']}
]},
{tag:'td', align:'right', children:[
{tag:'table', id:'recordListButtonsTABLE', border:'0', cellspacing:'0', cellpadding:'0', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', cls:'recordButtonTD', align:'right', children:[
{tag:'div', cls:'recordButton', id:'recordListAddRecordButton'}
]},
{tag:'td', cls:'recordButtonTD', align:'left', children:[
{tag:'div', cls:'recordButton', id:'recordListRemoveRecordButton'}
]}
]}
]}
]}
]},
{tag:'td', width:'15', html:"&nbsp;"}
]}
]}
]}
);
this.setAddNewRecordButton(new YAHOO.ext.Button('recordListAddRecordButton', {text:Clipperz.PM.Strings['mainPanelAddRecordButtonLabel'], handler:this.addNewRecord, scope:this}));
// this.setAddNewRecordButton(new YAHOO.ext.Button('recordListAddRecordButton', {text:Clipperz.PM.Strings['mainPanelAddRecordButtonLabel'], handler:this.showNewRecordPanel, scope:this}));
this.setDeleteRecordButton(new YAHOO.ext.Button('recordListRemoveRecordButton', {text:Clipperz.PM.Strings['mainPanelRemoveRecordButtonLabel'], handler:this.removeSelectedRecord, scope:this}));
if ((Clipperz.PM.Proxy.defaultProxy.isReadOnly()) || (this.selectedRecord() == null)) {
this.deleteRecordButton().disable();
}
if (Clipperz.PM.Proxy.defaultProxy.isReadOnly()) {
this.addNewRecordButton().disable();
}
},
//-------------------------------------------------------------------------
'renderRecordListFilterHeader': function(){
var recordListFilterHeaderElement;
recordListFilterHeaderElement = YAHOO.ext.Element.get('recordListFilterHeader');
recordListFilterHeaderElement.update("");
Clipperz.YUI.DomHelper.append(recordListFilterHeaderElement.dom,
{tag:'div', id:'recordFiltersDIV', children:[
{tag:'div', id:'recordFiltersTableWrapper', children:[
{tag:'table', id:'recordFiltersTABLE', border:'0', cellspacing:'0', cellpadding:'0', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', id:'recordFilterAllTD', children:[{tag:'div', children:[{tag:'a', id:'recordFilterAll', htmlString:Clipperz.PM.Strings['mainPanelRecordFilterBlockAllLabel']}]}]},
{tag:'td', id:'recordFilterTagsTD', children:[{tag:'div', children:[{tag:'a', id:'recordFilterTags', htmlString:Clipperz.PM.Strings['mainPanelRecordFilterBlockTagsLabel']}]}]},
{tag:'td', id:'recordFilterSearchTD', children:[{tag:'div', children:[{tag:'a', id:'recordFilterSearch', htmlString:Clipperz.PM.Strings['mainPanelRecordFilterBlockSearchLabel']}]}]}
]}
]}
]}
]},
{tag:'div', id:'recordFiltersTagsPanel'},
{tag:'div', id:'recordFiltersSearchPanel', children:[{tag:'div', id:'recordFiltersSearchInnerPanel', children:[{tag:'div', id:'recordFiltersSearchInnerInnerPanel', children:[
{tag:'form', id:'recordFilterSearchForm', children:[
{tag:'input', type:'text', name:'search', id:'recordFilterSearchValue'}
]}
]}]}]}
]}
);
/// YAHOO.ext.Element.get('recordFiltersSearchPanel').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide();
this.showRecordFilterAllPanel(false);
MochiKit.Signal.connect('recordFilterSearchForm', 'onkeydown', this, 'onkeydown');
MochiKit.Signal.connect('recordFilterSearchForm', 'onsubmit', this, 'onkeydown');
MochiKit.Signal.connect('recordFilterAll', 'onclick', this, 'showRecordFilterAllPanel');
MochiKit.Signal.connect('recordFilterTags', 'onclick', this, 'showRecordFilterTagsPanel');
MochiKit.Signal.connect('recordFilterSearch', 'onclick', this, 'showRecordFilterSearchPanel');
},
//-------------------------------------------------------------------------
'showRecordFilterAllPanel': function(shouldSlide) {
this.hideRecordFilterTagsPanel(shouldSlide);
this.hideRecordFilterSearchPanel(shouldSlide);
YAHOO.ext.Element.get('recordFilterAllTD').addClass('selectedTab');
},
'hideRecordFilterAllPanel': function(shouldSlide) {
YAHOO.ext.Element.get('recordFilterAllTD').removeClass('selectedTab');
},
//-------------------------------------------------------------------------
'showRecordFilterTagsPanel': function(shouldSlide) {
this.hideRecordFilterAllPanel(shouldSlide);
this.hideRecordFilterSearchPanel(shouldSlide);
YAHOO.ext.Element.get('recordFilterTagsTD').addClass('selectedTab');
},
'hideRecordFilterTagsPanel': function(shouldSlide) {
YAHOO.ext.Element.get('recordFilterTagsTD').removeClass('selectedTab');
},
//-------------------------------------------------------------------------
'showRecordFilterSearchPanel': function(shouldSlide) {
var searchPanelActor;
this.hideRecordFilterAllPanel(shouldSlide);
this.hideRecordFilterTagsPanel(shouldSlide);
YAHOO.ext.Element.get('recordFilterSearchTD').addClass('selectedTab');
YAHOO.ext.Element.get('recordFilterSearchValue').dom.value = "";
searchPanelActor = new YAHOO.ext.Actor('recordFiltersSearchPanel');
searchPanelActor.startCapture(true);
searchPanelActor.slideShow('top', 54);
searchPanelActor.play(MochiKit.Base.bind(function() {
YAHOO.ext.Element.get('recordFilterSearchValue').focus();
}, this));
},
'hideRecordFilterSearchPanel': function(shouldSlide) {
var searchPanelActor;
var callback;
YAHOO.ext.Element.get('recordFilterSearchTD').removeClass('selectedTab');
searchPanelActor = new YAHOO.ext.Actor('recordFiltersSearchPanel');
searchPanelActor.startCapture(true)
if (shouldSlide === false) {
searchPanelActor.hide();
searchPanelActor.slideHide('top');
searchPanelActor.show();
} else {
searchPanelActor.slideHide('top');
}
callback = MochiKit.Base.bind(function() {
}, this);
searchPanelActor.play(callback);
},
//-------------------------------------------------------------------------
'filterCardsWithName': function(aValue) {
MochiKit.Logging.logDebug(">>> filterCardsWithName: " + aValue);
MochiKit.Logging.logDebug("<<< filterCardsWithName");
},
'accountLockedHandler': function() {
this.setSelectedRecord(null);
},
//-------------------------------------------------------------------------
'switchLanguageHandler': function() {
YAHOO.ext.Element.get('directLoginTitle').update(Clipperz.PM.Strings['mainPanelDirectLoginBlockLabel']);
YAHOO.ext.Element.get('directLoginsDescription').update("");
MochiKit.Iter.forEach(Clipperz.PM.Strings['mainPanelDirectLoginBlockDescriptionConfig'], function(aConfigItem) {
Clipperz.YUI.DomHelper.append(YAHOO.ext.Element.get('directLoginsDescription').dom, aConfigItem);
});
YAHOO.ext.Element.get('recordBlockTitle').update(Clipperz.PM.Strings['mainPanelRecordsBlockLabel']);
this.renderRecordListBlockHeader();
// this.renderRecordListFilterHeader();
// YAHOO.ext.Element.get('newRecordPanelTitleH2').update(Clipperz.PM.Strings['mainPanelNewRecordPanelTitle']);
// YAHOO.ext.Element.get('newRecordPanelTitleLabel').update(Clipperz.PM.Strings['mainPanelNewRecordPanelRecordTitleLabel']);
// YAHOO.ext.Element.get('newRecordPanelConfigLabel').update("");
// MochiKit.Iter.forEach(Clipperz.PM.Strings['mainPanelNewRecordPanelRecordConfigConfig'], function(aConfigItem) {
// Clipperz.YUI.DomHelper.append(YAHOO.ext.Element.get('newRecordPanelConfigLabel').dom, aConfigItem);
// });
// this.newRecordButton().setText(Clipperz.PM.Strings['mainPanelNewRecordPanelCreateButtonLabel']);
// this.newRecordCancelButton().setText(Clipperz.PM.Strings['mainPanelNewRecordPanelCancelButtonLabel']);
this.recordDetailComponent().render();
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,305 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.Panels) == 'undefined') { Clipperz.PM.Components.Panels = {}; }
//#############################################################################
Clipperz.PM.Components.Panels.ToolsPanel = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.Panels.ToolsPanel.superclass.constructor.call(this, anElement, args);
this._generateButtonElement = null;
this._needsRenderingUponTabSwitch = false;
this.render();
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.Panels.ToolsPanel, Clipperz.PM.Components.Panels.BasePanel, {
'toString': function() {
return "Clipperz.PM.Components.Panels.ToolsPanel component";
},
//-------------------------------------------------------------------------
'render': function() {
var bookmarkletUrl;
//MochiKit.Logging.logDebug(">>> ToolsPanel.render");
Clipperz.NotificationCenter.unregister(this);
MochiKit.Signal.disconnectAllTo(this);
if (Clipperz_IEisBroken == true) {
bookmarkletUrl = bookmarklet_ie;
} else {
bookmarkletUrl = bookmarklet;
}
this.element().update("");
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'table', border:'0', cellspacing:'0', cellpadding:'0', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', valign:'top', width:'200', children:[
{tag:'ul', id:"dataSubMenu", cls:'subMenu', children:[
{tag:'li', id:this.getId('passwordGenerator'), htmlString:Clipperz.PM.Strings['passwordGeneratorTabLabel']},
{tag:'li', id:this.getId('bookmarklet'), htmlString:Clipperz.PM.Strings['bookmarkletTabLabel']},
{tag:'li', id:this.getId('compact'), htmlString:Clipperz.PM.Strings['compactTabLabel']},
{tag:'li', id:this.getId('httpAuth'), htmlString:Clipperz.PM.Strings['httpAuthTabLabel']}
]}
]},
{tag:'td', valign:'top', children:[
{tag:'ul', cls:'clipperzTabPanels', children:[
{tag:'li', id:this.getId('passwordGeneratorPanel'), children:[
{tag:'div', cls:'clipperzSubPanel', children:[
{tag:'h5', htmlString:Clipperz.PM.Strings['passwordGeneratorTabTitle']},
{tag:'div', cls:'panelDescription', htmlString:Clipperz.PM.Strings['paswordGeneratorTabDescription']},
//---------------------------------------------------
{tag:'div', children:[
{tag:'form', id:this.getId('passwordGeneratorForm'), cls:'passwordGenerator', children:[
{tag:'input', type:'text', cls:'clipperz_passwordGenerator_password', id:this.getId('passwordField')},
{tag:'table', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', width:'20%', children:[
{tag:'input', type:'checkbox', name:'lowercase', id:this.getId('lowercase'), checked:true},
{tag:'span', htmlString:Clipperz.PM.Strings['passwordGeneratorLowercaseLabel']}
]},
{tag:'td', width:'20%', children:[
{tag:'input', type:'checkbox', name:'uppercase', id:this.getId('uppercase'), checked:true},
{tag:'span', htmlString:Clipperz.PM.Strings['passwordGeneratorUppercaseLabel']}
]},
{tag:'td', width:'20%', children:[
{tag:'input', type:'checkbox', name:'numbers', id:this.getId('numbers'), checked:true},
{tag:'span', htmlString:Clipperz.PM.Strings['passwordGeneratorNumberLabel']}
]},
{tag:'td', width:'20%', children:[
{tag:'input', type:'checkbox', name:'symbols', id:this.getId('symbols'), checked:true},
{tag:'span', htmlString:Clipperz.PM.Strings['passwordGeneratorSymbolLabel']}
]},
{tag:'td', width:'20%', children:[
{tag:'span', cls:'passwordGeneratorLength', children:[
{tag:'span', htmlString:Clipperz.PM.Strings['passwordGeneratorLengthLabel']},
{tag:'span', id:this.getId('passwordLength'), cls:'passwordGeneratorLengthValue', html:'0'}
]}
]}
]}
]}
]}
]},
{tag:'div', id:this.getId('generateRandomPassword')}
]}
//---------------------------------------------------
]}
]},
{tag:'li', id:this.getId('bookmarkletPanel'), children:[
{tag:'div', cls:'clipperzSubPanel', children:[
{tag:'h5', htmlString:Clipperz.PM.Strings['bookmarkletTabTitle']},
{tag:'div', cls:'panelDescription', htmlString:Clipperz.PM.Strings['bookmarkletTabDescription']},
{tag:'a', href:bookmarkletUrl, cls:'bookmarkletLink', htmlString:Clipperz.PM.Strings['bookmarkletTabBookmarkletTitle']},
{tag:'div', cls:'panelDescription', htmlString:Clipperz.PM.Strings['bookmarkletTabInstructions']}
]}
]},
{tag:'li', id:this.getId('compactPanel'), children:[
{tag:'div', cls:'clipperzSubPanel', children:[
{tag:'h5', htmlString:Clipperz.PM.Strings['compactTabTitle']},
{tag:'div', cls:'panelDescription', htmlString:Clipperz.PM.Strings['compactTabDescription']}
]}
]},
{tag:'li', id:this.getId('httpAuthPanel'), children:[
{tag:'div', cls:'clipperzSubPanel', children:[
{tag:'h5', htmlString:Clipperz.PM.Strings['httpAuthTabTitle']},
{tag:'div', cls:'panelDescription', htmlString:Clipperz.PM.Strings['httpAuthTabDescription']},
{tag:'div', cls:'bookmarkletConfiguration', children:[Clipperz.PM.Strings['httpAuthBookmarkletConfiguration']]}
]}
]}
]}
]}
]}
]}
]});
new Clipperz.PM.Components.PasswordEntropyDisplay(this.getElement('passwordField'));
MochiKit.Signal.connect(this.getId('lowercase'), 'onclick', this, 'updatePasswordValue');
MochiKit.Signal.connect(this.getId('uppercase'), 'onclick', this, 'updatePasswordValue');
MochiKit.Signal.connect(this.getId('numbers'), 'onclick', this, 'updatePasswordValue');
MochiKit.Signal.connect(this.getId('symbols'), 'onclick', this, 'updatePasswordValue');
MochiKit.Signal.connect(this.getDom('passwordField'), 'onkeyup', this, 'updatePasswordLengthLabel');
MochiKit.Signal.connect(this.getDom('passwordField'), 'onchange', this, 'updatePasswordLengthLabel');
MochiKit.Signal.connect(this.getDom('passwordField'), 'onblur', this, 'updatePasswordLengthLabel');
this.setGenerateButtonElement(new YAHOO.ext.Button(this.getDom('generateRandomPassword'), {text:Clipperz.PM.Strings['passwordGeneratorTabButtonLabel'], handler:this.updatePasswordValue, scope:this}));
this.setNeedsRenderingUponTabSwitch(false);
this.tabPanelController().setUp();
Clipperz.NotificationCenter.register(null, 'tabSelected', this, 'tabSelectedHandler');
Clipperz.NotificationCenter.register(null, 'switchLanguage', this, 'switchLanguageHandler');
//MochiKit.Logging.logDebug("<<< ToolsPanel.render");
},
//-------------------------------------------------------------------------
'needsRenderingUponTabSwitch': function() {
return this._needsRenderingUponTabSwitch;
},
'setNeedsRenderingUponTabSwitch': function(aValue) {
this._needsRenderingUponTabSwitch = aValue;
},
'tabSelectedHandler': function(anEvent) {
if (this.needsRenderingUponTabSwitch()) {
this.render();
}
if (anEvent.parameters() == this.getId('httpAuth')) {
var textarea;
textarea = document.getElementById("httpAuthDefaultConfiguration");
textarea.focus();
textarea.select();
}
},
//-------------------------------------------------------------------------
'tabPanelController': function() {
if (this._tabPanelController == null) {
var tabPanelControllerConfig;
tabPanelControllerConfig = {}
tabPanelControllerConfig[this.getId('passwordGenerator')] = this.getId('passwordGeneratorPanel');
tabPanelControllerConfig[this.getId('bookmarklet')] = this.getId('bookmarkletPanel');
tabPanelControllerConfig[this.getId('compact')] = this.getId('compactPanel');
tabPanelControllerConfig[this.getId('httpAuth')] = this.getId('httpAuthPanel');
this._tabPanelController = new Clipperz.PM.Components.TabPanel.TabPanelController({ config:tabPanelControllerConfig, selectedTab:this.getId('passwordGenerator') });
}
return this._tabPanelController;
},
//-------------------------------------------------------------------------
'generateButtonElement': function() {
return this._generateButtonElement;
},
'setGenerateButtonElement': function(aValue) {
this._generateButtonElement = aValue;
},
//-------------------------------------------------------------------------
'updatePasswordValue': function(anEvent) {
var randomBytes;
var randomValue;
var charset;
var charsetBitSize;
var stringValue;
var blockIndex;
//MochiKit.Logging.logDebug(">>> updatePasswordValue");
randomBytes = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(50);
stringValue = "";
blockIndex = 0;
charset = "";
if (this.getDom('lowercase').checked) {
charset += Clipperz.PM.Strings['passwordGeneratorLowercaseCharset'];
}
if (this.getDom('uppercase').checked) {
charset += Clipperz.PM.Strings['passwordGeneratorUppercaseCharset'];
}
if (this.getDom('numbers').checked) {
charset += Clipperz.PM.Strings['passwordGeneratorNumberCharset'];
}
if (this.getDom('symbols').checked) {
charset += Clipperz.PM.Strings['passwordGeneratorSymbolCharset'];
}
charsetBitSize = 0;
while (Math.pow(2, charsetBitSize) < charset.length) {
charsetBitSize ++;
}
if (charsetBitSize > 0) {
while (Clipperz.PM.Crypto.passwordEntropy(stringValue) < 128) {
if (((blockIndex + 1)*charsetBitSize) > (randomBytes.length() * 8)) {
randomBytes = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(50);
blockIndex = 0;
}
randomValue = randomBytes.bitBlockAtIndexWithSize(blockIndex*charsetBitSize, charsetBitSize);
if (randomValue < charset.length) {
stringValue += charset.charAt(randomValue);
}
blockIndex ++;
}
} else {
stringValue = "";
}
this.getElement('passwordField').dom.focus()
this.getElement('passwordField').dom.value = stringValue;
if (anEvent.src) {
anEvent.src().focus();
} else {
this.generateButtonElement().el.focus();
}
this.setNeedsRenderingUponTabSwitch(true);
return false;
//MochiKit.Logging.logDebug("<<< updatePasswordValue");
},
//-----------------------------------------------------
'updatePasswordLengthLabel': function() {
this.getElement('passwordLength').update(this.getDom('passwordField').value.length);
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,118 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
Clipperz.PM.Components.PasswordEntropyDisplay = function(anElement, args) {
args = args || {};
//MochiKit.Logging.logDebug(">>> new TextFormField");
Clipperz.PM.Components.PasswordEntropyDisplay.superclass.constructor.call(this, anElement, args);
this._wrapperElement = null;
this._entropyElement = null;
this.render();
//MochiKit.Logging.logDebug("<<< new TextFormField");
return this;
};
YAHOO.extendX(Clipperz.PM.Components.PasswordEntropyDisplay, Clipperz.PM.Components.BaseComponent, {
'toString': function() {
return "Clipperz.PM.Components.PasswordEntropyDisplay";
},
//-----------------------------------------------------
'wrapperElement': function() {
return this._wrapperElement;
},
'setWrapperElement': function(aValue) {
this._wrapperElement = aValue;
},
//-----------------------------------------------------
'passwordElement': function() {
return this.element();
},
//-----------------------------------------------------
'entropyElement': function() {
return this._entropyElement;
},
'setEntropyElement': function(aValue) {
this._entropyElement = aValue;
},
//-----------------------------------------------------
'render': function() {
MochiKit.Signal.disconnectAllTo(this);
this.setWrapperElement(this.element().wrap({tag:'div'}));
this.setEntropyElement(Clipperz.YUI.DomHelper.append(this.wrapperElement().dom, {tag:'div', cls:'passwordEntropy', html:"&nbsp;"}, true));
// this.entropyElement().setWidth(this.passwordElement().getWidth());
this.updateEntropyElement();
MochiKit.Signal.connect(this.element().dom, 'onkeyup', this, 'updateEntropyElement');
MochiKit.Signal.connect(this.element().dom, 'onchange', this, 'updateEntropyElement');
MochiKit.Signal.connect(this.element().dom, 'onblur', this, 'updateEntropyElement');
},
//-----------------------------------------------------
'computeEntropyForString': function(aValue) {
return Clipperz.PM.Crypto.passwordEntropy(aValue);
},
//-----------------------------------------------------
'updateEntropyElement': function(anEvent) {
//MochiKit.Logging.logDebug(">>> PasswordEntropyDisplay.updateEntropyElement");
var maxExtent;
var entropy;
entropy = Math.min(128, this.computeEntropyForString(this.passwordElement().dom.value));
//MochiKit.Logging.logDebug("--- PasswordEntropyDisplay.updateEntropyElement - entropy: " + entropy);
this.entropyElement().setStyle('background-position', "0px " + -entropy + "px");
this.entropyElement().setWidth(this.passwordElement().getWidth() * (entropy/128));
//MochiKit.Logging.logDebug("<<< PasswordEntropyDisplay.updateEntropyElement");
},
//-----------------------------------------------------
__syntaxFix__: '__syntaxFix__'
});

View File

@@ -0,0 +1,285 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
Clipperz.PM.Components.PasswordGenerator = function(anElement, aFieldValueComponent, args) {
args = args || {};
//MochiKit.Logging.logDebug(">>> new TextFormField");
Clipperz.PM.Components.PasswordGenerator.superclass.constructor.call(this, anElement, args);
this._fieldValueComponent = aFieldValueComponent;
this._panelButton = null;
this.render();
//MochiKit.Logging.logDebug("<<< new TextFormField");
return this;
};
YAHOO.extendX(Clipperz.PM.Components.PasswordGenerator, Clipperz.PM.Components.BaseComponent, {
'toString': function() {
return "Clipperz.PM.Components.PasswordGenerator";
},
//-----------------------------------------------------
'fieldValueComponent': function() {
return this._fieldValueComponent;
},
//-----------------------------------------------------
'render': function() {
MochiKit.Signal.disconnectAllTo(this);
// this._panelButton = new YAHOO.ext.Button(this.element().dom, {text:Clipperz.PM.Strings['passwordGeneratorButtonLabel'], handler:this.openPasswordPanel, scope:this});
MochiKit.Signal.connect(this.element().dom, 'onmouseenter', this, 'onMouseEnter');
MochiKit.Signal.connect(this.element().dom, 'onmouseleave', this, 'onMouseLeave');
MochiKit.Signal.connect(this.element().dom, 'onclick', this, 'openPasswordPanel');
},
//-----------------------------------------------------
'onMouseEnter': function() {
this.element().addClass('hover');
},
'onMouseLeave': function() {
this.element().removeClass('hover');
},
//-----------------------------------------------------
'panelButton': function() {
return this._panelButton;
},
//-----------------------------------------------------
'openPasswordPanel': function() {
var passwordGeneratorElement;
var passwordGeneratorDialog;
var cancelButton;
var okButton;
var cancelFunction;
var okFunction;
//MochiKit.Logging.logDebug(">>> PasswordGenerator.openPasswordPanel");
passwordGeneratorElement = Clipperz.YUI.DomHelper.append(document.body, {tag:'div', id:'passwordGenerator', children:[
{tag:'div', cls:'ydlg-hd', htmlString:Clipperz.PM.Strings['passwordGeneratorPanelTitle']},
{tag:'div', cls:'ydlg-bd', children:[
{tag:'form', id:this.getId('passwordGeneratorForm'), cls:'passwordGenerator', children:[
{tag:'input', type:'text', cls:'clipperz_passwordGenerator_password', id:this.getId('passwordField')},
{tag:'table', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', width:'20%', children:[
{tag:'input', type:'checkbox', name:'lowercase', id:this.getId('lowercase'), checked:true},
{tag:'span', htmlString:Clipperz.PM.Strings['passwordGeneratorLowercaseLabel']}
]},
{tag:'td', width:'20%', children:[
{tag:'input', type:'checkbox', name:'uppercase', id:this.getId('uppercase'), checked:true},
{tag:'span', htmlString:Clipperz.PM.Strings['passwordGeneratorUppercaseLabel']}
]},
{tag:'td', width:'20%', children:[
{tag:'input', type:'checkbox', name:'numbers', id:this.getId('numbers'), checked:true},
{tag:'span', htmlString:Clipperz.PM.Strings['passwordGeneratorNumberLabel']}
]},
{tag:'td', width:'20%', children:[
{tag:'input', type:'checkbox', name:'symbols', id:this.getId('symbols'), checked:true},
{tag:'span', htmlString:Clipperz.PM.Strings['passwordGeneratorSymbolLabel']}
]},
{tag:'td', width:'20%', children:[
{tag:'span', cls:'passwordGeneratorLength', children:[
{tag:'span', htmlString:Clipperz.PM.Strings['passwordGeneratorLengthLabel']},
{tag:'span', id:this.getId('passwordLength'), cls:'passwordGeneratorLengthValue', html:'0'}
]}
]}
]}
]}
]}
]}
]},
{tag:'div', cls:'ydlg-ft'}
]}, true);
new Clipperz.PM.Components.PasswordEntropyDisplay(this.getElement('passwordField'));
MochiKit.Signal.connect(this.getId('lowercase'), 'onclick', this, 'updatePasswordValue');
MochiKit.Signal.connect(this.getId('uppercase'), 'onclick', this, 'updatePasswordValue');
MochiKit.Signal.connect(this.getId('numbers'), 'onclick', this, 'updatePasswordValue');
MochiKit.Signal.connect(this.getId('symbols'), 'onclick', this, 'updatePasswordValue');
MochiKit.Signal.connect(this.getDom('passwordField'), 'onkeyup', this, 'updatePasswordLengthLabel');
MochiKit.Signal.connect(this.getDom('passwordField'), 'onchange', this, 'updatePasswordLengthLabel');
MochiKit.Signal.connect(this.getDom('passwordField'), 'onblur', this, 'updatePasswordLengthLabel');
this.updatePasswordValue();
passwordGeneratorDialog = new YAHOO.ext.BasicDialog(
passwordGeneratorElement, {
autoCreate:false,
closable:false,
modal:true,
autoTabs:false,
resizable:false,
fixedcenter:true,
constraintoviewport:false,
width:320,
height:130,
shadow:true,
minWidth:200,
minHeight:100
}
);
cancelFunction = MochiKit.Base.partial(MochiKit.Base.bind(this.cancelPasswordPanel, this), passwordGeneratorDialog);
passwordGeneratorDialog.addKeyListener(27, cancelFunction);
cancelButton = passwordGeneratorDialog.addButton(Clipperz.PM.Strings['passwordGeneratorPanelCancelLabel'], cancelFunction, this);
okFunction = MochiKit.Base.partial(MochiKit.Base.bind(this.okPasswordPanel, this), passwordGeneratorDialog);
passwordGeneratorDialog.addKeyListener([10, 13], okFunction);
okButton = passwordGeneratorDialog.addButton(Clipperz.PM.Strings['passwordGeneratorPanelOkLabel'], okFunction, this);
MochiKit.Signal.connect(this.getId('passwordGeneratorForm'), 'onsubmit', okFunction);
passwordGeneratorDialog.setDefaultButton(okButton);
this.fieldValueComponent().mainComponent().mainPanel().exitModalView();
this.fieldValueComponent().mainComponent().scrollToTop();
// passwordGeneratorDialog.show(this.panelButton().getEl());
passwordGeneratorDialog.show(this.element());
this.onMouseLeave();
},
//-----------------------------------------------------
'cancelPasswordPanel': function(aPasswordGeneratorPanel) {
this.fieldValueComponent().mainComponent().mainPanel().enterModalView();
aPasswordGeneratorPanel.hide(MochiKit.Base.bind(function() {
aPasswordGeneratorPanel.destroy(true);
MochiKit.Signal.disconnectAllTo(this);
}, this));
},
//-----------------------------------------------------
'updatePasswordLengthLabel': function() {
this.getElement('passwordLength').update(this.getDom('passwordField').value.length);
},
//-----------------------------------------------------
'okPasswordPanel': function(aPasswordGeneratorPanel, anEvent) {
//MochiKit.Logging.logDebug(">>> PasswordGenerator.okPasswordPanel");
if (anEvent.stop) {
anEvent.stop();
}
this.fieldValueComponent().inputElement().dom.focus();
this.fieldValueComponent().inputElement().dom.value = this.getElement('passwordField').dom.value;
this.getElement('passwordField').dom.focus();
this.cancelPasswordPanel(aPasswordGeneratorPanel);
return false;
},
//-----------------------------------------------------
'updatePasswordValue': function(anEvent) {
var randomBytes;
var randomValue;
var charset;
var charsetBitSize;
var stringValue;
var blockIndex;
//MochiKit.Logging.logDebug(">>> updatePasswordValue");
randomBytes = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(50);
stringValue = "";
blockIndex = 0;
charset = "";
if (this.getDom('lowercase').checked) {
charset += Clipperz.PM.Strings['passwordGeneratorLowercaseCharset'];
}
if (this.getDom('uppercase').checked) {
charset += Clipperz.PM.Strings['passwordGeneratorUppercaseCharset'];
}
if (this.getDom('numbers').checked) {
charset += Clipperz.PM.Strings['passwordGeneratorNumberCharset'];
}
if (this.getDom('symbols').checked) {
charset += Clipperz.PM.Strings['passwordGeneratorSymbolCharset'];
}
charsetBitSize = 0;
while (Math.pow(2, charsetBitSize) < charset.length) {
charsetBitSize ++;
}
if (charsetBitSize > 0) {
while (Clipperz.PM.Crypto.passwordEntropy(stringValue) < 128) {
if (((blockIndex + 1)*charsetBitSize) > (randomBytes.length() * 8)) {
randomBytes = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(50);
blockIndex = 0;
}
randomValue = randomBytes.bitBlockAtIndexWithSize(blockIndex*charsetBitSize, charsetBitSize);
if (randomValue < charset.length) {
stringValue += charset.charAt(randomValue);
}
blockIndex ++;
}
} else {
stringValue = "";
}
this.getElement('passwordField').dom.focus()
this.getElement('passwordField').dom.value = stringValue;
if (anEvent) {
anEvent.src().focus();
} else {
this.element().focus();
}
return false;
//MochiKit.Logging.logDebug("<<< updatePasswordValue");
},
//-----------------------------------------------------
__syntaxFix__: '__syntaxFix__'
});

View File

@@ -0,0 +1,28 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/

View File

@@ -0,0 +1,28 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/

View File

@@ -0,0 +1,95 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.Printing) == 'undefined') { Clipperz.PM.Components.Printing = {}; }
Clipperz.PM.Components.Printing.Record = function(args) {
args = args || {};
this._record = args['record'];
return this;
}
MochiKit.Base.update(Clipperz.PM.Components.Printing.Record.prototype, {
'record': function() {
return this._record;
},
//-------------------------------------------------------------------------
'deferredDrawToWindow': function(aWindow) {
var deferredResult;
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(MochiKit.Base.method(this.record(), 'deferredData'));
deferredResult.addCallback(MochiKit.Base.method(this, 'appendToWindow', aWindow));
deferredResult.callback();
return deferredResult;
},
//-------------------------------------------------------------------------
'appendToWindow': function(aWindow) {
MochiKit.DOM.withWindow(aWindow, MochiKit.Base.bind(function() {
var newBlock;
var fields;
fields = MochiKit.Base.concat(
MochiKit.Base.map(MochiKit.Base.bind(function(aField) {
var result;
var dt, dd;
var label, value;
label = aField.label();
value = aField.value();
dt = MochiKit.DOM.createDOM('DT', null, label);
dd = MochiKit.DOM.createDOM('DD', null, value)
result = [dt, dd];
return result
}, this), MochiKit.Base.values(this.record().currentVersion().fields()))
);
newBlock = MochiKit.DOM.DIV({'class': 'recordBlock'},
MochiKit.DOM.H2(null, this.record().label()),
MochiKit.DOM.DIV({'class': 'recordNotes'}, MochiKit.Base.map(MochiKit.Base.partial(MochiKit.DOM.P, null), this.record().notes().split("\n"))),
MochiKit.DOM.createDOM('DL', null, fields)
);
MochiKit.DOM.appendChildNodes(MochiKit.DOM.currentDocument().body, newBlock);
}, this));
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,105 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.RecordDetail) == 'undefined') { Clipperz.PM.Components.RecordDetail = {}; }
//#############################################################################
Clipperz.PM.Components.RecordDetail.AbstractComponent = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.RecordDetail.AbstractComponent.superclass.constructor.call(this, args);
this._element = anElement;
this._mainComponent = args.mainComponent;
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.RecordDetail.AbstractComponent, Clipperz.PM.Components.BaseComponent, {
'toString': function() {
return "Clipperz.PM.Components.RecordDetail.AbstractComponent";
},
//-------------------------------------------------------------------------
'mainComponent': function() {
return this._mainComponent;
},
//-------------------------------------------------------------------------
'record': function() {
return this.mainComponent().record();
},
//-------------------------------------------------------------------------
'editMode': function() {
return this.mainComponent().editMode();
},
//-------------------------------------------------------------------------
'render': function() {
this.element().update("");
this.update();
},
//-------------------------------------------------------------------------
'update': function(anEvent) {
if (this.editMode() == 'EDIT') {
this.updateEditMode();
} else if (this.editMode() == 'VIEW') {
this.updateViewMode();
}
},
//-------------------------------------------------------------------------
'updateViewMode': function() {},
'updateEditMode': function() {},
'synchronizeComponentValues': function() {},
//-------------------------------------------------------------------------
'destroy': function() {
this.element().remove();
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,77 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.RecordDetail) == 'undefined') { Clipperz.PM.Components.RecordDetail = {}; }
//#############################################################################
Clipperz.PM.Components.RecordDetail.AbstractFieldSubComponent = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.RecordDetail.AbstractFieldSubComponent.superclass.constructor.call(this, anElement, args);
this._fieldComponent = args.fieldComponent || null;
this.render();
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.RecordDetail.AbstractFieldSubComponent, Clipperz.PM.Components.RecordDetail.AbstractComponent, {
'toString': function() {
return "Clipperz.PM.Components.RecordDetail.AbstractFieldSubComponent";
},
//-------------------------------------------------------------------------
'fieldComponent': function() {
return this._fieldComponent;
},
//-------------------------------------------------------------------------
'mainComponent': function() {
return this.fieldComponent().mainComponent();
},
//-------------------------------------------------------------------------
'recordField': function() {
return this.fieldComponent().recordField();
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,317 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.RecordDetail) == 'undefined') { Clipperz.PM.Components.RecordDetail = {}; }
//#############################################################################
Clipperz.PM.Components.RecordDetail.CreationWizard = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.RecordDetail.CreationWizard.superclass.constructor.call(this, anElement, args);
this._mainComponent = args.mainComponent;
this._previouslySelectedRecord = args.previouslySelectedRecord;
//MochiKit.Logging.logDebug("--- new CreationWizard - previouslySelectedRecord: " + args.previouslySelectedRecord);
this._createButton_header = null;
this._createButton_footer = null;
this._cancelButton_header = null;
this._cancelButton_footer = null;
this.render();
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.RecordDetail.CreationWizard, Clipperz.PM.Components.BaseComponent, {
'toString': function() {
return "Clipperz.PM.Components.RecordDetail.CreationWizard component";
},
//-------------------------------------------------------------------------
'previouslySelectedRecord': function() {
return this._previouslySelectedRecord;
},
//-------------------------------------------------------------------------
'render': function() {
var templateListElement;
var templates;
this.element().update("");
Clipperz.YUI.DomHelper.append(this.element().dom,
{tag:'form', cls:'recordDataFORM', id:this.getId('form'), children:[
{tag:'div', id:'recordDetailDataBox', cls:'recordDetailDataBox', children:[
{tag:'div', id:this.getId('wizardBox'), cls:'recordCreationWizard', children:[
{tag:'div', id:this.getId('recordCreationWizardTitleBox'), cls:'recordCreationWizardTitleBox', htmlString:Clipperz.PM.Strings['newRecordWizardTitleBox']},
{tag:'ul', id:this.getId('templateList'), cls:'radioList'}
]}
]}
]}
);
Clipperz.YUI.DomHelper.append(this.getDom('recordCreationWizardTitleBox'), {tag:'div', cls:'newRecordWizardHeader', children:[
{tag:'table', width:'100%', cellpadding:'5', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', width:'49%', align:'right', children:[
{tag:'div', id:this.getId('cancelButton_header')}
]},
{tag:'td', width:'10', html:'&nbsp;'},
{tag:'td', width:'49%', align:'left', children:[
{tag:'div', id:this.getId('createButton_header')}
]}
]}
]}
]}
]});
templateListElement = this.getElement('templateList');
templates = Clipperz.PM.Strings['recordTemplates'];
MochiKit.Iter.forEach(MochiKit.Base.keys(templates), MochiKit.Base.bind(function(aTemplateKey) {
Clipperz.YUI.DomHelper.append(templateListElement.dom, {tag:'li', children:[
{tag:'table', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', valign:'top', children:[
{tag:'input', id:this.getId(aTemplateKey+"_radio"), type:'radio', name:'recordTemplate', value:"aTemplateKey"}
]},
{tag:'td', valign:'top', children:[
{tag:'h4', id:this.getId(aTemplateKey+"_title"), html:templates[aTemplateKey]['title']},
{tag:'div', cls:'templateDescription', htmlString:templates[aTemplateKey]['description']}
]}
]}
]}
]}
]});
this.getElement(aTemplateKey+"_radio").dom.value = aTemplateKey;
MochiKit.Signal.connect(this.getDom(aTemplateKey+"_title"), 'onclick', MochiKit.Base.partial(function(aRadioButton) {aRadioButton.click();}, this.getDom(aTemplateKey+"_radio")));
}, this));
Clipperz.YUI.DomHelper.append(templateListElement.dom, {tag:'li', children:[
{tag:'table', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', valign:'top', children:[
{tag:'input', type:'radio', name:'recordTemplate', id:this.getId('bookmarkletRadioButton'), value:'BookmarkletConfigurationTemplate'}
]},
{tag:'td', valign:'top', children:[
{tag:'h4', htmlString:Clipperz.PM.Strings['newRecordWizardBookmarkletConfigurationTitle']},
{tag:'div', cls:'templateDescription', htmlString:Clipperz.PM.Strings['newRecordWizardBookmarkletConfigurationDescription']},
{tag:'div', cls:'bookmarkletConfiguration', children:[
// {tag:'span', htmlString:Clipperz.PM.Strings['newRecordWizardBookmarkletConfigurationLabel']},
{tag:'div', htmlString:Clipperz.PM.Strings['recordDetailNewDirectLoginDescription']},
{tag:'textarea', id:this.getId('bookmarkletConfiguration')}
]}
]}
]}
]}
]}
]});
Clipperz.YUI.DomHelper.append(this.getDom('wizardBox'), {tag:'div', cls:'newRecordWizardFooter', children:[
{tag:'table', width:'100%', cellpadding:'5', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', width:'49%', align:'right', children:[
{tag:'div', id:this.getId('cancelButton_footer')}
]},
{tag:'td', width:'10', html:'&nbsp;'},
{tag:'td', width:'49%', align:'left', children:[
{tag:'div', id:this.getId('createButton_footer')}
]}
]}
]}
]}
]});
this.setCreateButton_header(new YAHOO.ext.Button(this.getDom('createButton_header'), {text:Clipperz.PM.Strings['newRecordWizardCreateButtonLabel'], handler:this.createRecord, scope:this}));
this.setCreateButton_footer(new YAHOO.ext.Button(this.getDom('createButton_footer'), {text:Clipperz.PM.Strings['newRecordWizardCreateButtonLabel'], handler:this.createRecord, scope:this}));
this.setCancelButton_header(new YAHOO.ext.Button(this.getDom('cancelButton_header'), {text:Clipperz.PM.Strings['newRecordWizardCancelButtonLabel'], handler:this.exitWizard, scope:this}));
this.setCancelButton_footer(new YAHOO.ext.Button(this.getDom('cancelButton_footer'), {text:Clipperz.PM.Strings['newRecordWizardCancelButtonLabel'], handler:this.exitWizard, scope:this}));
this.createButton_header().disable();
this.createButton_footer().disable();
MochiKit.Iter.forEach(this.getElement('form').getChildrenByTagName('input'), MochiKit.Base.bind(function(anInput) {
// MochiKit.Signal.connect(anInput.dom, 'onchange', this, 'enableCreateButton');
MochiKit.Signal.connect(anInput.dom, 'onclick', this, 'enableCreateButton'); // for Safari
},this));
MochiKit.Signal.connect(this.getDom('bookmarkletConfiguration'), 'onkeyup', this, 'enableCreateButton');
MochiKit.Signal.connect(this.getDom('bookmarkletConfiguration'), 'onkeydown', this, 'enableCreateButton'); // for Safari
},
//-------------------------------------------------------------------------
'createButton_header': function() {
return this._createButton_header;
},
'setCreateButton_header': function(aValue) {
this._createButton_header = aValue;
},
//.........................................................................
'createButton_footer': function() {
return this._createButton_footer;
},
'setCreateButton_footer': function(aValue) {
this._createButton_footer = aValue;
},
//-------------------------------------------------------------------------
'cancelButton_header': function() {
return this._cancelButton_header;
},
'setCancelButton_header': function(aValue) {
this._cancelButton_header = aValue;
},
//.........................................................................
'cancelButton_footer': function() {
return this._cancelButton_footer;
},
'setCancelButton_footer': function(aValue) {
this._cancelButton_footer = aValue;
},
//-------------------------------------------------------------------------
'enableCreateButton': function(anEvent, skipKeyDownCheck) {
//MochiKit.Logging.logDebug(">>> CreationWizard.enableCreateButton (" + anEvent.type() + ")");
if ((anEvent.type() == "keydown") && (skipKeyDownCheck != true)) {
//MochiKit.Logging.logDebug("--- CreationWizard.enableCreateButton - handling 'keydown' event with a postponed execution of the check");
MochiKit.Async.callLater(0.3, MochiKit.Base.method(this, 'enableCreateButton', anEvent, true));
} else {
var shouldEnableCreateButton;
var isBookmarkletConfigurationEmpty;
//MochiKit.Logging.logDebug("--- CreationWizard.enableCreateButton - common execution");
shouldEnableCreateButton = true;
isBookmarkletConfigurationEmpty = !/[^ \n]/.test(this.getDom('bookmarkletConfiguration').value);
//MochiKit.Logging.logDebug("--- CreationWizard.enableCreateButton - isBookmarkletConfigurationEmpty: " + isBookmarkletConfigurationEmpty);
if ((anEvent.src() == this.getDom('bookmarkletConfiguration')) && !isBookmarkletConfigurationEmpty) {
this.getDom('bookmarkletRadioButton').checked = true;
}
if ((this.getDom('bookmarkletRadioButton').checked) && isBookmarkletConfigurationEmpty) {
shouldEnableCreateButton = false;
}
if (shouldEnableCreateButton) {
//MochiKit.Logging.logDebug("--- CreationWizard.enableCreateButton - enabling button");
this.createButton_header().enable();
this.createButton_footer().enable();
} else {
//MochiKit.Logging.logDebug("--- CreationWizard.enableCreateButton - disabling button");
this.createButton_header().disable();
this.createButton_footer().disable();
}
}
//MochiKit.Logging.logDebug("<<< CreationWizard.enableCreateButton");
},
//-------------------------------------------------------------------------
'createRecord': function() {
var selectedTemplateKey;
var newRecord;
selectedTemplateKey = MochiKit.Base.filter(function(aCheckBoxElement) {
return aCheckBoxElement.dom.checked;
},this.getElement('form').getChildrenByTagName('input'))[0].dom.value;
//MochiKit.Logging.logDebug("--- CreationWizard.createRecord - selectedTemplateKey: " + selectedTemplateKey);
if (selectedTemplateKey == 'BookmarkletConfigurationTemplate') {
var bookmarkletConfiguration;
this.mainComponent().exitModalView();
bookmarkletConfiguration = Clipperz.PM.BookmarkletProcessor.checkBookmarkletConfiguration(this.getDom('bookmarkletConfiguration').value, this.getDom('createButton'), MochiKit.Base.method(this.mainComponent(), 'enterModalView'));
this.mainComponent().enterModalView();
newRecord = Clipperz.PM.BookmarkletProcessor.createRecordFromBookmarkletConfiguration(this.mainComponent().user(), bookmarkletConfiguration);
} else {
var fieldsConfigurations;
newRecord = this.mainComponent().user().addNewRecord();
newRecord.setLabel(Clipperz.PM.Strings['recordTemplates'][selectedTemplateKey]['title']);
fieldsConfigurations = Clipperz.PM.Strings['recordTemplates'][selectedTemplateKey]['fields'];
MochiKit.Iter.forEach(fieldsConfigurations, MochiKit.Base.partial(function(aRecord, aFieldConfiguration) {
var newField;
newField = new Clipperz.PM.DataModel.RecordField({recordVersion:aRecord.currentVersion()});
newField.setLabel(aFieldConfiguration['label']);
newField.setType(aFieldConfiguration['type']);
aRecord.currentVersion().addField(newField);
}, newRecord));
}
this.mainComponent().exitWizard(newRecord, true);
},
//-------------------------------------------------------------------------
'exitWizard': function() {
//MochiKit.Logging.logDebug(">>> CreationWizard.exitWizard - " + this.previouslySelectedRecord());
this.mainComponent().exitWizard(this.previouslySelectedRecord());
//MochiKit.Logging.logDebug("<<< CreationWizard.exitWizard");
},
//-------------------------------------------------------------------------
'mainComponent': function() {
return this._mainComponent;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,174 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.RecordDetail) == 'undefined') { Clipperz.PM.Components.RecordDetail = {}; }
//#############################################################################
Clipperz.PM.Components.RecordDetail.DirectLoginBindingComponent = function(anElement, args) {
//MochiKit.Logging.logDebug(">>> new DirectLoginBindingComponent");
args = args || {};
Clipperz.PM.Components.RecordDetail.DirectLoginBindingComponent.superclass.constructor.call(this, anElement, args);
this._directLoginBinding = args.directLoginBinding || null;
this.render();
Clipperz.NotificationCenter.register(this.record(), 'addNewRecordField', this, 'syncAndUpdateEditMode');
Clipperz.NotificationCenter.register(this.record(), 'removedField', this, 'syncAndUpdateEditMode');
Clipperz.NotificationCenter.register(this.record(), 'updatedFieldLabel', this, 'syncAndUpdateEditMode');
//MochiKit.Logging.logDebug("<<< new DirectLoginBindingComponent");
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.RecordDetail.DirectLoginBindingComponent, Clipperz.PM.Components.RecordDetail.AbstractComponent, {
'toString': function() {
return "Clipperz.PM.Components.RecordDetail.DirectLoginBindingComponent component";
},
//-------------------------------------------------------------------------
'directLoginBinding': function() {
return this._directLoginBinding;
},
//-------------------------------------------------------------------------
'render': function() {
// Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'span', style:'font-weight:bold;', html:this.directLoginBinding().key()})
// Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'span', html:this.directLoginBinding().value()})
//MochiKit.Logging.logDebug(">>> DirectLoginBindingComponent.render");
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'td', cls:'directLoginBindingLabelTD', children:[
{tag:'span', html:this.directLoginBinding().key()}
]});
//MochiKit.Logging.logDebug("--- DirectLoginBindingComponent.render - 1");
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'td', cls:'directLoginBindingValueTD', children:[
{tag:'div', id:this.getId('editModeBox'), children:[
{tag:'select', id:this.getId('select'), children:this.recordFieldOptions()}
]},
{tag:'div', id:this.getId('viewModeBox'), children:[
{tag:'span', id:this.getId('viewValue'), html:""}
]}
]});
//MochiKit.Logging.logDebug("--- DirectLoginBindingComponent.render - 2");
this.getElement('editModeBox').setVisibilityMode(YAHOO.ext.Element.DISPLAY);
this.getElement('viewModeBox').setVisibilityMode(YAHOO.ext.Element.DISPLAY);
this.update();
//MochiKit.Logging.logDebug("<<< DirectLoginBindingComponent.render");
},
//-------------------------------------------------------------------------
'recordFieldOptions': function() {
var result;
var option;
var recordFieldKey;
var recordFields;
//MochiKit.Logging.logDebug(">>> DirectLoginBindingComponent.recordFieldOptions");
recordFields = this.directLoginBinding().directLogin().record().currentVersion().fields();
result = [];
option = {tag:'option', value:null, html:'---'};
result.push(option);
for (recordFieldKey in recordFields) {
// TODO: remove the value: field and replace it with element.dom.value = <some value>
option = {tag:'option', value:recordFieldKey, html:recordFields[recordFieldKey].label()}
if (recordFieldKey == this.directLoginBinding().fieldKey()) {
option['selected'] = true;
}
result.push(option);
}
//MochiKit.Logging.logDebug("<<< DirectLoginBindingComponent.recordFieldOptions");
return result;
},
//-------------------------------------------------------------------------
'syncAndUpdateEditMode': function() {
this.synchronizeComponentValues();
this.updateEditMode();
},
'updateEditMode': function() {
var selectElementBox;
//MochiKit.Logging.logDebug(">>> DirectLoginBindingComponent.updateEditMode");
this.getElement('viewModeBox').hide();
selectElementBox = this.getElement('editModeBox');
selectElementBox.update("");
Clipperz.YUI.DomHelper.append(selectElementBox.dom, {tag:'select', id:this.getId('select'), children:this.recordFieldOptions()});
/*
selectElement = this.getElement('select');
selectElement.update("");
MochiKit.Iter.forEach(this.recordFieldOptions(), function(anOption) {
Clipperz.YUI.DomHelper.append(selectElement.dom, anOption);
});
*/
this.getElement('editModeBox').show();
//MochiKit.Logging.logDebug("<<< DirectLoginBindingComponent.updateEditMode");
},
//-------------------------------------------------------------------------
'updateViewMode': function() {
//MochiKit.Logging.logDebug(">>> DirectLoginBindingComponent.updateViewMode");
this.getElement('editModeBox').hide();
this.getElement('viewModeBox').show();
this.getElement('viewValue').update(this.directLoginBinding().field().label());
//MochiKit.Logging.logDebug("<<< DirectLoginBindingComponent.updateViewMode");
},
//-------------------------------------------------------------------------
'synchronizeComponentValues': function() {
//MochiKit.Logging.logDebug(">>> DirectLoginBindingComponent.synchronizeComponentValues")
//MochiKit.Logging.logDebug("--- DirectLoginBindingComponent.synchronizeComponentValues - 1 - " + this.getId('select'));
this.directLoginBinding().setFieldKey(this.getDom('select').value);
//MochiKit.Logging.logDebug("<<< DirectLoginBindingComponent.synchronizeComponentValues");
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,362 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.RecordDetail) == 'undefined') { Clipperz.PM.Components.RecordDetail = {}; }
//#############################################################################
Clipperz.PM.Components.RecordDetail.DirectLoginComponent = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.RecordDetail.DirectLoginComponent.superclass.constructor.call(this, anElement, args);
this._directLogin = args.directLogin || null;
// this._titleElement = null;
this._structureElement = null;
this._removeButton = null;
this._directLoginBindingComponents = null;
this._collapser = null;
this.mainComponent().addEditComponent(this);
this.render();
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.RecordDetail.DirectLoginComponent, Clipperz.PM.Components.RecordDetail.AbstractComponent, {
'toString': function() {
return "Clipperz.PM.Components.RecordDetail.DirectLoginComponent component";
},
//-------------------------------------------------------------------------
'directLogin': function() {
return this._directLogin;
},
'directLoginBindingComponents': function() {
return this._directLoginBindingComponents;
},
//-------------------------------------------------------------------------
'removeDirectLogin': function() {
//MochiKit.Logging.logDebug(">>> DirectLoginComponent.removeDirectLogin");
this.mainComponent().synchronizeComponentValues();
this.directLogin().remove();
this.mainComponent().removeEditComponent(this);
this.mainComponent().render();
//MochiKit.Logging.logDebug("<<< DirectLoginComponent.removeDirectLogin");
},
//-------------------------------------------------------------------------
/*
'formDataValue': function() {
return Clipperz.Base.serializeJSON(this.directLogin().formData());
},
'setFormDataValue': function(aValue) {
},
*/
//-------------------------------------------------------------------------
'removeButton': function() {
return this._removeButton;
},
'setRemoveButton': function(aValue) {
this._removeButton = aValue;
},
//-------------------------------------------------------------------------
/*
'titleElement': function() {
return this._titleElement;
},
'setTitleElement': function(aValue) {
this._titleElement = aValue;
},
*/
//-------------------------------------------------------------------------
'structureElement': function() {
return this._structureElement;
},
'setStructureElement': function(aValue) {
this._structureElement = aValue;
},
//-------------------------------------------------------------------------
'render': function() {
//MochiKit.Logging.logDebug(">>> DirectLoginComponent.render");
try {
this.element().update("");
Clipperz.YUI.DomHelper.append(this.element().dom,
{tag:'li', children:[
{tag:'table', width:'100%', border:'0', cellpadding:'0', cellspacing:'0', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', rowspan:'2', width:'30', valign:'top', html:'&#160', children:[
{tag:'div', id:this.getId('removeDirectLogin'), children:[
{tag:'div', id:this.getId('removeDirectLoginButton')}
]},
{tag:'div', id:this.getId('collapseLink'), cls:'directLoginCollapseLink'}
]},
{tag:'td', valign:'top', children:[
{tag:'table', width:'100%', border:'0', cellpadding:'0', cellspacing:'0', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', width:'20', valign:'top', children:[
{tag:'a', href:'#', id:this.getId('directLogin'), children:[
{tag:'img', id:this.getId('faviconImage'), width:'16', height:'16', src:this.directLogin().fixedFavicon()}
]}
]},
{tag:'td', valign:'top', children:[
{tag:'div', cls:'directLoginDetailTitle', children:[
{tag:'div', id:this.getId('titleViewBox'), children:[
{tag:'a', href:'#', id:this.getId('titleLink')}
]},
{tag:'div', id:this.getId('titleEditBox'), children:[
{tag:'input', type:'text', id:this.getId('titleInput')}
]}
]}
]}
]}
]}
]}
]}
]},
{tag:'tr', children:[
{tag:'td', /*colspan:'2',*/ children:[
{tag:'div', id:this.getId('details'), children:[
{tag:'table', cls:'directLoginBindings', border:'0', cellpadding:'0', cellspacing:'0', children:[
{tag:'tbody', id:this.getId('tbodyBindings'), children:[]}
]}
]}
]}
]}
]}
]}
]}
);
MochiKit.Signal.connect(this.getId('faviconImage'), 'onload', this, 'handleLoadedFaviconImage');
MochiKit.Signal.connect(this.getId('faviconImage'), 'onerror', this.directLogin(), 'handleMissingFaviconImage');
MochiKit.Signal.connect(this.getId('faviconImage'), 'onabort', this.directLogin(), 'handleMissingFaviconImage');
this.getElement('removeDirectLogin').setVisibilityMode(YAHOO.ext.Element.DISPLAY);
//MochiKit.Logging.logDebug("--- DirectLoginComponent.render - 1");
this.getElement('collapseLink').addClassOnOver('hover');
this._collapser = new Clipperz.YUI.Collapser(this.getElement('collapseLink'), this.getElement('details'), true);
//MochiKit.Logging.logDebug("--- DirectLoginComponent.render - 2");
MochiKit.Signal.connect(this.getId('directLogin'), 'onclick', this, 'runDirectLogin');
// this.getElement('directLogin').on('click', this.runDirectLogin, this, false);
//MochiKit.Logging.logDebug("--- DirectLoginComponent.render - 3");
// this.setTitleElement(new Clipperz.PM.Components.TextFormField(this.getElement('title'), {
// editMode:this.editMode(),
// value:this.directLogin().label()
// }));
this.getElement('titleViewBox').setVisibilityMode(YAHOO.ext.Element.DISPLAY);
this.getElement('titleEditBox').setVisibilityMode(YAHOO.ext.Element.DISPLAY);
//- this.getElement('titleLink').on('click', this.runDirectLogin, this, false);
MochiKit.Signal.connect(this.getId('titleLink'), 'onclick', this, 'runDirectLogin');
//MochiKit.Logging.logDebug("--- DirectLoginComponent.render - 4");
//- this.setStructureElement(new Clipperz.PM.Components.TextFormField(this.getElement('formStructure'), {
//- editMode:this.editMode(),
//- value:this.formDataValue(), multiline:true
//- }));
//MochiKit.Logging.logDebug("--- DirectLoginComponent.render - 5");
{
var bindingKey;
var valueName;
var inputsRequiringAdditionalValues;
var bindingsElement;
var i,c;
//MochiKit.Logging.logDebug("--- DirectLoginComponent.render - 6");
this._directLoginBindingComponents = [];
//MochiKit.Logging.logDebug("--- DirectLoginComponent.render - 7");
bindingsElement = this.getElement('tbodyBindings');
//MochiKit.Logging.logDebug("--- DirectLoginComponent.render - 8");
for (bindingKey in this.directLogin().bindings()) {
try {
var directLoginBindingElement;
var directLoginBindingComponent;
//MochiKit.Logging.logDebug("--- DirectLoginComponent.render - 9");
directLoginBindingElement = Clipperz.YUI.DomHelper.append(bindingsElement.dom, {tag:'tr'}, true);
//MochiKit.Logging.logDebug("--- DirectLoginComponent.render - 10");
directLoginBindingComponent = new Clipperz.PM.Components.RecordDetail.DirectLoginBindingComponent(directLoginBindingElement, {
mainComponent:this,
directLoginBinding:this.directLogin().bindings()[bindingKey]
});
//MochiKit.Logging.logDebug("--- DirectLoginComponent.render - 11");
this._directLoginBindingComponents.push(directLoginBindingComponent);
} catch (e) {
MochiKit.Logging.logError("Error while rendering a DirectLoginBindingComponent - " + e);
}
//MochiKit.Logging.logDebug("--- DirectLoginComponent.render - 12");
}
//MochiKit.Logging.logDebug("--- DirectLoginComponent.render - 13");
inputsRequiringAdditionalValues = this.directLogin().inputsRequiringAdditionalValues();
//MochiKit.Logging.logDebug("--- DirectLoginComponent.render - 13.1");
for (valueName in inputsRequiringAdditionalValues) {
//- Clipperz.YUI.DomHelper.append(bindingsElement.dom, {tag:'tr', children:[
//- {tag:'td', html:valueName},
//- {tag:'td', children:inputsRequiringAdditionalValues[valueName].inputElementConfiguration()}
//- ]}, true)
var directLoginValueElement;
var directLoginValueComponent;
//MochiKit.Logging.logDebug("--- DirectLoginComponent.render - 13.2");
directLoginValueElement = Clipperz.YUI.DomHelper.append(bindingsElement.dom, {tag:'tr'}, true);
//MochiKit.Logging.logDebug("--- DirectLoginComponent.render - 13.3");
directLoginValueComponent = new Clipperz.PM.Components.RecordDetail.DirectLoginValueComponent(directLoginValueElement, {
mainComponent:this,
directLoginInputValue:inputsRequiringAdditionalValues[valueName]
});
//MochiKit.Logging.logDebug("--- DirectLoginComponent.render - 13.4");
this._directLoginBindingComponents.push(directLoginValueComponent);
//MochiKit.Logging.logDebug("--- DirectLoginComponent.render - 13.5");
}
//MochiKit.Logging.logDebug("--- DirectLoginComponent.render - 13.6");
}
//MochiKit.Logging.logDebug("--- DirectLoginComponent.render - 14");
this.setRemoveButton(new YAHOO.ext.Button(this.getDom('removeDirectLoginButton'), {text:Clipperz.PM.Strings['recordDetailDeleteDirectLoginButtonLabel'], handler:this.removeDirectLogin, scope:this}));
//MochiKit.Logging.logDebug("--- DirectLoginComponent.render - 15");
this.update();
} catch (e) {
MochiKit.Logging.logError("Error while rendering a DirectLoginComponent - " + e);
}
//MochiKit.Logging.logDebug("<<< DirectLoginComponent.render");
},
//-------------------------------------------------------------------------
'collapser': function() {
return this._collapser;
},
//-------------------------------------------------------------------------
'handleLoadedFaviconImage': function(anEvent) {
MochiKit.Signal.disconnectAll(anEvent.src())
},
//-------------------------------------------------------------------------
'update': function() {
var i,c;
var bindingComponents;
//MochiKit.Logging.logDebug(">>> DirectLoginComponent.update");
bindingComponents = this.directLoginBindingComponents();
c = bindingComponents.length;
for (i=0; i<c; i++) {
bindingComponents[i].update();
}
Clipperz.PM.Components.RecordDetail.DirectLoginComponent.superclass.update.call(this);
//MochiKit.Logging.logDebug("<<< DirectLoginComponent.update");
},
//-------------------------------------------------------------------------
'updateEditMode': function() {
// this.element().update("");
// Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'div', style:'border:4px solid red; padding:10px;', children:[
// {tag:'div', style:'font-weight:bold;', html:this.directLogin().label()},
// {tag:'div', style:'border:1px solid #aaaaaa;', html:Clipperz.Base.serializeJSON(this.directLogin().formData())},
// {tag:'div', style:'border:1px solid #aaaaaa;', html:Clipperz.Base.serializeJSON(this.directLogin().bindings())}
// ]});
this.getElement('titleEditBox').show();
this.getElement('titleViewBox').hide();
this.getDom('titleInput').value = this.directLogin().label();
//MochiKit.Logging.logDebug(">>> DirectLoginComponent.updateEditMode");
this.collapser().expand();
this.getElement('collapseLink').hide();
this.getElement('removeDirectLogin').show();
// this.removeButton().show();
//MochiKit.Logging.logDebug("<<< DirectLoginComponent.updateEditMode");
},
//-------------------------------------------------------------------------
'updateViewMode': function() {
//MochiKit.Logging.logDebug(">>> DirectLoginComponent.updateViewMode");
this.getElement('titleEditBox').hide();
this.getElement('titleViewBox').show();
this.getElement('titleLink').update(this.directLogin().label());
this.getElement('collapseLink').show();
this.getElement('removeDirectLogin').hide();
// this.removeButton().hide();
//MochiKit.Logging.logDebug("<<< DirectLoginComponent.updateViewMode");
},
//-------------------------------------------------------------------------
'synchronizeComponentValues': function() {
//MochiKit.Logging.logDebug(">>> DirectLoginComponent.syncronizeComponentValues");
this.directLogin().setLabel(this.getDom('titleInput').value);
// this.setFormDataValue(this.structureElement().value());
MochiKit.Iter.forEach(this.directLoginBindingComponents(), MochiKit.Base.methodcaller('synchronizeComponentValues'));
//MochiKit.Logging.logDebug("<<< DirectLoginComponent.syncronizeComponentValues");
},
//-------------------------------------------------------------------------
'runDirectLogin': function(anEvent) {
//MochiKit.Logging.logDebug("--- DirectLoginComponent.runDirectLogin - 1");
//MochiKit.Logging.logDebug("--- DirectLoginComponent.runDirectLogin - 1 anEvent: " + anEvent);
anEvent.stop();
//MochiKit.Logging.logDebug("--- DirectLoginComponent.runDirectLogin - 2");
this.directLogin().runDirectLogin();
//MochiKit.Logging.logDebug("--- DirectLoginComponent.runDirectLogin - 3");
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,257 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.RecordDetail) == 'undefined') { Clipperz.PM.Components.RecordDetail = {}; }
//#############################################################################
Clipperz.PM.Components.RecordDetail.DirectLoginValueComponent = function(anElement, args) {
//MochiKit.Logging.logDebug(">>> new DirectLoginValueComponent");
args = args || {};
Clipperz.PM.Components.RecordDetail.DirectLoginValueComponent.superclass.constructor.call(this, anElement, args);
this._directLoginInputValue = args.directLoginInputValue || null;
this._value = this.directLoginInputValue().directLogin().formValues()[this.directLoginInputValue().name()];
this.render();
//MochiKit.Logging.logDebug("<<< new DirectLoginValueComponent - record: " + this.record());
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.RecordDetail.DirectLoginValueComponent, Clipperz.PM.Components.RecordDetail.AbstractComponent, {
'toString': function() {
return "Clipperz.PM.Components.RecordDetail.DirectLoginValueComponent component - " + this.directLoginInputValue().name();
},
//-------------------------------------------------------------------------
'directLoginInputValue': function() {
return this._directLoginInputValue;
},
//-------------------------------------------------------------------------
'render': function() {
//MochiKit.Logging.logDebug(">>> DirectLoginValueComponent.render");
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'td', cls:'directLoginDataLabelTD', children:[
{tag:'span', html:this.directLoginInputValue().name()}
]});
//MochiKit.Logging.logDebug("--- DirectLoginValueComponent.render - 1");
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'td', cls:'directLoginDataValueTD', children:[
{tag:'span', id:this.getId('inputElement')}
]});
//MochiKit.Logging.logDebug("--- DirectLoginValueComponent.render - 2");
this.update();
//MochiKit.Logging.logDebug("<<< DirectLoginValueComponent.render");
},
//-------------------------------------------------------------------------
'inputElementConfiguration': function() {
var result;
var currentValue;
//MochiKit.Logging.logDebug(">>> DirectLoginValueComponent.inputElementConfiguration - " + this.directLoginInputValue().name());
result = [];
currentValue = this.value();
switch (this.directLoginInputValue().type()) {
case 'checkbox':
var checkbox;
//{"type":"checkbox", "name":"rememberUsernameChk", "value":"checkbox"}
checkbox = {tag:'input', id:this.getId('checkbox'), type:'checkbox'}
if (currentValue == true) {
checkbox.checked = true;
}
result.push(checkbox);
break;
case 'select':
var input;
//{"type":"select", "name":"DOMAIN", "options":[{"selected":true, "label":"@tin.it", "value":"tin.it"}, {"selected":false, "label":"@virgilio.it", "value":"virgilio.it"}]}
input = {tag:'select', id:this.getId('select'), name:this.directLoginInputValue().name(), children:[]};
input.children.push({tag:'option', value:null, html:"---"});
MochiKit.Iter.forEach(this.directLoginInputValue().args()['options'], function(anOption) {
var option;
// TODO: remove the value: field and replace it with element.dom.value = <some value>
option = {tag:'option', value:anOption['value'], html:anOption['label']}
if (currentValue == anOption['value']) {
option.selected = true;
}
input.children.push(option);
})
result.push(input);
break;
case 'radio':
var name;
var radioBox;
//MochiKit.Logging.logDebug("--- DirectLoginValueComponent.inputElementConfiguration - 3");
name = this.getId(this.directLoginInputValue().name());
radioBox = {tag:'div', id:this.getId('radioBox'), children:[]};
result.push(radioBox);
//MochiKit.Logging.logDebug("--- DirectLoginValueComponent.inputElementConfiguration - 3.1 - options.length: " + this.directLoginInputValue().args()['options'].length);
//{"name":"dominio", "type":"radio", "options":[{"value":"@alice.it", "checked":true}, {"value":"@tin.it", "checked":false}, {"value":"@virgilio.it", "checked":false}, {"value":"@tim.it", "checked":false}]}
MochiKit.Iter.forEach(this.directLoginInputValue().args()['options'], function(anOption) {
var radio;
//MochiKit.Logging.logDebug("--- DirectLoginValueComponent.inputElementConfiguration - 3.1.1");
// TODO: remove the value: field and replace it with element.dom.value = <some value>
radio = {tag:'input', type:'radio', name:name, value:anOption['value']};
//MochiKit.Logging.logDebug("--- DirectLoginValueComponent.inputElementConfiguration - 3.1.2");
if (currentValue == anOption['value']) {
//MochiKit.Logging.logDebug("--- DirectLoginValueComponent.inputElementConfiguration - 3.1.3");
radio.checked = true;
//MochiKit.Logging.logDebug("--- DirectLoginValueComponent.inputElementConfiguration - 3.1.4");
}
//MochiKit.Logging.logDebug("--- DirectLoginValueComponent.inputElementConfiguration - 3.1.5");
radioBox.children.push({tag:'div', children:[ radio, {tag:'span', html:anOption['value']} ]})
//MochiKit.Logging.logDebug("--- DirectLoginValueComponent.inputElementConfiguration - 3.1.6");
})
//MochiKit.Logging.logDebug("--- DirectLoginValueComponent.inputElementConfiguration - 3.2");
break;
}
//MochiKit.Logging.logDebug("<<< DirectLoginValueComponent.inputElementConfiguration");
return result;
},
//-------------------------------------------------------------------------
'inputValue': function() {
var result;
switch (this.directLoginInputValue().type()) {
case 'checkbox':
result = this.getDom('checkbox').checked;
break;
case 'select':
result = this.getDom('select').value;
break;
case 'radio':
var checkedRadioButtons;
checkedRadioButtons = MochiKit.Base.filter( function(aRadioButton) { return aRadioButton.dom.checked },
this.getElement('radioBox').getChildrenByTagName('input'));
if (checkedRadioButtons.length == 0) {
result = null;
} else {
result = checkedRadioButtons[0].dom.value;
}
break;
}
return result;
},
//-------------------------------------------------------------------------
'value': function() {
return this._value;
},
'setValue': function(aValue) {
this._value = aValue;
},
//-------------------------------------------------------------------------
'updateEditMode': function() {
//MochiKit.Logging.logDebug(">>> DirectLoginValueComponent.updateEditMode - " + this);
this.getElement('inputElement').update("");
//MochiKit.Logging.logDebug("--- DirectLoginValueComponent.updateEditMode - 1");
Clipperz.YUI.DomHelper.append(this.getDom('inputElement'), {tag:'div', children:this.inputElementConfiguration()});
//MochiKit.Logging.logDebug("<<< DirectLoginValueComponent.updateEditMode");
},
//-------------------------------------------------------------------------
'updateViewMode': function() {
//MochiKit.Logging.logDebug(">>> DirectLoginValueComponent.updateViewMode");
// this.getElement('inputElement').update(this.directLoginInputValue().value());
this.getElement('inputElement').update("");
switch (this.directLoginInputValue().type()) {
case 'checkbox':
if (this.value() == true) {
this.getElement('inputElement').update(Clipperz.PM.Strings['directLoginConfigurationCheckBoxFieldSelectedValue']);
} else {
this.getElement('inputElement').update(Clipperz.PM.Strings['directLoginConfigurationCheckBoxFieldNotSelectedValue'])
}
break;
case 'select':
var displayedValue;
var selectedOptions;
var currentValue;
currentValue = this.value();
selectedOptions = MochiKit.Base.filter( function(anOption) { return (anOption['value'] == currentValue); },
this.directLoginInputValue().args()['options']);
if (selectedOptions.length == 0) {
displayedValue = "---";
} else {
//MochiKit.Logging.logDebug("+++ " + Clipperz.Base.serializeJSON(selectedOptions));
//MochiKit.Logging.logDebug("*** " + Clipperz.Base.serializeJSON(selectedOptions[0]));
displayedValue = selectedOptions[0]['label'];
}
this.getElement('inputElement').update(displayedValue);
break;
case 'radio':
this.getElement('inputElement').update(this.value());
break;
}
//MochiKit.Logging.logDebug("<<< DirectLoginValueComponent.updateViewMode");
},
//-------------------------------------------------------------------------
'synchronizeComponentValues': function() {
//MochiKit.Logging.logDebug(">>> DirectLoginValueComponent.synchronizeComponentValues");
//MochiKit.Logging.logDebug("--- DirectLoginValueComponent.synchronizeComponentValues - 1; value: " + this.inputValue());
this.setValue(this.inputValue());
this.directLoginInputValue().directLogin().formValues()[this.directLoginInputValue().name()] = this.value();
//MochiKit.Logging.logDebug("<<< DirectLoginValueComponent.synchronizeComponentValues");
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,199 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.RecordDetail) == 'undefined') { Clipperz.PM.Components.RecordDetail = {}; }
//#############################################################################
Clipperz.PM.Components.RecordDetail.DirectLoginsComponent = function(anElement, args) {
//MochiKit.Logging.logDebug(">>> new Clipperz.PM.Components.RecordDetail.DirectLoginsComponent");
args = args || {};
//MochiKit.Logging.logDebug("--- new Clipperz.PM.Components.RecordDetail.DirectLoginsComponent - 0");
Clipperz.PM.Components.RecordDetail.DirectLoginsComponent.superclass.constructor.call(this, anElement, args);
//MochiKit.Logging.logDebug("--- new Clipperz.PM.Components.RecordDetail.DirectLoginsComponent - 1");
this._addDirectLoginButton = null;
//MochiKit.Logging.logDebug("--- new Clipperz.PM.Components.RecordDetail.DirectLoginsComponent - 2");
this.mainComponent().addEditComponent(this);
//MochiKit.Logging.logDebug("--- new Clipperz.PM.Components.RecordDetail.DirectLoginsComponent - 3");
this.render();
//MochiKit.Logging.logDebug("<<< new Clipperz.PM.Components.RecordDetail.DirectLoginsComponent");
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.RecordDetail.DirectLoginsComponent, Clipperz.PM.Components.RecordDetail.AbstractComponent, {
'toString': function() {
return "Clipperz.PM.Components.RecordDetail.DirectLoginsComponent component";
},
//-------------------------------------------------------------------------
'addDirectLoginButton': function() {
return this._addDirectLoginButton;
},
'setAddDirectLoginButton': function(aValue) {
this._addDirectLoginButton = aValue;
},
//-------------------------------------------------------------------------
'render': function() {
this.element().update("");
Clipperz.YUI.DomHelper.append(this.element().dom,
{tag:'div', cls:'directLoginsRecordBox', children:[
{tag:'h3', htmlString:Clipperz.PM.Strings['recordDetailDirectLoginBlockTitle']},
{tag:'ul', id:this.getId('directLogins')},
{tag:'div', cls:'addDirectLoginBox', id:this.getId('addDirectLogin'), children:[
{tag:'div', cls:'addDirectLoginBoxContent', children:[
{tag:'div', cls:'bookmarkletConfiguration', children:[
// {tag:'span', htmlString:Clipperz.PM.Strings['newRecordWizardBookmarkletConfigurationLabel']},
{tag:'div', htmlString:Clipperz.PM.Strings['recordDetailNewDirectLoginDescription']},
{tag:'textarea', id:this.getId('addDirectLoginTextarea')}
]},
{tag:'div', id:this.getId('addDirectLoginButton')}
]}
]}
]}
);
if (MochiKit.Base.keys(this.record().directLogins()).length == 0) {
//MochiKit.Logging.logDebug("--- DirectLoginsComponent.render - 3");
Clipperz.YUI.DomHelper.append(this.getElement('directLogins'),
{tag:'li', children:[
// {tag:'span', htmlString:Clipperz.PM.Strings['recordDetailDirectLoginBlockNoDirectLoginConfiguredLabel']}
{tag:'div', cls:'recordDetailNoDirectLoginDescriptionBox', htmlString:Clipperz.PM.Strings['recordDetailDirectLoginBlockNoDirectLoginConfiguredDescription']}
]}
);
//MochiKit.Logging.logDebug("--- DirectLoginsComponent.render - 4");
} else {
//MochiKit.Logging.logDebug("--- DirectLoginsComponent.render - 5");
for (directLoginReference in this.record().directLogins()) {
//MochiKit.Logging.logDebug("--- DirectLoginsComponent.render - 6");
this.addDirectLogin(this.record().directLogins()[directLoginReference]);
//MochiKit.Logging.logDebug("--- DirectLoginsComponent.render - 7");
}
//MochiKit.Logging.logDebug("--- DirectLoginsComponent.render - 8");
}
//MochiKit.Logging.logDebug("--- DirectLoginsComponent.render - 9");
this.setAddDirectLoginButton(new YAHOO.ext.Button(this.getDom('addDirectLoginButton'), {
text:Clipperz.PM.Strings['recordDetailAddNewDirectLoginButtonLabel'],
handler:this.addNewDirectLogin,
scope:this
}));
MochiKit.Signal.connect(this.getId('addDirectLoginTextarea'), 'onkeydown', this, 'onkeydown');
//MochiKit.Logging.logDebug("--- DirectLoginsComponent.render - 11");
this.update();
//MochiKit.Logging.logDebug("<<< DirectLoginsComponent.render");
},
//-------------------------------------------------------------------------
'addDirectLogin': function(aDirectLogin) {
//MochiKit.Logging.logDebug(">>> DirectLoginsComponent.addDirectLogin");
new Clipperz.PM.Components.RecordDetail.DirectLoginComponent(
Clipperz.YUI.DomHelper.append(this.getDom('directLogins'), {tag:'div'}, true),
{
mainComponent:this.mainComponent(),
directLogin:aDirectLogin
}
);
//MochiKit.Logging.logDebug("<<< DirectLoginsComponent.addDirectLogin");
},
//-------------------------------------------------------------------------
'addNewDirectLogin': function() {
var newDirectLogin;
var configuration;
//MochiKit.Logging.logDebug(">>> DirectLoginsComponent.addNewDirectLogin");
if (MochiKit.Base.keys(this.record().directLogins()).length == 0) {
this.getElement('directLogins').update("");
}
this.mainComponent().synchronizeComponentValues();
this.mainComponent().exitModalView();
configuration = Clipperz.PM.BookmarkletProcessor.checkBookmarkletConfiguration(
this.getDom('addDirectLoginTextarea').value,
this.getDom('addDirectLoginButton'),
MochiKit.Base.method(this.mainComponent(), 'enterModalView')
);
this.mainComponent().enterModalView();
newDirectLogin = new Clipperz.PM.DataModel.DirectLogin({record:this.record(),
label:configuration['page']['title'],
bookmarkletVersion:'0.2',
// bookmarkletVersion:configuration['version'],
formData:configuration['form']});
this.record().addDirectLogin(newDirectLogin);
this.addDirectLogin(newDirectLogin);
this.getDom('addDirectLoginTextarea').value = "";
//MochiKit.Logging.logDebug("<<< DirectLoginsComponent.addNewDirectLogin");
},
//-------------------------------------------------------------------------
'updateViewMode': function() {
this.getElement('addDirectLogin').setVisibilityMode(YAHOO.ext.Element.DISPLAY);
this.getElement('addDirectLogin').hide();
},
//-------------------------------------------------------------------------
'updateEditMode': function() {
this.getElement('addDirectLogin').show();
},
//-------------------------------------------------------------------------
'onkeydown': function(anEvent) {
//MochiKit.Logging.logDebug(">>> onkeydown - " + anEvent.src().id + ": " + anEvent.key().code);
if (anEvent.key().code == 13) {
this.addNewDirectLogin();
}
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,117 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.RecordDetail) == 'undefined') { Clipperz.PM.Components.RecordDetail = {}; }
//#############################################################################
Clipperz.PM.Components.RecordDetail.FieldButtonComponent = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.RecordDetail.FieldButtonComponent.superclass.constructor.call(this, anElement, args);
this._button = null;
this.render();
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.RecordDetail.FieldButtonComponent, Clipperz.PM.Components.RecordDetail.AbstractFieldSubComponent, {
'toString': function() {
return "Clipperz.PM.Components.RecordDetail.FieldButtonComponent";
},
//-------------------------------------------------------------------------
'buttonText': function() {
var result;
if (this.recordField() == null) {
// TODO: this is never used. It is just an obsolete legacy chunk of code
result = Clipperz.PM.Strings['recordDetailAddFieldButtonLabel'];
} else {
result = Clipperz.PM.Strings['recordDetailRemoveFieldButtonLabel'];
}
return result;
},
//-------------------------------------------------------------------------
'button': function() {
return this._button;
},
'setButton': function(aValue) {
this._button = aValue;
},
//-------------------------------------------------------------------------
'render': function() {
this.element().update("");
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'div', id:this.getId('button')})
this.setButton(new YAHOO.ext.Button(this.getDom('button'), {text:this.buttonText(), handler:this.handleButtonClick, scope:this}));
this.update();
},
//-------------------------------------------------------------------------
'handleButtonClick': function() {
if (this.recordField() == null) {
this.mainComponent().addNewField();
} else {
this.mainComponent().removeField(this.fieldComponent());
}
},
//-------------------------------------------------------------------------
'updateEditMode': function() {
this.button().show();
},
//-------------------------------------------------------------------------
'updateViewMode': function() {
this.button().hide();
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,189 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.RecordDetail) == 'undefined') { Clipperz.PM.Components.RecordDetail = {}; }
//#############################################################################
Clipperz.PM.Components.RecordDetail.FieldComponent = function(anElement, args) {
//MochiKit.Logging.logDebug(">>> new FieldComponent");
args = args || {};
Clipperz.PM.Components.RecordDetail.FieldComponent.superclass.constructor.call(this, anElement, args);
this._element = anElement;
this._recordField = args.recordField || null;
this._buttonComponent = null;
this._labelComponent = null;
this._dragHandler = null;
this._valueComponent = null;
this._typeComponent = null;
this.mainComponent().addEditComponent(this);
this.render();
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.RecordDetail.FieldComponent, Clipperz.PM.Components.RecordDetail.AbstractComponent, {
'toString': function() {
return "Clipperz.PM.Components.RecordDetail.FieldComponent component";
},
//-------------------------------------------------------------------------
'recordField': function() {
return this._recordField;
},
//-------------------------------------------------------------------------
'buttonComponent': function() {
return this._buttonComponent;
},
'setButtonComponent': function(aValue) {
this._buttonComponent = aValue;
},
//-------------------------------------------------------------------------
'labelComponent': function() {
return this._labelComponent;
},
'setLabelComponent': function(aValue) {
this._labelComponent = aValue;
},
//-------------------------------------------------------------------------
'dragHandler': function() {
return this._dragHandler;
},
'setDragHandler': function(aValue) {
this._dragHandler = aValue;
},
//-------------------------------------------------------------------------
'valueComponent': function() {
return this._valueComponent;
},
'setValueComponent': function(aValue) {
this._valueComponent = aValue;
},
//-------------------------------------------------------------------------
'typeComponent': function() {
return this._typeComponent;
},
'setTypeComponent': function(aValue) {
this._typeComponent = aValue;
},
//-------------------------------------------------------------------------
'render': function() {
//MochiKit.Logging.logDebug(">>> RecordDetail.FieldComponent.render");
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'td',/* width:'32',*/ height:'24', cls:'removeFieldButton', align:'left', valign:'top', id:this.getId('button')});
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'td',/* width:'25%',*/ valign:'top', id:this.getId('label')});
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'td',/* width:'3',*/ valign:'top', id:this.getId('dragHandler')});
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'td',/* width:'50%',*/ valign:'top', children:[
{tag:'div', cls:'Clipperz_recordFieldData', id:this.getId('value')}
]});
this.setButtonComponent(new Clipperz.PM.Components.RecordDetail.FieldButtonComponent(this.getElement('button'), {fieldComponent:this}));
this.setLabelComponent(new Clipperz.PM.Components.RecordDetail.FieldLabelComponent(this.getElement('label'), {fieldComponent:this}));
this.setDragHandler(new Clipperz.PM.Components.RecordDetail.FieldDragHandler(this.getElement('dragHandler'), {fieldComponent:this}));
this.setValueComponent(new Clipperz.PM.Components.RecordDetail.FieldValueComponent(this.getElement('value'), {fieldComponent:this}));
if (this.editMode() == 'EDIT') {
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'td',/* width:'60',*/ align:'left', cls:'fieldTypeTD', valign:'top', id:this.getId('type')});
this.setTypeComponent(new Clipperz.PM.Components.RecordDetail.FieldTypeComponent(this.getElement('type'), {fieldComponent:this}));
}
this.update();
//MochiKit.Logging.logDebug("<<< RecordDetail.FieldComponent.render");
},
//-------------------------------------------------------------------------
'handleButtonClick': function() {
this.mainComponent().record().removeField(this.recordField());
// if (this.recordField() == null) {
// this.mainComponent().record().addNewField();
// } else {
// this.mainComponent().record().removeField(this.recordField());
// }
},
//-------------------------------------------------------------------------
'update': function(anEvent) {
//MochiKit.Logging.logDebug(">>> RecordDetail.FieldComponent.update");
this.buttonComponent().update();
this.labelComponent().update();
this.dragHandler().update();
this.valueComponent().update();
if (this.editMode() == 'EDIT') {
this.typeComponent().update();
}
//MochiKit.Logging.logDebug("<<< RecordDetail.FieldComponent.update");
},
//-------------------------------------------------------------------------
'synchronizeComponentValues': function() {
//MochiKit.Logging.logDebug(">>> FieldComponent.synchronizeComponentValues");
this.labelComponent().synchronizeComponentValues();
this.valueComponent().synchronizeComponentValues();
if (this.editMode() == 'EDIT') {
this.typeComponent().synchronizeComponentValues();
}
//MochiKit.Logging.logDebug("<<< FieldComponent.synchronizeComponentValues");
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,59 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.RecordDetail) == 'undefined') { Clipperz.PM.Components.RecordDetail = {}; }
//#############################################################################
Clipperz.PM.Components.RecordDetail.FieldDragHandler = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.RecordDetail.FieldDragHandler.superclass.constructor.call(this, anElement, args);
this._element = anElement;
this.render();
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.RecordDetail.FieldDragHandler, Clipperz.PM.Components.RecordDetail.AbstractFieldSubComponent, {
'toString': function() {
return "Clipperz.PM.Components.RecordDetail.FieldDragHandler component";
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,141 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.RecordDetail) == 'undefined') { Clipperz.PM.Components.RecordDetail = {}; }
//#############################################################################
Clipperz.PM.Components.RecordDetail.FieldLabelComponent = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.RecordDetail.FieldLabelComponent.superclass.constructor.call(this, anElement, args);
this._inputElement = null;
this.render();
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.RecordDetail.FieldLabelComponent, Clipperz.PM.Components.RecordDetail.AbstractFieldSubComponent, {
'toString': function() {
return "Clipperz.PM.Components.RecordDetail.FieldLabelComponent component";
},
//-------------------------------------------------------------------------
'value': function() {
return this.recordField().label();
},
//-------------------------------------------------------------------------
'inputElement': function() {
return this._inputElement;
},
'setInputElement': function(aValue) {
this._inputElement = aValue;
},
//-------------------------------------------------------------------------
'render': function() {
var newTextFormField;
this.element().update("");
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'div', cls:'Clipperz_recordFieldLabel', id:this.getId('label')});
// Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'div', style:'font-size:8pt;', html:this.recordField().key()});
// this.setInputElement(new Clipperz.PM.Components.TextFormField(this.getElement('label'), {editMode:this.editMode(), value:this.value()}));
newTextFormField = new Clipperz.PM.Components.TextFormField(this.getElement('label'), {editMode:this.editMode(), value:this.value()});
// newTextFormField.inputElement().setStyle({border:'3px solid cyan;'});
newTextFormField.on('change', this.notifyChanges, this, true)
// this.inputElement().on('change', function() {alert("CHANGE");});
// this.inputElement().getElement('editComponent_input').on('change', function() {alert("CHANGE");})
// this.inputElement().on('blur', this.notifyChanges, this, true);
this.setInputElement(newTextFormField);
this.update();
},
'notifyChanges': function() {
//MochiKit.Logging.logDebug(">>> FieldLabelComponent.notifyChanges - " + this);
this.synchronizeComponentValues();
Clipperz.NotificationCenter.notify(this.recordField().recordVersion().record(), 'updatedFieldLabel');
//MochiKit.Logging.logDebug("<<< FieldLabelComponent.notifyChanges");
},
//-------------------------------------------------------------------------
'update': function() {
//MochiKit.Logging.logDebug(">>> FieldLabelComponent.update");
this.inputElement().update({editMode:this.editMode(), value:this.value()});
//MochiKit.Logging.logDebug("<<< FieldLabelComponent.update");
},
//-------------------------------------------------------------------------
/*
'updateViewMode': function() {
var width;
var element;
this.element().update("");
width = this.element().getWidth();
element = Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'div', html:this.value()}, true);
element.setWidth(width-1);
},
//-------------------------------------------------------------------------
'updateEditMode': function() {
var width;
this.element().update("");
width = this.element().getWidth(true);
this.setInputElement(Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'input', type:'text', value:this.value()}, true));
this.inputElement().setWidth(width-1);
},
*/
//-------------------------------------------------------------------------
'synchronizeComponentValues': function() {
if (this.inputElement() != null) {
this.recordField().setLabel(this.inputElement().value());
}
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,157 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.RecordDetail) == 'undefined') { Clipperz.PM.Components.RecordDetail = {}; }
//#############################################################################
Clipperz.PM.Components.RecordDetail.FieldTypeComponent = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.RecordDetail.FieldTypeComponent.superclass.constructor.call(this, anElement, args);
this._inputElement = null;
this.render();
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.RecordDetail.FieldTypeComponent, Clipperz.PM.Components.RecordDetail.AbstractFieldSubComponent, {
'toString': function() {
return "Clipperz.PM.Components.RecordDetail.FieldTypeComponent component";
},
//-------------------------------------------------------------------------
'inputElement': function() {
return this._inputElement;
},
'setInputElement': function(aValue) {
this._inputElement = aValue;
},
//-------------------------------------------------------------------------
'value': function() {
return this.recordField().type();
},
'canChangeType': function() {
var value;
var result;
value = this.value();
result = ((value == 'TXT') || (value == 'PWD') || (value == 'URL') || (value == 'DATE') || (value == 'ADDR'));
return result
},
//-------------------------------------------------------------------------
'updateViewMode': function() {
this.element().update("");
if (this.canChangeType()) {
var width;
var element;
width = this.element().getWidth(true);
element = Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'div', html:this.recordField().typeShortDescription()}, true);
element.setWidth(width-1);
}
},
//-------------------------------------------------------------------------
'updateEditMode': function() {
this.element().update("");
if (this.canChangeType()) {
var width;
width = this.element().getWidth(true);
this.setInputElement(Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'select', children:[
{tag:'option', value:'TXT', htmlString:Clipperz.PM.Strings['recordFieldTypologies']['TXT']['shortDescription']},
{tag:'option', value:'PWD', htmlString:Clipperz.PM.Strings['recordFieldTypologies']['PWD']['shortDescription']},
{tag:'option', value:'URL', htmlString:Clipperz.PM.Strings['recordFieldTypologies']['URL']['shortDescription']},
{tag:'option', value:'DATE', htmlString:Clipperz.PM.Strings['recordFieldTypologies']['DATE']['shortDescription']},
{tag:'option', value:'ADDR', htmlString:Clipperz.PM.Strings['recordFieldTypologies']['ADDR']['shortDescription']}
// {tag:'option', value:'CHECK', html:Clipperz.PM.DataModel.RecordField.TypeDescriptions['CHECK']['shortDescription']},
// {tag:'option', value:'RADIO', html:Clipperz.PM.DataModel.RecordField.TypeDescriptions['RADIO']['shortDescription']},
// {tag:'option', value:'CHECK', html:Clipperz.PM.DataModel.RecordField.TypeDescriptions['SELECT']['shortDescription']}
// {tag:'option', value:'NOTE', html:Clipperz.PM.DataModel.RecordField.TypeDescriptions['NOTE']['shortDescription']}
]}, true));
this.inputElement().setWidth(width-1);
this.inputElement().addHandler('change', true, this.onChange, this, true);
// this.selectCorrectOption();
Clipperz.DOM.selectOptionMatchingValue(this.inputElement().dom, this.value());
}
},
//-------------------------------------------------------------------------
'onChange': function() {
this.synchronizeComponentValues();
this.fieldComponent().valueComponent().handleTypeChange();
},
//-------------------------------------------------------------------------
/*
'selectCorrectOption': function() {
var options;
var i,c;
options = this.inputElement().getChildrenByTagName('option');
c = options.length;
for (i=0; i<c; i++) {
if (options[i].dom.value == this.value()) {
options[i].dom.selected = true;
}
}
},
*/
//-------------------------------------------------------------------------
'synchronizeComponentValues': function() {
if (this.inputElement() != null) {
this.recordField().setType(this.inputElement().dom.value);
}
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,275 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.RecordDetail) == 'undefined') { Clipperz.PM.Components.RecordDetail = {}; }
//#############################################################################
Clipperz.PM.Components.RecordDetail.FieldValueComponent = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.RecordDetail.FieldValueComponent.superclass.constructor.call(this, anElement, args);
this._inputElement = null;
this._scrambledStatus = 'SCRAMBLED'; // 'UNSCRAMBLED'
this.render();
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.RecordDetail.FieldValueComponent, Clipperz.PM.Components.RecordDetail.AbstractFieldSubComponent, {
'toString': function() {
return "Clipperz.PM.Components.RecordDetail.FieldValueComponent component";
},
//-------------------------------------------------------------------------
'value': function() {
return this.recordField().value();
},
'setValue': function(aValue) {
this.recordField().setValue(aValue);
},
//-------------------------------------------------------------------------
'inputElement': function() {
return this._inputElement;
},
'setInputElement': function(aValue) {
this._inputElement = aValue;
},
//-------------------------------------------------------------------------
'scrambledStatus': function() {
return this._scrambledStatus;
},
'setScrambledStatus': function(aValue) {
this._scrambledStatus = aValue;
},
//-------------------------------------------------------------------------
'handleTypeChange': function() {
//MochiKit.Logging.logDebug(">>> handling type change - " + this.recordField().type());
this.synchronizeComponentValues();
this.update();
},
//-------------------------------------------------------------------------
'addrUrl': function() {
var result;
result = "http://maps.google.com/maps?q=" + this.value().split(' ').join('+');
return result;
},
//-------------------------------------------------------------------------
'updateViewMode': function() {
var scarmbledStatus;
scrambledStatus = this.scrambledStatus() || 'SCRAMBLED';
this.element().update("");
if (this.recordField().hidden() == false) {
switch(this.recordField().type()) {
case 'TXT':
case 'PWD':
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'span', html:this.value()});
break;
case 'URL':
var urlLocation;
urlLocation = Clipperz.Base.sanitizeString(this.value());
if (! (/^(https?|ftp|svn):\/\//.test(urlLocation))) {
urlLocation = 'http://' + urlLocation;
}
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'a', href:urlLocation, html:this.value(), target:'_blank'});
break;
case 'DATE':
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'span', html:this.value()});
break;
case 'ADDR':
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'a', href:this.addrUrl(), html:this.value(), target:'_blank'});
break;
}
} else {
var tableElement;
var tdElement;
var inputElement;
var passwordElementConfiguration;
if (scrambledStatus == 'SCRAMBLED') {
var scrambledInputElement;
if ((Clipperz_IEisBroken === true) && (Clipperz.PM.Proxy.defaultProxy.isReadOnly())) {
scrambledInputElement = {tag:'input', type:'password', value:"this.value()"};
} else {
scrambledInputElement = {tag:'input', type:'text', cls:'scrambledField', title:Clipperz.PM.Strings['recordDetailPasswordFieldTooltipLabel'], value:"this.value()"};
}
passwordElementConfiguration =
{tag:'table', border:'0', cellspacing:'2', cellpadding:'0', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', valign:'top', children:[
scrambledInputElement,
{tag:'a', cls:'scrambleLink', id:this.getId('scrambleLink'), href:'#', htmlString:Clipperz.PM.Strings['recordDetailPasswordFieldUnscrambleLabel']}
]},
{tag:'td', valign:'top', children:[
{tag:'span', cls:'scrambledFieldLabel', htmlString:Clipperz.PM.Strings['recordDetailPasswordFieldHelpLabel']}
]}
]}
]}
]};
} else {
passwordElementConfiguration =
{tag:'div', children:[
{tag:'input', type:'text', cls:'unscrambledField', value:"this.value()"},
{tag:'a', cls:'scrambleLink', id:this.getId('scrambleLink'), href:'#', htmlString:Clipperz.PM.Strings['recordDetailPasswordFieldScrambleLabel']}
]};
}
tableElement = Clipperz.YUI.DomHelper.append(this.element().dom, passwordElementConfiguration, true);
inputElement = tableElement.getChildrenByTagName('input')[0];
inputElement.dom.value = this.value();
inputElement.wrap({tag:'div', cls:'passwordBackground'}).setStyle('background-position', "0px -" + Math.min(128, Clipperz.PM.Crypto.passwordEntropy(this.value())) + "px");
MochiKit.Signal.connect(inputElement.dom, 'onfocus', this, 'selectHiddenFieldOnFocus');
MochiKit.Signal.connect(this.getDom('scrambleLink'), 'onclick', this, 'toggleScramble');
}
},
//-------------------------------------------------------------------------
'updateEditMode': function() {
var inputElement;
var scarmbledStatus;
scrambledStatus = this.scrambledStatus() || 'SCRAMBLED';
this.element().update("");
switch(this.recordField().type()) {
case 'TXT':
case 'URL':
case 'ADDR':
inputElement = Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'input', type:'text', value:"this.value()"}, true);
inputElement.dom.value = this.value();
break;
case 'PWD':
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'table', width:'100%', cellpadding:'0', cellspacing:'0', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', valign:'top', children:[
{tag:'input', type:((scrambledStatus == 'SCRAMBLED') ? 'password' : 'text'), id:this.getId('passwordInputElement'), value:"this.value()"},
{tag:'a', cls:'scrambleLink', id:this.getId('scrambleLink'), href:'#', html:(scrambledStatus == 'SCRAMBLED' ? Clipperz.PM.Strings['recordDetailPasswordFieldUnscrambleLabel'] : Clipperz.PM.Strings['recordDetailPasswordFieldScrambleLabel'])}
]},
{tag:'td', valign:'top', children:[
{tag:'div', id:this.getId('passwordGenerator'), cls:'Clipperz_PasswordGenerator_button', html:'&nbsp;'}
]}
]}
]}
]})
inputElement = this.getElement('passwordInputElement');
inputElement.dom.value = this.value();
new Clipperz.PM.Components.PasswordEntropyDisplay(this.getElement('passwordInputElement'));
new Clipperz.PM.Components.PasswordGenerator(this.getElement('passwordGenerator'), this);
MochiKit.Signal.connect(this.getDom('scrambleLink'), 'onclick', this, 'toggleScramble');
break;
// case 'NOTE':
// inputElement = Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'textarea', rows:'5', html:this.value()}, true);
// break
case 'DATE':
inputElement = Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'input', type:'text', value:"this.value()"}, true);
inputElement.dom.value = this.value();
break;
}
this.setInputElement(inputElement);
},
//-------------------------------------------------------------------------
'synchronizeComponentValues': function() {
//MochiKit.Logging.logDebug(">>> FieldValueComponent.synchronizeComponentValues");
if (this.inputElement() != null) {
var value;
switch(this.recordField().type()) {
case 'TXT':
case 'URL':
case 'ADDR':
case 'PWD':
case 'DATE':
value = this.inputElement().dom.value;
break;
}
this.setValue(value);
}
//MochiKit.Logging.logDebug("<<< FieldValueComponent.synchronizeComponentValues");
},
//-------------------------------------------------------------------------
'selectHiddenFieldOnFocus': function(anEvent) {
anEvent.src().select();
},
//-------------------------------------------------------------------------
'toggleScramble': function(anEvent) {
this.synchronizeComponentValues();
if (this.scrambledStatus() == 'SCRAMBLED') {
this.setScrambledStatus('UNSCRAMBLED');
} else {
this.setScrambledStatus('SCRAMBLED');
};
this.update();
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,165 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.RecordDetail) == 'undefined') { Clipperz.PM.Components.RecordDetail = {}; }
//#############################################################################
Clipperz.PM.Components.RecordDetail.HeaderComponent = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.RecordDetail.HeaderComponent.superclass.constructor.call(this, anElement, args);
this.mainComponent().addEditComponent(this);
this._saveButton = null;
this.render();
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.RecordDetail.HeaderComponent, Clipperz.PM.Components.RecordDetail.AbstractComponent, {
'toString': function() {
return "Clipperz.PM.Components.RecordDetail.HeaderComponent component";
},
//-------------------------------------------------------------------------
'render': function() {
var editButton;
//MochiKit.Logging.logDebug(">>> RecordDetail.HeaderComponent.appendTo");
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'div', cls:'recordDetailButtonsBox', children:[
{tag:'div', id:this.getId('editButtonBox'), children:[
{tag:'table', cls:'recordDetailButtonsTABLE', border:'0', cellpadding:'0', cellspacing:'0', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', align:'center', children:[
{tag:'div', id:this.getId('editButton')}
]}
]}
]}
]}
]},
{tag:'div', id:this.getId('saveCancelButtonBox'), children:[
{tag:'table', cls:'recordDetailButtonsTABLE', border:'0', cellpadding:'0', cellspacing:'0', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', width:'49%', align:'right', children:[
{tag:'div', id:this.getId('saveButton')}
]},
{tag:'td', html:'&nbsp'},
{tag:'td', width:'49%', align:'left', children:[
{tag:'div', id:this.getId('cancelButton')}
]}
]}
]}
]}
]}
]});
this.getElement('editButtonBox').setVisibilityMode(YAHOO.ext.Element.DISPLAY);
this.getElement('saveCancelButtonBox').setVisibilityMode(YAHOO.ext.Element.DISPLAY);
editButton = new YAHOO.ext.Button(this.getDom('editButton'), {text:Clipperz.PM.Strings['recordDetailEditButtonLabel'], handler:this.editButtonHandler, scope:this});
this.setSaveButton(new YAHOO.ext.Button(this.getDom('saveButton'), {text:Clipperz.PM.Strings['recordDetailSaveButtonLabel'], handler:this.saveButtonHandler, scope:this}));
new YAHOO.ext.Button(this.getDom('cancelButton'), {text:Clipperz.PM.Strings['recordDetailCancelButtonLabel'], handler:this.cancelButtonHandler, scope:this});
if (Clipperz.PM.Proxy.defaultProxy.isReadOnly()) {
editButton.disable();
}
this.update();
//MochiKit.Logging.logDebug("<<< RecordDetail.HeaderComponent.appendTo");
},
//-------------------------------------------------------------------------
'updateViewMode': function() {
//MochiKit.Logging.logDebug(">>> HeaderComponent.updateViewMode");
this.getElement('editButtonBox').show();
this.getElement('saveCancelButtonBox').hide();
//MochiKit.Logging.logDebug("<<< HeaderComponent.updateViewMode");
},
//-------------------------------------------------------------------------
'updateEditMode': function() {
this.getElement('editButtonBox').hide();
this.getElement('saveCancelButtonBox').show();
if (this.mainComponent().enableSaveButton() == true) {
//MochiKit.Logging.logDebug("--- HeaderComponent.updateViewMode - ENABLE");
this.saveButton().enable();
} else {
this.saveButton().disable();
}
},
//-------------------------------------------------------------------------
'saveButton': function() {
return this._saveButton;
},
'setSaveButton': function(aValue) {
this._saveButton = aValue;
},
//-------------------------------------------------------------------------
'editButtonHandler': function(anEvent) {
this.mainComponent().setEditMode('EDIT');
},
//-------------------------------------------------------------------------
'saveButtonHandler': function(anEvent) {
//MochiKit.Logging.logDebug(">>> RecordDetail.HeaderComponent.saveButtonHandler");
this.mainComponent().setEditMode('VIEW', this.getElement('saveButton'));
//MochiKit.Logging.logDebug("<<< RecordDetail.HeaderComponent.saveButtonHandler");
},
//-------------------------------------------------------------------------
'cancelButtonHandler': function(anEvent) {
this.record().cancelChanges();
//MochiKit.Logging.logDebug("--- HeaderComponent.cancelButtonHandler - " + Clipperz.Base.serializeJSON(this.record().currentDataSnapshot()));
this.mainComponent().setEditMode('VIEW', null, true);
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,758 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.RecordDetail) == 'undefined') { Clipperz.PM.Components.RecordDetail = {}; }
//#############################################################################
Clipperz.PM.Components.RecordDetail.MainComponent = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.RecordDetail.MainComponent.superclass.constructor.call(this, anElement, args);
// this._element = args.element;
this._user = args.user;
this._editMode = args.editMode || 'VIEW'; // [ 'VIEW' | 'EDIT' ]
this._mainPanel = args.mainPanel;
this._record = null;
this._editComponents = [];
this._addFieldButton = null;
this._enableSaveButton = true;
this._shouldShowLoginInfo = (Clipperz.PM.Proxy.defaultProxy.isReadOnly() ? false : true);
// this._mainLayoutManager = null;
// this._layoutRegion = null;
Clipperz.NotificationCenter.register(null, 'loadingRecordData', this, 'render');
Clipperz.NotificationCenter.register(null, 'decryptingRecordData', this, 'render');
Clipperz.NotificationCenter.register(null, 'loadingRecordVersionData', this, 'render');
Clipperz.NotificationCenter.register(null, 'decryptingRecordVersionData', this, 'render');
Clipperz.NotificationCenter.register(null, 'setupDone', this, 'render');
Clipperz.NotificationCenter.register(null, 'switchLanguage', this, 'render');
this.render();
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.RecordDetail.MainComponent, Clipperz.PM.Components.BaseComponent, {
'toString': function() {
return "Clipperz.PM.Components.RecordDetail.MainComponent component";
},
//-------------------------------------------------------------------------
'editMode': function() {
return this._editMode;
},
'setEditMode': function(aValue, aButtonElement, shouldSkipComponentSynchronization) {
//MochiKit.Logging.logDebug(">>> MainComponent.setEditingMode");
this.scrollToTop();
if (aValue == 'VIEW') {
if (shouldSkipComponentSynchronization == true) {
this.exitModalView();
} else {
this.synchronizeComponentValues();
if (this.record().hasPendingChanges()) {
if (this.record().isBrandNew()) {
this.record().removeEmptyFields();
}
this.saveCurrentRecordChanges(aButtonElement);
} else {
if (this.record().isBrandNew()) {
this.record().user().removeRecord(this.record());
}
this.exitModalView();
}
}
} else if (aValue == 'EDIT') {
this.enterModalView();
} else {
// ????
}
this._editMode = aValue;
this.render();
},
//-------------------------------------------------------------------------
'user': function() {
return this._user;
},
//-------------------------------------------------------------------------
'mainPanel': function() {
return this._mainPanel;
},
//-------------------------------------------------------------------------
'render': function() {
//MochiKit.Logging.logDebug(">>> RecordDetail.MainComponent.render");
this.setEnableSaveButton(true);
this.element().update("");
if (this.record() == null) {
if (MochiKit.Base.keys(this.user().records()).length == 0) {
this.renderWithNoRecordAtAll();
} else {
this.renderWithNoSelectedRecord();
}
} else {
this.renderWithSelectedRecord();
}
//MochiKit.Logging.logDebug("<<< RecordDetail.MainComponent.render");
},
//-------------------------------------------------------------------------
'renderWithNoRecordAtAll': function() {
//MochiKit.Logging.logDebug(">>> RecordDetail.MainComponent.renderWithNoRecordAtAll");
Clipperz.YUI.DomHelper.append(this.element().dom,
{tag:'form', cls:'noRecordAtAllFORM', children:[
{tag:'div', cls:'recordTitleBlock', children:[
{tag:'h2', id:'recordTitle', htmlString:Clipperz.PM.Strings['recordDetailNoRecordAtAllTitle']}
]},
{tag:'table', border:'0', cellspacing:'0', cellpadding:'0', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', colspan:'5', children:[
{tag:'div', cls:'recordDetailDescriptionBox', htmlString:Clipperz.PM.Strings['recordDetailNoRecordAtAllDescription']}
]}
]}
]}
]}
]}
);
//MochiKit.Logging.logDebug("<<< RecordDetail.MainComponent.renderWithNoRecordAtAll");
},
//-------------------------------------------------------------------------
'renderWithNoSelectedRecord': function() {
//MochiKit.Logging.logDebug(">>> RecordDetail.MainComponent.renderWithNoSelectedRecord");
Clipperz.YUI.DomHelper.append(this.element().dom,
{tag:'form', cls:'noRecordSelectedFORM', children:[
{tag:'div', cls:'recordTitleBlock', children:[
{tag:'h2', id:'recordTitle', htmlString:Clipperz.PM.Strings['recordDetailNoRecordSelectedTitle']}
]},
{tag:'table', border:'0', cellspacing:'0', cellpadding:'0', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', colspan:'5', children:[
{tag:'div', cls:'recordDetailDescriptionBox', htmlString:Clipperz.PM.Strings['recordDetailNoRecordSelectedDescription']}
]}
]},
{tag:'tr', colspan:'5', children:[
{tag:'td', colspan:'5', children:this.loginInfo()}
]}
]}
]}
]}
);
//MochiKit.Logging.logDebug("--- RecordDetail.MainComponent.renderWithNoSelectedRecord - 1");
if (MochiKit.DOM.getElement('fullLoginHistoryLink') != null) {
MochiKit.Signal.connect('fullLoginHistoryLink', 'onclick', this, 'showLoginHistoryPanel');
}
//MochiKit.Logging.logDebug("--- RecordDetail.MainComponent.renderWithNoSelectedRecord - 2");
if (MochiKit.DOM.getElement('offlineCopyDownloadWarningLink') != null) {
MochiKit.Signal.connect('offlineCopyDownloadWarningLink', 'onclick', this, 'showDownloadOfflineCopyPanel');
}
//MochiKit.Logging.logDebug("<<< RecordDetail.MainComponent.renderWithNoSelectedRecord");
},
//-------------------------------------------------------------------------
'renderWithSelectedRecord': function() {
//MochiKit.Logging.logDebug(">>> RecordDetail.MainComponent.renderWithSelectedRecord");
if (this.record().shouldLoadData() === true) {
// this.renderWithSelectedRecordLoading();
//MochiKit.Logging.logDebug("--- RecordDetail.MainComponent.renderWithSelectedRecord - 1.1");
this.renderWhileProcessingWithMessage(Clipperz.PM.Strings['recordDetailLoadingRecordMessage']);
//MochiKit.Logging.logDebug("--- RecordDetail.MainComponent.renderWithSelectedRecord - 1.2");
} else if (this.record().shouldDecryptData() === true) {
// this.renderWithSelectedRecordDecrypting();
//MochiKit.Logging.logDebug("--- RecordDetail.MainComponent.renderWithSelectedRecord - 2.1");
this.renderWhileProcessingWithMessage(Clipperz.PM.Strings['recordDetailDecryptingRecordMessage']);
//MochiKit.Logging.logDebug("--- RecordDetail.MainComponent.renderWithSelectedRecord - 2.2");
} else if (this.record().currentVersion().shouldLoadData() === true) {
//MochiKit.Logging.logDebug("--- RecordDetail.MainComponent.renderWithSelectedRecord - 3.1");
this.renderWhileProcessingWithMessage(Clipperz.PM.Strings['recordDetailLoadingRecordVersionMessage']);
//MochiKit.Logging.logDebug("--- RecordDetail.MainComponent.renderWithSelectedRecord - 3.2");
} else if (this.record().currentVersion().shouldDecryptData() === true) {
// this.renderWithSelectedRecordCurrentVersionDecrypting();
//MochiKit.Logging.logDebug("--- RecordDetail.MainComponent.renderWithSelectedRecord - 4.1");
this.renderWhileProcessingWithMessage(Clipperz.PM.Strings['recordDetailDecryptingRecordVersionMessage']);
//MochiKit.Logging.logDebug("--- RecordDetail.MainComponent.renderWithSelectedRecord - 4.2");
} else {
//MochiKit.Logging.logDebug("--- RecordDetail.MainComponent.renderWithSelectedRecord - 5.1");
this.renderWithSelectedRecordData();
//MochiKit.Logging.logDebug("--- RecordDetail.MainComponent.renderWithSelectedRecord - 5.2");
}
//MochiKit.Logging.logDebug("<<< RecordDetail.MainComponent.renderWithSelectedRecord");
},
//.........................................................................
'renderWhileProcessingWithMessage': function(aMessage) {
//MochiKit.Logging.logDebug(">>> RecordDetail.MainComponent.renderWhileProcessingWithMessage");
Clipperz.YUI.DomHelper.append(this.element().dom,
{tag:'form', cls:'processingRecordFORM', children:[
{tag:'div', cls:'recordTitleBlock', children:[
{tag:'h2', id:'recordTitle', html:this.record().label()}
]},
{tag:'table', border:'0', cellspacing:'0', cellpadding:'0', children:[
{tag:'tbody', children:[
{tag:'tr', cls:'recordTR', children:[
{tag:'td', colspan:'5', children:[
{tag:'div', cls:'recordDetailDescriptionBox', children:[
{tag:'h5', cls:'recordLoadingMessage', html:aMessage}
]}
]}
]}
]}
]}
]}
);
//MochiKit.Logging.logDebug("<<< RecordDetail.MainComponent.renderWhileProcessingWithMessage");
},
//.........................................................................
/*
'renderWithSelectedRecordLoading': function() {
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'div', cls:'', style:'border:1px solid red; padding: 20px;', children:[
{tag:'div', cls:'Clipprez_RecordDetailTitle', children:[
{tag:'h3', html:this.record().label()},
{tag:'h3', html:"loading"}
]}
]});
},
//.........................................................................
'renderWithSelectedRecordDecrypting': function() {
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'div', cls:'', style:'border:1px solid red; padding: 20px;', children:[
{tag:'div', cls:'Clipprez_RecordDetailTitle', children:[
{tag:'h3', html:this.record().label()},
{tag:'h3', html:"decrypting ... "}
]}
]});
},
//.........................................................................
'renderWithSelectedRecordCurrentVersionDecrypting': function() {
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'div', cls:'', style:'border:1px solid red; padding: 20px;', children:[
{tag:'div', cls:'Clipprez_RecordDetailTitle', children:[
{tag:'h3', html:this.record().label()},
{tag:'h3', html:"decrypting version ... "}
]}
]});
},
*/
//-------------------------------------------------------------------------
'renderWithErrorMessage': function(anErrorMessage) {
//MochiKit.Logging.logDebug(">>> RecordDetail.MainComponent.renderWithErrorMessage");
this.element().update("");
//MochiKit.Logging.logDebug("--- RecordDetail.MainComponent.renderWithErrorMessage - 1");
Clipperz.YUI.DomHelper.append(this.element().dom,
{tag:'form', cls:'errorMessageFORM', children:[
{tag:'div', cls:'recordTitleBlock', children:[
{tag:'h2', id:'recordTitle', html:this.record().label()}
]},
{tag:'table', border:'0', cellspacing:'0', cellpadding:'0', children:[
{tag:'tbody', children:[
{tag:'tr', cls:'recordTR', children:[
{tag:'td', colspan:'5', children:[
{tag:'div', cls:'recordDetailDescriptionBox loadingError', children:[
{tag:'h5', htmlString:Clipperz.PM.Strings['recordDetailLoadingErrorMessageTitle']},
{tag:'p', html:anErrorMessage.message}
]}
]}
]}
]}
]}
]}
);
//MochiKit.Logging.logDebug("<<< RecordDetail.MainComponent.renderWithErrorMessage");
},
//-------------------------------------------------------------------------
'renderWithSelectedRecordData': function() {
var columns;
this.resetEditComponents();
columns = [
{tag:'td', width:'25', html:'&#160'},
{tag:'td', width:'25%', htmlString:Clipperz.PM.Strings['recordDetailLabelFieldColumnLabel']},
{tag:'td', width:'3', html:'&#160'},
{tag:'td', /*width:'80%',*/ htmlString:Clipperz.PM.Strings['recordDetailDataFieldColumnLabel']}
];
if (this.editMode() == 'EDIT') {
columns.push({tag:'td', /*width:'55',*/ htmlString:Clipperz.PM.Strings['recordDetailTypeFieldColumnLabel']})
}
//MochiKit.Logging.logDebug(">>> RecordDetail.MainComponent.renderWithSelectedRecordData");
Clipperz.YUI.DomHelper.append(this.element().dom,
{tag:'form', cls:'recordDataFORM', children:[
{tag:'div', cls:'recordTitleBlock', id:this.getId('title')},
{tag:'div', id:'recordDetailDataBox', cls:'recordDetailDataBox', children:[
{tag:'table', width:'100%', border:'0', cellspacing:'0', cellpadding:'0', children:[
{tag:'tbody', children:[
{tag:'tr', children:[
{tag:'td', width:'5', html:"&nbsp;"},
{tag:'td', children:[
{tag:'table', cls:'recordDetailDataBoxTABLE', border:'0', cellspacing:'0', cellpadding:'0', children:[
{tag:'tbody', id:this.getId('tbody'), children:[
{tag:'tr', /*cls:'recordNoteTR',*/ children:[
{tag:'td', colspan:'5', id:this.getId('notes')}
]},
{tag:'tr', cls:'recordFieldsTR', children:columns /* [
{tag:'td', width:'25', html:'&#160'},
{tag:'td', width:'25%', htmlString:Clipperz.PM.Strings['recordDetailLabelFieldColumnLabel']},
{tag:'td', width:'3', html:'&#160'},
{tag:'td', / *width:'80%',* / htmlString:Clipperz.PM.Strings['recordDetailDataFieldColumnLabel']},
{tag:'td', / *width:'55',* / htmlString:Clipperz.PM.Strings['recordDetailTypeFieldColumnLabel']}
] */ }
]}
]},
{tag:'div', cls:'addFieldButton', id:this.getId('addField'), children:[
{tag:'div', id:this.getId('addFieldButton')}
]},
{tag:'div', id:this.getId('directLogins')},
{tag:'div', id:this.getId('footer')}
]}
]}
]}
]}
]}
]}
);
//MochiKit.Logging.logDebug("--- RecordDetail.MainComponent.renderWithSelectedRecordData - 1");
new Clipperz.PM.Components.RecordDetail.TitleComponent(this.getElement('title'), {mainComponent:this});
//MochiKit.Logging.logDebug("--- RecordDetail.MainComponent.renderWithSelectedRecordData - 2");
new Clipperz.PM.Components.RecordDetail.NotesComponent(this.getElement('notes'), {mainComponent:this});
//MochiKit.Logging.logDebug("--- RecordDetail.MainComponent.renderWithSelectedRecordData - 3");
new Clipperz.PM.Components.RecordDetail.DirectLoginsComponent(this.getElement('directLogins'), {mainComponent:this});
//MochiKit.Logging.logDebug("--- RecordDetail.MainComponent.renderWithSelectedRecordData - 4");
new Clipperz.PM.Components.RecordDetail.HeaderComponent(this.getElement('footer'), {mainComponent:this});
//MochiKit.Logging.logDebug("--- RecordDetail.MainComponent.renderWithSelectedRecordData - 5");
MochiKit.Iter.forEach(MochiKit.Base.values(this.record().currentVersion().fields()), this.appendFieldComponent, this);
//MochiKit.Logging.logDebug("--- RecordDetail.MainComponent.renderWithSelectedRecordData - 6");
this.setAddFieldButton(new YAHOO.ext.Button(this.getDom('addFieldButton'), {text:Clipperz.PM.Strings['recordDetailAddFieldButtonLabel'], handler:this.addNewRecordField, scope:this}));
//MochiKit.Logging.logDebug("--- RecordDetail.MainComponent.renderWithSelectedRecordData - 7");
this.update();
//MochiKit.Logging.logDebug("<<< RecordDetail.MainComponent.renderWithSelectedRecordData");
},
//-------------------------------------------------------------------------
'editComponents': function() {
return this._editComponents;
},
'resetEditComponents': function() {
this._editComponents = [];
},
'addEditComponent': function(aValue) {
this.editComponents().push(aValue);
},
'removeEditComponent': function(aValue) {
Clipperz.Base.removeFromArray(this.editComponents(), aValue);
},
//-------------------------------------------------------------------------
'record': function() {
return this._record;
},
'setRecord': function(aValue) {
var result;
//MochiKit.Logging.logDebug(">>> MainComponent.setRecord")
if (this._record != aValue) {
var deferredResult;
deferredResult = new MochiKit.Async.Deferred();
if ((this._record != null) && (this.editMode() == 'EDIT')) {
this.synchronizeComponentValues();
deferredResult.addCallback(MochiKit.Base.method(this._record, 'saveChanges'));
}
this._record = aValue;
if (aValue != null) {
this.setShouldShowLoginInfo(false);
deferredResult.addCallback(MochiKit.Base.method(this._record, 'deferredData'));
}
deferredResult.addCallbacks(
MochiKit.Base.method(this, 'render'),
MochiKit.Base.method(this, 'renderWithErrorMessage')
);
deferredResult.callback();
this.scrollToTop();
result = deferredResult;
} else {
result = MochiKit.Async.success();
}
//MochiKit.Logging.logDebug("<<< MainComponent.setRecord")
return result;
},
//-------------------------------------------------------------------------
'saveCurrentRecordChanges': function(aButtonElement) {
var deferred;
var currentNumberOfRecords;
deferred = new MochiKit.Async.Deferred();
deferred.addCallback(MochiKit.Base.method(Clipperz.PM.Components.MessageBox(), 'deferredShow'),
{
title:Clipperz.PM.Strings['recordDetailSavingChangesMessagePanelInitialTitle'],
text:Clipperz.PM.Strings['recordDetailSavingChangesMessagePanelInitialText'],
width:240,
showProgressBar:true,
showCloseButton:false,
steps:6
},
aButtonElement.dom
);
deferred.addCallback(MochiKit.Base.method(this, 'exitModalView'));
deferred.addCallback(MochiKit.Base.method(this.record(), 'saveChanges'));
deferred.addCallback(Clipperz.NotificationCenter.deferredNotification, this.record(), 'recordUpdated');
deferred.addCallback(function(res) {
Clipperz.PM.Components.MessageBox().hide(YAHOO.ext.Element.get('main'));
return res;
});
currentNumberOfRecords = MochiKit.Base.keys(this.user().records()).length;
if ((this.record().isBrandNew()) && (this.user().preferences().shouldShowDonationPanel()) && (currentNumberOfRecords >= 5)) {
deferred.addCallback(Clipperz.PM.showDonationSplashScreen, this.user(), 'recordListAddRecordButton');
}
deferred.callback();
},
//-------------------------------------------------------------------------
'update': function(anEvent) {
if (this.editMode() == 'EDIT') {
this.updateEditMode();
} else if (this.editMode() == 'VIEW') {
this.updateViewMode();
}
MochiKit.Iter.forEach(this.editComponents(), MochiKit.Base.methodcaller('update'));
},
//-------------------------------------------------------------------------
'updateViewMode': function() {
this.addFieldButton().hide();
},
//-------------------------------------------------------------------------
'updateEditMode': function() {
this.addFieldButton().show();
},
//-------------------------------------------------------------------------
'appendFieldComponent': function(aRecordField) {
//MochiKit.Logging.logDebug(">>> MainComponent.appendFieldComponent");
new Clipperz.PM.Components.RecordDetail.FieldComponent(
Clipperz.YUI.DomHelper.append(this.getDom('tbody'), {tag:'tr'}, true),
{recordField:aRecordField, mainComponent:this}
);
//MochiKit.Logging.logDebug("<<< MainComponent.appendFieldComponent");
},
//-------------------------------------------------------------------------
'removeField': function(aFieldComponent) {
var recordField;
//MochiKit.Logging.logDebug(">>> MainComponent.removeField")
recordField = aFieldComponent.recordField();
this.removeEditComponent(aFieldComponent);
aFieldComponent.destroy();
this.record().removeField(recordField);
Clipperz.NotificationCenter.notify(this.record(), 'removedField');
//MochiKit.Logging.logDebug("<<< MainComponent.removeField")
},
//-------------------------------------------------------------------------
'synchronizeComponentValues': function() {
MochiKit.Iter.forEach(this.editComponents(), MochiKit.Base.methodcaller('synchronizeComponentValues'));
},
//=========================================================================
'addFieldButton': function() {
return this._addFieldButton;
},
'setAddFieldButton': function(aValue) {
this._addFieldButton = aValue;
},
'addNewRecordField': function() {
var newField;
newField = this.record().addNewField();
this.appendFieldComponent(newField);
Clipperz.NotificationCenter.notify(this.record(), 'addNewRecordField');
},
//-------------------------------------------------------------------------
'enterModalView': function() {
/*
if (this.user().preferences().useSafeEditMode()) {
var headerMaskElement;
var verticalMaskElement;
headerMaskElement = YAHOO.ext.Element.get('recordDetailEditModeHeaderMask');
headerMaskElement.show().mask();
verticalMaskElement = YAHOO.ext.Element.get('recordDetailEditModeVerticalMask');
verticalMaskElement.show().mask();
}
*/
this.mainPanel().enterModalView();
},
//-------------------------------------------------------------------------
'exitModalView': function() {
/*
if (this.user().preferences().useSafeEditMode()) {
var headerMaskElement;
var verticalMaskElement;
headerMaskElement = YAHOO.ext.Element.get('recordDetailEditModeHeaderMask');
headerMaskElement.unmask();
headerMaskElement.hide();
verticalMaskElement = YAHOO.ext.Element.get('recordDetailEditModeVerticalMask');
verticalMaskElement.unmask();
verticalMaskElement.hide();
}
*/
this.mainPanel().exitModalView();
},
//-------------------------------------------------------------------------
'enableSaveButton': function() {
return this._enableSaveButton;
},
'setEnableSaveButton': function(aValue) {
this._enableSaveButton = aValue;
},
//-------------------------------------------------------------------------
'scrollToTop': function() {
YAHOO.ext.Element.get('recordTitleTopBlock').scrollIntoView(document.body);
},
//-------------------------------------------------------------------------
'loginInfo': function() {
var result;
if (this.shouldShowLoginInfo() == true) {
// && (typeof(this.user().loginInfo()['latest']) != 'undefined')) {
var imageExtension;
var currentConnectionText;
var currentIP;
var contentChildren;
result = [];
contentChildren = [];
imageExtension = (Clipperz_IEisBroken == true) ? 'gif': 'png';
contentChildren.push({tag:'h4', valign:'top', htmlString:Clipperz.PM.Strings['WELCOME_BACK']});
currentIP = (this.user().loginInfo()['current']['ip'].match(/^\d{1,3}(.\d{1,3}){3}$/)) ? this.user().loginInfo()['current']['ip'] : Clipperz.PM.Strings['unknown_ip'];
currentConnectionText = Clipperz.PM.Strings['currentConnectionText'];
currentConnectionText = currentConnectionText.replace(/__ip__/, "<b>" + Clipperz.Base.sanitizeString(this.user().loginInfo()['current']['ip']) + "</b>");
currentConnectionText = currentConnectionText.replace(/__country__/, "<b>" + Clipperz.PM.Strings['countries'][Clipperz.Base.sanitizeString(this.user().loginInfo()['current']['country'])] + "</b>");
currentConnectionText = currentConnectionText.replace(/__browser__/, "<b>" + Clipperz.PM.Strings['browsers'][Clipperz.Base.sanitizeString(this.user().loginInfo()['current']['browser'])] + "</b>");
currentConnectionText = currentConnectionText.replace(/__operatingSystem__/, "<b>" + Clipperz.PM.Strings['operatingSystems'][Clipperz.Base.sanitizeString(this.user().loginInfo()['current']['operatingSystem'])] + "</b>");
contentChildren.push(
{tag:'div', cls:'loginInfo_now', children:[
{tag:'div', cls:'text', htmlString:currentConnectionText},
{tag:'div', cls:'icons', children:[
{tag:'img', title:Clipperz.PM.Strings['countries'][Clipperz.Base.sanitizeString(this.user().loginInfo()['current']['country'])], cls:'flag', src:Clipperz.PM.Strings['icons_baseUrl'] + "/flags/" + Clipperz.Base.sanitizeString(this.user().loginInfo()['current']['country']).toLowerCase() + "." + imageExtension, width:'32', height:'32'},
{tag:'img', title:Clipperz.PM.Strings['browsers'][Clipperz.Base.sanitizeString(this.user().loginInfo()['current']['browser'])], src:Clipperz.PM.Strings['icons_baseUrl'] + "/browsers/" + Clipperz.Base.sanitizeString(this.user().loginInfo()['current']['browser']).toLowerCase() + "." + imageExtension, width:'32', height:'32'},
{tag:'img', title:Clipperz.PM.Strings['operatingSystems'][Clipperz.Base.sanitizeString(this.user().loginInfo()['current']['operatingSystem'])], src:Clipperz.PM.Strings['icons_baseUrl'] + "/operatingSystems/" + Clipperz.Base.sanitizeString(this.user().loginInfo()['current']['operatingSystem']).toLowerCase() + "." + imageExtension, width:'32', height:'32'}
]}
]}
);
if (typeof(this.user().loginInfo()['latest']) != 'undefined') {
var latestLoginDate;
var elapsedTimeDescription;
var latestIP;
var latestConnectionText;
latestLoginDate = Clipperz.PM.Date.parseDateWithUTCFormat(Clipperz.Base.sanitizeString(this.user().loginInfo()['latest']['date']));
elapsedTimeDescription = Clipperz.PM.Date.getElapsedTimeDescription(latestLoginDate);
latestIP = (this.user().loginInfo()['latest']['ip'].match(/^\d{1,3}(.\d{1,3}){3}$/)) ? this.user().loginInfo()['latest']['ip'] : Clipperz.PM.Strings['unknown_ip'];
latestConnectionText = Clipperz.PM.Strings['latestConnectionText'];
latestConnectionText = latestConnectionText.replace(/__elapsedTimeDescription__/, "<b>" + elapsedTimeDescription + "</b>");
latestConnectionText = latestConnectionText.replace(/__time__/, Clipperz.PM.Date.formatDateWithTemplate(latestLoginDate, Clipperz.PM.Strings['fullDate_format']));
latestConnectionText = latestConnectionText.replace(/__ip__/, "<b>" + Clipperz.Base.sanitizeString(this.user().loginInfo()['latest']['ip']) + "</b>");
latestConnectionText = latestConnectionText.replace(/__country__/, "<b>" + Clipperz.PM.Strings['countries'][Clipperz.Base.sanitizeString(this.user().loginInfo()['latest']['country'])] + "</b>");
latestConnectionText = latestConnectionText.replace(/__browser__/, "<b>" + Clipperz.PM.Strings['browsers'][Clipperz.Base.sanitizeString(this.user().loginInfo()['latest']['browser'])] + "</b>");
latestConnectionText = latestConnectionText.replace(/__operatingSystem__/, "<b>" + Clipperz.PM.Strings['operatingSystems'][Clipperz.Base.sanitizeString(this.user().loginInfo()['latest']['operatingSystem'])] + "</b>");
contentChildren.push(
{tag:'div', cls:'loginInfo_latest', children:[
{tag:'div', cls:'inner_header', html:'&nbsp;'},
{tag:'div', cls:'content', children:[
{tag:'div', cls:'text', htmlString:latestConnectionText},
{tag:'div', cls:'icons', children:[
{tag:'img', title:Clipperz.PM.Strings['countries'][Clipperz.Base.sanitizeString(this.user().loginInfo()['latest']['country'])], cls:'flag', src:Clipperz.PM.Strings['icons_baseUrl'] + "/flags/" + Clipperz.Base.sanitizeString(this.user().loginInfo()['latest']['country']).toLowerCase() + "." + imageExtension, width:'32', height:'32'},
{tag:'img', title:Clipperz.PM.Strings['browsers'][Clipperz.Base.sanitizeString(this.user().loginInfo()['latest']['browser'])], src:Clipperz.PM.Strings['icons_baseUrl'] + "/browsers/" + Clipperz.Base.sanitizeString(this.user().loginInfo()['latest']['browser']).toLowerCase() + "." + imageExtension, width:'32', height:'32'},
{tag:'img', title:Clipperz.PM.Strings['operatingSystems'][Clipperz.Base.sanitizeString(this.user().loginInfo()['latest']['operatingSystem'])], src:Clipperz.PM.Strings['icons_baseUrl'] + "/operatingSystems/" + Clipperz.Base.sanitizeString(this.user().loginInfo()['latest']['operatingSystem']).toLowerCase() + "." + imageExtension, width:'32', height:'32'}
]}
]},
{tag:'div', children:[
{tag:'a', href:'#', id:'fullLoginHistoryLink', htmlString:Clipperz.PM.Strings['fullLoginHistoryLinkLabel']}
]},
{tag:'div', cls:'inner_footer', html:'&nbsp;'}
]}
);
}
contentChildren.push(
{tag:'table', id:'shouldDownloadOfflineCopyWarningBox', children:[
{tag:'tbody', width:'100%', children:[
{tag:'tr', children:[
{tag:'td', cls:'offlineCopyDownloadWarningIconTD', valign:'top', align:'center', width:'50', children:(this.user().shouldDownloadOfflineCopy() ? [{tag:'img', src:Clipperz.PM.Strings['icons_baseUrl'] + "/misc/offlineCopyWarning.png" , width:'32', height:'32'}]: [])},
{tag:'td', children:[
{tag:'div', cls:'offlineCopyDownloadWarning', htmlString:(this.user().shouldDownloadOfflineCopy() ? Clipperz.PM.Strings['offlineCopyDownloadWarning']: Clipperz.PM.Strings['offlineCopyDownloadOk'])}
]}
]}
]}
]}
);
result = [{tag:'div', id:'loginInfoWrapper', children:[{tag:'div', id:'loginInfo', children:[
{tag:'div', cls:'header', html:'&nbsp;'},
{tag:'div', cls:'content', children:contentChildren},
{tag:'div', cls:'footer', html:'&nbsp;'}
]}]}];
// this.setShouldShowLoginInfo(false);
} else {
resut = [];
}
return result;
},
//-------------------------------------------------------------------------
'shouldShowLoginInfo': function() {
return this._shouldShowLoginInfo;
},
'setShouldShowLoginInfo': function(aValue) {
this._shouldShowLoginInfo = aValue;
},
//-------------------------------------------------------------------------
'showLoginHistoryPanel': function(anEvent) {
anEvent.stop();
Clipperz.NotificationCenter.notify(this, 'selectTab', 'mainTabPanel.accountTab', true);
Clipperz.NotificationCenter.notify(this, 'selectTab', 'accountTabPanel.loginHistoryTab', true);
},
//-------------------------------------------------------------------------
'showDownloadOfflineCopyPanel': function(anEvent) {
anEvent.stop();
Clipperz.NotificationCenter.notify(this, 'selectTab', 'mainTabPanel.dataTab', true);
Clipperz.NotificationCenter.notify(this, 'selectTab', 'dataTabPanel.offlineCopyTab', true);
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,240 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.RecordDetail) == 'undefined') { Clipperz.PM.Components.RecordDetail = {}; }
//#############################################################################
Clipperz.PM.Components.RecordDetail.NotesComponent = function(anElement, args) {
//MochiKit.Logging.logDebug(">>> new NotesComponent");
args = args || {};
Clipperz.PM.Components.RecordDetail.NotesComponent.superclass.constructor.call(this, anElement, args);
this.mainComponent().addEditComponent(this);
this._staticOffset = null;
this._componentHeight = 50;
this._mouseMoveIdentifier = null;
this._mouseUpIdentifier = null;
this.element().setVisibilityMode(YAHOO.ext.Element.DISPLAY);
this.render();
//MochiKit.Logging.logDebug("<<< new NotesComponent");
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.RecordDetail.NotesComponent, Clipperz.PM.Components.RecordDetail.AbstractComponent, {
'toString': function() {
return "Clipperz.PM.Components.RecordDetail.NotesComponent component";
},
//-------------------------------------------------------------------------
'value': function() {
return this.record().notes();
},
'setValue': function(aValue) {
this.record().setNotes(aValue);
},
//-------------------------------------------------------------------------
'render': function() {
//MochiKit.Logging.logDebug(">>> NotesComponent.render");
/*
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'td', colspan:'5', children:[
{tag:'span', cls:'noteFieldLabel', htmlString:Clipperz.PM.Strings['recordDetailNotesLabel']},
{tag:'div', cls:'noteFieldContent', id:this.getId('notes')}
]});
*/
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'span', cls:'noteFieldLabel', htmlString:Clipperz.PM.Strings['recordDetailNotesLabel']});
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'div', cls:'noteFieldContent', id:this.getId('notes'), children:[
{tag:'div', id:this.getId('resizableDiv'), cls:'resizable-textarea', children:[
{tag:'div', id:this.getId('contentView'), cls:'viewMode', html:""},
{tag:'div', id:this.getId('contentEdit'), children:[
{tag:'span', children:[
{tag:'textarea', id:this.getId('textarea'), html:""}
]}
]},
{tag:'div', id:this.getId('grippie'), cls:'grippie'}
]}
]});
this.getElement('contentView').setVisibilityMode(YAHOO.ext.Element.DISPLAY);
this.getElement('contentEdit').setVisibilityMode(YAHOO.ext.Element.DISPLAY);
MochiKit.Signal.connect(this.getId('grippie'), 'onmousedown', this, 'startResize');
this.update();
//MochiKit.Logging.logDebug("<<< NotesComponent.render");
},
//-------------------------------------------------------------------------
'updateViewMode': function() {
//MochiKit.Logging.logDebug(">>> NotesComponent.updateViewMode");
// this.getElement('notes').update(this.value().replace(/\n/g, '<br>'));
this.getElement('contentView').update(Clipperz.Base.sanitizeString(this.value()).replace(/\n/g, '<br>'));
if (this.isNoteEmpty()) {
this.element().hide();
} else {
this.getElement('contentView').show();
this.getElement('contentView').setHeight(this.componentHeight());
}
this.getElement('contentEdit').hide();
//MochiKit.Logging.logDebug("<<< NotesComponent.updateViewMode");
},
//-------------------------------------------------------------------------
'updateEditMode': function() {
//MochiKit.Logging.logDebug(">>> NotesComponent.updateEditMode");
this.getDom('textarea').value = this.value().replace(/\n/g, Clipperz_normalizedNewLine);
this.getElement('contentView').hide();
this.getElement('contentEdit').show();
this.getElement('textarea').setHeight(this.componentHeight());
//MochiKit.Logging.logDebug("<<< NotesComponent.updateEditMode");
},
//-------------------------------------------------------------------------
'synchronizeComponentValues': function() {
//MochiKit.Logging.logDebug(">>> NotesComponent.synchronizeComponentValues");
if (this.getElement('textarea') != null) {
this.setValue(this.getDom('textarea').value.replace(/(\x0a\x0d|\x0d\x0a)/g,'\n'));
}
//MochiKit.Logging.logDebug("<<< NotesComponent.synchronizeComponentValues");
},
//-------------------------------------------------------------------------
'componentHeight': function() {
return this._componentHeight;
},
'setComponentHeight': function(aValue) {
this._componentHeight = aValue;
},
//-------------------------------------------------------------------------
'isNoteEmpty': function() {
return !/[^ \n]/.test(this.value());
},
//-------------------------------------------------------------------------
'staticOffset': function() {
return this._staticOffset;
},
'setStaticOffset': function(aValue) {
this._staticOffset = aValue;
},
//-------------------------------------------------------------------------
'startResize': function(anEvent) {
//MochiKit.Logging.logDebug(">>> startResize");
if (this.editMode() == 'VIEW') {
this.setStaticOffset(this.getElement('contentView').getHeight() - anEvent.mouse().page['y'])
} else {
this.setStaticOffset(this.getElement('textarea').getHeight() - anEvent.mouse().page['y'])
// this.getElement('textarea').setStyle('opacity', 0.25);
}
this.setMouseMoveIdentifier(MochiKit.Signal.connect(MochiKit.DOM.currentDocument(), 'onmousemove', this, 'whileResizing'));
this.setMouseUpIdentifier(MochiKit.Signal.connect(MochiKit.DOM.currentDocument(), 'onmouseup', this, 'endResize'));
anEvent.stop();
//MochiKit.Logging.logDebug("<<< startResize");
},
//-------------------------------------------------------------------------
'whileResizing': function(anEvent) {
//MochiKit.Logging.logDebug(">>> whileResizing");
this.getElement('textarea').setHeight(Math.max(32, this.staticOffset() + anEvent.mouse().page['y']) + 'px');
this.getElement('contentView').setHeight(Math.max(32, this.staticOffset() + anEvent.mouse().page['y']) + 'px');
anEvent.stop();
//MochiKit.Logging.logDebug("<<< whileResizing");
},
//-------------------------------------------------------------------------
'endResize': function(anEvent) {
//MochiKit.Logging.logDebug(">>> endResize");
MochiKit.Signal.disconnect(this.mouseMoveIdentifier());
this.setMouseMoveIdentifier(null);
MochiKit.Signal.disconnect(this.mouseUpIdentifier());
this.setMouseUpIdentifier(null);
// this.getElement('textarea').setStyle('opacity', 1);
this.setComponentHeight(this.getElement('textarea').getHeight());
//MochiKit.Logging.logDebug("<<< endResize");
},
//-------------------------------------------------------------------------
'mouseMoveIdentifier': function() {
return this._mouseMoveIdentifier;
},
'setMouseMoveIdentifier': function(aValue) {
this._mouseMoveIdentifier = aValue;
},
//-------------------------------------------------------------------------
'mouseUpIdentifier': function() {
return this._mouseUpIdentifier;
},
'setMouseUpIdentifier': function(aValue) {
this._mouseUpIdentifier = aValue;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,137 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.RecordDetail) == 'undefined') { Clipperz.PM.Components.RecordDetail = {}; }
//#############################################################################
Clipperz.PM.Components.RecordDetail.TitleComponent = function(anElement, args) {
args = args || {};
Clipperz.PM.Components.RecordDetail.TitleComponent.superclass.constructor.call(this, anElement, args);
// this._inputElement = null;
this.mainComponent().addEditComponent(this);
this.render();
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.RecordDetail.TitleComponent, Clipperz.PM.Components.RecordDetail.AbstractComponent, {
'toString': function() {
return "Clipperz.PM.Components.RecordDetail.TitleComponent component";
},
//-------------------------------------------------------------------------
'value': function() {
return this.record().label();
},
'setValue': function(aValue) {
this.record().setLabel(aValue);
},
//-------------------------------------------------------------------------
/*
'inputElement': function() {
return this._inputElement;
},
'setInputElement': function(aValue) {
this._inputElement = aValue;
},
*/
//-------------------------------------------------------------------------
'render': function() {
// Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'td', html:'&#160'});
// Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'td', colspan:"3", html:'&#160', children:[
// {tag:'div', /*style:'border: 1px solid green;',*/ id:this.getId('title')}
// ]});
// Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'td', html:'&#160'});
//
// this.setInputElement(new Clipperz.PM.Components.TextFormField(this.getElement('title'), {editMode:this.editMode(), value:this.value()}));
this.update();
},
//-------------------------------------------------------------------------
/*
'update': function() {
this.inputElement().update({value:this.value(), editMode:this.editMode()});
},
*/
//-------------------------------------------------------------------------
'updateViewMode': function() {
this.element().update("");
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'h2', html:this.value()});
},
//-------------------------------------------------------------------------
'updateEditMode': function() {
//MochiKit.Logging.logDebug(">>> TitleComponent.updateEditMode");
// this.getElement('title').update("");
// Clipperz.YUI.DomHelper.append(this.getDom('title'), {tag:'div', id:this.getId('title_input')});
// this.setInputElement(Clipperz.YUI.DomHelper.append(this.getDom('title_input'), {tag:'input', type:'text', value:this.value()}, true));
this.element().update("");
Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'input', id:this.getId('titleField'), type:'text', value:"this.value()"});
this.getElement('titleField').dom.value = this.value();
//MochiKit.Logging.logDebug("<<< TitleComponent.updateEditMode");
},
//-------------------------------------------------------------------------
'synchronizeComponentValues': function() {
var inputElement;
//MochiKit.Logging.logDebug(">>> TitleComponent.synchronizeComponentValues");
inputElement = this.element().getChildrenByTagName('input')[0];
if (inputElement != null) {
this.setValue(inputElement.dom.value);
}
//MochiKit.Logging.logDebug("<<< TitleComponent.synchronizeComponentValues");
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,158 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
if (typeof(Clipperz.PM.Components.TabPanel) == 'undefined') { Clipperz.PM.Components.TabPanel = {}; }
Clipperz.PM.Components.TabPanel.TabPanelController = function(args) {
args = args || {};
Clipperz.PM.Components.TabPanel.TabPanelController.superclass.constructor.call(this);
this._name = args.name || 'undefined';
this._config = args.config;
this._selectedTab = args.selectedTab || ((MochiKit.Base.keys(args.config).length > 0) ? MochiKit.Base.keys(args.config)[0] : null);
this._tabs = {};
this._panels = {};
Clipperz.NotificationCenter.register(null, 'selectTab', this, 'handleSelectTabNotification');
return this;
}
//=============================================================================
YAHOO.extendX(Clipperz.PM.Components.TabPanel.TabPanelController, YAHOO.ext.util.Observable, {
//-------------------------------------------------------------------------
'name': function() {
return this._name;
},
//-------------------------------------------------------------------------
'tabs': function() {
return this._tabs;
},
//-------------------------------------------------------------------------
'panels': function() {
return this._panels;
},
//-------------------------------------------------------------------------
'config': function() {
return this._config;
},
//-------------------------------------------------------------------------
'selectedTab': function() {
return this._selectedTab;
},
'setSelectedTab': function(aValue) {
this._selectedTab = aValue;
},
//-------------------------------------------------------------------------
'setUp': function() {
var tabId;
//MochiKit.Logging.logDebug(">>> TabPanelController.setUp - config: " + Clipperz.Base.serializeJSON(this.config()));
for (tabId in this.config()) {
var tabElement;
var panelElement;
//MochiKit.Logging.logDebug("--- TabPanelController.setUp - tabId: " + tabId);
//MochiKit.Logging.logDebug("--- TabPanelController.setUp - panelId: " + this.config()[tabId]);
tabElement = YAHOO.ext.Element.get(tabId);
tabElement.addClassOnOver("hover");
MochiKit.Signal.connect(tabId, 'onclick', this, 'selectTabHandler');
panelElement = YAHOO.ext.Element.get(this.config()[tabId]);
this._tabs[tabId] = tabElement;
this._panels[tabId] = panelElement;
if (tabId == this.selectedTab()) {
tabElement.addClass('selectedTab');
panelElement.addClass('selectedPanel');
} else {
panelElement.addClass('hiddenPanel');
}
}
//MochiKit.Logging.logDebug("<<< TabPanelController.setUp");
},
//-------------------------------------------------------------------------
'selectTab': function(aTab) {
if (aTab != this.selectedTab()) {
this.tabs()[this.selectedTab()].removeClass('selectedTab');
this.panels()[this.selectedTab()].removeClass('selectedPanel').addClass('hiddenPanel');
this.tabs()[aTab].addClass('selectedTab');
this.panels()[aTab].addClass('selectedPanel').removeClass('hiddenPanel');
this.setSelectedTab(aTab);
Clipperz.NotificationCenter.notify(this, 'tabSelected', aTab);
}
},
//-------------------------------------------------------------------------
'selectTabHandler': function(anEvent) {
this.selectTab(anEvent.src().id);
},
//-------------------------------------------------------------------------
'handleSelectTabNotification': function(aNotificationEvent) {
var parameters;
var splittedParamters;
var targetTabPanel;
parameters = aNotificationEvent.parameters();
splittedParamters = parameters.split('.');
targetTabPanel = splittedParamters[0];
if (targetTabPanel == this.name()) {
this.selectTab(splittedParamters[1])
}
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,310 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; }
Clipperz.PM.Components.TextFormField = function(anElement, args) {
args = args || {};
//MochiKit.Logging.logDebug(">>> new TextFormField");
Clipperz.PM.Components.TextFormField.superclass.constructor.call(this, args);
this._element = anElement;
this._editMode = args.editMode || 'VIEW';
this._value = args.value || "";
this._inputElement = null;
this._wrapper = null;
this._multiline = args.multiline || false;
// this.multiline = args.multiline || true;
// this.editing = true;
// this.completeOnBlur = true;
// this.autoSizeTask = new YAHOO.ext.util.DelayedTask(this.autoSize, this);
// this.textSizeEl = Clipperz.YUI.DomHelper.append(document.body, {
// tag: 'div',
// cls: 'yinline-editor-sizer ' + (this.cls || '')
// });
this.render();
//MochiKit.Logging.logDebug("<<< new TextFormField");
return this;
};
YAHOO.extendX(Clipperz.PM.Components.TextFormField, Clipperz.PM.Components.BaseComponent, {
'toString': function() {
return "Clipperz.PM.Components.TextFormField";
},
//-----------------------------------------------------
'value': function() {
if (this.inputElement() != null) {
this._value = this.inputElement().dom.value;
}
return this._value;
// return this.inlineEditor().getValue();
},
'setValue': function(aValue) {
this._value = aValue;
// this.getElement('viewComponent_Content').update(aValue);
// this.inlineEditor().setValue(aValue);
},
//-----------------------------------------------------
'multiline': function() {
return this._multiline;
},
//-----------------------------------------------------
'editMode': function() {
return this._editMode;
},
'setEditMode': function(aValue) {
this._editMode = aValue;
},
//-----------------------------------------------------
'inputElement': function() {
return this._inputElement;
},
'setInputElement': function(aValue) {
this._inputElement = aValue;
},
//-----------------------------------------------------
'on': function(anEventName, anHandler, aScope, shouldOverride) {
//MochiKit.Logging.logDebug(">>> TextFormField.on - inputElement: " + this.inputElement());
return this.inputElement().on(anEventName, anHandler, aScope, shouldOverride);
//MochiKit.Logging.logDebug("<<< TextFormField.on - inputElement: " + this.inputElement());
},
//-----------------------------------------------------
'wrapper': function() {
return this._wrapper;
},
//-----------------------------------------------------
'render': function() {
var editModeConfiguration;
var viewModeConfiguration;
editModeConfiguration = {tag:'div', id:this.getId('editComponent'), children:[]};
if (this.multiline() == false) {
editModeConfiguration.children.push({tag:'input', type:'text', id:this.getId('editComponent_input'), value:"this.value(1)"});
} else {
editModeConfiguration.children.push({tag:'textarea', id:this.getId('editComponent_input'), html:"this.value(2)"});
}
viewModeConfiguration = {tag:'div', id:this.getId('viewComponent'), /*style:'border: 1px solid blue;',*/ children:[
{tag:'span', id:this.getId('viewComponent_Content'), html:this.value()}
]}
//MochiKit.Logging.logDebug(">>> TextFormField.render");
this._wrapper = Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'div', id:this.getId('wrapper'), children:[
{tag:'div', id:this.getId('editModeBox'), children:[editModeConfiguration]},
{tag:'div', id:this.getId('viewModeBox'), children:[viewModeConfiguration]}
]}, true);
this.getElement('editModeBox').setVisibilityMode(YAHOO.ext.Element.DISPLAY);
this.getElement('viewModeBox').setVisibilityMode(YAHOO.ext.Element.DISPLAY);
this.getElement('editComponent_input').dom.value = this.value();
this.setInputElement(this.getElement('editComponent_input'));
this.update();
//MochiKit.Logging.logDebug("<<< TextFormField.render");
},
//-----------------------------------------------------
'update': function(args) {
args = args || {};
//MochiKit.Logging.logDebug(">>> TextFormField.update");
if (typeof(args.value) != 'undefined') {
this.setValue(args.value);
}
if (typeof(args.editMode) != 'undefined') {
this.setEditMode(args.editMode)
}
if (this.editMode() == 'VIEW') {
this.updateViewMode();
} else if (this.editMode() == 'EDIT') {
this.updateEditMode();
} else {
// ?????
}
//MochiKit.Logging.logDebug("<<< TextFormField.update");
},
//-----------------------------------------------------
'updateEditMode': function() {
//MochiKit.Logging.logDebug(">>> TextFormField.updateEditMode");
this.getElement('viewModeBox').hide();
this.getElement('editModeBox').show();
if (this.multiline() == false) {
this.getElement('editComponent_input').dom.value = this.value();
} else {
this.getElement('editComponent_input').update(Clipperz.Base.sanitizeString(this.value()));
}
//MochiKit.Logging.logDebug("<<< TextFormField.updateEditMode");
},
//-----------------------------------------------------
'updateViewMode': function() {
//MochiKit.Logging.logDebug(">>> TextFormField.updateViewMode");
this.getElement('editModeBox').hide();
this.getElement('viewModeBox').show();
this.getElement('viewComponent_Content').update(Clipperz.Base.sanitizeString(this.value()));
//MochiKit.Logging.logDebug("<<< TextFormField.updateViewMode");
},
//#####################################################
//#####################################################
//#####################################################
//#####################################################
/*
'onEnter': function(k, e) {
MochiKit.Logging.logDebug(">>> TextFormField.onEnter");
if (this.multiline && (e.ctrlKey || e.shiftKey)) {
return;
} else {
this.completeEdit();
e.stopEvent();
}
MochiKit.Logging.logDebug("<<< TextFormField.onEnter");
},
//-----------------------------------------------------
'onEsc': function() {
MochiKit.Logging.logDebug(">>> TextFormField.onEsc");
// if (this.ignoreNoChange) {
// this.revert(true);
// } else {
this.revert(false);
this.completeEdit();
// }
MochiKit.Logging.logDebug("<<< TextFormField.onEsc");
},
//-----------------------------------------------------
onBlur : function(){
MochiKit.Logging.logDebug(">>> TextFormField.onBlur");
if (this.editing && this.completeOnBlur !== false) {
this.completeEdit();
}
MochiKit.Logging.logDebug("<<< TextFormField.onBlur");
},
//-----------------------------------------------------
'onKeyUp': function(e) {
var k = e.getKey();
if (this.editing && (k < 33 || k > 40) && k != 27) {
this.autoSizeTask.delay(50);
}
},
//-----------------------------------------------------
'autoSize': function() {
var el = this.inputElement();
var wrap = this.getElement('editComponent');
var v = el.dom.value;
var ts = this.textSizeEl;
if (v.length < 1) {
ts.innerHTML = "&#160;&#160;";
} else {
v = v.replace(/[<> ]/g, '&#160;');
if (this.multiline) {
v = v.replace(/\n/g, '<br />&#160;');
}
ts.innerHTML = v;
}
var ww = wrap.dom.offsetWidth;
var wh = wrap.dom.offsetHeight;
var w = ts.offsetWidth;
var h = ts.offsetHeight;
// lots of magic numbers in this block - wtf?
// the logic is to prevent the scrollbars from flashing
// in firefox. Updates the right element first
// so there's never overflow.
if (ww > w+4) {
el.setWidth(w+4);
wrap.setWidth(w+8);
} else {
wrap.setWidth(w+8);
el.setWidth(w+4);
}
if (wh > h+4) {
el.setHeight(h);
wrap.setHeight(h+4);
} else {
wrap.setHeight(h+4);
el.setHeight(h);
}
},
//-----------------------------------------------------
'completeEdit': function() {
MochiKit.Logging.logDebug(">>> TextFormField.completeEdit");
},
'revert': function() {
MochiKit.Logging.logDebug(">>> TextFormField.revert");
},
*/
//-----------------------------------------------------
__syntaxFix__: '__syntaxFix__'
});

View File

@@ -0,0 +1,584 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
//-----------------------------------------------------------------------------
//
// Abstract C O N N E C T I O N class
//
//-----------------------------------------------------------------------------
Clipperz.PM.Connection = function (args) {
args = args || {};
this._user = args.user;
this._clipperz_pm_crypto_version = null;
this._connectionId = null;
this._oneTimePassword = null;
return this;
}
Clipperz.PM.Connection.prototype = MochiKit.Base.update(null, {
'user': function() {
return this._user;
},
'toString': function() {
return "Connection [" + this.version() + "] - user: " + this.user();
},
//=========================================================================
'version': function() {
throw Clipperz.Base.exception.AbstractMethod;
},
'clipperz_pm_crypto_version': function() {
if (this._clipperz_pm_crypto_version == null) {
var connectionVersions;
var versions;
var version;
var i, c;
version = null;
connectionVersions = Clipperz.PM.Crypto.communicationProtocol.versions;
versions = MochiKit.Base.keys(connectionVersions);
c = versions.length;
for (i=0; i<c; i++) {
if (! (versions[i] == 'current')) {
if (this instanceof connectionVersions[versions[i]]) {
version = versions[i];
};
}
}
this._clipperz_pm_crypto_version = version;
}
return this._clipperz_pm_crypto_version;
},
//-------------------------------------------------------------------------
'defaultErrorHandler': function(anErrorString, anException) {
MochiKit.Logging.logError("### Connection.defaultErrorHandler: " + anErrorString + " (" + anException + ")");
},
//-------------------------------------------------------------------------
'login': function(someArguments, aCallback) {
throw Clipperz.Base.exception.AbstractMethod;
},
//-------------------------------------------------------------------------
'message': function(someArguments, aCallback) {
throw Clipperz.Base.exception.AbstractMethod;
},
//-------------------------------------------------------------------------
'sharedSecret': function() {
throw Clipperz.Base.exception.AbstractMethod;
},
'serverSideUserCredentials': function() {
throw Clipperz.Base.exception.AbstractMethod;
},
//=========================================================================
'connectionId': function() {
return this._connectionId;
},
'setConnectionId': function(aValue) {
this._connectionId = aValue;
},
//=========================================================================
'oneTimePassword': function() {
return this._oneTimePassword;
},
'setOneTimePassword': function(aValue) {
this._oneTimePassword = aValue;
},
//=========================================================================
__syntaxFix__: "syntax fix"
}
);
if (typeof(Clipperz.PM.Connection.SRP) == 'undefined') { Clipperz.PM.Connection.SRP = {}; }
//-----------------------------------------------------------------------------
//
// S R P [ 1 . 0 ] C O N N E C T I O N class
//
//-----------------------------------------------------------------------------
Clipperz.PM.Connection.SRP['1.0'] = function (args) {
args = args || {};
Clipperz.PM.Connection.call(this, args);
this._C = null;
this._P = null;
this._srpConnection = null;
return this;
}
Clipperz.PM.Connection.SRP['1.0'].prototype = MochiKit.Base.update(new Clipperz.PM.Connection(), {
'version': function() {
return '1.0';
},
//=========================================================================
'register': function(anInvitationCode) {
var deferredResult;
var parameters;
//MochiKit.Logging.logError(">>> Connection.register: " + this);
parameters = {};
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.register - 1: " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'registration_verify');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.register - 2: " + res); return res;});
deferredResult.addCallback(function(aConnection, anInvitationCode) {
var args;
args = {};
args.message = 'register';
args.version = aConnection.clipperz_pm_crypto_version();
args.invitationCode = anInvitationCode;
return args;
}, this);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.register - 3: " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'registration_sendingCredentials');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.register - 4: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.user(), 'encryptedData'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.register - 5: " + res); return res;});
deferredResult.addCallback(function(someParameters, anUser, anEncryptedData) {
var currentVersionConnection;
var args;
currentVersionConnection = new Clipperz.PM.Crypto.communicationProtocol.versions['current']({user:anUser});
args = someParameters
args.credentials = currentVersionConnection.serverSideUserCredentials();
args.user = anEncryptedData;
args.version = args.credentials.version;
args.message = "completeRegistration";
return args;
}, parameters, this.user());
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.register - 6: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Proxy.defaultProxy, 'registration'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.register - 7: " + Clipperz.Base.serializeJSON(res)); return res;});
deferredResult.addCallback(MochiKit.Base.bind(function(res) {
this.user().setLock(res['lock']);
return res;
}, this));
deferredResult.callback(anInvitationCode);
//MochiKit.Logging.logError("<<< Connection.register");
return deferredResult;
},
//=========================================================================
'login': function(isReconnecting) {
var deferredResult;
//MochiKit.Logging.logDebug(">>> Connection.login: "/* + this*/);
//MochiKit.Logging.logDebug("--- Connection.login - isReconnecting: " + (isReconnecting == true));
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.3.1 - Connection.login - 1: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'connection_sendingCredentials');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.3.2 - Connection.login - 2: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(function(aConnection) {
var args;
args = {};
args.message = 'connect';
args.version = aConnection.clipperz_pm_crypto_version();
args.parameters = {};
//MochiKit.Logging.logDebug("=== Connection.login - username: " + aConnection.srpConnection().C());
args.parameters['C'] = aConnection.srpConnection().C();
args.parameters['A'] = aConnection.srpConnection().A().asString(16);
if (isReconnecting == true) {
//MochiKit.Logging.logDebug("--- Connection.login - reconnecting");
//# args.parameters['reconnecting'] = "yes";
args.parameters['reconnecting'] = aConnection.connectionId();
}
//MochiKit.Logging.logDebug("--- Connection.login - args: " + Clipperz.Base.serializeJSON(args));
//MochiKit.Logging.logDebug("--- Connection.login - srp.a: " + aConnection.srpConnection().a().asString(16));
return args;
});
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.3.3 - Connection.login - 3: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Proxy.defaultProxy, 'handshake'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.3.4 - Connection.login - 4: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'connection_credentialVerification');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.3.5 - Connection.login - 5: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addErrback(MochiKit.Base.bind(function(res) {MochiKit.Logging.logDebug("ERROR - c: " + this.srpConnection().C() + " # version: " + this.clipperz_pm_crypto_version()); return res;}, this));
deferredResult.addCallback(MochiKit.Base.bind(function(someParameters) {
var args;
this.srpConnection().set_s(new Clipperz.Crypto.BigInt(someParameters['s'], 16));
this.srpConnection().set_B(new Clipperz.Crypto.BigInt(someParameters['B'], 16));
if (typeof(someParameters['oneTimePassword']) != 'undefined') {
this.setOneTimePassword(someParameters['oneTimePassword']);
}
args = {};
args.message = 'credentialCheck';
args.version = this.clipperz_pm_crypto_version();
args.parameters = {};
args.parameters['M1'] = this.srpConnection().M1();
return args;
}, this));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.3.6 - Connection.login - 6: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Proxy.defaultProxy, 'handshake'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.3.7 - Connection.login - 7: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
//# deferredResult.addCallback(MochiKit.Base.method(this, 'loginDone'));
deferredResult.addCallback(MochiKit.Base.bind(function(someParameters) {
var result;
//MochiKit.Logging.logDebug(">>> Connection.loginDone: " + this + " (M2: " + this.srpConnection().M2() + ")");
if (someParameters['M2'] == this.srpConnection().M2()) {
result = new MochiKit.Async.Deferred();
//MochiKit.Logging.logDebug("--- Connection.loginDone - someParameters: " + Clipperz.Base.serializeJSON(someParameters));
this.setConnectionId(someParameters['connectionId']);
this.user().setLoginInfo(someParameters['loginInfo']);
this.user().setShouldDownloadOfflineCopy(someParameters['offlineCopyNeeded']);
this.user().setLock(someParameters['lock']);
if (this.oneTimePassword() != null) {
result.addCallback(MochiKit.Base.method(this.user().oneTimePasswordManager(), 'archiveOneTimePassword', this.oneTimePassword()));
}
result.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'connection_loggedIn');
result.addCallback(MochiKit.Async.succeed, someParameters);
result.callback();
//MochiKit.Logging.logDebug("--- Connection.loginDone - 1 - result: "/* + Clipperz.Base.serializeJSON(result)*/);
} else {
//MochiKit.Logging.logDebug("--- Connection.loginDone - 2 - ERROR");
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
result = MochiKit.Async.fail(Clipperz.PM.Connection.exception.WrongChecksum);
}
//MochiKit.Logging.logDebug("<<< Connection.loginDone - result: " + Clipperz.Base.serializeJSON(result));
return result;
}, this));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.3.8 - Connection.login - 8: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.callback(this);
//MochiKit.Logging.logDebug("<<< Connection.login");
return deferredResult;
},
//=========================================================================
'logout': function() {
var deferredResult;
//MochiKit.Logging.logDebug(">>> Connection.logout: " + this);
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.logout - 1: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Proxy.defaultProxy, 'logout'), {});
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.logout - 2: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'resetSrpConnection'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.logout - 3: " + res); return res;});
deferredResult.callback();
//MochiKit.Logging.logDebug("<<< Connection.logout");
return deferredResult;
},
//=========================================================================
'message': function(aMessageName, someParameters) {
var args;
var deferredResult;
//MochiKit.Logging.logDebug(">>> Connection.message: " + this);
args = {}
args['message'] = aMessageName;
args['srpSharedSecret'] = this.srpConnection().K();
// args['lock'] = this.user().lock();
if (someParameters != null) {
args['parameters'] = someParameters;
} else {
args['parameters'] = {};
}
//MochiKit.Logging.logDebug("--- Connection.message - args: " + Clipperz.Base.serializeJSON(args));
// deferredResult = new MochiKit.Async.Deferred(); // ### ?????????????
return this.sendMessage(args);
},
//-------------------------------------------------------------------------
'sendMessage': function(someArguments) {
var deferredResult;
//MochiKit.Logging.logDebug(">>> Connection.sendMessage: " + this);
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.sendMessage - 1: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Proxy.defaultProxy, 'message'), someArguments);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.sendMessage - 2: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.bind(function(res) {
if (typeof(res['lock']) != 'undefined') {
this.user().setLock(res['lock']);
}
return res;
}, this));
deferredResult.addErrback(MochiKit.Base.method(this, 'messageExceptionHandler'), someArguments);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.sendMessage - 3: " + res); return res;});
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.sendMessage - 3: " + Clipperz.Base.serializeJSON(res)); return res;});
deferredResult.callback();
//MochiKit.Logging.logDebug("<<< Connection.sendMessage");
return deferredResult
},
//-------------------------------------------------------------------------
'messageExceptionHandler': function(anOriginalMessageArguments, anError) {
var result;
//MochiKit.Logging.logDebug(">>> Connection.messageExceptionHandler - this: " + this + ", anError: " + anError);
if (anError instanceof MochiKit.Async.CancelledError) {
//MochiKit.Logging.logDebug("--- Connection.messageExceptionHandler - 1");
result = anError;
//MochiKit.Logging.logDebug("--- Connection.messageExceptionHandler - 2");
} else {
//MochiKit.Logging.logDebug("--- Connection.messageExceptionHandler - 3 - anError.name: " + anError.name + ", message: " + anError.message);
if ((anError.message == 'Trying to communicate without an active connection') ||
(anError.message == 'No tollManager available for current session')
) {
//MochiKit.Logging.logDebug("--- Connection.messageExceptionHandler - 4");
result = this.reestablishConnection(anOriginalMessageArguments);
//MochiKit.Logging.logDebug("--- Connection.messageExceptionHandler - 5");
} else if (anError.message == 'Session with stale data') {
//MochiKit.Logging.logDebug("--- Connection.messageExceptionHandler - 5.1");
Clipperz.NotificationCenter.notify(this, 'EXCEPTION');
//MochiKit.Logging.logDebug("--- Connection.messageExceptionHandler - 5.2");
} else {
//MochiKit.Logging.logDebug("--- Connection.messageExceptionHandler - 6");
result = anError;
//MochiKit.Logging.logDebug("--- Connection.messageExceptionHandler - 7");
}
//MochiKit.Logging.logDebug("--- Connection.messageExceptionHandler - 8");
}
//MochiKit.Logging.logDebug("<<< Connection.messageExceptionHandler");
return result;;
},
//=========================================================================
'reestablishConnection': function(anOriginalMessageArguments) {
var deferredResult;
//MochiKit.Logging.logDebug("+++ Connection.reestablishConnection: " + Clipperz.Base.serializeJSON(anOriginalMessageArguments));
//MochiKit.Logging.logDebug(">>> Connection.reestablishConnection: " + this);
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.reestablishConnection 1: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'resetSrpConnection'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.reestablishConnection 2: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'login'), true);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.reestablishConnection 3: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.bind(function(aMessage) {
aMessage['srpSharedSecret'] = this.srpConnection().K();
return aMessage;
}, this), anOriginalMessageArguments);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.reestablishConnection 4: " + Clipperz.Base.serializeJSON(res)); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'sendMessage'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.reestablishConnection 5: " + res); return res;});
deferredResult.addErrback(Clipperz.NotificationCenter.deferredNotification, this, 'EXCEPTION', null);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Connection.reestablishConnection 6: " + res); return res;});
deferredResult.callback();
//MochiKit.Logging.logDebug("<<< Connection.reestablishConnection");
return deferredResult;
},
//=========================================================================
'sharedSecret': function() {
return this.srpConnection().K();
},
//=========================================================================
'serverSideUserCredentials': function() {
var result;
var newSrpConnection;
//MochiKit.Logging.logDebug(">>> Connection.serverSideUserCredentials");
newSrpConnection = new Clipperz.Crypto.SRP.Connection({ C:this.C(), P:this.P(), hash:this.hash() });
result = newSrpConnection.serverSideCredentials();
result['version'] = this.clipperz_pm_crypto_version();
//MochiKit.Logging.logDebug("<<< Connection.serverSideUserCredentials - result: " + Clipperz.Base.serializeJSON(result));
return result;
},
//=========================================================================
'C': function() {
if (this._C == null) {
this._C = this.hash()(new Clipperz.ByteArray(this.user().username())).toHexString().substring(2);
}
return this._C;
},
//-----------------------------------------------------------------------------
'P': function() {
if (this._P == null) {
this._P = this.hash()(new Clipperz.ByteArray(this.user().passphrase() + this.user().username())).toHexString().substring(2);
}
return this._P;
},
//-----------------------------------------------------------------------------
'hash': function() {
return Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].hash;
},
//-----------------------------------------------------------------------------
'srpConnection': function() {
if (this._srpConnection == null) {
this._srpConnection = new Clipperz.Crypto.SRP.Connection({ C:this.C(), P:this.P(), hash:this.hash() });
}
return this._srpConnection;
},
'resetSrpConnection': function() {
this._C = null;
this._P = null;
this._srpConnection = null;
},
//-----------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//-----------------------------------------------------------------------------
//
// S R P [ 1 . 1 ] C O N N E C T I O N class
//
//-----------------------------------------------------------------------------
Clipperz.PM.Connection.SRP['1.1'] = function (args) {
args = args || {};
Clipperz.PM.Connection.SRP['1.0'].call(this, args);
return this;
}
Clipperz.PM.Connection.SRP['1.1'].prototype = MochiKit.Base.update(new Clipperz.PM.Connection.SRP['1.0'](), {
'version': function() {
return '1.1';
},
//-----------------------------------------------------------------------------
'C': function() {
if (this._C == null) {
this._C = this.hash()(new Clipperz.ByteArray(this.user().username() + this.user().passphrase())).toHexString().substring(2);
}
return this._C;
},
//-----------------------------------------------------------------------------
'P': function() {
if (this._P == null) {
this._P = this.hash()(new Clipperz.ByteArray(this.user().passphrase() + this.user().username())).toHexString().substring(2);
}
return this._P;
},
//-----------------------------------------------------------------------------
'hash': function() {
return Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash;
},
//-----------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
Clipperz.PM.Connection.exception = {
WrongChecksum: new MochiKit.Base.NamedError("Clipperz.ByteArray.exception.InvalidValue")
};

View File

@@ -0,0 +1,503 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Crypto) == 'undefined') { Clipperz.PM.Crypto = {}; }
Clipperz.PM.Crypto.VERSION = "0.2";
Clipperz.PM.Crypto.NAME = "Clipperz.PM.Crypto";
MochiKit.Base.update(Clipperz.PM.Crypto, {
'__repr__': function () {
return "[" + this.NAME + " " + this.VERSION + "]";
},
//-------------------------------------------------------------------------
'toString': function () {
return this.__repr__();
},
//-------------------------------------------------------------------------
'communicationProtocol': {
'currentVersion': '0.2',
'versions': {
'0.1': Clipperz.PM.Connection.SRP['1.0'], //Clipperz.Crypto.SRP.versions['1.0'].Connection,
'0.2': Clipperz.PM.Connection.SRP['1.1'] //Clipperz.Crypto.SRP.versions['1.1'].Connection,
},
'fallbackVersions': {
'current': '0.1',
'0.2': '0.1',
'0.1': null
}
},
//-------------------------------------------------------------------------
'encryptingFunctions': {
'currentVersion': '0.3',
'versions': {
//#####################################################################
'0.1': {
'encrypt': function(aKey, aValue) {
return Clipperz.Crypto.Base.encryptUsingSecretKey(aKey, Clipperz.Base.serializeJSON(aValue));
},
'deferredEncrypt': function(aKey, aValue) {
var deferredResult;
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].encrypt, aKey, aValue);
deferredResult.callback();
return deferredResult;
},
'decrypt': function(aKey, aValue) {
var result;
if (aValue != null) {
result = Clipperz.Base.evalJSON(Clipperz.Crypto.Base.decryptUsingSecretKey(aKey, aValue));
} else {
result = null;
}
return result;
},
'deferredDecrypt': function(aKey, aValue) {
var deferredResult;
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].decrypt, aKey, aValue);
deferredResult.callback();
return deferredResult;
},
'hash': function(aValue) {
var result;
var strngResult;
stringResult = Clipperz.Crypto.Base.computeHashValue(aValue.asString()); // !!!!!!!
result = new Clipperz.ByteArray("0x" + stringResult);
return result;
}
},
//#####################################################################
'0.2': {
'encrypt': function(aKey, aValue, aNonce) {
var result;
var key, value;
var dataToEncrypt;
var encryptedData;
key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
value = new Clipperz.ByteArray(Clipperz.Base.serializeJSON(aValue));
dataToEncrypt = Clipperz.Crypto.SHA.sha_d256(value).appendBlock(value);
encryptedData = Clipperz.Crypto.AES.encrypt(key, dataToEncrypt, aNonce);
result = encryptedData.toBase64String();
return result;
},
'deferredEncrypt': function(aKey, aValue, aNonce) {
var deferredResult;
var key, value;
var dataToEncrypt;
var encryptedData;
key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
value = new Clipperz.ByteArray(Clipperz.Base.serializeJSON(aValue));
dataToEncrypt = Clipperz.Crypto.SHA.sha_d256(value).appendBlock(value);
deferredResult = new MochiKit.Async.Deferred()
deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, dataToEncrypt, aNonce);
deferredResult.addCallback(function(aResult) {
return aResult.toBase64String();
})
deferredResult.callback();
return deferredResult;
},
'decrypt': function(aKey, aValue) {
var result;
if (aValue != null) {
var key, value;
var decryptedData;
var decryptedData;
key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
value = new Clipperz.ByteArray().appendBase64String(aValue);
decryptedData = Clipperz.Crypto.AES.decrypt(key, value);
decryptedData = decryptedData.split((256/8));
try {
result = Clipperz.Base.evalJSON(decryptedData.asString());
} catch (exception) {
MochiKit.Logging.logError("Error while decrypting data");
throw Clipperz.Crypto.Base.exception.CorruptedMessage;
}
} else {
result = null;
}
return result;
},
'deferredDecrypt': function(aKey, aValue) {
var result;
if (aValue != null) {
var deferredResult;
var key, value;
var decryptedData;
result = new MochiKit.Async.Deferred();
key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
value = new Clipperz.ByteArray().appendBase64String(aValue);
deferredResult = new MochiKit.Async.Deferred()
deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value);
deferredResult.addCallback(function(aResult) {
var result;
var decryptedData;
decryptedData = aResult.split((256/8));
try {
result = Clipperz.Base.evalJSON(decryptedData.asString());
} catch (exception) {
MochiKit.Logging.logError("Error while decrypting data");
throw Clipperz.Crypto.Base.exception.CorruptedMessage;
}
return result;
})
deferredResult.callback();
result = deferredResult;
} else {
result = MochiKit.Async.succeed(null);
}
return result;
},
'hash': Clipperz.Crypto.SHA.sha_d256
},
//#####################################################################
'0.3': {
'encrypt': function(aKey, aValue, aNonce) {
var result;
var key, value;
var data;
var dataToEncrypt;
var encryptedData;
key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
value = Clipperz.Base.serializeJSON(aValue);
data = new Clipperz.ByteArray(value);
encryptedData = Clipperz.Crypto.AES.encrypt(key, data, aNonce);
result = encryptedData.toBase64String();
return result;
},
'deferredEncrypt': function(aKey, aValue, aNonce) {
var deferredResult;
var key, value;
var data;
var dataToEncrypt;
var encryptedData;
key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
value = Clipperz.Base.serializeJSON(aValue);
data = new Clipperz.ByteArray(value);
deferredResult = new MochiKit.Async.Deferred()
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Clipperz.PM.Crypto.deferredEncrypt - 1: " + res); return res;});
deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, data, aNonce);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Clipperz.PM.Crypto.deferredEncrypt - 2: " + res); return res;});
deferredResult.addCallback(function(aResult) {
return aResult.toBase64String();
})
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Clipperz.PM.Crypto.deferredEncrypt - 3: " + res); return res;});
deferredResult.callback();
return deferredResult;
},
'decrypt': function(aKey, aValue) {
var result;
if (aValue != null) {
var key, value;
var decryptedData;
var decryptedValue;
key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
value = new Clipperz.ByteArray().appendBase64String(aValue);
decryptedData = Clipperz.Crypto.AES.decrypt(key, value);
value = decryptedData.asString();
try {
result = Clipperz.Base.evalJSON(value);
} catch (exception) {
MochiKit.Logging.logError("Error while decrypting data");
throw Clipperz.Crypto.Base.exception.CorruptedMessage;
}
} else {
result = null;
}
return result;
},
'deferredDecrypt': function(aKey, aValue) {
var deferredResult;
// var now;
deferredResult = new MochiKit.Async.Deferred();
now = new Date;
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("[" + (new Date() - now) + "] Clipperz.PM.Crypto.deferredDecrypt - 1: " + res); return res;});
if (aValue != null) {
var key, value;
var decryptedData;
var decryptedValue;
key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
//MochiKit.Logging.logDebug("[" + (new Date() - now) + "] computed key");
value = new Clipperz.ByteArray().appendBase64String(aValue);
//MochiKit.Logging.logDebug("[" + (new Date() - now) + "] appendedBase64String");
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("[" + (new Date() - now) + "] Clipperz.PM.Crypto.deferredDecrypt - 1.1: " /* + res*/); return res;});
deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("[" + (new Date() - now) + "] Clipperz.PM.Crypto.deferredDecrypt - 2: " /* + res*/); return res;});
deferredResult.addCallback(MochiKit.Async.wait, 0.1);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("[" + (new Date() - now) + "] Clipperz.PM.Crypto.deferredDecrypt - 3: " /* + res*/); return res;});
deferredResult.addCallback(function(aResult) {
return aResult.asString();
});
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("[" + (new Date() - now) + "] Clipperz.PM.Crypto.deferredDecrypt - 4: " /* + res*/); return res;});
deferredResult.addCallback(MochiKit.Async.wait, 0.1);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("[" + (new Date() - now) + "] Clipperz.PM.Crypto.deferredDecrypt - 5: " /* + res*/); return res;});
deferredResult.addCallback(Clipperz.Base.evalJSON);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("[" + (new Date() - now) + "] Clipperz.PM.Crypto.deferredDecrypt - 6: " /* + res*/); return res;});
deferredResult.addErrback(function(anError) {
MochiKit.Logging.logError("Error while decrypting data");
throw Clipperz.Crypto.Base.exception.CorruptedMessage;
})
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("[" + (new Date() - now) + "] Clipperz.PM.Crypto.deferredDecrypt - 7: " /* + res*/); return res;});
} else {
deferredResult.addCallback(function() {
return null;
});
}
deferredResult.callback();
return deferredResult;
},
'hash': Clipperz.Crypto.SHA.sha_d256
},
//#####################################################################
/*
'0.4': {
'encrypt': function(aKey, aValue, aNonce) {
var result;
var key, value;
var data;
var dataToEncrypt;
var encryptedData;
//MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt");
key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 1");
value = Clipperz.Base.serializeJSON(aValue);
//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 2");
/ *
//MochiKit.Logging.logDebug("--> encrypt.fullSize: " + value.length);
value = value.replace(/":{"label":"/g, '":{l:"');
value = value.replace(/":{"key":"/g, '":{k:"');
value = value.replace(/":{"notes":"/g, '":{n:"');
value = value.replace(/":{"record":"/g, '":{r:"');
value = value.replace(/", "label":"/g, '",l:"');
value = value.replace(/", "favicon":"/g, '",f:"');
//MochiKit.Logging.logDebug("<-- encrypt.compressed: " + value.length);
* /
data = new Clipperz.ByteArray(value);
//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 3");
encryptedData = Clipperz.Crypto.AES.encrypt(key, data, aNonce);
//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 4");
result = encryptedData.toBase64String();
//MochiKit.Logging.logDebug("<<< [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt");
return result;
},
'decrypt': function(aKey, aValue) {
var result;
if (aValue != null) {
var key, value;
var decryptedData;
var decryptedValue;
key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
value = new Clipperz.ByteArray().appendBase64String(aValue);
decryptedData = Clipperz.Crypto.AES.decrypt(key, value);
value = decryptedData.asString();
/ *
value = value.replace(/":{l:"/g, '":{"label":"');
value = value.replace(/":{k:"/g, '":{"key":"');
value = value.replace(/":{n:"/g, '":{"notes":"');
value = value.replace(/":{r:"/g, '":{"record":"');
value = value.replace(/",l:"/g, '", "label":"');
value = value.replace(/",f:"/g, '", "favicon":"');
* /
try {
result = Clipperz.Base.evalJSON(value);
} catch (exception) {
MochiKit.Logging.logError("Error while decrypting data");
throw Clipperz.Crypto.Base.exception.CorruptedMessage;
}
} else {
result = null;
}
return result;
},
'hash': Clipperz.Crypto.SHA.sha_d256
},
*/
//#####################################################################
__syntaxFix__: "syntax fix"
}
},
//-------------------------------------------------------------------------
'encrypt': function(aKey, aValue, aVersion) {
return Clipperz.PM.Crypto.encryptingFunctions.versions[aVersion].encrypt(aKey, aValue);
},
'deferredEncrypt': function(aKey, aValue, aVersion) {
return Clipperz.PM.Crypto.encryptingFunctions.versions[aVersion].deferredEncrypt(aKey, aValue);
},
'encryptWithCurrentVersion': function(aKey, aValue) {
return Clipperz.PM.Crypto.encrypt(aKey, aValue, Clipperz.PM.Crypto.encryptingFunctions.currentVersion);
},
'deferredEncryptWithCurrentVersion': function(aKey, aValue) {
return Clipperz.PM.Crypto.deferredEncrypt(aKey, aValue, Clipperz.PM.Crypto.encryptingFunctions.currentVersion);
},
//.........................................................................
'decrypt': function(aKey, aValue, aVersion) {
return Clipperz.PM.Crypto.encryptingFunctions.versions[aVersion].decrypt(aKey, aValue);
},
'deferredDecrypt': function(aKey, aValue, aVersion) {
return Clipperz.PM.Crypto.encryptingFunctions.versions[aVersion].deferredDecrypt(aKey, aValue);
},
//-------------------------------------------------------------------------
'randomKey': function() {
return Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
},
//-------------------------------------------------------------------------
'passwordEntropy': function(aValue) {
var result;
var bitPerChar;
bitPerChar = 4;
if (/[a-z]/.test(aValue)) {
bitPerChar ++;
}
if (/[A-Z]/.test(aValue)) {
bitPerChar ++;
}
if (/[^a-zA-Z0-9]/.test(aValue)) {
bitPerChar ++;
}
//MochiKit.Logging.logDebug("--- bitPerChar: " + bitPerChar);
result = aValue.length * bitPerChar;
return result;
},
//-------------------------------------------------------------------------
'nullValue': "####",
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//*****************************************************************************
MochiKit.Base.update(Clipperz.PM.Crypto.communicationProtocol.versions, {
'current': Clipperz.PM.Crypto.communicationProtocol.versions[Clipperz.PM.Crypto.communicationProtocol.currentVersion]
});
MochiKit.Base.update(Clipperz.PM.Crypto.encryptingFunctions.versions, {
'current': Clipperz.PM.Crypto.encryptingFunctions.versions[Clipperz.PM.Crypto.encryptingFunctions.currentVersion]
});
//*****************************************************************************

View File

@@ -0,0 +1,536 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
//#############################################################################
Clipperz.PM.DataModel.DirectLogin = function(args) {
//MochiKit.Logging.logDebug(">>> new Clipperz.PM.DataModel.DirectLogin");
//console.log(">>> new Clipperz.PM.DataModel.DirectLogin - args: %o", args);
//console.log("--- formData: %s", Clipperz.Base.serializeJSON(args.formData));
args = args || {};
//MochiKit.Logging.logDebug("--- new Clipperz.PM.DataModel.DirectLogin - args: " + Clipperz.Base.serializeJSON(MochiKit.Base.keys(args)));
this._record = args.record || null;
this._label = args.label || "unnamed record"
this._reference = args.reference || Clipperz.PM.Crypto.randomKey();
this._favicon = args.favicon || null;
this._bookmarkletVersion = args.bookmarkletVersion || "0.1";
this._directLoginInputs = null;
this._formValues = args.formValues || {};
this.setFormData(args.formData || null);
//console.log("=== formData: %o", this.formData());
if (args.legacyBindingData == null) {
this.setBindingData(args.bindingData || null);
} else {
this.setLegacyBindingData(args.legacyBindingData);
}
this._fixedFavicon = null;
// this._formValues = args.formValues || (this.hasValuesToSet() ? {} : null);
//MochiKit.Logging.logDebug("<<< new Clipperz.PM.DataModel.DirectLogin");
return this;
}
Clipperz.PM.DataModel.DirectLogin.prototype = MochiKit.Base.update(null, {
'remove': function() {
this.record().removeDirectLogin(this);
},
//-------------------------------------------------------------------------
'record': function() {
return this._record;
},
//-------------------------------------------------------------------------
'user': function() {
return this.record().user();
},
//-------------------------------------------------------------------------
'reference': function() {
return this._reference;
},
//-------------------------------------------------------------------------
'label': function() {
return this._label;
},
'setLabel': function(aValue) {
this._label = aValue;
},
//-------------------------------------------------------------------------
'favicon': function() {
if (this._favicon == null) {
var actionUrl;
var hostname;
actionUrl = this.formData()['attributes']['action'];
hostname = actionUrl.replace(/^https?:\/\/([^\/]*)\/.*/, '$1');
this._favicon = "http://" + hostname + "/favicon.ico";
}
return this._favicon;
},
//-------------------------------------------------------------------------
'fixedFavicon': function() {
var result;
if (this._fixedFavicon == null) {
result = this.favicon();
if (Clipperz_IEisBroken) {
if (this.user().preferences().disableUnsecureFaviconLoadingForIE()) {
if (result.indexOf('https://') != 0) {
result = Clipperz.PM.Strings['defaultFaviconUrl_IE'];
this.setFixedFavicon(result);
}
}
}
} else {
result = this._fixedFavicon;
}
return result;
},
'setFixedFavicon': function(aValue) {
this._fixedFavicon = aValue;
},
//-------------------------------------------------------------------------
'bookmarkletVersion': function() {
return this._bookmarkletVersion;
},
'setBookmarkletVersion': function(aValue) {
this._bookmarkletVersion = aValue;
},
//-------------------------------------------------------------------------
'formData': function() {
return this._formData;
},
'setFormData': function(aValue) {
var formData;
//MochiKit.Logging.logDebug(">>> DirectLogin.setFormData - " + Clipperz.Base.serializeJSON(aValue));
switch (this.bookmarkletVersion()) {
case "0.2":
formData = aValue;
break;
case "0.1":
//MochiKit.Logging.logDebug("--- DirectLogin.setFormData - fixing form data from bookmarklet version 0.1");
formData = this.fixFormDataFromBookmarkletVersion_0_1(aValue);
break;
}
this._formData = aValue;
this.setBookmarkletVersion("0.2");
//MochiKit.Logging.logDebug("--- DirectLogin.setFormData - formData: " + Clipperz.Base.serializeJSON(formData));
if (formData != null) {
var i,c;
this._directLoginInputs = [];
c = formData['inputs'].length;
for (i=0; i<c; i++) {
var directLoginInput;
directLoginInput = new Clipperz.PM.DataModel.DirectLoginInput(this, formData['inputs'][i]);
this._directLoginInputs.push(directLoginInput);
}
}
//MochiKit.Logging.logDebug("<<< DirectLogin.setFormData");
},
'fixFormDataFromBookmarkletVersion_0_1': function(aValue) {
//{"type":"radio", "name":"action", "value":"new-user", "checked":false }, { "type":"radio", "name":"action", "value":"sign-in", "checked":true }
// ||
// \ /
// \/
//{"name":"dominio", "type":"radio", "options":[{"value":"@alice.it", "checked":true}, {"value":"@tin.it", "checked":false}, {"value":"@virgilio.it", "checked":false}, {"value":"@tim.it", "checked":false}]}
var result;
var inputs;
var updatedInputs;
var radios;
//MochiKit.Logging.logDebug(">>> DirectLogin.fixFormDataFromBookmarkletVersion_0_1");
result = aValue;
inputs = aValue['inputs'];
updatedInputs = MochiKit.Base.filter(function(anInput) {
var result;
var type;
type = anInput['type'] || 'text';
result = type.toLowerCase() != 'radio';
return result;
}, inputs);
radios = MochiKit.Base.filter(function(anInput) {
var result;
var type;
type = anInput['type'] || 'text';
result = type.toLowerCase() == 'radio';
return result;
}, inputs);
if (radios.length > 0) {
var updatedRadios;
updatedRadios = {};
MochiKit.Iter.forEach(radios, MochiKit.Base.bind(function(aRadio) {
var radioConfiguration;
radioConfiguration = updatedRadios[aRadio['name']];
if (radioConfiguration == null) {
radioConfiguration = {type:'radio', name:aRadio['name'], options:[]};
updatedRadios[aRadio['name']] = radioConfiguration;
}
// TODO: remove the value: field and replace it with element.dom.value = <some value>
radioConfiguration.options.push({value:aRadio['value'], checked:aRadio['checked']});
if ((aRadio['checked'] == true) && (this.formValues()[aRadio['name']] == null)) {
//MochiKit.Logging.logDebug("+++ setting value '" + aRadio['value'] + "' for key: '" + aRadio['name'] + "'");
this.formValues()[aRadio['name']] = aRadio['value'];
}
}, this))
updatedInputs = MochiKit.Base.concat(updatedInputs, MochiKit.Base.values(updatedRadios));
}
delete result.inputs;
result.inputs = updatedInputs;
//MochiKit.Logging.logDebug("<<< DirectLogin.fixFormDataFromBookmarkletVersion_0_1");
return result;
},
//.........................................................................
'directLoginInputs': function() {
return this._directLoginInputs;
},
//-------------------------------------------------------------------------
'formValues': function() {
return this._formValues;
},
'hasValuesToSet': function() {
var result;
//MochiKit.Logging.logDebug(">>> DirectLogin.hasValuesToSet");
if (this.directLoginInputs() != null) {
result = MochiKit.Iter.some(this.directLoginInputs(), MochiKit.Base.methodcaller('shouldSetValue'));
} else {
result = false;
}
//MochiKit.Logging.logDebug("<<< DirectLogin.hasValuesToSet");
return result;
},
// 'additionalValues': function() {
'inputsRequiringAdditionalValues': function() {
var result;
var inputs;
//MochiKit.Logging.logDebug(">>> DirectLogin.additionalValues");
result = {};
if (this.directLoginInputs() != null) {
inputs = MochiKit.Base.filter(MochiKit.Base.methodcaller('shouldSetValue'), this.directLoginInputs());
MochiKit.Iter.forEach(inputs, function(anInput) {
result[anInput.name()] = anInput;
})
}
//MochiKit.Logging.logDebug("<<< DirectLogin.additionalValues");
return result;
},
//-------------------------------------------------------------------------
'bindingData': function() {
return this._bindingData;
},
'setBindingData': function(aValue) {
//MochiKit.Logging.logDebug(">>> DirectLogin.setBindingData");
if (aValue != null) {
var bindingKey;
this._bindingData = aValue;
this._bindings = {};
for (bindingKey in aValue) {
var directLoginBinding;
directLoginBinding = new Clipperz.PM.DataModel.DirectLoginBinding(this, bindingKey, {fieldKey:aValue[bindingKey]});
this._bindings[bindingKey] = directLoginBinding;
}
} else {
var editableFields;
var bindings;
bindings = {};
editableFields = MochiKit.Base.filter(function(aField) {
var result;
var type;
type = aField['type'].toLowerCase();
result = ((type != 'hidden') && (type != 'submit') && (type != 'checkbox') && (type != 'radio') && (type != 'select'));
return result;
}, this.formData().inputs);
MochiKit.Iter.forEach(editableFields, function(anEditableField) {
bindings[anEditableField['name']] = new Clipperz.PM.DataModel.DirectLoginBinding(this, anEditableField['name']);
}, this);
this._bindings = bindings;
}
//MochiKit.Logging.logDebug("<<< DirectLogin.setBindingData");
},
'setLegacyBindingData': function(aValue) {
//MochiKit.Logging.logDebug(">>> DirectLogin.setLegacyBindingData");
var bindingKey;
this._bindingData = aValue;
this._bindings = {};
for (bindingKey in aValue) {
var directLoginBinding;
directLoginBinding = new Clipperz.PM.DataModel.DirectLoginBinding(this, bindingKey, {fieldName:aValue[bindingKey]});
this._bindings[bindingKey] = directLoginBinding;
}
//MochiKit.Logging.logDebug("<<< DirectLogin.setLegacyBindingData");
},
//.........................................................................
'bindings': function() {
return this._bindings;
},
//-------------------------------------------------------------------------
'serializedData': function() {
var result;
var bindingKey;
result = {};
// result.reference = this.reference();
result.label = this.label();
result.favicon = this.favicon() || "";
result.bookmarkletVersion = this.bookmarkletVersion();
result.formData = this.formData();
if (this.hasValuesToSet) {
result.formValues = this.formValues();
}
result.bindingData = {};
for (bindingKey in this.bindings()) {
result.bindingData[bindingKey] = this.bindings()[bindingKey].serializedData();
}
return result;
},
//-------------------------------------------------------------------------
'handleMissingFaviconImage': function(anEvent) {
anEvent.stop();
MochiKit.Signal.disconnectAll(anEvent.src());
this.setFixedFavicon(Clipperz.PM.Strings['defaultFaviconUrl']);
anEvent.src().src = this.fixedFavicon();
},
//=========================================================================
'runHttpAuthDirectLogin': function(aWindow) {
MochiKit.DOM.withWindow(aWindow, MochiKit.Base.bind(function() {
var completeUrl;
var url;
url = this.bindings()['url'].field().value();
if (/^https?\:\/\//.test(url) == false) {
url = 'http://' + url;
}
if (Clipperz_IEisBroken === true) {
completeUrl = url;
} else {
var username;
var password;
username = this.bindings()['username'].field().value();
password = this.bindings()['password'].field().value();
/(^https?\:\/\/)?(.*)/.test(url);
completeUrl = RegExp.$1 + username + ':' + password + '@' + RegExp.$2;
}
MochiKit.DOM.currentWindow().location.href = completeUrl;
}, this));
},
//-------------------------------------------------------------------------
'runSubmitFormDirectLogin': function(aWindow) {
MochiKit.DOM.withWindow(aWindow, MochiKit.Base.bind(function() {
var formElement;
var formSubmitFunction;
var submitButtons;
//MochiKit.Logging.logDebug("### runDirectLogin - 3");
// MochiKit.DOM.currentDocument().write('<html><head><title>' + this.label() + '</title><META http-equiv="Content-Type" content="text/html; charset=utf-8" /></head><body></body></html>')
//MochiKit.Logging.logDebug("### runDirectLogin - 3.1");
MochiKit.DOM.appendChildNodes(MochiKit.DOM.currentDocument().body, MochiKit.DOM.H3(null, "Loading " + this.label() + " ..."));
//MochiKit.Logging.logDebug("### runDirectLogin - 4");
//console.log(this.formData()['attributes']);
formElement = MochiKit.DOM.FORM(MochiKit.Base.update({id:'directLoginForm'}, { 'method':this.formData()['attributes']['method'],
'action':this.formData()['attributes']['action']}));
//MochiKit.Logging.logDebug("### runDirectLogin - 5");
formSubmitFunction = MochiKit.Base.method(formElement, 'submit');
//MochiKit.Logging.logDebug("### runDirectLogin - 6");
MochiKit.DOM.appendChildNodes(MochiKit.DOM.currentDocument().body,
MochiKit.DOM.DIV({style:'display:none; visibility:hidden;'}, formElement)
);
//MochiKit.Logging.logDebug("### runDirectLogin - 7");
MochiKit.DOM.appendChildNodes(formElement, MochiKit.Base.map( MochiKit.Base.methodcaller("formConfiguration"),
this.directLoginInputs()));
//MochiKit.Logging.logDebug("### runDirectLogin - 8");
submitButtons = MochiKit.Base.filter(function(anInputElement) {
//MochiKit.Logging.logDebug("### runDirectLogin - 8.1 - " + anInputElement);
//MochiKit.Logging.logDebug("### runDirectLogin - 8.2 - " + anInputElement.tagName);
//MochiKit.Logging.logDebug("### runDirectLogin - 8.3 - " + anInputElement.getAttribute('type'));
return ((anInputElement.tagName.toLowerCase() == 'input') && (anInputElement.getAttribute('type').toLowerCase() == 'submit'));
}, formElement.elements)
//MochiKit.Logging.logDebug("### runDirectLogin - 9");
if (submitButtons.length == 0) {
//MochiKit.Logging.logDebug("### OLD submit")
if (Clipperz_IEisBroken == true) {
//MochiKit.Logging.logDebug("### runDirectLogin - 10");
formElement.submit();
} else {
//MochiKit.Logging.logDebug("### runDirectLogin - 11");
formSubmitFunction();
}
} else {
//MochiKit.Logging.logDebug("### NEW submit")
submitButtons[0].click();
}
}, this));
},
//-------------------------------------------------------------------------
'runDirectLogin': function(aNewWindow) {
var newWindow;
//console.log("formData.attributes", this.formData()['attributes']);
// if (/^javascript/.test(this.formData()['attributes']['action'])) {
if ((/^(https?|webdav|ftp)\:/.test(this.formData()['attributes']['action']) == false) &&
(this.formData()['attributes']['type'] != 'http_auth'))
{
var messageBoxConfiguration;
if (typeof(aNewWindow) != 'undefined') {
aNewWindow.close();
}
messageBoxConfiguration = {};
messageBoxConfiguration.title = Clipperz.PM.Strings['VulnerabilityWarning_Panel_title'];
messageBoxConfiguration.msg = Clipperz.PM.Strings['VulnerabilityWarning_Panel_message'];
messageBoxConfiguration.animEl = YAHOO.ext.Element.get("mainDiv");
messageBoxConfiguration.progress = false;
messageBoxConfiguration.closable = false;
messageBoxConfiguration.buttons = {'cancel': Clipperz.PM.Strings['VulnerabilityWarning_Panel_buttonLabel']};
Clipperz.YUI.MessageBox.show(messageBoxConfiguration);
throw Clipperz.Base.exception.VulnerabilityIssue;
}
//MochiKit.Logging.logDebug("### runDirectLogin - 1 : " + Clipperz.Base.serializeJSON(this.serializedData()));
if (typeof(aNewWindow) == 'undefined') {
newWindow = window.open(Clipperz.PM.Strings['directLoginJumpPageUrl'], "");
} else {
newWindow = aNewWindow;
}
//MochiKit.Logging.logDebug("### runDirectLogin - 2");
if (this.formData()['attributes']['type'] == 'http_auth') {
this.runHttpAuthDirectLogin(newWindow);
} else {
this.runSubmitFormDirectLogin(newWindow)
}
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,113 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
//#############################################################################
Clipperz.PM.DataModel.DirectLoginBinding = function(aDirectLogin, aKey, args) {
//MochiKit.Logging.logDebug(">>> new DirectLoginBinding")
args = args || {};
//MochiKit.Logging.logDebug("--- new DirectLoginBinding - args: " + Clipperz.Base.serializeJSON(args));
this._directLogin = aDirectLogin || args.directLogin || null;
this._key = aKey;
this._fieldKey = args.fieldKey || null;
this._fieldName = args.fieldName || null;
//MochiKit.Logging.logDebug("<<< new DirectLoginBinding")
return this;
}
Clipperz.PM.DataModel.DirectLoginBinding.prototype = MochiKit.Base.update(null, {
'directLogin': function() {
return this._directLogin;
},
//-------------------------------------------------------------------------
'key': function() {
return this._key;
},
//-------------------------------------------------------------------------
'fieldKey': function() {
//MochiKit.Logging.logDebug("=== Clipperz.PM.DataModel.DirectLoginBinding.fieldKey");
//MochiKit.Logging.logDebug("=== Clipperz.PM.DataModel.DirectLoginBinding.fieldKey - " + this._fieldKey);
return this._fieldKey;
},
'setFieldKey': function(aValue) {
this._fieldKey = aValue;
},
'fieldName': function() {
return this._fieldName;
},
//-------------------------------------------------------------------------
'field': function() {
var result;
//MochiKit.Logging.logDebug(">>> Clipperz.PM.DataModel.DirectLoginBinding.field")
//MochiKit.Logging.logDebug("--- Clipperz.PM.DataModel.DirectLoginBinding.field - 1 - this.fieldKey(): " + this.fieldKey());
//MochiKit.Logging.logDebug("--- Clipperz.PM.DataModel.DirectLoginBinding.field - 2 - this.fieldName(): " + this.fieldName());
if (this.fieldKey() != null) {
result = this.directLogin().record().currentVersion().fields()[this.fieldKey()];
//MochiKit.Logging.logDebug("--- Clipperz.PM.DataModel.DirectLoginBinding.field - 3 - result: " + result);
} else if (this.fieldName() != null) {
result = this.directLogin().record().currentVersion().fieldWithName(this.fieldName());
//MochiKit.Logging.logDebug("--- Clipperz.PM.DataModel.DirectLoginBinding.field - 4 - result: " + result);
this.setFieldKey(result.key());
} else {
result = null;
}
//MochiKit.Logging.logDebug("<<< Clipperz.PM.DataModel.DirectLoginBinding.field")
return result;
},
//-------------------------------------------------------------------------
'serializedData': function() {
return this.fieldKey();
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,229 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
//#############################################################################
Clipperz.PM.DataModel.DirectLoginInput = function(aDirectLogin, args) {
args = args || {};
//console.log(">>> new DirectLoginInput - args: %o" + args);
this._directLogin = aDirectLogin;
this._args = args;
return this;
}
Clipperz.PM.DataModel.DirectLoginInput.prototype = MochiKit.Base.update(null, {
'directLogin': function() {
return this._directLogin;
},
//-------------------------------------------------------------------------
'args': function() {
return this._args;
},
//-------------------------------------------------------------------------
'name': function() {
return this.args()['name'];
},
//-------------------------------------------------------------------------
'type': function() {
var result;
result = this.args()['type'];
if (result != null) {
result = result.toLowerCase();
}
return result;
},
//-------------------------------------------------------------------------
'value': function() {
return this.args()['value'];
},
//-------------------------------------------------------------------------
'formConfiguration': function() {
var result;
//MochiKit.Logging.logDebug(">>> DirectLoginInput.formConfiguration - " + this.name());
if (this.shouldSetValue()) {
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 1");
switch (this.type()) {
case 'select':
var currentValue;
var options;
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 2");
currentValue = this.directLogin().formValues()[this.name()];
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 2.1");
options = this.args()['options'];
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 2.2");
result = MochiKit.DOM.SELECT({name:this.name()},
MochiKit.Base.map(function(anOption) {
var options;
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 2.3");
// TODO: remove the value: field and replace it with element.dom.value = <some value>
options = {value:anOption['value']};
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 2.4");
if (currentValue == anOption['value']) {
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 2.5");
options.selected = true;
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 2.6");
}
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 2.7");
return MochiKit.DOM.OPTION(options, anOption['label'])
}, options)
)
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 2.8");
break;
case 'checkbox':
var options;
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 3");
options = {type:'checkbox', name: this.name()};
if (this.directLogin().formValues()[this.name()] == true) {
options['checked'] = true;
};
result = MochiKit.DOM.INPUT(options, null);
break;
case 'radio':
var currentName;
var currentValue;
var options;
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 4");
currentName = this.name();
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 4.1");
currentValue = this.directLogin().formValues()[this.name()];
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 4.2");
options = this.args()['options'];
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 4.3");
result = MochiKit.DOM.DIV(null,
MochiKit.Base.map(function(anOption) {
var options;
var isChecked;
var inputNode;
var divNode;
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 4.4");
// TODO: remove the value: field and replace it with element.dom.value = <some value>
options = {type:'radio', name:currentName, value:anOption['value']}
isChecked = (currentValue == anOption['value']);
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 4.5");
if (isChecked) {
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 4.6");
options.checked = true;
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 4.7");
}
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 4.8 - options: " + Clipperz.Base.serializeJSON(options));
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 4.8 - value: " + anOption['value']);
if (Clipperz_IEisBroken == true) {
var checkedValue;
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 4.8.1");
checkedValue = (isChecked ? " CHECKED" : "");
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 4.8.2");
inputNode = MochiKit.DOM.currentDocument().createElement("<INPUT TYPE='RADIO' NAME='" + currentName + "' VALUE='" + anOption['value'] + "'" + checkedValue + ">");
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 4.8.3");
} else {
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 4.8.4");
inputNode = MochiKit.DOM.INPUT(options, anOption['value']);
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 4.8.5");
}
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 4.9");
divNode = MochiKit.DOM.DIV(null, inputNode);
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 4.10");
return divNode;
// return MochiKit.DOM.DIV(null, MochiKit.DOM.INPUT(options, anOption['value']));
}, options)
);
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 4.9");
break;
}
} else {
var binding;
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 5");
binding = this.directLogin().bindings()[this.name()];
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 6");
// TODO: remove the value: field and replace it with element.dom.value = <some value>
result = MochiKit.DOM.INPUT({
type:((this.type() != 'password') ? this.type() : 'text'),
// type:(((this.type() != 'password') && (this.type() != 'submit')) ? this.type() : 'text'),
name:this.name(),
value:((binding != null)? binding.field().value() : this.value())
}, null);
//MochiKit.Logging.logDebug("--- DirectLoginInput.formConfiguration - 7");
}
//MochiKit.Logging.logDebug("<<< DirectLoginInput.formConfiguration: ");
return result;
},
//-------------------------------------------------------------------------
'shouldSetValue': function() {
var type;
var result;
//MochiKit.Logging.logDebug(">>> DirectLoginInput.shouldSetValue");
type = this.type();
result = ((type == 'checkbox') || (type == 'radio') || (type == 'select'));
//if (result == true) {
// MochiKit.Logging.logDebug("DIRECT LOGIN INPUT need value: " + Clipperz.Base.serializeJSON(this.args()));
//}
//MochiKit.Logging.logDebug("<<< DirectLoginInput.shouldSetValue");
return result;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,192 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
//#############################################################################
Clipperz.PM.DataModel.DirectLoginReference = function(args) {
args = args || {};
//MochiKit.Logging.logDebug(">>> new DirectLoginReference: " + Clipperz.Base.serializeJSON(MochiKit.Base.keys(args)));
//MochiKit.Logging.logDebug(">>> new DirectLoginReference - record: " + args.record);
this._user = args.user;
if (args.directLogin != null) {
this._reference = args.directLogin.reference();
this._recordReference = args.directLogin.record().reference();
this._label = args.directLogin.label();
this._favicon = args.directLogin.favicon() || null;
this._directLogin = args.directLogin;
this._record = args.directLogin.record();
} else {
this._reference = args.reference;
this._recordReference = args.record;
this._label = args.label;
this._favicon = args.favicon || null;
this._directLogin = null;
this._record = null;
}
this._fixedFavicon = null;
return this;
}
Clipperz.PM.DataModel.DirectLoginReference.prototype = MochiKit.Base.update(null, {
'user': function() {
return this._user;
},
//-------------------------------------------------------------------------
'reference': function() {
return this._reference;
},
//-------------------------------------------------------------------------
'synchronizeValues': function(aDirectLogin) {
this._label = aDirectLogin.label();
this._favicon = aDirectLogin.favicon();
},
//-------------------------------------------------------------------------
'label': function() {
return this._label;
},
//-------------------------------------------------------------------------
'recordReference': function() {
return this._recordReference;
},
//-------------------------------------------------------------------------
'record': function() {
//MochiKit.Logging.logDebug(">>> DirectLoginReference.record");
if (this._record == null) {
this._record = this.user().records()[this.recordReference()];
}
//MochiKit.Logging.logDebug("<<< DirectLoginReference.record");
return this._record;
},
//-------------------------------------------------------------------------
'favicon': function() {
return this._favicon;
},
//-------------------------------------------------------------------------
'fixedFavicon': function() {
var result;
if (this._fixedFavicon == null) {
result = this.favicon();
if (Clipperz_IEisBroken && (this.user().preferences().disableUnsecureFaviconLoadingForIE()) && (result.indexOf('https://') != 0)) {
result = Clipperz.PM.Strings['defaultFaviconUrl_IE'];
this.setFixedFavicon(result);
}
} else {
result = this._fixedFavicon;
}
return result;
},
'setFixedFavicon': function(aValue) {
this._fixedFavicon = aValue;
},
//-------------------------------------------------------------------------
'setupJumpPageWindow': function(aWindow) {
//MochiKit.Logging.logDebug(">>> DirectLoginReference.setupJumpPageWindow - " + aWindow);
try {
MochiKit.DOM.withWindow(aWindow, MochiKit.Base.bind(function() {
MochiKit.DOM.appendChildNodes(MochiKit.DOM.currentDocument().body,
MochiKit.DOM.H1(null, "Loading " + this.label())
);
}, this));
} catch(e) {
MochiKit.Logging.logDebug("EXCEPTION: " + e);
}
//MochiKit.Logging.logDebug("<<< DirectLoginReference.setupJumpPageWindow");
},
//-------------------------------------------------------------------------
'deferredDirectLogin': function() {
var deferredResult;
//MochiKit.Logging.logDebug(">>> DirectLoginReference.deferredDirectLogin - " + this);
deferredResult = new MochiKit.Async.Deferred();
//MochiKit.Logging.logDebug("--- DirectLoginReference.deferredDirectLogin - 1");
deferredResult.addCallback(MochiKit.Base.method(this.record(), 'deferredData'));
//MochiKit.Logging.logDebug("--- DirectLoginReference.deferredDirectLogin - 2");
deferredResult.addCallback(function(aRecord, aDirectLoginReference) {
return aRecord.directLogins()[aDirectLoginReference];
}, this.record(), this.reference());
//MochiKit.Logging.logDebug("--- DirectLoginReference.deferredDirectLogin - 3");
deferredResult.callback();
//MochiKit.Logging.logDebug("<<< DirectLoginReference.deferredDirectLogin");
return deferredResult;
},
//-------------------------------------------------------------------------
'handleMissingFaviconImage': function(anEvent) {
//MochiKit.Logging.logDebug(">>> DirectLoginReference.handleMissingFaviconImage");
anEvent.stop();
MochiKit.Signal.disconnectAll(anEvent.src());
this.setFixedFavicon(Clipperz.PM.Strings['defaultFaviconUrl']);
//MochiKit.Logging.logDebug("--- DirectLoginReference.handleMissingFaviconImage - fixedFavicon: " + this.fixedFavicon());
//MochiKit.Logging.logDebug("--- DirectLoginReference.handleMissingFaviconImage - anEvent.src().src: " + anEvent.src().src);
// MochiKit.DOM.swapDOM(anEvent.src(), MochiKit.DOM.IMG({src:'this.fixedFavicon()'}));
anEvent.src().src = this.fixedFavicon();
//MochiKit.Logging.logDebug("<<< DirectLoginReference.handleMissingFaviconImage");
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,751 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
//#############################################################################
Clipperz.PM.DataModel.Header = function(args) {
args = args || {};
this._user = args.user;
this._serverData = null;
this._serverDataVersion = null;
this._jsonEvaledServerData = null;
this._decryptedLegacyServerData = null;
this._isDecryptingLegacyServerData = false;
this._decryptingLegacyServerDataPendingQueue = [];
this.resetUpdatedSections();
this._shouldLoadSections = {};
Clipperz.NotificationCenter.register(this.user(), 'updatedSection', this, 'updatedSectionHandler');
return this;
}
Clipperz.PM.DataModel.Header.prototype = MochiKit.Base.update(null, {
//-------------------------------------------------------------------------
'user': function() {
return this._user;
},
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
'updatedSections': function() {
return this._updatedSections;
},
'markSectionAsUpdated': function(aSectionName) {
this.updatedSections().push(aSectionName);
},
'resetUpdatedSections': function() {
this._updatedSections = []
},
'hasSectionBeenUpdated': function(aSectionName) {
return (this.updatedSections().join().indexOf(aSectionName) != -1);
},
'cachedServerDataSection': function(aSectionName) {
return (this.hasSectionBeenUpdated(aSectionName)) ? {} : this.jsonEvaledServerData()[aSectionName];
},
'updateAllSections': function() {
this.resetUpdatedSections();
this.markSectionAsUpdated('records');
this.markSectionAsUpdated('directLogins');
this.markSectionAsUpdated('preferences');
this.markSectionAsUpdated('oneTimePasswords');
return MochiKit.Async.succeed(this);
},
'updatedSectionHandler': function(anEvent) {
this.markSectionAsUpdated(anEvent.parameters());
},
//-------------------------------------------------------------------------
'getObjectKeyIndex': function(anObject) {
var result;
var itemReference;
var index;
result = {};
index = 0;
for (itemReference in anObject) {
result[itemReference] = index.toString();
index ++;
}
return result;
},
//-------------------------------------------------------------------------
'serializedDataWithRecordAndDirectLoginIndexes': function(aRecordIndexes, aDirectLoginIndexs) {
var result;
var records;
var recordReference;
//MochiKit.Logging.logDebug(">>> Header.serializedData");
result = {
'records': {},
'directLogins': {}
};
records = this.user().records();
for (recordReference in records) {
result['records'][aRecordIndexes[recordReference]] = this.user().records()[recordReference].headerData();
}
for (directLoginReference in this.user().directLoginReferences()) {
var currentDirectLogin;
var directLoginData;
currentDirectLogin = this.user().directLoginReferences()[directLoginReference];
if (aRecordIndexes[currentDirectLogin.recordReference()] != null) {
directLoginData = {
// reference: currentDirectLogin.reference(),
record: aRecordIndexes[currentDirectLogin.recordReference()].toString(),
label: currentDirectLogin.label(),
favicon: currentDirectLogin.favicon() || ""
}
result['directLogins'][aDirectLoginIndexs[directLoginReference]] = directLoginData;
}
}
//MochiKit.Logging.logDebug("<<< Header.serializedData - result: " + Clipperz.Base.serializeJSON(result));
//MochiKit.Logging.logDebug("<<< Header.serializedData");
return result;
},
//-------------------------------------------------------------------------
'encryptedData': function() {
var deferredResult;
var recordIndex;
var directLoginIndex;
var serializedData;
var result;
//MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] Header.encryptedData");
//MochiKit.Logging.logDebug("### Header.encryptedData - " + Clipperz.Base.serializeJSON(this.updatedSections()));
result = {
'records': this.cachedServerDataSection('records'),
'directLogins': this.cachedServerDataSection('directLogins'),
'preferences': this.cachedServerDataSection('preferences'),
'oneTimePasswords': this.cachedServerDataSection('oneTimePasswords'),
'version': '0.1'
};
if (this.hasSectionBeenUpdated('records')) {
recordIndex = this.getObjectKeyIndex(this.user().records());
result['records']['index'] = recordIndex;
} else {
recordIndex = result['records']['index'];
}
if (this.hasSectionBeenUpdated('directLogins')) {
directLoginIndex = this.getObjectKeyIndex(this.user().directLoginReferences());
result['directLogins']['index'] = directLoginIndex;
} else {
directLoginIndex = result['directLogins']['index'];
}
if (this.hasSectionBeenUpdated('records') || this.hasSectionBeenUpdated('directLogins')) {
serializedData = this.serializedDataWithRecordAndDirectLoginIndexes(recordIndex, directLoginIndex);
}
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 1: " + res); return res;});
if (this.hasSectionBeenUpdated('records')) {
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 1.1: " + res); return res;});
deferredResult.addCallback(function(anHeader, aResult, aSerializedData, aValue) {
return Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion(anHeader.user().passphrase(), aSerializedData['records']);
}, this, result, serializedData);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 1.2: " + res); return res;});
deferredResult.addCallback(function(anHeader, aResult, aValue) {
aResult['records']['data'] = aValue;
}, this, result);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 1.3: " + res); return res;});
}
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 2: " + res); return res;});
if (this.hasSectionBeenUpdated('directLogins')) {
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 2.1: " + res); return res;});
deferredResult.addCallback(function(anHeader, aResult, aSerializedData, aValue) {
return Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion(anHeader.user().passphrase(), aSerializedData['directLogins']);
}, this, result, serializedData);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 2.2: " + res); return res;});
deferredResult.addCallback(function(anHeader, aResult, aValue) {
aResult['directLogins']['data'] = aValue;
}, this, result);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 2.3: " + res); return res;});
}
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 3: " + res); return res;});
if (this.hasSectionBeenUpdated('preferences')) {
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 3.1: " + res); return res;});
deferredResult.addCallback(function(anHeader, aResult, aValue) {
return Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion(anHeader.user().passphrase(), anHeader.user().preferences().serializedData());
}, this, result);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 3.2: " + res); return res;});
deferredResult.addCallback(function(anHeader, aResult, aValue) {
aResult['preferences']['data'] = aValue;
}, this, result);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 3.3: " + res); return res;});
}
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 4: " + res); return res;});
if (this.hasSectionBeenUpdated('oneTimePasswords')) {
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 4.1: " + res); return res;});
// deferredResult.addCallback(MochiKit.Base.method(this, 'loadOneTimePasswords'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 4.2: " + res); return res;});
deferredResult.addCallback(function(anHeader, aResult, aValue) {
return Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion(anHeader.user().passphrase(), anHeader.user().oneTimePasswordManager().serializedData());
}, this, result);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 4.3: " + res); return res;});
deferredResult.addCallback(function(anHeader, aResult, aValue) {
aResult['oneTimePasswords']['data'] = aValue;
}, this, result);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 4.4: " + res); return res;});
}
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 5: " + res); return res;});
deferredResult.addCallback(function(anHeader, aResult, aValue) {
var serverData;
serverData = Clipperz.Base.serializeJSON(aResult);
anHeader.setServerData(serverData);
return serverData;
}, this, result);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.encryptedData - 6: " + res); return res;});
deferredResult.callback();
//MochiKit.Logging.logDebug("<<< [" + (new Date()).valueOf() + "] Header.encryptedData");
return deferredResult;
},
//-------------------------------------------------------------------------
'serverData': function() {
return this._serverData;
},
'setServerData': function(aValue) {
//MochiKit.Logging.logDebug(">>> Header.setServerData");
//MochiKit.Logging.logDebug("[start]=============================================");
//MochiKit.Logging.logDebug("SERVER_DATA: " + aValue);
//MochiKit.Logging.logDebug("[end]===============================================");
this._serverData = aValue;
//MochiKit.Logging.logDebug("--- Header.setServerData - 1");
this.resetUpdatedSections();
//MochiKit.Logging.logDebug("--- Header.setServerData - 2");
this.resetJsonEvaledServerData();
//MochiKit.Logging.logDebug("<<< Header.setServerData");
},
'jsonEvaledServerData': function() {
if (this._jsonEvaledServerData == null) {
this._jsonEvaledServerData = Clipperz.Base.evalJSON(this.serverData());
}
return this._jsonEvaledServerData;
},
'resetJsonEvaledServerData': function() {
this._jsonEvaledServerData = null;
},
//-------------------------------------------------------------------------
'serverDataVersion': function() {
return this._serverDataVersion;
},
'setServerDataVersion': function(aValue) {
this._serverDataVersion = aValue;
},
//-------------------------------------------------------------------------
'decryptedLegacyServerData': function() {
var deferredResult;
//MochiKit.Logging.logDebug(">>> Header.decryptedLegacyServerData");
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.decryptedLegacyServerData 1: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'updateAllSections'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.decryptedLegacyServerData 2: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
if (this._decryptedLegacyServerData == null) {
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.decryptedLegacyServerData 3: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'connection_decryptingUserData');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.decryptedLegacyServerData 4: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt, this.user().passphrase(), this.serverData(), this.serverDataVersion());
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.decryptedLegacyServerData 5: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(function(anHeader, aValue) {
anHeader._decryptedLegacyServerData = aValue;
}, this);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.decryptedLegacyServerData 6: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
};
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.decryptedLegacyServerData 7: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(function(anHeader) {
return anHeader._decryptedLegacyServerData;
}, this);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.decryptedLegacyServerData 8: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.callback();
//MochiKit.Logging.logDebug("<<< Header.decryptedLegacyServerData");
return deferredResult;
},
//-------------------------------------------------------------------------
'serverDataFormat': function() {
var result;
//MochiKit.Logging.logDebug(">>> Header.serverDataFormat");
if (this.serverData().charAt(0) == '{') {
var serverData;
serverData = Clipperz.Base.evalJSON(this.serverData());
result = serverData['version'];
} else {
result = 'LEGACY';
}
//MochiKit.Logging.logDebug("<<< Header.serverDataFormat");
return result;
},
//-------------------------------------------------------------------------
'extractHeaderDataFromUserDetails': function(someUserDetails) {
if (this.serverData() == null) {
this.setServerData(someUserDetails['header']);
this.setServerDataVersion(someUserDetails['version'])
}
},
//-------------------------------------------------------------------------
'extractDataWithKey': function(aKey) {
var deferredResult;
//MochiKit.Logging.logDebug(">>> Header.extractDataWithKey");
deferredResult = new MochiKit.Async.Deferred();
switch (this.serverDataFormat()) {
case 'LEGACY':
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.extractDataWithKey 1: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'decryptedLegacyServerData'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.extractDataWithKey 2: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(function(someDecryptedValues) {
return someDecryptedValues[aKey] || {};
})
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.extractDataWithKey 3: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
break;
case '0.1':
var data;
//# data = Clipperz.Base.evalJSON(this.serverData());
data = this.jsonEvaledServerData();
if (typeof(data[aKey]) != 'undefined') {
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.extractDataWithKey 4: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'connection_decryptingUserData');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.extractDataWithKey 5: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt, this.user().passphrase(), data[aKey]['data'], this.serverDataVersion());
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.extractDataWithKey 6: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(function(/*anHeader,*/ aKey, aData, aRecordIndex, aValue) {
var result;
//MochiKit.Logging.logDebug(">>> [start] ===============================================");
//MochiKit.Logging.logDebug("--- extractDataWithKey - 0 [" + aKey + "]: " + Clipperz.Base.serializeJSON(aValue));
//MochiKit.Logging.logDebug("<<< [end] =================================================");
if (aKey == 'records') {
var recordKey;
result = {};
for (recordKey in aData['index']) {
result[recordKey] = aValue[aData['index'][recordKey]];
}
} else if (aKey == 'directLogins') {
var recordKeyReversedIndex;
var recordKey;
var directLoginKey;
result = {};
recordKeyReversedIndex = {};
for (recordKey in aRecordIndex) {
recordKeyReversedIndex[aRecordIndex[recordKey]] = recordKey;
}
//MochiKit.Logging.logDebug("--- extractDataWithKey - 1 - aData['index']: " + Clipperz.Base.serializeJSON(aData['index']));
for (directLoginKey in aData['index']) {
try {
if ((aData['index'][directLoginKey] != null) && (aValue[aData['index'][directLoginKey]] != null)) {
result[directLoginKey] = aValue[aData['index'][directLoginKey]];
result[directLoginKey]['record'] = recordKeyReversedIndex[result[directLoginKey]['record']];
}
} catch(exception) {
// result[directLoginKey] has no properties
MochiKit.Logging.logDebug("[Header 391] EXCEPTION: " + exception);
throw exception;
}
}
//MochiKit.Logging.logDebug("--- extractDataWithKey - 2");
} else {
result = aValue;
}
return result;
}, /*this,*/ aKey, data[aKey], data['records']['index']);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.extractDataWithKey 6: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
} else {
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.extractDataWithKey 7: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Async.succeed, {});
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.extractDataWithKey 8: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
}
break;
}
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.extractDataWithKey 9: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.callback();
//MochiKit.Logging.logDebug("<<< Header.extractDataWithKey");
return deferredResult;
},
//-------------------------------------------------------------------------
'processRecordData': function(someRecordData) {
var records;
var recordReference;
//console.log("HeaderRecordData parameters", someRecordData);
//MochiKit.Logging.logDebug(">>> Header.processRecordData");
records = someRecordData;
//MochiKit.Logging.logDebug("--- Header.processRecordData - 1");
if (records != null) {
//MochiKit.Logging.logDebug("--- Header.processRecordData - records: " + Clipperz.Base.serializeJSON(records));
for (recordReference in records) {
var newRecord;
var parameters;
//MochiKit.Logging.logDebug("--- Header.processRecordData - 2 - recordReference: " + recordReference);
if (recordReference != "stacktrace") {
parameters = records[recordReference]; //.slice();
//MochiKit.Logging.logDebug("--- Header.processRecordData - 3");
if (typeof(parameters['notes']) != 'undefined') {
//MochiKit.Logging.logDebug("--- Header.processRecordData - 4");
if (parameters['notes'] != "") {
//MochiKit.Logging.logDebug("--- Header.processRecordData - 5");
parameters['headerNotes'] = parameters['notes'];
//MochiKit.Logging.logDebug("--- Header.processRecordData - 6");
}
//MochiKit.Logging.logDebug("--- Header.processRecordData - 7");
delete parameters['notes'];
//MochiKit.Logging.logDebug("--- Header.processRecordData - 8");
}
//MochiKit.Logging.logDebug("--- Header.processRecordData - 9");
parameters['reference'] = recordReference;
//MochiKit.Logging.logDebug("--- Header.processRecordData - 10");
parameters['user'] = this.user();
//MochiKit.Logging.logDebug("--- Header.processRecordData - 11");
newRecord = new Clipperz.PM.DataModel.Record(parameters);
//MochiKit.Logging.logDebug("--- Header.processRecordData - 12");
this.user().addRecord(newRecord, true);
//MochiKit.Logging.logDebug("--- Header.processRecordData - 13");
}
}
//MochiKit.Logging.logDebug("--- Header.processRecordData - 14");
Clipperz.NotificationCenter.notify(null, 'recordAdded', null, true);
//MochiKit.Logging.logDebug("--- Header.processRecordData - 15");
}
//MochiKit.Logging.logDebug("<<< Header.processRecordData");
return this.user().records();
},
//-------------------------------------------------------------------------
'processDirectLoginData': function(someDirectLoginData) {
var directLogins;
var directLoginReference;
//MochiKit.Logging.logDebug(">>> Header.processDirectLoginData");
directLogins = someDirectLoginData;
if (directLogins != null) {
for (directLoginReference in directLogins) {
var directLoginReference;
var parameters;
parameters = directLogins[directLoginReference]; //.slice();
parameters.user = this.user();
parameters.reference = directLoginReference;
directLoginReference = new Clipperz.PM.DataModel.DirectLoginReference(parameters);
if (directLoginReference.record() != null) {
this.user().addDirectLoginReference(directLoginReference, true);
}
}
}
Clipperz.NotificationCenter.notify(null, 'directLoginAdded', null, true);
//MochiKit.Logging.logDebug("<<< Header.processDirectLoginData");
return this.user().directLoginReferences();
},
//-------------------------------------------------------------------------
'shouldLoadSections': function() {
return this._shouldLoadSections;
},
'shouldLoadSection': function(aSectionName) {
var result;
if (typeof(this.shouldLoadSections()[aSectionName]) != 'undefined') {
result = this.shouldLoadSections()[aSectionName];
} else {
result = true;
}
return result;
},
'setShouldLoadSection': function(aSectionName, aValue) {
this.shouldLoadSections()[aSectionName] = aValue;
},
//-------------------------------------------------------------------------
'loadRecords': function() {
var deferredResult;
if (this.shouldLoadSection('records') == true) {
this.setShouldLoadSection('records', false);
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadRecords 1: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.user(), 'getUserDetails'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadRecords 2: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'extractHeaderDataFromUserDetails'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadRecords 3: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'extractDataWithKey', 'records'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadRecords 4: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'processRecordData'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadRecords 5: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.callback();
} else {
deferredResult = MochiKit.Async.succeed(this.user().records());
}
return deferredResult;
},
//-------------------------------------------------------------------------
'loadDirectLogins': function() {
var deferredResult;
if (this.shouldLoadSection('directLogins') == true) {
this.setShouldLoadSection('directLogins', false);
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadDirectLogins - 1: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.user(), 'getUserDetails'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadDirectLogins - 2: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'extractHeaderDataFromUserDetails'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadDirectLogins - 3: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'extractDataWithKey', 'directLogins'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadDirectLogins - 4: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'processDirectLoginData'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadDirectLogins - 5: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.callback();
} else {
deferredResult = MochiKit.Async.succeed(this.user().directLoginReferences());
}
return deferredResult;
},
//-------------------------------------------------------------------------
'loadPreferences': function() {
var deferredResult;
if (this.shouldLoadSection('preferences') == true) {
this.setShouldLoadSection('preferences', false);
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadPreferences - 1: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.user(), 'getUserDetails'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadPreferences - 2: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'extractHeaderDataFromUserDetails'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadPreferences - 3: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'extractDataWithKey', 'preferences'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadPreferences - 4: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.user().preferences(), 'updateWithData'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadPreferences - 5: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.callback();
} else {
deferredResult = MochiKit.Async.succeed(this.user().preferences());
}
return deferredResult;
},
//-------------------------------------------------------------------------
'loadOneTimePasswords': function() {
var deferredResult;
if (this.shouldLoadSection('oneTimePasswords') == true) {
this.setShouldLoadSection('oneTimePasswords', false);
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadOneTimePasswords - 1: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.user(), 'getUserDetails'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadOneTimePasswords - 2: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'extractHeaderDataFromUserDetails'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadOneTimePasswords - 3: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'extractDataWithKey', 'oneTimePasswords'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadOneTimePasswords - 4: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.user().oneTimePasswordManager(), 'updateWithData'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadOneTimePasswords - 5: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.user().connection(), 'message'), 'getOneTimePasswordsDetails', {});
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadOneTimePasswords - 6: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.user().oneTimePasswordManager(), 'updateWithServerData'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadOneTimePasswords - 7: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.callback();
} else {
deferredResult = MochiKit.Async.succeed(this.user().oneTimePasswordManager());
}
return deferredResult;
},
//-------------------------------------------------------------------------
'loadAllSections': function() {
var deferredResult;
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadAllSections - 1: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'loadRecords'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadAllSections - 2: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'loadDirectLogins'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadAllSections - 3: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'loadPreferences'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadAllSections - 4: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'loadOneTimePasswords'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Header.loadAllSections - 5: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.callback();
return deferredResult;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,333 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
//#############################################################################
Clipperz.PM.DataModel.OneTimePassword = function(args) {
args = args || {};
//console.log("new OneTimePassword", args);
//MochiKit.Logging.logDebug("---");
this._user = args['user'];
this._password = args['password'];
this._passwordValue = Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword(args['password']);
this._reference = args['reference'] || Clipperz.PM.Crypto.randomKey();
this._creationDate = args['created'] ? Clipperz.PM.Date.parseDateWithUTCFormat(args['created']) : new Date();
this._usageDate = args['used'] ? Clipperz.PM.Date.parseDateWithUTCFormat(args['used']) : null;
this._status = args['status'] || 'ACTIVE';
this._connectionInfo = null;
this._key = null;
this._keyChecksum = null;
return this;
}
Clipperz.PM.DataModel.OneTimePassword.prototype = MochiKit.Base.update(null, {
'toString': function() {
return "Clipperz.PM.DataModel.OneTimePassword";
},
//-------------------------------------------------------------------------
'user': function() {
return this._user;
},
//-------------------------------------------------------------------------
'password': function() {
return this._password;
},
//-------------------------------------------------------------------------
'passwordValue': function() {
return this._passwordValue;
},
//-------------------------------------------------------------------------
'creationDate': function() {
return this._creationDate;
},
//-------------------------------------------------------------------------
'reference': function() {
return this._reference;
},
//-------------------------------------------------------------------------
'key': function() {
if (this._key == null) {
this._key = Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(this.user().username(), this.passwordValue());
}
return this._key;
},
//-------------------------------------------------------------------------
'keyChecksum': function() {
if (this._keyChecksum == null) {
this._keyChecksum = Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(this.user().username(), this.passwordValue());
}
return this._keyChecksum;
},
//-------------------------------------------------------------------------
'status': function() {
return this._status;
},
'setStatus': function(aValue) {
this._status = aValue;
},
//-------------------------------------------------------------------------
'serializedData': function() {
var result;
result = {
'password': this.password(),
'created': this.creationDate() ? Clipperz.PM.Date.formatDateWithUTCFormat(this.creationDate()) : null,
'used': this.usageDate() ? Clipperz.PM.Date.formatDateWithUTCFormat(this.usageDate()) : null,
'status': this.status()
};
return result;
},
//-------------------------------------------------------------------------
'packedPassphrase': function() {
var result;
var packedPassphrase;
var encodedPassphrase;
var prefixPadding;
var suffixPadding;
var getRandomBytes;
getRandomBytes = MochiKit.Base.method(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'getRandomBytes');
encodedPassphrase = new Clipperz.ByteArray(this.user().passphrase()).toBase64String();
//MochiKit.Logging.logDebug("--- encodedPassphrase.length: " + encodedPassphrase.length);
prefixPadding = getRandomBytes(getRandomBytes(1).byteAtIndex(0)).toBase64String();
//MochiKit.Logging.logDebug("--- prefixPadding.length: " + prefixPadding.length);
suffixPadding = getRandomBytes((500 - prefixPadding.length - encodedPassphrase.length) * 6 / 8).toBase64String();
//MochiKit.Logging.logDebug("--- suffixPadding.length: " + suffixPadding.length);
//MochiKit.Logging.logDebug("--- total.length: " + (prefixPadding.length + encodedPassphrase.length + suffixPadding.length));
packedPassphrase = {
'prefix': prefixPadding,
'passphrase': encodedPassphrase,
'suffix': suffixPadding
};
// result = Clipperz.Base.serializeJSON(packedPassphrase);
result = packedPassphrase;
//MochiKit.Logging.logDebug("===== OTP packedPassprase: [" + result.length + "]" + result);
//MochiKit.Logging.logDebug("<<< OneTimePassword.packedPassphrase");
return result;
},
//-------------------------------------------------------------------------
'encryptedPackedPassphrase': function() {
return Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion(this.passwordValue(), this.packedPassphrase())
},
//-------------------------------------------------------------------------
'encryptedData': function() {
var deferredResult;
var result;
//MochiKit.Logging.logDebug(">>> OneTimePassword.encryptedData");
//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - id: " + this.reference());
result = {
'reference': this.reference(),
'key': this.key(),
'keyChecksum': this.keyChecksum(),
'data': "",
'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion
}
//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 2: " + Clipperz.Base.serializeJSON(result));
deferredResult = new MochiKit.Async.Deferred();
//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 3");
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.encryptedData - 1: " + res); return res;});
//# deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion, this.passwordValue(), this.packedPassphrase());
deferredResult.addCallback(MochiKit.Base.method(this, 'encryptedPackedPassphrase'));
//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 4");
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.encryptedData - 2: [" + res.length + "]" + res); return res;});
deferredResult.addCallback(function(aResult, res) {
aResult['data'] = res;
return aResult;
}, result);
//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 5");
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.encryptedData - 3: " + Clipperz.Base.serializeJSON(res)); return res;});
deferredResult.callback();
//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 6");
return deferredResult;
},
//-------------------------------------------------------------------------
'saveChanges': function() {
var deferredResult;
var result;
//MochiKit.Logging.logDebug(">>> OneTimePassword.saveChanges");
result = {};
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_encryptUserData');
deferredResult.addCallback(MochiKit.Base.method(this.user(), 'encryptedData'));
deferredResult.addCallback(function(aResult, res) {
aResult['user'] = res;
return aResult;
}, result);
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_encryptOTPData');
deferredResult.addCallback(MochiKit.Base.method(this, 'encryptedData'));
deferredResult.addCallback(function(aResult, res) {
aResult['oneTimePassword'] = res;
return aResult;
}, result);
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_sendingData');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.saveChanges - 1: " + Clipperz.Base.serializeJSON(res)); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.user().connection(), 'message'), 'addNewOneTimePassword');
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_updatingInterface');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.saveChanges - 2: " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'notify', 'OTPUpdated');
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'oneTimePassword_saveChanges_done', null);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.saveChanges - 2: " + res); return res;});
deferredResult.callback();
//MochiKit.Logging.logDebug("<<< OneTimePassword.saveChanges");
return deferredResult;
},
//-------------------------------------------------------------------------
'usageDate': function() {
return this._usageDate;
},
'setUsageDate': function(aValue) {
this._usageDate = aValue;
},
//-------------------------------------------------------------------------
'connectionInfo': function() {
return this._connectionInfo;
},
'setConnectionInfo': function(aValue) {
this._connectionInfo = aValue;
},
//-------------------------------------------------------------------------
'isExpired': function() {
return (this.usageDate() != null);
},
//-------------------------------------------------------------------------
'updateStatusWithValues': function(someValues) {
var result;
result = false;
if (someValues['status'] != this.status()) {
result = true;
}
this.setStatus(someValues['status']);
this.setUsageDate(Clipperz.PM.Date.parseDateWithUTCFormat(someValues['requestDate']));
this.setConnectionInfo(someValues['connection']);
return result;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//=============================================================================
Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword = function(anUsername, aPassword) {
return Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aPassword)).toHexString().substring(2);
}
Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword = function(anUsername, aPassword) {
return Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(anUsername + aPassword)).toHexString().substring(2);
}
//=============================================================================
Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword = function(aPassword) {
var result;
if (aPassword.replace(/[\s\-]/g, '').length == 32) {
try {
var passwordByteArray;
passwordByteArray = new Clipperz.ByteArray();
passwordByteArray.appendBase32String(aPassword);
result = passwordByteArray.toBase64String();
} catch(exception) {
result = aPassword;
}
} else {
result = aPassword;
}
return result;
}
//=============================================================================

View File

@@ -0,0 +1,280 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
//#############################################################################
Clipperz.PM.DataModel.OneTimePasswordManager = function(anUser, args) {
args = args || {};
this._user = anUser;
this._oneTimePasswords = {};
this.updateWithData(args);
Clipperz.NotificationCenter.notify(null, 'oneTimePasswordAdded', null, true);
return this;
}
Clipperz.PM.DataModel.OneTimePasswordManager.prototype = MochiKit.Base.update(null, {
'toString': function() {
return "Clipperz.PM.DataModel.OneTimePasswordManager";
},
//-------------------------------------------------------------------------
'updateWithData': function(someValues) {
var otpReference;
//console.log("OneTimePasswordManager.updateWithData", someValues);
//MochiKit.Logging.logDebug("OneTimePasswordManager.updateWithData: " + Clipperz.Base.serializeJSON(someValues));
for (otpReference in someValues) {
var otp;
var otpConfiguration;
otpConfiguration = someValues[otpReference];
otpConfiguration['user'] = this.user();
otpConfiguration['reference'] = otpReference;
otp = new Clipperz.PM.DataModel.OneTimePassword(otpConfiguration);
this._oneTimePasswords[otpReference] = otp;
}
return this;
},
//-------------------------------------------------------------------------
'updateWithServerData': function(someValues) {
var deferredResult;
var oneTimePasswordReference;
var wereChangesApplied;
//MochiKit.Logging.logDebug(">>> OneTimePasswordManager.updateWithServerData");
deferredResult = new MochiKit.Async.Deferred();
wereChangesApplied = false;
for (oneTimePasswordReference in someValues) {
var oneTimePassword;
oneTimePassword = this.oneTimePasswordWithReference(oneTimePasswordReference);
if (oneTimePassword != null) {
var oneTimePasswordHasBeenUpdated;
oneTimePasswordHasBeenUpdated = oneTimePassword.updateStatusWithValues(someValues[oneTimePasswordReference]);
wereChangesApplied = oneTimePasswordHasBeenUpdated || wereChangesApplied;
} else {
}
}
if (wereChangesApplied == true) {
this.user().header().markSectionAsUpdated('oneTimePasswords');
}
for (oneTimePasswordReference in this.oneTimePasswords()) {
if (typeof(someValues[oneTimePasswordReference]) == 'undefind') {
deferredResult.addCallback(MochiKit.Base.method(this.oneTimePasswordWithReference(oneTimePasswordReference), 'saveChanges'));
}
}
deferredResult.addCallback(MochiKit.Async.succeed, this);
deferredResult.callback();
//MochiKit.Logging.logDebug("<<< OneTimePasswordManager.updateWithServerData");
return deferredResult;
},
//-------------------------------------------------------------------------
'user': function() {
return this._user;
},
//-------------------------------------------------------------------------
'addOneTimePassword': function(aOneTimePassword, isBatchUpdate) {
this.oneTimePasswords()[aOneTimePassword.reference()] = aOneTimePassword;
if (isBatchUpdate != true) {
Clipperz.NotificationCenter.notify(aOneTimePassword, 'oneTimePasswordAdded');
Clipperz.NotificationCenter.notify(this.user(), 'updatedSection', 'oneTimePasswords', true);
}
},
//-------------------------------------------------------------------------
'archiveOneTimePassword': function(aOneTimePasswordReference) {
var deferredResult;
//MochiKit.Logging.logDebug(">>> OneTimePasswordManager.archiveOneTimePassword");
//MochiKit.Logging.logDebug("--- OneTimePasswordManager.archiveOneTimePassword - 0 otp.reference: " + aOneTimePasswordReference);
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(MochiKit.Base.method(this.user(), 'loadOneTimePasswords'));
deferredResult.addCallback(MochiKit.Base.bind(function(aOneTimePasswordReference) {
var oneTimePassword;
//MochiKit.Logging.logDebug("--- OneTimePasswordManager.archiveOneTimePassword - 1 serializedData: " + Clipperz.Base.serializeJSON(this.serializedData()));
oneTimePassword = this.oneTimePasswords()[aOneTimePasswordReference];
if (oneTimePassword != null) {
oneTimePassword.setUsageDate(new Date());
// while (this.usedOneTimePasswords().length > 10) {
// var referenceOfOneTimePasswordToRemove;
//
// referenceOfOneTimePasswordToRemove = this.usedOneTimePasswords()[0];
// delete this.oneTimePasswords()[referenceOfOneTimePasswordToRemove];
// this.usedOneTimePasswords().shift();
// }
Clipperz.NotificationCenter.notify(this.user(), 'updatedSection', 'oneTimePasswords', true);
} else {
MochiKit.Logging.logError("### OneTimePasswordManager.archiveOneTimePassword - the used OneTimePassword has not been found on the index-card. :-(");
}
//MochiKit.Logging.logDebug("--- OneTimePasswordManager.archiveOneTimePassword - 2 serializedData: " + Clipperz.Base.serializeJSON(this.serializedData()));
}, this), aOneTimePasswordReference);
deferredResult.addCallback(MochiKit.Base.method(this, 'saveChanges'));
deferredResult.callback();
//MochiKit.Logging.logDebug("<<< OneTimePasswordManager.archiveOneTimePassword");
return deferredResult;
},
//-------------------------------------------------------------------------
'serializedData': function() {
var result;
var key;
result = {};
for (key in this.oneTimePasswords()) {
result[key] = this.oneTimePasswords()[key].serializedData();
}
return result;
},
//-------------------------------------------------------------------------
'oneTimePasswords': function() {
return this._oneTimePasswords;
},
//-------------------------------------------------------------------------
'oneTimePasswordWithReference': function(aOneTimePasswordReference) {
return this.oneTimePasswords()[aOneTimePasswordReference];
},
//-------------------------------------------------------------------------
'deleteOneTimePasswordWithReference': function(aOneTimePasswordReference) {
delete(this.oneTimePasswords()[aOneTimePasswordReference]);
Clipperz.NotificationCenter.notify(this.user(), 'updatedSection', 'oneTimePasswords', true);
},
//-------------------------------------------------------------------------
'encryptedData': function() {
var deferredResult;
var oneTimePasswordReferences;
var result;
var i, c;
result = {};
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(MochiKit.Async.succeed);
oneTimePasswordReferences = MochiKit.Base.keys(this.oneTimePasswords());
c = oneTimePasswordReferences.length;
for (i=0; i<c; i++) {
var currentOneTimePassword;
currentOneTimePassword = this.oneTimePasswords()[oneTimePasswordReferences[i]];
deferredResult.addCallback(MochiKit.Base.method(currentOneTimePassword, 'encryptedPackedPassphrase'));
deferredResult.addCallback(function(aResult, aOneTimePasswordReference, anEncryptedPackedPassphrase) {
aResult[aOneTimePasswordReference] = anEncryptedPackedPassphrase;
return aResult;
}, result, oneTimePasswordReferences[i]);
}
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePasswordManager.encryptedData: " + res); return res;});
deferredResult.callback(result);
return deferredResult;
},
//-------------------------------------------------------------------------
'saveChanges': function() {
var deferredResult;
var result;
//MochiKit.Logging.logDebug(">>> OneTimePasswordManager.saveChanges");
result = {};
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_encryptUserData');
deferredResult.addCallback(MochiKit.Base.method(this.user(), 'encryptedData'));
deferredResult.addCallback(function(aResult, res) {
aResult['user'] = res;
return aResult;
}, result);
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_encryptOTPData');
deferredResult.addCallback(MochiKit.Base.bind(function(res) {
res['oneTimePasswords'] = MochiKit.Base.keys(this.oneTimePasswords());
return res;
}, this));
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_sendingData');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePasswordManager.saveChanges - 1: " + Clipperz.Base.serializeJSON(res)); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.user().connection(), 'message'), 'updateOneTimePasswords');
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_updatingInterface');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePasswordManager.saveChanges - 2: " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'notify', 'OTPUpdated');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePasswordManager.saveChanges - 3: " + res); return res;});
deferredResult.callback();
//MochiKit.Logging.logDebug("<<< OneTimePasswordManager.saveChanges");
return deferredResult;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,759 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
//#############################################################################
Clipperz.PM.DataModel.Record = function(args) {
args = args || {};
this._user = args['user'] || null;
this._reference = args['reference'] || Clipperz.PM.Crypto.randomKey();
this._version = args['version'] || Clipperz.PM.Crypto.encryptingFunctions.currentVersion;
this._key = args['key'] || Clipperz.PM.Crypto.randomKey();
this.setLabel(args['label'] || Clipperz.PM.Strings['newRecordTitleLabel']);
this.setHeaderNotes(args['headerNotes'] || null);
this.setNotes(args['notes'] || args['headerNotes'] || "");
//MochiKit.Logging.logDebug("--- new Record ('" + this._label + "')- _headerNotes: '" + this._headerNotes + "'");
//MochiKit.Logging.logDebug("--- new Record ('" + this._label + "')- _notes: '" + this._notes + "'");
// this._notes = args.notes || "";
this._versions = {};
this._directLogins = {};
this._removedDirectLogins = [];
this.setIsBrandNew(args['reference'] == null);
this.setShouldLoadData(this.isBrandNew() ? false: true);
this.setShouldDecryptData(this.isBrandNew() ? false: true);
this.setShouldProcessData(this.isBrandNew() ? false: true);
this.setCurrentVersion(this.isBrandNew() ? new Clipperz.PM.DataModel.RecordVersion(this, null): null);
this.setCurrentVersionKey(null);
this._serverData = null;
this._decryptedData = null;
this._cachedData = null;
return this;
}
Clipperz.PM.DataModel.Record.prototype = MochiKit.Base.update(null, {
'toString': function() {
return "Record (" + this.label() + ")";
},
//-------------------------------------------------------------------------
'isBrandNew': function() {
return this._isBrandNew;
},
'setIsBrandNew': function(aValue) {
this._isBrandNew = aValue;
},
//-------------------------------------------------------------------------
/*
'shouldRunTheRecordCreationWizard': function() {
return (this.isBrandNew() && (MochiKit.Base.keys(this.currentVersion().fields()).length == 0));
},
*/
//-------------------------------------------------------------------------
'user': function() {
return this._user;
},
//-------------------------------------------------------------------------
'reference': function() {
return this._reference;
},
//-------------------------------------------------------------------------
'key': function() {
return this._key;
},
'updateKey': function() {
this._key = Clipperz.PM.Crypto.randomKey();
},
//-------------------------------------------------------------------------
'label': function() {
return this._label;
},
'setLabel': function(aValue) {
this._label = aValue;
},
'lowerCaseLabel': function() {
return this.label().toLowerCase();
},
//-------------------------------------------------------------------------
'versions': function() {
return this._versions;
},
//-------------------------------------------------------------------------
'currentVersion': function() {
return this._currentVersion;
},
'setCurrentVersion': function(aValue) {
this._currentVersion = aValue;
},
//-------------------------------------------------------------------------
'currentVersionKey': function() {
return this._currentVersionKey;
},
'setCurrentVersionKey': function(aValue) {
this._currentVersionKey = aValue;
},
//-------------------------------------------------------------------------
'deferredData': function() {
var deferredResult;
//MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] Record.deferredData - this: " + this);
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(MochiKit.Base.method(this, 'loadData'));
deferredResult.addCallback(MochiKit.Base.method(this, 'decryptData'));
deferredResult.addCallback(MochiKit.Base.method(this, 'processData'));
deferredResult.addCallback(function(aRecord) {
return aRecord.currentVersion().deferredData();
});
deferredResult.addCallback(MochiKit.Base.method(this, 'takeSnapshotOfCurrentData'));
deferredResult.addCallback(MochiKit.Async.succeed, this);
deferredResult.callback();
//MochiKit.Logging.logDebug("<<< [" + (new Date()).valueOf() + "] Record.deferredData");
return deferredResult;
},
//-------------------------------------------------------------------------
'exportedData': function() {
var result;
result = {};
result['label'] = this.label();
result['data'] = this.serializedData();
result['currentVersion'] = this.currentVersion().serializedData();
result['currentVersion']['reference'] = this.currentVersion().reference();
// result['versions'] = MochiKit.Base.map(MochiKit.Base.methodcaller("serializedData"), MochiKit.Base.values(this.versions()));
return Clipperz.Base.serializeJSON(result);
},
//-------------------------------------------------------------------------
'shouldLoadData': function() {
return this._shouldLoadData;
},
'setShouldLoadData': function(aValue) {
this._shouldLoadData = aValue;
},
//-------------------------------------------------------------------------
'shouldDecryptData': function() {
return this._shouldDecryptData;
},
'setShouldDecryptData': function(aValue) {
this._shouldDecryptData = aValue;
},
//-------------------------------------------------------------------------
'shouldProcessData': function() {
return this._shouldProcessData;
},
'setShouldProcessData': function(aValue) {
this._shouldProcessData = aValue;
},
//-------------------------------------------------------------------------
'loadData': function() {
var result;
//MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] Record.loadData - this: " + this);
if (this.shouldLoadData()) {
var deferredResult;
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'notify', 'loadingRecordData');
deferredResult.addCallback(MochiKit.Base.method(this.user().connection(), 'message'), 'getRecordDetail', {reference: this.reference()});
deferredResult.addCallback(MochiKit.Base.method(this,'setServerData'));
deferredResult.callback();
result = deferredResult;
} else {
result = MochiKit.Async.succeed(this.serverData());
}
//MochiKit.Logging.logDebug("<<< [" + (new Date()).valueOf() + "] Record.loadData");
return result;
},
//-------------------------------------------------------------------------
'decryptData': function(anEncryptedData) {
var result;
//MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] Record.decryptData - this: " + this + " (" + anEncryptedData + ")");
if (this.shouldDecryptData()) {
var deferredResult;
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'notify', 'decryptingRecordData');
deferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt, this.key(), anEncryptedData['data'], anEncryptedData['version']);
deferredResult.addCallback(function(anEncryptedData, someDecryptedValues) {
var result;
result = anEncryptedData;
result['data'] = someDecryptedValues;
return result;
}, anEncryptedData);
deferredResult.addCallback(MochiKit.Base.method(this, 'setDecryptedData'));
deferredResult.callback();
result = deferredResult;
} else {
result = MochiKit.Async.succeed(this.decryptedData());
}
//MochiKit.Logging.logDebug("<<< [" + (new Date()).valueOf() + "] Record.decryptData");
return result;
},
//-------------------------------------------------------------------------
'processData': function(someValues) {
//MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] Record.processData");
//MochiKit.Logging.logDebug("--- Record.processData: " + Clipperz.Base.serializeJSON(someValues));
if (this.shouldProcessData()) {
var currentVersionParameters;
this.processDataToExtractLegacyValues(someValues['data']);
if (typeof(someValues['data']['notes']) != 'undefined') {
this.setNotes(someValues['data']['notes']);
}
if (someValues['data']['currentVersionKey'] != null) {
this.setCurrentVersionKey(someValues['data']['currentVersionKey']);
} else {
this.setCurrentVersionKey(this.key());
}
currentVersionParameters = someValues['currentVersion'];
currentVersionParameters['key'] = this.currentVersionKey();
this.setCurrentVersion(new Clipperz.PM.DataModel.RecordVersion(this, currentVersionParameters));
if (someValues['data']['directLogins'] != null) {
var directLoginReference;
for (directLoginReference in someValues['data']['directLogins']) {
var directLogin;
var directLoginParameters;
directLoginParameters = someValues['data']['directLogins'][directLoginReference];
directLoginParameters.record = this;
directLoginParameters.reference = directLoginReference;
directLogin = new Clipperz.PM.DataModel.DirectLogin(directLoginParameters);
this.addDirectLogin(directLogin, true);
}
}
this.setShouldProcessData(false);
}
Clipperz.NotificationCenter.notify(this, 'recordDataReady');
//MochiKit.Logging.logDebug("<<< [" + (new Date()).valueOf() + "] Record.processData");
//MochiKit.Logging.logDebug("<<< Record.processData");
return this;
},
//-------------------------------------------------------------------------
'processDataToExtractLegacyValues': function(someValues) {
//MochiKit.Logging.logDebug(">>> Record.processDataToExtractLegacyValues");
if (someValues['data'] != null) {
this.setNotes(someValues['data']);
}
if (
(typeof(someValues['loginFormData']) != "undefined")
&& (typeof(someValues['loginBindings'] != "undefined"))
&& (someValues['loginFormData'] != "")
&& (someValues['loginBindings'] != "")
) {
var directLogin;
directLogin = new Clipperz.PM.DataModel.DirectLogin({
record:this,
label:this.label() + Clipperz.PM.Strings['newDirectLoginLabelSuffix'],
reference:Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray(this.label() +
someValues['loginFormData'] +
someValues['loginBindings'])).toHexString().substring(2),
formData:Clipperz.Base.evalJSON(someValues['loginFormData']),
legacyBindingData:Clipperz.Base.evalJSON(someValues['loginBindings']),
bookmarkletVersion:'0.1'
});
this.addDirectLogin(directLogin, true);
}
//MochiKit.Logging.logDebug("<<< Record.processDataToExtractLegacyValues");
},
//-------------------------------------------------------------------------
'getReadyBeforeUpdatingVersionValues': function() {
},
//-------------------------------------------------------------------------
'addNewField': function() {
var newField;
//MochiKit.Logging.logDebug(">>> Record.addNewField - " + this);
this.getReadyBeforeUpdatingVersionValues();
newField = this.currentVersion().addNewField();
Clipperz.NotificationCenter.notify(this, 'recordUpdated');
//MochiKit.Logging.logDebug("<<< Record.addNewField");
return newField;
},
//-------------------------------------------------------------------------
'removeField': function(aField) {
this.getReadyBeforeUpdatingVersionValues();
this.currentVersion().removeField(aField);
Clipperz.NotificationCenter.notify(this, 'recordUpdated');
},
'removeEmptyFields': function() {
MochiKit.Iter.forEach(MochiKit.Base.values(this.currentVersion().fields()), MochiKit.Base.bind(function(aField) {
if (aField.isEmpty()) {
this.removeField(aField);
// this.currentVersion().removeField(aField);
}
}, this));
},
//-------------------------------------------------------------------------
'notes': function() {
return this._notes;
},
'setNotes': function(aValue) {
this._notes = aValue;
this.setHeaderNotes(null);
},
//-------------------------------------------------------------------------
'headerNotes': function() {
return this._headerNotes;
},
'setHeaderNotes': function(aValue) {
this._headerNotes = aValue;
},
//-------------------------------------------------------------------------
'remove': function() {
//MochiKit.Logging.logDebug(">>> Record.remove - " + this);
MochiKit.Iter.forEach(MochiKit.Base.values(this.directLogins()), MochiKit.Base.method(this, 'removeDirectLogin'));
this.syncDirectLoginReferenceValues();
this.user().removeRecord(this);
//MochiKit.Logging.logDebug("<<< Record.remove");
},
//-------------------------------------------------------------------------
'directLogins': function() {
return this._directLogins;
},
'addDirectLogin': function(aDirectLogin, shouldUpdateUser) {
this.directLogins()[aDirectLogin.reference()] = aDirectLogin;
if (shouldUpdateUser == true) {
this.user().addDirectLogin(aDirectLogin);
}
},
'removeDirectLogin': function(aDirectLogin) {
this.removedDirectLogins().push(aDirectLogin);
delete this.directLogins()[aDirectLogin.reference()];
// this.user().removeDirectLogin(aDirectLogin);
},
'resetDirectLogins': function() {
this._directLogins = {};
},
'removedDirectLogins': function() {
return this._removedDirectLogins;
},
'resetRemovedDirectLogins': function() {
this._removedDirectLogins = [];
},
//-------------------------------------------------------------------------
'serverData': function() {
return this._serverData;
},
'setServerData': function(aValue) {
this._serverData = aValue;
this.setShouldLoadData(false);
return aValue;
},
//-------------------------------------------------------------------------
'decryptedData': function() {
return this._decryptedData;
},
'setDecryptedData': function(aValue) {
this._decryptedData = aValue;
this.setShouldDecryptData(false);
return aValue;
},
//-------------------------------------------------------------------------
'cachedData': function() {
return this._cachedData;
},
'setCachedData': function(aValue) {
//MochiKit.Logging.logDebug(">>> Record.setCachedData");
//MochiKit.Logging.logDebug("--- Record.setCachedData - aValue: " + Clipperz.Base.serializeJSON(aValue));
this._cachedData = aValue;
this.setShouldProcessData(false);
//MochiKit.Logging.logDebug("<<< Record.setCachedData");
return aValue;
},
//-------------------------------------------------------------------------
'hasPendingChanges': function() {
var result;
//MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] Record.hasPendingChanges");
//MochiKit.Logging.logDebug(">>> Record.hasPendingChanges - cachedData: " + this.cachedData());
//MochiKit.Logging.logDebug(">>> Record.hasPendingChanges - cachedData: " + Clipperz.Base.serializeJSON(this.cachedData()));
//MochiKit.Logging.logDebug(">>> Record.hasPendingChanges - currentSnapshot: " + this.currentDataSnapshot());
//MochiKit.Logging.logDebug(">>> Record.hasPendingChanges - currentSnapshot: " + Clipperz.Base.serializeJSON(this.currentDataSnapshot()));
//console.log(">>> Record.hasPendingChanges - cachedData: %o", this.cachedData());
//console.log(">>> Record.hasPendingChanges - currentSnapshot: %o", this.currentDataSnapshot());
result = (MochiKit.Base.compare(this.cachedData(), this.currentDataSnapshot()) != 0);
//MochiKit.Logging.logDebug("<<< Record.hasPendingChanges - " + result);
if ((result == false) && this.isBrandNew() && (this.label() != Clipperz.PM.Strings['newRecordTitleLabel'])) {
result = true;
}
//MochiKit.Logging.logDebug("<<< [" + (new Date()).valueOf() + "] Record.hasPendingChanges");
return result;
},
//-------------------------------------------------------------------------
'currentDataSnapshot': function() {
var result;
//MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] Record.currentDataSnapshot");
result = {
'label': this.label(),
'data': this.serializedData(),
'currentVersion': this.currentVersion().currentDataSnapshot()
};
// result['data']['data'] = this.notes();
result = Clipperz.Base.serializeJSON(result);
//MochiKit.Logging.logDebug("<<< [" + (new Date()).valueOf() + "] Record.currentDataSnapshot");
//MochiKit.Logging.logDebug("<<< Record.currentDataSnapshot");
return result;
},
//.........................................................................
'takeSnapshotOfCurrentData': function() {
this.setCachedData(this.currentDataSnapshot());
},
//-------------------------------------------------------------------------
'headerData': function() {
var result;
result = {
'label': this.label(),
'key': this.key()
};
if (this.headerNotes() != null) {
result['headerNotes'] = this.headerNotes();
}
return result;
},
//-------------------------------------------------------------------------
'serializedData': function() {
var result;
var directLoginReference;
result = {};
result['currentVersionKey'] = this.currentVersion().key();
result['directLogins'] = {};
for (directLoginReference in this.directLogins()) {
result['directLogins'][directLoginReference] = this.directLogins()[directLoginReference].serializedData();
}
result['notes'] = this.notes();
return result;
},
//-------------------------------------------------------------------------
'encryptedData': function() {
var deferredResult;
var result;
//MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] Record.encryptedData");
result = {}
//MochiKit.Logging.logDebug("--- Record.encryptedData - 1");
deferredResult = new MochiKit.Async.Deferred();
//MochiKit.Logging.logDebug("--- Record.encryptedData - 2");
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Record.encryptedData - 1: " + res); return res;});
deferredResult.addCallback(function(aResult, aRecord) {
aResult['reference'] = aRecord.reference();
return aResult;
}, result, this);
//MochiKit.Logging.logDebug("--- Record.encryptedData - 3");
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Record.encryptedData - 2: " + res); return res;});
deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion, this.key(), this.serializedData());
//MochiKit.Logging.logDebug("--- Record.encryptedData - 4");
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Record.encryptedData - 3: " + res); return res;});
deferredResult.addCallback(function(aResult, res) {
aResult['data'] = res;
return aResult;
}, result);
//MochiKit.Logging.logDebug("--- Record.encryptedData - 5");
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Record.encryptedData - 4: " + res); return res;});
deferredResult.addCallback(function(aResult) {
aResult['version'] = Clipperz.PM.Crypto.encryptingFunctions.currentVersion;
return aResult;
}, result);
//MochiKit.Logging.logDebug("--- Record.encryptedData - 6");
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Record.encryptedData - 5: " + res); return res;});
deferredResult.callback();
//MochiKit.Logging.logDebug("<<< [" + (new Date()).valueOf() + "] Record.encryptedData");
return deferredResult;
},
//-------------------------------------------------------------------------
'syncDirectLoginReferenceValues': function() {
//MochiKit.Logging.logDebug(">>> Record.syncDirectLoginReferenceValues");
MochiKit.Iter.forEach(MochiKit.Base.values(this.directLogins()), function(aDirectLogin) {
aDirectLogin.record().user().synchronizeDirectLogin(aDirectLogin);
});
MochiKit.Iter.forEach(this.removedDirectLogins(), function(aDirectLogin) {
aDirectLogin.record().user().removeDirectLogin(aDirectLogin);
});
this.resetRemovedDirectLogins();
//MochiKit.Logging.logDebug("<<< Record.syncDirectLoginReferenceValues");
},
//-------------------------------------------------------------------------
'saveChanges': function() {
var result;
if (this.isBrandNew() == false) {
result = this.user().saveRecords([this], 'updateData');
} else {
result = this.user().saveRecords([this], 'addNewRecords');
}
return result;
},
/*
'saveChanges': function() {
var deferredResult;
var result;
Clipperz.NotificationCenter.notify(this.user(), 'updatedSection', 'records', true);
//MochiKit.Logging.logDebug(">>> Record.saveChanges");
//MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] Record.saveChanges");
if (this.headerNotes() != null) {
this.setNotes(this.headerNotes());
}
this.syncDirectLoginReferenceValues();
this.currentVersion().createNewVersion();
result = {'records': [{}]};
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveCard_collectRecordInfo');
deferredResult.addCallback(MochiKit.Base.method(this, 'updateKey'));
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveCard_encryptUserData');
deferredResult.addCallback(MochiKit.Base.method(this.user(), 'encryptedData'));
deferredResult.addCallback(function(aResult, res) {
aResult['user'] = res;
return aResult;
}, result);
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveCard_encryptRecordData');
deferredResult.addCallback(MochiKit.Base.method(this, 'encryptedData'));
deferredResult.addCallback(function(aResult, res) {
//# aResult['record'] = res;
aResult['records'][0]['record'] = res;
return aResult;
}, result);
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveCard_encryptRecordVersions');
deferredResult.addCallback(MochiKit.Base.method(this.currentVersion(), 'encryptedData'));
deferredResult.addCallback(function(aResult, res) {
// aResult['currentRecordVersion'] = res;
aResult['records'][0]['currentRecordVersion'] = res;
return aResult;
}, result);
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveCard_sendingData');
if (this.isBrandNew() == false) {
deferredResult.addCallback(MochiKit.Base.method(this.user().connection(), 'message'), 'updateData');
} else {
//# deferredResult.addCallback(MochiKit.Base.method(this.user().connection(), 'message'), 'addNewRecord');
deferredResult.addCallback(MochiKit.Base.method(this.user().connection(), 'message'), 'addNewRecords');
}
deferredResult.addCallback(MochiKit.Base.method(this, 'takeSnapshotOfCurrentData'));
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveCard_updatingInterface');
deferredResult.addCallback(MochiKit.Base.method(this, 'setIsBrandNew'), false);
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'notify', 'recordUpdated');
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'notify', 'directLoginUpdated');
deferredResult.callback();
return deferredResult;
},
*/
//-------------------------------------------------------------------------
'cancelChanges': function() {
//MochiKit.Logging.logDebug(">>> Record.cancelChanges");
//MochiKit.Logging.logDebug("--- Record.cancelChanges - cachedData: " + Clipperz.Base.serializeJSON(this.cachedData()));
if (this.isBrandNew()) {
this.user().removeRecord(this);
} else {
this.restoreValuesFromSnapshot(this.cachedData());
}
//MochiKit.Logging.logDebug("<<< Record.cancelChanges");
},
//-------------------------------------------------------------------------
'restoreValuesFromSnapshot': function(someSnapshotData) {
var snapshotData;
//MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] Record.restoreValuesFromSnapshot");
snapshotData = Clipperz.Base.evalJSON(someSnapshotData);
//MochiKit.Logging.logDebug("--- Record.restoreValuesFromSnapshot - someSnapshotData (1): " + Clipperz.Base.serializeJSON(someSnapshotData));
this.setLabel(snapshotData['label']);
this.resetDirectLogins();
this.setShouldProcessData(true);
this.processData(snapshotData);
//MochiKit.Logging.logDebug("--- Record.restoreValuesFromSnapshot - snapshotData: (2)" + Clipperz.Base.serializeJSON(snapshotData));
this.resetRemovedDirectLogins();
{
var currentSnapshot;
var comparisonResult;
currentSnapshot = this.currentDataSnapshot();
//MochiKit.Logging.logDebug("--- Record.restoreValuesFromSnapshot - 1");
//console.log("snapshot data: %o", someSnapshotData.currentVersion);
//console.log("current data: %o", currentSnapshot.currentVersion);
//MochiKit.Logging.logDebug("--- Record.restoreValuesFromSnapshot - someSnapshotData: " + Clipperz.Base.serializeJSON(someSnapshotData.currentVersion));
//MochiKit.Logging.logDebug("--- Record.restoreValuesFromSnapshot - currentSnapshot: " + Clipperz.Base.serializeJSON(currentSnapshot.currentVersion));
comparisonResult = MochiKit.Base.compare(someSnapshotData.currentVersion, currentSnapshot.currentVersion);
//MochiKit.Logging.logDebug("--- Record.restoreValuesFromSnapshot - " + comparisonResult);
}
//MochiKit.Logging.logDebug("<<< [" + (new Date()).valueOf() + "] Record.restoreValuesFromSnapshot");
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,220 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
//#############################################################################
Clipperz.PM.DataModel.RecordField = function(args) {
args = args || {};
this._recordVersion = args.recordVersion || null;
this._key = args.key || Clipperz.PM.Crypto.randomKey();
this.setLabel(args.label || '');
this.setValue(args.value || '');
this.setType(args.type || 'TXT'); // valid types: 'TXT', 'PWD', 'URL', 'DATE', 'ADDR', 'CHECK', 'RADIO', ('NOTE' probably not), ...
this._hidden = args.hidden || (args.type == 'PWD') || false;
return this;
}
Clipperz.PM.DataModel.RecordField.prototype = MochiKit.Base.update(null, {
'toString': function() {
return "Clipperz.PM.DataModel.RecordField - " + this.label() + " (" + this.key() + ")";
},
//-------------------------------------------------------------------------
'recordVersion': function() {
return this._recordVersion;
},
//-------------------------------------------------------------------------
'key': function() {
return this._key;
},
//-------------------------------------------------------------------------
'label': function() {
return this._label;
},
'setLabel': function(aValue) {
this._label = aValue;
},
//-------------------------------------------------------------------------
'value': function() {
return this._value;
},
'setValue': function(aValue) {
this._value = aValue;
},
//-------------------------------------------------------------------------
'type': function() {
return this._type;
},
'setType': function(aValue) {
this._type = aValue;
if (aValue == 'PWD') {
this.setHidden(true);
} else {
this.setHidden(false);
}
},
//-------------------------------------------------------------------------
'serializeData': function() {
var result;
//MochiKit.Logging.logDebug(">>> RecordField.serializeData - " + this);
result = {
label: this.label(),
value: this.value(),
type: this.type(),
hidden: this.hidden()
};
//MochiKit.Logging.logDebug("<<< RecordField.serializeData");
return result;
},
//-------------------------------------------------------------------------
'typeShortDescription': function() {
// return Clipperz.PM.DataModel.RecordField.TypeDescriptions[this.type()]['shortDescription'];
return Clipperz.PM.Strings['recordFieldTypologies'][this.type()]['shortDescription'];
},
//-------------------------------------------------------------------------
'hidden': function() {
return this._hidden;
},
'setHidden': function(aValue) {
this._hidden = aValue;
},
//-------------------------------------------------------------------------
'clone': function(aRecordVersion) {
var result;
result = new Clipperz.PM.DataModel.RecordField({
recordVersion:aRecordVersion,
label:this.label(),
value:this.value(),
type:this.type(),
hidden:this.hidden()
});
return result;
},
//-------------------------------------------------------------------------
'isEmpty': function() {
var result;
if ((this.label() == "") && (this.value() == "") && (this.type() == 'TXT')) {
result = true;
} else {
result = false;
}
return result;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//#############################################################################
/*
Clipperz.PM.DataModel.RecordField.TypeDescriptions = {
'TXT': {
description: 'simple text field',
shortDescription: 'txt'
},
'PWD': {
description: 'simple text field, with default status set to hidden',
shortDescription: 'pwd'
},
'URL': {
description: 'simple text field in edit mode, that became an active url in view mode',
shortDescription: 'url'
},
'DATE': {
description: 'a value set with a calendar helper',
shortDescription: 'date'
},
'ADDR': {
description: 'just like the URL, but the active link points to Google Maps (or similar service) passing the address value as argument',
shortDescription: 'addr'
},
'CHECK': {
description: 'check description',
shortDescription: 'check'
},
'RADIO': {
description: 'radio description',
shortDescription: 'radio'
},
'SELECT': {
description: 'select description',
shortDescription: 'select'
}
// 'NOTE': {
// description: 'a simple text field, but with a bigger component dimension; possibly with "smart edit components"',
// shortDescription: 'note'
// }
};
Clipperz.PM.DataModel.RecordField.InputTypeToRecordFieldType = {
'text': 'TXT',
'password': 'PWD',
'checkbox': 'CHECK',
'radio': 'RADIO',
'select': 'SELECT'
};
*/

View File

@@ -0,0 +1,535 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
//#############################################################################
Clipperz.PM.DataModel.RecordVersion = function(aRecord, args) {
args = args || {};
this._record = aRecord;
this._reference = args.reference || Clipperz.PM.Crypto.randomKey();
this._version = args.version || Clipperz.PM.Crypto.encryptingFunctions.currentVersion;
this._key = args.key || Clipperz.PM.Crypto.randomKey();;
this._previousVersion = args.previousVersion || null;
this._previousVersionKey = args.previousVersionKey || null;
this.setIsBrandNew(args.reference == null);
if (this.isBrandNew()) {
this._fields = {};
this.setShouldLoadData(false);
this.setShouldDecryptData(false);
this.setShouldProcessData(false);
} else {
if (typeof(args.fields) != 'undefined') {
this.processFieldData(args.fields);
this.setShouldLoadData(false);
this.setShouldDecryptData(false);
this.setShouldProcessData(false);
} else {
if (typeof(args.data) != 'undefined') {
this.setShouldLoadData(false);
} else {
this.setShouldLoadData(true);
}
this.setShouldDecryptData(true);
this.setShouldProcessData(true);
}
}
this._serverData = args.data;
this._decryptedData = null;
return this;
}
Clipperz.PM.DataModel.RecordVersion.prototype = MochiKit.Base.update(null, {
'toString': function() {
return "RecordVersion";
},
//-------------------------------------------------------------------------
'record': function() {
return this._record;
},
//-------------------------------------------------------------------------
'reference': function() {
return this._reference;
},
'setReference': function(aValue) {
this._reference = aValue;
},
//-------------------------------------------------------------------------
'key': function() {
//MochiKit.Logging.logDebug(">>> RecordVersion.key");
//MochiKit.Logging.logDebug("--- RecordVersion.key - " + this._key);
return this._key;
},
'setKey': function(aValue) {
this._key = aValue;
},
//-------------------------------------------------------------------------
'serverData': function() {
return this._serverData;
},
'setServerData': function(aValue) {
this._serverData = aValue;
this.setShouldLoadData(false);
return aValue;
},
//-------------------------------------------------------------------------
'decryptedData': function() {
//MochiKit.Logging.logDebug(">>> RecordVersion.decryptedData: " + (this._decryptedData ? Clipperz.Base.serializeJSON(aValue) : "null"));
return this._decryptedData;
},
'setDecryptedData': function(aValue) {
//MochiKit.Logging.logDebug(">>> RecordVersion.setDecryptedData: " + Clipperz.Base.serializeJSON(aValue));
this._decryptedData = aValue;
this.setShouldDecryptData(false);
return aValue;
},
//-------------------------------------------------------------------------
'version': function() {
return this._version;
},
//-------------------------------------------------------------------------
'isBrandNew': function() {
return this._isBrandNew;
},
'setIsBrandNew': function(aValue) {
this._isBrandNew = aValue;
},
//-------------------------------------------------------------------------
'fields': function() {
return this._fields;
},
'addField': function(aField) {
this.fields()[aField.key()] = aField;
},
'addNewField': function() {
var newRecordField;
newRecordField = new Clipperz.PM.DataModel.RecordField({recordVersion:this});
this.addField(newRecordField);
return newRecordField;
},
'fieldWithName': function(aValue) {
var result;
var fieldValues;
var i,c;
result = null;
fieldValues = MochiKit.Base.values(this.fields());
c = fieldValues.length;
for (i=0; (i<c) && (result == null); i++) {
var currentField;
currentField = fieldValues[i];
if (currentField.label() == aValue) {
result = currentField;
}
}
return result;
},
//-------------------------------------------------------------------------
'shouldLoadData': function() {
return this._shouldLoadData;
},
'setShouldLoadData': function(aValue) {
this._shouldLoadData = aValue;
},
//-------------------------------------------------------------------------
'shouldDecryptData': function() {
return this._shouldDecryptData;
},
'setShouldDecryptData': function(aValue) {
this._shouldDecryptData = aValue;
},
//-------------------------------------------------------------------------
'shouldProcessData': function() {
return this._shouldProcessData;
},
'setShouldProcessData': function(aValue) {
this._shouldProcessData = aValue;
},
//-------------------------------------------------------------------------
'deferredData': function() {
var deferredResult;
//MochiKit.Logging.logDebug(">>> RecordVersion.deferredData - this: " + this);
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(MochiKit.Base.method(this, 'loadData'));
deferredResult.addCallback(MochiKit.Base.method(this, 'decryptData'));
deferredResult.addCallback(MochiKit.Base.method(this, 'processData'));
deferredResult.callback();
//MochiKit.Logging.logDebug("<<< RecordVersion.deferredData");
return deferredResult;
},
//-------------------------------------------------------------------------
'loadData': function() {
var result;
//MochiKit.Logging.logDebug(">>> RecordVersion.loadData - this: " + this);
if (this.shouldLoadData()) {
var deferredResult;
alert("ERROR: this should have not happened yet!");
//MochiKit.Logging.logDebug("--- RecordVersion.loadData - 1");
deferredResult = new MochiKit.Async.Deferred();
//MochiKit.Logging.logDebug("--- RecordVersion.loadData - 2");
deferredResult.addCallback(MochiKit.Base.method(this, 'notify'), 'loadingRecordVersionData');
//MochiKit.Logging.logDebug("--- RecordVersion.loadData - 3");
deferredResult.addCallback(MochiKit.Base.method(this.user().connection(), 'message'), 'getRecordVersionDetail', {reference: this.reference()});
//MochiKit.Logging.logDebug("--- RecordVersion.loadData - 4");
deferredResult.addCallback(MochiKit.Base.method(this, 'setServerData'));
//MochiKit.Logging.logDebug("--- RecordVersion.loadData - 5");
deferredResult.callback();
//MochiKit.Logging.logDebug("--- RecordVersion.loadData - 6");
result = deferredResult;
//MochiKit.Logging.logDebug("--- RecordVersion.loadData - 7");
} else {
//MochiKit.Logging.logDebug("--- RecordVersion.loadData - 8");
result = MochiKit.Async.succeed(this.serverData());
//MochiKit.Logging.logDebug("--- RecordVersion.loadData - 9");
}
//MochiKit.Logging.logDebug("<<< RecordVersion.loadData");
return result;
},
//-------------------------------------------------------------------------
'decryptData': function(anEncryptedData) {
var result;
//MochiKit.Logging.logDebug(">>> RecordVersion.decryptData - this: " + this + " (" + anEncryptedData + ")");
if (this.shouldDecryptData()) {
var deferredResult;
//MochiKit.Logging.logDebug("--- RecordVersion.decryptData - 1");
deferredResult = new MochiKit.Async.Deferred();
//MochiKit.Logging.logDebug("--- RecordVersion.decryptData - 2");
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RecordVersion.decryptData 1: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'notify'), 'decryptingRecordVersionData');
//MochiKit.Logging.logDebug("--- RecordVersion.decryptData - 3");
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RecordVersion.decryptData 2: " + res); return res;});
deferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt, this.key(), anEncryptedData, this.version());
//MochiKit.Logging.logDebug("--- RecordVersion.decryptData - 4");
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RecordVersion.decryptData 3: " + res); return res;});
//MochiKit.Logging.logDebug("--- RecordVersion.decryptData - 5");
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RecordVersion.decryptData 4: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'setDecryptedData'));
//MochiKit.Logging.logDebug("--- RecordVersion.decryptData - 6");
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RecordVersion.decryptData 5: " + res); return res;});
deferredResult.callback();
//MochiKit.Logging.logDebug("--- RecordVersion.decryptData - 7");
result = deferredResult;
//MochiKit.Logging.logDebug("--- RecordVersion.decryptData - 8");
} else {
//MochiKit.Logging.logDebug("--- RecordVersion.decryptData - 9");
result = MochiKit.Async.succeed(this.decryptedData());
//MochiKit.Logging.logDebug("--- RecordVersion.decryptData - 10");
}
//MochiKit.Logging.logDebug("<<< RecordVersion.decryptData");
return result;
},
//-------------------------------------------------------------------------
'processFieldData': function(someValues) {
var fieldValues;
this._fields = {};
if (typeof(someValues) == 'undefined') {
fieldValues = {};
} else {
fieldValues = someValues;
}
if (fieldValues.constructor == Array) {
var i, c;
c = fieldValues.length;
for (i=0; i<c; i++) {
var newRecordField;
var currentFieldValues;
currentFieldValues = fieldValues[i];
currentFieldValues['recordVersion'] = this;
newRecordField = new Clipperz.PM.DataModel.RecordField(currentFieldValues);
this._fields[newRecordField.key()] = newRecordField;
}
} else {
var fieldKey;
for (fieldKey in fieldValues) {
var newRecordField;
var currentFieldValues;
currentFieldValues = fieldValues[fieldKey];
currentFieldValues['key'] = fieldKey;
currentFieldValues['recordVersion'] = this;
newRecordField = new Clipperz.PM.DataModel.RecordField(currentFieldValues);
this._fields[fieldKey] = newRecordField;
}
}
},
'processData': function(someValues) {
if (this.shouldProcessData()) {
this.processFieldData(someValues.fields);
this.setShouldProcessData(false);
}
this.notify('recordVersionDataReady');
return this;
},
//-------------------------------------------------------------------------
'notify': function(aValue) {
Clipperz.NotificationCenter.notify(this, aValue);
},
//-------------------------------------------------------------------------
'removeField': function(aField) {
delete this.fields()[aField.key()];
},
//-------------------------------------------------------------------------
'previousVersion': function() {
return this._previousVersion;
},
'setPreviousVersion': function(aValue) {
this._previousVersion = aValue;
},
//-------------------------------------------------------------------------
'previousVersionKey': function() {
return this._previousVersionKey;
},
'setPreviousVersionKey': function(aValue) {
this._previousVersionKey = aValue;
},
//-------------------------------------------------------------------------
'serializedData': function() {
var result;
var fieldKey;
//MochiKit.Logging.logDebug(">>> RecordVersion.serializedData");
result = {
fields: {}
};
//MochiKit.Logging.logDebug("--- RecordVersion.serializedData - 1");
for (fieldKey in this.fields()) {
//MochiKit.Logging.logDebug("--- RecordVersion.serializedData - 2");
result.fields[fieldKey] = this.fields()[fieldKey].serializeData();
//MochiKit.Logging.logDebug("--- RecordVersion.serializedData - 3");
}
//MochiKit.Logging.logDebug("--- RecordVersion.serializedData - 4");
//MochiKit.Logging.logDebug("<<< RecordVersion.serializedData: " + Clipperz.Base.serializeJSON(result));
return result;
},
'currentDataSnapshot': function() {
var result;
result = this.serializedData();
result['version'] = this.version();
result['reference'] = this.reference();
result['previousVersionKey'] = this.previousVersionKey();
return result;
},
//-------------------------------------------------------------------------
'encryptedData': function() {
var deferredResult;
var result;
//MochiKit.Logging.logDebug(">>> RecordVersion.encryptedData - " + this);
result = {};
deferredResult = new MochiKit.Async.Deferred();
//MochiKit.Logging.logDebug("--- RecordVersion.encryptedData - 1");
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RecordVersion.encryptedData - 1: " + res); return res;});
deferredResult.addCallback(function(aResult, aRecordVersion) {
aResult['reference'] = aRecordVersion.reference();
aResult['recordReference'] = aRecordVersion.record().reference(); // TODO - this seems to be completely useless
return aResult;
}, result, this);
//MochiKit.Logging.logDebug("--- RecordVersion.encryptedData - 2");
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RecordVersion.encryptedData - 2: " + res); return res;});
deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion, this.key(), this.serializedData());
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RecordVersion.encryptedData - 3: " + res); return res;});
deferredResult.addCallback(function(aResult, res) {
aResult['data'] = res;
return aResult;
}, result);
//MochiKit.Logging.logDebug("--- RecordVersion.encryptedData - 3");
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RecordVersion.encryptedData - 4: " + res); return res;});
deferredResult.addCallback(function(aResult) {
aResult['version'] = Clipperz.PM.Crypto.encryptingFunctions.currentVersion;
return aResult;
}, result);
//MochiKit.Logging.logDebug("--- RecordVersion.encryptedData - 4");
if (this.previousVersion() != null) {
//MochiKit.Logging.logDebug("--- RecordVersion.encryptedData - 5");
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RecordVersion.encryptedData - 5: " + res); return res;});
deferredResult.addCallback(function(aResult, aRecordVersion) {
aResult['previousVersion'] = aRecordVersion.previousVersion();
return aResult;
}, result, this);
//MochiKit.Logging.logDebug("--- RecordVersion.encryptedData - 6");
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RecordVersion.encryptedData - 6: " + res); return res;});
deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion, this.key(), this.previousVersionKey());
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RecordVersion.encryptedData - 7: " + res); return res;});
deferredResult.addCallback(function(aResult, res) {
aResult['previousVersionKey'] = res;
return aResult;
}, result);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RecordVersion.encryptedData - 8: " + res); return res;});
//MochiKit.Logging.logDebug("--- RecordVersion.encryptedData - 7");
} else {
//MochiKit.Logging.logDebug("--- RecordVersion.encryptedData - 8");
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RecordVersion.encryptedData - 9: " + res); return res;});
deferredResult.addCallback(function(aResult) {
aResult['previousVersionKey'] = Clipperz.PM.Crypto.nullValue;
return aResult;
}, result);
//MochiKit.Logging.logDebug("--- RecordVersion.encryptedData - 9");
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RecordVersion.encryptedData - 10: " + res); return res;});
};
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("RecordVersion.encryptedData - 11: " + res); return res;});
deferredResult.callback();
//MochiKit.Logging.logDebug("<<< RecordVersion.encryptedData");
return deferredResult;
},
//-------------------------------------------------------------------------
'createNewVersion': function() {
if (this.record().isBrandNew() == false) {
this.setPreviousVersion(this.reference());
this.setPreviousVersionKey(this.key());
this.setReference(Clipperz.PM.Crypto.randomKey());
this.setKey(Clipperz.PM.Crypto.randomKey());
}
},
//-------------------------------------------------------------------------
/*
'shouldLoadData': function() {
return ((this.data() == null) && (this.isBrandNew() === false));
},
'loadData': function() {
//MochiKit.Logging.logDebug(">>> Record.loadData (" + this.label() + ")");
// if (this.shouldLoadData()) {
// this.user().connection().message( 'getRecordDetail',
// {recordReference: this.reference()},
// { callback:MochiKit.Base.bind(this.loadDataCallback, this),
// errorHandler:Clipperz.PM.defaultErrorHandler });
// } else {
// this.notify('loadDataDone');
// }
},
'loadDataCallback': function() {
MochiKit.Logging.logDebug("RecordVersion.loadDataCallback: " + Clipperz.Base.serializeJSON(arguments));
},
*/
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,133 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
//#############################################################################
Clipperz.PM.DataModel.Statistics = function(args) {
args = args || {};
this._user = args.user;
this._data = args.data || null;
return this;
}
Clipperz.PM.DataModel.Statistics.prototype = MochiKit.Base.update(null, {
//-------------------------------------------------------------------------
'decrypt': function(aVersion, someEncryptedData) {
var deferredResult;
//MochiKit.Logging.logDebug(">>> Statistics.decrypt");
if (someEncryptedData == Clipperz.PM.Crypto.nullValue) {
this.setData({});
deferredResult = MochiKit.Async.succeed(this.data());
} else {
var statistic;
var user;
statistic = this;
user = this.user();
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addCallback(function() { console.time("Statistics.decrypt.deferredDecrypt")});
deferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt, user.passphrase(), someEncryptedData, aVersion);
//deferredResult.addCallback(function() { console.timeEnd("Statistics.decrypt.deferredDecrypt")});
//deferredResult.addCallback(function() { console.time("Statistics.decrypt.setup")});
deferredResult.addCallbacks(
MochiKit.Base.partial(function (aStatistic, someData) {
aStatistic.setData(someData);
return aStatistic.data();
}, statistic),
MochiKit.Base.partial(function (aStatistic) {
MochiKit.Logging.logWarning("resetting user statistics due to an error while decrypting stored data");
aStatistic.setData({});
return aStatistic.data();
}, statistic)
);
//deferredResult.addCallback(function() { console.timeEnd("Statistics.decrypt.setup")});
deferredResult.callback();
}
//MochiKit.Logging.logDebug("<<< Statistics.decrypt");
return deferredResult;
},
//-------------------------------------------------------------------------
'user': function() {
return this._user;
},
//-------------------------------------------------------------------------
'data': function() {
return this._data;
},
'setData': function(aValue) {
this._data = aValue;
this.extractInfoFromData(aValue);
},
//-------------------------------------------------------------------------
'extractInfoFromData': function(someValues) {
},
//-------------------------------------------------------------------------
'encryptedData': function() {
return Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion(this.user().passphrase(), this.serializedData());
},
//-------------------------------------------------------------------------
'serializedData': function() {
var result;
//MochiKit.Logging.logDebug(">>> Statistics.serializedData");
result = {};
//MochiKit.Logging.logDebug("<<< Statistics.serializedData");
return result;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,904 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
//#############################################################################
Clipperz.PM.DataModel.User = function(args) {
//MochiKit.Logging.logDebug(">>> new User");
args = args || {};
this._username = args.username || null;
this._passphrase = args.passphrase || null;
this._connection = null;
this._connectionVersion = 'current';
this._header = null;
this._statistics = null;
this._lock = 'new lock';
this._preferences = null;
this._records = {};
this._directLoginReferences = {};
this._oneTimePasswordManager = null;
this._isLoadingUserDetails = false;
this._loadingUserDetailsPendingQueue = [];
this._maxNumberOfRecords = Number.MAX_VALUE;
this._shouldDownloadOfflineCopy = false;
this._loginInfo = null;
this._loginHistory = null;
this._serverData = null;
//MochiKit.Logging.logDebug("<<< new User");
return this;
}
Clipperz.PM.DataModel.User.prototype = MochiKit.Base.update(null, {
'toString': function() {
return "Clipperz.PM.DataModel.User - " + this.username();
},
//-------------------------------------------------------------------------
'username': function() {
return this._username;
},
'setUsername': function(aValue) {
this._username = aValue;
},
//-------------------------------------------------------------------------
'passphrase': function() {
return this._passphrase;
},
'setPassphrase': function(aValue) {
this._passphrase = aValue;
},
//-------------------------------------------------------------------------
'maxNumberOfRecords': function() {
return this._maxNumberOfRecords;
},
'setMaxNumberOfRecords': function(aValue) {
this._maxNumberOfRecords = aValue;
},
//-------------------------------------------------------------------------
'errorHandler': function(anErrorString, anException) {
MochiKit.Logging.logError("- User.errorHandler: " + anErrorString + " (" + anException + ")");
},
//-------------------------------------------------------------------------
'connectionVersion': function() {
return this._connectionVersion;
},
'setConnectionVersion': function(aValue) {
this._connectionVersion = aValue;
},
//-------------------------------------------------------------------------
'connection': function() {
if ((this._connection == null) && (this.connectionVersion() != null) ){
this._connection = new Clipperz.PM.Crypto.communicationProtocol.versions[this.connectionVersion()]({user:this});
}
return this._connection;
},
'resetConnection': function(aValue) {
this._connection = null;
},
//=========================================================================
'register': function(anInvitationCode) {
var deferredResult;
var prng;
//MochiKit.Logging.logError(">>> User.register: " + this);
prng = Clipperz.Crypto.PRNG.defaultRandomGenerator();
deferredResult = new MochiKit.Async.Deferred()
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.register - 1: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(prng, 'deferredEntropyCollection'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.register - 2: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.header(), 'updateAllSections'), anInvitationCode);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.register - 2.1: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.connection(), 'register'), anInvitationCode);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.register - 3: " + res); return res;});
deferredResult.callback();
//MochiKit.Logging.logError("<<< User.register");
return deferredResult;
},
//=========================================================================
'connect': function(aValue) {
var deferredResult;
var prng;
prng = Clipperz.Crypto.PRNG.defaultRandomGenerator();
//MochiKit.Logging.logDebug(">>> User.connect");
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.2.1 - User.connect - 1: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(prng, 'deferredEntropyCollection'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.2.2 - User.connect - 2: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.connection(), 'login'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.2.3 - User.connect - 3: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
// TODO: add an addErrback call here to manage a wrong login. Any error after this point is due to some other causes.
// possibly the same exact 'handleConnectionFallback use at the end of this same method.
if (this.connectionVersion() != 'current') {
var currentConnection;
currentVersionConnection = new Clipperz.PM.Crypto.communicationProtocol.versions['current']({user:this});
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.2.4 - User.connect - 4: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'connection_upgrading');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.2.5 - User.connect - 5: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.connection(), 'message'), 'upgradeUserCredentials', currentVersionConnection.serverSideUserCredentials());
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.2.6 - User.connect - 6: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
}
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.2.7 - User.connect - 7: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'userConnected', null);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.2.8 - User.connect - 8: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.addErrback(MochiKit.Base.method(this, 'handleConnectionFallback'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.2.9 - User.connect - 9: "/* + res*/); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("ERROR: " + res); return res;});
deferredResult.callback(aValue);
//MochiKit.Logging.logDebug("<<< User.connect");
return deferredResult;
},
//.........................................................................
'handleConnectionFallback': function(aValue) {
var result;
//MochiKit.Logging.logDebug(">>> User.handleConnectionFallback");
if (aValue instanceof MochiKit.Async.CancelledError) {
//MochiKit.Logging.logDebug("--- User.handleConnectionFallback - operation cancelled");
result = aValue;
} else {
//MochiKit.Logging.logDebug("--- User.handleConnectionFallback - an ERROR has occurred - " + aValue);
this.resetConnection();
this.setConnectionVersion(Clipperz.PM.Crypto.communicationProtocol.fallbackVersions[this.connectionVersion()]);
if (this.connectionVersion() != null) {
result = new MochiKit.Async.Deferred();
result.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'connection_tryOlderSchema');
result.addCallback(MochiKit.Base.method(this, 'connect'));
result.callback();
} else {
result = MochiKit.Async.fail(Clipperz.PM.DataModel.User.exception.LoginFailed);
}
}
//MochiKit.Logging.logDebug("<<< User.handleConnectionFallback");
return result;
},
//=========================================================================
'header': function() {
if (this._header == null) {
this._header = new Clipperz.PM.DataModel.Header({user:this});
}
return this._header;
},
//-------------------------------------------------------------------------
'statistics': function() {
if (this._statistics == null) {
this._statistics = new Clipperz.PM.DataModel.Statistics({user:this});
}
return this._statistics;
},
//-------------------------------------------------------------------------
'records': function() {
return this._records;
},
//.........................................................................
'addRecord': function(aValue, isBatchUpdate) {
this.records()[aValue.reference()] = aValue;
if (isBatchUpdate != true) {
Clipperz.NotificationCenter.notify(aValue, 'recordAdded', null, true);
Clipperz.NotificationCenter.notify(this, 'updatedSection', 'records', true);
}
},
//-----------------------------------------------------------------------------
'addNewRecord': function() {
var record;
//MochiKit.Logging.logDebug(">>> User.addNewRecord");
record = new Clipperz.PM.DataModel.Record({user:this});
this.addRecord(record);
Clipperz.NotificationCenter.notify(this, 'updatedSection', 'records', true);
//MochiKit.Logging.logDebug("<<< User.addNewRecord");
return record;
},
//-------------------------------------------------------------------------
'saveRecords': function(someRecords, aMethodName) {
var deferredResult;
var methodName;
var result;
var i,c;
//console.log("User.saveRecords - someRecords", someRecords);
methodName = aMethodName || 'addNewRecords';
Clipperz.NotificationCenter.notify(this, 'updatedSection', 'records', true);
//MochiKit.Logging.logDebug(">>> User.saveRecords");
//MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] User.saveRecords");
/*
MochiKit.Logging.logDebug("--- User.saveRecords - 1");
MochiKit.Iter.forEach(someRecords, function(aRecord) {
if (aRecord.headerNotes() != null) {
aRecord.setNotes(aRecord.headerNotes());
}
aRecord.syncDirectLoginReferenceValues();
aRecord.currentVersion().createNewVersion();
aRecord.updateKey();
});
MochiKit.Logging.logDebug("--- User.saveRecords - 2");
*/
result = {'records': []};
deferredResult = new MochiKit.Async.Deferred();
c = someRecords.length;
for (i=0; i<c; i++) {
deferredResult.addCallback(function(aRecord) {
if (aRecord.headerNotes() != null) {
aRecord.setNotes(aRecord.headerNotes());
}
aRecord.syncDirectLoginReferenceValues();
aRecord.currentVersion().createNewVersion();
aRecord.updateKey();
}, someRecords[i]);
deferredResult.addCallback(MochiKit.Async.wait, 0.1);
}
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 1 " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveCard_collectRecordInfo');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 2 " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveCard_encryptUserData');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 3 " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'encryptedData'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 4 " + res); return res;});
deferredResult.addCallback(function(aResult, res) {
aResult['user'] = res;
return aResult;
}, result);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 5 " + res); return res;});
c = someRecords.length;
for (i=0; i<c; i++) {
var recordData;
recordData = {};
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 6.1 " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveCard_encryptRecordData');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 6.2 " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(someRecords[i], 'encryptedData'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 6.3 " + res); return res;});
deferredResult.addCallback(function(aResult, res) {
aResult['record'] = res;
return aResult;
}, recordData);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 6.4 " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', {} /*'saveCard_encryptRecordVersions'*/);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 6.5 " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(someRecords[i].currentVersion(), 'encryptedData'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 6.6 " + res); return res;});
deferredResult.addCallback(function(aResult, res) {
aResult['currentRecordVersion'] = res;
return aResult;
}, recordData);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 6.7 " + res); return res;});
deferredResult.addCallback(function(aResult, res) {
aResult['records'].push(res);
return aResult;
}, result);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 6.8 " + res); return res;});
}
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 7 " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveCard_sendingData');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 8 " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.connection(), 'message'), methodName);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 9 " + res); return res;});
for (i=0; i<c; i++) {
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 9.1 " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(someRecords[i], 'takeSnapshotOfCurrentData'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 9.2 " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(someRecords[i], 'setIsBrandNew'), false);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 9.3 " + res); return res;});
}
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 10 " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'notify', 'recordUpdated');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 11 " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'notify', 'directLoginUpdated');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.saveRecords - 12 " + res); return res;});
deferredResult.callback();
return deferredResult;
},
//-------------------------------------------------------------------------
'removeRecord': function(aRecord) {
//MochiKit.Logging.logDebug(">>> User.removeRecord");
delete this.records()[aRecord.reference()];
//MochiKit.Logging.logDebug("--- User.removeRecord - 1");
Clipperz.NotificationCenter.notify(aRecord, 'recordRemoved', null, false);
Clipperz.NotificationCenter.notify(this, 'updatedSection', 'records', true);
//MochiKit.Logging.logDebug("<<< User.removeRecord");
},
//-------------------------------------------------------------------------
'deleteRecordsAction': function(someRecords) {
var deferredResult;
var parameters;
//MochiKit.Logging.logDebug(">>> User.deleteRecordsAction - someRecords.length: " + someRecords.length);
parameters = {};
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.deleteRecordsAction - 1 " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'deleteRecord_collectData');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.deleteRecordsAction - 2 " + res); return res;});
deferredResult.addCallback(function(someParameters, someRecords) {
var recordReferences;
recordReferences = MochiKit.Base.map(function(aRecord) {
var result;
result = aRecord.reference();
aRecord.remove();
return result;
}, someRecords);
someParameters.recordReferences = recordReferences;
return someParameters;
}, parameters);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.deleteRecordsAction - 3 " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'deleteRecord_encryptData');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.deleteRecordsAction - 4 " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'encryptedData'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.deleteRecordsAction - 5 " + res); return res;});
deferredResult.addCallback(function(someParameters, anUserEncryptedData) {
someParameters.user = anUserEncryptedData;
return someParameters;
}, parameters);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.deleteRecordsAction - 6 " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'deleteRecord_sendingData');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.deleteRecords parameters: " + Clipperz.Base.serializeJSON(res)); return res;});
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.deleteRecordsAction - 7 " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.connection(), 'message'), 'deleteRecords');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.deleteRecordsAction - 8 " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'deleteRecord_updatingInterface');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.deleteRecordsAction - 9 " + res); return res;});
deferredResult.callback(someRecords);
//MochiKit.Logging.logDebug("<<< User.deleteRecordsAction");
return deferredResult;
},
//-------------------------------------------------------------------------
'resetAllLocalData': function() {
this.resetConnection();
this.setUsername("");
this.setPassphrase("");
this._header = null;
this._statistics = null;
this._preferences = null;
this._records = {};
this._directLoginReferences = {};
},
//-------------------------------------------------------------------------
'deleteAccountAction': function() {
var deferredResult;
//MochiKit.Logging.logDebug(">>> user.deleteAccountAction - " + this);
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(MochiKit.Base.method(this.connection(), 'message'), 'deleteUser');
deferredResult.addCallback(MochiKit.Base.method(this, 'resetAllLocalData'));
deferredResult.callback();
//MochiKit.Logging.logDebug("<<< user.deleteAccountAction - " + this);
return deferredResult;
},
//-------------------------------------------------------------------------
'encryptedData': function() {
var deferredResult;
var result;
result = {};
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.encryptedData - 0: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.header(), 'encryptedData'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.encryptedData - 1: " + res); return res;});
deferredResult.addCallback(function(aResult, aValue) {
aResult['header'] = aValue;
}, result);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.encryptedData - 2: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.statistics(), 'encryptedData'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.encryptedData - 3: " + res); return res;});
deferredResult.addCallback(function(aResult, aValue) {
aResult['statistics'] = aValue;
}, result);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.encryptedData - 4: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.bind(function(aResult, aValue) {
aResult['version'] = Clipperz.PM.Crypto.encryptingFunctions.currentVersion;
aResult['lock'] = this.lock();
return aResult;
}, this), result);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.encryptedData - 5: " + res); return res;});
deferredResult.callback();
return deferredResult;
},
//-------------------------------------------------------------------------
'preferences': function() {
if (this._preferences == null) {
this._preferences = new Clipperz.PM.DataModel.UserPreferences({user:this});
}
return this._preferences;
},
/*
'setPreferences': function(aValue) {
this._preferences = aValue;
if (this._preferences.preferredLanguage() != null) {
Clipperz.PM.Strings.Languages.setSelectedLanguage(this._preferences.preferredLanguage());
} else {
//MochiKit.Logging.logDebug("### keepping the browser selected language: " + Clipperz.PM.Strings.selectedLanguage);
}
},
*/
//-------------------------------------------------------------------------
'oneTimePasswordManager': function() {
if (this._oneTimePasswordManager == null) {
this._oneTimePasswordManager = new Clipperz.PM.DataModel.OneTimePasswordManager(this, null);
}
return this._oneTimePasswordManager;
},
//-------------------------------------------------------------------------
'directLoginReferences': function() {
return this._directLoginReferences;
},
'addDirectLoginReference': function(aDirectLoginReference, isBatchUpdate) {
//MochiKit.Logging.logDebug(">>> User.addDirectLoginReference");
this.directLoginReferences()[aDirectLoginReference.reference()] = aDirectLoginReference;
if (isBatchUpdate != true) {
Clipperz.NotificationCenter.notify(aDirectLoginReference, 'directLoginAdded');
Clipperz.NotificationCenter.notify(this, 'updatedSection', 'directLogins', true);
}
},
'removeDirectLoginReference': function(aDirectLoginReference) {
delete this.directLoginReferences()[aDirectLoginReference.reference()];
Clipperz.NotificationCenter.notify(aDirectLoginReference, 'directLoginRemoved');
Clipperz.NotificationCenter.notify(this, 'updatedSection', 'directLogins', true);
},
//.........................................................................
'addDirectLogin': function(aDirectLogin) {
var newDirectLoginReference;
newDirectLoginReference = new Clipperz.PM.DataModel.DirectLoginReference({user:this, directLogin:aDirectLogin})
this.addDirectLoginReference(newDirectLoginReference);
},
'synchronizeDirectLogin': function(aDirectLogin) {
var directLoginReference;
directLoginReference = this.directLoginReferences()[aDirectLogin.reference()];
if (typeof(directLoginReference) != 'undefined') {
directLoginReference.synchronizeValues(aDirectLogin);
} else {
this.addDirectLogin(aDirectLogin);
}
},
'removeDirectLogin': function(aDirectLogin) {
this.removeDirectLoginReference(aDirectLogin);
},
//-------------------------------------------------------------------------
'changeCredentials': function(aUsername, aPassphrase) {
var deferredResult;
var result;
result = {};
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(MochiKit.Base.method(this.header(), 'loadAllSections'));
deferredResult.addCallback(MochiKit.Base.method(this.header(), 'updateAllSections'));
deferredResult.addCallback(MochiKit.Base.bind(function(aUsername, aPssphrase) {
this.setUsername(aUsername);
this.setPassphrase(aPassphrase);
}, this), aUsername, aPassphrase)
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.changeCredentials - 1: " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'changeCredentials_encryptingData');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.changeCredentials - 2: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'encryptedData'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.changeCredentials - 3: " + res); return res;});
deferredResult.addCallback(function(aResult, anEncryptedData) {
aResult['user'] = anEncryptedData;
return aResult;
}, result);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.changeCredentials - 4: " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'changeCredentials_creatingNewCredentials');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.changeCredentials - 5: " + res); return res;});
deferredResult.addCallback(function(aResult, anUser) {
var newConnection;
newConnection = new Clipperz.PM.Crypto.communicationProtocol.versions[Clipperz.PM.Crypto.communicationProtocol.currentVersion]({user:anUser})
aResult['credentials'] = newConnection.serverSideUserCredentials();
return aResult;
}, result, this);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.changeCredentials - 6: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.oneTimePasswordManager(), 'encryptedData'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.changeCredentials - 7: " + res); return res;});
deferredResult.addCallback(function(aResult, anEncryptedData) {
aResult['oneTimePasswords'] = anEncryptedData;
return aResult;
}, result);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.changeCredentials - 8: " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'changeCredentials_sendingCredentials');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.changeCredentials - 9: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.connection(), 'message'), 'upgradeUserCredentials');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.changeCredentials - 10: " + res); return res;});
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'changeCredentials_done');
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.changeCredentials - 11: " + res); return res;});
deferredResult.callback();
return deferredResult;
},
//-------------------------------------------------------------------------
'doLogout': function() {
var deferredResult;
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.doLogout - 1: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this.connection(), 'logout'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.doLogout - 2: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'resetAllLocalData'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.doLogout - 3: " + res); return res;});
deferredResult.callback();
return deferredResult;
},
//-------------------------------------------------------------------------
'lock': function() {
this.setPassphrase("")
this.connection().logout();
this.connection().resetSrpConnection();
},
'unlockWithPassphrase': function(aValue) {
var deferredResult;
// var connection;
// connection = this.connection();
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.unlockWithPassphrase 1: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(this, 'setPassphrase'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.unlockWithPassphrase 2: " + res); return res;});
// deferredResult.addCallback(MochiKit.Base.method(connection, 'message'), 'echo', {'echo':"echo"});
deferredResult.addCallback(MochiKit.Base.method(this.connection(), 'reestablishConnection'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.unlockWithPassphrase 3: " + res); return res;});
// deferredResult.addErrback(MochiKit.Base.method(this, 'setPassphrase', ""));
deferredResult.addErrback(MochiKit.Base.bind(function(anError) {
this.setPassphrase("");
this.connection().resetSrpConnection();
return anError;
}, this));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("User.unlockWithPassphrase 4: " + res); return res;});
deferredResult.callback(aValue);
return deferredResult;
},
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
'serverData': function() {
return this._serverData;
},
'setServerData': function(aValue) {
//MochiKit.Logging.logDebug(">>> User.setServerData");
this._serverData = aValue;
if (typeof(aValue.maxNumberOfRecords) != 'undefined') {
this.setMaxNumberOfRecords(aValue.maxNumberOfRecords);
}
//MochiKit.Logging.logDebug("<<< User.setServerData");
},
//-------------------------------------------------------------------------
'isLoadingUserDetails': function() {
return this._isLoadingUserDetails;
},
'setIsLoadingUserDetails': function(aValue) {
this._isLoadingUserDetails = aValue;
},
//-------------------------------------------------------------------------
'loadingUserDetailsPendingQueue': function() {
return this._loadingUserDetailsPendingQueue;
},
'flushLoadingUserDetailsPendingQueue': function() {
var queue;
//MochiKit.Logging.logDebug(">>> User.flushLoadingUserDetailsPendingQueue");
queue = this.loadingUserDetailsPendingQueue();
while(queue.length > 0) {
//MochiKit.Logging.logDebug("--- User.flushLoadingUserDetailsPendingQueue - pop");
queue.pop().callback();
}
//MochiKit.Logging.logDebug("<<< User.flushLoadingUserDetailsPendingQueue");
},
//-------------------------------------------------------------------------
'getUserDetails': function() {
var deferredResult;
//MochiKit.Logging.logDebug(">>> User.getUserDetails");
deferredResult = new MochiKit.Async.Deferred();
if ((this.serverData() == null) && (this.isLoadingUserDetails() == false)) {
deferredResult.addCallback(MochiKit.Base.method(this, 'setIsLoadingUserDetails', true));
deferredResult.addCallback(MochiKit.Base.method(this.connection(), 'message'), 'getUserDetails');
deferredResult.addCallback(MochiKit.Base.method(this, 'setServerData'));
deferredResult.addCallback(MochiKit.Base.method(this, 'flushLoadingUserDetailsPendingQueue'));
deferredResult.addCallback(MochiKit.Base.method(this, 'setIsLoadingUserDetails', false));
}
deferredResult.addCallback(MochiKit.Base.method(this, 'serverData'));
if (this.isLoadingUserDetails() == false) {
deferredResult.callback();
} else {
this.loadingUserDetailsPendingQueue().push(deferredResult);
}
//MochiKit.Logging.logDebug("<<< User.getUserDetails");
return deferredResult;
},
//-------------------------------------------------------------------------
'loadRecords': function() {
return this.header().loadRecords();
},
'loadDirectLogins': function() {
return this.header().loadDirectLogins();
},
'loadPreferences': function() {
return this.header().loadPreferences();
},
'loadOneTimePasswords': function() {
return this.header().loadOneTimePasswords();
},
//-------------------------------------------------------------------------
'loadLoginHistory': function() {
var deferredResult;
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(MochiKit.Base.method(this.connection(), 'message'), 'getLoginHistory');
deferredResult.addCallback(function(aResult) {
return aResult['result'];
});
deferredResult.addCallback(MochiKit.Base.method(this, 'setLoginHistory'));
deferredResult.addCallback(MochiKit.Base.method(this, 'loginHistory'));
deferredResult.callback();
return deferredResult;
},
//-------------------------------------------------------------------------
'shouldDownloadOfflineCopy': function() {
return this._shouldDownloadOfflineCopy;
},
'setShouldDownloadOfflineCopy': function(aValue) {
this._shouldDownloadOfflineCopy = aValue;
},
//-------------------------------------------------------------------------
'loginInfo': function() {
return this._loginInfo;
},
'setLoginInfo': function(aValue) {
this._loginInfo = aValue;
//MochiKit.Logging.logDebug("### LoginInfo: " + Clipperz.Base.serializeJSON(aValue));
},
//-------------------------------------------------------------------------
'loginHistory': function() {
return this._loginHistory;
},
'setLoginHistory': function(aValue) {
this._loginHistory = aValue;
},
/*
'loginInfoWithOneTimePasswordReference': function(aOneTimePasswordReference) {
var result;
var i,c;
result = null;
c = this.loginHistory().length;
for (i=0; (i<c) && (result == null); i++) {
var currentLoginInfo;
currentLoginInfo = this.loginHistory()[i];
if (currentLoginInfo['oneTimePasswordReference'] == aOneTimePasswordReference) {
result = currentLoginInfo;
}
}
return result;
},
*/
//-------------------------------------------------------------------------
'lock': function() {
return this._lock;
},
'setLock': function(aValue) {
//MochiKit.Logging.logDebug("=== User.setLock: " + aValue);
this._lock = aValue;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
Clipperz.PM.DataModel.User.exception = {
LoginFailed: new MochiKit.Base.NamedError("Clipperz.PM.DataModel.User.exception.LoginFailed")
};

View File

@@ -0,0 +1,197 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
//#############################################################################
Clipperz.PM.DataModel.UserPreferences = function(args) {
args = args || {};
this._user = args['user']; delete args['user'];
this._config = args;
return this;
}
Clipperz.PM.DataModel.UserPreferences.prototype = MochiKit.Base.update(null, {
//-------------------------------------------------------------------------
'config': function() {
return this._config;
},
//-------------------------------------------------------------------------
'user': function() {
return this._user;
},
//-------------------------------------------------------------------------
'updateWithData': function(someValues) {
var currentLanguage;
//MochiKit.Logging.logDebug(">>> Clipperz.PM.DataModel.UserPreferences.updateWithData: " + Clipperz.Base.serializeJSON(someValues));
currentLanguage = this.preferredLanguage();
MochiKit.Base.update(this._config, someValues);
if (this.preferredLanguage() != currentLanguage) {
Clipperz.PM.Strings.Languages.setSelectedLanguage(this.preferredLanguage());
} else {
//MochiKit.Logging.logDebug("### keepping the browser selected language: " + Clipperz.PM.Strings.selectedLanguage);
}
return this;
},
//-------------------------------------------------------------------------
'configValue': function(aConfigName, aDefaultValue) {
var result;
//MochiKit.Logging.logDebug(">>> UserPreferences.configValue - config: " + Clipperz.Base.serializeJSON(this.config()));
if (typeof(this.config()[aConfigName]) == 'undefined') {
result = aDefaultValue;
} else {
result = this.config()[aConfigName];
}
//MochiKit.Logging.logDebug("<<< UserPreferences.configValue");
return result;
},
'setConfigValue': function(aConfigName, aValue) {
var result;
if (aValue != this.configValue(aConfigName)) {
if (aValue == null) {
delete this.config()[aConfigName]
} else {
this.config()[aConfigName] = aValue;
}
Clipperz.NotificationCenter.notify(this.user(), 'updatedSection', 'preferences', true);
result = true;
} else {
result = false;
}
return result;
},
//-------------------------------------------------------------------------
'useSafeEditMode': function() {
return this.configValue('useSafeEditMode', true);
},
'setUseSafeEditMode': function(aValue) {
this.setConfigValue('useSafeEditMode', aValue);
},
//-------------------------------------------------------------------------
'preferredLanguage': function() {
return this.configValue('preferredLanguage', null);
},
'setPreferredLanguage': function(aValue) {
if (this.setConfigValue('preferredLanguage', aValue)) {
Clipperz.PM.Strings.Languages.setSelectedLanguage(this.preferredLanguage());
}
},
//-------------------------------------------------------------------------
'shouldShowDonationPanel': function() {
return this.configValue('shouldShowDonationPanel', true);
},
'setShouldShowDonationPanel': function(aValue) {
this.setConfigValue('shouldShowDonationPanel', aValue);
},
//-------------------------------------------------------------------------
'disableUnsecureFaviconLoadingForIE': function() {
return this.configValue('disableUnsecureFaviconLoadingForIE', false);
},
'setDisableUnsecureFaviconLoadingForIE': function(aValue) {
this.setConfigValue('disableUnsecureFaviconLoadingForIE', aValue);
},
//-------------------------------------------------------------------------
'serializedData': function() {
return this.config();
},
//-------------------------------------------------------------------------
'saveChanges': function(aReferenceElement) {
var deferredResult;
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Components.MessageBox(), 'deferredShow'),
{
title:"", // Clipperz.PM.Strings['accountPreferencesSavingPanelTitle_Step1'],
text:"", // Clipperz.PM.Strings['accountPreferencesSavingPanelText_Step1'],
width:240,
showProgressBar:true,
showCloseButton:false
},
aReferenceElement
);
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'account_savingPreferences_1');
deferredResult.addCallback(MochiKit.Base.method(this.user(), 'encryptedData'));
deferredResult.addCallback(function(res) {
return {user:res};
})
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'account_savingPreferences_2');
deferredResult.addCallback(MochiKit.Base.method(this.user().connection(), 'message'), 'updateData');
deferredResult.addCallback(Clipperz.PM.Components.MessageBox().hide, YAHOO.ext.Element.get('main'));
deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedPreferences', null);
deferredResult.callback();
return deferredResult;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,193 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Date) == 'undefined') { Clipperz.PM.Date = {}; }
Clipperz.PM.Date.VERSION = "0.1";
Clipperz.PM.Date.NAME = "Clipperz.PM.Date";
MochiKit.Base.update(Clipperz.PM.Date, {
'__repr__': function () {
return "[" + this.NAME + " " + this.VERSION + "]";
},
//-------------------------------------------------------------------------
'toString': function () {
return this.__repr__();
},
//-------------------------------------------------------------------------
'locale': function() {
return {
'amDesignation': Clipperz.PM.Strings['calendarStrings']['amDesignation'],
'pmDesignation': Clipperz.PM.Strings['calendarStrings']['pmDesignation'],
'days': Clipperz.PM.Strings['calendarStrings']['days'],
'shortDays': Clipperz.PM.Strings['calendarStrings']['shortDays'],
'shortMonths': Clipperz.PM.Strings['calendarStrings']['shortMonths'],
'months': Clipperz.PM.Strings['calendarStrings']['months']
}
},
//=========================================================================
/*
'formatDateWithPHPLikeTemplate': function(aDate, aTemplate) {
return Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
},
'parseDateWithPHPLikeTemplate': function(aDate, aTemplate) {
return Clipperz.Date.parseDateWithPHPTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
},
//=========================================================================
'formatDateWithJavaLikeTemplate': function(aDate, aTemplate) {
return Clipperz.Date.formatDateWithJavaLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
},
'parseDateWithJavaLikeTemplate': function(aDate, aTemplate) {
return Clipperz.Date.parseDateWithJavaLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
},
*/
//=========================================================================
'formatDateWithTemplate': function(aDate, aTemplate) {
var result;
if (aDate == null) {
result = ""
} else {
result = Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
};
return result;
},
'parseDateWithTemplate': function(aValue, aTemplate) {
return Clipperz.Date.parseDateWithPHPTemplateAndLocale(aValue, aTemplate, Clipperz.PM.Date.locale());
},
//=========================================================================
'formatDateWithUTCFormat': function(aDate) {
return Clipperz.Date.formatDateWithUTCFormatAndLocale(aDate, Clipperz.PM.Date.locale());
},
'parseDateWithUTCFormat': function(aValue) {
var result;
if (aValue == null) {
result = null;
} else {
result = Clipperz.Date.parseDateWithUTCFormatAndLocale(aValue, Clipperz.PM.Date.locale());
}
return result;
},
//=========================================================================
'getElapsedTimeDescription': function(aDate) {
var result;
result = ""
if (aDate != null) {
var now;
var elapsedTime;
var millisencondsInAMinute;
var millisencondsInAnHour;
var millisencondsInADay;
var millisencondsInAWeek;
var millisencondsInAMonth;
now = new Date();
elapsedTime = now.getTime() - aDate.getTime();
millisencondsInAMinute = 60 * 1000;
millisencondsInAnHour = millisencondsInAMinute * 60;
millisencondsInADay = millisencondsInAnHour * 24;
millisencondsInAWeek = millisencondsInADay * 7;
millisencondsInAMonth = millisencondsInAWeek * 5;
if ((elapsedTime / millisencondsInAMonth) > 1) {
result = Clipperz.PM.Strings['elapsedTimeDescriptions']['MORE_THAN_A_MONTH_AGO'];
} else if ((elapsedTime / millisencondsInAWeek) > 1) {
var elapsedWeeks;
elapsedWeeks = Math.floor((elapsedTime / millisencondsInAWeek));
if (elapsedWeeks == 1) {
result = Clipperz.PM.Strings['elapsedTimeDescriptions']['MORE_THAN_A_WEEK_AGO'];
} else {
result = Clipprez.PM.Strings['elapsedTimeDescriptions']['MORE_THAN_*_WEEKS_AGO'].replace(/__elapsed__/, elapsedWeeks);
}
} else if ((elapsedTime / millisencondsInADay) > 1) {
var elapsedDays;
elapsedDays = Math.floor((elapsedTime / millisencondsInADay));
if (elapsedDays == 1) {
result = Clipperz.PM.Strings['elapsedTimeDescriptions']['YESTERDAY'];
} else {
result = Clipperz.PM.Strings['elapsedTimeDescriptions']['*_DAYS_AGO'].replace(/__elapsed__/, elapsedDays);
}
} else if ((elapsedTime / millisencondsInAnHour) > 1) {
var elapsedHours;
elapsedHours = Math.floor((elapsedTime / millisencondsInAnHour));
if (elapsedHours == 1) {
result = Clipperz.PM.Strings['elapsedTimeDescriptions']['ABOUT_AN_HOUR_AGO'];
} else {
result = Clipperz.PM.Strings['elapsedTimeDescriptions']['*_HOURS_AGO'].replace(/__elapsed__/, elapsedHours);
}
} else {
var elapsed10Minutes;
elapsed10Minutes = (Math.floor((elapsedTime / millisencondsInAMinute) / 10)) * 10;
if (elapsed10Minutes == 0) {
result = Clipperz.PM.Strings['elapsedTimeDescriptions']['JUST_A_FEW_MINUTES_AGO'];
} else {
result = Clipperz.PM.Strings['elapsedTimeDescriptions']['ABOUT_*_MINUTES_AGO'].replace(/__elapsed__/, elapsed10Minutes+"");
}
}
}
return result;
},
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,588 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
Clipperz.PM.VERSION = "0.1";
Clipperz.PM.NAME = "Clipperz.PM";
//#############################################################################
Clipperz.PM.Main = function() {
this._loginPanel = null;
this._user = null;
this._isRunningCompact = false;
Clipperz.NotificationCenter.register(null, 'userConnected', this, 'userConnectedCallback');
Clipperz.NotificationCenter.register(null, 'switchLanguage', this, 'switchLanguageHandler');
Clipperz.NotificationCenter.register(null, 'EXCEPTION', this, 'reportException');
return this;
}
//=============================================================================
MochiKit.Base.update(Clipperz.PM.Main.prototype, {
'toString': function() {
return "Clipperz.PM.Main";
},
'switchLanguageHandler': function() {
//MochiKit.Logging.logDebug(">>> main.switchLanguageHandler");
YAHOO.ext.Element.get('donateHeaderIconLink').dom.href = Clipperz.PM.Strings['donateHeaderLinkUrl'];
YAHOO.ext.Element.get('donateHeaderLink').update(Clipperz.PM.Strings['donateHeaderLinkLabel']).dom.href = Clipperz.PM.Strings['donateHeaderLinkUrl'];
YAHOO.ext.Element.get('creditsHeaderLink').update(Clipperz.PM.Strings['creditsHeaderLinkLabel']).dom.href = Clipperz.PM.Strings['creditsHeaderLinkUrl'];
YAHOO.ext.Element.get('feedbackHeaderLink').update(Clipperz.PM.Strings['feedbackHeaderLinkLabel']).dom.href = Clipperz.PM.Strings['feedbackHeaderLinkUrl'];
YAHOO.ext.Element.get('helpHeaderLink').update(Clipperz.PM.Strings['helpHeaderLinkLabel']).dom.href = Clipperz.PM.Strings['helpHeaderLinkUrl'];
YAHOO.ext.Element.get('forumHeaderLink').update(Clipperz.PM.Strings['forumHeaderLinkLabel']).dom.href = Clipperz.PM.Strings['forumHeaderLinkUrl'];
if (YAHOO.ext.Element.get('logout') != null) {
YAHOO.ext.Element.get('logout').update(Clipperz.PM.Strings['logoutMenuLabel']);
YAHOO.ext.Element.get('lock').update(Clipperz.PM.Strings['lockMenuLabel']);
YAHOO.ext.Element.get('recordsTabAnchor').update(Clipperz.PM.Strings['recordMenuLabel']);
YAHOO.ext.Element.get('accountTabAnchor').update(Clipperz.PM.Strings['accountMenuLabel']);
YAHOO.ext.Element.get('dataTabAnchor').update(Clipperz.PM.Strings['dataMenuLabel']);
// YAHOO.ext.Element.get('contactsTabAnchor').update(Clipperz.PM.Strings['contactsMenuLabel']);
YAHOO.ext.Element.get('toolsTabAnchor').update(Clipperz.PM.Strings['toolsMenuLabel']);
}
//MochiKit.Logging.logDebug("<<< main.switchLanguageHandler");
},
//-------------------------------------------------------------------------
'fixToDrawTheMainTabsCorrectlyOnSafari': function() {
this.switchLanguageHandler();
},
//-------------------------------------------------------------------------
'run': function(shouldShowRegistrationForm) {
var mainElement;
Clipperz.NotificationCenter.register(null, 'updatedProgressState', this, 'updateProgressDialogStatus');
YAHOO.ext.Element.get('recordDetailEditModeHeaderMask').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide().unmask();
YAHOO.ext.Element.get('recordDetailEditModeVerticalMask').setVisibilityMode(YAHOO.ext.Element.DISPLAY).hide().unmask();
//MochiKit.Logging.logDebug(">>> Main.run");
mainElement = YAHOO.ext.Element.get('main');
if (Clipperz.PM.Proxy.defaultProxy.isReadOnly()) {
YAHOO.ext.Element.get('applicationVersionType').dom.className = "readOnly";
}
mainElement.update("");
Clipperz.YUI.DomHelper.append(mainElement.dom, {tag:'ul', cls:'clipperzTabPanels', children:[
{tag:'li', id:'loginPanel'}
]})
this.setLoginPanel(new Clipperz.PM.Components.Panels.LoginPanel(YAHOO.ext.Element.get('loginPanel')));
//MochiKit.Logging.logDebug("--- Main.run - selecting active form to show ...");
if (shouldShowRegistrationForm == true) {
this.loginPanel().showRegistrationForm(false);
} else {
this.loginPanel().showLoginForm(false);
}
this.switchLanguageHandler();
//MochiKit.Logging.logDebug("--- Main.run - selecting active form to show. done.");
//MochiKit.Logging.logDebug("<<< Main.run");
},
//-------------------------------------------------------------------------
'runCompact': function() {
this.setIsRunningCompact(true);
YAHOO.ext.Element.get(document.body).addClass("compact");
new Clipperz.PM.Components.Compact.LoginForm(YAHOO.ext.Element.get('mainDiv'));
},
'showCompactInterface': function() {
//MochiKit.Logging.logDebug(">>> main.showCompactInterface");
new Clipperz.PM.Components.Compact.CompactInterface(YAHOO.ext.Element.get('compactBody'), {user:this.user()});
//MochiKit.Logging.logDebug("<<< main.showCompactInterface");
},
//-------------------------------------------------------------------------
'mainPage': function() {
if (this._mainPage == null) {
this._mainPage = new Clipperz.PM.Components.MainPage();
}
return this._mainPage;
},
//-------------------------------------------------------------------------
'loginPanel': function() {
return this._loginPanel;
},
'setLoginPanel': function(aValue) {
this._loginPanel = aValue;
},
//-------------------------------------------------------------------------
'showMainPanels': function() {
var mainElement;
var logoutBlock;
var lockBlock;
var menusTRElement;
this.loginPanel().remove();
this.setLoginPanel(null);
logoutBlock = YAHOO.ext.Element.get('logoutLI');
Clipperz.YUI.DomHelper.append(logoutBlock.dom, {tag:'a', href:"#", id:'logout', htmlString:Clipperz.PM.Strings['logoutMenuLabel']});
MochiKit.Signal.connect('logout', 'onclick', this, 'doLogoutEventHandler');
lockBlock = YAHOO.ext.Element.get('lockLI');
Clipperz.YUI.DomHelper.append(lockBlock.dom, {tag:'a', href:"#", id:'lock', htmlString:Clipperz.PM.Strings['lockMenuLabel']});
MochiKit.Signal.connect('lock', 'onclick', this, 'doLockEventHandler');
menusTRElement = YAHOO.ext.Element.get('menusTR');
Clipperz.YUI.DomHelper.append(menusTRElement.dom, {tag:'td', id:'recordsTab', children:[{tag:'div', children:[{tag:'a', id:'recordsTabAnchor', htmlString:Clipperz.PM.Strings['recordMenuLabel']}]}]});
Clipperz.YUI.DomHelper.append(menusTRElement.dom, {tag:'td', id:'accountTab', children:[{tag:'div', children:[{tag:'a', id:'accountTabAnchor', htmlString:Clipperz.PM.Strings['accountMenuLabel']}]}]});
Clipperz.YUI.DomHelper.append(menusTRElement.dom, {tag:'td', id:'dataTab', children:[{tag:'div', children:[{tag:'a', id:'dataTabAnchor', htmlString:Clipperz.PM.Strings['dataMenuLabel']}]}]});
// Clipperz.YUI.DomHelper.append(menusTRElement.dom, {tag:'td', id:'contactsTab', children:[{tag:'div', children:[{tag:'a', id:'contactsTabAnchor', htmlString:Clipperz.PM.Strings['contactsMenuLabel']}]}]});
Clipperz.YUI.DomHelper.append(menusTRElement.dom, {tag:'td', id:'toolsTab', children:[{tag:'div', children:[{tag:'a', id:'toolsTabAnchor', htmlString:Clipperz.PM.Strings['toolsMenuLabel']}]}]});
mainElement = YAHOO.ext.Element.get('main');
mainElement.update("");
Clipperz.YUI.DomHelper.append(mainElement.dom, {tag:'ul', cls:'clipperzTabPanels', children:[
{tag:'li', id:'recordsPanel'},
{tag:'li', id:'accountPanel'},
{tag:'li', id:'dataPanel'},
// {tag:'li', id:'contactsPanel'},
{tag:'li', id:'toolsPanel'}
]}, true)
new Clipperz.PM.Components.TabPanel.TabPanelController({
name: 'mainTabPanel',
config:{ 'recordsTab':'recordsPanel',
'accountTab':'accountPanel',
'dataTab':'dataPanel',
// 'contactsTab':'contactsPanel',
'toolsTab':'toolsPanel'},
selectedTab:'recordsTab'
}).setUp();
new Clipperz.PM.Components.Panels.MainPanel(YAHOO.ext.Element.get('recordsPanel'), {user:this.user()});
new Clipperz.PM.Components.Panels.AccountPanel(YAHOO.ext.Element.get('accountPanel'), {user:this.user()});
new Clipperz.PM.Components.Panels.DataPanel(YAHOO.ext.Element.get('dataPanel'), {user:this.user()});
// new Clipperz.PM.Components.Panels.ContactsPanel(YAHOO.ext.Element.get('contactsPanel'), {user:this.user()});
new Clipperz.PM.Components.Panels.ToolsPanel(YAHOO.ext.Element.get('toolsPanel'), {user:this.user()});
this.fixToDrawTheMainTabsCorrectlyOnSafari(); // fix to
//MochiKit.Logging.logDebug("<<< Main.showMainPanels");
},
//-------------------------------------------------------------------------
'userConnectedCallback': function(anEvent) {
//MochiKit.Logging.logDebug(">>> Main.userConnectedCallback");
//MochiKit.Logging.logDebug(">>> doConnect - user: " + this.user());
this.setUser(anEvent.source());
if (this.isRunningCompact()) {
this.showCompactInterface();
} else {
this.showMainPanels();
}
//MochiKit.Logging.logDebug("<<< Main.userConnectedCallback");
},
//-----------------------------------------------------------------------------
'user': function() {
return this._user;
},
'setUser': function(aValue) {
this._user = aValue;
},
//-----------------------------------------------------------------------------
'doLogoutEventHandler': function(anEvent) {
var deferred;
anEvent.stop();
deferred = new MochiKit.Async.Deferred();
//deferred.addBoth(function(res) {MochiKit.Logging.logDebug("Main.doLogoutEventHandler - 1: " + res); return res;});
deferred.addCallback(MochiKit.Base.method(this.user(), 'doLogout'));
//deferred.addBoth(function(res) {MochiKit.Logging.logDebug("Main.doLogoutEventHandler - 2: " + res); return res;});
deferred.addCallback(Clipperz.PM.exit, 'logout.html');
//deferred.addBoth(function(res) {MochiKit.Logging.logDebug("Main.doLogoutEventHandler - 3: " + res); return res;});
deferred.callback();
},
//-----------------------------------------------------------------------------
'doLockEventHandler': function(anEvent) {
var deferredResult;
var lockDialogElement;
var lockDialog;
var unlockButton;
anEvent.stop();
Clipperz.NotificationCenter.notify(this, 'accountLocked', null, true);
lockDialogElement = Clipperz.YUI.DomHelper.append(document.body, {tag:'div', id:'lockDialog', children:[
{tag:'div', cls:'ydlg-hd', htmlString:Clipperz.PM.Strings['lockTitle']},
{tag:'div', cls:'ydlg-bd', children:[
{tag:'div', cls:'alert-message', id:'lockMessage', children:[
{tag:'div', htmlString:Clipperz.PM.Strings['lockDescription']},
{tag:'form', id:'lockDialogForm', children:[
{tag:'input', type:'password', id:'lockPassphrase'}
]}
]}
]},
{tag:'div', cls:'ydlg-ft'}
]}, true);
new Clipperz.PM.Components.PasswordEntropyDisplay(YAHOO.ext.Element.get('lockPassphrase'));
lockDialog = new YAHOO.ext.BasicDialog(
lockDialogElement, {
closable:false,
modal:true,
autoTabs:false,
resizable:false,
fixedcenter:true,
constraintoviewport:false,
width:350,
height:130,
shadow:true
}
);
unlockButton = lockDialog.addButton(Clipperz.PM.Strings['unlockButtonLabel'], MochiKit.Base.method(this, 'exitLock', lockDialog));
//MochiKit.Logging.logDebug("--- Main.showAlertDialog - 5");
lockDialog.setDefaultButton(unlockButton);
MochiKit.Signal.connect('lockDialogForm', 'onsubmit', MochiKit.Base.method(this, 'exitLock', lockDialog));
lockDialog.on('show', function() {YAHOO.ext.Element.get('lockPassphrase').focus();});
lockDialog.show('main');
// this.user().lock();
},
'exitLock': function(aLockDialog, anEvent) {
// var deferredResult;
//MochiKit.Logging.logDebug(">>> Exiting lock");
if (typeof(anEvent.stop) != 'undefined') {
anEvent.stop();
}
if (this.user().passphrase() == YAHOO.ext.Element.get('lockPassphrase').dom.value) {
aLockDialog.hide(MochiKit.Base.method(aLockDialog, 'destroy', true));
Clipperz.NotificationCenter.notify(this, 'accountUnlocked', null, true);
} else {
YAHOO.ext.Element.get('lockPassphrase').dom.value = "";
YAHOO.ext.Element.get('lockPassphrase').focus();
}
// deferredResult = new MochiKit.Async.Deferred();
// deferredResult.addCallback(MochiKit.Base.method(this.user(), 'unlockWithPassphrase'));
// deferredResult.addCallback(MochiKit.Base.method(aLockDialog, 'hide', MochiKit.Base.method(aLockDialog, 'destroy', true)));
// deferredResult.addCallback(MochiKit.Base.method(Clipperz.NotificationCenter, 'notify', this, 'accountUnlocked', null, true));
// deferredResult.addErrback(function() {
// YAHOO.ext.Element.get('lockPassphrase').dom.value = "";
// YAHOO.ext.Element.get('lockPassphrase').focus();
// });
// deferredResult.callback(YAHOO.ext.Element.get('lockPassphrase').dom.value);
return false;
},
//-----------------------------------------------------------------------------
'updateProgressDialogStatus': function(anEvent) {
//MochiKit.Logging.logDebug(">>> main.updateProgressDialogStatus - " + anEvent.parameters());
//try {
if (Clipperz.Base.objectType(anEvent.parameters()) == 'string') {
Clipperz.PM.Components.MessageBox().update(Clipperz.PM.Strings.messagePanelConfigurations[anEvent.parameters()]());
} else {
Clipperz.PM.Components.MessageBox().update(anEvent.parameters());
}
//} catch (exception) {
//console.log("updateProgressDialogStatus - anEvent", anEvent);
// MochiKit.Logging.logError("Main.updateProgressDialogStatus: " + exception);
// throw exception;
//}
//MochiKit.Logging.logDebug("<<< main.updateProgressDialogStatus");
},
//-----------------------------------------------------------------------------
'defaultErrorHandler': function(anErrorString, anException) {
MochiKit.Logging.logDebug(">>> DEFAULT ERROR HANDLER: " + anErrorString + " (exception: " + Clipperz.Base.serializeJSON(anException) + ")");
},
//-----------------------------------------------------------------------------
'isRunningCompact': function() {
return this._isRunningCompact;
},
'setIsRunningCompact': function(aValue) {
this._isRunningCompact = aValue;
},
//-----------------------------------------------------------------------------
'reportException': function(anError) {
/*
var deferredResult;
deferredResult = new MochiKit.Async.Deferred();
Clipperz.PM.Components.MessageBox().show(
{
title:Clipperz.PM.Strings['fatalErrorMessageTitle'],
text:Clipperz.PM.Strings['fatalErrorMessageText'],
width:240,
showProgressBar:false,
showCloseButton:false,
fn:MochiKit.Base.method(deferredResult, 'callback'),
scope:this,
buttons:{
'ok': Clipperz.PM.Strings['fatalErrorMessageCloseButtonLabel']
}
}
);
deferredResult.addCallback(function() {
window.document.body.innerHTML = "";
window.location.reload(true);
});
*/
Clipperz.PM.exit('error.html');
},
//-----------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//#############################################################################
MochiKit.Base.update(Clipperz.PM, {
__repr__: function() {
return "[" + this.NAME + " " + this.VERSION + "]";
},
toString: function() {
return this.__repr__();
},
//-----------------------------------------------------------------------------
'initPage': function() {
var main;
var shouldShowRegistrationForm;
var useCompactDesign;
//MochiKit.Logging.logWarning("Just testing logging system");
Clipperz.PM.Strings.Languages.initSetup();
// DWRUtil.useLoadingMessage(Clipperz.PM.Strings['DWRUtilLoadingMessage']);
if (window.location.search.indexOf("registration") != -1) {
shouldShowRegistrationForm = true;
} else {
shouldShowRegistrationForm = false;
}
if (window.location.search.indexOf("compact") != -1) {
useCompactDesign = true;
} else {
useCompactDesign = false;
}
main = new Clipperz.PM.Main();
if (useCompactDesign == true) {
main.runCompact();
} else {
if (Clipperz_IEisBroken === true) {
if (Clipperz.PM.Proxy.defaultProxy.isReadOnly()) {
var logoParentNode;
YAHOO.ext.Element.get('donateHeaderIcon').remove();
logoParentNode = YAHOO.ext.Element.get('logo').dom.parentNode;
YAHOO.ext.Element.get('logo').remove();
Clipperz.YUI.DomHelper.append(logoParentNode, {tag:'span', children:[
{tag:'span', cls:'clipperzLogoSpan', html:'clipper'},
{tag:'span', cls:'clipperzLogoZSpan', html:'z'}
]})
} else {
YAHOO.ext.Element.get('donateHeaderIcon').dom.src = "./images/smiles.gif";
YAHOO.ext.Element.get('logo').dom.src = "./images/logo.gif";
}
} else {
YAHOO.ext.Element.get('donateHeaderIcon').dom.src = "data:image/gif;charset=utf-8;base64,R0lGODlhEAAQAPf/ADMzZvrFL/KbGPrER3VXJeaJHvnGXNJ/KAEAAPnKefvJDamopMvLy8GZEfrTpvvgwGhVB0xKSO3BDUk+A/vYqnVgLcmndoRqM/exO3hrS3lmPYRsB39lDum9Dv3aCuebVPnIdP////3cCvewE07BafrQk/rHG1tYR5qZl7eUWZl7CfnGjdeuDPnCPpl4LDEoA5R2OP3XC/jBgfi2EvrXrvrRlWpYHgGtKdiqKPvfvu6nFzTNWfexFv7gCEc4GPrFDvaqFJmDB/euE/vYrJV5SfzUC7uTIuCxDf8AAPrHX519EbONGLubCvvYqzsxA/42AwaIGPzTC9u8CfTALlRUUomJiACWHaaMCsmeJFBFBZ5wUtaRVGlOVrySGLBvPNaBKsSGU9OOUbF7VPOycaRxUaFzWfGtaLZ6L+CaHcZ/Kt6YHVxJXfvXqaGhn0A8Z/i8c7JwM7d4MP6SBrJtM21MUDs4ZT84YmFhYaBnPqtyNM2QW6t2Va18XfvWsPvZsmVOXUQ7X86CJ1ZDWzo2Y6FoOfzSDBMPB/rTqW1OT0I5YEQ9ZnVTS1pEV9iCI7x+Ljw4ZvnJlqNnOfeyUfnMi/CkSfnKhAOmJ/WqU/ewJmVUO6qRB3ljHOGzFvauSfnFWveuI/esFK2JE5iVifrEEA+uJ/K+RayHMYVvTsyiE3NxbnBdQl5KG+cAAPnBIQYFA8GXN82hJbWXa6WDEQgGBFNBGMKeC4iFeZiiGdTZ1aqgd1dTPF9fX4R1BHReOOi9cdmsUn9xBKKFIWVPG5J0FLmzmcLCwtK5B6eQcnx5doZrFPnAH6eFP/fDL1RLBYVsQW5raMXGEFA5E+rLoUQEAG0kA8ONCteZId6wF86tCJ0AAGFQBurKn6mJHks/A2tZQOKfIHFua+29Wum1OOzv7LysCN3i3s/Rz/DDdeOyKCckHxQTEDsuEUIvEI1EBfP29KuIQbqUR9O7CbnCER8ZCSIeGDQJADQXAaCVaKeCGUNAPFRGMpmJS1xIF/rELPXARv///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQFZAD/ACwAAAAAEAAQAAAI+AABCASwhkyYDx+27PkzcGCdMmZWOOjT5xCkMXwUDXwERgaNHA9CPsjhZ4UeNwK1vHEwpAmFlxSaDGEjQwwAQZQq1aihKlaJEhYylagx6RIXPJ1AJEjgSsNSIrOWJpDk5QAGT0mSIKiQFQaCrAYwfCnwqUWpAatMDRjwitYAfy0wFSgwQhksZgHy6mWGpRWPAgdGjEKlxIThw7IajBrRKBIQBQpUaGMiQUItbSogA5nDSMCPIlGudHPiZEKQKEV+CKADgJCQQh5iy44dZQQcgXbSzCjSo7fvGDMCJRo4KA8oBTFEiIihQEgcQA0FIjqjRocONI4WNQwIACH5BAVkAP8ALAEABAANAAkAAAhaAP8J1GehhMASBgUqREAExLkUEFMoFOgDXpJwFzLCUChuwL8BHj8O8OeRRxd0ASbiwBKgn8AjHK5N5AQB1bUjAmt128BCIIssL3gqlALBiUAnGyRMFChiqcKAACH5BAVkAP8ALAEABAANAAoAAAhzAP8JrKEqlkALmQQq/JfAlYYECYjMSrDwXxIEFZIkgYEgicIWAleZEviK1gCBI/7BqhggwD8cS/4tEVWBg5JQoZRwsGEr2D8JuUKYa1OlCopiIYgdEchEVIinUBdcWahJFwoGDNqcCFLxnxRezbIAM6YwIAAh+QQFZAD/ACwCAAMADAAMAAAIeQD//ZN2TOC/bQUN/st06pRAhg4NOuvlS+DEigZ/LbsgUCNHgwSEuRAYcuS/JUam4FCIg5kRfF3anNqUbNiwZJs0oOCmYN8/d+VwmcM17t89Cf+kaCCxo+kOEhmwGYwHxYpVK1DIKYR2o2tXS/IU3rpBqiwpS7cEBgQAIfkEBWQA/wAsAgADAAwADAAACH4A//0b0kTgPwoFDf6roSqWQAuZSihM4EqDQCKzEihMgqCCQBgIkhgsNWCVKYGvaA3w908Zln8BFMbE0moUKiUmcuqU1WDUPwUqtDHp0KEatXYKFPwrUkRTN3v1pmV7UsSgBw8x5CBhxeqJwiI9wsp58kSOQlAKYlyNoWCEwIAAIfkEBWQA/wAsAQAEAA4ACwAACIwACURIhQxcBG8a8j1DlooKAXpUdt3ZFUGdoQgS71BJFw2Bx38IYLxDANIju2/C5hla5+LfP1M+DM3jZ+1fF1gBXOr8FwDHEpdLRFXgoCRUKCUcbNgK5lJCrhDm2lSpgqJYCGJHdDIRFaKr1wVXdv7TpAsFAwZtTgQR61IKr2ZZgBmLwVanCBEuhegMCAA7Cg==";
YAHOO.ext.Element.get('logo').dom.src = "data:image/gif;charset=utf-8;base64,R0lGODlhgwAoAPf/AP////+SAIKCmV1df3l5jYmhef//9vr6+YSQrJSguNfk60xMZjw8bf+PAI2Zsq6ulTU1ZZqasrzE05Gdtf//90pHW6d4KuPj6cLCz6ampzw3Ymt9nXp6Z21tif+MAHV1mPaOBJGRrPLy8dPT21Zhifb2+H19j/z8+MmOG3V/n729zcnJ1jU1aLmKIsnb5M3O2Xe5y3JyjHZqRD1xlElJd7KyuPSSBGFhhPn59kFBcKiovIaGov+KAP7+/sDA0HZ2mKqtwV5fh6y1yMTM2X19nXuCoTg5al1MUdTV4O3u8jU8bTMzZv+OAIt6Nfz8/G5ukldTVF5egv///nFxlJ2eeFFRfPX18cN/HpOTanV1lLOzp3l5m1dXesXF1O7u7MOPHj4+YaWltdXV1WJqj4ODdU1NeZWVZNaSFff39WFmjEtQfP+GAPSGBenq77q6ym1thP//+3l5kX5+kIOiubx8IpyCMf3//8nJ0eHh20JMedHRwVJSeba2yEJyPsaDHVhYffT+/llag4uNqcTE0T4+bvDw7dra4v7///n//6GhuGZojTw8a/r6+/z89OLy9ZWVr8mMG9ra1t/f5zo6ZUNEcjs7bPHx9dzc34iVsE5Od319mZ2dbUZJd2hoh4xsOf398mBhiP39/ZmZkmtrkKOmvK7B0T9Bb77H1evr2c2PGX2Ipn1YQT9RbOrq56bR3Y2NgLrV35mZZ+yOCqmptZiYmN/fx7OzxTY+YFJXgVFchdnZvsLE08jI0ztcTeCLEPuVAv2QAIqSrZietlJUbGpqYYWFWWdlSKKlepajukJvQMbI1kZhiURukj09ZlNUf5mwxOHhxFxchVtehoaOqoqKZv39+HF5mnR6m5OZsj8/bDQ0ZzQzZuzs6vr67MDAyUhIdGpqj+np0IqZstfY4o+btI6dtv2NAPf353ibtGJcTtWJEDJIdrPD0u/9/ufo7ZWiuZWjulVVdeLi6Nvb5N3d4oiIcIyMecLC0XWAoGVlfpCQmGCctXR3mXh4W2lukv///yH5BAEAAP8ALAAAAACDACgAAAj/AP8JHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmyZcktLwZ1wRBF4I+YM2+43IlRWI8eAKrFEIgNANBqcXgqpfgOgFMDBAROcAqAgpylWCEmoApVIDyqVrOKZbj1adR/RbqoHdRprFuEZQF0fes2yIcfH55QOhh37sMcU378eMLAIaEngp8QYhjt7gdFRh5W+fCBVUcWIVaUoCplnopoBfueLbKiNK8OAkmXngVhzjjOSIQtKnit9Ioa/9Ah4TwuUbaDLAQp20z1RYTIBP3Z9sbClBB3Tgs0gYSiuvXrKCCla6jmBdXvTp1Q/yEoWiAysCakOpXS5hQi8E51LSCIab0lCe/h15pPMI8r+OuNkAlBRVAlAi4ufEcFJGt44OCDEHqwhgwM0aBAD4cASNUrA5X3z1ROUZDePw5oCN8IhQmEwHeHZAigITkMtM4FJgIgRSR7CZQCVSW0YYeLACzYIIRMBGCkkR5QuBAQ35XABxHiwPJdEvEI5CGIVY1Y4nehuLHDIyOAJ8BAK4Knwg4heMfZDgMJ8Z0kiXyQCHRO9RDGQDtqeMgxTXzhp58tnNHAkQFMuBAngFDVyJgCKXHKd8VYydVZWIoo0JZOhaLJQEbA8F0kZH7XA5sCsQADUE7hIdAyB6CqxzdLxP+qhgJUWZFinpxh8MEoHwxzUAvmHOlBKhUoxEk5VMHxQEEzcPaIpGapF6KWVPWwLEFKtFGrTv+UaaMWBWlDo1M4tLXPeiIsEOu6G9hRZz06fgfHnQktYUGwSJ4BxkK5lEJVKFVi+8QUU3xQBbRyUYrepf9yYBApLkpBhorVOlyQMJzZo80QVBWywxZEhLwFOe5+Gy9VYsyWkCfAAGNkA74Uu1AaElDVzb5kTSptlgw7xc0eBinCmRkUO2XFHwYF8V0sRjhSo6hunOzUMQrJMOiRNhzRECg+UIUKzgtduTCJVF2QI0FCU0V0t1S1QYNBoHy3CQu0Pk2VClJLIUpCxoD/cHUAHqziEM1UnQO2QmJP2zMAPxuUxndreysCFwZJI3fTVJ3Aiwo+dO655/pIfQBqB/Viw98NePIQCexkzt9AlAChwuykJs4z2eQOVZC3AFBTNAAnJFWQKt9hoQ0SLuJRSUO4jn7QEWwQ6kEdEKnxDJARFDRGok7t/Y/tluLu1CwF0U0VI7rzjhtBLCQYXlJzKFpTQSCHPH/zpBNUgTrSUw+REYFAFQBEQIyBMIBjVOkHwuZSKWpRBQdZIMgjnEAVaEzidwA4wKYGIghGUCUcF2wWVXiRon9oAwE/AgAczoK/gtzCDx44UgMsAIGCbKMh/qLKJ0LwASIYgjOXSBH4/xz4Lx1QRgXgoUWo5AUEyvCBSxkYCAKdIo8dUGYXJQOAHvBEFecRpA88IFQA/ECHK5jxjHSQWULyIImnweENHdLZh8aGqaeJoYS8q9ElYiQQErTjaZ/IBxed4sWBgFGMf5PhL6DAEGeMI4vgScIWCNKUaH0PLFcRHxruoCF6IG2JAMDBHQT4HXnMbyDMkIeJLDGxgeBjPaHIn0AOKcZaBsAGjGQIJQThjlaFpwQ6+ORAglGCYlqBdNMoZgmsoDtMteIbH7iABwHgBGC+jSDeKkQZniCJaYaiBEAow0Fo8Igk+JKaViBFIApiDWWKoC0ESQYbQEDPetqznrLIZUOMQIEDcExhC9EoIfsYQFAGsKBUBTXo4gpBOSM4IzBBWIxBJDeAfxihCoEBBR8TUokyjKJggWgGcBJ6UIJAQAMoTalKV1pDlmDKC5RrCEXpwpOXxpQhM6WpS2zqkJzqlCVYOppD6kOuU/5UJfwYxOxs8Q2HTOEes+ODOI9K1apa9aoLCQgAOwo=";
}
main.run(shouldShowRegistrationForm);
}
Clipperz.PM.defaultErrorHandler = main.defaultErrorHandler;
// DEBUG
if ((typeof(_clipperz_pm_test_user) != 'undefined') && (typeof(_clipperz_pm_test_passphrase) != 'undefined')) {
//------- automatic login with test/test --------------
// Clipperz.PM.Proxy.defaultProxy = new Clipperz.PM.Proxy.Offline();
//MochiKit.Logging.logWarning("activating AUTOLOGIN (" + _clipperz_pm_test_user + "/" + _clipperz_pm_test_passphrase + ")");
// MochiKit.Async.callLater(0.9, MochiKit.Base.bind(main.doLogin, main), _clipperz_pm_test_user, _clipperz_pm_test_passphrase, YAHOO.ext.Element.get('Clipperz_PM_Components_Panels_login_submit_9'));
MochiKit.Async.callLater(0.5, MochiKit.Base.bind(main.loginPanel().doLoginWithUsernameAndPassphrase, main.loginPanel()), _clipperz_pm_test_user, _clipperz_pm_test_passphrase);
//------- automatic registration --------------
//MochiKit.Logging.logWarning("Testing registration (user,passwd)");
//MochiKit.Logging.logDebug("mainPanel: " + main.mainPage().mainPanel().content());
// main.mainPage().getActivePanel().showRegistrationFormAnimator().play();
// MochiKit.Async.callLater(1.9, MochiKit.Base.bind(main.doRegistration, main), 'user', 'passwd');
//-------------------------------------
// main.showMainPanels('ok');
};
if (/fastEntropyAccumulationForTestingPurpose/.test(window.location.search)) {
Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
}
// Clipperz.PM.Proxy.defaultProxy.knock();
},
//-------------------------------------------------------------------------
'showDonationSplashScreen': function(aUser, aFocusElementId) {
var deferredResult;
var donateElement;
var donateDialog;
var closeButton;
var closeFunction;
var donateButton;
var donateFunction;
deferredResult = new MochiKit.Async.Deferred();
//MochiKit.Logging.logDebug(">>> Main.showRegistrationSplashScreen");
donateElement = Clipperz.YUI.DomHelper.append(document.body, {tag:'div', id:'donateSplash', children:[
{tag:'div', cls:'ydlg-hd', htmlString:Clipperz.PM.Strings['donateSplashPanelTitle']},
{tag:'div', cls:'ydlg-bd', children:[
{tag:'div', cls:'alert-message', id:'donateMessage', children:[
{tag:'div', cls:'donateSplashPanelIcon', children:[
{tag:'img', src:Clipperz.PM.Strings['donateSplashPanelIconUrl']}
]},
{tag:'div', cls:'donateSplashPanelDescription', htmlString:Clipperz.PM.Strings['donateSplashPanelDescription']}
]}
]},
{tag:'div', cls:'ydlg-ft'}
]}, true);
donateDialog = new YAHOO.ext.BasicDialog(
donateElement, {
closable:false,
modal:true,
autoTabs:false,
resizable:false,
fixedcenter:true,
constraintoviewport:false,
width:450,
height:220,
shadow:true,
minWidth:300,
minHeight:300
}
);
closeFunction = MochiKit.Base.partial(deferredResult.callback, false);
donateFunction = MochiKit.Base.partial(deferredResult.callback, true);
donateButton = donateDialog.addButton(Clipperz.PM.Strings['donateDonateButtonLabel'], donateFunction, deferredResult);
donateDialog.addKeyListener(27, closeFunction, deferredResult);
closeButton = donateDialog.addButton(Clipperz.PM.Strings['donateCloseButtonLabel'], closeFunction, deferredResult);
donateDialog.setDefaultButton(donateButton);
donateDialog.show(aFocusElementId /*'recordListAddRecordButton'*/);
deferredResult.addCallback(MochiKit.Base.bind(function(shouldOpenDonatePage) {
var result;
if (shouldOpenDonatePage) {
window.open(Clipperz.PM.Strings['donateHeaderLinkUrl'], "donate");
aUser.preferences().setShouldShowDonationPanel(false);
aUser.preferences().saveChanges();
}
}, this));
deferredResult.addBoth(MochiKit.Base.method(donateDialog, 'hide'));
deferredResult.addBoth(MochiKit.Base.method(donateElement, 'remove'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Main.showDonationSplashScreen - 2: " + res); return res;});
//MochiKit.Logging.logDebug("<<< Main.showRegistrationSplashScreen");
return deferredResult;
},
//-----------------------------------------------------------------------------
'exit': function(aPageName) {
// alert("ERROR: " + aPageName);
// YAHOO.ext.Element.get('menus').update("");
// YAHOO.ext.Element.get('logoutLI').update("");
// YAHOO.ext.Element.get('lockLI').update("");
// YAHOO.ext.Element.get('main').update("");
// Clipperz.YUI.DomHelper.append('main', {tag:'div', id:'exitBlock', children:Clipperz.PM.Strings['exitConfig']});
MochiKit.Async.wait(0).addCallback(function() {
// window.location.href = "http://www.google.com/search?hl=" + Clipperz.PM.Strings.preferredLanguage + "&q=phishing&btnI=Google+Search";
window.location.href = "./" + aPageName;
});
},
//-----------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});
//#############################################################################
//Clipperz.PM.SerializeAsyncCalls = function(aDelay, aFunction) {
// aFunction.apply(extend(null, arguments, 1));
//};
MochiKit.DOM.addLoadEvent(Clipperz.PM.initPage);

View File

@@ -0,0 +1,173 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
//=============================================================================
Clipperz.PM.Proxy = function(args) {
args = args || {};
this._shouldPayTolls = args.shouldPayTolls || false;
this._tolls = {
'CONNECT': [],
'REGISTER': [],
'MESSAGE': []
};
if (args.isDefault === true) {
Clipperz.PM.Proxy.defaultProxy = this;
}
return this;
}
Clipperz.PM.Proxy.prototype = MochiKit.Base.update(null, {
'toString': function() {
return "Clipperz.PM.Proxy";
},
//=========================================================================
'shouldPayTolls': function() {
return this._shouldPayTolls;
},
//-------------------------------------------------------------------------
'tolls': function() {
return this._tolls;
},
//-------------------------------------------------------------------------
'payToll': function(aRequestType, someParameters) {
var deferredResult;
//console.log(">>> Proxy.payToll", aRequestType, someParameters);
if (this.shouldPayTolls()) {
deferredResult = new MochiKit.Async.Deferred();
if (this.tolls()[aRequestType].length == 0) {
deferredResult.addCallback(MochiKit.Base.method(this, 'sendMessage', 'knock', {requestType:aRequestType}));
deferredResult.addCallback(MochiKit.Base.method(this, 'setTollCallback'));
}
deferredResult.addCallback(MochiKit.Base.method(this.tolls()[aRequestType], 'pop'));
deferredResult.addCallback(MochiKit.Base.methodcaller('deferredPay'));
deferredResult.addCallback(function(aToll) {
var result;
result = {
parameters: someParameters,
toll: aToll
}
return result;
});
deferredResult.callback();
} else {
deferredResult = MochiKit.Async.succeed({parameters:someParameters});
}
//console.log("<<< Proxy.payToll");
return deferredResult;
},
//-------------------------------------------------------------------------
'addToll': function(aToll) {
//console.log(">>> Proxy.addToll", aToll);
this.tolls()[aToll.requestType()].push(aToll);
//console.log("<<< Proxy.addToll");
},
//=========================================================================
'setTollCallback': function(someParameters) {
//console.log(">>> Proxy.setTollCallback", someParameters);
if (typeof(someParameters['toll']) != 'undefined') {
//console.log("added a new toll", someParameters['toll']);
this.addToll(new Clipperz.PM.Toll(someParameters['toll']));
}
//console.log("<<< Proxy.setTallCallback", someParameters['result']);
//return someParameters['result'];
return someParameters;
},
//=========================================================================
'registration': function (someParameters) {
return this.processMessage('registration', someParameters, 'REGISTER');
},
'handshake': function (someParameters) {
return this.processMessage('handshake', someParameters, 'CONNECT');
},
'message': function (someParameters) {
return this.processMessage('message', someParameters, 'MESSAGE');
},
'logout': function (someParameters) {
return this.processMessage('logout', someParameters, 'MESSAGE');
},
//=========================================================================
'processMessage': function (aFunctionName, someParameters, aRequestType) {
var deferredResult;
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(MochiKit.Base.method(this, 'payToll', aRequestType));
deferredResult.addCallback(MochiKit.Base.method(this, 'sendMessage', aFunctionName));
deferredResult.addCallback(MochiKit.Base.method(this, 'setTollCallback'));
deferredResult.callback(someParameters);
return deferredResult;
},
//=========================================================================
'sendMessage': function () {
throw Clipperz.Base.exception.AbstractMethod;
},
//=========================================================================
'isReadOnly': function () {
return false;
},
//=========================================================================
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,100 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
//=============================================================================
Clipperz.PM.Proxy.JSON = function(args) {
Clipperz.PM.Proxy.JSON.superclass.constructor.call(this, args);
this._url = args.url || Clipperz.Base.exception.raise('MandatoryParameter');
return this;
}
YAHOO.extendX(Clipperz.PM.Proxy.JSON, Clipperz.PM.Proxy, {
'toString': function() {
return "Clipperz.PM.Proxy.JSON";
},
//=========================================================================
'url': function () {
return this._url;
},
//=========================================================================
'sendMessage': function(aFunctionName, someParameters) {
var deferredResult;
var parameters;
parameters = {
method: aFunctionName,
// version: someParameters['version'],
// message: someParameters['message'],
parameters: Clipperz.Base.serializeJSON(someParameters)
};
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(function (aValue) {
MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'remoteRequestSent');
return aValue;
});
deferredResult.addCallback(MochiKit.Async.doXHR, this.url(), {
method:'POST',
sendContent:MochiKit.Base.queryString(parameters),
headers:{"Content-Type":"application/x-www-form-urlencoded"}
});
deferredResult.addCallback(function (aValue) {
MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'remoteRequestReceived');
return aValue;
});
// deferredResult.addCallback(MochiKit.Async.evalJSONRequest);
deferredResult.addCallback(MochiKit.Base.itemgetter('responseText'));
deferredResult.addCallback(Clipperz.Base.evalJSON);
deferredResult.addCallback(function (someValues) {
if (someValues['result'] == 'EXCEPTION') {
throw someValues['message'];
}
return someValues;
})
// return MochiKit.Base.evalJSON(req.responseText);
deferredResult.callback();
return deferredResult;
},
//=========================================================================
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,804 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
try { if (typeof(Clipperz.PM.Proxy.Offline) == 'undefined') { throw ""; }} catch (e) {
throw "Clipperz.PM.Proxy.Offline.DataStore depends on Clipperz.PM.Proxy.Offline!";
}
//=============================================================================
Clipperz.PM.Proxy.Offline.DataStore = function(args) {
args = args || {};
this._data = args.data || (typeof(_clipperz_dump_data_) != 'undefined' ? _clipperz_dump_data_ : null);
this._isReadOnly = (typeof(args.readOnly) == 'undefined' ? true : args.readOnly);
this._shouldPayTolls = args.shouldPayTolls || false;
this._tolls = {};
this._connections = {};
this._b = null;
this._B = null;
this._A = null;
this._userData = null;
return this;
}
//Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.DataStore, Object, {
Clipperz.PM.Proxy.Offline.DataStore.prototype = MochiKit.Base.update(null, {
//-------------------------------------------------------------------------
'isReadOnly': function () {
return this._isReadOnly;
},
//-------------------------------------------------------------------------
'shouldPayTolls': function() {
return this._shouldPayTolls;
},
//-------------------------------------------------------------------------
'data': function () {
return this._data;
},
//-------------------------------------------------------------------------
'tolls': function () {
return this._tolls;
},
//-------------------------------------------------------------------------
'connections': function () {
return this._connections;
},
//=========================================================================
'resetData': function() {
this._data = {
'users': {
'catchAllUser': {
__masterkey_test_value__: 'masterkey',
s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
}
}
};
},
//-------------------------------------------------------------------------
'setupWithEncryptedData': function(someData) {
this._data = Clipperz.Base.deepClone(someData);
},
//-------------------------------------------------------------------------
'setupWithData': function(someData) {
var deferredResult;
var resultData;
var i, c;
//Clipperz.log(">>> Proxy.Test.setupWithData");
resultData = this._data;
deferredResult = new MochiKit.Async.Deferred();
c = someData['users'].length;
for (i=0; i<c; i++) {
var newConnection;
var recordConfiguration;
deferredResult.addCallback(MochiKit.Base.method(this, 'userSerializedEncryptedData', someData['users'][i]));
deferredResult.addCallback(MochiKit.Base.bind(function(aUserSerializationContext) {
//console.log("SERIALIZED USER", aUserSerializationContext);
resultData['users'][aUserSerializationContext['credentials']['C']] = {
's': aUserSerializationContext['credentials']['s'],
'v': aUserSerializationContext['credentials']['v'],
'version': aUserSerializationContext['data']['connectionVersion'],
'userDetails': aUserSerializationContext['encryptedData']['user']['header'],
'userDetailsVersion': aUserSerializationContext['encryptedData']['user']['version'],
'statistics': aUserSerializationContext['encryptedData']['user']['statistics'],
'lock': aUserSerializationContext['encryptedData']['user']['lock'],
'records': this.rearrangeRecordsData(aUserSerializationContext['encryptedData']['records'])
}
}, this));
}
deferredResult.addCallback(MochiKit.Base.bind(function() {
//console.log("this._data", resultData);
this._data = resultData;
}, this));
deferredResult.callback();
//Clipperz.log("<<< Proxy.Test.setupWithData");
return deferredResult;
},
//=========================================================================
'b': function() {
return this._b;
},
'set_b': function(aValue) {
this._b = aValue;
},
//-------------------------------------------------------------------------
'B': function() {
return this._B;
},
'set_B': function(aValue) {
this._B = aValue;
},
//-------------------------------------------------------------------------
'A': function() {
return this._A;
},
'set_A': function(aValue) {
this._A = aValue;
},
//-------------------------------------------------------------------------
'userData': function() {
return this._userData;
},
'setUserData': function(aValue) {
this._userData = aValue;
},
//=========================================================================
'getTollForRequestType': function (aRequestType) {
var result;
var targetValue;
var cost;
targetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
switch (aRequestType) {
case 'REGISTER':
cost = 5;
break;
case 'CONNECT':
cost = 5;
break;
case 'MESSAGE':
cost = 2;
break;
}
result = {
requestType: aRequestType,
targetValue: targetValue,
cost: cost
}
if (this.shouldPayTolls()) {
this.tolls()[targetValue] = result;
}
return result;
},
//-------------------------------------------------------------------------
'checkToll': function (aFunctionName, someParameters) {
if (this.shouldPayTolls()) {
var localToll;
var tollParameters;
tollParameters = someParameters['toll'];
localToll = this.tolls()[tollParameters['targetValue']];
if (localToll != null) {
if (! Clipperz.PM.Toll.validate(tollParameters['targetValue'], tollParameters['toll'], localToll['cost'])) {
throw "Toll value too low.";
};
} else {
throw "Missing toll";
}
}
},
//=========================================================================
'processMessage': function(aFunctionName, someParameters) {
var result;
switch(aFunctionName) {
case 'knock':
result = this._knock(someParameters);
break;
case 'registration':
this.checkToll(aFunctionName, someParameters);
result = this._registration(someParameters.parameters);
break;
case 'handshake':
this.checkToll(aFunctionName, someParameters);
result = this._handshake(someParameters.parameters);
break;
case 'message':
this.checkToll(aFunctionName, someParameters);
result = this._message(someParameters.parameters);
break;
case 'logout':
result = this._logout(someParameters.parameters);
break;
}
return result;
},
//=========================================================================
'_knock': function(someParameters) {
var result;
result = {
toll: this.getTollForRequestType(someParameters['requestType'])
// toll: {
// requestType: someParameters['requestType'],
// targetValue: "3a1ba0be23580f902885c6c8a6b035e228ed1ca74d77de5f9bb0e0c899f07cfe",
// cost:
// }
}
return result;
},
//-------------------------------------------------------------------------
'_registration': function(someParameters) {
//console.log("_registration", someParameters);
if (this.isReadOnly() == false) {
if (typeof(this.data()['users'][someParameters['credentials']['C']]) == 'undefined') {
this.data()['users'][someParameters['credentials']['C']] = {
's': someParameters['credentials']['s'],
'v': someParameters['credentials']['v'],
'version': someParameters['credentials']['version'],
// 'lock': someParameters['user']['lock'],
'lock': Clipperz.Crypto.Base.generateRandomSeed(),
// 'maxNumberOfRecords': '100',
'userDetails': someParameters['user']['header'],
'statistics': someParameters['user']['statistics'],
'userDetailsVersion': someParameters['user']['version'],
'records': {}
}
} else {
throw "user already exists";
}
} else {
throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
}
result = {
result: {
'lock': this.data()['users'][someParameters['credentials']['C']]['lock'],
'result': 'done'
},
toll: this.getTollForRequestType('CONNECT')
}
return MochiKit.Async.succeed(result);
},
//-------------------------------------------------------------------------
'_handshake': function(someParameters) {
var result;
var nextTollRequestType;
//Clipperz.log(">>> Proxy.Offline.DataStore._handshake");
result = {};
if (someParameters.message == "connect") {
var userData;
var randomBytes;
var b, B, v;
//console.log(">>> Proxy.Offline.DataStore._handshake.connect", someParameters);
userData = this.data()['users'][someParameters.parameters.C];
if ((typeof(userData) != 'undefined') && (userData['version'] == someParameters.version)) {
this.setUserData(userData);
} else {
this.setUserData(this.data()['users']['catchAllUser']);
}
randomBytes = Clipperz.Crypto.Base.generateRandomSeed();
this.set_b(new Clipperz.Crypto.BigInt(randomBytes, 16));
v = new Clipperz.Crypto.BigInt(this.userData()['v'], 16);
this.set_B(v.add(Clipperz.Crypto.SRP.g().powerModule(this.b(), Clipperz.Crypto.SRP.n())));
this.set_A(someParameters.parameters.A);
result['s'] = this.userData()['s'];
result['B'] = this.B().asString(16);
nextTollRequestType = 'CONNECT';
} else if (someParameters.message == "credentialCheck") {
var v, u, S, A, K, M1;
//console.log(">>> Proxy.Offline.DataStore._handshake.credentialCheck", someParameters);
v = new Clipperz.Crypto.BigInt(this.userData()['v'], 16);
u = new Clipperz.Crypto.BigInt(Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(this.B().asString(10))).toHexString(), 16);
A = new Clipperz.Crypto.BigInt(this.A(), 16);
S = (A.multiply(v.powerModule(u, Clipperz.Crypto.SRP.n()))).powerModule(this.b(), Clipperz.Crypto.SRP.n());
K = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(S.asString(10))).toHexString().slice(2);
M1 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + this.B().asString(10) + K)).toHexString().slice(2);
if (someParameters.parameters.M1 == M1) {
var M2;
M2 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + someParameters.parameters.M1 + K)).toHexString().slice(2);
result['M2'] = M2;
} else {
throw new Error("Client checksum verification failed! Expected <" + M1 + ">, received <" + someParameters.parameters.M1 + ">.", "Error");
}
nextTollRequestType = 'MESSAGE';
} else if (someParameters.message == "oneTimePassword") {
var otpData;
//console.log("HANDSHAKE WITH OTP", someParameters.parameters.oneTimePasswordKey);
//console.log("someParameters", someParameters);
//console.log("data.OTP", Clipperz.Base.serializeJSON(this.data()['onetimePasswords']));
otpData = this.data()['onetimePasswords'][someParameters.parameters.oneTimePasswordKey];
try {
if (typeof(otpData) != 'undefined') {
if (otpData['status'] == 'ACTIVE') {
if (otpData['key_checksum'] == someParameters.parameters.oneTimePasswordKeyChecksum) {
result = {
'data': otpData['data'],
'version': otpData['version']
}
otpData['status'] = 'REQUESTED';
} else {
otpData['status'] = 'DISABLED';
throw "The requested One Time Password has been disabled, due to a wrong keyChecksum";
}
} else {
throw "The requested One Time Password was not active";
}
} else {
throw "The requested One Time Password has not been found"
}
} catch (exception) {
result = {
'data': Clipperz.PM.Crypto.randomKey(),
'version': Clipperz.PM.Connection.communicationProtocol.currentVersion
}
}
nextTollRequestType = 'CONNECT';
} else {
MochiKit.Logging.logError("Clipperz.PM.Proxy.Test.handshake - unhandled message: " + someParameters.message);
}
//console.log("<<< Proxy.Offline._handshake", result);
result = {
result: result,
toll: this.getTollForRequestType(nextTollRequestType)
}
return MochiKit.Async.succeed(result);
},
//-------------------------------------------------------------------------
'_message': function(someParameters) {
var result;
result = {};
//=====================================================================
//
// R E A D - O N L Y M e t h o d s
//
//=====================================================================
if (someParameters.message == 'getUserDetails') {
var recordsStats;
var recordReference;
//try {
recordsStats = {};
for (recordReference in this.userData()['records']) {
recordsStats[recordReference] = {
'updateDate': this.userData()['records'][recordReference]['updateDate']
}
}
result['header'] = this.userDetails();
result['statistics'] = this.statistics();
result['maxNumberOfRecords'] = this.userData()['maxNumberOfRecords'];
result['version'] = this.userData()['userDetailsVersion'];
result['recordsStats'] = recordsStats;
if (this.isReadOnly() == false) {
var lock;
if (typeof(this.userData()['lock']) == 'undefined') {
this.userData()['lock'] = "<<LOCK>>";
}
result['lock'] = this.userData()['lock'];
}
//} catch (exception) {
// console.log("*#*#*#*#*#*#*", exception);
// throw exception;
//}
//=====================================================================
} else if (someParameters.message == 'getRecordDetail') {
recordData = this.userData()['records'][someParameters['parameters']['reference']];
result['reference'] = someParameters['parameters']['reference'];
result['data'] = recordData['data'];
result['version'] = recordData['version'];
result['creationData'] = recordData['creationDate'];
result['updateDate'] = recordData['updateDate'];
result['accessDate'] = recordData['accessDate'];
currentVersionData = recordData['versions'][recordData['currentVersion']];
result['currentVersion'] = {};
result['currentVersion']['reference'] = recordData['currentVersion'];
result['currentVersion']['version'] = currentVersionData['version'];
result['currentVersion']['header'] = currentVersionData['header'];
result['currentVersion']['data'] = currentVersionData['data'];
result['currentVersion']['creationData'] = currentVersionData['creationDate'];
result['currentVersion']['updateDate'] = currentVersionData['updateDate'];
result['currentVersion']['accessDate'] = currentVersionData['accessDate'];
if (typeof(currentVersionData['previousVersion']) != 'undefined') {
result['currentVersion']['previousVersionKey'] = currentVersionData['previousVersionKey'];
result['currentVersion']['previousVersion'] = currentVersionData['previousVersion'];
}
//=====================================================================
//
// R E A D - W R I T E M e t h o d s
//
//=====================================================================
} else if (someParameters.message == 'upgradeUserCredentials') {
if (this.isReadOnly() == false) {
var parameters;
parameters = someParameters.parameters;
if (parameters['C'] == null) {
result = Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed;
} else if (parameters['s'] == null) {
result = Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed;
} else if (parameters['v'] == null) {
result = Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed;
} else if (parameters['version'] != Clipperz.PM.Connection.communicationProtocol.currentVersion) {
result = Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed;
} else {
result = {result:"done", parameters:parameters};
}
} else {
throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
}
//=====================================================================
/* } else if (someParameters.message == 'updateData') {
if (this.isReadOnly() == false) {
var i, c;
//console.log("###===============================================================");
//console.log("###>>>", Clipperz.Base.serializeJSON(someParameters));
//console.log("###--- userData", Clipperz.Base.serializeJSON(this.userData()));
if (this.userData()['lock'] != someParameters['parameters']['user']['lock']) {
throw "the lock attribute is not processed correctly"
}
this.userData()['userDetails'] = someParameters['parameters']['user']['header'];
this.userData()['statistics'] = someParameters['parameters']['user']['statistics'];
this.userData()['userDetailsVersions'] = someParameters['parameters']['user']['version'];
c = someParameters['parameters']['records'].length;
for (i=0; i<c; i++) {
var currentRecord;
var currentRecordData;
currentRecordData = someParameters['parameters']['records'][i];
currentRecord = this.userData()['records'][currentRecordData['record']['reference']];
if (currentRecord == null) {
}
currentRecord['data'] = currentRecordData['record']['data'];
currentRecord['version'] = currentRecordData['record']['version'];
currentRecord['currentVersion'] = currentRecordData['currentRecordVersion']['reference'];
currentRecord['versions'][currentRecordData['currentRecordVersion']['reference']] = {
'data': currentRecordData['currentRecordVersion']['data'],
'version': currentRecordData['currentRecordVersion']['version'],
'previousVersion': currentRecordData['currentRecordVersion']['previousVersion'],
'previousVersionKey': currentRecordData['currentRecordVersion']['previousVersionKey']
}
}
this.userData()['lock'] = Clipperz.PM.Crypto.randomKey();
result['lock'] = this.userData()['lock'];
result['result'] = 'done';
//console.log("###<<< userData", Clipperz.Base.serializeJSON(this.userData()));
} else {
throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
}
*/ //=====================================================================
} else if (someParameters.message == 'saveChanges') {
if (this.isReadOnly() == false) {
var i, c;
//console.log("###===============================================================");
//console.log("###>>>", someParameters);
//console.log("###>>>", Clipperz.Base.serializeJSON(someParameters));
//console.log("###--- userData", Clipperz.Base.serializeJSON(this.userData()));
//console.log("###===============================================================");
//console.log("--- userData.lock ", this.userData()['lock']);
//console.log("--- parameters.lock", someParameters['parameters']['user']['lock']);
if (this.userData()['lock'] != someParameters['parameters']['user']['lock']) {
throw "the lock attribute is not processed correctly"
}
this.userData()['userDetails'] = someParameters['parameters']['user']['header'];
this.userData()['statistics'] = someParameters['parameters']['user']['statistics'];
this.userData()['userDetailsVersions'] = someParameters['parameters']['user']['version'];
c = someParameters['parameters']['records']['updated'].length;
for (i=0; i<c; i++) {
var currentRecord;
var currentRecordData;
currentRecordData = someParameters['parameters']['records']['updated'][i];
currentRecord = this.userData()['records'][currentRecordData['record']['reference']];
if (
(typeof(this.userData()['records'][currentRecordData['record']['reference']]) == 'undefined')
&&
(typeof(currentRecordData['currentRecordVersion']) == 'undefined')
) {
//console.log("######## SHIT HAPPENS");
throw "Record added without a recordVersion";
}
if (currentRecord == null) {
currentRecord = {};
currentRecord['versions'] = {};
currentRecord['creationDate'] = Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
currentRecord['accessDate'] = Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
this.userData()['records'][currentRecordData['record']['reference']] = currentRecord;
}
currentRecord['data'] = currentRecordData['record']['data'];
currentRecord['version'] = currentRecordData['record']['version'];
currentRecord['updateDate'] = Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
if (typeof(currentRecordData['currentRecordVersion']) != 'undefined') {
currentRecord['currentVersion'] = currentRecordData['currentRecordVersion']['reference'];
currentRecord['versions'][currentRecordData['currentRecordVersion']['reference']] = {
'data': currentRecordData['currentRecordVersion']['data'],
'version': currentRecordData['currentRecordVersion']['version'],
'previousVersion': currentRecordData['currentRecordVersion']['previousVersion'],
'previousVersionKey': currentRecordData['currentRecordVersion']['previousVersionKey'],
'creationDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date()),
'updateDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date()),
'accessDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date())
}
}
}
c = someParameters['parameters']['records']['deleted'].length;
for (i=0; i<c; i++) {
var currentRecordReference;
currentRecordReference = someParameters['parameters']['records']['deleted'][i];
//console.log("DELETING records", currentRecordReference);
delete this.userData()['records'][currentRecordReference];
}
this.userData()['lock'] = Clipperz.PM.Crypto.randomKey();
result['lock'] = this.userData()['lock'];
result['result'] = 'done';
//console.log("###<<< userData", Clipperz.Base.serializeJSON(this.userData()));
} else {
throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
}
//=====================================================================
//
// U N H A N D L E D M e t h o d
//
//=====================================================================
} else {
MochiKit.Logging.logError("Clipperz.PM.Proxy.Test.message - unhandled message: " + someParameters.message);
}
result = {
result: result,
toll: this.getTollForRequestType('MESSAGE')
}
return MochiKit.Async.succeed(result);
},
//-------------------------------------------------------------------------
'_logout': function(someParameters) {
return MochiKit.Async.succeed({result: 'done'});
},
//=========================================================================
//#########################################################################
'isTestData': function() {
return (typeof(this.userData()['__masterkey_test_value__']) != 'undefined');
},
'userDetails': function() {
var result;
if (this.isTestData()) {
var serializedHeader;
var version;
//MochiKit.Logging.logDebug("### test data");
version = this.userData()['userDetailsVersion'];
serializedHeader = Clipperz.Base.serializeJSON(this.userData()['userDetails']);
result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(this.userData()['__masterkey_test_value__'], serializedHeader);
} else {
//MochiKit.Logging.logDebug("### NOT test data");
result = this.userData()['userDetails'];
}
return result;
},
'statistics': function() {
var result;
if (this.userData()['statistics'] != null) {
if (this.isTestData()) {
var serializedStatistics;
var version;
version = this.userData()['userDetailsVersion'];
serializedStatistics = Clipperz.Base.serializeJSON(this.userData()['statistics']);
result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(this.userData()['__masterkey_test_value__'], serializedStatistics);
} else {
result = this.userData()['statistics'];
}
} else {
result = null;
}
return result;
},
/*
'userSerializedEncryptedData': function(someData) {
var deferredResult;
var deferredContext;
deferredContext = { 'data': someData };
deferredResult = new Clipperz.Async.Deferred('Proxy.Test.serializeUserEncryptedData', {trace:false});
deferredResult.addCallback(MochiKit.Base.bind(function(aDeferredContext) {
aDeferredContext['user'] = this.createUserUsingConfigurationData(aDeferredContext['data']);
return aDeferredContext;
}, this));
deferredResult.addCallback(function(aDeferredContext) {
// return aDeferredContext['user'].encryptedDataUsingVersion(aDeferredContext['data']['version']);
return aDeferredContext['user'].serializedDataUsingVersion(MochiKit.Base.values(aDeferredContext['user'].records()), aDeferredContext['data']['version']);
});
deferredResult.addCallback(function(aUserEncryptedData) {
deferredContext['encryptedData'] = aUserEncryptedData;
return deferredContext;
});
deferredResult.addCallback(function(aDeferredContext) {
var connection;
connection = new Clipperz.PM.Connection.communicationProtocol.versions[aDeferredContext['data']['connectionVersion']]()
aDeferredContext['credentials'] = connection.serverSideUserCredentials(aDeferredContext['user'].username(),aDeferredContext['user'].passphrase());
return aDeferredContext;
});
// deferredResult.addCallback(function(aDeferredContext) {
//console.log("#-#-#-#-#", aDeferredContext);
// return aDeferredContext['user'].serializedDataUsingVersion(MochiKit.Base.values(aDeferredContext['user'].records()), aDeferredContext['data']['version']);
// }, deferredContext);
// deferredResult.addCallback(function(aUserSerializedData) {
//console.log("USER SERIALIZED DATA", aUserSerializedData);
// });
//
// deferredResult.addCallback(MochiKit.Async.succeed, deferredContext);
deferredResult.callback(deferredContext);
return deferredResult;
},
'createUserUsingConfigurationData': function(someData) {
var result;
var user;
var recordLabel;
user = new Clipperz.PM.DataModel.User();
user.initForTests();
user.setUsername(someData['username']);
user.setPassphrase(someData['passphrase']);
for (recordLabel in someData['records']) {
var recordData;
var record;
var i, c;
recordData = someData['records'][recordLabel];
record = new Clipperz.PM.DataModel.Record({user:user, label:recordLabel});
record.setNotes(recordData['notes']);
c = recordData['fields'].length;
for (i=0; i<c; i++) {
var recordField;
recordField = new Clipperz.PM.DataModel.RecordField();
recordField.setLabel(recordData['fields'][i]['name']);
recordField.setValue(recordData['fields'][i]['value']);
recordField.setType(recordData['fields'][i]['type']);
record.addField(recordField);
}
user.addRecord(record, true);
}
result = user;
return result;
},
*/
//=========================================================================
__syntaxFix__: "syntax fix"
});
Clipperz.PM.Proxy.Offline.DataStore['exception'] = {
'ReadOnly': new MochiKit.Base.NamedError("Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly")
};

View File

@@ -0,0 +1,73 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
//=============================================================================
Clipperz.PM.Proxy.Offline = function(args) {
args = args || {};
Clipperz.PM.Proxy.Offline.superclass.constructor.call(this, args);
this._dataStore = args.dataStore || new Clipperz.PM.Proxy.Offline.DataStore(args);
return this;
}
YAHOO.extendX(Clipperz.PM.Proxy.Offline, Clipperz.PM.Proxy, {
'toString': function () {
return "Clipperz.PM.Proxy.Offline";
},
//-------------------------------------------------------------------------
'dataStore': function () {
return this._dataStore;
},
//-------------------------------------------------------------------------
'sendMessage': function(aFunctionName, someParameters) {
return this.dataStore().processMessage(aFunctionName, someParameters);
},
//-------------------------------------------------------------------------
'isReadOnly': function () {
return true;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,259 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
//=============================================================================
Clipperz.PM.Proxy.PHP = function(args) {
Clipperz.PM.Proxy.PHP.superclass.constructor.call(this, args);
/*
this._tolls = {
'CONNECT': [],
'REGISTER': [],
'MESSAGE': []
};
*/
return this;
}
YAHOO.extendX(Clipperz.PM.Proxy.PHP, Clipperz.PM.Proxy, {
'toString': function() {
return "Clipperz.PM.Proxy.PHP - " + this.args();
},
//=========================================================================
/*
'tolls': function() {
return this._tolls;
},
*/
//-------------------------------------------------------------------------
/*
'payToll': function(aRequestType, someParameters) {
var deferredResult;
//MochiKit.Logging.logDebug(">>> Proxy.DWR.payToll: " + aRequestType);
if (this.tolls()[aRequestType].length > 0) {
deferredResult = MochiKit.Async.succeed(this.tolls()[aRequestType].pop());
} else {
//MochiKit.Logging.logDebug("### " + aRequestType + " toll NOT immediately available; request queued.");
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(function(someParameters) {
return new Clipperz.PM.Toll(someParameters['toll']);
})
com_clipperz_pm_Proxy.knock(Clipperz.Base.serializeJSON({requestType:aRequestType}), {
callback:MochiKit.Base.method(deferredResult, 'callback'),
errorHandler:MochiKit.Base.method(deferredResult, 'errback')
});
}
deferredResult.addCallback(function(aToll) {
return aToll.deferredPay();
});
deferredResult.addCallback(function(someParameters, aToll) {
var result;
result = {
parameters: someParameters,
toll: aToll
}
return result;
}, someParameters);
return deferredResult;
},
*/
//-------------------------------------------------------------------------
/*
'addToll': function(aToll) {
this.tolls()[aToll.requestType()].push(aToll);
},
*/
//=========================================================================
/*
'setTollCallback': function(someParameters) {
//MochiKit.Logging.logDebug(">>> Proxy.DWR.setTollCallback");
//MochiKit.Logging.logDebug("--- Proxy.DWR.setTollCallback - " + Clipperz.Base.serializeJSON(someParameters));
if (typeof(someParameters['toll']) != 'undefined') {
this.addToll(new Clipperz.PM.Toll(someParameters['toll']));
}
return someParameters['result'];
},
*/
//=========================================================================
'registration': function(someParameters) {
return this.sendMessage('registration', someParameters, 'REGISTER');
},
//-------------------------------------------------------------------------
'handshake': function(someParameters) {
/*
_s = "e8a2162f29aeaabb729f5625e9740edbf0cd80ac77c6b19ab951ed6c88443b8c";
_v = new Clipperz.Crypto.BigInt("955e2db0f7844aca372f5799e5f7e51b5866718493096908bd66abcf1d068108", 16);
_b = new Clipperz.Crypto.BigInt("5761e6c84d22ea3c5649de01702d60f674ccfe79238540eb34c61cd020230c53", 16);
_B = _v.add(Clipperz.Crypto.SRP.g().powerModule(_b, Clipperz.Crypto.SRP.n()));
_u = new Clipperz.Crypto.BigInt(Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(_B.asString(10))).toHexString(), 16);
_A = new Clipperz.Crypto.BigInt("3b3567ec33d73673552e960872eb154d091a2488915941038aef759236a27e64", 16);
_S = (_A.multiply(_v.powerModule(_u, Clipperz.Crypto.SRP.n()))).powerModule(_b, Clipperz.Crypto.SRP.n());
_K = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(_S.asString(10))).toHexString().slice(2);
_M1 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(_A.asString(10) + _B.asString(10) + _K)).toHexString().slice(2);
_M2 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(_A.asString(10) + _M1 + _K)).toHexString().slice(2);
// MochiKit.Logging.logDebug("b = " + _b.asString(16));
// MochiKit.Logging.logDebug("v = " + _v.asString(16));
MochiKit.Logging.logDebug("B = " + _B.asString(16));
MochiKit.Logging.logDebug("u = " + _u.asString(16));
MochiKit.Logging.logDebug("S = " + _S.asString(16));
MochiKit.Logging.logDebug("K = " + _K);
MochiKit.Logging.logDebug("M1 = " + _M1);
MochiKit.Logging.logDebug("M2 = " + _M2);
// MochiKit.Logging.logDebug("someParameters.version: " + someParameters.version);
*/
return this.sendMessage('handshake', someParameters, 'CONNECT');
},
//-------------------------------------------------------------------------
'message': function(someParameters) {
return this.sendMessage('message', someParameters, 'MESSAGE');
},
//-------------------------------------------------------------------------
'logout': function(someParameters) {
//MochiKit.Logging.logDebug("=== Proxy.DWR.logout");
return this.sendMessage('logout', someParameters, 'MESSAGE');
},
//=========================================================================
'sendMessage': function(aFunctionName, someParameters, aRequestType) {
/*
var deferredResult;
var proxy;
//MochiKit.Logging.logDebug(">>> Proxy.DWR.sendMessage - " + aFunctionName + " - " + aRequestType);
proxy = this;
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("x.1 Proxy.DWR.sendMessage - 1: " + res); return res;});
deferredResult.addCallback(MochiKit.Base.method(proxy, 'payToll'), aRequestType);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("x.2 Proxy.DWR.sendMessage - 2: " + Clipperz.Base.serializeJSON(res)); return res;});
deferredResult.addCallback(MochiKit.Base.method(proxy, 'sendRemoteMessage'), aFunctionName);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("x.3 Proxy.DWR.sendMessage - 3: " + res); return res;});
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("x.3 Proxy.DWR.sendMessage - 3: " + Clipperz.Base.serializeJSON(res)); return res;});
deferredResult.callback(someParameters);
//MochiKit.Logging.logDebug("<<< Proxy.DWR.sendMessage");
return deferredResult;
*/
// return this.sendRemoteMessage(aFunctionName, someParameters);
var deferredResult;
var proxy;
proxy = this;
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(MochiKit.Base.method(proxy, 'sendRemoteMessage'), aFunctionName);
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("x.3 Proxy.PHP.sendMessage - 3: " + res); return res;});
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("x.3 Proxy.PHP.sendMessage - 3.1: " + Clipperz.Base.serializeJSON(res)); return res;});
deferredResult.callback(someParameters);
return deferredResult;
},
//=========================================================================
'sendRemoteMessage': function(aFunctionName, someParameters) {
/*
var deferredResult;
//MochiKit.Logging.logDebug(">>> Proxy.DWR.sendRemoteMessage('" + aFunctionName + "', " + Clipperz.Base.serializeJSON(someParameters) + ") - " + this);
deferredResult = new MochiKit.Async.Deferred();
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Proxy.DWR.sendRemoteMessage - 1: " + res); return res;});
// deferredResult.addCallback(MochiKit.Base.method(this, 'setTollCallback'));
//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("Proxy.DWR.sendRemoteMessage - 2: " + res); return res;});
com_clipperz_pm_Proxy[aFunctionName](Clipperz.Base.serializeJSON(someParameters), {
callback:MochiKit.Base.method(deferredResult, 'callback'),
errorHandler:MochiKit.Base.method(deferredResult, 'errback')
});
//MochiKit.Logging.logDebug("<<< Proxy.PHP.sendRemoteMessage - result: " + deferredResult);
return deferredResult;
*/
var deferredResult;
var parameters;
//MochiKit.Logging.logDebug(">>> Proxy.PHP.sendRemoteMessage('" + aFunctionName + "', " + Clipperz.Base.serializeJSON(someParameters) + ") - " + this);
parameters = {};
parameters['method'] = aFunctionName;
// parameters['version'] = someParameters['version'];
// parameters['message'] = someParameters['message'];
parameters['parameters'] = Clipperz.Base.serializeJSON(someParameters);
//MochiKit.Logging.logDebug("--- Proxy.PHP.sendRemoteMessage('" + Clipperz.Base.serializeJSON(parameters) + ") - " + this);
deferredResult = new MochiKit.Async.Deferred();
deferredResult.addCallback(MochiKit.Async.doXHR, "./php/index.php", {
method:'POST',
sendContent:MochiKit.Base.queryString(parameters),
headers:{"Content-Type":"application/x-www-form-urlencoded"}
});
//deferredResult.addCallback(function(res) {MochiKit.Logging.logDebug("Proxy.PHP.response - 2: " + res.responseText); return res;});
//deferredResult.addErrback(function(res) {MochiKit.Logging.logDebug("Proxy.PHP.response - ERROR: " + res); return res;});
deferredResult.addCallback(MochiKit.Async.evalJSONRequest);
deferredResult.callback();
return deferredResult;
},
//=========================================================================
'isReadOnly': function() {
return false;
},
//=========================================================================
__syntaxFix__: "syntax fix"
});
//=============================================================================
//Clipperz.PM.Proxy.defaultProxy = new Clipperz.PM.Proxy.PHP("Proxy.PHP - async test");

View File

@@ -0,0 +1,94 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Proxy) == 'undefined') { Clipperz.PM.Proxy = {}; }
//=============================================================================
Clipperz.PM.Proxy.Test = function(args) {
args = args || {};
Clipperz.PM.Proxy.Offline.call(this, args);
return this;
}
Clipperz.PM.Proxy.Test.prototype = MochiKit.Base.update(new Clipperz.PM.Proxy.Offline(), {
'toString': function() {
return "Clipperz.PM.Proxy.Test";
},
//-------------------------------------------------------------------------
'isTestData': function() {
return typeof(this.userData()['__masterkey_test_value__'] != 'undefined');
},
//-------------------------------------------------------------------------
'userDetails': function() {
var result;
if (this.isTestData()) {
var serializedHeader;
var version;
version = this.userData()['version'];
serializedHeader = Clipperz.Base.serializeJSON(this.userData()['userDetails']);
result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(this.userData()['__masterkey_test_value__'], serializedHeader);
} else {
result = Clipperz.PM.Proxy.Offline.prototype.userDetails.call(this);
}
return result;
},
//-------------------------------------------------------------------------
'statistics': function() {
var result;
var serializedStatistics;
var version;
version = this.userData()['version'];
serializedStatistics = Clipperz.Base.serializeJSON(this.userData()['statistics']);
result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(this.userData()['__masterkey_test_value__'], serializedStatistics);
return result;
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
});

View File

@@ -0,0 +1,231 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; }
if (typeof(Clipperz.PM.Strings.Languages) == 'undefined') { Clipperz.PM.Strings.Languages = {}; }
Clipperz.PM.Strings.standardStrings = {
'loginPanelSwitchLanguageSelectOptions': [
/*
{tag:'option', html:"Arabic (Oman) (العربية)", value:'ar-OM', disabled:true},
{tag:'option', html:"Arabic (Syria) (العربية)", value:'ar-SY', disabled:true},
{tag:'option', html:"Bahasa Indonesia", value:'id-ID', disabled:true},
{tag:'option', html:"Bulgarian (Български)", value:'bg-BG', disabled:true},
{tag:'option', html:"Català", value:'ca-ES', disabled:true},
{tag:'option', html:"Chinese (Simplified) (简体中文)", value:'zh-CN', disabled:true},
{tag:'option', html:"Chinese (Traditional) (正體中文)", value:'zh-TW', disabled:true},
{tag:'option', html:"Czech (Česky)", value:'cs-CZ', disabled:true},
{tag:'option', html:"Dansk", value:'da-DK', disabled:true},
{tag:'option', html:"Deutsch", value:'de-DE'/ *, disabled:true* /},
{tag:'option', html:"English (American)", value:'en-US'/ *, disabled:true* /},
{tag:'option', html:"English (British)", value:'en-GB'/ *, disabled:true* /},
{tag:'option', html:"English (Canadian)", value:'en-CA'/ *, disabled:true* /},
{tag:'option', html:"Español", value:'es-ES', disabled:true},
{tag:'option', html:"Eesti", value:'et-EE', disabled:true},
{tag:'option', html:"Français", value:'fr-FR', disabled:true},
{tag:'option', html:"Galego", value:'gl-ES', disabled:true},
{tag:'option', html:"Greek (Ελληνικά)", value:'el-GR', disabled:true},
{tag:'option', html:"Íslenska", value:'is-IS', disabled:true},
{tag:'option', html:"Italiano", value:'it-IT'/ *, disabled:true* /},
{tag:'option', html:"Japanese (日本語)", value:'ja-JP', disabled:true},
{tag:'option', html:"Korean (한국어)", value:'ko-KR', disabled:true},
{tag:'option', html:"Latviešu", value:'lv-LV', disabled:true},
{tag:'option', html:"Lietuvių", value:'lt-LT', disabled:true},
{tag:'option', html:"Macedonian (Македонски)", value:'mk-MK', disabled:true},
{tag:'option', html:"Magyar", value:'hu-HU', disabled:true},
{tag:'option', html:"Nederlands", value:'nl-NL', disabled:true},
{tag:'option', html:"Norsk bokmål", value:'nb-NO', disabled:true},
{tag:'option', html:"Norsk nynorsk", value:'nn-NO', disabled:true},
{tag:'option', html:"Persian (Western) (فارسى)", value:'fa-IR', disabled:true},
{tag:'option', html:"Polski", value:'pl-PL', disabled:true},
{tag:'option', html:"Português", value:'pt-PT'/ *, disabled:true* /},
{tag:'option', html:"Português Brasileiro", value:'pt-BR'/ *, disabled:true* /},
{tag:'option', html:"Românä", value:'ro-RO', disabled:true},
{tag:'option', html:"Russian (Русский)", value:'ru-RU', disabled:true},
{tag:'option', html:"Slovak (Slovenčina)", value:'sk-SK', disabled:true},
{tag:'option', html:"Slovenian (Slovenščina)", value:'sl-SI', disabled:true},
{tag:'option', html:"Suomi", value:'fi-FI', disabled:true},
{tag:'option', html:"Svenska", value:'sv-SE', disabled:true},
{tag:'option', html:"Thai (ไทย)", value:'th-TH', disabled:true},
{tag:'option', html:"Türkçe", value:'tr-TR', disabled:true},
{tag:'option', html:"Ukrainian (Українська)", value:'uk-UA', disabled:true}
*/
{tag:'option', html:"Arabic (العربية)", value:"ar", disabled:true, cls:'disabledOption'},
// {tag:'option', html:"Chinese (中文)", value:"zh", disabled:true},
{tag:'option', html:"Chinese (Simplified) (简体中文)", value:'zh-CN'},
{tag:'option', html:"Dutch (Nederlands)", value:"nl-NL", disabled:true, cls:'disabledOption'},
{tag:'option', html:"English", value:"en-US"},
{tag:'option', html:"French (Français)", value:"fr-FR"},
{tag:'option', html:"German (Deutsch)", value:"de-DE"/* -- */, disabled:true, cls:'disabledOption' /* */},
{tag:'option', html:"Greek (Ελληνικά)", value:"el-GR"/* -- */, disabled:true, cls:'disabledOption' /* */},
{tag:'option', html:"Hebrew (עברית)", value:"he-IL"/* -- */, disabled:true, cls:'disabledOption' /* */},
{tag:'option', html:"Italian (Italiano)", value:"it-IT"},
{tag:'option', html:"Japanese (日本語)", value:"ja-JP"},
{tag:'option', html:"Korean (한국어)", value:"ko-KR", disabled:true, cls:'disabledOption'},
{tag:'option', html:"Norwegian (Norsk)", value:"no", disabled:true, cls:'disabledOption'},
{tag:'option', html:"Persian (فارسی)", value:"fa-IR", disabled:true, cls:'disabledOption'},
{tag:'option', html:"Polish (Polski)", value:"pl-PL", disabled:true, cls:'disabledOption'},
{tag:'option', html:"Portuguese (Português)", value:"pt-BR"},
{tag:'option', html:"Russian (Русский)", value:"ru-RU"/* -- */, disabled:true, cls:'disabledOption' /* */},
{tag:'option', html:"Spanish (Español)", value:"es-ES"},
{tag:'option', html:"Swedish (Svenska)", value:"sv-SE", disabled:true, cls:'disabledOption'},
{tag:'option', html:"Turkish (Türkçe)", value:"tr-TR", disabled:true, cls:'disabledOption'},
{tag:'option', html:"Vietnamese (Tiếng Việt)", value:"vi-VN", disabled:true, cls:'disabledOption'}
]
}
Clipperz.PM.Strings.GeneralSettings = {
'en-us': {
'loginFormAarghThatsBadUrl': "http://www.clipperz.com/support/faq/account_faq",
'loginFormVerifyTheCodeUrl': "http://www.clipperz.com/learn_more/reviewing_the_code",
'donateHeaderLinkUrl': "http://www.clipperz.com/donations",
'creditsHeaderLinkUrl': "http://www.clipperz.com/credits",
'feedbackHeaderLinkUrl': "http://www.clipperz.com/contact",
'helpHeaderLinkUrl': "http://www.clipperz.com/support/user_guide",
'forumHeaderLinkUrl': "http://www.clipperz.com/forum",
'httpAuthBookmarkletConfiguration': {tag:'textarea', id:'httpAuthDefaultConfiguration', html:"" +
"{ \"page\":{\"title\":\"HTTP authentication\"}," + "\n" +
" \"form\":{\"attributes\": {" + "\n" +
" \"action\":\"\"," + "\n" +
" \"type\":\"http_auth\"" + "\n" +
" }, \"inputs\": [" + "\n" +
" {\"type\":\"text\",\"name\":\"url\",\"value\":\"\"}," + "\n" +
" {\"type\":\"text\",\"name\":\"username\",\"value\":\"\"}," + "\n" +
" {\"type\":\"password\",\"name\":\"password\",\"value\":\"\"}" + "\n" +
" ]}, \"version\":\"0.2.3\"}"
},
'directLoginJumpPageUrl': "",
'defaultFaviconUrl': "data:application/octet-stream;charset=utf-8;base64,AAABAAEAFxcAAAEAGAD8BgAAFgAAACgAAAAXAAAALgAAAAEAGAAAAAAAAAAAABIXAAASFwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////9zAC////////////////////////////////////////////////////////////////////////////////////////////9pAG////////////////////////////////////////////////////////////////////////////////////////////9rAC////////////////////////////////////////////////////////////////////////////////////////////9yAHP////////////////////////IyMizs7O6urrq6ur////////////Ozs6zs7Ozs7Pq6ur///////////////////////8AAAD////////////////////V1dWXl5eXl5eXl5elpaX4+Pj////Ozs6Xl5eXl5eXl5eenp7///////////////////////8AAAD////////////////////Ozs6Xl5eXl5eXl5eXl5fBwcHq6uqenp6Xl5eXl5eXl5eXl5f///////////////////////8AAAD////////////////////j4+OXl5eXl5eXl5eXl5eXl5elpaWXl5eXl5eXl5eXl5ezs7P///////////////////////8AAAD////////////////////////IyMiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eenp7x8fH////////////////////////////////////////////////////4+PilpaWXl5eXl5eXl5eXl5eXl5eXl5eXl5fOzs7////////////////////////////////////////////////////////q6uq6urqXl5eXl5eXl5eXl5eXl5eXl5eenp7V1dX4+Pj///////////////////////8AAAD////////////4+PjOzs6lpaWXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5e6urrj4+P///////////////8AAAD////////////BwcGXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5fx8fH///////////8AAAD///////////+zs7OXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5fj4+P///////////8AAAD////////////IyMiXl5eXl5eXl5eXl5e6urqXl5eXl5eXl5eXl5esrKylpaWXl5eXl5eXl5eenp7x8fH///////////8AAAD////////////////Ozs7Ozs7V1dX4+Pj///+Xl5eXl5eXl5eXl5fOzs7////q6urOzs7Ozs7q6ur///////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD////////////////////////////////////IyMiXl5eXl5eenp7x8fH///////////////////////////////////8AAAD////////////////////////////////////////j4+Pj4+Px8fH///////////////////////////////////////8AAAD///////////////////////////////////////////////////////////////////////////////////////////8AAAD///////////////////////////////////////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAo=",
'defaultFaviconUrl_IE': "https://www.clipperz.com/images/icons/misc/favicon.ico",
'donateSplashPanelIconUrl': "./images/smiles_big.gif",
'icons_baseUrl': "https://www.clipperz.com/images/icons",
'passwordGeneratorLowercaseCharset': "abcdefghijklmnopqrstuvwxyz",
'passwordGeneratorUppercaseCharset': "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
'passwordGeneratorNumberCharset': "0123456789",
'passwordGeneratorSymbolCharset': "!@#$%^&*+?[]{}/|\\<>,.;:~=-_",
'_': ""
}
}
Clipperz.PM.Strings.defaultLanguages = {
'default': "en-us",
// 'de': "de-de",
// 'el': "el-gr",
// 'he': "he-il",
// 'ru': "ru-ru",
'fr': "fr-fr",
'es': "es-es",
'zh': "zh-cn",
'ja': "ja-jp",
'pt': "pt-br",
'it': "it-it",
'en': "en-us"
}
Clipperz.PM.Strings.inputTypeToRecordFieldType = {
'text': 'TXT',
'password': 'PWD',
'checkbox': 'CHECK',
'radio': 'RADIO',
'select': 'SELECT'
};
Clipperz.PM.Strings.Languages.setSelectedLanguage = function(aLanguage) {
var language;
var selectedLanguage;
language = (aLanguage || Clipperz.PM.Strings.preferredLanguage || 'default').toLowerCase();
//MochiKit.Logging.logDebug("1 - language: " + language);
if (typeof(Clipperz.PM.Strings.defaultLanguages[language]) != 'undefined') {
language = Clipperz.PM.Strings.defaultLanguages[language];
//MochiKit.Logging.logDebug("2 - language: " + language);
}
if (typeof(Clipperz.PM.Strings.Languages[language]) != 'undefined') {
selectedLanguage = language;
//MochiKit.Logging.logDebug("### selectedLanguage full match: " + selectedLanguage);
} else if (typeof(Clipperz.PM.Strings.defaultLanguages[language.substr(0,2)]) != 'undefined') {
selectedLanguage = Clipperz.PM.Strings.defaultLanguages[language.substr(0,2)];
//MochiKit.Logging.logDebug("### selectedLanguage partial match: " + selectedLanguage);
} else {
selectedLanguage = Clipperz.PM.Strings.defaultLanguages['default'];
//MochiKit.Logging.logDebug("### selectedLanguage default match: " + selectedLanguage);
}
//MochiKit.Logging.logDebug("### selectedLanguage: " + selectedLanguage);
if (selectedLanguage != Clipperz.PM.Strings.selectedLanguage) {
//MochiKit.Logging.logDebug(">>> setting Clipperz.PM.Strings.selectedLanguage: " + selectedLanguage);
Clipperz.PM.Strings.selectedLanguage = selectedLanguage;
MochiKit.Base.update(Clipperz.PM.Strings, Clipperz.PM.Strings.standardStrings)
//MochiKit.Logging.logDebug("=== 1: " + Clipperz.PM.Strings['bookmarkletTabInstructions']);
MochiKit.Base.updatetree(Clipperz.PM.Strings, Clipperz.PM.Strings.Languages[Clipperz.PM.Strings.defaultLanguages['default']]);
//MochiKit.Logging.logDebug("=== 2: " + Clipperz.PM.Strings['bookmarkletTabInstructions']);
MochiKit.Base.updatetree(Clipperz.PM.Strings, Clipperz.PM.Strings.GeneralSettings[Clipperz.PM.Strings.defaultLanguages['default']]);
//MochiKit.Logging.logDebug("=== 3: " + Clipperz.PM.Strings['bookmarkletTabInstructions']);
MochiKit.Base.updatetree(Clipperz.PM.Strings, Clipperz.PM.Strings.Languages[selectedLanguage]);
//MochiKit.Logging.logDebug("=== 4: " + Clipperz.PM.Strings['bookmarkletTabInstructions']);
MochiKit.Base.updatetree(Clipperz.PM.Strings, Clipperz.PM.Strings.GeneralSettings[selectedLanguage]);
//MochiKit.Logging.logDebug("=== 5: " + Clipperz.PM.Strings['bookmarkletTabInstructions']);
Clipperz.NotificationCenter.notify(Clipperz.PM.Strings.Languages, 'switchLanguage', selectedLanguage);
//MochiKit.Logging.logDebug("<<< setting Clipperz.PM.Strings.selectedLanguage. Done");
}
}
Clipperz.PM.Strings.Languages.initSetup = function() {
var language;
var languageParser;
language = navigator.language || navigator.userLanguage; // en, en-US, .... "de", "nb-no"
languageParser = new RegExp("language=([a-z]{2}(?:\-[a-z]{2})?)(\&|$)", "i");
if (languageParser.test(window.location.search)) {
//MochiKit.Logging.logDebug("LANGUAGE specified in the query string");
language = RegExp.$1;
}
//MochiKit.Logging.logDebug("+++ preferredLanguage: " + language);
Clipperz.PM.Strings.preferredLanguage = language.toLowerCase();
//MochiKit.Logging.logDebug("## preferredLanguage: " + Clipperz.PM.Strings.preferredLanguage);
Clipperz.PM.Strings.Languages.setSelectedLanguage(Clipperz.PM.Strings.preferredLanguage);
}
//MochiKit.DOM.addLoadEvent(Clipperz.PM.Strings.Languages.initSetup);

View File

@@ -0,0 +1,389 @@
/*
Copyright 2008-2011 Clipperz Srl
This file is part of Clipperz's Javascript Crypto Library.
Javascript Crypto Library provides web developers with an extensive
and efficient set of cryptographic functions. The library aims to
obtain maximum execution speed while preserving modularity and
reusability.
For further information about its features and functionalities please
refer to http://www.clipperz.com
* Javascript Crypto Library 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.
* Javascript Crypto Library 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 Javascript Crypto Library. If not, see
<http://www.gnu.org/licenses/>.
*/
if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; }
Clipperz.PM.Strings.messagePanelConfigurations = {
//-------------------------------------------------------------------------
//
// Registration - connection
//
'registration_verify': function() {
return {
'title': null,
'text': Clipperz.PM.Strings['connectionRegistrationSendingRequestMessageText']
}
},
'registration_sendingCredentials': function() {
return {
'title': null,
'text': Clipperz.PM.Strings['connectionRegistrationSendingCredentialsMessageText']
}
},
//-------------------------------------------------------------------------
//
// One Time Password login message panel
//
'OTP_login_start': function() {
return {
'title': Clipperz.PM.Strings['OTPloginMessagePanelInitialTitle'],
'text': Clipperz.PM.Strings['OTPloginMessagePanelInitialText'],
'steps': '+3',
'buttons': {}
}
},
'OTP_login_loadingOTP': function() {
return {
'title': Clipperz.PM.Strings['OTPloginMessagePanelLoadingTitle'],
'text': Clipperz.PM.Strings['OTPloginMessagePanelLoadingText']
}
},
'OTP_login_extractingPassphrase': function() {
return {
'title': Clipperz.PM.Strings['OTPloginMessagePanelProcessingTitle'],
'text': Clipperz.PM.Strings['OTPloginMessagePanelProcessingText']
}
},
//-------------------------------------------------------------------------
//
// Login message panel
//
'login_start': function() {
return {
'title': Clipperz.PM.Strings['loginMessagePanelInitialTitle'],
'text': Clipperz.PM.Strings['loginMessagePanelInitialText'],
'steps': '+7',
'buttons': {
'ok': Clipperz.PM.Strings['loginMessagePanelInitialButtonLabel']
}
}
},
'login_connected': function() {
return {
'title': Clipperz.PM.Strings['loginMessagePanelConnectedTitle'],
'text': Clipperz.PM.Strings['loginMessagePanelConnectedText'],
'buttons': {}
}
},
'login_failed': function() {
return {
'title': Clipperz.PM.Strings['loginMessagePanelFailureTitle'],
'text': Clipperz.PM.Strings['loginMessagePanelFailureText'],
'button': Clipperz.PM.Strings['loginMessagePanelFailureButtonLabel']
}
},
//-------------------------------------------------------------------------
//
// Login message panel - connection
//
'connection_sendingCredentials': function() {
return {
'title': Clipperz.PM.Strings['connectionLoginSendingCredentialsMessageTitle'],
'text': Clipperz.PM.Strings['connectionLoginSendingCredentialsMessageText']
}
},
'connection_credentialVerification': function() {
return {
'title': Clipperz.PM.Strings['connectionLoginCredentialsVerificationMessageTitle'],
'text': Clipperz.PM.Strings['connectionLoginCredentialsVerificationMessageText']
}
},
'connection_loggedIn': function() {
return {
'title': Clipperz.PM.Strings['connectionLoginDoneMessageTitle'],
'text': Clipperz.PM.Strings['connectionLoginDoneMessageText']
}
},
//-------------------------------------------------------------------------
//
// Login message panel - user
//
'connection_upgrading': function() {
return {
'title': Clipperz.PM.Strings['userLoginPanelUpgradingUserCredentialsMessageTitle'],
'text': Clipperz.PM.Strings['userLoginPanelUpgradingUserCredentialsMessageText'],
'steps': '+1'
}
},
'connection_done': function() {
return {
'title': Clipperz.PM.Strings['userLoginPanelConnectedMessageTitle'],
'text': Clipperz.PM.Strings['userLoginPanelConnectedMessageText']
}
},
'connection_tryOlderSchema': function() {
return {
'title': Clipperz.PM.Strings['userLoginPanelTryingAnOlderConnectionSchemaMessageTitle'],
'text': Clipperz.PM.Strings['userLoginPanelTryingAnOlderConnectionSchemaMessageText'],
'steps': '+4'
}
},
'connection_loadingUserData': function() {
return {
'title': Clipperz.PM.Strings['userLoginPanelLoadingUserDataMessageTitle'],
'text': Clipperz.PM.Strings['userLoginPanelLoadingUserDataMessageText']
}
},
'connection_decryptingUserData': function() {
return {
'title': Clipperz.PM.Strings['userLoginPanelDecryptingUserDataMessageTitle'],
'text': Clipperz.PM.Strings['userLoginPanelDecryptingUserDataMessageText'],
'steps': '+1'
}
},
'connection_decryptingUserStatistics': function() {
return {
'title': Clipperz.PM.Strings['userLoginPanelDecryptingUserStatisticsMessageTitle'],
'text': Clipperz.PM.Strings['userLoginPanelDecryptingUserStatisticsMessageText']
}
},
'collectingEntropy': function() {
return {
'text': Clipperz.PM.Strings['panelCollectingEntryopyMessageText'],
'steps': '+1'
}
},
//-------------------------------------------------------------------------
//
// Cards block - delete card panel
//
'deleteRecord_collectData': function() {
return {
'title': Clipperz.PM.Strings['deleteRecordPanelCollectRecordDataMessageTitle'],
'text': Clipperz.PM.Strings['deleteRecordPanelCollectRecordDataMessageText']
}
},
'deleteRecord_encryptData': function() {
return {
'title': Clipperz.PM.Strings['deleteRecordPanelEncryptUserDataMessageTitle'],
'text': Clipperz.PM.Strings['deleteRecordPanelEncryptUserDataMessageText']
}
},
'deleteRecord_sendingData': function() {
return {
'title': Clipperz.PM.Strings['deleteRecordPanelSendingDataToTheServerMessageTitle'],
'text': Clipperz.PM.Strings['deleteRecordPanelSendingDataToTheServerMessageText']
}
},
'deleteRecord_updatingInterface': function() {
return {
'title': Clipperz.PM.Strings['deleteRecordPanelUpdatingTheInterfaceMessageTitle'],
'text': Clipperz.PM.Strings['deleteRecordPanelUpdatingTheInterfaceMessageText']
}
},
//-------------------------------------------------------------------------
//
// Cards block - save card panel
//
'saveCard_collectRecordInfo': function() {
return {
'title': Clipperz.PM.Strings['recordSaveChangesPanelCollectRecordInfoMessageTitle'],
'text': Clipperz.PM.Strings['recordSaveChangesPanelCollectRecordInfoMessageText']
}
},
'saveCard_encryptUserData': function() {
return {
'title': Clipperz.PM.Strings['recordSaveChangesPanelEncryptUserDataMessageTitle'],
'text': Clipperz.PM.Strings['recordSaveChangesPanelEncryptUserDataMessageText']
}
},
'saveCard_encryptRecordData': function() {
return {
'title': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordDataMessageTitle'],
'text': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordDataMessageText']
}
},
'saveCard_encryptRecordVersions': function() {
return {
'title': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordVersionDataMessageTitle'],
'text': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordVersionDataMessageText']
}
},
'saveCard_sendingData': function() {
return {
'title': Clipperz.PM.Strings['recordSaveChangesPanelSendingDataToTheServerMessageTitle'],
'text': Clipperz.PM.Strings['recordSaveChangesPanelSendingDataToTheServerMessageText']
}
},
'saveCard_updatingInterface': function() {
return {
'title': Clipperz.PM.Strings['recordSaveChangesPanelUpdatingTheInterfaceMessageTitle'],
'text': Clipperz.PM.Strings['recordSaveChangesPanelUpdatingTheInterfaceMessageText']
}
},
//-------------------------------------------------------------------------
//
// Account panel - user preferences
//
'account_savingPreferences_1': function() {
return {
'title': Clipperz.PM.Strings['accountPreferencesSavingPanelTitle_Step1'],
'text': Clipperz.PM.Strings['accountPreferencesSavingPanelText_Step1'],
'steps': '+3'
}
},
'account_savingPreferences_2': function() {
return {
'title': Clipperz.PM.Strings['accountPreferencesSavingPanelTitle_Step2'],
'text': Clipperz.PM.Strings['accountPreferencesSavingPanelText_Step2']
}
},
//-------------------------------------------------------------------------
//
// Account panel - change credentials
//
'changeCredentials_encryptingData': function() {
return {
'title': Clipperz.PM.Strings['changeCredentialsPanelEncryptingDataMessageTitle'],
'text': Clipperz.PM.Strings['changeCredentialsPanelEncryptingDataMessageText']
}
},
'changeCredentials_creatingNewCredentials': function() {
return {
'title': Clipperz.PM.Strings['changeCredentialsPanelCreatingNewCredentialsMessageTitle'],
'text': Clipperz.PM.Strings['changeCredentialsPanelCreatingNewCredentialsMessageText']
}
},
'changeCredentials_sendingCredentials': function() {
return {
'title': Clipperz.PM.Strings['changeCredentialsPanelSendingNewCredentialsToTheServerMessageTitle'],
'text': Clipperz.PM.Strings['changeCredentialsPanelSendingNewCredentialsToTheServerMessageText']
}
},
'changeCredentials_done': function() {
return {
'title': Clipperz.PM.Strings['changeCredentialsPanelDoneMessageTitle'],
'text': Clipperz.PM.Strings['changeCredentialsPanelDoneMessageText']
}
},
//-------------------------------------------------------------------------
//
// Account panel - change credentials
//
'saveOTP_encryptUserData': function() {
return {
'title': Clipperz.PM.Strings['saveOTP_encryptUserDataTitle'],
'text': Clipperz.PM.Strings['saveOTP_encryptUserDataText'],
'steps': '+4'
}
},
'saveOTP_encryptOTPData': function() {
return {
'title': Clipperz.PM.Strings['saveOTP_encryptOTPDataTitle'],
'text': Clipperz.PM.Strings['saveOTP_encryptOTPDataText']
}
},
'saveOTP_sendingData': function() {
return {
'title': Clipperz.PM.Strings['saveOTP_sendingDataTitle'],
'text': Clipperz.PM.Strings['saveOTP_sendingDataText']
}
},
'saveOTP_updatingInterface': function() {
return {
'title': Clipperz.PM.Strings['saveOTP_updatingInterfaceTitle'],
'text': Clipperz.PM.Strings['saveOTP_updatingInterfaceText']
}
},
//-------------------------------------------------------------------------
//
// Data panel - processingImportData
//
'parseImportData': function() {
return {
'title': Clipperz.PM.Strings['importData_parsingDataTitle'],
'text': Clipperz.PM.Strings['importData_parsingDataText']
}
},
'previewImportData': function() {
return {
'title': Clipperz.PM.Strings['importData_previewingDataTitle'],
'text': Clipperz.PM.Strings['importData_previewingDataText']
}
},
'processingImportData': function() {
return {
'title': Clipperz.PM.Strings['importData_processingDataTitle'],
'text': Clipperz.PM.Strings['importData_processingDataText']
}
},
//-------------------------------------------------------------------------
__syntaxFix__: "syntax fix"
}

Some files were not shown because too many files have changed in this diff Show More