From f32c7e74e2150e46ae7937e7b4bb7b312f1b9e85 Mon Sep 17 00:00:00 2001 From: Mo Bitar Date: Sat, 17 Dec 2016 15:02:46 -0600 Subject: [PATCH] derive bits instead of derive key --- Gruntfile.js | 2 +- app/assets/javascripts/app/app.frontend.js | 63 +- .../javascripts/app/services/apiController.js | 95 +-- .../app/services/helpers/crypto.js | 124 ++-- .../app/services/helpers/cryptojs.js | 29 + .../app/services/helpers/webcrypto.js | 113 ++++ vendor/assets/javascripts/transpiled.js | 559 ++++++++++++------ vendor/assets/javascripts/transpiled.js.map | 2 +- 8 files changed, 666 insertions(+), 321 deletions(-) create mode 100644 app/assets/javascripts/app/services/helpers/cryptojs.js create mode 100644 app/assets/javascripts/app/services/helpers/webcrypto.js diff --git a/Gruntfile.js b/Gruntfile.js index 0ecf5b749..3715f65eb 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -70,13 +70,13 @@ module.exports = function(grunt) { }, app: { src: [ + 'app/assets/javascripts/app/services/helpers/*.js', 'app/assets/javascripts/app/*.js', 'app/assets/javascripts/app/frontend/*.js', 'app/assets/javascripts/app/frontend/controllers/*.js', 'app/assets/javascripts/app/frontend/models/**/*.js', 'app/assets/javascripts/app/services/*.js', 'app/assets/javascripts/app/services/directives/*.js', - 'app/assets/javascripts/app/services/helpers/*.js', ], dest: 'vendor/assets/javascripts/app.js', }, diff --git a/app/assets/javascripts/app/app.frontend.js b/app/assets/javascripts/app/app.frontend.js index 6275f1194..35eee9889 100644 --- a/app/assets/javascripts/app/app.frontend.js +++ b/app/assets/javascripts/app/app.frontend.js @@ -2,34 +2,41 @@ var Neeto = Neeto || {}; -angular - .module('app.frontend', [ - 'ui.router', - 'ng-token-auth', - 'restangular', - 'ipCookie', - 'oc.lazyLoad', - 'angularLazyImg', - 'ngDialog' - ]) - // Configure path to API - .config(function (RestangularProvider, apiControllerProvider) { - RestangularProvider.setDefaultHeaders({"Content-Type": "application/json"}); +if(window.crypto.subtle) { + console.log("using WebCrypto"); + Neeto.crypto = new SNCryptoWeb(); +} else { + console.log("using CryptoJS"); + Neeto.crypto = new SNCryptoJS(); +} - var url = apiControllerProvider.defaultServerURL(); - RestangularProvider.setBaseUrl(url); +angular.module('app.frontend', [ + 'ui.router', + 'ng-token-auth', + 'restangular', + 'ipCookie', + 'oc.lazyLoad', + 'angularLazyImg', + 'ngDialog' +]) - RestangularProvider.setFullRequestInterceptor(function(element, operation, route, url, headers, params, httpConfig) { - var token = localStorage.getItem("jwt"); - if(token) { - headers = _.extend(headers, {Authorization: "Bearer " + localStorage.getItem("jwt")}); - } +.config(function (RestangularProvider, apiControllerProvider) { + RestangularProvider.setDefaultHeaders({"Content-Type": "application/json"}); - return { - element: element, - params: params, - headers: headers, - httpConfig: httpConfig - }; - }); - }) + var url = apiControllerProvider.defaultServerURL(); + RestangularProvider.setBaseUrl(url); + + RestangularProvider.setFullRequestInterceptor(function(element, operation, route, url, headers, params, httpConfig) { + var token = localStorage.getItem("jwt"); + if(token) { + headers = _.extend(headers, {Authorization: "Bearer " + localStorage.getItem("jwt")}); + } + + return { + element: element, + params: params, + headers: headers, + httpConfig: httpConfig + }; + }); +}) diff --git a/app/assets/javascripts/app/services/apiController.js b/app/assets/javascripts/app/services/apiController.js index 54079894d..75f22d013 100644 --- a/app/assets/javascripts/app/services/apiController.js +++ b/app/assets/javascripts/app/services/apiController.js @@ -85,65 +85,66 @@ angular.module('app.frontend') this.login = function(email, password, callback) { console.log("login with", email, password); this.getAuthParamsForEmail(email, function(authParams){ - var keys = Neeto.crypto.computeEncryptionKeysForUser(_.merge({email: email, password: password}, authParams)); - this.setGk(keys.gk); - var request = Restangular.one("auth/sign_in"); - request.user = {password: keys.pw, email: email}; - request.post().then(function(response){ - localStorage.setItem("jwt", response.token); - callback(response); - }) + Neeto.crypto.computeEncryptionKeysForUser(_.merge({email: email, password: password}, authParams), function(keys){ + this.setGk(keys.gk); + var request = Restangular.one("auth/sign_in"); + request.user = {password: keys.pw, email: email}; + request.post().then(function(response){ + localStorage.setItem("jwt", response.token); + callback(response); + }) + }.bind(this)); }.bind(this)) } this.register = function(email, password, callback) { - var keys = Neeto.crypto.generateInitialEncryptionKeysForUser({password: password, email: email}); - this.setGk(keys.gk); - keys.gk = null; - var request = Restangular.one("auth"); - request.user = _.merge({password: keys.pw, email: email}, keys); - request.post().then(function(response){ - localStorage.setItem("jwt", response.token); - callback(response); - }) + Neeto.crypto.generateInitialEncryptionKeysForUser({password: password, email: email}, function(keys){ + this.setGk(keys.gk); + keys.gk = null; + var request = Restangular.one("auth"); + request.user = _.merge({password: keys.pw, email: email}, keys); + request.post().then(function(response){ + localStorage.setItem("jwt", response.token); + callback(response); + }) + }.bind(this)); } this.changePassword = function(user, current_password, new_password) { this.getAuthParamsForEmail(email, function(authParams){ + Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: current_password, email: user.email}, authParams), function(currentKeys) { + Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: new_password, email: user.email}, authParams), function(newKeys){ + var data = {}; + data.current_password = currentKeys.pw; + data.password = newKeys.pw; + data.password_confirmation = newKeys.pw; - var current_keys = Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: current_password, email: user.email}, authParams)); - var new_keys = Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: new_password, email: user.email}, authParams)); + var user = this.user; - var data = {}; - data.current_password = current_keys.pw; - data.password = new_keys.pw; - data.password_confirmation = new_keys.pw; - - var user = this.user; - - this._performPasswordChange(current_keys, new_keys, function(response){ - if(response && !response.errors) { - // this.showNewPasswordForm = false; - // reencrypt data with new gk - this.reencryptAllItemsAndSave(user, new_keys.gk, current_keys.gk, function(success){ - if(success) { - this.setGk(new_keys.gk); - alert("Your password has been changed and your data re-encrypted."); + this._performPasswordChange(currentKeys, newKeys, function(response){ + if(response && !response.errors) { + // this.showNewPasswordForm = false; + // reencrypt data with new gk + this.reencryptAllItemsAndSave(user, newKeys.gk, currentKeys.gk, function(success){ + if(success) { + this.setGk(newKeys.gk); + alert("Your password has been changed and your data re-encrypted."); + } else { + // rollback password + this._performPasswordChange(newKeys, currentKeys, function(response){ + alert("There was an error changing your password. Your password has been rolled back."); + window.location.reload(); + }) + } + }.bind(this)); } else { - // rollback password - this._performPasswordChange(new_keys, current_keys, function(response){ - alert("There was an error changing your password. Your password has been rolled back."); - window.location.reload(); - }) + // this.showNewPasswordForm = false; + alert("There was an error changing your password. Please try again."); } - }.bind(this)); - } else { - // this.showNewPasswordForm = false; - alert("There was an error changing your password. Please try again."); - } - }) - - }); + }.bind(this)) + }.bind(this)); + }.bind(this)); + }.bind(this)); } this._performPasswordChange = function(email, current_keys, new_keys, callback) { diff --git a/app/assets/javascripts/app/services/helpers/crypto.js b/app/assets/javascripts/app/services/helpers/crypto.js index a1e6be5e0..79830253e 100644 --- a/app/assets/javascripts/app/services/helpers/crypto.js +++ b/app/assets/javascripts/app/services/helpers/crypto.js @@ -1,84 +1,66 @@ -var Neeto = Neeto || {}; +class SNCrypto { -Neeto.crypto = { + generateRandomKey() { + return CryptoJS.lib.WordArray.random(256/8).toString(); + } - generateRandomKey: function() { - return CryptoJS.lib.WordArray.random(256/8).toString(); - }, - - generateUUID: function() { - var d = new Date().getTime(); - if(window.performance && typeof window.performance.now === "function"){ - d += performance.now(); //use high-precision timer if available - } - var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { - var r = (d + Math.random()*16)%16 | 0; - d = Math.floor(d/16); - return (c=='x' ? r : (r&0x3|0x8)).toString(16); - }); - return uuid; - }, - - decryptText: function(encrypted_content, key) { - return CryptoJS.AES.decrypt(encrypted_content, key).toString(CryptoJS.enc.Utf8); - }, - - encryptText: function(text, key) { - return CryptoJS.AES.encrypt(text, key).toString(); - }, - - generateRandomEncryptionKey: function() { - var salt = Neeto.crypto.generateRandomKey(); - var passphrase = Neeto.crypto.generateRandomKey(); - return CryptoJS.PBKDF2(passphrase, salt, { keySize: 256/32 }).toString(); - }, - - sha256: function(text) { - return CryptoJS.SHA256(text).toString(); - }, - - /** Generates two deterministic keys based on one input */ - generateSymmetricKeyPair: function({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}) { - var algMapping = { - "sha256" : CryptoJS.algo.SHA256, - "sha512" : CryptoJS.algo.SHA512 - } - var fnMapping = { - "pbkdf2" : CryptoJS.PBKDF2 + generateUUID() { + var d = new Date().getTime(); + if(window.performance && typeof window.performance.now === "function"){ + d += performance.now(); //use high-precision timer if available } + var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = (d + Math.random()*16)%16 | 0; + d = Math.floor(d/16); + return (c=='x' ? r : (r&0x3|0x8)).toString(16); + }); + return uuid; + } - var alg = algMapping[pw_alg]; - var kdf = fnMapping[pw_func]; - var output = kdf(password, pw_salt, { keySize: pw_key_size/32, hasher: alg, iterations: pw_cost }).toString(); + decryptText(encrypted_content, key) { + return CryptoJS.AES.decrypt(encrypted_content, key).toString(CryptoJS.enc.Utf8); + } - var outputLength = output.length; - var firstHalf = output.slice(0, outputLength/2); - var secondHalf = output.slice(outputLength/2, outputLength); - return [firstHalf, secondHalf]; - }, + encryptText(text, key) { + return CryptoJS.AES.encrypt(text, key).toString(); + } - computeEncryptionKeysForUser: function({email, password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}) { - var keys = Neeto.crypto.generateSymmetricKeyPair({password: password, pw_salt: pw_salt, - pw_func: pw_func, pw_alg: pw_alg, pw_cost: pw_cost, pw_key_size: pw_key_size}); - var pw = keys[0]; - var gk = keys[1]; + generateRandomEncryptionKey() { + var salt = Neeto.crypto.generateRandomKey(); + var passphrase = Neeto.crypto.generateRandomKey(); + return CryptoJS.PBKDF2(passphrase, salt, { keySize: 256/32 }).toString(); + } - return {pw: pw, gk: gk}; - }, + sha256(text) { + return CryptoJS.SHA256(text).toString(); + } - generateInitialEncryptionKeysForUser: function({email, password} = {}) { + sha1(text) { + return CryptoJS.SHA1(text).toString(); + } + + computeEncryptionKeysForUser({email, password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) { + this.generateSymmetricKeyPair({password: password, pw_salt: pw_salt, + pw_func: pw_func, pw_alg: pw_alg, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(keys){ + var pw = keys[0]; + var gk = keys[1]; + + callback({pw: pw, gk: gk}); + }); + } + + generateInitialEncryptionKeysForUser({email, password} = {}, callback) { var defaults = this.defaultPasswordGenerationParams(); var {pw_func, pw_alg, pw_key_size, pw_cost} = defaults; var pw_nonce = this.generateRandomKey(); - var pw_salt = CryptoJS.SHA1(email + "SN" + pw_nonce).toString(); - var keys = Neeto.crypto.generateSymmetricKeyPair(_.merge({email: email, password: password, pw_salt: pw_salt}, defaults)); - var pw = keys[0]; - var gk = keys[1]; + var pw_salt = this.sha1(email + "SN" + pw_nonce); + this.generateSymmetricKeyPair(_.merge({email: email, password: password, pw_salt: pw_salt}, defaults), function(keys){ + var pw = keys[0]; + var gk = keys[1]; - return _.merge({pw: pw, gk: gk, pw_nonce: pw_nonce}, defaults); - }, - - defaultPasswordGenerationParams: function() { - return {pw_func: "pbkdf2", pw_alg: "sha512", pw_key_size: 512, pw_cost: 3000}; + callback(_.merge({pw: pw, gk: gk, pw_nonce: pw_nonce}, defaults)); + }); } - }; +} + +export { SNCrypto } diff --git a/app/assets/javascripts/app/services/helpers/cryptojs.js b/app/assets/javascripts/app/services/helpers/cryptojs.js new file mode 100644 index 000000000..71017fef3 --- /dev/null +++ b/app/assets/javascripts/app/services/helpers/cryptojs.js @@ -0,0 +1,29 @@ +class SNCryptoJS extends SNCrypto { + + /** Generates two deterministic keys based on one input */ + generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) { + var algMapping = { + "sha256" : CryptoJS.algo.SHA256, + "sha512" : CryptoJS.algo.SHA512 + } + var fnMapping = { + "pbkdf2" : CryptoJS.PBKDF2 + } + + var alg = algMapping[pw_alg]; + var kdf = fnMapping[pw_func]; + var output = kdf(password, pw_salt, { keySize: pw_key_size/32, hasher: alg, iterations: pw_cost }).toString(); + + var outputLength = output.length; + var firstHalf = output.slice(0, outputLength/2); + var secondHalf = output.slice(outputLength/2, outputLength); + callback([firstHalf, secondHalf]) + } + + defaultPasswordGenerationParams() { + return {pw_func: "pbkdf2", pw_alg: "sha512", pw_key_size: 512, pw_cost: 3000}; + } + } + + +export { SNCryptoJS } diff --git a/app/assets/javascripts/app/services/helpers/webcrypto.js b/app/assets/javascripts/app/services/helpers/webcrypto.js new file mode 100644 index 000000000..40199c440 --- /dev/null +++ b/app/assets/javascripts/app/services/helpers/webcrypto.js @@ -0,0 +1,113 @@ +var subtleCrypto = window.crypto.subtle; + +class SNCryptoWeb extends SNCrypto { + + /** + Overrides + */ + defaultPasswordGenerationParams() { + return {pw_func: "pbkdf2", pw_alg: "sha512", pw_key_size: 512, pw_cost: 5000}; + } + + /** Generates two deterministic keys based on one input */ + generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) { + this.stretchPassword({password: password, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(output){ + var outputLength = output.length; + var firstHalf = output.slice(0, outputLength/2); + var secondHalf = output.slice(outputLength/2, outputLength); + callback([firstHalf, secondHalf]); + }) + } + + /** + Internal + */ + + stretchPassword({password, pw_salt, pw_cost, pw_func, pw_alg, pw_key_size} = {}, callback) { + + this.webCryptoImportKey(password, pw_func, function(key){ + console.log("Importing key", password); + + if(!key) { + console.log("Key is null, unable to continue"); + callback(null); + return; + } + + this.webCryptoDeriveBits({key: key, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(key){ + if(!key) { + callback(null); + return; + } + + callback(key); + + }.bind(this)) + }.bind(this)) + } + + webCryptoImportKey(input, pw_func, callback) { + subtleCrypto.importKey( + "raw", + this.stringToArrayBuffer(input), + {name: pw_func.toUpperCase()}, + false, + ["deriveBits"] + ) + .then(function(key){ + callback(key); + }) + .catch(function(err){ + console.error(err); + callback(null); + }); + } + + webCryptoDeriveBits({key, pw_func, pw_alg, pw_salt, pw_cost, pw_key_size} = {}, callback) { + var algMapping = { + "sha256" : "SHA-256", + "sha512" : "SHA-512", + } + var alg = algMapping[pw_alg]; + subtleCrypto.deriveBits( + { + "name": pw_func.toUpperCase(), + salt: this.stringToArrayBuffer(pw_salt), + iterations: pw_cost, + hash: {name: alg}, + }, + key, + pw_key_size + ) + .then(function(bits){ + var key = this.arrayBufferToHexString(new Uint8Array(bits)); + callback(key); + }.bind(this)) + .catch(function(err){ + console.error(err); + callback(null); + }); + } + + stringToArrayBuffer(string) { + var encoder = new TextEncoder("utf-8"); + return encoder.encode(string); + } + + arrayBufferToHexString(arrayBuffer) { + var byteArray = new Uint8Array(arrayBuffer); + var hexString = ""; + var nextHexByte; + + for (var i=0; i 0 && arguments[0] !== undefined ? arguments[0] : {}, + email = _ref.email, + password = _ref.password, + pw_salt = _ref.pw_salt, + pw_func = _ref.pw_func, + pw_alg = _ref.pw_alg, + pw_cost = _ref.pw_cost, + pw_key_size = _ref.pw_key_size; + + var callback = arguments[1]; + + this.generateSymmetricKeyPair({ password: password, pw_salt: pw_salt, + pw_func: pw_func, pw_alg: pw_alg, pw_cost: pw_cost, pw_key_size: pw_key_size }, function (keys) { + var pw = keys[0]; + var gk = keys[1]; + + callback({ pw: pw, gk: gk }); + }); + } + }, { + key: 'generateInitialEncryptionKeysForUser', + value: function generateInitialEncryptionKeysForUser() { + var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + email = _ref2.email, + password = _ref2.password; + + var callback = arguments[1]; + + var defaults = this.defaultPasswordGenerationParams(); + var pw_func = defaults.pw_func, + pw_alg = defaults.pw_alg, + pw_key_size = defaults.pw_key_size, + pw_cost = defaults.pw_cost; + + var pw_nonce = this.generateRandomKey(); + var pw_salt = this.sha1(email + "SN" + pw_nonce); + this.generateSymmetricKeyPair(_.merge({ email: email, password: password, pw_salt: pw_salt }, defaults), function (keys) { + var pw = keys[0]; + var gk = keys[1]; + + callback(_.merge({ pw: pw, gk: gk, pw_nonce: pw_nonce }, defaults)); + }); + } + }]); + + return SNCrypto; +}(); + +exports.SNCrypto = SNCrypto; + +var SNCryptoJS = function (_SNCrypto) { + _inherits(SNCryptoJS, _SNCrypto); + + function SNCryptoJS() { + _classCallCheck(this, SNCryptoJS); + + return _possibleConstructorReturn(this, (SNCryptoJS.__proto__ || Object.getPrototypeOf(SNCryptoJS)).apply(this, arguments)); + } + + _createClass(SNCryptoJS, [{ + key: 'generateSymmetricKeyPair', + + + /** Generates two deterministic keys based on one input */ + value: function generateSymmetricKeyPair() { + var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + password = _ref3.password, + pw_salt = _ref3.pw_salt, + pw_func = _ref3.pw_func, + pw_alg = _ref3.pw_alg, + pw_cost = _ref3.pw_cost, + pw_key_size = _ref3.pw_key_size; + + var callback = arguments[1]; + + var algMapping = { + "sha256": CryptoJS.algo.SHA256, + "sha512": CryptoJS.algo.SHA512 + }; + var fnMapping = { + "pbkdf2": CryptoJS.PBKDF2 + }; + + var alg = algMapping[pw_alg]; + var kdf = fnMapping[pw_func]; + var output = kdf(password, pw_salt, { keySize: pw_key_size / 32, hasher: alg, iterations: pw_cost }).toString(); + + var outputLength = output.length; + var firstHalf = output.slice(0, outputLength / 2); + var secondHalf = output.slice(outputLength / 2, outputLength); + callback([firstHalf, secondHalf]); + } + }, { + key: 'defaultPasswordGenerationParams', + value: function defaultPasswordGenerationParams() { + return { pw_func: "pbkdf2", pw_alg: "sha512", pw_key_size: 512, pw_cost: 3000 }; + } + }]); + + return SNCryptoJS; +}(SNCrypto); + +exports.SNCryptoJS = SNCryptoJS; +var subtleCrypto = window.crypto.subtle; + +var SNCryptoWeb = function (_SNCrypto2) { + _inherits(SNCryptoWeb, _SNCrypto2); + + function SNCryptoWeb() { + _classCallCheck(this, SNCryptoWeb); + + return _possibleConstructorReturn(this, (SNCryptoWeb.__proto__ || Object.getPrototypeOf(SNCryptoWeb)).apply(this, arguments)); + } + + _createClass(SNCryptoWeb, [{ + key: 'defaultPasswordGenerationParams', + + + /** + Overrides + */ + value: function defaultPasswordGenerationParams() { + return { pw_func: "pbkdf2", pw_alg: "sha512", pw_key_size: 512, pw_cost: 5000 }; + } + + /** Generates two deterministic keys based on one input */ + + }, { + key: 'generateSymmetricKeyPair', + value: function generateSymmetricKeyPair() { + var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + password = _ref4.password, + pw_salt = _ref4.pw_salt, + pw_func = _ref4.pw_func, + pw_alg = _ref4.pw_alg, + pw_cost = _ref4.pw_cost, + pw_key_size = _ref4.pw_key_size; + + var callback = arguments[1]; + + this.stretchPassword({ password: password, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size }, function (output) { + var outputLength = output.length; + var firstHalf = output.slice(0, outputLength / 2); + var secondHalf = output.slice(outputLength / 2, outputLength); + callback([firstHalf, secondHalf]); + }); + } + + /** + Internal + */ + + }, { + key: 'stretchPassword', + value: function stretchPassword() { + var _ref5 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + password = _ref5.password, + pw_salt = _ref5.pw_salt, + pw_cost = _ref5.pw_cost, + pw_func = _ref5.pw_func, + pw_alg = _ref5.pw_alg, + pw_key_size = _ref5.pw_key_size; + + var callback = arguments[1]; + + + this.webCryptoImportKey(password, pw_func, function (key) { + console.log("Importing key", password); + + if (!key) { + console.log("Key is null, unable to continue"); + callback(null); + return; + } + + this.webCryptoDeriveBits({ key: key, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size }, function (key) { + if (!key) { + callback(null); + return; + } + + callback(key); + }.bind(this)); + }.bind(this)); + } + }, { + key: 'webCryptoImportKey', + value: function webCryptoImportKey(input, pw_func, callback) { + subtleCrypto.importKey("raw", this.stringToArrayBuffer(input), { name: pw_func.toUpperCase() }, false, ["deriveBits"]).then(function (key) { + callback(key); + }).catch(function (err) { + console.error(err); + callback(null); + }); + } + }, { + key: 'webCryptoDeriveBits', + value: function webCryptoDeriveBits() { + var _ref6 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + key = _ref6.key, + pw_func = _ref6.pw_func, + pw_alg = _ref6.pw_alg, + pw_salt = _ref6.pw_salt, + pw_cost = _ref6.pw_cost, + pw_key_size = _ref6.pw_key_size; + + var callback = arguments[1]; + + var algMapping = { + "sha256": "SHA-256", + "sha512": "SHA-512" + }; + var alg = algMapping[pw_alg]; + subtleCrypto.deriveBits({ + "name": pw_func.toUpperCase(), + salt: this.stringToArrayBuffer(pw_salt), + iterations: pw_cost, + hash: { name: alg } + }, key, pw_key_size).then(function (bits) { + var key = this.arrayBufferToHexString(new Uint8Array(bits)); + callback(key); + }.bind(this)).catch(function (err) { + console.error(err); + callback(null); + }); + } + }, { + key: 'stringToArrayBuffer', + value: function stringToArrayBuffer(string) { + var encoder = new TextEncoder("utf-8"); + return encoder.encode(string); + } + }, { + key: 'arrayBufferToHexString', + value: function arrayBufferToHexString(arrayBuffer) { + var byteArray = new Uint8Array(arrayBuffer); + var hexString = ""; + var nextHexByte; + + for (var i = 0; i < byteArray.byteLength; i++) { + nextHexByte = byteArray[i].toString(16); + if (nextHexByte.length < 2) { + nextHexByte = "0" + nextHexByte; + } + hexString += nextHexByte; + } + return hexString; + } + }]); + + return SNCryptoWeb; +}(SNCrypto); + +exports.SNCryptoWeb = SNCryptoWeb; +'use strict'; + var Neeto = Neeto || {}; -angular.module('app.frontend', ['ui.router', 'ng-token-auth', 'restangular', 'ipCookie', 'oc.lazyLoad', 'angularLazyImg', 'ngDialog']) -// Configure path to API -.config(function (RestangularProvider, apiControllerProvider) { +if (window.crypto.subtle) { + console.log("using WebCrypto"); + Neeto.crypto = new SNCryptoWeb(); +} else { + console.log("using CryptoJS"); + Neeto.crypto = new SNCryptoJS(); +} + +angular.module('app.frontend', ['ui.router', 'ng-token-auth', 'restangular', 'ipCookie', 'oc.lazyLoad', 'angularLazyImg', 'ngDialog']).config(function (RestangularProvider, apiControllerProvider) { RestangularProvider.setDefaultHeaders({ "Content-Type": "application/json" }); var url = apiControllerProvider.defaultServerURL(); @@ -1064,17 +1384,17 @@ var Note = function (_Item) { function Note(json_obj) { _classCallCheck(this, Note); - var _this = _possibleConstructorReturn(this, (Note.__proto__ || Object.getPrototypeOf(Note)).call(this, json_obj)); + var _this3 = _possibleConstructorReturn(this, (Note.__proto__ || Object.getPrototypeOf(Note)).call(this, json_obj)); - if (!_this.tags) { - _this.tags = []; + if (!_this3.tags) { + _this3.tags = []; } - if (!_this.content.title) { - _this.content.title = ""; - _this.content.text = ""; + if (!_this3.content.title) { + _this3.content.title = ""; + _this3.content.text = ""; } - return _this; + return _this3; } _createClass(Note, [{ @@ -1136,16 +1456,16 @@ var Tag = function (_Item2) { function Tag(json_obj) { _classCallCheck(this, Tag); - var _this2 = _possibleConstructorReturn(this, (Tag.__proto__ || Object.getPrototypeOf(Tag)).call(this, json_obj)); + var _this4 = _possibleConstructorReturn(this, (Tag.__proto__ || Object.getPrototypeOf(Tag)).call(this, json_obj)); - if (!_this2.notes) { - _this2.notes = []; + if (!_this4.notes) { + _this4.notes = []; } - if (!_this2.content.title) { - _this2.content.title = ""; + if (!_this4.content.title) { + _this4.content.title = ""; } - return _this2; + return _this4; } _createClass(Tag, [{ @@ -1259,10 +1579,24 @@ var User = function User(json_obj) { this.login = function (email, password, callback) { console.log("login with", email, password); this.getAuthParamsForEmail(email, function (authParams) { - var keys = Neeto.crypto.computeEncryptionKeysForUser(_.merge({ email: email, password: password }, authParams)); + Neeto.crypto.computeEncryptionKeysForUser(_.merge({ email: email, password: password }, authParams), function (keys) { + this.setGk(keys.gk); + var request = Restangular.one("auth/sign_in"); + request.user = { password: keys.pw, email: email }; + request.post().then(function (response) { + localStorage.setItem("jwt", response.token); + callback(response); + }); + }.bind(this)); + }.bind(this)); + }; + + this.register = function (email, password, callback) { + Neeto.crypto.generateInitialEncryptionKeysForUser({ password: password, email: email }, function (keys) { this.setGk(keys.gk); - var request = Restangular.one("auth/sign_in"); - request.user = { password: keys.pw, email: email }; + keys.gk = null; + var request = Restangular.one("auth"); + request.user = _.merge({ password: keys.pw, email: email }, keys); request.post().then(function (response) { localStorage.setItem("jwt", response.token); callback(response); @@ -1270,53 +1604,41 @@ var User = function User(json_obj) { }.bind(this)); }; - this.register = function (email, password, callback) { - var keys = Neeto.crypto.generateInitialEncryptionKeysForUser({ password: password, email: email }); - this.setGk(keys.gk); - keys.gk = null; - var request = Restangular.one("auth"); - request.user = _.merge({ password: keys.pw, email: email }, keys); - request.post().then(function (response) { - localStorage.setItem("jwt", response.token); - callback(response); - }); - }; - this.changePassword = function (user, current_password, new_password) { this.getAuthParamsForEmail(email, function (authParams) { + Neeto.crypto.computeEncryptionKeysForUser(_.merge({ password: current_password, email: user.email }, authParams), function (currentKeys) { + Neeto.crypto.computeEncryptionKeysForUser(_.merge({ password: new_password, email: user.email }, authParams), function (newKeys) { + var data = {}; + data.current_password = currentKeys.pw; + data.password = newKeys.pw; + data.password_confirmation = newKeys.pw; - var current_keys = Neeto.crypto.computeEncryptionKeysForUser(_.merge({ password: current_password, email: user.email }, authParams)); - var new_keys = Neeto.crypto.computeEncryptionKeysForUser(_.merge({ password: new_password, email: user.email }, authParams)); + var user = this.user; - var data = {}; - data.current_password = current_keys.pw; - data.password = new_keys.pw; - data.password_confirmation = new_keys.pw; - - var user = this.user; - - this._performPasswordChange(current_keys, new_keys, function (response) { - if (response && !response.errors) { - // this.showNewPasswordForm = false; - // reencrypt data with new gk - this.reencryptAllItemsAndSave(user, new_keys.gk, current_keys.gk, function (success) { - if (success) { - this.setGk(new_keys.gk); - alert("Your password has been changed and your data re-encrypted."); + this._performPasswordChange(currentKeys, newKeys, function (response) { + if (response && !response.errors) { + // this.showNewPasswordForm = false; + // reencrypt data with new gk + this.reencryptAllItemsAndSave(user, newKeys.gk, currentKeys.gk, function (success) { + if (success) { + this.setGk(newKeys.gk); + alert("Your password has been changed and your data re-encrypted."); + } else { + // rollback password + this._performPasswordChange(newKeys, currentKeys, function (response) { + alert("There was an error changing your password. Your password has been rolled back."); + window.location.reload(); + }); + } + }.bind(this)); } else { - // rollback password - this._performPasswordChange(new_keys, current_keys, function (response) { - alert("There was an error changing your password. Your password has been rolled back."); - window.location.reload(); - }); + // this.showNewPasswordForm = false; + alert("There was an error changing your password. Please try again."); } }.bind(this)); - } else { - // this.showNewPasswordForm = false; - alert("There was an error changing your password. Please try again."); - } - }); - }); + }.bind(this)); + }.bind(this)); + }.bind(this)); }; this._performPasswordChange = function (email, current_keys, new_keys, callback) { @@ -1808,12 +2130,12 @@ var ModelManager = function (_ItemManager) { function ModelManager() { _classCallCheck(this, ModelManager); - var _this3 = _possibleConstructorReturn(this, (ModelManager.__proto__ || Object.getPrototypeOf(ModelManager)).call(this)); + var _this5 = _possibleConstructorReturn(this, (ModelManager.__proto__ || Object.getPrototypeOf(ModelManager)).call(this)); - _this3.notes = []; - _this3.groups = []; - _this3.dirtyItems = []; - return _this3; + _this5.notes = []; + _this5.groups = []; + _this5.dirtyItems = []; + return _this5; } _createClass(ModelManager, [{ @@ -2277,115 +2599,6 @@ angular.module('app.frontend').directive('typewrite', ['$timeout', function ($ti } }; }]); -;var Neeto = Neeto || {}; - -Neeto.crypto = { - - generateRandomKey: function generateRandomKey() { - return CryptoJS.lib.WordArray.random(256 / 8).toString(); - }, - - generateUUID: function generateUUID() { - var d = new Date().getTime(); - if (window.performance && typeof window.performance.now === "function") { - d += performance.now(); //use high-precision timer if available - } - var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { - var r = (d + Math.random() * 16) % 16 | 0; - d = Math.floor(d / 16); - return (c == 'x' ? r : r & 0x3 | 0x8).toString(16); - }); - return uuid; - }, - - decryptText: function decryptText(encrypted_content, key) { - return CryptoJS.AES.decrypt(encrypted_content, key).toString(CryptoJS.enc.Utf8); - }, - - encryptText: function encryptText(text, key) { - return CryptoJS.AES.encrypt(text, key).toString(); - }, - - generateRandomEncryptionKey: function generateRandomEncryptionKey() { - var salt = Neeto.crypto.generateRandomKey(); - var passphrase = Neeto.crypto.generateRandomKey(); - return CryptoJS.PBKDF2(passphrase, salt, { keySize: 256 / 32 }).toString(); - }, - - sha256: function sha256(text) { - return CryptoJS.SHA256(text).toString(); - }, - - /** Generates two deterministic keys based on one input */ - generateSymmetricKeyPair: function generateSymmetricKeyPair() { - var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, - password = _ref.password, - pw_salt = _ref.pw_salt, - pw_func = _ref.pw_func, - pw_alg = _ref.pw_alg, - pw_cost = _ref.pw_cost, - pw_key_size = _ref.pw_key_size; - - var algMapping = { - "sha256": CryptoJS.algo.SHA256, - "sha512": CryptoJS.algo.SHA512 - }; - var fnMapping = { - "pbkdf2": CryptoJS.PBKDF2 - }; - - var alg = algMapping[pw_alg]; - var kdf = fnMapping[pw_func]; - var output = kdf(password, pw_salt, { keySize: pw_key_size / 32, hasher: alg, iterations: pw_cost }).toString(); - - var outputLength = output.length; - var firstHalf = output.slice(0, outputLength / 2); - var secondHalf = output.slice(outputLength / 2, outputLength); - return [firstHalf, secondHalf]; - }, - - computeEncryptionKeysForUser: function computeEncryptionKeysForUser() { - var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, - email = _ref2.email, - password = _ref2.password, - pw_salt = _ref2.pw_salt, - pw_func = _ref2.pw_func, - pw_alg = _ref2.pw_alg, - pw_cost = _ref2.pw_cost, - pw_key_size = _ref2.pw_key_size; - - var keys = Neeto.crypto.generateSymmetricKeyPair({ password: password, pw_salt: pw_salt, - pw_func: pw_func, pw_alg: pw_alg, pw_cost: pw_cost, pw_key_size: pw_key_size }); - var pw = keys[0]; - var gk = keys[1]; - - return { pw: pw, gk: gk }; - }, - - generateInitialEncryptionKeysForUser: function generateInitialEncryptionKeysForUser() { - var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, - email = _ref3.email, - password = _ref3.password; - - var defaults = this.defaultPasswordGenerationParams(); - var pw_func = defaults.pw_func, - pw_alg = defaults.pw_alg, - pw_key_size = defaults.pw_key_size, - pw_cost = defaults.pw_cost; - - var pw_nonce = this.generateRandomKey(); - var pw_salt = CryptoJS.SHA1(email + "SN" + pw_nonce).toString(); - var keys = Neeto.crypto.generateSymmetricKeyPair(_.merge({ email: email, password: password, pw_salt: pw_salt }, defaults)); - var pw = keys[0]; - var gk = keys[1]; - - return _.merge({ pw: pw, gk: gk, pw_nonce: pw_nonce }, defaults); - }, - - defaultPasswordGenerationParams: function defaultPasswordGenerationParams() { - return { pw_func: "pbkdf2", pw_alg: "sha512", pw_key_size: 512, pw_cost: 3000 }; - } -}; },{}]},{},[1]); diff --git a/vendor/assets/javascripts/transpiled.js.map b/vendor/assets/javascripts/transpiled.js.map index 718f4283f..0ae0ca42f 100644 --- a/vendor/assets/javascripts/transpiled.js.map +++ b/vendor/assets/javascripts/transpiled.js.map @@ -1 +1 @@ -{"version":3,"sources":["app.js"],"names":["Neeto","angular","module","config","RestangularProvider","apiControllerProvider","setDefaultHeaders","url","defaultServerURL","setBaseUrl","setFullRequestInterceptor","element","operation","route","headers","params","httpConfig","token","localStorage","getItem","_","extend","Authorization","$stateProvider","$urlRouterProvider","$locationProvider","state","abstract","parent","views","templateUrl","controller","$rootScope","$stateParams","resetData","reset_password_token","email","$on","event","toState","toParams","fromState","fromParams","options","otherwise","$injector","$location","get","go","path","html5Mode","BaseCtrl","modelManager","directive","$timeout","restrict","scope","save","remove","note","user","replace","controllerAs","bindToController","link","elem","attrs","ctrl","handler","ctrlKey","metaKey","String","fromCharCode","which","toLowerCase","preventDefault","saveNote","clickedEditNote","toggleMarkdown","toggleFullScreen","window","addEventListener","removeEventListener","$watch","oldNote","setNote","$sce","apiController","markdownRenderer","demoNotes","title","content","showSampler","uuid","filteredNotes","length","demoNoteNames","map","currentDemoContent","text","prebeginFn","bind","callback","index","contentCallback","editorMode","focusTitle","hasChanges","dummy","onPreviewDoubleClick","focusEditor","delay","setTimeout","document","getElementById","focus","clickedTextArea","showMenu","renderedContent","renderHtml","renderedContentForText","statusTimeout","$event","success","clearDraft","cancel","noteStatus","saveTitle","target","blur","saveTimeout","changesMade","saveDraftToDisk","contentChanged","nameChanged","onNameFocus","editingName","onContentFocus","$broadcast","editingUrl","onNameBlur","fullscreen","selectedMenuItem","editUrlPressed","publicUrlForNote","presentation_name","base","saveUrl","original","saveItems","response","alert","shareNote","openInNewTab","a","createElement","href","click","shareItem","unshareNote","unshareItem","presentationURL","clickedMenu","locked","deleteNote","logout","$auth","$state","serverSideValidation","changePasswordPressed","showNewPasswordForm","accountMenuPressed","serverData","getServer","showAccountMenu","showFaq","changeServer","setServer","signOutPressed","signout","location","reload","submitPasswordChange","passwordChangeData","status","data","password","password_confirmation","changePassword","current_password","new_password","hasLocalData","mergeLocalChanged","shouldMerge","confirm","loginSubmitPressed","loginData","login","user_password","errors","onAuthSuccess","submitRegistrationForm","register","forgotPasswordSubmit","requestPasswordReset","then","resp","catch","encryptionStatusForNotes","allNotes","countEncrypted","forEach","encryptionEnabled","downloadDataArchive","setAttribute","itemsDataFile","importFileSelected","files","file","reader","FileReader","onload","e","importJSONData","result","console","log","readAsText","mergeLocalDataRemotely","showLogin","showRegistration","$scope","bodyClass","description","onUserSet","setUser","defaultUser","allTag","Tag","all","tags","getCurrentUser","items","User","localUser","updateAllTag","notes","tagsWillMakeSelection","tag","tagsSelectionMade","selectedTag","tagsAddNew","addTag","tagsSave","tagsUpdateNoteTag","noteCopy","newTag","oldTag","originalNote","find","addTagToNote","saveDirtyItems","notesRemoveTag","validNotes","Note","filterDummyNotes","deleteItem","notesSelectionMade","selectedNote","notesAddNew","addNote","unshift","addDirtyItems","headerLogout","addNew","selectionMade","removeTag","tagDidChange","isFirstLoad","noteFilter","visible","selectFirstNote","draft","getDraft","selectNote","createNewNote","selectedTagDelete","selectedTagShare","selectedTagUnshare","createNew","visibleNotes","filter","newNote","filterNotes","includes","filterTextChanged","willSelect","updateNoteTag","newTags","setTags","setAllTag","initialLoad","selectTag","clickedAddNewTag","editingTag","originalTagName","onTagTitleFocus","tagTitleDidChange","saveTag","savedTag","noteCount","handleDrop","Restangular","formData","saveUsername","setUsername","username","closeThisDialog","Item","json_obj","Object","defineProperty","set","value","finalValue","decodedValue","JSON","parse","enumerable","merge","crypto","generateUUID","setContentRaw","rawContent","references","reference","push","uniq","updateReferencesLocalMapping","contentType","content_type","item","omit","loc_eek","presentation_url","referencesMatchingContentType","hasOnePublicTag","hasPublicTag","isPublic","filtered","provider","domainName","domain_comps","hostname","split","domain","protocol","port","$get","ngDialog","ApiController","refresh","setItem","getAuthParamsForEmail","request","one","plain","decryptItemsWithLocalKey","mapResponseItemsToLocalModels","error","authParams","keys","computeEncryptionKeysForUser","setGk","gk","pw","post","generateInitialEncryptionKeysForUser","current_keys","new_keys","_performPasswordChange","reencryptAllItemsAndSave","patch","verifyEncryptionStatusOfAllItems","allItems","filteredItems","itemsNeedingUpdate","isEncrypted","saveBatchItems","dirtyItems","clearDirtyItems","createRequestParamsForItem","savedItems","savedCounterpart","mergeMetadataFromItem","paramsForItem","encrypted","additionalFields","forExportFile","itemCopy","cloneDeep","encryptSingleItem","retrieveGk","stringify","pick","writeUserToLocalStorage","shareFn","needsUpdate","concat","referencesAffectedBySharingChange","open","template","resolve","className","disableAnimation","jsonString","customModelManager","ModelManager","textFile","makeTextFile","Blob","type","URL","revokeObjectURL","createObjectURL","tag_id","tag_name","removeItem","staticifyObject","object","saveUser","filterDummyItems","writeToLocalStorage","key","toJson","draftString","ek","decryptText","generateRandomEncryptionKey","encryptText","local_encryption_scheme","encryptItems","encryptSingleItemWithLocalKey","encryptItemsWithLocalKey","encryptNonPublicItemsWithLocalKey","nonpublic","pending_share","decryptSingleItemWithLocalKey","decryptSingleItem","local_eek","decryptItems","newKey","oldKey","ItemManager","itemId","reduce","accumulator","referencesForItemId","dirty","i","referencedItem","_dirty","removeReferencesBetweenItems","itemOne","itemTwo","removeReference","addReference","_items","resolveReferences","service","marked","setOptions","breaks","sanitize","html_code","trustAsHtml","groups","Array","createReferencesBetweenItems","refreshRelationshipsForTag","refreshRelationshipsForNote","sort","b","Date","created_at","itemsForContentType","showErrors","formErrors","form","$setDirty","$setValidity","$error","server","join","parseErrors","shouldFocus","$element","el","draggable","dataTransfer","effectAllowed","setData","classList","add","drop","bin","dropEffect","counter","stopPropagation","binId","getData","$apply","fn","on","require","modelCtrl","lowercase","inputValue","undefined","lowercased","$setViewValue","$render","$parsers","ngModel","$window","getSelection","toString","setSelectionRange","linkFunction","$attrs","timer","initialDelay","getTypeDelay","typeDelay","eraseDelay","blinkDelay","getAnimationDelay","cursor","blinkCursor","currentText","textArray","running","auxStyle","start","typewrite","updateIt","charIndex","arrIndex","updateValue","substring","iterationCallback","cleanAndRestart","iterationDelay","callbackFn","blinkIt","slice","charAt","parseInt","prop","toUpperCase","val","html","newVal","oldVal","generateRandomKey","CryptoJS","lib","WordArray","random","d","getTime","performance","now","c","r","Math","floor","encrypted_content","AES","decrypt","enc","Utf8","encrypt","salt","passphrase","PBKDF2","keySize","sha256","SHA256","generateSymmetricKeyPair","pw_salt","pw_func","pw_alg","pw_cost","pw_key_size","algMapping","algo","SHA512","fnMapping","alg","kdf","output","hasher","iterations","outputLength","firstHalf","secondHalf","defaults","defaultPasswordGenerationParams","pw_nonce","SHA1"],"mappings":"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","file":"transpiled.js","sourcesContent":["'use strict';\n\nvar Neeto = Neeto || {};\n\nangular\n .module('app.frontend', [\n 'ui.router',\n 'ng-token-auth',\n 'restangular',\n 'ipCookie',\n 'oc.lazyLoad',\n 'angularLazyImg',\n 'ngDialog'\n ])\n // Configure path to API\n .config(function (RestangularProvider, apiControllerProvider) {\n RestangularProvider.setDefaultHeaders({\"Content-Type\": \"application/json\"});\n\n var url = apiControllerProvider.defaultServerURL();\n RestangularProvider.setBaseUrl(url);\n\n RestangularProvider.setFullRequestInterceptor(function(element, operation, route, url, headers, params, httpConfig) {\n var token = localStorage.getItem(\"jwt\");\n if(token) {\n headers = _.extend(headers, {Authorization: \"Bearer \" + localStorage.getItem(\"jwt\")});\n }\n\n return {\n element: element,\n params: params,\n headers: headers,\n httpConfig: httpConfig\n };\n });\n })\n;angular.module('app.frontend')\n .config(function ($stateProvider, $urlRouterProvider, $locationProvider) {\n\n $stateProvider\n .state('base', {\n abstract: true,\n })\n\n // Homepage\n .state('home', {\n url: '/',\n parent: 'base',\n views: {\n 'content@' : {\n templateUrl: 'frontend/home.html',\n controller: 'HomeCtrl'\n }\n }\n })\n\n // Auth routes\n .state('auth', {\n abstract: true,\n url: '/auth',\n parent: 'base',\n views: {\n 'content@' : {\n templateUrl: 'frontend/auth/wrapper.html',\n }\n }\n })\n .state('auth.login', {\n url: '/login',\n templateUrl: 'frontend/auth/login.html',\n })\n .state('auth.forgot', {\n url: '/forgot',\n templateUrl: 'frontend/auth/forgot.html',\n })\n .state('auth.reset', {\n url: '/reset?reset_password_token&email',\n templateUrl: 'frontend/auth/reset.html',\n controller: function($rootScope, $stateParams) {\n $rootScope.resetData = {reset_password_token: $stateParams.reset_password_token, email: $stateParams.email};\n\n // Clear reset_password_token on change state\n $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams, options) {\n $rootScope.reset_password_token = null;\n });\n },\n })\n\n\n // 404 Error\n .state('404', {\n parent: 'base',\n views: {\n 'content@' : {\n templateUrl: 'frontend/errors/404.html'\n }\n }\n });\n\n // Default fall back route\n $urlRouterProvider.otherwise(function($injector, $location){\n var state = $injector.get('$state');\n state.go('404');\n return $location.path();\n });\n\n // enable HTML5 Mode for SEO\n $locationProvider.html5Mode(true);\n\n });\n;class BaseCtrl {\n constructor($rootScope, modelManager) {\n // $rootScope.resetPasswordSubmit = function() {\n // var new_keys = Neeto.crypto.generateEncryptionKeysForUser($rootScope.resetData.password, $rootScope.resetData.email);\n // var data = _.clone($rootScope.resetData);\n // data.password = new_keys.pw;\n // data.password_confirmation = new_keys.pw;\n // $auth.updatePassword(data);\n // apiController.setGk(new_keys.gk);\n // }\n\n // var note = new Note();\n // note.content = {title: \"hello\", text: \"world\"};\n // console.log(\"note content\", note.content);\n // console.log(\"note title\", note.title);\n // console.log(\"note json\", JSON.stringify(note));\n //\n // console.log(\"Copy\", _.cloneDeep(note));\n }\n}\n\nangular.module('app.frontend').controller('BaseCtrl', BaseCtrl);\n;angular.module('app.frontend')\n .directive(\"editorSection\", function($timeout){\n return {\n restrict: 'E',\n scope: {\n save: \"&\",\n remove: \"&\",\n note: \"=\",\n user: \"=\"\n },\n templateUrl: 'frontend/editor.html',\n replace: true,\n controller: 'EditorCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n\n var handler = function(event) {\n if (event.ctrlKey || event.metaKey) {\n switch (String.fromCharCode(event.which).toLowerCase()) {\n case 's':\n event.preventDefault();\n $timeout(function(){\n ctrl.saveNote(event);\n });\n break;\n case 'e':\n event.preventDefault();\n $timeout(function(){\n ctrl.clickedEditNote();\n })\n break;\n case 'm':\n event.preventDefault();\n $timeout(function(){\n ctrl.toggleMarkdown();\n })\n break;\n case 'o':\n event.preventDefault();\n $timeout(function(){\n ctrl.toggleFullScreen();\n })\n break;\n }\n }\n };\n\n window.addEventListener('keydown', handler);\n\n scope.$on('$destroy', function(){\n window.removeEventListener('keydown', handler);\n })\n\n scope.$watch('ctrl.note', function(note, oldNote){\n if(note) {\n ctrl.setNote(note, oldNote);\n } else {\n ctrl.note = {};\n }\n });\n }\n }\n })\n .controller('EditorCtrl', function ($sce, $timeout, apiController, modelManager, markdownRenderer, $rootScope) {\n\n this.demoNotes = [\n {title: \"Live print a file with tail\", content: \"tail -f log/production.log\"},\n {title: \"Create SSH tunnel\", content: \"ssh -i .ssh/key.pem -N -L 3306:example.com:3306 ec2-user@example.com\"},\n {title: \"List of processes running on port\", content: \"lsof -i:8080\"},\n {title: \"Set ENV from file\", content: \"export $(cat .envfile | xargs)\"},\n {title: \"Find process by name\", content: \"ps -ax | grep \"},\n {title: \"NPM install without sudo\", content: \"sudo chown -R $(whoami) ~/.npm\"},\n {title: \"Email validation regex\", content: \"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$\"},\n {title: \"Ruby generate 256 bit key\", content: \"Digest::SHA256.hexdigest(SecureRandom.random_bytes(32))\"},\n {title: \"Mac add user to user tag\", content: \"sudo dsedittag -o edit -a USERNAME -t user GROUPNAME\"},\n {title: \"Kill Mac OS System Apache\", content: \"sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist\"},\n {title: \"Docker run with mount binding and port\", content: \"docker run -v /home/vagrant/www/app:/var/www/app -p 8080:80 -d kpi/s3\"},\n {title: \"MySQL grant privileges\", content: \"GRANT [type of permission] ON [database name].[table name] TO ‘[username]’@'%’;\"},\n {title: \"MySQL list users\", content: \"SELECT User FROM mysql.user;\"},\n ];\n\n this.showSampler = !this.user.uuid && modelManager.filteredNotes.length == 0;\n\n this.demoNoteNames = _.map(this.demoNotes, function(note){\n return note.title;\n });\n\n this.currentDemoContent = {text: null};\n\n this.prebeginFn = function() {\n this.currentDemoContent.text = null;\n }.bind(this)\n\n this.callback = function(index) {\n this.currentDemoContent.text = this.demoNotes[index].text;\n }.bind(this)\n\n this.contentCallback = function(index) {\n }\n\n this.setNote = function(note, oldNote) {\n this.editorMode = 'edit';\n if(note.content.text.length == 0) {\n this.focusTitle(100);\n }\n\n if(oldNote && oldNote != note) {\n if(oldNote.hasChanges) {\n this.save()(oldNote, null);\n } else if(oldNote.dummy) {\n this.remove()(oldNote);\n }\n }\n }\n\n this.onPreviewDoubleClick = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n this.focusEditor = function(delay) {\n setTimeout(function(){\n var element = document.getElementById(\"note-text-editor\");\n element.focus();\n }, delay)\n }\n\n this.focusTitle = function(delay) {\n setTimeout(function(){\n document.getElementById(\"note-title-editor\").focus();\n }, delay)\n }\n\n this.clickedTextArea = function() {\n this.showMenu = false;\n }\n\n this.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText(this.note.content.text));\n }\n\n var statusTimeout;\n\n this.saveNote = function($event) {\n var note = this.note;\n note.dummy = false;\n this.save()(note, function(success){\n if(success) {\n apiController.clearDraft();\n\n if(statusTimeout) $timeout.cancel(statusTimeout);\n statusTimeout = $timeout(function(){\n this.noteStatus = \"All changes saved\"\n }.bind(this), 200)\n }\n }.bind(this));\n }\n\n this.saveTitle = function($event) {\n $event.target.blur();\n this.saveNote($event);\n this.focusEditor();\n }\n\n var saveTimeout;\n this.changesMade = function() {\n this.note.hasChanges = true;\n this.note.dummy = false;\n apiController.saveDraftToDisk(this.note);\n\n if(saveTimeout) $timeout.cancel(saveTimeout);\n if(statusTimeout) $timeout.cancel(statusTimeout);\n saveTimeout = $timeout(function(){\n this.noteStatus = \"Saving...\";\n this.saveNote();\n }.bind(this), 150)\n }\n\n\n this.contentChanged = function() {\n this.changesMade();\n }\n\n this.nameChanged = function() {\n this.changesMade();\n }\n\n this.onNameFocus = function() {\n this.editingName = true;\n }\n\n this.onContentFocus = function() {\n this.showSampler = false;\n $rootScope.$broadcast(\"editorFocused\");\n this.editingUrl = false;\n }\n\n this.onNameBlur = function() {\n this.editingName = false;\n }\n\n this.toggleFullScreen = function() {\n this.fullscreen = !this.fullscreen;\n if(this.fullscreen) {\n if(this.editorMode == 'edit') {\n // refocus\n this.focusEditor(0);\n }\n } else {\n\n }\n }\n\n this.selectedMenuItem = function() {\n this.showMenu = false;\n }\n\n this.toggleMarkdown = function() {\n if(this.editorMode == 'preview') {\n this.editorMode = 'edit';\n } else {\n this.editorMode = 'preview';\n }\n }\n\n this.editUrlPressed = function() {\n this.showMenu = false;\n var url = this.publicUrlForNote(this.note);\n url = url.replace(this.note.presentation_name, \"\");\n this.url = {base: url, token : this.note.presentation_name};\n this.editingUrl = true;\n }\n\n this.saveUrl = function($event) {\n $event.target.blur();\n\n var original = this.note.presentation_name;\n this.note.presentation_name = this.url.token;\n\n apiController.saveItems([this.note], function(response){\n if(!response) {\n this.note.presentation_name = original;\n this.url.token = original;\n alert(\"This URL is not available.\");\n } else {\n this.editingUrl = false;\n }\n }.bind(this))\n }\n\n this.shareNote = function() {\n\n function openInNewTab(url) {\n var a = document.createElement(\"a\");\n a.target = \"_blank\";\n a.href = url;\n a.click();\n }\n\n apiController.shareItem(this.note, function(note){\n openInNewTab(this.publicUrlForNote(note));\n }.bind(this))\n this.showMenu = false;\n }\n\n this.unshareNote = function() {\n apiController.unshareItem(this.note, function(note){\n\n })\n this.showMenu = false;\n }\n\n this.publicUrlForNote = function() {\n return this.note.presentationURL();\n }\n\n this.clickedMenu = function() {\n if(this.note.locked) {\n alert(\"This note has been shared without an account, and can therefore not be changed.\")\n } else {\n this.showMenu = !this.showMenu;\n }\n }\n\n this.deleteNote = function() {\n apiController.clearDraft();\n this.remove()(this.note);\n this.showMenu = false;\n }\n\n this.clickedEditNote = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n });\n;angular.module('app.frontend')\n .directive(\"header\", function(){\n return {\n restrict: 'E',\n scope: {\n user: \"=\",\n logout: \"&\"\n },\n templateUrl: 'frontend/header.html',\n replace: true,\n controller: 'HeaderCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n\n }\n }\n })\n .controller('HeaderCtrl', function ($auth, $state, apiController, modelManager, serverSideValidation, $timeout) {\n\n this.changePasswordPressed = function() {\n this.showNewPasswordForm = !this.showNewPasswordForm;\n }\n\n this.accountMenuPressed = function() {\n this.serverData = {url: apiController.getServer()};\n this.showAccountMenu = !this.showAccountMenu;\n this.showFaq = false;\n this.showNewPasswordForm = false;\n }\n\n this.changeServer = function() {\n apiController.setServer(this.serverData.url, true);\n }\n\n this.signOutPressed = function() {\n this.showAccountMenu = false;\n this.logout()();\n apiController.signout();\n window.location.reload();\n }\n\n this.submitPasswordChange = function() {\n this.passwordChangeData.status = \"Generating New Keys...\";\n\n $timeout(function(){\n if(data.password != data.password_confirmation) {\n alert(\"Your new password does not match its confirmation.\");\n return;\n }\n\n apiController.changePassword(this.user, this.passwordChangeData.current_password, this.passwordChangeData.new_password, function(response){\n\n })\n\n }.bind(this))\n }\n\n this.hasLocalData = function() {\n return modelManager.filteredNotes.length > 0;\n }\n\n this.mergeLocalChanged = function() {\n if(!this.user.shouldMerge) {\n if(!confirm(\"Unchecking this option means any locally stored tags and notes you have now will be deleted. Are you sure you want to continue?\")) {\n this.user.shouldMerge = true;\n }\n }\n }\n\n this.loginSubmitPressed = function() {\n this.loginData.status = \"Generating Login Keys...\";\n $timeout(function(){\n apiController.login(this.loginData.email, this.loginData.user_password, function(response){\n if(response.errors) {\n this.loginData.status = response.errors[0];\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.submitRegistrationForm = function() {\n this.loginData.status = \"Generating Account Keys...\";\n\n $timeout(function(){\n apiController.register(this.loginData.email, this.loginData.user_password, function(response){\n if(response.errors) {\n this.loginData.status = response.errors[0];\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.forgotPasswordSubmit = function() {\n $auth.requestPasswordReset(this.resetData)\n .then(function(resp) {\n this.resetData.response = \"Success\";\n // handle success response\n }.bind(this))\n .catch(function(resp) {\n // handle error response\n this.resetData.response = \"Error\";\n }.bind(this));\n }\n\n this.encryptionStatusForNotes = function() {\n var allNotes = modelManager.filteredNotes;\n var countEncrypted = 0;\n allNotes.forEach(function(note){\n if(note.encryptionEnabled()) {\n countEncrypted++;\n }\n }.bind(this))\n\n return countEncrypted + \"/\" + allNotes.length + \" notes encrypted\";\n }\n\n this.downloadDataArchive = function() {\n var link = document.createElement('a');\n link.setAttribute('download', 'neeto.json');\n link.href = apiController.itemsDataFile();\n link.click();\n }\n\n this.importFileSelected = function(files) {\n var file = files[0];\n var reader = new FileReader();\n reader.onload = function(e) {\n apiController.importJSONData(e.target.result, function(success, response){\n console.log(\"import response\", success, response);\n if(success) {\n // window.location.reload();\n } else {\n alert(\"There was an error importing your data. Please try again.\");\n }\n })\n }\n reader.readAsText(file);\n }\n\n this.onAuthSuccess = function(user) {\n this.user.uuid = user.uuid;\n\n if(this.user.shouldMerge && this.hasLocalData()) {\n apiController.mergeLocalDataRemotely(this.user, function(){\n window.location.reload();\n });\n } else {\n window.location.reload();\n }\n\n this.showLogin = false;\n this.showRegistration = false;\n }\n\n });\n;angular.module('app.frontend')\n.controller('HomeCtrl', function ($scope, $rootScope, $timeout, apiController, modelManager) {\n $rootScope.bodyClass = \"app-body-class\";\n $rootScope.title = \"Notes — Neeto, a secure code box for developers\";\n $rootScope.description = \"A secure code box for developers to store common commands and useful notes.\";\n\n var onUserSet = function() {\n apiController.setUser($scope.defaultUser);\n $scope.allTag = new Tag({all: true});\n $scope.allTag.content.title = \"All\";\n $scope.tags = modelManager.tags;\n\n // apiController.verifyEncryptionStatusOfAllItems($scope.defaultUser, function(success){});\n }\n\n apiController.getCurrentUser(function(user, items){\n if(user && items) {\n console.log(\"Get user response\", user, items);\n $scope.defaultUser = user;\n modelManager.items = items;\n $rootScope.title = \"Notes — Neeto\";\n onUserSet();\n } else {\n $scope.defaultUser = new User(apiController.localUser());\n onUserSet();\n }\n });\n\n /*\n Tags Ctrl Callbacks\n */\n\n $scope.updateAllTag = function() {\n $scope.allTag.notes = modelManager.filteredNotes;\n }\n\n $scope.tagsWillMakeSelection = function(tag) {\n if(tag.all) {\n $scope.updateAllTag();\n }\n }\n\n $scope.tagsSelectionMade = function(tag) {\n $scope.selectedTag = tag;\n }\n\n $scope.tagsAddNew = function(tag) {\n modelManager.addTag(tag);\n }\n\n $scope.tagsSave = function(tag, callback) {\n apiController.saveItems([tag], callback);\n }\n\n /*\n Called to update the tag of a note after drag and drop change\n The note object is a copy of the original\n */\n $scope.tagsUpdateNoteTag = function(noteCopy, newTag, oldTag) {\n\n var originalNote = _.find(modelManager.notes, {uuid: noteCopy.uuid});\n if(!newTag.all) {\n modelManager.addTagToNote(newTag, originalNote);\n }\n\n apiController.saveDirtyItems(function(){});\n }\n\n /*\n Notes Ctrl Callbacks\n */\n\n $scope.notesRemoveTag = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n if(validNotes == 0) {\n // if no more notes, delete tag\n apiController.deleteItem($scope.defaultUser, tag, function(){\n // force scope tags to update on sub directives\n $scope.tags = [];\n $timeout(function(){\n $scope.tags = modelManager.tags;\n })\n });\n } else {\n alert(\"To delete this tag, remove all its notes first.\");\n }\n }\n\n $scope.notesSelectionMade = function(note) {\n $scope.selectedNote = note;\n }\n\n $scope.notesAddNew = function(note) {\n modelManager.addNote(note);\n\n if(!$scope.selectedTag.all) {\n modelManager.addTagToNote($scope.selectedTag, note);\n $scope.updateAllTag();\n } else {\n $scope.selectedTag.notes.unshift(note);\n }\n\n }\n\n /*\n Shared Callbacks\n */\n\n $scope.saveNote = function(note, callback) {\n modelManager.addDirtyItems(note);\n\n apiController.saveDirtyItems(function(){\n modelManager.addNote(note);\n note.hasChanges = false;\n\n if(callback) {\n callback(true);\n }\n })\n }\n\n $scope.deleteNote = function(note) {\n\n modelManager.deleteNote(note);\n\n if(note == $scope.selectedNote) {\n $scope.selectedNote = null;\n }\n\n $scope.updateAllTag();\n\n if(note.dummy) {\n return;\n }\n\n apiController.deleteItem(note, function(success){})\n apiController.saveDirtyItems(function(){});\n }\n\n /*\n Header Ctrl Callbacks\n */\n\n $scope.headerLogout = function() {\n $scope.defaultUser = apiController.localUser();\n $scope.tags = $scope.defaultUser.tags;\n }\n\n\n});\n;angular.module('app.frontend')\n .directive(\"notesSection\", function(){\n return {\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n remove: \"&\",\n tag: \"=\",\n user: \"=\",\n removeTag: \"&\"\n },\n\n templateUrl: 'frontend/notes.html',\n replace: true,\n controller: 'NotesCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tag', function(tag, oldTag){\n if(tag) {\n ctrl.tagDidChange(tag, oldTag);\n }\n });\n }\n }\n })\n .controller('NotesCtrl', function (apiController, $timeout, $rootScope) {\n\n $rootScope.$on(\"editorFocused\", function(){\n this.showMenu = false;\n }.bind(this))\n\n var isFirstLoad = true;\n\n this.tagDidChange = function(tag, oldTag) {\n this.showMenu = false;\n\n if(this.selectedNote && this.selectedNote.dummy) {\n _.remove(oldTag.notes, this.selectedNote);\n }\n\n this.noteFilter.text = \"\";\n\n tag.notes.forEach(function(note){\n note.visible = true;\n })\n this.selectFirstNote(false);\n\n if(isFirstLoad) {\n $timeout(function(){\n var draft = apiController.getDraft();\n if(draft) {\n var note = draft;\n this.selectNote(note);\n } else {\n this.createNewNote();\n isFirstLoad = false;\n }\n }.bind(this))\n } else if(tag.notes.length == 0) {\n this.createNewNote();\n }\n }\n\n this.selectedTagDelete = function() {\n this.showMenu = false;\n this.removeTag()(this.tag);\n }\n\n this.selectedTagShare = function() {\n this.showMenu = false;\n\n if(!this.user.uuid) {\n alert(\"You must be signed in to share a tag.\");\n return;\n }\n\n if(this.tag.all) {\n alert(\"You cannot share the 'All' tag.\");\n return;\n }\n\n apiController.shareItem(this.tag, function(response){})\n }\n\n this.selectedTagUnshare = function() {\n this.showMenu = false;\n apiController.unshareItem(this.tag, function(response){\n\n })\n }\n\n this.selectFirstNote = function(createNew) {\n var visibleNotes = this.tag.notes.filter(function(note){\n return note.visible;\n });\n\n if(visibleNotes.length > 0) {\n this.selectNote(visibleNotes[0]);\n } else if(createNew) {\n this.createNewNote();\n }\n }\n\n this.selectNote = function(note) {\n this.selectedNote = note;\n this.selectionMade()(note);\n }\n\n this.createNewNote = function() {\n var title = \"New Note\" + (this.tag.notes ? (\" \" + (this.tag.notes.length + 1)) : \"\");\n this.newNote = new Note({dummy: true});\n this.newNote.content.title = title;\n this.selectNote(this.newNote);\n this.addNew()(this.newNote);\n }\n\n this.noteFilter = {text : ''};\n\n this.filterNotes = function(note) {\n if(this.noteFilter.text.length == 0) {\n note.visible = true;\n } else {\n note.visible = note.title.toLowerCase().includes(this.noteFilter.text) || note.text.toLowerCase().includes(this.noteFilter.text);\n }\n return note.visible;\n }.bind(this)\n\n this.filterTextChanged = function() {\n $timeout(function(){\n if(!this.selectedNote.visible) {\n this.selectFirstNote(false);\n }\n }.bind(this), 100)\n }\n });\n;angular.module('app.frontend')\n .directive(\"tagsSection\", function(){\n return {\n restrict: 'E',\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n willSelect: \"&\",\n save: \"&\",\n tags: \"=\",\n allTag: \"=\",\n user: \"=\",\n updateNoteTag: \"&\"\n },\n templateUrl: 'frontend/tags.html',\n replace: true,\n controller: 'TagsCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tags', function(newTags){\n if(newTags) {\n ctrl.setTags(newTags);\n }\n });\n\n scope.$watch('ctrl.allTag', function(allTag){\n if(allTag) {\n ctrl.setAllTag(allTag);\n }\n });\n }\n }\n })\n .controller('TagsCtrl', function () {\n\n var initialLoad = true;\n\n this.setAllTag = function(allTag) {\n this.selectTag(this.allTag);\n }\n\n this.setTags = function(tags) {\n if(initialLoad) {\n initialLoad = false;\n this.selectTag(this.allTag);\n } else {\n if(tags && tags.length > 0) {\n this.selectTag(tags[0]);\n }\n }\n }\n\n this.selectTag = function(tag) {\n this.willSelect()(tag);\n this.selectedTag = tag;\n this.selectionMade()(tag);\n }\n\n this.clickedAddNewTag = function() {\n if(this.editingTag) {\n return;\n }\n\n this.newTag = new Tag();\n this.selectedTag = this.newTag;\n this.editingTag = this.newTag;\n this.addNew()(this.newTag);\n }\n\n var originalTagName = \"\";\n this.onTagTitleFocus = function(tag) {\n originalTagName = tag.content.title;\n }\n\n this.tagTitleDidChange = function(tag) {\n this.editingTag = tag;\n }\n\n this.saveTag = function($event, tag) {\n this.editingTag = null;\n if(tag.content.title.length == 0) {\n tag.content.title = originalTagName;\n originalTagName = \"\";\n return;\n }\n\n $event.target.blur();\n if(!tag.content.title || tag.content.title.length == 0) {\n return;\n }\n\n this.save()(tag, function(savedTag){\n // _.merge(tag, savedTag);\n this.selectTag(tag);\n this.newTag = null;\n }.bind(this));\n }\n\n this.noteCount = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n return validNotes.length;\n }\n\n this.handleDrop = function(e, newTag, note) {\n this.updateNoteTag()(note, newTag, this.selectedTag);\n }.bind(this)\n\n\n });\n;angular.module('app.frontend')\n.controller('UsernameModalCtrl', function ($scope, apiController, Restangular, user, callback, $timeout) {\n $scope.formData = {};\n\n $scope.saveUsername = function() {\n apiController.setUsername(user, $scope.formData.username, function(response){\n var username = response.username;\n user.username = username;\n callback(username);\n $scope.closeThisDialog();\n })\n }\n});\n;class Item {\n constructor(json_obj) {\n\n var content;\n\n Object.defineProperty(this, \"content\", {\n get: function() {\n return content;\n },\n set: function(value) {\n var finalValue = value;\n\n if(typeof value === 'string') {\n try {\n var decodedValue = JSON.parse(value);\n finalValue = decodedValue;\n }\n catch(e) {\n finalValue = value;\n }\n }\n content = finalValue;\n },\n enumerable: true,\n });\n\n _.merge(this, json_obj);\n\n if(!this.uuid) {\n this.uuid = Neeto.crypto.generateUUID();\n }\n\n this.setContentRaw = function(rawContent) {\n content = rawContent;\n }\n\n if(!this.content) {\n this.content = {};\n }\n\n if(!this.content.references) {\n this.content.references = [];\n }\n }\n\n addReference(reference) {\n this.content.references.push(reference);\n this.content.references = _.uniq(this.content.references);\n this.updateReferencesLocalMapping();\n }\n\n removeReference(reference) {\n _.remove(this.content.references, _.find(this.content.references, {uuid: reference.uuid}));\n this.updateReferencesLocalMapping();\n }\n\n referencesMatchingContentType(contentType) {\n return this.content.references.filter(function(reference){\n return reference.content_type == contentType;\n });\n }\n\n mergeMetadataFromItem(item) {\n _.merge(this, _.omit(item, [\"content\"]));\n }\n\n updateReferencesLocalMapping() {\n // should be overriden to manage local properties\n }\n\n referencesAffectedBySharingChange() {\n // should be overriden to determine which references should be decrypted/encrypted\n return null;\n }\n\n isPublic() {\n return this.presentation_name;\n }\n\n isEncrypted() {\n return this.encryptionEnabled() && typeof this.content === 'string' ? true : false;\n }\n\n encryptionEnabled() {\n return this.loc_eek;\n }\n\n presentationURL() {\n return this.presentation_url;\n }\n\n}\n;class Note extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.tags) {\n this.tags = [];\n }\n\n if(!this.content.title) {\n this.content.title = \"\";\n this.content.text = \"\";\n }\n }\n\n static filterDummyNotes(notes) {\n var filtered = notes.filter(function(note){return note.dummy == false || note.dummy == null});\n return filtered;\n }\n\n updateReferencesLocalMapping() {\n super.updateReferencesLocalMapping();\n this.tags = this.referencesMatchingContentType(\"Tag\");\n }\n\n referencesAffectedBySharingChange() {\n return super.referencesAffectedBySharingChange();\n }\n\n get hasOnePublicTag() {\n var hasPublicTag = false;\n this.tags.forEach(function(tag){\n if(tag.isPublic()) {\n hasPublicTag = true;\n return;\n }\n })\n\n return hasPublicTag;\n }\n\n toJSON() {\n return {uuid: this.uuid}\n }\n\n isPublic() {\n return super.isPublic() || this.hasOnePublicTag;\n }\n\n get content_type() {\n return \"Note\";\n }\n}\n;class Tag extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.notes) {\n this.notes = [];\n }\n\n if(!this.content.title) {\n this.content.title = \"\";\n }\n }\n\n get content_type() {\n return \"Tag\";\n }\n\n updateReferencesLocalMapping() {\n super.updateReferencesLocalMapping();\n this.notes = this.referencesMatchingContentType(\"Note\");\n }\n\n referencesAffectedBySharingChange() {\n return this.referencesMatchingContentType(\"Note\");\n }\n}\n;class User {\n constructor(json_obj) {\n _.merge(this, json_obj);\n }\n}\n;angular.module('app.frontend')\n .provider('apiController', function () {\n\n function domainName() {\n var domain_comps = location.hostname.split(\".\");\n var domain = domain_comps[domain_comps.length - 2] + \".\" + domain_comps[domain_comps.length - 1];\n return domain;\n }\n\n var url;\n\n this.defaultServerURL = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = location.protocol + \"//\" + domainName() + (location.port ? ':' + location.port: '');\n }\n }\n return url;\n }\n\n\n this.$get = function(Restangular, modelManager, ngDialog) {\n return new ApiController(Restangular, modelManager, ngDialog);\n }\n\n function ApiController(Restangular, modelManager, ngDialog) {\n\n this.setUser = function(user) {\n this.user = user;\n }\n\n /*\n Config\n */\n\n this.getServer = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = location.protocol + \"//\" + domainName() + (location.port ? ':' + location.port: '');\n this.setServer(url);\n }\n }\n return url;\n }\n\n this.setServer = function(url, refresh) {\n localStorage.setItem(\"server\", url);\n if(refresh) {\n window.location.reload();\n }\n }\n\n\n /*\n Auth\n */\n\n this.getAuthParamsForEmail = function(email, callback) {\n var request = Restangular.one(\"auth\", \"params\");\n request.get({email: email}).then(function(response){\n callback(response.plain());\n })\n }\n\n this.getCurrentUser = function(callback) {\n if(!localStorage.getItem(\"jwt\")) {\n callback(null);\n return;\n }\n Restangular.one(\"users/current\").get().then(function(response){\n var plain = response.plain();\n var items = plain.items;\n this.decryptItemsWithLocalKey(items);\n items = this.mapResponseItemsToLocalModels(items);\n var user = _.omit(plain, [\"items\"]);\n callback(user, items);\n }.bind(this))\n .catch(function(error){\n callback(null);\n })\n }\n\n this.login = function(email, password, callback) {\n console.log(\"login with\", email, password);\n this.getAuthParamsForEmail(email, function(authParams){\n var keys = Neeto.crypto.computeEncryptionKeysForUser(_.merge({email: email, password: password}, authParams));\n this.setGk(keys.gk);\n var request = Restangular.one(\"auth/sign_in\");\n request.user = {password: keys.pw, email: email};\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n callback(response);\n })\n }.bind(this))\n }\n\n this.register = function(email, password, callback) {\n var keys = Neeto.crypto.generateInitialEncryptionKeysForUser({password: password, email: email});\n this.setGk(keys.gk);\n keys.gk = null;\n var request = Restangular.one(\"auth\");\n request.user = _.merge({password: keys.pw, email: email}, keys);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n callback(response);\n })\n }\n\n this.changePassword = function(user, current_password, new_password) {\n this.getAuthParamsForEmail(email, function(authParams){\n\n var current_keys = Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: current_password, email: user.email}, authParams));\n var new_keys = Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: new_password, email: user.email}, authParams));\n\n var data = {};\n data.current_password = current_keys.pw;\n data.password = new_keys.pw;\n data.password_confirmation = new_keys.pw;\n\n var user = this.user;\n\n this._performPasswordChange(current_keys, new_keys, function(response){\n if(response && !response.errors) {\n // this.showNewPasswordForm = false;\n // reencrypt data with new gk\n this.reencryptAllItemsAndSave(user, new_keys.gk, current_keys.gk, function(success){\n if(success) {\n this.setGk(new_keys.gk);\n alert(\"Your password has been changed and your data re-encrypted.\");\n } else {\n // rollback password\n this._performPasswordChange(new_keys, current_keys, function(response){\n alert(\"There was an error changing your password. Your password has been rolled back.\");\n window.location.reload();\n })\n }\n }.bind(this));\n } else {\n // this.showNewPasswordForm = false;\n alert(\"There was an error changing your password. Please try again.\");\n }\n })\n\n });\n }\n\n this._performPasswordChange = function(email, current_keys, new_keys, callback) {\n var request = Restangular.one(\"auth\");\n request.user = {password: new_keys.pw, password_confirmation: new_keys.pw, current_password: current_keys.pw, email: email};\n request.patch().then(function(response){\n callback(response);\n })\n }\n\n\n /*\n User\n */\n\n this.setUsername = function(user, username, callback) {\n var request = Restangular.one(\"users\", user.uuid);\n request.username = username;\n request.patch().then(function(response){\n callback(response.plain());\n })\n }\n\n /*\n Ensures that if encryption is disabled, all local items are uncrypted,\n and that if it's enabled, that all local items are encrypted\n */\n this.verifyEncryptionStatusOfAllItems = function(user, callback) {\n var allItems = user.filteredItems();\n var itemsNeedingUpdate = [];\n allItems.forEach(function(item){\n if(!item.isPublic()) {\n if(item.encryptionEnabled() && !item.isEncrypted()) {\n itemsNeedingUpdate.push(item);\n }\n } else {\n if(item.isEncrypted()) {\n itemsNeedingUpdate.push(item);\n }\n }\n }.bind(this))\n\n if(itemsNeedingUpdate.length > 0) {\n console.log(\"verifying encryption, items need updating\", itemsNeedingUpdate);\n this.saveBatchItems(user, itemsNeedingUpdate, callback)\n }\n }\n\n\n\n /*\n Items\n */\n\n this.saveDirtyItems = function(callback) {\n var dirtyItems = modelManager.dirtyItems;\n if(dirtyItems.length == 0) {\n callback();\n return;\n }\n\n this.saveItems(dirtyItems, function(response){\n modelManager.clearDirtyItems();\n callback();\n })\n }\n\n this.saveItems = function(items, callback) {\n console.log(\"saving items\", items);\n var request = Restangular.one(\"users\", this.user.uuid).one(\"items\");\n request.items = _.map(items, function(item){\n return this.createRequestParamsForItem(item);\n }.bind(this));\n console.log(\"sending request items\", request.items);\n\n request.post().then(function(response) {\n var savedItems = response.items;\n this.decryptItemsWithLocalKey(savedItems);\n items.forEach(function(item){\n var savedCounterpart = _.find(savedItems, {uuid: item.uuid});\n item.mergeMetadataFromItem(savedCounterpart);\n })\n\n console.log(\"response items\", savedItems);\n callback(response);\n }.bind(this))\n }\n\n this.mapResponseItemsToLocalModels = function(items) {\n return _.map(items, function(json_obj){\n if(json_obj.content_type == \"Note\") {\n return new Note(json_obj);\n } else if(json_obj.content_type == \"Tag\") {\n return new Tag(json_obj);\n } else {\n return new Item(json_obj);\n }\n });\n }\n\n this.createRequestParamsForItem = function(item) {\n return this.paramsForItem(item, !item.isPublic(), null, false);\n }\n\n this.paramsForItem = function(item, encrypted, additionalFields, forExportFile) {\n var itemCopy = _.cloneDeep(item);\n\n var params = {uuid: item.uuid, content_type: item.content_type, presentation_name: item.presentation_name};\n\n itemCopy.content.references = _.map(itemCopy.content.references, function(reference){\n return {uuid: reference.uuid, content_type: reference.content_type};\n })\n\n if(encrypted) {\n this.encryptSingleItem(itemCopy, this.retrieveGk());\n params.content = itemCopy.content;\n params.loc_eek = itemCopy.loc_eek;\n }\n else {\n params.content = forExportFile ? itemCopy.content : JSON.stringify(itemCopy.content);\n if(!forExportFile) {\n params.loc_eek = null;\n }\n }\n\n if(additionalFields) {\n _.merge(params, _.pick(item, additionalFields));\n }\n\n return params;\n }\n\n\n this.deleteItem = function(item, callback) {\n if(!this.user.uuid) {\n this.writeUserToLocalStorage(this.user);\n callback(true);\n } else {\n Restangular.one(\"users\", this.user.uuid).one(\"items\", item.uuid).remove()\n .then(function(response) {\n callback(true);\n })\n }\n }\n\n this.shareItem = function(item, callback) {\n console.log(\"sharing item\", item);\n if(!this.user.uuid) {\n alert(\"You must be signed in to share.\");\n return;\n }\n\n var shareFn = function() {\n item.presentation_name = \"_auto_\";\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n this.saveItems(needsUpdate, function(success){})\n }.bind(this)\n\n if(!this.user.username) {\n ngDialog.open({\n template: 'frontend/modals/username.html',\n controller: 'UsernameModalCtrl',\n resolve: {\n user: function() {return this.user}.bind(this),\n callback: function() {\n return shareFn;\n }\n },\n className: 'ngdialog-theme-default',\n disableAnimation: true\n });\n } else {\n shareFn();\n }\n }\n\n this.unshareItem = function(item, callback) {\n console.log(\"unsharing item\", item);\n item.presentation_name = null;\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n this.saveItems(needsUpdate, function(success){})\n }\n\n /*\n Import\n */\n\n this.importJSONData = function(jsonString, callback) {\n var data = JSON.parse(jsonString);\n var customModelManager = new ModelManager();\n customModelManager.items = this.mapResponseItemsToLocalModels(data.items);\n console.log(\"importing data\", JSON.parse(jsonString));\n this.saveItems(customModelManager.items, function(response){\n callback(response);\n });\n }\n\n /*\n Export\n */\n\n this.itemsDataFile = function() {\n var textFile = null;\n var makeTextFile = function (text) {\n var data = new Blob([text], {type: 'text/json'});\n\n // If we are replacing a previously generated file we need to\n // manually revoke the object URL to avoid memory leaks.\n if (textFile !== null) {\n window.URL.revokeObjectURL(textFile);\n }\n\n textFile = window.URL.createObjectURL(data);\n\n // returns a URL you can use as a href\n return textFile;\n }.bind(this);\n\n var items = _.map(modelManager.items, function(item){\n return this.paramsForItem(item, false, [\"created_at\", \"updated_at\"], true)\n }.bind(this));\n\n var data = {\n items: items\n }\n\n return makeTextFile(JSON.stringify(data, null, 2 /* pretty print */));\n }\n\n\n\n /*\n Merging\n */\n this.mergeLocalDataRemotely = function(user, callback) {\n var request = Restangular.one(\"users\", user.uuid).one(\"merge\");\n var tags = user.tags;\n request.items = user.items;\n request.items.forEach(function(item){\n if(item.tag_id) {\n var tag = tags.filter(function(tag){return tag.uuid == item.tag_id})[0];\n item.tag_name = tag.content.title;\n }\n })\n request.post().then(function(response){\n callback();\n localStorage.removeItem('user');\n })\n }\n\n\n\n\n\n\n this.staticifyObject = function(object) {\n return JSON.parse(JSON.stringify(object));\n }\n\n this.writeUserToLocalStorage = function(user) {\n var saveUser = _.cloneDeep(user);\n saveUser.items = Item.filterDummyItems(saveUser.items);\n saveUser.tags.forEach(function(tag){\n tag.items = null;\n }.bind(this))\n this.writeToLocalStorage('user', saveUser);\n }\n\n this.writeToLocalStorage = function(key, value) {\n localStorage.setItem(key, angular.toJson(value));\n }\n\n this.localUser = function() {\n var user = JSON.parse(localStorage.getItem('user'));\n if(!user) {\n user = {items: [], tags: []};\n }\n user.shouldMerge = true;\n return user;\n }\n\n /*\n Drafts\n */\n\n this.saveDraftToDisk = function(draft) {\n // localStorage.setItem(\"draft\", JSON.stringify(draft));\n }\n\n this.clearDraft = function() {\n localStorage.removeItem(\"draft\");\n }\n\n this.getDraft = function() {\n var draftString = localStorage.getItem(\"draft\");\n if(!draftString || draftString == 'undefined') {\n return null;\n }\n return new Item(JSON.parse(draftString));\n }\n\n\n /*\n Encrpytion\n */\n\n this.retrieveGk = function() {\n if(!this.gk) {\n this.gk = localStorage.getItem(\"gk\");\n }\n return this.gk;\n }\n\n this.setGk = function(gk) {\n localStorage.setItem('gk', gk);\n }\n\n this.signout = function() {\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"gk\");\n }\n\n this.encryptSingleItem = function(item, key) {\n var ek = null;\n if(item.loc_eek) {\n ek = Neeto.crypto.decryptText(item.loc_eek, key);\n } else {\n ek = Neeto.crypto.generateRandomEncryptionKey();\n item.loc_eek = Neeto.crypto.encryptText(ek, key);\n }\n item.content = Neeto.crypto.encryptText(JSON.stringify(item.content), ek);\n item.local_encryption_scheme = \"1.0\";\n }\n\n this.encryptItems = function(items, key) {\n items.forEach(function(item){\n this.encryptSingleItem(item, key);\n }.bind(this));\n }\n\n this.encryptSingleItemWithLocalKey = function(item) {\n this.encryptSingleItem(item, this.retrieveGk());\n }\n\n this.encryptItemsWithLocalKey = function(items) {\n this.encryptItems(items, this.retrieveGk());\n }\n\n this.encryptNonPublicItemsWithLocalKey = function(items) {\n var nonpublic = items.filter(function(item){\n return !item.isPublic() && !item.pending_share;\n })\n this.encryptItems(nonpublic, this.retrieveGk());\n }\n\n this.decryptSingleItemWithLocalKey = function(item) {\n this.decryptSingleItem(item, this.retrieveGk());\n }\n\n this.decryptSingleItem = function(item, key) {\n var ek = Neeto.crypto.decryptText(item.loc_eek || item.local_eek, key);\n var content = Neeto.crypto.decryptText(item.content, ek);\n // console.log(\"decrypted contnet\", content);\n item.content = content;\n }\n\n this.decryptItems = function(items, key) {\n items.forEach(function(item){\n // console.log(\"is encrypted?\", item);\n if(item.loc_eek && typeof item.content === 'string') {\n this.decryptSingleItem(item, key);\n }\n }.bind(this));\n }\n\n this.decryptItemsWithLocalKey = function(items) {\n this.decryptItems(items, this.retrieveGk());\n }\n\n this.reencryptAllItemsAndSave = function(user, newKey, oldKey, callback) {\n var items = user.filteredItems();\n items.forEach(function(item){\n if(item.loc_eek && typeof item.content === 'string') {\n // first decrypt eek with old key\n var ek = Neeto.crypto.decryptText(item.loc_eek, oldKey);\n // now encrypt ek with new key\n item.loc_eek = Neeto.crypto.encryptText(ek, newKey);\n }\n });\n\n this.saveBatchItems(user, items, function(success) {\n callback(success);\n }.bind(this));\n }\n }\n});\n;class ItemManager {\n\n set items(items) {\n this._items = items;\n this.resolveReferences();\n }\n\n get items() {\n return this._items;\n }\n\n referencesForItemId(itemId) {\n return _.find(this.items, {uuid: itemId});\n }\n\n resolveReferences() {\n this.items.forEach(function(item){\n // build out references, safely handle broken references\n item.content.references = _.reduce(item.content.references, function(accumulator, reference){\n var item = this.referencesForItemId(reference.uuid);\n if(item) {\n accumulator.push(item);\n }\n return accumulator;\n }.bind(this), []);\n }.bind(this));\n }\n\n itemsForContentType(contentType) {\n return this.items.filter(function(item){\n return item.content_type == contentType;\n });\n }\n\n // returns dirty item references that need saving\n deleteItem(item) {\n var dirty = [];\n _.remove(this.items, item);\n var length = item.content.references.length;\n // note that references are deleted in this for loop, so you have to be careful how you iterate\n for(var i = 0; i < length; i++) {\n var referencedItem = item.content.references[0];\n // console.log(\"removing references between items\", referencedItem, item);\n var _dirty = this.removeReferencesBetweenItems(referencedItem, item);\n dirty = dirty.concat(_dirty);\n }\n\n return dirty;\n }\n\n removeReferencesBetweenItems(itemOne, itemTwo) {\n itemOne.removeReference(itemTwo);\n itemTwo.removeReference(itemOne);\n return [itemOne, itemTwo];\n }\n\n createReferencesBetweenItems(itemOne, itemTwo) {\n itemOne.addReference(itemTwo);\n itemTwo.addReference(itemOne);\n return [itemOne, itemTwo];\n }\n}\n\nangular.module('app.frontend').service('itemManager', ItemManager);\n;angular.module('app.frontend')\n .service('markdownRenderer', function ($sce) {\n\n marked.setOptions({\n breaks: true,\n sanitize: true\n });\n\n this.renderedContentForText = function(text) {\n if(!text || text.length == 0) {\n return \"\";\n }\n return marked(text);\n }\n\n this.renderHtml = function(html_code) {\n return $sce.trustAsHtml(html_code);\n };\n\n\n });\n;class ModelManager extends ItemManager {\n\n constructor() {\n super();\n this.notes = [];\n this.groups = [];\n this.dirtyItems = [];\n }\n\n set items(items) {\n super.items = items;\n this.notes = this.itemsForContentType(\"Note\");\n this.notes.forEach(function(note){\n note.updateReferencesLocalMapping();\n })\n\n this.tags = this.itemsForContentType(\"Tag\");\n this.tags.forEach(function(tag){\n tag.updateReferencesLocalMapping();\n })\n }\n\n get items() {\n return super.items;\n }\n\n addDirtyItems(items) {\n if(!(items instanceof Array)) {\n items = [items];\n }\n\n this.dirtyItems = this.dirtyItems.concat(items);\n this.dirtyItems = _.uniq(this.dirtyItems);\n }\n\n get filteredNotes() {\n return Note.filterDummyNotes(this.notes);\n }\n\n clearDirtyItems() {\n this.dirtyItems = [];\n }\n\n addNote(note) {\n if(!_.find(this.notes, {uuid: note.uuid})) {\n this.notes.unshift(note);\n }\n }\n\n addTag(tag) {\n this.tags.unshift(tag);\n }\n\n addTagToNote(tag, note) {\n var dirty = this.createReferencesBetweenItems(tag, note);\n this.refreshRelationshipsForTag(tag);\n this.refreshRelationshipsForNote(note);\n this.addDirtyItems(dirty);\n }\n\n refreshRelationshipsForTag(tag) {\n tag.notes = tag.referencesMatchingContentType(\"Note\");\n tag.notes.sort(function(a,b){\n return new Date(b.created_at) - new Date(a.created_at);\n });\n }\n\n refreshRelationshipsForNote(note) {\n note.tags = note.referencesMatchingContentType(\"Tag\");\n }\n\n removeTagFromNote(tag, note) {\n var dirty = this.removeReferencesBetweenItems(tag, note);\n this.addDirtyItems(dirty);\n }\n\n deleteNote(note) {\n var dirty = this.deleteItem(note);\n _.remove(this.notes, note);\n this.addDirtyItems(dirty);\n }\n\n deleteTag(tag) {\n var dirty = this.deleteItem(tag);\n _.remove(this.tags, tag);\n this.addDirtyItems(dirty);\n }\n\n filteredNotes() {\n return Note.filterDummyNotes(this.notes);\n }\n}\n\nangular.module('app.frontend').service('modelManager', ModelManager);\n;angular.module('app.frontend')\n .service('serverSideValidation', function ($sce) {\n // Show validation errors in form.\n this.showErrors = function (formErrors, form) {\n angular.forEach(formErrors, function (errors, key) {\n if (typeof form[key] !== 'undefined') {\n form[key].$setDirty();\n form[key].$setValidity('server', false);\n form[key].$error.server = $sce.trustAsHtml(errors.join(', '));\n }\n });\n };\n\n // Get validation errors from server response and show them in form.\n this.parseErrors = function (response, form) {\n if (response.status === 422) {\n this.showErrors(response.data, form);\n }\n };\n});\n;angular\n .module('app.frontend')\n .directive('mbAutofocus', ['$timeout', function($timeout) {\n return {\n restrict: 'A',\n scope: {\n shouldFocus: \"=\"\n },\n link : function($scope, $element) {\n $timeout(function() {\n if($scope.shouldFocus) {\n $element[0].focus();\n }\n });\n }\n }\n }]);\n;angular\n .module('app.frontend')\n .directive('draggable', function() {\n return {\n scope: {\n note: \"=\"\n },\n link: function(scope, element) {\n // this gives us the native JS object\n var el = element[0];\n\n el.draggable = true;\n\n el.addEventListener(\n 'dragstart',\n function(e) {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('Note', JSON.stringify(scope.note));\n this.classList.add('drag');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragend',\n function(e) {\n this.classList.remove('drag');\n return false;\n },\n false\n );\n }\n }\n});\n\nangular\n .module('app.frontend')\n .directive('droppable', function() {\n return {\n scope: {\n drop: '&',\n bin: '=',\n tag: \"=\"\n },\n link: function(scope, element) {\n // again we need the native object\n var el = element[0];\n\n el.addEventListener(\n 'dragover',\n function(e) {\n e.dataTransfer.dropEffect = 'move';\n // allows us to drop\n if (e.preventDefault) e.preventDefault();\n this.classList.add('over');\n return false;\n },\n false\n );\n\n var counter = 0;\n\n el.addEventListener(\n 'dragenter',\n function(e) {\n counter++;\n this.classList.add('over');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragleave',\n function(e) {\n counter--;\n if (counter === 0) {\n this.classList.remove('over');\n }\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'drop',\n function(e) {\n // Stops some browsers from redirecting.\n if (e.stopPropagation) e.stopPropagation();\n\n this.classList.remove('over');\n\n var binId = this.uuid;\n var note = new Note(JSON.parse(e.dataTransfer.getData('Note')));\n scope.$apply(function(scope) {\n var fn = scope.drop();\n if ('undefined' !== typeof fn) {\n fn(e, scope.tag, note);\n }\n });\n\n return false;\n },\n false\n );\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('fileChange', function() {\n return {\n restrict: 'A',\n scope: {\n handler: '&'\n },\n link: function (scope, element) {\n element.on('change', function (event) {\n scope.$apply(function(){\n scope.handler({files: event.target.files});\n });\n });\n }\n };\n});\n;angular\n .module('app.frontend')\n .directive('lowercase', function() {\n return {\n require: 'ngModel',\n link: function(scope, element, attrs, modelCtrl) {\n var lowercase = function(inputValue) {\n if (inputValue == undefined) inputValue = '';\n var lowercased = inputValue.toLowerCase();\n if (lowercased !== inputValue) {\n modelCtrl.$setViewValue(lowercased);\n modelCtrl.$render();\n }\n return lowercased;\n }\n modelCtrl.$parsers.push(lowercase);\n lowercase(scope[attrs.ngModel]);\n }\n };\n });\n;angular\n .module('app.frontend')\n .directive('selectOnClick', ['$window', function ($window) {\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n element.on('focus', function () {\n if (!$window.getSelection().toString()) {\n // Required for mobile Safari\n this.setSelectionRange(0, this.value.length)\n }\n });\n }\n };\n}]);\n;angular\n .module('app.frontend')\n .directive('note', function($timeout) {\n return {\n restrict: 'E',\n controller: 'SingleNoteCtrl',\n templateUrl: \"frontend/directives/note.html\",\n scope: {\n note: \"=\"\n },\n }\n })\n .controller('SingleNoteCtrl', function ($rootScope, $scope, $state, markdownRenderer) {\n $scope.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText($scope.note.text));\n }\n });\n;/**\n * AngularJS directive that simulates the effect of typing on a text editor - with a blinking cursor.\n * This directive works as an attribute to any HTML element, and it changes the speed/delay of its animation.\n *\n * There's also a simple less file included for basic styling of the dialog, which can be overridden.\n * The config object also lets the user define custom CSS classes for the modal.\n *\n * How to use:\n *\n * Just add the desired text to the 'text' attribute of the element and the directive takes care of the rest.\n * The 'text' attribute can be a single string or an array of string. In case an array is passed, the string\n * on each index is erased so the next item can be printed. When the last index is reached, that string stays\n * on the screen. (So if you want to erase the last string, just push an empty string to the end of the array)\n *\n * These are the optional preferences:\n * - initial delay: set an 'initial-delay' attribute for the element\n * - type delay: set a 'type-delay' attribute for the element\n * - erase delay: set a 'erase-delay' attribute for the element\n * - specify cursor : set a 'cursor' attribute for the element, specifying which cursor to use\n * - turn off cursor blinking: set the 'blink-cursor' attribute to \"false\"\n * - cursor blinking speed: set a 'blink-delay' attribute for the element\n * - scope callback: pass the desired scope callback as the 'callback-fn' attribute of the element\n *\n * Note:\n * Each time/delay value should be set either on seconds (1s) or milliseconds (1000)\n *\n * Dependencies:\n * The directive needs the css file provided in order to replicate the cursor blinking effect.\n */\n\n\nangular\n .module('app.frontend').directive('typewrite', ['$timeout', function ($timeout) {\n function linkFunction($scope, $element, $attrs) {\n var timer = null,\n initialDelay = $attrs.initialDelay ? getTypeDelay($attrs.initialDelay) : 200,\n typeDelay = $attrs.typeDelay || 200,\n eraseDelay = $attrs.eraseDelay || typeDelay / 2,\n blinkDelay = $attrs.blinkDelay ? getAnimationDelay($attrs.blinkDelay) : false,\n cursor = $attrs.cursor || '|',\n blinkCursor = typeof $attrs.blinkCursor !== 'undefined' ? $attrs.blinkCursor === 'true' : true,\n currentText,\n textArray,\n running,\n auxStyle;\n\n\n\n if ($scope.text) {\n if ($scope.text instanceof Array) {\n textArray = $scope.text;\n currentText = textArray[0];\n } else {\n currentText = $scope.text;\n }\n }\n if (typeof $scope.start === 'undefined' || $scope.start) {\n typewrite();\n }\n\n function typewrite() {\n timer = $timeout(function () {\n updateIt($element, 0, 0, currentText);\n }, initialDelay);\n }\n\n function updateIt(element, charIndex, arrIndex, text) {\n if (charIndex <= text.length) {\n updateValue(element, text.substring(0, charIndex) + cursor);\n charIndex++;\n timer = $timeout(function () {\n updateIt(element, charIndex, arrIndex, text);\n }, typeDelay);\n return;\n } else {\n charIndex--;\n\n if($scope.iterationCallback) {\n $scope.iterationCallback()(arrIndex);\n }\n\n // check if it's an array\n if (textArray && arrIndex < textArray.length - 1) {\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, textArray[arrIndex]);\n }, $scope.iterationDelay);\n } else {\n if ($scope.callbackFn) {\n $scope.callbackFn();\n }\n blinkIt(element, charIndex, currentText);\n }\n }\n }\n\n function blinkIt(element, charIndex) {\n var text = element.text().substring(0, element.text().length - 1);\n if (blinkCursor) {\n if (blinkDelay) {\n auxStyle = '-webkit-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-moz-animation:blink-it steps(1) ' + blinkDelay + ' infinite ' +\n '-ms-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-o-animation:blink-it steps(1) ' + blinkDelay + ' infinite; ' +\n 'animation:blink-it steps(1) ' + blinkDelay + ' infinite;';\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n } else {\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n }\n } else {\n updateValue(element, text.substring(0, charIndex));\n }\n }\n\n function cleanAndRestart(element, charIndex, arrIndex, currentText) {\n if(charIndex == 0) {\n if($scope.prebeginFn) {\n $scope.prebeginFn()();\n }\n }\n if (charIndex > 0) {\n currentText = currentText.slice(0, -1);\n // element.html(currentText.substring(0, currentText.length - 1) + cursor);\n updateValue(element, currentText + cursor);\n charIndex--;\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, currentText);\n }, eraseDelay);\n return;\n } else {\n arrIndex++;\n currentText = textArray[arrIndex];\n timer = $timeout(function () {\n updateIt(element, 0, arrIndex, currentText);\n }, typeDelay);\n }\n }\n\n function getTypeDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? parseInt(delay.substring(0, delay.length - 1), 10) * 1000 : +delay;\n } else {\n return false;\n }\n }\n\n function getAnimationDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? delay : parseInt(delay.substring(0, delay.length - 1), 10) / 1000;\n }\n }\n\n function updateValue(element, value) {\n if (element.prop('nodeName').toUpperCase() === 'INPUT') {\n return element.val(value);\n }\n return element.html(value);\n }\n\n $scope.$on('$destroy', function () {\n if (timer) {\n $timeout.cancel(timer);\n }\n });\n\n $scope.$watch('start', function (newVal) {\n if (!running && newVal) {\n running = !running;\n typewrite();\n }\n });\n\n $scope.$watch('text', function (newVal, oldVal) {\n if(!(newVal instanceof Array)) {\n currentText = newVal;\n typewrite();\n }\n });\n }\n\n return {\n restrict: 'A',\n link: linkFunction,\n replace: true,\n scope: {\n text: '=',\n callbackFn: '&',\n iterationCallback: '&',\n iterationDelay: '=',\n prebeginFn: '&',\n start: '='\n }\n };\n\n }]);\n;var Neeto = Neeto || {};\n\nNeeto.crypto = {\n\n generateRandomKey: function() {\n return CryptoJS.lib.WordArray.random(256/8).toString();\n },\n\n generateUUID: function() {\n var d = new Date().getTime();\n if(window.performance && typeof window.performance.now === \"function\"){\n d += performance.now(); //use high-precision timer if available\n }\n var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (d + Math.random()*16)%16 | 0;\n d = Math.floor(d/16);\n return (c=='x' ? r : (r&0x3|0x8)).toString(16);\n });\n return uuid;\n },\n\n decryptText: function(encrypted_content, key) {\n return CryptoJS.AES.decrypt(encrypted_content, key).toString(CryptoJS.enc.Utf8);\n },\n\n encryptText: function(text, key) {\n return CryptoJS.AES.encrypt(text, key).toString();\n },\n\n generateRandomEncryptionKey: function() {\n var salt = Neeto.crypto.generateRandomKey();\n var passphrase = Neeto.crypto.generateRandomKey();\n return CryptoJS.PBKDF2(passphrase, salt, { keySize: 256/32 }).toString();\n },\n\n sha256: function(text) {\n return CryptoJS.SHA256(text).toString();\n },\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair: function({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}) {\n var algMapping = {\n \"sha256\" : CryptoJS.algo.SHA256,\n \"sha512\" : CryptoJS.algo.SHA512\n }\n var fnMapping = {\n \"pbkdf2\" : CryptoJS.PBKDF2\n }\n\n var alg = algMapping[pw_alg];\n var kdf = fnMapping[pw_func];\n var output = kdf(password, pw_salt, { keySize: pw_key_size/32, hasher: alg, iterations: pw_cost }).toString();\n\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n return [firstHalf, secondHalf];\n },\n\n computeEncryptionKeysForUser: function({email, password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}) {\n var keys = Neeto.crypto.generateSymmetricKeyPair({password: password, pw_salt: pw_salt,\n pw_func: pw_func, pw_alg: pw_alg, pw_cost: pw_cost, pw_key_size: pw_key_size});\n var pw = keys[0];\n var gk = keys[1];\n\n return {pw: pw, gk: gk};\n },\n\n generateInitialEncryptionKeysForUser: function({email, password} = {}) {\n var defaults = this.defaultPasswordGenerationParams();\n var {pw_func, pw_alg, pw_key_size, pw_cost} = defaults;\n var pw_nonce = this.generateRandomKey();\n var pw_salt = CryptoJS.SHA1(email + \"SN\" + pw_nonce).toString();\n var keys = Neeto.crypto.generateSymmetricKeyPair(_.merge({email: email, password: password, pw_salt: pw_salt}, defaults));\n var pw = keys[0];\n var gk = keys[1];\n\n return _.merge({pw: pw, gk: gk, pw_nonce: pw_nonce}, defaults);\n },\n\n defaultPasswordGenerationParams: function() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 3000};\n }\n };\n"]} \ No newline at end of file +{"version":3,"sources":["app.js"],"names":["SNCrypto","CryptoJS","lib","WordArray","random","toString","d","Date","getTime","window","performance","now","uuid","replace","c","r","Math","floor","encrypted_content","key","AES","decrypt","enc","Utf8","text","encrypt","salt","Neeto","crypto","generateRandomKey","passphrase","PBKDF2","keySize","SHA256","SHA1","email","password","pw_salt","pw_func","pw_alg","pw_cost","pw_key_size","callback","generateSymmetricKeyPair","keys","pw","gk","defaults","defaultPasswordGenerationParams","pw_nonce","sha1","_","merge","SNCryptoJS","algMapping","algo","SHA512","fnMapping","alg","kdf","output","hasher","iterations","outputLength","length","firstHalf","slice","secondHalf","subtleCrypto","subtle","SNCryptoWeb","stretchPassword","webCryptoImportKey","console","log","webCryptoDeriveBits","bind","input","importKey","stringToArrayBuffer","name","toUpperCase","then","catch","err","error","deriveBits","hash","bits","arrayBufferToHexString","Uint8Array","string","encoder","TextEncoder","encode","arrayBuffer","byteArray","hexString","nextHexByte","i","byteLength","angular","module","config","RestangularProvider","apiControllerProvider","setDefaultHeaders","url","defaultServerURL","setBaseUrl","setFullRequestInterceptor","element","operation","route","headers","params","httpConfig","token","localStorage","getItem","extend","Authorization","$stateProvider","$urlRouterProvider","$locationProvider","state","abstract","parent","views","templateUrl","controller","$rootScope","$stateParams","resetData","reset_password_token","$on","event","toState","toParams","fromState","fromParams","options","otherwise","$injector","$location","get","go","path","html5Mode","BaseCtrl","modelManager","directive","$timeout","restrict","scope","save","remove","note","user","controllerAs","bindToController","link","elem","attrs","ctrl","handler","ctrlKey","metaKey","String","fromCharCode","which","toLowerCase","preventDefault","saveNote","clickedEditNote","toggleMarkdown","toggleFullScreen","addEventListener","removeEventListener","$watch","oldNote","setNote","$sce","apiController","markdownRenderer","demoNotes","title","content","showSampler","filteredNotes","demoNoteNames","map","currentDemoContent","prebeginFn","index","contentCallback","editorMode","focusTitle","hasChanges","dummy","onPreviewDoubleClick","focusEditor","delay","setTimeout","document","getElementById","focus","clickedTextArea","showMenu","renderedContent","renderHtml","renderedContentForText","statusTimeout","$event","success","clearDraft","cancel","noteStatus","saveTitle","target","blur","saveTimeout","changesMade","saveDraftToDisk","contentChanged","nameChanged","onNameFocus","editingName","onContentFocus","$broadcast","editingUrl","onNameBlur","fullscreen","selectedMenuItem","editUrlPressed","publicUrlForNote","presentation_name","base","saveUrl","original","saveItems","response","alert","shareNote","openInNewTab","a","createElement","href","click","shareItem","unshareNote","unshareItem","presentationURL","clickedMenu","locked","deleteNote","logout","$auth","$state","serverSideValidation","changePasswordPressed","showNewPasswordForm","accountMenuPressed","serverData","getServer","showAccountMenu","showFaq","changeServer","setServer","signOutPressed","signout","location","reload","submitPasswordChange","passwordChangeData","status","data","password_confirmation","changePassword","current_password","new_password","hasLocalData","mergeLocalChanged","shouldMerge","confirm","loginSubmitPressed","loginData","login","user_password","errors","onAuthSuccess","submitRegistrationForm","register","forgotPasswordSubmit","requestPasswordReset","resp","encryptionStatusForNotes","allNotes","countEncrypted","forEach","encryptionEnabled","downloadDataArchive","setAttribute","itemsDataFile","importFileSelected","files","file","reader","FileReader","onload","e","importJSONData","result","readAsText","mergeLocalDataRemotely","showLogin","showRegistration","$scope","bodyClass","description","onUserSet","setUser","defaultUser","allTag","Tag","all","tags","getCurrentUser","items","User","localUser","updateAllTag","notes","tagsWillMakeSelection","tag","tagsSelectionMade","selectedTag","tagsAddNew","addTag","tagsSave","tagsUpdateNoteTag","noteCopy","newTag","oldTag","originalNote","find","addTagToNote","saveDirtyItems","notesRemoveTag","validNotes","Note","filterDummyNotes","deleteItem","notesSelectionMade","selectedNote","notesAddNew","addNote","unshift","addDirtyItems","headerLogout","addNew","selectionMade","removeTag","tagDidChange","isFirstLoad","noteFilter","visible","selectFirstNote","draft","getDraft","selectNote","createNewNote","selectedTagDelete","selectedTagShare","selectedTagUnshare","createNew","visibleNotes","filter","newNote","filterNotes","includes","filterTextChanged","willSelect","updateNoteTag","newTags","setTags","setAllTag","initialLoad","selectTag","clickedAddNewTag","editingTag","originalTagName","onTagTitleFocus","tagTitleDidChange","saveTag","savedTag","noteCount","handleDrop","Restangular","formData","saveUsername","setUsername","username","closeThisDialog","Item","json_obj","Object","defineProperty","set","value","finalValue","decodedValue","JSON","parse","enumerable","generateUUID","setContentRaw","rawContent","references","reference","push","uniq","updateReferencesLocalMapping","contentType","content_type","item","omit","loc_eek","presentation_url","referencesMatchingContentType","hasOnePublicTag","hasPublicTag","isPublic","filtered","provider","domainName","domain_comps","hostname","split","domain","protocol","port","$get","ngDialog","ApiController","refresh","setItem","getAuthParamsForEmail","request","one","plain","decryptItemsWithLocalKey","mapResponseItemsToLocalModels","authParams","computeEncryptionKeysForUser","setGk","post","generateInitialEncryptionKeysForUser","currentKeys","newKeys","_performPasswordChange","reencryptAllItemsAndSave","current_keys","new_keys","patch","verifyEncryptionStatusOfAllItems","allItems","filteredItems","itemsNeedingUpdate","isEncrypted","saveBatchItems","dirtyItems","clearDirtyItems","createRequestParamsForItem","savedItems","savedCounterpart","mergeMetadataFromItem","paramsForItem","encrypted","additionalFields","forExportFile","itemCopy","cloneDeep","encryptSingleItem","retrieveGk","stringify","pick","writeUserToLocalStorage","shareFn","needsUpdate","concat","referencesAffectedBySharingChange","open","template","resolve","className","disableAnimation","jsonString","customModelManager","ModelManager","textFile","makeTextFile","Blob","type","URL","revokeObjectURL","createObjectURL","tag_id","tag_name","removeItem","staticifyObject","object","saveUser","filterDummyItems","writeToLocalStorage","toJson","draftString","ek","decryptText","generateRandomEncryptionKey","encryptText","local_encryption_scheme","encryptItems","encryptSingleItemWithLocalKey","encryptItemsWithLocalKey","encryptNonPublicItemsWithLocalKey","nonpublic","pending_share","decryptSingleItemWithLocalKey","decryptSingleItem","local_eek","decryptItems","newKey","oldKey","ItemManager","itemId","reduce","accumulator","referencesForItemId","dirty","referencedItem","_dirty","removeReferencesBetweenItems","itemOne","itemTwo","removeReference","addReference","_items","resolveReferences","service","marked","setOptions","breaks","sanitize","html_code","trustAsHtml","groups","Array","createReferencesBetweenItems","refreshRelationshipsForTag","refreshRelationshipsForNote","sort","b","created_at","itemsForContentType","showErrors","formErrors","form","$setDirty","$setValidity","$error","server","join","parseErrors","shouldFocus","$element","el","draggable","dataTransfer","effectAllowed","setData","classList","add","drop","bin","dropEffect","counter","stopPropagation","binId","getData","$apply","fn","on","require","modelCtrl","lowercase","inputValue","undefined","lowercased","$setViewValue","$render","$parsers","ngModel","$window","getSelection","setSelectionRange","linkFunction","$attrs","timer","initialDelay","getTypeDelay","typeDelay","eraseDelay","blinkDelay","getAnimationDelay","cursor","blinkCursor","currentText","textArray","running","auxStyle","start","typewrite","updateIt","charIndex","arrIndex","updateValue","substring","iterationCallback","cleanAndRestart","iterationDelay","callbackFn","blinkIt","charAt","parseInt","prop","val","html","newVal","oldVal"],"mappings":"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","file":"transpiled.js","sourcesContent":["class SNCrypto {\n\n generateRandomKey() {\n return CryptoJS.lib.WordArray.random(256/8).toString();\n }\n\n generateUUID() {\n var d = new Date().getTime();\n if(window.performance && typeof window.performance.now === \"function\"){\n d += performance.now(); //use high-precision timer if available\n }\n var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (d + Math.random()*16)%16 | 0;\n d = Math.floor(d/16);\n return (c=='x' ? r : (r&0x3|0x8)).toString(16);\n });\n return uuid;\n }\n\n decryptText(encrypted_content, key) {\n return CryptoJS.AES.decrypt(encrypted_content, key).toString(CryptoJS.enc.Utf8);\n }\n\n encryptText(text, key) {\n return CryptoJS.AES.encrypt(text, key).toString();\n }\n\n generateRandomEncryptionKey() {\n var salt = Neeto.crypto.generateRandomKey();\n var passphrase = Neeto.crypto.generateRandomKey();\n return CryptoJS.PBKDF2(passphrase, salt, { keySize: 256/32 }).toString();\n }\n\n sha256(text) {\n return CryptoJS.SHA256(text).toString();\n }\n\n sha1(text) {\n return CryptoJS.SHA1(text).toString();\n }\n\n computeEncryptionKeysForUser({email, password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.generateSymmetricKeyPair({password: password, pw_salt: pw_salt,\n pw_func: pw_func, pw_alg: pw_alg, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(keys){\n var pw = keys[0];\n var gk = keys[1];\n\n callback({pw: pw, gk: gk});\n });\n }\n\n generateInitialEncryptionKeysForUser({email, password} = {}, callback) {\n var defaults = this.defaultPasswordGenerationParams();\n var {pw_func, pw_alg, pw_key_size, pw_cost} = defaults;\n var pw_nonce = this.generateRandomKey();\n var pw_salt = this.sha1(email + \"SN\" + pw_nonce);\n this.generateSymmetricKeyPair(_.merge({email: email, password: password, pw_salt: pw_salt}, defaults), function(keys){\n var pw = keys[0];\n var gk = keys[1];\n\n callback(_.merge({pw: pw, gk: gk, pw_nonce: pw_nonce}, defaults));\n });\n }\n}\n\nexport { SNCrypto }\n;class SNCryptoJS extends SNCrypto {\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : CryptoJS.algo.SHA256,\n \"sha512\" : CryptoJS.algo.SHA512\n }\n var fnMapping = {\n \"pbkdf2\" : CryptoJS.PBKDF2\n }\n\n var alg = algMapping[pw_alg];\n var kdf = fnMapping[pw_func];\n var output = kdf(password, pw_salt, { keySize: pw_key_size/32, hasher: alg, iterations: pw_cost }).toString();\n\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf])\n }\n\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 3000};\n }\n }\n\n\nexport { SNCryptoJS }\n;var subtleCrypto = window.crypto.subtle;\n\nclass SNCryptoWeb extends SNCrypto {\n\n /**\n Overrides\n */\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 5000};\n }\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.stretchPassword({password: password, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(output){\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf]);\n })\n }\n\n /**\n Internal\n */\n\n stretchPassword({password, pw_salt, pw_cost, pw_func, pw_alg, pw_key_size} = {}, callback) {\n\n this.webCryptoImportKey(password, pw_func, function(key){\n console.log(\"Importing key\", password);\n\n if(!key) {\n console.log(\"Key is null, unable to continue\");\n callback(null);\n return;\n }\n\n this.webCryptoDeriveBits({key: key, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(key){\n if(!key) {\n callback(null);\n return;\n }\n\n callback(key);\n\n }.bind(this))\n }.bind(this))\n }\n\n webCryptoImportKey(input, pw_func, callback) {\n subtleCrypto.importKey(\n \"raw\",\n this.stringToArrayBuffer(input),\n {name: pw_func.toUpperCase()},\n false,\n [\"deriveBits\"]\n )\n .then(function(key){\n callback(key);\n })\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n webCryptoDeriveBits({key, pw_func, pw_alg, pw_salt, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : \"SHA-256\",\n \"sha512\" : \"SHA-512\",\n }\n var alg = algMapping[pw_alg];\n subtleCrypto.deriveBits(\n {\n \"name\": pw_func.toUpperCase(),\n salt: this.stringToArrayBuffer(pw_salt),\n iterations: pw_cost,\n hash: {name: alg},\n },\n key,\n pw_key_size\n )\n .then(function(bits){\n var key = this.arrayBufferToHexString(new Uint8Array(bits));\n callback(key);\n }.bind(this))\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n stringToArrayBuffer(string) {\n var encoder = new TextEncoder(\"utf-8\");\n return encoder.encode(string);\n }\n\n arrayBufferToHexString(arrayBuffer) {\n var byteArray = new Uint8Array(arrayBuffer);\n var hexString = \"\";\n var nextHexByte;\n\n for (var i=0; i\"},\n {title: \"NPM install without sudo\", content: \"sudo chown -R $(whoami) ~/.npm\"},\n {title: \"Email validation regex\", content: \"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$\"},\n {title: \"Ruby generate 256 bit key\", content: \"Digest::SHA256.hexdigest(SecureRandom.random_bytes(32))\"},\n {title: \"Mac add user to user tag\", content: \"sudo dsedittag -o edit -a USERNAME -t user GROUPNAME\"},\n {title: \"Kill Mac OS System Apache\", content: \"sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist\"},\n {title: \"Docker run with mount binding and port\", content: \"docker run -v /home/vagrant/www/app:/var/www/app -p 8080:80 -d kpi/s3\"},\n {title: \"MySQL grant privileges\", content: \"GRANT [type of permission] ON [database name].[table name] TO ‘[username]’@'%’;\"},\n {title: \"MySQL list users\", content: \"SELECT User FROM mysql.user;\"},\n ];\n\n this.showSampler = !this.user.uuid && modelManager.filteredNotes.length == 0;\n\n this.demoNoteNames = _.map(this.demoNotes, function(note){\n return note.title;\n });\n\n this.currentDemoContent = {text: null};\n\n this.prebeginFn = function() {\n this.currentDemoContent.text = null;\n }.bind(this)\n\n this.callback = function(index) {\n this.currentDemoContent.text = this.demoNotes[index].text;\n }.bind(this)\n\n this.contentCallback = function(index) {\n }\n\n this.setNote = function(note, oldNote) {\n this.editorMode = 'edit';\n if(note.content.text.length == 0) {\n this.focusTitle(100);\n }\n\n if(oldNote && oldNote != note) {\n if(oldNote.hasChanges) {\n this.save()(oldNote, null);\n } else if(oldNote.dummy) {\n this.remove()(oldNote);\n }\n }\n }\n\n this.onPreviewDoubleClick = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n this.focusEditor = function(delay) {\n setTimeout(function(){\n var element = document.getElementById(\"note-text-editor\");\n element.focus();\n }, delay)\n }\n\n this.focusTitle = function(delay) {\n setTimeout(function(){\n document.getElementById(\"note-title-editor\").focus();\n }, delay)\n }\n\n this.clickedTextArea = function() {\n this.showMenu = false;\n }\n\n this.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText(this.note.content.text));\n }\n\n var statusTimeout;\n\n this.saveNote = function($event) {\n var note = this.note;\n note.dummy = false;\n this.save()(note, function(success){\n if(success) {\n apiController.clearDraft();\n\n if(statusTimeout) $timeout.cancel(statusTimeout);\n statusTimeout = $timeout(function(){\n this.noteStatus = \"All changes saved\"\n }.bind(this), 200)\n }\n }.bind(this));\n }\n\n this.saveTitle = function($event) {\n $event.target.blur();\n this.saveNote($event);\n this.focusEditor();\n }\n\n var saveTimeout;\n this.changesMade = function() {\n this.note.hasChanges = true;\n this.note.dummy = false;\n apiController.saveDraftToDisk(this.note);\n\n if(saveTimeout) $timeout.cancel(saveTimeout);\n if(statusTimeout) $timeout.cancel(statusTimeout);\n saveTimeout = $timeout(function(){\n this.noteStatus = \"Saving...\";\n this.saveNote();\n }.bind(this), 150)\n }\n\n\n this.contentChanged = function() {\n this.changesMade();\n }\n\n this.nameChanged = function() {\n this.changesMade();\n }\n\n this.onNameFocus = function() {\n this.editingName = true;\n }\n\n this.onContentFocus = function() {\n this.showSampler = false;\n $rootScope.$broadcast(\"editorFocused\");\n this.editingUrl = false;\n }\n\n this.onNameBlur = function() {\n this.editingName = false;\n }\n\n this.toggleFullScreen = function() {\n this.fullscreen = !this.fullscreen;\n if(this.fullscreen) {\n if(this.editorMode == 'edit') {\n // refocus\n this.focusEditor(0);\n }\n } else {\n\n }\n }\n\n this.selectedMenuItem = function() {\n this.showMenu = false;\n }\n\n this.toggleMarkdown = function() {\n if(this.editorMode == 'preview') {\n this.editorMode = 'edit';\n } else {\n this.editorMode = 'preview';\n }\n }\n\n this.editUrlPressed = function() {\n this.showMenu = false;\n var url = this.publicUrlForNote(this.note);\n url = url.replace(this.note.presentation_name, \"\");\n this.url = {base: url, token : this.note.presentation_name};\n this.editingUrl = true;\n }\n\n this.saveUrl = function($event) {\n $event.target.blur();\n\n var original = this.note.presentation_name;\n this.note.presentation_name = this.url.token;\n\n apiController.saveItems([this.note], function(response){\n if(!response) {\n this.note.presentation_name = original;\n this.url.token = original;\n alert(\"This URL is not available.\");\n } else {\n this.editingUrl = false;\n }\n }.bind(this))\n }\n\n this.shareNote = function() {\n\n function openInNewTab(url) {\n var a = document.createElement(\"a\");\n a.target = \"_blank\";\n a.href = url;\n a.click();\n }\n\n apiController.shareItem(this.note, function(note){\n openInNewTab(this.publicUrlForNote(note));\n }.bind(this))\n this.showMenu = false;\n }\n\n this.unshareNote = function() {\n apiController.unshareItem(this.note, function(note){\n\n })\n this.showMenu = false;\n }\n\n this.publicUrlForNote = function() {\n return this.note.presentationURL();\n }\n\n this.clickedMenu = function() {\n if(this.note.locked) {\n alert(\"This note has been shared without an account, and can therefore not be changed.\")\n } else {\n this.showMenu = !this.showMenu;\n }\n }\n\n this.deleteNote = function() {\n apiController.clearDraft();\n this.remove()(this.note);\n this.showMenu = false;\n }\n\n this.clickedEditNote = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n });\n;angular.module('app.frontend')\n .directive(\"header\", function(){\n return {\n restrict: 'E',\n scope: {\n user: \"=\",\n logout: \"&\"\n },\n templateUrl: 'frontend/header.html',\n replace: true,\n controller: 'HeaderCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n\n }\n }\n })\n .controller('HeaderCtrl', function ($auth, $state, apiController, modelManager, serverSideValidation, $timeout) {\n\n this.changePasswordPressed = function() {\n this.showNewPasswordForm = !this.showNewPasswordForm;\n }\n\n this.accountMenuPressed = function() {\n this.serverData = {url: apiController.getServer()};\n this.showAccountMenu = !this.showAccountMenu;\n this.showFaq = false;\n this.showNewPasswordForm = false;\n }\n\n this.changeServer = function() {\n apiController.setServer(this.serverData.url, true);\n }\n\n this.signOutPressed = function() {\n this.showAccountMenu = false;\n this.logout()();\n apiController.signout();\n window.location.reload();\n }\n\n this.submitPasswordChange = function() {\n this.passwordChangeData.status = \"Generating New Keys...\";\n\n $timeout(function(){\n if(data.password != data.password_confirmation) {\n alert(\"Your new password does not match its confirmation.\");\n return;\n }\n\n apiController.changePassword(this.user, this.passwordChangeData.current_password, this.passwordChangeData.new_password, function(response){\n\n })\n\n }.bind(this))\n }\n\n this.hasLocalData = function() {\n return modelManager.filteredNotes.length > 0;\n }\n\n this.mergeLocalChanged = function() {\n if(!this.user.shouldMerge) {\n if(!confirm(\"Unchecking this option means any locally stored tags and notes you have now will be deleted. Are you sure you want to continue?\")) {\n this.user.shouldMerge = true;\n }\n }\n }\n\n this.loginSubmitPressed = function() {\n this.loginData.status = \"Generating Login Keys...\";\n $timeout(function(){\n apiController.login(this.loginData.email, this.loginData.user_password, function(response){\n if(response.errors) {\n this.loginData.status = response.errors[0];\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.submitRegistrationForm = function() {\n this.loginData.status = \"Generating Account Keys...\";\n\n $timeout(function(){\n apiController.register(this.loginData.email, this.loginData.user_password, function(response){\n if(response.errors) {\n this.loginData.status = response.errors[0];\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.forgotPasswordSubmit = function() {\n $auth.requestPasswordReset(this.resetData)\n .then(function(resp) {\n this.resetData.response = \"Success\";\n // handle success response\n }.bind(this))\n .catch(function(resp) {\n // handle error response\n this.resetData.response = \"Error\";\n }.bind(this));\n }\n\n this.encryptionStatusForNotes = function() {\n var allNotes = modelManager.filteredNotes;\n var countEncrypted = 0;\n allNotes.forEach(function(note){\n if(note.encryptionEnabled()) {\n countEncrypted++;\n }\n }.bind(this))\n\n return countEncrypted + \"/\" + allNotes.length + \" notes encrypted\";\n }\n\n this.downloadDataArchive = function() {\n var link = document.createElement('a');\n link.setAttribute('download', 'neeto.json');\n link.href = apiController.itemsDataFile();\n link.click();\n }\n\n this.importFileSelected = function(files) {\n var file = files[0];\n var reader = new FileReader();\n reader.onload = function(e) {\n apiController.importJSONData(e.target.result, function(success, response){\n console.log(\"import response\", success, response);\n if(success) {\n // window.location.reload();\n } else {\n alert(\"There was an error importing your data. Please try again.\");\n }\n })\n }\n reader.readAsText(file);\n }\n\n this.onAuthSuccess = function(user) {\n this.user.uuid = user.uuid;\n\n if(this.user.shouldMerge && this.hasLocalData()) {\n apiController.mergeLocalDataRemotely(this.user, function(){\n window.location.reload();\n });\n } else {\n window.location.reload();\n }\n\n this.showLogin = false;\n this.showRegistration = false;\n }\n\n });\n;angular.module('app.frontend')\n.controller('HomeCtrl', function ($scope, $rootScope, $timeout, apiController, modelManager) {\n $rootScope.bodyClass = \"app-body-class\";\n $rootScope.title = \"Notes — Neeto, a secure code box for developers\";\n $rootScope.description = \"A secure code box for developers to store common commands and useful notes.\";\n\n var onUserSet = function() {\n apiController.setUser($scope.defaultUser);\n $scope.allTag = new Tag({all: true});\n $scope.allTag.content.title = \"All\";\n $scope.tags = modelManager.tags;\n\n // apiController.verifyEncryptionStatusOfAllItems($scope.defaultUser, function(success){});\n }\n\n apiController.getCurrentUser(function(user, items){\n if(user && items) {\n console.log(\"Get user response\", user, items);\n $scope.defaultUser = user;\n modelManager.items = items;\n $rootScope.title = \"Notes — Neeto\";\n onUserSet();\n } else {\n $scope.defaultUser = new User(apiController.localUser());\n onUserSet();\n }\n });\n\n /*\n Tags Ctrl Callbacks\n */\n\n $scope.updateAllTag = function() {\n $scope.allTag.notes = modelManager.filteredNotes;\n }\n\n $scope.tagsWillMakeSelection = function(tag) {\n if(tag.all) {\n $scope.updateAllTag();\n }\n }\n\n $scope.tagsSelectionMade = function(tag) {\n $scope.selectedTag = tag;\n }\n\n $scope.tagsAddNew = function(tag) {\n modelManager.addTag(tag);\n }\n\n $scope.tagsSave = function(tag, callback) {\n apiController.saveItems([tag], callback);\n }\n\n /*\n Called to update the tag of a note after drag and drop change\n The note object is a copy of the original\n */\n $scope.tagsUpdateNoteTag = function(noteCopy, newTag, oldTag) {\n\n var originalNote = _.find(modelManager.notes, {uuid: noteCopy.uuid});\n if(!newTag.all) {\n modelManager.addTagToNote(newTag, originalNote);\n }\n\n apiController.saveDirtyItems(function(){});\n }\n\n /*\n Notes Ctrl Callbacks\n */\n\n $scope.notesRemoveTag = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n if(validNotes == 0) {\n // if no more notes, delete tag\n apiController.deleteItem($scope.defaultUser, tag, function(){\n // force scope tags to update on sub directives\n $scope.tags = [];\n $timeout(function(){\n $scope.tags = modelManager.tags;\n })\n });\n } else {\n alert(\"To delete this tag, remove all its notes first.\");\n }\n }\n\n $scope.notesSelectionMade = function(note) {\n $scope.selectedNote = note;\n }\n\n $scope.notesAddNew = function(note) {\n modelManager.addNote(note);\n\n if(!$scope.selectedTag.all) {\n modelManager.addTagToNote($scope.selectedTag, note);\n $scope.updateAllTag();\n } else {\n $scope.selectedTag.notes.unshift(note);\n }\n\n }\n\n /*\n Shared Callbacks\n */\n\n $scope.saveNote = function(note, callback) {\n modelManager.addDirtyItems(note);\n\n apiController.saveDirtyItems(function(){\n modelManager.addNote(note);\n note.hasChanges = false;\n\n if(callback) {\n callback(true);\n }\n })\n }\n\n $scope.deleteNote = function(note) {\n\n modelManager.deleteNote(note);\n\n if(note == $scope.selectedNote) {\n $scope.selectedNote = null;\n }\n\n $scope.updateAllTag();\n\n if(note.dummy) {\n return;\n }\n\n apiController.deleteItem(note, function(success){})\n apiController.saveDirtyItems(function(){});\n }\n\n /*\n Header Ctrl Callbacks\n */\n\n $scope.headerLogout = function() {\n $scope.defaultUser = apiController.localUser();\n $scope.tags = $scope.defaultUser.tags;\n }\n\n\n});\n;angular.module('app.frontend')\n .directive(\"notesSection\", function(){\n return {\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n remove: \"&\",\n tag: \"=\",\n user: \"=\",\n removeTag: \"&\"\n },\n\n templateUrl: 'frontend/notes.html',\n replace: true,\n controller: 'NotesCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tag', function(tag, oldTag){\n if(tag) {\n ctrl.tagDidChange(tag, oldTag);\n }\n });\n }\n }\n })\n .controller('NotesCtrl', function (apiController, $timeout, $rootScope) {\n\n $rootScope.$on(\"editorFocused\", function(){\n this.showMenu = false;\n }.bind(this))\n\n var isFirstLoad = true;\n\n this.tagDidChange = function(tag, oldTag) {\n this.showMenu = false;\n\n if(this.selectedNote && this.selectedNote.dummy) {\n _.remove(oldTag.notes, this.selectedNote);\n }\n\n this.noteFilter.text = \"\";\n\n tag.notes.forEach(function(note){\n note.visible = true;\n })\n this.selectFirstNote(false);\n\n if(isFirstLoad) {\n $timeout(function(){\n var draft = apiController.getDraft();\n if(draft) {\n var note = draft;\n this.selectNote(note);\n } else {\n this.createNewNote();\n isFirstLoad = false;\n }\n }.bind(this))\n } else if(tag.notes.length == 0) {\n this.createNewNote();\n }\n }\n\n this.selectedTagDelete = function() {\n this.showMenu = false;\n this.removeTag()(this.tag);\n }\n\n this.selectedTagShare = function() {\n this.showMenu = false;\n\n if(!this.user.uuid) {\n alert(\"You must be signed in to share a tag.\");\n return;\n }\n\n if(this.tag.all) {\n alert(\"You cannot share the 'All' tag.\");\n return;\n }\n\n apiController.shareItem(this.tag, function(response){})\n }\n\n this.selectedTagUnshare = function() {\n this.showMenu = false;\n apiController.unshareItem(this.tag, function(response){\n\n })\n }\n\n this.selectFirstNote = function(createNew) {\n var visibleNotes = this.tag.notes.filter(function(note){\n return note.visible;\n });\n\n if(visibleNotes.length > 0) {\n this.selectNote(visibleNotes[0]);\n } else if(createNew) {\n this.createNewNote();\n }\n }\n\n this.selectNote = function(note) {\n this.selectedNote = note;\n this.selectionMade()(note);\n }\n\n this.createNewNote = function() {\n var title = \"New Note\" + (this.tag.notes ? (\" \" + (this.tag.notes.length + 1)) : \"\");\n this.newNote = new Note({dummy: true});\n this.newNote.content.title = title;\n this.selectNote(this.newNote);\n this.addNew()(this.newNote);\n }\n\n this.noteFilter = {text : ''};\n\n this.filterNotes = function(note) {\n if(this.noteFilter.text.length == 0) {\n note.visible = true;\n } else {\n note.visible = note.title.toLowerCase().includes(this.noteFilter.text) || note.text.toLowerCase().includes(this.noteFilter.text);\n }\n return note.visible;\n }.bind(this)\n\n this.filterTextChanged = function() {\n $timeout(function(){\n if(!this.selectedNote.visible) {\n this.selectFirstNote(false);\n }\n }.bind(this), 100)\n }\n });\n;angular.module('app.frontend')\n .directive(\"tagsSection\", function(){\n return {\n restrict: 'E',\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n willSelect: \"&\",\n save: \"&\",\n tags: \"=\",\n allTag: \"=\",\n user: \"=\",\n updateNoteTag: \"&\"\n },\n templateUrl: 'frontend/tags.html',\n replace: true,\n controller: 'TagsCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tags', function(newTags){\n if(newTags) {\n ctrl.setTags(newTags);\n }\n });\n\n scope.$watch('ctrl.allTag', function(allTag){\n if(allTag) {\n ctrl.setAllTag(allTag);\n }\n });\n }\n }\n })\n .controller('TagsCtrl', function () {\n\n var initialLoad = true;\n\n this.setAllTag = function(allTag) {\n this.selectTag(this.allTag);\n }\n\n this.setTags = function(tags) {\n if(initialLoad) {\n initialLoad = false;\n this.selectTag(this.allTag);\n } else {\n if(tags && tags.length > 0) {\n this.selectTag(tags[0]);\n }\n }\n }\n\n this.selectTag = function(tag) {\n this.willSelect()(tag);\n this.selectedTag = tag;\n this.selectionMade()(tag);\n }\n\n this.clickedAddNewTag = function() {\n if(this.editingTag) {\n return;\n }\n\n this.newTag = new Tag();\n this.selectedTag = this.newTag;\n this.editingTag = this.newTag;\n this.addNew()(this.newTag);\n }\n\n var originalTagName = \"\";\n this.onTagTitleFocus = function(tag) {\n originalTagName = tag.content.title;\n }\n\n this.tagTitleDidChange = function(tag) {\n this.editingTag = tag;\n }\n\n this.saveTag = function($event, tag) {\n this.editingTag = null;\n if(tag.content.title.length == 0) {\n tag.content.title = originalTagName;\n originalTagName = \"\";\n return;\n }\n\n $event.target.blur();\n if(!tag.content.title || tag.content.title.length == 0) {\n return;\n }\n\n this.save()(tag, function(savedTag){\n // _.merge(tag, savedTag);\n this.selectTag(tag);\n this.newTag = null;\n }.bind(this));\n }\n\n this.noteCount = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n return validNotes.length;\n }\n\n this.handleDrop = function(e, newTag, note) {\n this.updateNoteTag()(note, newTag, this.selectedTag);\n }.bind(this)\n\n\n });\n;angular.module('app.frontend')\n.controller('UsernameModalCtrl', function ($scope, apiController, Restangular, user, callback, $timeout) {\n $scope.formData = {};\n\n $scope.saveUsername = function() {\n apiController.setUsername(user, $scope.formData.username, function(response){\n var username = response.username;\n user.username = username;\n callback(username);\n $scope.closeThisDialog();\n })\n }\n});\n;class Item {\n constructor(json_obj) {\n\n var content;\n\n Object.defineProperty(this, \"content\", {\n get: function() {\n return content;\n },\n set: function(value) {\n var finalValue = value;\n\n if(typeof value === 'string') {\n try {\n var decodedValue = JSON.parse(value);\n finalValue = decodedValue;\n }\n catch(e) {\n finalValue = value;\n }\n }\n content = finalValue;\n },\n enumerable: true,\n });\n\n _.merge(this, json_obj);\n\n if(!this.uuid) {\n this.uuid = Neeto.crypto.generateUUID();\n }\n\n this.setContentRaw = function(rawContent) {\n content = rawContent;\n }\n\n if(!this.content) {\n this.content = {};\n }\n\n if(!this.content.references) {\n this.content.references = [];\n }\n }\n\n addReference(reference) {\n this.content.references.push(reference);\n this.content.references = _.uniq(this.content.references);\n this.updateReferencesLocalMapping();\n }\n\n removeReference(reference) {\n _.remove(this.content.references, _.find(this.content.references, {uuid: reference.uuid}));\n this.updateReferencesLocalMapping();\n }\n\n referencesMatchingContentType(contentType) {\n return this.content.references.filter(function(reference){\n return reference.content_type == contentType;\n });\n }\n\n mergeMetadataFromItem(item) {\n _.merge(this, _.omit(item, [\"content\"]));\n }\n\n updateReferencesLocalMapping() {\n // should be overriden to manage local properties\n }\n\n referencesAffectedBySharingChange() {\n // should be overriden to determine which references should be decrypted/encrypted\n return null;\n }\n\n isPublic() {\n return this.presentation_name;\n }\n\n isEncrypted() {\n return this.encryptionEnabled() && typeof this.content === 'string' ? true : false;\n }\n\n encryptionEnabled() {\n return this.loc_eek;\n }\n\n presentationURL() {\n return this.presentation_url;\n }\n\n}\n;class Note extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.tags) {\n this.tags = [];\n }\n\n if(!this.content.title) {\n this.content.title = \"\";\n this.content.text = \"\";\n }\n }\n\n static filterDummyNotes(notes) {\n var filtered = notes.filter(function(note){return note.dummy == false || note.dummy == null});\n return filtered;\n }\n\n updateReferencesLocalMapping() {\n super.updateReferencesLocalMapping();\n this.tags = this.referencesMatchingContentType(\"Tag\");\n }\n\n referencesAffectedBySharingChange() {\n return super.referencesAffectedBySharingChange();\n }\n\n get hasOnePublicTag() {\n var hasPublicTag = false;\n this.tags.forEach(function(tag){\n if(tag.isPublic()) {\n hasPublicTag = true;\n return;\n }\n })\n\n return hasPublicTag;\n }\n\n toJSON() {\n return {uuid: this.uuid}\n }\n\n isPublic() {\n return super.isPublic() || this.hasOnePublicTag;\n }\n\n get content_type() {\n return \"Note\";\n }\n}\n;class Tag extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.notes) {\n this.notes = [];\n }\n\n if(!this.content.title) {\n this.content.title = \"\";\n }\n }\n\n get content_type() {\n return \"Tag\";\n }\n\n updateReferencesLocalMapping() {\n super.updateReferencesLocalMapping();\n this.notes = this.referencesMatchingContentType(\"Note\");\n }\n\n referencesAffectedBySharingChange() {\n return this.referencesMatchingContentType(\"Note\");\n }\n}\n;class User {\n constructor(json_obj) {\n _.merge(this, json_obj);\n }\n}\n;angular.module('app.frontend')\n .provider('apiController', function () {\n\n function domainName() {\n var domain_comps = location.hostname.split(\".\");\n var domain = domain_comps[domain_comps.length - 2] + \".\" + domain_comps[domain_comps.length - 1];\n return domain;\n }\n\n var url;\n\n this.defaultServerURL = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = location.protocol + \"//\" + domainName() + (location.port ? ':' + location.port: '');\n }\n }\n return url;\n }\n\n\n this.$get = function(Restangular, modelManager, ngDialog) {\n return new ApiController(Restangular, modelManager, ngDialog);\n }\n\n function ApiController(Restangular, modelManager, ngDialog) {\n\n this.setUser = function(user) {\n this.user = user;\n }\n\n /*\n Config\n */\n\n this.getServer = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = location.protocol + \"//\" + domainName() + (location.port ? ':' + location.port: '');\n this.setServer(url);\n }\n }\n return url;\n }\n\n this.setServer = function(url, refresh) {\n localStorage.setItem(\"server\", url);\n if(refresh) {\n window.location.reload();\n }\n }\n\n\n /*\n Auth\n */\n\n this.getAuthParamsForEmail = function(email, callback) {\n var request = Restangular.one(\"auth\", \"params\");\n request.get({email: email}).then(function(response){\n callback(response.plain());\n })\n }\n\n this.getCurrentUser = function(callback) {\n if(!localStorage.getItem(\"jwt\")) {\n callback(null);\n return;\n }\n Restangular.one(\"users/current\").get().then(function(response){\n var plain = response.plain();\n var items = plain.items;\n this.decryptItemsWithLocalKey(items);\n items = this.mapResponseItemsToLocalModels(items);\n var user = _.omit(plain, [\"items\"]);\n callback(user, items);\n }.bind(this))\n .catch(function(error){\n callback(null);\n })\n }\n\n this.login = function(email, password, callback) {\n console.log(\"login with\", email, password);\n this.getAuthParamsForEmail(email, function(authParams){\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({email: email, password: password}, authParams), function(keys){\n this.setGk(keys.gk);\n var request = Restangular.one(\"auth/sign_in\");\n request.user = {password: keys.pw, email: email};\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n callback(response);\n })\n }.bind(this));\n }.bind(this))\n }\n\n this.register = function(email, password, callback) {\n Neeto.crypto.generateInitialEncryptionKeysForUser({password: password, email: email}, function(keys){\n this.setGk(keys.gk);\n keys.gk = null;\n var request = Restangular.one(\"auth\");\n request.user = _.merge({password: keys.pw, email: email}, keys);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n callback(response);\n })\n }.bind(this));\n }\n\n this.changePassword = function(user, current_password, new_password) {\n this.getAuthParamsForEmail(email, function(authParams){\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: current_password, email: user.email}, authParams), function(currentKeys) {\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: new_password, email: user.email}, authParams), function(newKeys){\n var data = {};\n data.current_password = currentKeys.pw;\n data.password = newKeys.pw;\n data.password_confirmation = newKeys.pw;\n\n var user = this.user;\n\n this._performPasswordChange(currentKeys, newKeys, function(response){\n if(response && !response.errors) {\n // this.showNewPasswordForm = false;\n // reencrypt data with new gk\n this.reencryptAllItemsAndSave(user, newKeys.gk, currentKeys.gk, function(success){\n if(success) {\n this.setGk(newKeys.gk);\n alert(\"Your password has been changed and your data re-encrypted.\");\n } else {\n // rollback password\n this._performPasswordChange(newKeys, currentKeys, function(response){\n alert(\"There was an error changing your password. Your password has been rolled back.\");\n window.location.reload();\n })\n }\n }.bind(this));\n } else {\n // this.showNewPasswordForm = false;\n alert(\"There was an error changing your password. Please try again.\");\n }\n }.bind(this))\n }.bind(this));\n }.bind(this));\n }.bind(this));\n }\n\n this._performPasswordChange = function(email, current_keys, new_keys, callback) {\n var request = Restangular.one(\"auth\");\n request.user = {password: new_keys.pw, password_confirmation: new_keys.pw, current_password: current_keys.pw, email: email};\n request.patch().then(function(response){\n callback(response);\n })\n }\n\n\n /*\n User\n */\n\n this.setUsername = function(user, username, callback) {\n var request = Restangular.one(\"users\", user.uuid);\n request.username = username;\n request.patch().then(function(response){\n callback(response.plain());\n })\n }\n\n /*\n Ensures that if encryption is disabled, all local items are uncrypted,\n and that if it's enabled, that all local items are encrypted\n */\n this.verifyEncryptionStatusOfAllItems = function(user, callback) {\n var allItems = user.filteredItems();\n var itemsNeedingUpdate = [];\n allItems.forEach(function(item){\n if(!item.isPublic()) {\n if(item.encryptionEnabled() && !item.isEncrypted()) {\n itemsNeedingUpdate.push(item);\n }\n } else {\n if(item.isEncrypted()) {\n itemsNeedingUpdate.push(item);\n }\n }\n }.bind(this))\n\n if(itemsNeedingUpdate.length > 0) {\n console.log(\"verifying encryption, items need updating\", itemsNeedingUpdate);\n this.saveBatchItems(user, itemsNeedingUpdate, callback)\n }\n }\n\n\n\n /*\n Items\n */\n\n this.saveDirtyItems = function(callback) {\n var dirtyItems = modelManager.dirtyItems;\n if(dirtyItems.length == 0) {\n callback();\n return;\n }\n\n this.saveItems(dirtyItems, function(response){\n modelManager.clearDirtyItems();\n callback();\n })\n }\n\n this.saveItems = function(items, callback) {\n console.log(\"saving items\", items);\n var request = Restangular.one(\"users\", this.user.uuid).one(\"items\");\n request.items = _.map(items, function(item){\n return this.createRequestParamsForItem(item);\n }.bind(this));\n console.log(\"sending request items\", request.items);\n\n request.post().then(function(response) {\n var savedItems = response.items;\n this.decryptItemsWithLocalKey(savedItems);\n items.forEach(function(item){\n var savedCounterpart = _.find(savedItems, {uuid: item.uuid});\n item.mergeMetadataFromItem(savedCounterpart);\n })\n\n console.log(\"response items\", savedItems);\n callback(response);\n }.bind(this))\n }\n\n this.mapResponseItemsToLocalModels = function(items) {\n return _.map(items, function(json_obj){\n if(json_obj.content_type == \"Note\") {\n return new Note(json_obj);\n } else if(json_obj.content_type == \"Tag\") {\n return new Tag(json_obj);\n } else {\n return new Item(json_obj);\n }\n });\n }\n\n this.createRequestParamsForItem = function(item) {\n return this.paramsForItem(item, !item.isPublic(), null, false);\n }\n\n this.paramsForItem = function(item, encrypted, additionalFields, forExportFile) {\n var itemCopy = _.cloneDeep(item);\n\n var params = {uuid: item.uuid, content_type: item.content_type, presentation_name: item.presentation_name};\n\n itemCopy.content.references = _.map(itemCopy.content.references, function(reference){\n return {uuid: reference.uuid, content_type: reference.content_type};\n })\n\n if(encrypted) {\n this.encryptSingleItem(itemCopy, this.retrieveGk());\n params.content = itemCopy.content;\n params.loc_eek = itemCopy.loc_eek;\n }\n else {\n params.content = forExportFile ? itemCopy.content : JSON.stringify(itemCopy.content);\n if(!forExportFile) {\n params.loc_eek = null;\n }\n }\n\n if(additionalFields) {\n _.merge(params, _.pick(item, additionalFields));\n }\n\n return params;\n }\n\n\n this.deleteItem = function(item, callback) {\n if(!this.user.uuid) {\n this.writeUserToLocalStorage(this.user);\n callback(true);\n } else {\n Restangular.one(\"users\", this.user.uuid).one(\"items\", item.uuid).remove()\n .then(function(response) {\n callback(true);\n })\n }\n }\n\n this.shareItem = function(item, callback) {\n console.log(\"sharing item\", item);\n if(!this.user.uuid) {\n alert(\"You must be signed in to share.\");\n return;\n }\n\n var shareFn = function() {\n item.presentation_name = \"_auto_\";\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n this.saveItems(needsUpdate, function(success){})\n }.bind(this)\n\n if(!this.user.username) {\n ngDialog.open({\n template: 'frontend/modals/username.html',\n controller: 'UsernameModalCtrl',\n resolve: {\n user: function() {return this.user}.bind(this),\n callback: function() {\n return shareFn;\n }\n },\n className: 'ngdialog-theme-default',\n disableAnimation: true\n });\n } else {\n shareFn();\n }\n }\n\n this.unshareItem = function(item, callback) {\n console.log(\"unsharing item\", item);\n item.presentation_name = null;\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n this.saveItems(needsUpdate, function(success){})\n }\n\n /*\n Import\n */\n\n this.importJSONData = function(jsonString, callback) {\n var data = JSON.parse(jsonString);\n var customModelManager = new ModelManager();\n customModelManager.items = this.mapResponseItemsToLocalModels(data.items);\n console.log(\"importing data\", JSON.parse(jsonString));\n this.saveItems(customModelManager.items, function(response){\n callback(response);\n });\n }\n\n /*\n Export\n */\n\n this.itemsDataFile = function() {\n var textFile = null;\n var makeTextFile = function (text) {\n var data = new Blob([text], {type: 'text/json'});\n\n // If we are replacing a previously generated file we need to\n // manually revoke the object URL to avoid memory leaks.\n if (textFile !== null) {\n window.URL.revokeObjectURL(textFile);\n }\n\n textFile = window.URL.createObjectURL(data);\n\n // returns a URL you can use as a href\n return textFile;\n }.bind(this);\n\n var items = _.map(modelManager.items, function(item){\n return this.paramsForItem(item, false, [\"created_at\", \"updated_at\"], true)\n }.bind(this));\n\n var data = {\n items: items\n }\n\n return makeTextFile(JSON.stringify(data, null, 2 /* pretty print */));\n }\n\n\n\n /*\n Merging\n */\n this.mergeLocalDataRemotely = function(user, callback) {\n var request = Restangular.one(\"users\", user.uuid).one(\"merge\");\n var tags = user.tags;\n request.items = user.items;\n request.items.forEach(function(item){\n if(item.tag_id) {\n var tag = tags.filter(function(tag){return tag.uuid == item.tag_id})[0];\n item.tag_name = tag.content.title;\n }\n })\n request.post().then(function(response){\n callback();\n localStorage.removeItem('user');\n })\n }\n\n\n\n\n\n\n this.staticifyObject = function(object) {\n return JSON.parse(JSON.stringify(object));\n }\n\n this.writeUserToLocalStorage = function(user) {\n var saveUser = _.cloneDeep(user);\n saveUser.items = Item.filterDummyItems(saveUser.items);\n saveUser.tags.forEach(function(tag){\n tag.items = null;\n }.bind(this))\n this.writeToLocalStorage('user', saveUser);\n }\n\n this.writeToLocalStorage = function(key, value) {\n localStorage.setItem(key, angular.toJson(value));\n }\n\n this.localUser = function() {\n var user = JSON.parse(localStorage.getItem('user'));\n if(!user) {\n user = {items: [], tags: []};\n }\n user.shouldMerge = true;\n return user;\n }\n\n /*\n Drafts\n */\n\n this.saveDraftToDisk = function(draft) {\n // localStorage.setItem(\"draft\", JSON.stringify(draft));\n }\n\n this.clearDraft = function() {\n localStorage.removeItem(\"draft\");\n }\n\n this.getDraft = function() {\n var draftString = localStorage.getItem(\"draft\");\n if(!draftString || draftString == 'undefined') {\n return null;\n }\n return new Item(JSON.parse(draftString));\n }\n\n\n /*\n Encrpytion\n */\n\n this.retrieveGk = function() {\n if(!this.gk) {\n this.gk = localStorage.getItem(\"gk\");\n }\n return this.gk;\n }\n\n this.setGk = function(gk) {\n localStorage.setItem('gk', gk);\n }\n\n this.signout = function() {\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"gk\");\n }\n\n this.encryptSingleItem = function(item, key) {\n var ek = null;\n if(item.loc_eek) {\n ek = Neeto.crypto.decryptText(item.loc_eek, key);\n } else {\n ek = Neeto.crypto.generateRandomEncryptionKey();\n item.loc_eek = Neeto.crypto.encryptText(ek, key);\n }\n item.content = Neeto.crypto.encryptText(JSON.stringify(item.content), ek);\n item.local_encryption_scheme = \"1.0\";\n }\n\n this.encryptItems = function(items, key) {\n items.forEach(function(item){\n this.encryptSingleItem(item, key);\n }.bind(this));\n }\n\n this.encryptSingleItemWithLocalKey = function(item) {\n this.encryptSingleItem(item, this.retrieveGk());\n }\n\n this.encryptItemsWithLocalKey = function(items) {\n this.encryptItems(items, this.retrieveGk());\n }\n\n this.encryptNonPublicItemsWithLocalKey = function(items) {\n var nonpublic = items.filter(function(item){\n return !item.isPublic() && !item.pending_share;\n })\n this.encryptItems(nonpublic, this.retrieveGk());\n }\n\n this.decryptSingleItemWithLocalKey = function(item) {\n this.decryptSingleItem(item, this.retrieveGk());\n }\n\n this.decryptSingleItem = function(item, key) {\n var ek = Neeto.crypto.decryptText(item.loc_eek || item.local_eek, key);\n var content = Neeto.crypto.decryptText(item.content, ek);\n // console.log(\"decrypted contnet\", content);\n item.content = content;\n }\n\n this.decryptItems = function(items, key) {\n items.forEach(function(item){\n // console.log(\"is encrypted?\", item);\n if(item.loc_eek && typeof item.content === 'string') {\n this.decryptSingleItem(item, key);\n }\n }.bind(this));\n }\n\n this.decryptItemsWithLocalKey = function(items) {\n this.decryptItems(items, this.retrieveGk());\n }\n\n this.reencryptAllItemsAndSave = function(user, newKey, oldKey, callback) {\n var items = user.filteredItems();\n items.forEach(function(item){\n if(item.loc_eek && typeof item.content === 'string') {\n // first decrypt eek with old key\n var ek = Neeto.crypto.decryptText(item.loc_eek, oldKey);\n // now encrypt ek with new key\n item.loc_eek = Neeto.crypto.encryptText(ek, newKey);\n }\n });\n\n this.saveBatchItems(user, items, function(success) {\n callback(success);\n }.bind(this));\n }\n }\n});\n;class ItemManager {\n\n set items(items) {\n this._items = items;\n this.resolveReferences();\n }\n\n get items() {\n return this._items;\n }\n\n referencesForItemId(itemId) {\n return _.find(this.items, {uuid: itemId});\n }\n\n resolveReferences() {\n this.items.forEach(function(item){\n // build out references, safely handle broken references\n item.content.references = _.reduce(item.content.references, function(accumulator, reference){\n var item = this.referencesForItemId(reference.uuid);\n if(item) {\n accumulator.push(item);\n }\n return accumulator;\n }.bind(this), []);\n }.bind(this));\n }\n\n itemsForContentType(contentType) {\n return this.items.filter(function(item){\n return item.content_type == contentType;\n });\n }\n\n // returns dirty item references that need saving\n deleteItem(item) {\n var dirty = [];\n _.remove(this.items, item);\n var length = item.content.references.length;\n // note that references are deleted in this for loop, so you have to be careful how you iterate\n for(var i = 0; i < length; i++) {\n var referencedItem = item.content.references[0];\n // console.log(\"removing references between items\", referencedItem, item);\n var _dirty = this.removeReferencesBetweenItems(referencedItem, item);\n dirty = dirty.concat(_dirty);\n }\n\n return dirty;\n }\n\n removeReferencesBetweenItems(itemOne, itemTwo) {\n itemOne.removeReference(itemTwo);\n itemTwo.removeReference(itemOne);\n return [itemOne, itemTwo];\n }\n\n createReferencesBetweenItems(itemOne, itemTwo) {\n itemOne.addReference(itemTwo);\n itemTwo.addReference(itemOne);\n return [itemOne, itemTwo];\n }\n}\n\nangular.module('app.frontend').service('itemManager', ItemManager);\n;angular.module('app.frontend')\n .service('markdownRenderer', function ($sce) {\n\n marked.setOptions({\n breaks: true,\n sanitize: true\n });\n\n this.renderedContentForText = function(text) {\n if(!text || text.length == 0) {\n return \"\";\n }\n return marked(text);\n }\n\n this.renderHtml = function(html_code) {\n return $sce.trustAsHtml(html_code);\n };\n\n\n });\n;class ModelManager extends ItemManager {\n\n constructor() {\n super();\n this.notes = [];\n this.groups = [];\n this.dirtyItems = [];\n }\n\n set items(items) {\n super.items = items;\n this.notes = this.itemsForContentType(\"Note\");\n this.notes.forEach(function(note){\n note.updateReferencesLocalMapping();\n })\n\n this.tags = this.itemsForContentType(\"Tag\");\n this.tags.forEach(function(tag){\n tag.updateReferencesLocalMapping();\n })\n }\n\n get items() {\n return super.items;\n }\n\n addDirtyItems(items) {\n if(!(items instanceof Array)) {\n items = [items];\n }\n\n this.dirtyItems = this.dirtyItems.concat(items);\n this.dirtyItems = _.uniq(this.dirtyItems);\n }\n\n get filteredNotes() {\n return Note.filterDummyNotes(this.notes);\n }\n\n clearDirtyItems() {\n this.dirtyItems = [];\n }\n\n addNote(note) {\n if(!_.find(this.notes, {uuid: note.uuid})) {\n this.notes.unshift(note);\n }\n }\n\n addTag(tag) {\n this.tags.unshift(tag);\n }\n\n addTagToNote(tag, note) {\n var dirty = this.createReferencesBetweenItems(tag, note);\n this.refreshRelationshipsForTag(tag);\n this.refreshRelationshipsForNote(note);\n this.addDirtyItems(dirty);\n }\n\n refreshRelationshipsForTag(tag) {\n tag.notes = tag.referencesMatchingContentType(\"Note\");\n tag.notes.sort(function(a,b){\n return new Date(b.created_at) - new Date(a.created_at);\n });\n }\n\n refreshRelationshipsForNote(note) {\n note.tags = note.referencesMatchingContentType(\"Tag\");\n }\n\n removeTagFromNote(tag, note) {\n var dirty = this.removeReferencesBetweenItems(tag, note);\n this.addDirtyItems(dirty);\n }\n\n deleteNote(note) {\n var dirty = this.deleteItem(note);\n _.remove(this.notes, note);\n this.addDirtyItems(dirty);\n }\n\n deleteTag(tag) {\n var dirty = this.deleteItem(tag);\n _.remove(this.tags, tag);\n this.addDirtyItems(dirty);\n }\n\n filteredNotes() {\n return Note.filterDummyNotes(this.notes);\n }\n}\n\nangular.module('app.frontend').service('modelManager', ModelManager);\n;angular.module('app.frontend')\n .service('serverSideValidation', function ($sce) {\n // Show validation errors in form.\n this.showErrors = function (formErrors, form) {\n angular.forEach(formErrors, function (errors, key) {\n if (typeof form[key] !== 'undefined') {\n form[key].$setDirty();\n form[key].$setValidity('server', false);\n form[key].$error.server = $sce.trustAsHtml(errors.join(', '));\n }\n });\n };\n\n // Get validation errors from server response and show them in form.\n this.parseErrors = function (response, form) {\n if (response.status === 422) {\n this.showErrors(response.data, form);\n }\n };\n});\n;angular\n .module('app.frontend')\n .directive('mbAutofocus', ['$timeout', function($timeout) {\n return {\n restrict: 'A',\n scope: {\n shouldFocus: \"=\"\n },\n link : function($scope, $element) {\n $timeout(function() {\n if($scope.shouldFocus) {\n $element[0].focus();\n }\n });\n }\n }\n }]);\n;angular\n .module('app.frontend')\n .directive('draggable', function() {\n return {\n scope: {\n note: \"=\"\n },\n link: function(scope, element) {\n // this gives us the native JS object\n var el = element[0];\n\n el.draggable = true;\n\n el.addEventListener(\n 'dragstart',\n function(e) {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('Note', JSON.stringify(scope.note));\n this.classList.add('drag');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragend',\n function(e) {\n this.classList.remove('drag');\n return false;\n },\n false\n );\n }\n }\n});\n\nangular\n .module('app.frontend')\n .directive('droppable', function() {\n return {\n scope: {\n drop: '&',\n bin: '=',\n tag: \"=\"\n },\n link: function(scope, element) {\n // again we need the native object\n var el = element[0];\n\n el.addEventListener(\n 'dragover',\n function(e) {\n e.dataTransfer.dropEffect = 'move';\n // allows us to drop\n if (e.preventDefault) e.preventDefault();\n this.classList.add('over');\n return false;\n },\n false\n );\n\n var counter = 0;\n\n el.addEventListener(\n 'dragenter',\n function(e) {\n counter++;\n this.classList.add('over');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragleave',\n function(e) {\n counter--;\n if (counter === 0) {\n this.classList.remove('over');\n }\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'drop',\n function(e) {\n // Stops some browsers from redirecting.\n if (e.stopPropagation) e.stopPropagation();\n\n this.classList.remove('over');\n\n var binId = this.uuid;\n var note = new Note(JSON.parse(e.dataTransfer.getData('Note')));\n scope.$apply(function(scope) {\n var fn = scope.drop();\n if ('undefined' !== typeof fn) {\n fn(e, scope.tag, note);\n }\n });\n\n return false;\n },\n false\n );\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('fileChange', function() {\n return {\n restrict: 'A',\n scope: {\n handler: '&'\n },\n link: function (scope, element) {\n element.on('change', function (event) {\n scope.$apply(function(){\n scope.handler({files: event.target.files});\n });\n });\n }\n };\n});\n;angular\n .module('app.frontend')\n .directive('lowercase', function() {\n return {\n require: 'ngModel',\n link: function(scope, element, attrs, modelCtrl) {\n var lowercase = function(inputValue) {\n if (inputValue == undefined) inputValue = '';\n var lowercased = inputValue.toLowerCase();\n if (lowercased !== inputValue) {\n modelCtrl.$setViewValue(lowercased);\n modelCtrl.$render();\n }\n return lowercased;\n }\n modelCtrl.$parsers.push(lowercase);\n lowercase(scope[attrs.ngModel]);\n }\n };\n });\n;angular\n .module('app.frontend')\n .directive('selectOnClick', ['$window', function ($window) {\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n element.on('focus', function () {\n if (!$window.getSelection().toString()) {\n // Required for mobile Safari\n this.setSelectionRange(0, this.value.length)\n }\n });\n }\n };\n}]);\n;angular\n .module('app.frontend')\n .directive('note', function($timeout) {\n return {\n restrict: 'E',\n controller: 'SingleNoteCtrl',\n templateUrl: \"frontend/directives/note.html\",\n scope: {\n note: \"=\"\n },\n }\n })\n .controller('SingleNoteCtrl', function ($rootScope, $scope, $state, markdownRenderer) {\n $scope.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText($scope.note.text));\n }\n });\n;/**\n * AngularJS directive that simulates the effect of typing on a text editor - with a blinking cursor.\n * This directive works as an attribute to any HTML element, and it changes the speed/delay of its animation.\n *\n * There's also a simple less file included for basic styling of the dialog, which can be overridden.\n * The config object also lets the user define custom CSS classes for the modal.\n *\n * How to use:\n *\n * Just add the desired text to the 'text' attribute of the element and the directive takes care of the rest.\n * The 'text' attribute can be a single string or an array of string. In case an array is passed, the string\n * on each index is erased so the next item can be printed. When the last index is reached, that string stays\n * on the screen. (So if you want to erase the last string, just push an empty string to the end of the array)\n *\n * These are the optional preferences:\n * - initial delay: set an 'initial-delay' attribute for the element\n * - type delay: set a 'type-delay' attribute for the element\n * - erase delay: set a 'erase-delay' attribute for the element\n * - specify cursor : set a 'cursor' attribute for the element, specifying which cursor to use\n * - turn off cursor blinking: set the 'blink-cursor' attribute to \"false\"\n * - cursor blinking speed: set a 'blink-delay' attribute for the element\n * - scope callback: pass the desired scope callback as the 'callback-fn' attribute of the element\n *\n * Note:\n * Each time/delay value should be set either on seconds (1s) or milliseconds (1000)\n *\n * Dependencies:\n * The directive needs the css file provided in order to replicate the cursor blinking effect.\n */\n\n\nangular\n .module('app.frontend').directive('typewrite', ['$timeout', function ($timeout) {\n function linkFunction($scope, $element, $attrs) {\n var timer = null,\n initialDelay = $attrs.initialDelay ? getTypeDelay($attrs.initialDelay) : 200,\n typeDelay = $attrs.typeDelay || 200,\n eraseDelay = $attrs.eraseDelay || typeDelay / 2,\n blinkDelay = $attrs.blinkDelay ? getAnimationDelay($attrs.blinkDelay) : false,\n cursor = $attrs.cursor || '|',\n blinkCursor = typeof $attrs.blinkCursor !== 'undefined' ? $attrs.blinkCursor === 'true' : true,\n currentText,\n textArray,\n running,\n auxStyle;\n\n\n\n if ($scope.text) {\n if ($scope.text instanceof Array) {\n textArray = $scope.text;\n currentText = textArray[0];\n } else {\n currentText = $scope.text;\n }\n }\n if (typeof $scope.start === 'undefined' || $scope.start) {\n typewrite();\n }\n\n function typewrite() {\n timer = $timeout(function () {\n updateIt($element, 0, 0, currentText);\n }, initialDelay);\n }\n\n function updateIt(element, charIndex, arrIndex, text) {\n if (charIndex <= text.length) {\n updateValue(element, text.substring(0, charIndex) + cursor);\n charIndex++;\n timer = $timeout(function () {\n updateIt(element, charIndex, arrIndex, text);\n }, typeDelay);\n return;\n } else {\n charIndex--;\n\n if($scope.iterationCallback) {\n $scope.iterationCallback()(arrIndex);\n }\n\n // check if it's an array\n if (textArray && arrIndex < textArray.length - 1) {\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, textArray[arrIndex]);\n }, $scope.iterationDelay);\n } else {\n if ($scope.callbackFn) {\n $scope.callbackFn();\n }\n blinkIt(element, charIndex, currentText);\n }\n }\n }\n\n function blinkIt(element, charIndex) {\n var text = element.text().substring(0, element.text().length - 1);\n if (blinkCursor) {\n if (blinkDelay) {\n auxStyle = '-webkit-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-moz-animation:blink-it steps(1) ' + blinkDelay + ' infinite ' +\n '-ms-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-o-animation:blink-it steps(1) ' + blinkDelay + ' infinite; ' +\n 'animation:blink-it steps(1) ' + blinkDelay + ' infinite;';\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n } else {\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n }\n } else {\n updateValue(element, text.substring(0, charIndex));\n }\n }\n\n function cleanAndRestart(element, charIndex, arrIndex, currentText) {\n if(charIndex == 0) {\n if($scope.prebeginFn) {\n $scope.prebeginFn()();\n }\n }\n if (charIndex > 0) {\n currentText = currentText.slice(0, -1);\n // element.html(currentText.substring(0, currentText.length - 1) + cursor);\n updateValue(element, currentText + cursor);\n charIndex--;\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, currentText);\n }, eraseDelay);\n return;\n } else {\n arrIndex++;\n currentText = textArray[arrIndex];\n timer = $timeout(function () {\n updateIt(element, 0, arrIndex, currentText);\n }, typeDelay);\n }\n }\n\n function getTypeDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? parseInt(delay.substring(0, delay.length - 1), 10) * 1000 : +delay;\n } else {\n return false;\n }\n }\n\n function getAnimationDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? delay : parseInt(delay.substring(0, delay.length - 1), 10) / 1000;\n }\n }\n\n function updateValue(element, value) {\n if (element.prop('nodeName').toUpperCase() === 'INPUT') {\n return element.val(value);\n }\n return element.html(value);\n }\n\n $scope.$on('$destroy', function () {\n if (timer) {\n $timeout.cancel(timer);\n }\n });\n\n $scope.$watch('start', function (newVal) {\n if (!running && newVal) {\n running = !running;\n typewrite();\n }\n });\n\n $scope.$watch('text', function (newVal, oldVal) {\n if(!(newVal instanceof Array)) {\n currentText = newVal;\n typewrite();\n }\n });\n }\n\n return {\n restrict: 'A',\n link: linkFunction,\n replace: true,\n scope: {\n text: '=',\n callbackFn: '&',\n iterationCallback: '&',\n iterationDelay: '=',\n prebeginFn: '&',\n start: '='\n }\n };\n\n }]);\n"]} \ No newline at end of file