diff --git a/Makefile b/Makefile index 91309c7..142f4c1 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,44 @@ +# +# This file is part of the digital testament management program +# DigiProof. +# +# By accessing this software, DigiProof, you are duly informed +# of and agree to be bound by the conditions described below in this +# notice: +# +# This software product, DigiProof, is developed by T. Linden and +# copyrighted (C) 2013 by T. Linden, with all rights reserved. +# +# There is no charge for DigiProof software. You can redistribute +# it and/or modify it under the terms of the GNU General Public +# License, which is incorporated by reference herein. +# +# DigiProof is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, +# OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that +# the use of it will not infringe on any third party's intellectual +# property rights. +# +# You should have received a copy of the GNU General Public License +# along with DigiProof. Copies can also be obtained from: +# +# http://www.gnu.org/licenses/gpl-2.0.html +# +# or by writing to: +# +# Free Software Foundation, Inc. +# Inc., 51 Franklin Street, Fifth Floor +# Boston, MA 02110-1301 +# USA +# +# Or contact: +# +# "T. Linden" +# +# The sourcecode can be found on: +# +# https://github.com/TLINDEN/digiproof +# + ts != date +"%Y-%m-%d-%H%M%S" dst = .backup/$(ts) src = js *.html css diff --git a/css/style.css b/css/style.css index 70c18f7..ea92c4f 100755 --- a/css/style.css +++ b/css/style.css @@ -1,4 +1,46 @@ -/* Put your CSS here */ +/* + * + * This file is part of the digital testament management program + * DigiProof. + * + * By accessing this software, DigiProof, you are duly informed + * of and agree to be bound by the conditions described below in this + * notice: + * + * This software product, DigiProof, is developed by T. Linden and + * copyrighted (C) 2013 by T. Linden, with all rights reserved. + * + * There is no charge for DigiProof software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DigiProof is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellectual + * property rights. + * + * You should have received a copy of the GNU General Public License + * along with DigiProof. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl-2.0.html + * + * or by writing to: + * + * Free Software Foundation, Inc. + * Inc., 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 + * USA + * + * Or contact: + * + * "T. Linden" + * + * The sourcecode can be found on: + * + * https://github.com/TLINDEN/digiproof + * + */ + html, body { margin: 20px; } @@ -73,4 +115,19 @@ a { width: 0px; border: 0px; background-repeat: no-repeat; -background-image: url(data:image/jpeg;base64,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); \ No newline at end of file +background-image: url(data:image/jpeg;base64,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); +} + +.dpedge-prod { + padding: 3px; + background-color: #ffffff; + margin-top: 9px; + color: #6a6a6a; +} + +.dpedge-devel { + padding: 3px; + background-color: #ff8a00; + margin-top: 7px; + color: #6a6a6a; +} \ No newline at end of file diff --git a/index.html b/index.html index 5fd01a8..dccd863 100644 --- a/index.html +++ b/index.html @@ -1,6 +1,51 @@ + Digital Testament App @@ -823,12 +868,13 @@ + - + diff --git a/js/apphelpers.js b/js/apphelpers.js index a208ba7..d9efd76 100644 --- a/js/apphelpers.js +++ b/js/apphelpers.js @@ -1,3 +1,48 @@ +/* + * + * This file is part of the digital testament management program + * DigiProof. + * + * By accessing this software, DigiProof, you are duly informed + * of and agree to be bound by the conditions described below in this + * notice: + * + * This software product, DigiProof, is developed by T. Linden and + * copyrighted (C) 2013 by T. Linden, with all rights reserved. + * + * There is no charge for DigiProof software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DigiProof is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellectual + * property rights. + * + * You should have received a copy of the GNU General Public License + * along with DigiProof. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl-2.0.html + * + * or by writing to: + * + * Free Software Foundation, Inc. + * Inc., 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 + * USA + * + * Or contact: + * + * "T. Linden" + * + * The sourcecode can be found on: + * + * https://github.com/TLINDEN/digiproof + * + */ + + +// tell if there have been anything done yet function CheckForEmptyDB() { var assets = App.Asset.find(); var notempty = true; diff --git a/js/confirm.js b/js/confirm.js index a385428..ded8957 100644 --- a/js/confirm.js +++ b/js/confirm.js @@ -1,3 +1,55 @@ +/* + * + * This file is part of the digital testament management program + * DigiProof. + * + * By accessing this software, DigiProof, you are duly informed + * of and agree to be bound by the conditions described below in this + * notice: + * + * This software product, DigiProof, is developed by T. Linden and + * copyrighted (C) 2013 by T. Linden, with all rights reserved. + * + * There is no charge for DigiProof software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DigiProof is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellectual + * property rights. + * + * You should have received a copy of the GNU General Public License + * along with DigiProof. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl-2.0.html + * + * or by writing to: + * + * Free Software Foundation, Inc. + * Inc., 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 + * USA + * + * Or contact: + * + * "T. Linden" + * + * The sourcecode can be found on: + * + * https://github.com/TLINDEN/digiproof + * + */ + +/* + * Unused currently! + * + * The idea here was, if the user enters data and closes the page, + * check if there have been made an export and if not ask the user + * to do one. + * + * Howver, it doesn't work so far. + */ function confirminit() { window.onbeforeunload = function(e) { diff --git a/js/controllers_about.js b/js/controllers_about.js index a06f174..d95eefc 100644 --- a/js/controllers_about.js +++ b/js/controllers_about.js @@ -1,4 +1,48 @@ +/* + * + * This file is part of the digital testament management program + * DigiProof. + * + * By accessing this software, DigiProof, you are duly informed + * of and agree to be bound by the conditions described below in this + * notice: + * + * This software product, DigiProof, is developed by T. Linden and + * copyrighted (C) 2013 by T. Linden, with all rights reserved. + * + * There is no charge for DigiProof software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DigiProof is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellectual + * property rights. + * + * You should have received a copy of the GNU General Public License + * along with DigiProof. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl-2.0.html + * + * or by writing to: + * + * Free Software Foundation, Inc. + * Inc., 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 + * USA + * + * Or contact: + * + * "T. Linden" + * + * The sourcecode can be found on: + * + * https://github.com/TLINDEN/digiproof + * + */ + +// only template stuff here, no action. App.AboutController = Ember.Controller.extend({ }); diff --git a/js/controllers_application.js b/js/controllers_application.js index 66347e3..0e81e9d 100644 --- a/js/controllers_application.js +++ b/js/controllers_application.js @@ -1,4 +1,50 @@ +/* + * + * This file is part of the digital testament management program + * DigiProof. + * + * By accessing this software, DigiProof, you are duly informed + * of and agree to be bound by the conditions described below in this + * notice: + * + * This software product, DigiProof, is developed by T. Linden and + * copyrighted (C) 2013 by T. Linden, with all rights reserved. + * + * There is no charge for DigiProof software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DigiProof is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellectual + * property rights. + * + * You should have received a copy of the GNU General Public License + * along with DigiProof. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl-2.0.html + * + * or by writing to: + * + * Free Software Foundation, Inc. + * Inc., 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 + * USA + * + * Or contact: + * + * "T. Linden" + * + * The sourcecode can be found on: + * + * https://github.com/TLINDEN/digiproof + * + */ + +/* + * distribute those template vars app-wide + */ App.ApplicationController = Ember.Controller.extend({ isDevel: isDevel, VERSION: VERSION diff --git a/js/controllers_asset.js b/js/controllers_asset.js index e1988ce..6ac3d71 100644 --- a/js/controllers_asset.js +++ b/js/controllers_asset.js @@ -1,3 +1,47 @@ +/* + * + * This file is part of the digital testament management program + * DigiProof. + * + * By accessing this software, DigiProof, you are duly informed + * of and agree to be bound by the conditions described below in this + * notice: + * + * This software product, DigiProof, is developed by T. Linden and + * copyrighted (C) 2013 by T. Linden, with all rights reserved. + * + * There is no charge for DigiProof software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DigiProof is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellectual + * property rights. + * + * You should have received a copy of the GNU General Public License + * along with DigiProof. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl-2.0.html + * + * or by writing to: + * + * Free Software Foundation, Inc. + * Inc., 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 + * USA + * + * Or contact: + * + * "T. Linden" + * + * The sourcecode can be found on: + * + * https://github.com/TLINDEN/digiproof + * + */ + + App.AssetsAssetController = Ember.ObjectController.extend({ diff --git a/js/controllers_data.js b/js/controllers_data.js index 18db3c3..bbc7554 100644 --- a/js/controllers_data.js +++ b/js/controllers_data.js @@ -1,3 +1,52 @@ +/* + * + * This file is part of the digital testament management program + * DigiProof. + * + * By accessing this software, DigiProof, you are duly informed + * of and agree to be bound by the conditions described below in this + * notice: + * + * This software product, DigiProof, is developed by T. Linden and + * copyrighted (C) 2013 by T. Linden, with all rights reserved. + * + * There is no charge for DigiProof software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DigiProof is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellectual + * property rights. + * + * You should have received a copy of the GNU General Public License + * along with DigiProof. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl-2.0.html + * + * or by writing to: + * + * Free Software Foundation, Inc. + * Inc., 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 + * USA + * + * Or contact: + * + * "T. Linden" + * + * The sourcecode can be found on: + * + * https://github.com/TLINDEN/digiproof + * + */ + + + +/* + * This controller is being used to data export and import. + * It handles the whole encryption/decryption of data. + */ App.DataExportController = Ember.ArrayController.extend({ @@ -57,7 +106,7 @@ App.DataExportController = Ember.ArrayController.extend({ hash = CryptoJS.SHA512(hash); } - // fix comma syntax + // fix handlebars generated json output comma syntax raw = raw.replace(/,\],/g, '],'); // console.log("raw: %s", raw); var cr = CryptoJS.AES.encrypt(escape(raw), hash.toString(CryptoJS.enc.Base64)); @@ -94,7 +143,9 @@ App.DataExportController = Ember.ArrayController.extend({ - +/* + * Helper for file upload button in the data/import view. + */ var UploadedImport = null; App.UploadFileView = Ember.TextField.extend({ // WARN: this one gets fired as soon as the user selected a file @@ -109,7 +160,7 @@ App.UploadFileView = Ember.TextField.extend({ var that = this; reader.onload = function(e) { var targ; - if (!e) var e = window.event; + if (!e) var e = window.event; // IE compatibility check if (e.target) targ = e.target; else if (e.srcElement) targ = e.srcElement; if (targ.nodeType == 3) // defeat Safari bug diff --git a/js/controllers_index.js b/js/controllers_index.js index 2f42fc5..639e1af 100644 --- a/js/controllers_index.js +++ b/js/controllers_index.js @@ -1,4 +1,50 @@ +/* + * + * This file is part of the digital testament management program + * DigiProof. + * + * By accessing this software, DigiProof, you are duly informed + * of and agree to be bound by the conditions described below in this + * notice: + * + * This software product, DigiProof, is developed by T. Linden and + * copyrighted (C) 2013 by T. Linden, with all rights reserved. + * + * There is no charge for DigiProof software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DigiProof is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellectual + * property rights. + * + * You should have received a copy of the GNU General Public License + * along with DigiProof. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl-2.0.html + * + * or by writing to: + * + * Free Software Foundation, Inc. + * Inc., 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 + * USA + * + * Or contact: + * + * "T. Linden" + * + * The sourcecode can be found on: + * + * https://github.com/TLINDEN/digiproof + * + */ + +/* + * Used for general navbar display and intro texts + */ App.IndexController = Ember.Controller.extend({ has_self: App.Self.find(), has_asset: App.Asset.find(), @@ -8,7 +54,10 @@ App.IndexController = Ember.Controller.extend({ }); - +/* + * Make sure, a clicked menu item gets highlighted, + * so the user knows where he is. + */ App.NavView = Ember.View.extend({ tagName: 'li', classNameBindings: 'active'.w(), diff --git a/js/controllers_self.js b/js/controllers_self.js index b775f50..955cdbb 100644 --- a/js/controllers_self.js +++ b/js/controllers_self.js @@ -1,3 +1,47 @@ +/* + * + * This file is part of the digital testament management program + * DigiProof. + * + * By accessing this software, DigiProof, you are duly informed + * of and agree to be bound by the conditions described below in this + * notice: + * + * This software product, DigiProof, is developed by T. Linden and + * copyrighted (C) 2013 by T. Linden, with all rights reserved. + * + * There is no charge for DigiProof software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DigiProof is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellectual + * property rights. + * + * You should have received a copy of the GNU General Public License + * along with DigiProof. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl-2.0.html + * + * or by writing to: + * + * Free Software Foundation, Inc. + * Inc., 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 + * USA + * + * Or contact: + * + * "T. Linden" + * + * The sourcecode can be found on: + * + * https://github.com/TLINDEN/digiproof + * + */ + + App.SelfController = Ember.ObjectController.extend({ isEditing: false, diff --git a/js/controllers_successor.js b/js/controllers_successor.js index db60fca..5d14d5d 100644 --- a/js/controllers_successor.js +++ b/js/controllers_successor.js @@ -1,7 +1,51 @@ +/* + * + * This file is part of the digital testament management program + * DigiProof. + * + * By accessing this software, DigiProof, you are duly informed + * of and agree to be bound by the conditions described below in this + * notice: + * + * This software product, DigiProof, is developed by T. Linden and + * copyrighted (C) 2013 by T. Linden, with all rights reserved. + * + * There is no charge for DigiProof software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DigiProof is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellectual + * property rights. + * + * You should have received a copy of the GNU General Public License + * along with DigiProof. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl-2.0.html + * + * or by writing to: + * + * Free Software Foundation, Inc. + * Inc., 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 + * USA + * + * Or contact: + * + * "T. Linden" + * + * The sourcecode can be found on: + * + * https://github.com/TLINDEN/digiproof + * + */ + +// manage successors: create, edit and delete them. App.SuccessorsSuccessorController = Ember.ObjectController.extend({ isEditing: false, errors: {}, diff --git a/js/controllers_testament.js b/js/controllers_testament.js index 2d6c8bf..7566db4 100644 --- a/js/controllers_testament.js +++ b/js/controllers_testament.js @@ -1,4 +1,52 @@ +/* + * + * This file is part of the digital testament management program + * DigiProof. + * + * By accessing this software, DigiProof, you are duly informed + * of and agree to be bound by the conditions described below in this + * notice: + * + * This software product, DigiProof, is developed by T. Linden and + * copyrighted (C) 2013 by T. Linden, with all rights reserved. + * + * There is no charge for DigiProof software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DigiProof is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellectual + * property rights. + * + * You should have received a copy of the GNU General Public License + * along with DigiProof. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl-2.0.html + * + * or by writing to: + * + * Free Software Foundation, Inc. + * Inc., 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 + * USA + * + * Or contact: + * + * "T. Linden" + * + * The sourcecode can be found on: + * + * https://github.com/TLINDEN/digiproof + * + */ + +/* + * plain simple controller, just spits out all our + * data, the acual testament generation happens in the + * template + */ App.TestamentController = Ember.ArrayController.extend({ needs: "self", //self: Ember.computed.alias("controllers.self"), diff --git a/js/digiproof_dev.js b/js/digiproof_dev.js new file mode 100644 index 0000000..6010be0 --- /dev/null +++ b/js/digiproof_dev.js @@ -0,0 +1,45 @@ +/* + * + * This file is part of the digital testament management program + * DigiProof. + * + * By accessing this software, DigiProof, you are duly informed + * of and agree to be bound by the conditions described below in this + * notice: + * + * This software product, DigiProof, is developed by T. Linden and + * copyrighted (C) 2013 by T. Linden, with all rights reserved. + * + * There is no charge for DigiProof software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DigiProof is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellectual + * property rights. + * + * You should have received a copy of the GNU General Public License + * along with DigiProof. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl-2.0.html + * + * or by writing to: + * + * Free Software Foundation, Inc. + * Inc., 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 + * USA + * + * Or contact: + * + * "T. Linden" + * + * The sourcecode can be found on: + * + * https://github.com/TLINDEN/digiproof + * + */ + +// signal the app, we are running in development mode! +var isDevel = true; diff --git a/js/digiproof_prod.js b/js/digiproof_prod.js new file mode 100644 index 0000000..2da024a --- /dev/null +++ b/js/digiproof_prod.js @@ -0,0 +1,61 @@ +/* + * + * This file is part of the digital testament management program + * DigiProof. + * + * By accessing this software, DigiProof, you are duly informed + * of and agree to be bound by the conditions described below in this + * notice: + * + * This software product, DigiProof, is developed by T. Linden and + * copyrighted (C) 2013 by T. Linden, with all rights reserved. + * + * There is no charge for DigiProof software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DigiProof is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellectual + * property rights. + * + * You should have received a copy of the GNU General Public License + * along with DigiProof. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl-2.0.html + * + * or by writing to: + * + * Free Software Foundation, Inc. + * Inc., 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 + * USA + * + * Or contact: + * + * "T. Linden" + * + * The sourcecode can be found on: + * + * https://github.com/TLINDEN/digiproof + * + */ + +// signal the app, we are running in productive mode! +var isDevel = false; + +/* + * in the production actual saving to browser + * storage on disk is disabled here by overwriting + * the setItem and getItem function of localStorage + * with dummies, which hold the data in memory only. + */ +localStorage.setItem = function(namespace, json) { + this.set('_fakestore') = { namespace: json }; + return this; +} + +localStorage.getItem = function(namespace) { + return this.get('_fakestore').namespace; +} + diff --git a/js/fs.js b/js/fs.js index 2fe889d..be43faf 100755 --- a/js/fs.js +++ b/js/fs.js @@ -1,3 +1,51 @@ +/* + * + * This file is part of the digital testament management program + * DigiProof. + * + * By accessing this software, DigiProof, you are duly informed + * of and agree to be bound by the conditions described below in this + * notice: + * + * This software product, DigiProof, is developed by T. Linden and + * copyrighted (C) 2013 by T. Linden, with all rights reserved. + * + * There is no charge for DigiProof software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DigiProof is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellectual + * property rights. + * + * You should have received a copy of the GNU General Public License + * along with DigiProof. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl-2.0.html + * + * or by writing to: + * + * Free Software Foundation, Inc. + * Inc., 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 + * USA + * + * Or contact: + * + * "T. Linden" + * + * The sourcecode can be found on: + * + * https://github.com/TLINDEN/digiproof + * + */ + + +/* + * CURRENTLY UNUSED !!!!! + */ + //-- //-- Filesystem code from TiddlyWiki diff --git a/js/handlebars_helpers.js b/js/handlebars_helpers.js index 9a92360..ae29b41 100644 --- a/js/handlebars_helpers.js +++ b/js/handlebars_helpers.js @@ -1,5 +1,54 @@ +/* + * + * This file is part of the digital testament management program + * DigiProof. + * + * By accessing this software, DigiProof, you are duly informed + * of and agree to be bound by the conditions described below in this + * notice: + * + * This software product, DigiProof, is developed by T. Linden and + * copyrighted (C) 2013 by T. Linden, with all rights reserved. + * + * There is no charge for DigiProof software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DigiProof is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellectual + * property rights. + * + * You should have received a copy of the GNU General Public License + * along with DigiProof. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl-2.0.html + * + * or by writing to: + * + * Free Software Foundation, Inc. + * Inc., 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 + * USA + * + * Or contact: + * + * "T. Linden" + * + * The sourcecode can be found on: + * + * https://github.com/TLINDEN/digiproof + * + */ -// https://gist.github.com/tracend/3261055 + +/* + * handlebars helper to translate strings. + * Those are defined in js/locale.js, see there. Called with + * {{loc _tag}} from any handlebars template. + * + * See https://gist.github.com/tracend/3261055 + */ Ember.Handlebars.registerBoundHelper('loc', function(keyword, options) { // pick the right dictionary var locale = window.locale[lang] || window.locale['en-US']; @@ -31,10 +80,7 @@ Ember.Handlebars.registerBoundHelper('loc', function(keyword, options) { } }); -Ember.Handlebars.registerBoundHelper('ifeq', function(v1, v2, options) { - return (this.get(v1) == v2) ? options.fn(this) : ''; -}); - +// print a nice formatted date to the testament printout Ember.Handlebars.registerBoundHelper('date', function(date) { moment().lang(lang); return moment(date).format('LL'); diff --git a/js/init.js b/js/init.js index e1fdc92..201f827 100644 --- a/js/init.js +++ b/js/init.js @@ -1,14 +1,59 @@ +/* + * + * This file is part of the digital testament management program + * DigiProof. + * + * By accessing this software, DigiProof, you are duly informed + * of and agree to be bound by the conditions described below in this + * notice: + * + * This software product, DigiProof, is developed by T. Linden and + * copyrighted (C) 2013 by T. Linden, with all rights reserved. + * + * There is no charge for DigiProof software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DigiProof is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellectual + * property rights. + * + * You should have received a copy of the GNU General Public License + * along with DigiProof. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl-2.0.html + * + * or by writing to: + * + * Free Software Foundation, Inc. + * Inc., 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 + * USA + * + * Or contact: + * + * "T. Linden" + * + * The sourcecode can be found on: + * + * https://github.com/TLINDEN/digiproof + * + */ + +// just the app object. put ember.js tuning, logging etc here. App = Ember.Application.create({ //LOG_TRANSITIONS: true }); /* - * make sure, only one popover appears at a time. - * if the user hovers over another help button, - * hide other popovers and display the new. Hide - * all if not above a help button at all. - */ + * Some trickery for help popovers: + * make sure, only one popover appears at a time. + * if the user hovers over another help button, + * hide other popovers and display the new. Hide + * all if not above a help button at all. + */ $(document).ready(function () { $('.popup-marker').popover({ html: true, diff --git a/js/libs/localstorage_adapter_dev.js b/js/libs/localstorage_adapter.js similarity index 99% rename from js/libs/localstorage_adapter_dev.js rename to js/libs/localstorage_adapter.js index 75c00af..79d88cd 100644 --- a/js/libs/localstorage_adapter_dev.js +++ b/js/libs/localstorage_adapter.js @@ -1,5 +1,3 @@ -var isDevel = true; - DS.LSSerializer = DS.JSONSerializer.extend({ addBelongsTo: function(data, record, key, association) { diff --git a/js/libs/localstorage_adapter_prod.js b/js/libs/localstorage_adapter_prod.js deleted file mode 100644 index edff68e..0000000 --- a/js/libs/localstorage_adapter_prod.js +++ /dev/null @@ -1,238 +0,0 @@ -var isDevel = false; - -/* - * in the production actual saving to browser - * storage on disk is disabled here by overwriting - * the setItem and getItem function with dummies, - * which hold the data in memory only. - */ -localStorage.setItem = function(namespace, json) { - this.set('_fakestore') = { namespace: json }; - return this; -} - -localStorage.getItem = function(namespace) { - return this.get('_fakestore').namespace; -} - -DS.LSSerializer = DS.JSONSerializer.extend({ - - addBelongsTo: function(data, record, key, association) { - data[key] = record.get(key + '.id'); - }, - - addHasMany: function(data, record, key, association) { - data[key] = record.get(key).map(function(record) { - return record.get('id'); - }); - }, - - // extract expects a root key, we don't want to save all these keys to - // localStorage so we generate the root keys here - extract: function(loader, json, type, record) { - this._super(loader, this.rootJSON(json, type), type, record); - }, - - extractMany: function(loader, json, type, records) { - this._super(loader, this.rootJSON(json, type, 'pluralize'), type, records); - }, - - rootJSON: function(json, type, pluralize) { - var root = this.rootForType(type); - if (pluralize == 'pluralize') { root = this.pluralize(root); } - var rootedJSON = {}; - rootedJSON[root] = json; - return rootedJSON; - } - -}); - -DS.LSAdapter = DS.Adapter.extend(Ember.Evented, { - - init: function() { - this._loadData(); - }, - - generateIdForRecord: function() { - return Math.random().toString(32).slice(2).substr(0,5); - }, - - serializer: DS.LSSerializer.create(), - - find: function(store, type, id) { - var namespace = this._namespaceForType(type); - this._async(function(){ - var copy = Ember.copy(namespace.records[id]); - this.didFindRecord(store, type, copy, id); - }); - }, - - findMany: function(store, type, ids) { - var namespace = this._namespaceForType(type); - this._async(function(){ - var results = []; - for (var i = 0; i < ids.length; i++) { - results.push(Ember.copy(namespace.records[ids[i]])); - } - this.didFindMany(store, type, results); - }); - }, - - // Supports queries that look like this: - // - // { - // : , - // ... - // } - // - // Every property added to the query is an "AND" query, not "OR" - // - // Example: - // - // match records with "complete: true" and the name "foo" or "bar" - // - // { complete: true, name: /foo|bar/ } - findQuery: function(store, type, query, recordArray) { - var namespace = this._namespaceForType(type); - this._async(function() { - var results = this.query(namespace.records, query); - this.didFindQuery(store, type, results, recordArray); - }); - }, - - query: function(records, query) { - var results = []; - var id, record, property, test, push; - for (id in records) { - record = records[id]; - for (property in query) { - test = query[property]; - push = false; - if (Object.prototype.toString.call(test) == '[object RegExp]') { - push = test.test(record[property]); - } else { - push = record[property] === test; - } - } - if (push) { - results.push(record); - } - } - return results; - }, - - findAll: function(store, type) { - var namespace = this._namespaceForType(type); - this._async(function() { - var results = []; - for (var id in namespace.records) { - results.push(Ember.copy(namespace.records[id])); - } - this.didFindAll(store, type, results); - }); - }, - - createRecords: function(store, type, records) { - var namespace = this._namespaceForType(type); - records.forEach(function(record) { - this._addRecordToNamespace(namespace, record); - }, this); - this._async(function() { - this._didSaveRecords(store, type, records); - }); - }, - - updateRecords: function(store, type, records) { - var namespace = this._namespaceForType(type); - this._async(function() { - records.forEach(function(record) { - var id = record.get('id'); - namespace.records[id] = record.serialize({includeId:true}); - }, this); - this._didSaveRecords(store, type, records); - }); - }, - - deleteRecords: function(store, type, records) { - var namespace = this._namespaceForType(type); - this._async(function() { - records.forEach(function(record) { - var id = record.get('id'); - delete namespace.records[id]; - }); - this._didSaveRecords(store, type, records); - }); - - }, - - dirtyRecordsForHasManyChange: function(dirtySet, parent, relationship) { - dirtySet.add(parent); - }, - - dirtyRecordsForBelongsToChange: function(dirtySet, child, relationship) { - dirtySet.add(child); - }, - - // private - - _getNamespace: function() { - return this.namespace || 'DS.LSAdapter'; - }, - - _loadData: function() { - try { - var storage = localStorage.getItem(this._getNamespace()); - this._data = storage ? JSON.parse(storage) : {}; - } - catch(e) { - this._data = {}; - } - }, - - _didSaveRecords: function(store, type, records) { - var success = this._saveData(); - if (success) { - store.didSaveRecords(records); - } else { - records.forEach(function(record) { - store.recordWasError(record); - }); - this.trigger('QUOTA_EXCEEDED_ERR', records); - } - }, - - _saveData: function() { - try { - localStorage.setItem(this._getNamespace(), JSON.stringify(this._data)); - return true; - } - catch(error) { - if (error.name == 'QUOTA_EXCEEDED_ERR') { - return false; - } else { - // IE, Ignore. throw new Error(error); - } - } - }, - - _namespaceForType: function(type) { - var namespace = type.url || type.toString(); - return this._data[namespace] || ( - this._data[namespace] = {records: {}} - ); - }, - - _addRecordToNamespace: function(namespace, record) { - var data = record.serialize({includeId: true}); - namespace.records[data.id] = data; - }, - - _async: function(callback) { - var _this = this; - setTimeout(function(){ - Ember.run(_this, callback); - }, 1); - } - -}); - diff --git a/js/libs/version.js b/js/libs/version.js index 814532d..644e53a 100644 --- a/js/libs/version.js +++ b/js/libs/version.js @@ -1 +1 @@ -var VERSION = "2013-09-13-155304" +var VERSION = "2013-09-15-120917" diff --git a/js/locale.js b/js/locale.js index 6e24b9d..e7d59c8 100644 --- a/js/locale.js +++ b/js/locale.js @@ -1,6 +1,61 @@ -var lang = (navigator.language) ? navigator.language : navigator.userLanguage; +/* + * + * This file is part of the digital testament management program + * DigiProof. + * + * By accessing this software, DigiProof, you are duly informed + * of and agree to be bound by the conditions described below in this + * notice: + * + * This software product, DigiProof, is developed by T. Linden and + * copyrighted (C) 2013 by T. Linden, with all rights reserved. + * + * There is no charge for DigiProof software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DigiProof is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellectual + * property rights. + * + * You should have received a copy of the GNU General Public License + * along with DigiProof. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl-2.0.html + * + * or by writing to: + * + * Free Software Foundation, Inc. + * Inc., 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 + * USA + * + * Or contact: + * + * "T. Linden" + * + * The sourcecode can be found on: + * + * https://github.com/TLINDEN/digiproof + * + */ +/* + * All visible strings, that is, menus, help texts, form labels + * etc will be put here. The language to be used will be determined + * by what the browser tells us. If the language is known (that is, + * the locale is contained in our window.locale hash), it will just + * be used, otherwise a fallback to en-US will be done. + * Use from templates with {{loc _tag}} where tag is a key of the + * window.locale hash. 'loc' is a handlebars helper defined in + * handlebars_helpers.js + * Use from JS with translate(tag). translate() is defined here. + */ + +var lang = (navigator.language) ? navigator.language : navigator.userLanguage; + window.locale = { "en-US": { diff --git a/js/mixins.js b/js/mixins.js index 2a4dc26..01d9819 100644 --- a/js/mixins.js +++ b/js/mixins.js @@ -1,16 +1,55 @@ +/* + * + * This file is part of the digital testament management program + * DigiProof. + * + * By accessing this software, DigiProof, you are duly informed + * of and agree to be bound by the conditions described below in this + * notice: + * + * This software product, DigiProof, is developed by T. Linden and + * copyrighted (C) 2013 by T. Linden, with all rights reserved. + * + * There is no charge for DigiProof software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DigiProof is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellectual + * property rights. + * + * You should have received a copy of the GNU General Public License + * along with DigiProof. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl-2.0.html + * + * or by writing to: + * + * Free Software Foundation, Inc. + * Inc., 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 + * USA + * + * Or contact: + * + * "T. Linden" + * + * The sourcecode can be found on: + * + * https://github.com/TLINDEN/digiproof + * + */ + + +/* + * Those mixins will be used to extend our models + * see models.js. In general we add validators, + * which will be called on edit or save of an instance. + */ App.SelfMixin = Ember.Mixin.create({ passwdset: null, - /* - didLoad: function() { - this._passwdset(); - }, - - didUpdate: function() { - this.didLoad(); - }, - */ - validate: function() { var valid = true; var errors = {valid: true}; diff --git a/js/models.js b/js/models.js index 058fb18..f560029 100644 --- a/js/models.js +++ b/js/models.js @@ -1,3 +1,47 @@ +/* + * + * This file is part of the digital testament management program + * DigiProof. + * + * By accessing this software, DigiProof, you are duly informed + * of and agree to be bound by the conditions described below in this + * notice: + * + * This software product, DigiProof, is developed by T. Linden and + * copyrighted (C) 2013 by T. Linden, with all rights reserved. + * + * There is no charge for DigiProof software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DigiProof is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellectual + * property rights. + * + * You should have received a copy of the GNU General Public License + * along with DigiProof. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl-2.0.html + * + * or by writing to: + * + * Free Software Foundation, Inc. + * Inc., 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 + * USA + * + * Or contact: + * + * "T. Linden" + * + * The sourcecode can be found on: + * + * https://github.com/TLINDEN/digiproof + * + */ + + var attr = DS.attr; diff --git a/js/router.js b/js/router.js index 7bc5026..0322c42 100644 --- a/js/router.js +++ b/js/router.js @@ -1,4 +1,50 @@ +/* + * + * This file is part of the digital testament management program + * DigiProof. + * + * By accessing this software, DigiProof, you are duly informed + * of and agree to be bound by the conditions described below in this + * notice: + * + * This software product, DigiProof, is developed by T. Linden and + * copyrighted (C) 2013 by T. Linden, with all rights reserved. + * + * There is no charge for DigiProof software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DigiProof is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellectual + * property rights. + * + * You should have received a copy of the GNU General Public License + * along with DigiProof. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl-2.0.html + * + * or by writing to: + * + * Free Software Foundation, Inc. + * Inc., 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 + * USA + * + * Or contact: + * + * "T. Linden" + * + * The sourcecode can be found on: + * + * https://github.com/TLINDEN/digiproof + * + */ + +/* + * Router for all links/uris in the app + */ App.Router.map(function() { this.resource('assets', function() { this.route('asset', { path: ':asset_id' }); @@ -29,6 +75,10 @@ App.AssetsRoute = Ember.Route.extend({ } }); +/* + * the Self controller operates on one instance + * only, since there are not many "selfes" required. + */ App.SelfRoute = Ember.Route.extend({ setupController: function(controller) { controller.set('model', App.Self.find(0)); diff --git a/js/security.js b/js/security.js deleted file mode 100755 index 64efc01..0000000 --- a/js/security.js +++ /dev/null @@ -1,11 +0,0 @@ -/* crypto helpers */ - - -function pwhash(pass) { - /* get the clear text password, generate a salt - and hash them together. return the hash */ - var salt = CryptoJS.lib.WordArray.random(128/8); - console.log("key: %s, salt: %s", pass, salt); - var key512iter32 = CryptoJS.PBKDF2(pass, salt,{ keySize: 512/32, iterations: 32, hasher: CryptoJS.algo.SHA512 }); - return key512iter32; -} diff --git a/js/store.js b/js/store.js index 15c2743..fb6b4e0 100644 --- a/js/store.js +++ b/js/store.js @@ -1,10 +1,63 @@ +/* + * + * This file is part of the digital testament management program + * DigiProof. + * + * By accessing this software, DigiProof, you are duly informed + * of and agree to be bound by the conditions described below in this + * notice: + * + * This software product, DigiProof, is developed by T. Linden and + * copyrighted (C) 2013 by T. Linden, with all rights reserved. + * + * There is no charge for DigiProof software. You can redistribute + * it and/or modify it under the terms of the GNU General Public + * License, which is incorporated by reference herein. + * + * DigiProof is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, + * OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that + * the use of it will not infringe on any third party's intellectual + * property rights. + * + * You should have received a copy of the GNU General Public License + * along with DigiProof. Copies can also be obtained from: + * + * http://www.gnu.org/licenses/gpl-2.0.html + * + * or by writing to: + * + * Free Software Foundation, Inc. + * Inc., 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 + * USA + * + * Or contact: + * + * "T. Linden" + * + * The sourcecode can be found on: + * + * https://github.com/TLINDEN/digiproof + * + */ + +/* + * Ember.js store for our app. We're using localstorage, + * which is disabled in the production version though. + */ App.store = DS.Store.createWithMixins({ revision: 12, adapter: DS.LSAdapter.create({ namespace: 'digiproof' }), init: function() { + /* + * initialize some default objects for successor and order. + * the latter cannot be maintained by the user (as of now). + * + * FIXME: put the strings into js/locale.js. + */ this._super(); this.loadMany(App.Import,[ { 'id': 0, 'importdata': '' }]); if(lang === 'de') { @@ -29,6 +82,7 @@ App.store = DS.Store.createWithMixins({ ); this.loadMany(App.Successor, [{ 'id': 0, 'name': 'My regular legal succesor(s)' }]); } + // commit the objects so that reverse relations get properly saved this.commit(); } }); diff --git a/mksingleton.pl b/mksingleton.pl index c173074..d28f8fb 100755 --- a/mksingleton.pl +++ b/mksingleton.pl @@ -1,4 +1,51 @@ #!/usr/bin/perl +# +# This file is part of the digital testament management program +# DigiProof. +# +# By accessing this software, DigiProof, you are duly informed +# of and agree to be bound by the conditions described below in this +# notice: +# +# This software product, DigiProof, is developed by T. Linden and +# copyrighted (C) 2013 by T. Linden, with all rights reserved. +# +# There is no charge for DigiProof software. You can redistribute +# it and/or modify it under the terms of the GNU General Public +# License, which is incorporated by reference herein. +# +# DigiProof is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, +# OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that +# the use of it will not infringe on any third party's intellectual +# property rights. +# +# You should have received a copy of the GNU General Public License +# along with DigiProof. Copies can also be obtained from: +# +# http://www.gnu.org/licenses/gpl-2.0.html +# +# or by writing to: +# +# Free Software Foundation, Inc. +# Inc., 51 Franklin Street, Fifth Floor +# Boston, MA 02110-1301 +# USA +# +# Or contact: +# +# "T. Linden" +# +# The sourcecode can be found on: +# +# https://github.com/TLINDEN/digiproof +# + +# +# Used to build digiproof-prod.html and digiproof-dev.html +# from source files. It just creates a single html file from +# everything. JS and CSS will bin minified, comments removed, +# src-file and git hash added. + use Data::Dumper; use JavaScript::Minifier qw(minify); use CSS::Compressor qw( css_compress ); @@ -38,14 +85,18 @@ foreach (@source) { } elsif (/script src="([^"]*)"/) { my $jsfile = $1; - if ($jsfile =~ /localstorage/) { - $jsfile = "js/libs/localstorage_adapter_$type.js"; + if ($jsfile =~ /digiproof/) { + $jsfile = "js/digiproof_$type.js"; } print STDERR "Inserting $jsfile\n"; print qq(\n); } + elsif (/GITHASH/) { + my $hash = &githash($index); + print " -- Source: $index, Githash: $hash\n"; + } else { print qq($_\n); } @@ -57,9 +108,10 @@ foreach (@source) { sub fetch { my $file = shift; open F, "<$file" or die "Could not open index: $file $!\n"; + my $hash = &githash($file); if($file =~ /\.js/) { my $js; - my $from = "/* js from $file */\n"; + my $from = "/* js from $file ($hash) */\n"; if ($type eq 'prod') { $js = minify(input => *F); # ember.js (and probably others) contain strings which contain @@ -74,7 +126,7 @@ sub fetch { } } else { - my $from = "/* css from $file */\n"; + my $from = "/* css from $file ($hash) */\n"; my $src = join "", ; close F; if ($prod) { @@ -85,3 +137,10 @@ sub fetch { } } } + +sub githash { + my $file = shift; + my $hash = `git hash-object $file`; + chomp $hash; + return $hash; +}