diff --git a/digiproof.html b/digiproof.html index 9f361d5..c3f7ae5 100644 --- a/digiproof.html +++ b/digiproof.html @@ -43,7 +43,7 @@ html,body{margin:20px}a{cursor:pointer}.navbar .nav>li>a.active{color:black;font
  • {{#linkTo 'assets'}}{{loc _assets}}{{/linkTo}}
  • {{#linkTo 'testament'}}{{loc _testament}}{{/linkTo}}
  • {{#linkTo 'data'}}{{loc _data}}{{/linkTo}}
  • -
  • {{#linkTo 'about'}}about{{/linkTo}}
  • +
  • {{#linkTo 'about'}}{{loc _aboutmenu}}{{/linkTo}}
  • digiproof version {{VERSION}} @@ -54,10 +54,8 @@ html,body{margin:20px}a{cursor:pointer}.navbar .nav>li>a.active{color:black;font
    - {{controller}} - ? - ? -
    + {{loc _about}} +
    @@ -690,22 +688,17 @@ html,body{margin:20px}a{cursor:pointer}.navbar .nav>li>a.active{color:black;font

    {{loc _export}}

    {{#if self.password}}

    {{loc _exporthelp}}

    - + {{else}} {{loc _nopasswd}}: {{#linkTo 'self'}}{{loc _self}}{{/linkTo}}. @@ -3055,6 +3048,9 @@ var CryptoJS=CryptoJS||function(u,p){var d={},l=d.lib={},s=function(){},t=l.Base /* js from js/libs/sha512.js */ var CryptoJS=CryptoJS||function(a,m){var r={},f=r.lib={},g=function(){},l=f.Base={extend:function(a){g.prototype=this;var b=new g;a&&b.mixIn(a);b.hasOwnProperty("init")||(b.init=function(){b.$super.init.apply(this,arguments)});b.init.prototype=b;b.$super=this;return b},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},p=f.WordArray=l.extend({init:function(a,b){a=this.words=a||[];this.sigBytes=b!=m?b:4*a.length},toString:function(a){return(a||q).stringify(this)},concat:function(a){var b=this.words,d=a.words,c=this.sigBytes;a=a.sigBytes;this.clamp();if(c%4)for(var j=0;j>>2]|=(d[j>>>2]>>>24-8*(j%4)&255)<<24-8*((c+j)%4);else if(65535>>2]=d[j>>>2];else b.push.apply(b,d);this.sigBytes+=a;return this},clamp:function(){var n=this.words,b=this.sigBytes;n[b>>>2]&=4294967295<<32-8*(b%4);n.length=a.ceil(b/4)},clone:function(){var a=l.clone.call(this);a.words=this.words.slice(0);return a},random:function(n){for(var b=[],d=0;d>>2]>>>24-8*(c%4)&255;d.push((j>>>4).toString(16));d.push((j&15).toString(16))}return d.join("")},parse:function(a){for(var b=a.length,d=[],c=0;c>>3]|=parseInt(a.substr(c,2),16)<<24-4*(c%8);return new p.init(d,b/2)}},G=y.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var d=[],c=0;c>>2]>>>24-8*(c%4)&255));return d.join("")},parse:function(a){for(var b=a.length,d=[],c=0;c>>2]|=(a.charCodeAt(c)&255)<<24-8*(c%4);return new p.init(d,b)}},fa=y.Utf8={stringify:function(a){try{return decodeURIComponent(escape(G.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return G.parse(unescape(encodeURIComponent(a)))}},h=f.BufferedBlockAlgorithm=l.extend({reset:function(){this._data=new p.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=fa.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(n){var b=this._data,d=b.words,c=b.sigBytes,j=this.blockSize,l=c/(4*j),l=n?a.ceil(l):a.max((l|0)-this._minBufferSize,0);n=l*j;c=a.min(4*n,c);if(n){for(var h=0;hq;q++)y[q]=a();f=f.SHA512=r.extend({_doReset:function(){this._hash=new l.init([new g.init(1779033703,4089235720),new g.init(3144134277,2227873595),new g.init(1013904242,4271175723),new g.init(2773480762,1595750129),new g.init(1359893119,2917565137),new g.init(2600822924,725511199),new g.init(528734635,4215389547),new g.init(1541459225,327033209)])},_doProcessBlock:function(a,f){for(var h=this._hash.words,g=h[0],n=h[1],b=h[2],d=h[3],c=h[4],j=h[5],l=h[6],h=h[7],q=g.high,m=g.low,r=n.high,N=n.low,Z=b.high,O=b.low,$=d.high,P=d.low,aa=c.high,Q=c.low,ba=j.high,R=j.low,ca=l.high,S=l.low,da=h.high,T=h.low,v=q,s=m,H=r,E=N,I=Z,F=O,W=$,J=P,w=aa,t=Q,U=ba,K=R,V=ca,L=S,X=da,M=T,x=0;80>x;x++){var B=y[x];if(16>x)var u=B.high=a[f+2*x]|0,e=B.low=a[f+2*x+1]|0;else{var u=y[x-15],e=u.high,z=u.low,u=(e>>>1|z<<31)^(e>>>8|z<<24)^e>>>7,z=(z>>>1|e<<31)^(z>>>8|e<<24)^(z>>>7|e<<25),D=y[x-2],e=D.high,k=D.low,D=(e>>>19|k<<13)^(e<<3|k>>>29)^e>>>6,k=(k>>>19|e<<13)^(k<<3|e>>>29)^(k>>>6|e<<26),e=y[x-7],Y=e.high,C=y[x-16],A=C.high,C=C.low,e=z+e.low,u=u+Y+(e>>>0>>0?1:0),e=e+k,u=u+D+(e>>>0>>0?1:0),e=e+C,u=u+A+(e>>>0>>0?1:0);B.high=u;B.low=e}var Y=w&U^~w&V,C=t&K^~t&L,B=v&H^v&I^H&I,ha=s&E^s&F^E&F,z=(v>>>28|s<<4)^(v<<30|s>>>2)^(v<<25|s>>>7),D=(s>>>28|v<<4)^(s<<30|v>>>2)^(s<<25|v>>>7),k=p[x],ia=k.high,ea=k.low,k=M+((t>>>14|w<<18)^(t>>>18|w<<14)^(t<<23|w>>>9)),A=X+((w>>>14|t<<18)^(w>>>18|t<<14)^(w<<23|t>>>9))+(k>>>0>>0?1:0),k=k+C,A=A+Y+(k>>>0>>0?1:0),k=k+ea,A=A+ia+(k>>>0>>0?1:0),k=k+e,A=A+u+(k>>>0>>0?1:0),e=D+ha,B=z+B+(e>>>0>>0?1:0),X=V,M=L,V=U,L=K,U=w,K=t,t=J+k|0,w=W+A+(t>>>0>>0?1:0)|0,W=I,J=F,I=H,F=E,H=v,E=s,s=k+e|0,v=A+B+(s>>>0>>0?1:0)|0}m=g.low=m+s;g.high=q+v+(m>>>0>>0?1:0);N=n.low=N+E;n.high=r+H+(N>>>0>>0?1:0);O=b.low=O+F;b.high=Z+I+(O>>>0>>0?1:0);P=d.low=P+J;d.high=$+W+(P>>>0>>0?1:0);Q=c.low=Q+t;c.high=aa+w+(Q>>>0>>0?1:0);R=j.low=R+K;j.high=ba+U+(R>>>0>>0?1:0);S=l.low=S+L;l.high=ca+V+(S>>>0>>0?1:0);T=h.low=T+M;h.high=da+X+(T>>>0>>0?1:0)},_doFinalize:function(){var a=this._data,f=a.words,h=8*this._nDataBytes,g=8*a.sigBytes;f[g>>>5]|=128<<24-g%32;f[(g+128>>>10<<5)+30]=Math.floor(h/4294967296);f[(g+128>>>10<<5)+31]=h;a.sigBytes=4*f.length;this._process();return this._hash.toX32()},clone:function(){var a=r.clone.call(this);a._hash=this._hash.clone();return a},blockSize:32});m.SHA512=r._createHelper(f);m.HmacSHA512=r._createHmacHelper(f)})(); + +var VERSION="2013-09-12-232232" @@ -3319,7 +3315,8 @@ var lang=(navigator.language)?navigator.language:navigator.userLanguage;window.l +"additional id's, descriptions about the assets purpose or even special orders for your legal successor.","_pop_mail":"Enter the email address connected to this network asset. It is advisable to add information about " +"this email into another asset as well.","_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."},"de":{"_successors":"Rechtsnachfolger","_successor":"Rechtsnachfolger","_addsuccessor":"Rechtsnachfolger Hinzufügen","_substitute":"Ersatzrechtsnachfolger","_assets":"Netzaccounts","_asset":"Netzaccount","_addasset":"Netzaccount hinzufügen","_add":"neu","_name":"Bezeichnung","_uri":"URL","_login":"Benutzername","_pass":"Passwort","_mail":"E-Mail","_ordered":"wird beauftragt","_preordered":"Der Rechtsnachfolger wird beauftragt, den Netzaccount","_postordered":"","_save":"Speichern","_savenext":"Speichern und Fortfahren","_cancel":"Abbrechen","_edit":"Bearbeiten","_remove":"Entfernen","_notes":"Besondere Hinweise","_birth":"Geburtsdatum","_testament":"Testament Anschauen","_address":"Adresse","_print":"Dies ist das vollständige digitale Testament.","_doprint":"Ausdrucken","_ttitle":"Mein digitales Testament","_appoint1":"Hiermit bestimme ich, ","_appoint2":", im Vollbesitz meiner geistigen Kräfte, die folgende Person als Rechtsnachfolger " ++"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":{"_successors":"Rechtsnachfolger","_successor":"Rechtsnachfolger","_addsuccessor":"Rechtsnachfolger Hinzufügen","_substitute":"Ersatzrechtsnachfolger","_assets":"Netzaccounts","_asset":"Netzaccount","_addasset":"Netzaccount hinzufügen","_add":"neu","_name":"Bezeichnung","_uri":"URL","_login":"Benutzername","_pass":"Passwort","_mail":"E-Mail","_ordered":"wird beauftragt","_preordered":"Der Rechtsnachfolger wird beauftragt, den Netzaccount","_postordered":"","_save":"Speichern","_savenext":"Speichern und Fortfahren","_cancel":"Abbrechen","_edit":"Bearbeiten","_remove":"Entfernen","_notes":"Besondere Hinweise","_birth":"Geburtsdatum","_testament":"Testament Anschauen","_address":"Adresse","_print":"Dies ist das vollständige digitale Testament.","_doprint":"Ausdrucken","_ttitle":"Mein digitales Testament","_appoint1":"Hiermit bestimme ich, ","_appoint2":", im Vollbesitz meiner geistigen Kräfte, die folgende Person als Rechtsnachfolger " +"für die aufgeführten Netzwerkaccounts nach meinem Tode:","_appoint3":"Falls die oben aufgeführte Person nicht mehr leben sollte " +"oder unauffindbar sein, so soll dies der Ersatzrechtsnachfolger " +"sein:","_successorshall":"Mein Rechtsnachfolger soll sich um die im folgenden " @@ -3347,7 +3344,8 @@ var lang=(navigator.language)?navigator.language:navigator.userLanguage;window.l +"weiteren Netzwerkaccount ebenfalls den Zugang zu dieser Email anzugeben.","_pop_successor":"Wählen Sie Ihren Rechtsnachfolger aus. Sie können den Standard verwenden, in dem Fall erhält Ihr " +"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."}};function translate(key){var locale=window.locale[lang]||window.locale['en-US'];if(key){if(key in locale){return locale[key];} ++"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."}};function translate(key){var locale=window.locale[lang]||window.locale['en-US'];if(key){if(key in locale){return locale[key];} else{return'__UNTRANSLATED_STRING__('+key+')';}} else{return'';}} +catch(e){this.set('clear',translate('_error_decrypt')+" ("+e+")");}} +else{this.set('isEditing',true);this.set('errors',validated);this.set('clear',translate('_error_decrypt'));}},repeatEditing:function(){this.set('isEditing',true);this.set('importdata','');this.set('password','');}});function ImportJSON(json,pass){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);});$.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){App.Successor.find(obj.id).then(function(successor){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);}}});$.each(json.assets,function(index,obj){var exists=App.Asset.all().some(function(asset){return asset.get('id')===obj.id;});if(exists){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);App.store.commit();});} +else{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();} +App.AboutController=Ember.Controller.extend({}); +else{return'';}});Ember.Handlebars.registerBoundHelper('ifeq',function(v1,v2,options){return(this.get(v1)==v2)?options.fn(this):'';});Ember.Handlebars.registerBoundHelper('date',function(date){moment().lang(lang);return moment(date).format('LL');}); diff --git a/index.html b/index.html index 39e636c..0174518 100644 --- a/index.html +++ b/index.html @@ -22,7 +22,7 @@
  • {{#linkTo 'assets'}}{{loc _assets}}{{/linkTo}}
  • {{#linkTo 'testament'}}{{loc _testament}}{{/linkTo}}
  • {{#linkTo 'data'}}{{loc _data}}{{/linkTo}}
  • -
  • {{#linkTo 'about'}}about{{/linkTo}}
  • +
  • {{#linkTo 'about'}}{{loc _aboutmenu}}{{/linkTo}}
  • digiproof version {{VERSION}} @@ -35,10 +35,8 @@
    - {{controller}} - ? - ? -
    + {{loc _about}} +
    @@ -709,21 +707,15 @@

    {{loc _export}}

    {{#if self.password}}

    {{loc _exporthelp}}

    - diff --git a/js/apphelpers.js b/js/apphelpers.js index 4a256d6..3d3797e 100644 --- a/js/apphelpers.js +++ b/js/apphelpers.js @@ -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())); diff --git a/js/controllers_about.js b/js/controllers_about.js index b301547..a06f174 100644 --- a/js/controllers_about.js +++ b/js/controllers_about.js @@ -1,6 +1,6 @@ App.AboutController = Ember.Controller.extend({ - popup: { login: { title: "titel", help: "hilfe" } } + }); diff --git a/js/controllers_data.js b/js/controllers_data.js index a947ab7..8da18ce 100644 --- a/js/controllers_data.js +++ b/js/controllers_data.js @@ -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(); +} + diff --git a/js/handlebars_helpers.js b/js/handlebars_helpers.js index 3942bf2..9a92360 100644 --- a/js/handlebars_helpers.js +++ b/js/handlebars_helpers.js @@ -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"; - } -}); diff --git a/js/locale.js b/js/locale.js index eae481a..10b84b4 100644 --- a/js/locale.js +++ b/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 " +"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." } };