grmpf, forgot to commit the actual changes...

This commit is contained in:
git@daemon.de
2013-09-12 23:32:42 +02:00
parent 10d38a0000
commit b8df33061b
7 changed files with 158 additions and 220 deletions

File diff suppressed because one or more lines are too long

View File

@@ -22,7 +22,7 @@
<li>{{#linkTo 'assets'}}{{loc _assets}}{{/linkTo}}</li>
<li>{{#linkTo 'testament'}}{{loc _testament}}{{/linkTo}}</li>
<li>{{#linkTo 'data'}}{{loc _data}}{{/linkTo}}</li>
<li>{{#linkTo 'about'}}about{{/linkTo}}</li>
<li>{{#linkTo 'about'}}{{loc _aboutmenu}}{{/linkTo}}</li>
</ul>
<span class="pull-right">digiproof version {{VERSION}}</span>
</div>
@@ -35,10 +35,8 @@
<div class="row-fluid">
<div class="span4">
<div class="well">
{{controller}}
<span class="label label-info popup-marker" data-content="{{popup.login.title}}" data-original-title="{{popup.login.help}}">?</span>
<span class="badge badge-success popup-marker" data-content="hilfetext III" data-original-title="Kurzhilfe III">?</span>
</div>
{{loc _about}}
</div>
</div>
</div>
</script>
@@ -709,21 +707,15 @@
<h4>{{loc _export}}</h4>
{{#if self.password}}
<p>{{loc _exporthelp}}</p>
<div id="rawjson" style="display: none">
<div id="rawjson" style="display: none"><pre>
{
"successors": [
{{#each successor in successors}}
{{successor.toJson}},
{{/each}}
],
"assets": [
{{#each asset in assets}}
{{asset.toJson}},
{{/each}}
],
"successors": [{{#each successor in successors}}
{{successor.toJson}},{{/each}}],
"assets": [{{#each asset in assets}}
{{asset.toJson}},{{/each}}],
"self": {{self.toJson}}
}
</div>
</pre></div>
<div id="rawdata" style="display: none"></div>
<div id="rawp" style="display: none">{{self.password}}</div>
<button class="btn btn-primary btn-default" {{action download}}>{{loc _download}}</button>

View File

@@ -17,12 +17,7 @@ function hex2a(hex) {
return str;
}
function decryptimportOLD(pass, data) {
var enpass = CryptoJS.SHA512(pass).toString(CryptoJS.enc.Base64);
var clear = CryptoJS.AES.decrypt(data, enpass);
return unescape(hex2a(clear.toString()));
}
// decrypt data
function decryptimport(hash, data) {
var clear = CryptoJS.AES.decrypt(data, hash);
return unescape(hex2a(clear.toString()));

View File

@@ -1,6 +1,6 @@
App.AboutController = Ember.Controller.extend({
popup: { login: { title: "titel", help: "hilfe" } }
});

View File

@@ -57,6 +57,9 @@ App.DataExportController = Ember.ArrayController.extend({
hash = CryptoJS.SHA512(hash);
}
// fix comma syntax
raw = raw.replace(/,\],/g, '],');
// console.log("raw: %s", raw);
var cr = CryptoJS.AES.encrypt(escape(raw), hash.toString(CryptoJS.enc.Base64));
$('#rawdata').text(cr);
@@ -66,10 +69,9 @@ App.DataExportController = Ember.ArrayController.extend({
var mac = CryptoJS.HmacSHA512(crypted, hash.toString(CryptoJS.enc.Base64));
var signedcrypted = mac.toString(CryptoJS.enc.Base64).substring(0,86) + crypted;
console.log("raw: %s", raw);
console.log("cr: %s", crypted);
console.log("pass: <%s>, hash: <%s>", pass, hash.toString(CryptoJS.enc.Base64));
console.log("mac: %s", mac.toString(CryptoJS.enc.Base64).substring(0,86));
// console.log("cr: %s", crypted);
// console.log("pass: <%s>, hash: <%s>", pass, hash.toString(CryptoJS.enc.Base64));
// console.log("mac: %s", mac.toString(CryptoJS.enc.Base64).substring(0,86));
var block = '';
var c = 1;
@@ -106,7 +108,14 @@ App.UploadFileView = Ember.TextField.extend({
var reader = new FileReader();
var that = this;
reader.onload = function(e) {
var fileToUpload = e.srcElement.result;
var targ;
if (!e) var e = window.event;
if (e.target) targ = e.target;
else if (e.srcElement) targ = e.srcElement;
if (targ.nodeType == 3) // defeat Safari bug
targ = targ.parentNode;
var fileToUpload = targ.result;
UploadedImport = decode64(fileToUpload.split(',')[1]);
}
reader.readAsDataURL(input.files[0]);
@@ -128,6 +137,7 @@ App.DataImportController = Ember.ObjectController.extend({
try {
var raw = '';
//console.log("up: %o", UploadedImport);
if(UploadedImport) {
//console.log("using upload");
raw = UploadedImport;
@@ -159,7 +169,7 @@ App.DataImportController = Ember.ObjectController.extend({
var b64mac = b64.substring(0,86) + '==';
var b64cr = b64.substring(86);
console.log("b64mac: %s", b64mac);
// console.log("b64mac: %s", b64mac);
// create the password hash
var hash = CryptoJS.SHA512(pass);
@@ -169,155 +179,31 @@ App.DataImportController = Ember.ObjectController.extend({
// verify the mac
var mac = CryptoJS.HmacSHA512(b64cr, hash.toString(CryptoJS.enc.Base64));
console.log("mac: %s", mac.toString(CryptoJS.enc.Base64));
// console.log("mac: %s", mac.toString(CryptoJS.enc.Base64));
if(mac.toString(CryptoJS.enc.Base64) !== b64mac) {
throw 'Authentication MAC verification failed, rejecting manipulated encrypted data';
}
// now if we're her, decrypt the data
var json = decryptimport(hash.toString(CryptoJS.enc.Base64), b64cr);
console.log("pass: <%s>, hash: <%s>, hash: %o", pass, hash.toString(CryptoJS.enc.Base64), hash);
console.log("json: %s", json);
// console.log("pass: <%s>, hash: <%s>, hash: %o", pass, hash.toString(CryptoJS.enc.Base64), hash);
// console.log("json: %s", json);
// make it an obj
var importobj = JSON.parse(json); // FIXME: SyntaxError: Unexpected token ], liegt am Komma nach dem letzten item
console.log("imported json: %o", importobj);
}
catch (e) {
console.log("decryption exception: %o", e);
this.set('clear', translate('_error_decrypt') + " (" + e + ")");
}
}
else {
// no password given
this.set('isEditing', true);
this.set('errors', validated);
this.set('clear', translate('_error_decrypt'));
}
},
var importobj = JSON.parse(json);
// console.log("imported json: %o", importobj);
doneEditingXXX: function() {
var validated = this.get('model').validate();
// decrypt and reload models
if(validated.valid) {
this.set('isEditing', false);
pass = this.get('password');
try {
var entries = '';
if(UploadedImport) {
//console.log("using upload");
entries = UploadedImport.match(/[^\r\n]+/g);
UploadedImport = null;
}
else if (this.get('importdata')) {
//console.log("using input");
entries = this.get('importdata').match(/[^\r\n]+/g);
if(json) {
// suck it in
ImportJSON(importobj, pass);
this.set('clear', translate('_importdone'));
}
else {
throw 'No import data provided';
throw 'decrypted variable $json doesnt contain anything, weird';
}
//console.log("got %d entries: %o", entries.length, entries);
var json = '';
for (var i = 0; i < entries.length; i++) {
var importline = entries[i].split(',');
//console.log("splitted: %o", importline);
if(importline[0] === 'asset') {
//console.log("import asset");
json = decryptimport(pass, importline[1]);
if(json) {
//console.log("evaluating: %s", json);
var obj = JSON.parse(json);
//console.log("code: %o", obj);
var exists = App.Asset.all().some(function(asset) {
return asset.get('id') === obj.id;
});
if(exists) {
/* update
FIXME: Updating doesn't work yet for some unknown reason
App.Asset.find(obj.id).then(function(asset) {
asset.set("name", obj.name);
asset.set("uri", obj.uri);
asset.set("login", obj.login);
asset.set("password", obj.password);
asset.set("mail", obj.mail);
asset.set("successor", App.Successor.find(obj.successor));
asset.set("order", App.Order.find(obj.order));
asset.set("notes", obj.notes);
});
*/
}
else {
// create
var asset = App.Asset.createRecord({
id: obj.id,
name: obj.name,
uri: obj.uri,
login: obj.login,
password: obj.password,
mail: obj.mail,
successor: App.Successor.find(obj.successor),
order: App.Order.find(obj.order),
notes: obj.notes
});
}
}
else {
throw 'decrypted variable $json doesnt contain anything, weird';
}
}
else if (importline[0] === 'successor') {
console.log("import successor");
json = decryptimport(pass, importline[1]);
console.log("evaluating: %s", json);
if(json) {
var obj = JSON.parse(json);
if(obj.id !== "0") {
var exists = App.Successor.all().some(function(successor) {
return successor.get('id') === obj.id;
});
if(! exists) {
var successor = App.Successor.createRecord(obj);
}
}
else {
//console.log("ignoring id 0");
}
}
else {
throw 'decrypted variable $json doesnt contain anything, weird';
}
}
else if (importline[0] === 'self') {
console.log("import self");
json = decryptimport(pass, importline[1]);
console.log("evaluating: %s", json);
if(json) {
var obj = JSON.parse(json);
var self = App.Self.find(0).then(function(self) {
//console.log("didLoad on self fired, putting %o with pass %s", obj, pass);
self.set('name', obj.name);
self.set('birth', obj.birth);
self.set('address', obj.address);
self.set('password', pass);
});
}
else {
throw 'decrypted variable $json doesnt contain anything, weird';
}
}
/*
else {
console.log("import unknown");
}
*/
}
App.store.commit();
this.set('clear', translate('_importdone'));
}
catch (e) {
console.log("decryption exception: %o", e);
catch (e) {
// console.log("decryption exception: %o", e);
this.set('clear', translate('_error_decrypt') + " (" + e + ")");
}
}
@@ -335,3 +221,77 @@ App.DataImportController = Ember.ObjectController.extend({
this.set('password', '');
}
});
function ImportJSON(json, pass) {
// start with self
var self = App.Self.find(0).then(function(self) {
self.set('name', json.self.name);
self.set('birth', json.self.birth);
self.set('address', json.self.address);
self.set('password', pass);
});
// now the successors
$.each(json.successors, function(index, obj){
if(obj.id !== "0") {
var exists = App.Successor.all().some(function(successor) {
return successor.get('id') === obj.id;
});
if(exists) {
// Update
App.Successor.find(obj.id).then(function(successor) {
//console.log("updating successor %o", obj);
successor.set("name", obj.name);
successor.set("address", obj.address);
successor.set("birth", obj.birth);
successor.set("name2", obj.name2);
successor.set("address2", obj.address2);
successor.set("birth2", obj.birth2);
});
}
else {
var successor = App.Successor.createRecord(obj);
}
}
});
// and the assets
$.each(json.assets, function(index, obj){
var exists = App.Asset.all().some(function(asset) {
return asset.get('id') === obj.id;
});
if(exists) {
/// Update
App.Asset.find(obj.id).then(function(asset) {
//console.log("updating asset %o", obj);
asset.set("name", obj.name);
asset.set("uri", obj.uri);
asset.set("login", obj.login);
asset.set("password", obj.password);
asset.set("mail", obj.mail);
asset.set("successor", App.Successor.find(obj.successor));
asset.set("order", App.Order.find(obj.order));
asset.set("notes", obj.notes);
App.store.commit(); // we do update it here to avoid rootState.loaded.updated.uncommitted
});
}
else {
// create
var asset = App.Asset.createRecord({
id: obj.id,
name: obj.name,
uri: obj.uri,
login: obj.login,
password: obj.password,
mail: obj.mail,
successor: App.Successor.find(obj.successor),
order: App.Order.find(obj.order),
notes: obj.notes
});
}
});
App.store.commit();
}

View File

@@ -40,16 +40,3 @@ Ember.Handlebars.registerBoundHelper('date', function(date) {
return moment(date).format('LL');
});
Ember.Handlebars.registerBoundHelper('encrypt', function(cleartext) {
pass = App.Self.find(0).get('password');
if(pass) {
var enpass = CryptoJS.SHA512(pass).toString(CryptoJS.enc.Base64);
//console.log("pass: %s, enpass: %s", pass, enpass);
var cr = CryptoJS.AES.encrypt(escape(cleartext), enpass);
return cr;
}
else {
return "Failed to encrypt, not password set";
}
});

View File

@@ -110,7 +110,10 @@ window.locale = {
"_pop_successor": "Select a legal successor. You may use the default in which case the person selected by succesion or "
+"your general testament would receive this orders. Or enter a legal successor and select it here.",
"_pop_order": "Select how your successor has to manage the network asset. You may add complemental informations "
+"into the notes field below."
+"into the notes field below.",
"_aboutmenu": "About Digiproof",
"_about": "This is DigiProof, a JavaScript App to create a digital testament by Thomas Linden. Copyright (c) 2013. "
+"Licensed under the terms of the General Public License Version 2."
},
"de": {
@@ -227,7 +230,10 @@ window.locale = {
+"regulärer Erbe (bestimmt durch gesetzliche Erbfolge oder anderweitig durch Testament) diese Anweisungen erhalten. "
+"Oder Sie geben einen speziellen Rechtsnachfolger ein und wählen diesen hier aus.",
"_pop_order": "Bestimmen Sie, wie Ihr Rechtsnachfolger mit dem Netzwerkaccount umgehen soll. Sie können im Notizfeld "
+"dazugehörige Ergänzungen hinzufügen."
+"dazugehörige Ergänzungen hinzufügen.",
"_aboutmenu": "Über Digiproof",
"_about": "Dies ist DigiProof, eine Javascript App zum Erstellen eines digitalen Testaments von Thomas Linden. Copyright (c) 2013. "
+"Veröffentlicht unter der General Public License Version 2."
}
};