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:
400
frontend/beta/js/Bookmarklet.js
Normal file
400
frontend/beta/js/Bookmarklet.js
Normal file
File diff suppressed because one or more lines are too long
47
frontend/beta/js/BookmarkletHash.js
Normal file
47
frontend/beta/js/BookmarkletHash.js
Normal 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);
|
||||
23
frontend/beta/js/Bookmarklet_IE.js
Normal file
23
frontend/beta/js/Bookmarklet_IE.js
Normal 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();
|
||||
308
frontend/beta/js/Clipperz/Base.js
Normal file
308
frontend/beta/js/Clipperz/Base.js
Normal 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, "<");
|
||||
result = result.replace(/>/g, ">");
|
||||
|
||||
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,"<");
|
||||
result = result.replace(/>/img,">");
|
||||
} 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
|
||||
);
|
||||
1426
frontend/beta/js/Clipperz/ByteArray.js
Normal file
1426
frontend/beta/js/Clipperz/ByteArray.js
Normal file
File diff suppressed because it is too large
Load Diff
348
frontend/beta/js/Clipperz/CSVProcessor.js
Normal file
348
frontend/beta/js/Clipperz/CSVProcessor.js
Normal 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"
|
||||
});
|
||||
|
||||
|
||||
836
frontend/beta/js/Clipperz/Crypto/AES.js
Normal file
836
frontend/beta/js/Clipperz/Crypto/AES.js
Normal 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")
|
||||
};
|
||||
1852
frontend/beta/js/Clipperz/Crypto/Base.js
Normal file
1852
frontend/beta/js/Clipperz/Crypto/Base.js
Normal file
File diff suppressed because it is too large
Load Diff
1760
frontend/beta/js/Clipperz/Crypto/BigInt.js
Normal file
1760
frontend/beta/js/Clipperz/Crypto/BigInt.js
Normal file
File diff suppressed because it is too large
Load Diff
1649
frontend/beta/js/Clipperz/Crypto/BigInt_scoped.js
Normal file
1649
frontend/beta/js/Clipperz/Crypto/BigInt_scoped.js
Normal file
File diff suppressed because it is too large
Load Diff
960
frontend/beta/js/Clipperz/Crypto/ECC.js
Normal file
960
frontend/beta/js/Clipperz/Crypto/ECC.js
Normal 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"
|
||||
});
|
||||
|
||||
//#############################################################################
|
||||
*/
|
||||
461
frontend/beta/js/Clipperz/Crypto/ECC/BinaryField/Curve.js
Normal file
461
frontend/beta/js/Clipperz/Crypto/ECC/BinaryField/Curve.js
Normal 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"
|
||||
});
|
||||
|
||||
//#############################################################################
|
||||
|
||||
526
frontend/beta/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js
Normal file
526
frontend/beta/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js
Normal 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
|
||||
|
||||
]
|
||||
67
frontend/beta/js/Clipperz/Crypto/ECC/BinaryField/Point.js
Normal file
67
frontend/beta/js/Clipperz/Crypto/ECC/BinaryField/Point.js
Normal 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"
|
||||
});
|
||||
377
frontend/beta/js/Clipperz/Crypto/ECC/BinaryField/Value.js
Normal file
377
frontend/beta/js/Clipperz/Crypto/ECC/BinaryField/Value.js
Normal 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")
|
||||
};
|
||||
854
frontend/beta/js/Clipperz/Crypto/PRNG.js
Normal file
854
frontend/beta/js/Clipperz/Crypto/PRNG.js
Normal 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);
|
||||
151
frontend/beta/js/Clipperz/Crypto/RSA.js
Normal file
151
frontend/beta/js/Clipperz/Crypto/RSA.js
Normal 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"
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
});
|
||||
|
||||
//#############################################################################
|
||||
|
||||
296
frontend/beta/js/Clipperz/Crypto/SHA.js
Normal file
296
frontend/beta/js/Clipperz/Crypto/SHA.js
Normal 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"
|
||||
|
||||
});
|
||||
331
frontend/beta/js/Clipperz/Crypto/SRP.js
Normal file
331
frontend/beta/js/Clipperz/Crypto/SRP.js
Normal 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"
|
||||
|
||||
});
|
||||
|
||||
//#############################################################################
|
||||
131
frontend/beta/js/Clipperz/DOM.js
Normal file
131
frontend/beta/js/Clipperz/DOM.js
Normal 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"
|
||||
|
||||
});
|
||||
|
||||
305
frontend/beta/js/Clipperz/Date.js
Normal file
305
frontend/beta/js/Clipperz/Date.js
Normal 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"
|
||||
|
||||
});
|
||||
|
||||
251
frontend/beta/js/Clipperz/KeePassExportProcessor.js
Normal file
251
frontend/beta/js/Clipperz/KeePassExportProcessor.js
Normal 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"
|
||||
});
|
||||
|
||||
|
||||
325
frontend/beta/js/Clipperz/NotificationCenter.js
Normal file
325
frontend/beta/js/Clipperz/NotificationCenter.js
Normal 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;
|
||||
};
|
||||
*/
|
||||
288
frontend/beta/js/Clipperz/PM/BookmarkletProcessor.js
Normal file
288
frontend/beta/js/Clipperz/PM/BookmarkletProcessor.js
Normal 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;
|
||||
};
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
124
frontend/beta/js/Clipperz/PM/Components/BaseComponent.js
Normal file
124
frontend/beta/js/Clipperz/PM/Components/BaseComponent.js
Normal 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"
|
||||
|
||||
});
|
||||
@@ -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__'
|
||||
});
|
||||
|
||||
|
||||
@@ -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__'
|
||||
});
|
||||
|
||||
|
||||
189
frontend/beta/js/Clipperz/PM/Components/Compact/LoginForm.js
Normal file
189
frontend/beta/js/Clipperz/PM/Components/Compact/LoginForm.js
Normal 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__'
|
||||
});
|
||||
|
||||
|
||||
@@ -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>') : ' ')});
|
||||
}
|
||||
|
||||
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"
|
||||
});
|
||||
|
||||
@@ -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>') : ' ')}
|
||||
]};
|
||||
|
||||
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>') : ' ')
|
||||
});
|
||||
}
|
||||
}
|
||||
if (notesColumnIndex != -1) {
|
||||
rowConfig.children.push({tag:'td', valign:'top', cls:'notes', html:(MochiKit.Base.isNotEmpty(rowData[notesColumnIndex]) ? rowData[notesColumnIndex].replace(/\n/g, '<br>') : ' ')});
|
||||
}
|
||||
|
||||
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"
|
||||
});
|
||||
|
||||
@@ -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>') : ' ')});
|
||||
}
|
||||
}
|
||||
|
||||
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"
|
||||
});
|
||||
|
||||
@@ -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>') : ' ')}]};
|
||||
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>') : ' ')});
|
||||
}
|
||||
}
|
||||
|
||||
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"
|
||||
});
|
||||
|
||||
@@ -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>') : ' ')});
|
||||
}
|
||||
}
|
||||
|
||||
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"
|
||||
});
|
||||
|
||||
@@ -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:' '},
|
||||
{tag:'td', children:[
|
||||
{tag:'div', id:this.getId('backActionButton')}
|
||||
]},
|
||||
{tag:'td', html:' '},
|
||||
{tag:'td', children:[
|
||||
{tag:'div', id:this.getId('nextActionButton')}
|
||||
]},
|
||||
{tag:'td', html:' '}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]});
|
||||
|
||||
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"
|
||||
});
|
||||
|
||||
@@ -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:' '},
|
||||
{tag:'td', children:[
|
||||
{tag:'div', id:this.getId('backActionButton')}
|
||||
]},
|
||||
{tag:'td', html:' '},
|
||||
{tag:'td', children:[
|
||||
{tag:'div', id:this.getId('nextActionButton')}
|
||||
]},
|
||||
{tag:'td', html:' '}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]});
|
||||
|
||||
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"
|
||||
});
|
||||
|
||||
@@ -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:' '},
|
||||
{tag:'td', children:[
|
||||
{tag:'div', id:this.getId('backActionButton')}
|
||||
]},
|
||||
{tag:'td', html:' '},
|
||||
{tag:'td', children:[
|
||||
{tag:'div', id:this.getId('nextActionButton')}
|
||||
]},
|
||||
{tag:'td', html:' '}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]});
|
||||
|
||||
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"
|
||||
});
|
||||
|
||||
@@ -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>') : ' ')}
|
||||
]},
|
||||
{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"
|
||||
});
|
||||
|
||||
@@ -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:' '},
|
||||
{tag:'td', children:[
|
||||
{tag:'div', id:this.getId('backActionButton')}
|
||||
]},
|
||||
{tag:'td', html:' '},
|
||||
{tag:'td', children:[
|
||||
{tag:'div', id:this.getId('nextActionButton')}
|
||||
]},
|
||||
{tag:'td', html:' '}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]});
|
||||
|
||||
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"
|
||||
});
|
||||
|
||||
332
frontend/beta/js/Clipperz/PM/Components/Import/MainComponent.js
Normal file
332
frontend/beta/js/Clipperz/PM/Components/Import/MainComponent.js
Normal 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:' '},
|
||||
{tag:'td', children:[
|
||||
{tag:'div', id:this.getId('backActionButton')}
|
||||
]},
|
||||
{tag:'td', html:' '},
|
||||
{tag:'td', children:[
|
||||
{tag:'div', id:this.getId('nextActionButton')}
|
||||
]},
|
||||
{tag:'td', html:' '}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]},
|
||||
{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"
|
||||
});
|
||||
|
||||
@@ -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:' '},
|
||||
{tag:'td', children:[
|
||||
{tag:'div', id:this.getId('backActionButton')}
|
||||
]},
|
||||
{tag:'td', html:' '},
|
||||
{tag:'td', children:[
|
||||
{tag:'div', id:this.getId('nextActionButton')}
|
||||
]},
|
||||
{tag:'td', html:' '}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]});
|
||||
|
||||
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"
|
||||
});
|
||||
|
||||
@@ -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:' '},
|
||||
{tag:'td', children:[
|
||||
{tag:'div', id:this.getId('backActionButton')}
|
||||
]},
|
||||
{tag:'td', html:' '},
|
||||
{tag:'td', children:[
|
||||
{tag:'div', id:this.getId('nextActionButton')}
|
||||
]},
|
||||
{tag:'td', html:' '}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]});
|
||||
|
||||
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"
|
||||
});
|
||||
|
||||
224
frontend/beta/js/Clipperz/PM/Components/MessageBox.js
Normal file
224
frontend/beta/js/Clipperz/PM/Components/MessageBox.js
Normal 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;
|
||||
};
|
||||
|
||||
490
frontend/beta/js/Clipperz/PM/Components/OTP/MainComponent.js
Normal file
490
frontend/beta/js/Clipperz/PM/Components/OTP/MainComponent.js
Normal 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"
|
||||
});
|
||||
|
||||
784
frontend/beta/js/Clipperz/PM/Components/Panels/AccountPanel.js
Normal file
784
frontend/beta/js/Clipperz/PM/Components/Panels/AccountPanel.js
Normal 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:" "},
|
||||
{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"
|
||||
|
||||
});
|
||||
|
||||
96
frontend/beta/js/Clipperz/PM/Components/Panels/BasePanel.js
Normal file
96
frontend/beta/js/Clipperz/PM/Components/Panels/BasePanel.js
Normal 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"
|
||||
|
||||
});
|
||||
105
frontend/beta/js/Clipperz/PM/Components/Panels/ContactsPanel.js
Normal file
105
frontend/beta/js/Clipperz/PM/Components/Panels/ContactsPanel.js
Normal 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"
|
||||
|
||||
});
|
||||
|
||||
486
frontend/beta/js/Clipperz/PM/Components/Panels/DataPanel.js
Normal file
486
frontend/beta/js/Clipperz/PM/Components/Panels/DataPanel.js
Normal file
File diff suppressed because one or more lines are too long
1114
frontend/beta/js/Clipperz/PM/Components/Panels/LoginPanel.js
Normal file
1114
frontend/beta/js/Clipperz/PM/Components/Panels/LoginPanel.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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"
|
||||
|
||||
});
|
||||
|
||||
906
frontend/beta/js/Clipperz/PM/Components/Panels/MainPanel.js
Normal file
906
frontend/beta/js/Clipperz/PM/Components/Panels/MainPanel.js
Normal 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:' '},
|
||||
{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:' '},
|
||||
{tag:'td', id:'cardBoxLowerRightTD', html:' '}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]},
|
||||
{tag:'td', width:'15', html:" "}
|
||||
]}
|
||||
]}
|
||||
]});
|
||||
|
||||
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:" "}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
);
|
||||
|
||||
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"
|
||||
|
||||
});
|
||||
305
frontend/beta/js/Clipperz/PM/Components/Panels/ToolsPanel.js
Normal file
305
frontend/beta/js/Clipperz/PM/Components/Panels/ToolsPanel.js
Normal 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"
|
||||
|
||||
});
|
||||
|
||||
@@ -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:" "}, 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__'
|
||||
});
|
||||
285
frontend/beta/js/Clipperz/PM/Components/PasswordGenerator.js
Normal file
285
frontend/beta/js/Clipperz/PM/Components/PasswordGenerator.js
Normal 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__'
|
||||
});
|
||||
28
frontend/beta/js/Clipperz/PM/Components/Printing/Footer.js
Normal file
28
frontend/beta/js/Clipperz/PM/Components/Printing/Footer.js
Normal 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/>.
|
||||
|
||||
*/
|
||||
|
||||
28
frontend/beta/js/Clipperz/PM/Components/Printing/Header.js
Normal file
28
frontend/beta/js/Clipperz/PM/Components/Printing/Header.js
Normal 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/>.
|
||||
|
||||
*/
|
||||
|
||||
95
frontend/beta/js/Clipperz/PM/Components/Printing/Record.js
Normal file
95
frontend/beta/js/Clipperz/PM/Components/Printing/Record.js
Normal 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"
|
||||
});
|
||||
@@ -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"
|
||||
});
|
||||
|
||||
@@ -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"
|
||||
});
|
||||
|
||||
@@ -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:' '},
|
||||
{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:' '},
|
||||
{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"
|
||||
});
|
||||
|
||||
@@ -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"
|
||||
});
|
||||
|
||||
@@ -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:' ', 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"
|
||||
});
|
||||
|
||||
@@ -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"
|
||||
});
|
||||
|
||||
@@ -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"
|
||||
});
|
||||
|
||||
@@ -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"
|
||||
});
|
||||
|
||||
@@ -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"
|
||||
});
|
||||
|
||||
@@ -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"
|
||||
});
|
||||
|
||||
@@ -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"
|
||||
});
|
||||
|
||||
@@ -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"
|
||||
});
|
||||
|
||||
@@ -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:' '}
|
||||
]}
|
||||
]}
|
||||
]}
|
||||
]})
|
||||
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"
|
||||
});
|
||||
|
||||
@@ -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:' '},
|
||||
{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"
|
||||
});
|
||||
|
||||
@@ -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:' '},
|
||||
{tag:'td', width:'25%', htmlString:Clipperz.PM.Strings['recordDetailLabelFieldColumnLabel']},
|
||||
{tag:'td', width:'3', html:' '},
|
||||
{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:" "},
|
||||
{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:' '},
|
||||
{tag:'td', width:'25%', htmlString:Clipperz.PM.Strings['recordDetailLabelFieldColumnLabel']},
|
||||
{tag:'td', width:'3', html:' '},
|
||||
{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:' '},
|
||||
{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:' '}
|
||||
]}
|
||||
);
|
||||
}
|
||||
|
||||
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:' '},
|
||||
{tag:'div', cls:'content', children:contentChildren},
|
||||
{tag:'div', cls:'footer', html:' '}
|
||||
]}]}];
|
||||
|
||||
// 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"
|
||||
});
|
||||
|
||||
@@ -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"
|
||||
});
|
||||
|
||||
@@ -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:' '});
|
||||
// Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'td', colspan:"3", html:' ', children:[
|
||||
// {tag:'div', /*style:'border: 1px solid green;',*/ id:this.getId('title')}
|
||||
// ]});
|
||||
// Clipperz.YUI.DomHelper.append(this.element().dom, {tag:'td', html:' '});
|
||||
//
|
||||
// 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"
|
||||
});
|
||||
|
||||
@@ -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"
|
||||
});
|
||||
310
frontend/beta/js/Clipperz/PM/Components/TextFormField.js
Normal file
310
frontend/beta/js/Clipperz/PM/Components/TextFormField.js
Normal 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 = "  ";
|
||||
} else {
|
||||
v = v.replace(/[<> ]/g, ' ');
|
||||
if (this.multiline) {
|
||||
v = v.replace(/\n/g, '<br /> ');
|
||||
}
|
||||
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__'
|
||||
});
|
||||
584
frontend/beta/js/Clipperz/PM/Connection.js
Normal file
584
frontend/beta/js/Clipperz/PM/Connection.js
Normal 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")
|
||||
};
|
||||
503
frontend/beta/js/Clipperz/PM/Crypto.js
Normal file
503
frontend/beta/js/Clipperz/PM/Crypto.js
Normal 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]
|
||||
});
|
||||
|
||||
//*****************************************************************************
|
||||
536
frontend/beta/js/Clipperz/PM/DataModel/DirectLogin.js
Normal file
536
frontend/beta/js/Clipperz/PM/DataModel/DirectLogin.js
Normal 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"
|
||||
|
||||
});
|
||||
|
||||
113
frontend/beta/js/Clipperz/PM/DataModel/DirectLoginBinding.js
Normal file
113
frontend/beta/js/Clipperz/PM/DataModel/DirectLoginBinding.js
Normal 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"
|
||||
|
||||
});
|
||||
|
||||
229
frontend/beta/js/Clipperz/PM/DataModel/DirectLoginInput.js
Normal file
229
frontend/beta/js/Clipperz/PM/DataModel/DirectLoginInput.js
Normal 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"
|
||||
|
||||
});
|
||||
|
||||
192
frontend/beta/js/Clipperz/PM/DataModel/DirectLoginReference.js
Normal file
192
frontend/beta/js/Clipperz/PM/DataModel/DirectLoginReference.js
Normal 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"
|
||||
|
||||
});
|
||||
|
||||
751
frontend/beta/js/Clipperz/PM/DataModel/Header.js
Normal file
751
frontend/beta/js/Clipperz/PM/DataModel/Header.js
Normal 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"
|
||||
|
||||
});
|
||||
|
||||
333
frontend/beta/js/Clipperz/PM/DataModel/OneTimePassword.js
Normal file
333
frontend/beta/js/Clipperz/PM/DataModel/OneTimePassword.js
Normal 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;
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
280
frontend/beta/js/Clipperz/PM/DataModel/OneTimePasswordManager.js
Normal file
280
frontend/beta/js/Clipperz/PM/DataModel/OneTimePasswordManager.js
Normal 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"
|
||||
});
|
||||
|
||||
759
frontend/beta/js/Clipperz/PM/DataModel/Record.js
Normal file
759
frontend/beta/js/Clipperz/PM/DataModel/Record.js
Normal 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"
|
||||
});
|
||||
|
||||
|
||||
220
frontend/beta/js/Clipperz/PM/DataModel/RecordField.js
Normal file
220
frontend/beta/js/Clipperz/PM/DataModel/RecordField.js
Normal 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'
|
||||
};
|
||||
*/
|
||||
535
frontend/beta/js/Clipperz/PM/DataModel/RecordVersion.js
Normal file
535
frontend/beta/js/Clipperz/PM/DataModel/RecordVersion.js
Normal 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"
|
||||
|
||||
});
|
||||
|
||||
133
frontend/beta/js/Clipperz/PM/DataModel/Statistics.js
Normal file
133
frontend/beta/js/Clipperz/PM/DataModel/Statistics.js
Normal 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"
|
||||
|
||||
});
|
||||
|
||||
904
frontend/beta/js/Clipperz/PM/DataModel/User.js
Normal file
904
frontend/beta/js/Clipperz/PM/DataModel/User.js
Normal 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")
|
||||
};
|
||||
|
||||
197
frontend/beta/js/Clipperz/PM/DataModel/UserPreferences.js
Normal file
197
frontend/beta/js/Clipperz/PM/DataModel/UserPreferences.js
Normal 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"
|
||||
});
|
||||
|
||||
193
frontend/beta/js/Clipperz/PM/Date.js
Normal file
193
frontend/beta/js/Clipperz/PM/Date.js
Normal 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"
|
||||
|
||||
});
|
||||
|
||||
588
frontend/beta/js/Clipperz/PM/Main.js
Normal file
588
frontend/beta/js/Clipperz/PM/Main.js
Normal 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);
|
||||
173
frontend/beta/js/Clipperz/PM/Proxy.js
Normal file
173
frontend/beta/js/Clipperz/PM/Proxy.js
Normal 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"
|
||||
|
||||
});
|
||||
100
frontend/beta/js/Clipperz/PM/Proxy/Proxy.JSON.js
Executable file
100
frontend/beta/js/Clipperz/PM/Proxy/Proxy.JSON.js
Executable 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"
|
||||
|
||||
});
|
||||
804
frontend/beta/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js
Normal file
804
frontend/beta/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js
Normal 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")
|
||||
};
|
||||
73
frontend/beta/js/Clipperz/PM/Proxy/Proxy.Offline.js
Normal file
73
frontend/beta/js/Clipperz/PM/Proxy/Proxy.Offline.js
Normal 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"
|
||||
|
||||
});
|
||||
|
||||
259
frontend/beta/js/Clipperz/PM/Proxy/Proxy.PHP.js
Executable file
259
frontend/beta/js/Clipperz/PM/Proxy/Proxy.PHP.js
Executable 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");
|
||||
94
frontend/beta/js/Clipperz/PM/Proxy/Proxy.Test.js
Normal file
94
frontend/beta/js/Clipperz/PM/Proxy/Proxy.Test.js
Normal 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"
|
||||
|
||||
});
|
||||
|
||||
231
frontend/beta/js/Clipperz/PM/Strings.js
Normal file
231
frontend/beta/js/Clipperz/PM/Strings.js
Normal 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);
|
||||
@@ -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
Reference in New Issue
Block a user