mirror of
https://codeberg.org/scip/digiproof.git
synced 2026-02-04 11:10:58 +01:00
grmpf, forgot to commit the actual changes...
This commit is contained in:
File diff suppressed because one or more lines are too long
24
index.html
24
index.html
@@ -22,7 +22,7 @@
|
|||||||
<li>{{#linkTo 'assets'}}{{loc _assets}}{{/linkTo}}</li>
|
<li>{{#linkTo 'assets'}}{{loc _assets}}{{/linkTo}}</li>
|
||||||
<li>{{#linkTo 'testament'}}{{loc _testament}}{{/linkTo}}</li>
|
<li>{{#linkTo 'testament'}}{{loc _testament}}{{/linkTo}}</li>
|
||||||
<li>{{#linkTo 'data'}}{{loc _data}}{{/linkTo}}</li>
|
<li>{{#linkTo 'data'}}{{loc _data}}{{/linkTo}}</li>
|
||||||
<li>{{#linkTo 'about'}}about{{/linkTo}}</li>
|
<li>{{#linkTo 'about'}}{{loc _aboutmenu}}{{/linkTo}}</li>
|
||||||
</ul>
|
</ul>
|
||||||
<span class="pull-right">digiproof version {{VERSION}}</span>
|
<span class="pull-right">digiproof version {{VERSION}}</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -35,9 +35,7 @@
|
|||||||
<div class="row-fluid">
|
<div class="row-fluid">
|
||||||
<div class="span4">
|
<div class="span4">
|
||||||
<div class="well">
|
<div class="well">
|
||||||
{{controller}}
|
{{loc _about}}
|
||||||
<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>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -709,21 +707,15 @@
|
|||||||
<h4>{{loc _export}}</h4>
|
<h4>{{loc _export}}</h4>
|
||||||
{{#if self.password}}
|
{{#if self.password}}
|
||||||
<p>{{loc _exporthelp}}</p>
|
<p>{{loc _exporthelp}}</p>
|
||||||
<div id="rawjson" style="display: none">
|
<div id="rawjson" style="display: none"><pre>
|
||||||
{
|
{
|
||||||
"successors": [
|
"successors": [{{#each successor in successors}}
|
||||||
{{#each successor in successors}}
|
{{successor.toJson}},{{/each}}],
|
||||||
{{successor.toJson}},
|
"assets": [{{#each asset in assets}}
|
||||||
{{/each}}
|
{{asset.toJson}},{{/each}}],
|
||||||
],
|
|
||||||
"assets": [
|
|
||||||
{{#each asset in assets}}
|
|
||||||
{{asset.toJson}},
|
|
||||||
{{/each}}
|
|
||||||
],
|
|
||||||
"self": {{self.toJson}}
|
"self": {{self.toJson}}
|
||||||
}
|
}
|
||||||
</div>
|
</pre></div>
|
||||||
<div id="rawdata" style="display: none"></div>
|
<div id="rawdata" style="display: none"></div>
|
||||||
<div id="rawp" style="display: none">{{self.password}}</div>
|
<div id="rawp" style="display: none">{{self.password}}</div>
|
||||||
<button class="btn btn-primary btn-default" {{action download}}>{{loc _download}}</button>
|
<button class="btn btn-primary btn-default" {{action download}}>{{loc _download}}</button>
|
||||||
|
|||||||
@@ -17,12 +17,7 @@ function hex2a(hex) {
|
|||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
function decryptimportOLD(pass, data) {
|
// decrypt data
|
||||||
var enpass = CryptoJS.SHA512(pass).toString(CryptoJS.enc.Base64);
|
|
||||||
var clear = CryptoJS.AES.decrypt(data, enpass);
|
|
||||||
return unescape(hex2a(clear.toString()));
|
|
||||||
}
|
|
||||||
|
|
||||||
function decryptimport(hash, data) {
|
function decryptimport(hash, data) {
|
||||||
var clear = CryptoJS.AES.decrypt(data, hash);
|
var clear = CryptoJS.AES.decrypt(data, hash);
|
||||||
return unescape(hex2a(clear.toString()));
|
return unescape(hex2a(clear.toString()));
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
|
|
||||||
App.AboutController = Ember.Controller.extend({
|
App.AboutController = Ember.Controller.extend({
|
||||||
popup: { login: { title: "titel", help: "hilfe" } }
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -57,6 +57,9 @@ App.DataExportController = Ember.ArrayController.extend({
|
|||||||
hash = CryptoJS.SHA512(hash);
|
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));
|
var cr = CryptoJS.AES.encrypt(escape(raw), hash.toString(CryptoJS.enc.Base64));
|
||||||
|
|
||||||
$('#rawdata').text(cr);
|
$('#rawdata').text(cr);
|
||||||
@@ -66,10 +69,9 @@ App.DataExportController = Ember.ArrayController.extend({
|
|||||||
var mac = CryptoJS.HmacSHA512(crypted, hash.toString(CryptoJS.enc.Base64));
|
var mac = CryptoJS.HmacSHA512(crypted, hash.toString(CryptoJS.enc.Base64));
|
||||||
var signedcrypted = mac.toString(CryptoJS.enc.Base64).substring(0,86) + crypted;
|
var signedcrypted = mac.toString(CryptoJS.enc.Base64).substring(0,86) + crypted;
|
||||||
|
|
||||||
console.log("raw: %s", raw);
|
// console.log("cr: %s", crypted);
|
||||||
console.log("cr: %s", crypted);
|
// console.log("pass: <%s>, hash: <%s>", pass, hash.toString(CryptoJS.enc.Base64));
|
||||||
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("mac: %s", mac.toString(CryptoJS.enc.Base64).substring(0,86));
|
|
||||||
|
|
||||||
var block = '';
|
var block = '';
|
||||||
var c = 1;
|
var c = 1;
|
||||||
@@ -106,7 +108,14 @@ App.UploadFileView = Ember.TextField.extend({
|
|||||||
var reader = new FileReader();
|
var reader = new FileReader();
|
||||||
var that = this;
|
var that = this;
|
||||||
reader.onload = function(e) {
|
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]);
|
UploadedImport = decode64(fileToUpload.split(',')[1]);
|
||||||
}
|
}
|
||||||
reader.readAsDataURL(input.files[0]);
|
reader.readAsDataURL(input.files[0]);
|
||||||
@@ -128,6 +137,7 @@ App.DataImportController = Ember.ObjectController.extend({
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
var raw = '';
|
var raw = '';
|
||||||
|
//console.log("up: %o", UploadedImport);
|
||||||
if(UploadedImport) {
|
if(UploadedImport) {
|
||||||
//console.log("using upload");
|
//console.log("using upload");
|
||||||
raw = UploadedImport;
|
raw = UploadedImport;
|
||||||
@@ -159,7 +169,7 @@ App.DataImportController = Ember.ObjectController.extend({
|
|||||||
var b64mac = b64.substring(0,86) + '==';
|
var b64mac = b64.substring(0,86) + '==';
|
||||||
var b64cr = b64.substring(86);
|
var b64cr = b64.substring(86);
|
||||||
|
|
||||||
console.log("b64mac: %s", b64mac);
|
// console.log("b64mac: %s", b64mac);
|
||||||
|
|
||||||
// create the password hash
|
// create the password hash
|
||||||
var hash = CryptoJS.SHA512(pass);
|
var hash = CryptoJS.SHA512(pass);
|
||||||
@@ -169,155 +179,31 @@ App.DataImportController = Ember.ObjectController.extend({
|
|||||||
|
|
||||||
// verify the mac
|
// verify the mac
|
||||||
var mac = CryptoJS.HmacSHA512(b64cr, hash.toString(CryptoJS.enc.Base64));
|
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) {
|
if(mac.toString(CryptoJS.enc.Base64) !== b64mac) {
|
||||||
throw 'Authentication MAC verification failed, rejecting manipulated encrypted data';
|
throw 'Authentication MAC verification failed, rejecting manipulated encrypted data';
|
||||||
}
|
}
|
||||||
|
|
||||||
// now if we're her, decrypt the data
|
// now if we're her, decrypt the data
|
||||||
var json = decryptimport(hash.toString(CryptoJS.enc.Base64), b64cr);
|
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("pass: <%s>, hash: <%s>, hash: %o", pass, hash.toString(CryptoJS.enc.Base64), hash);
|
||||||
console.log("json: %s", json);
|
// console.log("json: %s", json);
|
||||||
|
|
||||||
// make it an obj
|
// make it an obj
|
||||||
var importobj = JSON.parse(json); // FIXME: SyntaxError: Unexpected token ], liegt am Komma nach dem letzten item
|
var importobj = JSON.parse(json);
|
||||||
console.log("imported json: %o", importobj);
|
// 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'));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw 'No import data provided';
|
|
||||||
}
|
|
||||||
//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) {
|
if(json) {
|
||||||
//console.log("evaluating: %s", json);
|
// suck it in
|
||||||
var obj = JSON.parse(json);
|
ImportJSON(importobj, pass);
|
||||||
//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'));
|
this.set('clear', translate('_importdone'));
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
throw 'decrypted variable $json doesnt contain anything, weird';
|
||||||
|
}
|
||||||
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
console.log("decryption exception: %o", e);
|
// console.log("decryption exception: %o", e);
|
||||||
this.set('clear', translate('_error_decrypt') + " (" + e + ")");
|
this.set('clear', translate('_error_decrypt') + " (" + e + ")");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -335,3 +221,77 @@ App.DataImportController = Ember.ObjectController.extend({
|
|||||||
this.set('password', '');
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,16 +40,3 @@ Ember.Handlebars.registerBoundHelper('date', function(date) {
|
|||||||
return moment(date).format('LL');
|
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";
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|||||||
10
js/locale.js
10
js/locale.js
@@ -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 "
|
"_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.",
|
+"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 "
|
"_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": {
|
"de": {
|
||||||
@@ -227,7 +230,10 @@ window.locale = {
|
|||||||
+"regulärer Erbe (bestimmt durch gesetzliche Erbfolge oder anderweitig durch Testament) diese Anweisungen erhalten. "
|
+"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.",
|
+"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 "
|
"_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."
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user