diff --git a/app/assets/javascripts/app/services/apiController.js b/app/assets/javascripts/app/services/apiController.js index 7b21a8704..3d17cc23d 100644 --- a/app/assets/javascripts/app/services/apiController.js +++ b/app/assets/javascripts/app/services/apiController.js @@ -72,6 +72,7 @@ angular.module('app.frontend') Restangular.one("users/current").get().then(function(response){ var plain = response.plain(); var items = plain.items; + console.log("Current user items", items); this.decryptItemsWithLocalKey(items); items = this.mapResponseItemsToLocalModels(items); var user = _.omit(plain, ["items"]); @@ -87,6 +88,7 @@ angular.module('app.frontend') this.getAuthParamsForEmail(email, function(authParams){ Neeto.crypto.computeEncryptionKeysForUser(_.merge({email: email, password: password}, authParams), function(keys){ this.setMk(keys.mk); + console.log("Signing in with", authParams, "pw", keys); var request = Restangular.one("auth/sign_in"); request.user = {password: keys.pw, email: email}; request.post().then(function(response){ @@ -262,7 +264,7 @@ angular.module('app.frontend') params.auth_hash = itemCopy.auth_hash; } else { - params.content = forExportFile ? itemCopy.content : JSON.stringify(itemCopy.content); + params.content = forExportFile ? itemCopy.content : "000" + Neeto.crypto.base64(JSON.stringify(itemCopy.content)); if(!forExportFile) { params.enc_item_key = null; params.auth_hash = null; @@ -475,7 +477,7 @@ angular.module('app.frontend') var ek = Neeto.crypto.firstHalfOfKey(item_key); var ak = Neeto.crypto.secondHalfOfKey(item_key); - var encryptedContent = Neeto.crypto.encryptText(JSON.stringify(item.content), ek); + var encryptedContent = "001" + Neeto.crypto.encryptText(JSON.stringify(item.content), ek); var authHash = Neeto.crypto.hmac256(encryptedContent, ak); item.content = encryptedContent; @@ -483,31 +485,6 @@ angular.module('app.frontend') item.local_encryption_scheme = "1.0"; } - this.encryptItems = function(items, masterKey) { - items.forEach(function(item){ - this.encryptSingleItem(item, masterKey); - }.bind(this)); - } - - this.encryptSingleItemWithLocalKey = function(item) { - this.encryptSingleItem(item, this.retrieveMk()); - } - - this.encryptItemsWithLocalKey = function(items) { - this.encryptItems(items, this.retrieveMk()); - } - - this.encryptNonPublicItemsWithLocalKey = function(items) { - var nonpublic = items.filter(function(item){ - return !item.isPublic() && !item.pending_share; - }) - this.encryptItems(nonpublic, this.retrieveMk()); - } - - this.decryptSingleItemWithLocalKey = function(item) { - this.decryptSingleItem(item, this.retrieveMk()); - } - this.decryptSingleItem = function(item, masterKey) { var item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey); @@ -519,14 +496,18 @@ angular.module('app.frontend') return; } - var content = Neeto.crypto.decryptText(item.content, ek); + var content = Neeto.crypto.decryptText(item.content.substring(3, item.content.length), ek); item.content = content; } this.decryptItems = function(items, masterKey) { items.forEach(function(item){ - if(item.enc_item_key && typeof item.content === 'string') { + if(item.content.substring(0, 3) == "001" && item.enc_item_key) { + // is encrypted this.decryptSingleItem(item, masterKey); + } else { + // is base64 encoded + item.content = Neeto.crypto.base64Decode(item.content.substring(3, item.content.length)) } }.bind(this)); } @@ -538,7 +519,7 @@ angular.module('app.frontend') this.reencryptAllItemsAndSave = function(user, newMasterKey, oldMasterKey, callback) { var items = user.filteredItems(); items.forEach(function(item){ - if(item.enc_item_key && typeof item.content === 'string') { + if(item.content.substring(0, 3) == "001" && item.enc_item_key) { // first decrypt item_key with old key var item_key = Neeto.crypto.decryptText(item.enc_item_key, oldMasterKey); // now encrypt item_key with new key diff --git a/app/assets/javascripts/app/services/helpers/crypto.js b/app/assets/javascripts/app/services/helpers/crypto.js index 19c5ef061..d811d6b14 100644 --- a/app/assets/javascripts/app/services/helpers/crypto.js +++ b/app/assets/javascripts/app/services/helpers/crypto.js @@ -45,6 +45,14 @@ class SNCrypto { return key.substring(key.length/2, key.length); } + base64(text) { + return CryptoJS.enc.Utf8.parse(text).toString(CryptoJS.enc.Base64) + } + + base64Decode(base64String) { + return CryptoJS.enc.Base64.parse(base64String).toString(CryptoJS.enc.Utf8) + } + sha256(text) { return CryptoJS.SHA256(text).toString(); } diff --git a/vendor/assets/javascripts/transpiled.js b/vendor/assets/javascripts/transpiled.js index 2ebb01902..ee049a065 100644 --- a/vendor/assets/javascripts/transpiled.js +++ b/vendor/assets/javascripts/transpiled.js @@ -74,6 +74,16 @@ var SNCrypto = function () { value: function secondHalfOfKey(key) { return key.substring(key.length / 2, key.length); } + }, { + key: 'base64', + value: function base64(text) { + return CryptoJS.enc.Utf8.parse(text).toString(CryptoJS.enc.Base64); + } + }, { + key: 'base64Decode', + value: function base64Decode(base64String) { + return CryptoJS.enc.Base64.parse(base64String).toString(CryptoJS.enc.Utf8); + } }, { key: 'sha256', value: function sha256(text) { @@ -1564,6 +1574,7 @@ var User = function User(json_obj) { Restangular.one("users/current").get().then(function (response) { var plain = response.plain(); var items = plain.items; + console.log("Current user items", items); this.decryptItemsWithLocalKey(items); items = this.mapResponseItemsToLocalModels(items); var user = _.omit(plain, ["items"]); @@ -1578,6 +1589,7 @@ var User = function User(json_obj) { this.getAuthParamsForEmail(email, function (authParams) { Neeto.crypto.computeEncryptionKeysForUser(_.merge({ email: email, password: password }, authParams), function (keys) { this.setMk(keys.mk); + console.log("Signing in with", authParams, "pw", keys); var request = Restangular.one("auth/sign_in"); request.user = { password: keys.pw, email: email }; request.post().then(function (response) { @@ -1749,7 +1761,7 @@ var User = function User(json_obj) { params.enc_item_key = itemCopy.enc_item_key; params.auth_hash = itemCopy.auth_hash; } else { - params.content = forExportFile ? itemCopy.content : JSON.stringify(itemCopy.content); + params.content = forExportFile ? itemCopy.content : "000" + Neeto.crypto.base64(JSON.stringify(itemCopy.content)); if (!forExportFile) { params.enc_item_key = null; params.auth_hash = null; @@ -1956,7 +1968,7 @@ var User = function User(json_obj) { var ek = Neeto.crypto.firstHalfOfKey(item_key); var ak = Neeto.crypto.secondHalfOfKey(item_key); - var encryptedContent = Neeto.crypto.encryptText(JSON.stringify(item.content), ek); + var encryptedContent = "001" + Neeto.crypto.encryptText(JSON.stringify(item.content), ek); var authHash = Neeto.crypto.hmac256(encryptedContent, ak); item.content = encryptedContent; @@ -1964,31 +1976,6 @@ var User = function User(json_obj) { item.local_encryption_scheme = "1.0"; }; - this.encryptItems = function (items, masterKey) { - items.forEach(function (item) { - this.encryptSingleItem(item, masterKey); - }.bind(this)); - }; - - this.encryptSingleItemWithLocalKey = function (item) { - this.encryptSingleItem(item, this.retrieveMk()); - }; - - this.encryptItemsWithLocalKey = function (items) { - this.encryptItems(items, this.retrieveMk()); - }; - - this.encryptNonPublicItemsWithLocalKey = function (items) { - var nonpublic = items.filter(function (item) { - return !item.isPublic() && !item.pending_share; - }); - this.encryptItems(nonpublic, this.retrieveMk()); - }; - - this.decryptSingleItemWithLocalKey = function (item) { - this.decryptSingleItem(item, this.retrieveMk()); - }; - this.decryptSingleItem = function (item, masterKey) { var item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey); @@ -2000,14 +1987,18 @@ var User = function User(json_obj) { return; } - var content = Neeto.crypto.decryptText(item.content, ek); + var content = Neeto.crypto.decryptText(item.content.substring(3, item.content.length), ek); item.content = content; }; this.decryptItems = function (items, masterKey) { items.forEach(function (item) { - if (item.enc_item_key && typeof item.content === 'string') { + if (item.content.substring(0, 3) == "001" && item.enc_item_key) { + // is encrypted this.decryptSingleItem(item, masterKey); + } else { + // is base64 encoded + item.content = Neeto.crypto.base64Decode(item.content.substring(3, item.content.length)); } }.bind(this)); }; @@ -2019,7 +2010,7 @@ var User = function User(json_obj) { this.reencryptAllItemsAndSave = function (user, newMasterKey, oldMasterKey, callback) { var items = user.filteredItems(); items.forEach(function (item) { - if (item.enc_item_key && typeof item.content === 'string') { + if (item.content.substring(0, 3) == "001" && item.enc_item_key) { // first decrypt item_key with old key var item_key = Neeto.crypto.decryptText(item.enc_item_key, oldMasterKey); // now encrypt item_key with new key diff --git a/vendor/assets/javascripts/transpiled.js.map b/vendor/assets/javascripts/transpiled.js.map index 5c0f2f58c..7fcccb475 100644 --- a/vendor/assets/javascripts/transpiled.js.map +++ b/vendor/assets/javascripts/transpiled.js.map @@ -1 +1 @@ -{"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","keyData","enc","Hex","parse","ivData","decrypted","AES","decrypt","iv","mode","CBC","padding","pad","Pkcs7","Utf8","text","encrypted","encrypt","salt","Neeto","crypto","generateRandomKey","passphrase","PBKDF2","keySize","substring","length","SHA256","SHA1","message","messageData","HmacSHA256","email","password","pw_salt","pw_func","pw_alg","pw_cost","pw_key_size","callback","generateSymmetricKeyPair","keys","pw","mk","defaults","defaultPasswordGenerationParams","pw_nonce","sha1","_","merge","SNCryptoJS","algMapping","algo","SHA512","fnMapping","alg","kdf","output","hasher","iterations","outputLength","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","$qProvider","errorOnUnhandledRejections","$stateProvider","$urlRouterProvider","$locationProvider","state","abstract","parent","views","templateUrl","controller","otherwise","$injector","$location","get","go","path","html5Mode","BaseCtrl","$rootScope","modelManager","directive","$timeout","restrict","scope","save","remove","note","user","controllerAs","bindToController","link","elem","attrs","ctrl","handler","event","ctrlKey","metaKey","String","fromCharCode","which","toLowerCase","preventDefault","saveNote","clickedEditNote","toggleMarkdown","toggleFullScreen","addEventListener","$on","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","$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","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","enumerable","generateUUID","setContentRaw","rawContent","references","reference","push","uniq","updateReferencesLocalMapping","contentType","content_type","item","omit","enc_item_key","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","setMk","post","generateInitialEncryptionKeysForUser","currentKeys","newKeys","_performPasswordChange","reencryptAllItemsAndSave","current_keys","new_keys","patch","verifyEncryptionStatusOfAllItems","allItems","filteredItems","itemsNeedingUpdate","isEncrypted","saveBatchItems","dirtyItems","clearDirtyItems","createRequestParamsForItem","savedItems","savedCounterpart","mergeMetadataFromItem","paramsForItem","additionalFields","forExportFile","itemCopy","cloneDeep","encryptSingleItem","retrieveMk","auth_hash","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","masterKey","item_key","decryptText","generateRandomEncryptionKey","encryptText","ek","firstHalfOfKey","ak","secondHalfOfKey","encryptedContent","authHash","hmac256","local_encryption_scheme","encryptItems","encryptSingleItemWithLocalKey","encryptItemsWithLocalKey","encryptNonPublicItemsWithLocalKey","nonpublic","pending_share","decryptSingleItemWithLocalKey","decryptSingleItem","decryptItems","newMasterKey","oldMasterKey","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","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(512/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 var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var decrypted = CryptoJS.AES.decrypt(encrypted_content, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return decrypted.toString(CryptoJS.enc.Utf8);\n }\n\n encryptText(text, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var encrypted = CryptoJS.AES.encrypt(text, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return encrypted.toString();\n }\n\n generateRandomEncryptionKey() {\n var salt = Neeto.crypto.generateRandomKey();\n var passphrase = Neeto.crypto.generateRandomKey();\n return CryptoJS.PBKDF2(passphrase, salt, { keySize: 512/32 }).toString();\n }\n\n firstHalfOfKey(key) {\n return key.substring(0, key.length/2);\n }\n\n secondHalfOfKey(key) {\n return key.substring(key.length/2, key.length);\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 hmac256(message, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var messageData = CryptoJS.enc.Utf8.parse(message);\n return CryptoJS.HmacSHA256(messageData, keyData).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 mk = keys[1];\n\n callback({pw: pw, mk: mk});\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 mk = keys[1];\n\n callback(_.merge({pw: pw, mk: mk, 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\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 $timeout(function(){\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 }.bind(this), 100)\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 ($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.enc_item_key;\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 console.log(\"Error getting current user\", error);\n callback(null);\n })\n }\n\n this.login = function(email, password, callback) {\n this.getAuthParamsForEmail(email, function(authParams){\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({email: email, password: password}, authParams), function(keys){\n this.setMk(keys.mk);\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.setMk(keys.mk);\n keys.mk = 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 mk\n this.reencryptAllItemsAndSave(user, newKeys.mk, currentKeys.mk, function(success){\n if(success) {\n this.setMk(newKeys.mk);\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 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\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 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.retrieveMk());\n params.content = itemCopy.content;\n params.enc_item_key = itemCopy.enc_item_key;\n params.auth_hash = itemCopy.auth_hash;\n }\n else {\n params.content = forExportFile ? itemCopy.content : JSON.stringify(itemCopy.content);\n if(!forExportFile) {\n params.enc_item_key = null;\n params.auth_hash = 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 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 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.retrieveMk = function() {\n if(!this.mk) {\n this.mk = localStorage.getItem(\"mk\");\n }\n return this.mk;\n }\n\n this.setMk = function(mk) {\n localStorage.setItem('mk', mk);\n }\n\n this.signout = function() {\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"mk\");\n }\n\n this.encryptSingleItem = function(item, masterKey) {\n var item_key = null;\n if(item.enc_item_key) {\n item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n } else {\n item_key = Neeto.crypto.generateRandomEncryptionKey();\n item.enc_item_key = Neeto.crypto.encryptText(item_key, masterKey);\n }\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var encryptedContent = Neeto.crypto.encryptText(JSON.stringify(item.content), ek);\n var authHash = Neeto.crypto.hmac256(encryptedContent, ak);\n\n item.content = encryptedContent;\n item.auth_hash = authHash;\n item.local_encryption_scheme = \"1.0\";\n }\n\n this.encryptItems = function(items, masterKey) {\n items.forEach(function(item){\n this.encryptSingleItem(item, masterKey);\n }.bind(this));\n }\n\n this.encryptSingleItemWithLocalKey = function(item) {\n this.encryptSingleItem(item, this.retrieveMk());\n }\n\n this.encryptItemsWithLocalKey = function(items) {\n this.encryptItems(items, this.retrieveMk());\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.retrieveMk());\n }\n\n this.decryptSingleItemWithLocalKey = function(item) {\n this.decryptSingleItem(item, this.retrieveMk());\n }\n\n this.decryptSingleItem = function(item, masterKey) {\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var authHash = Neeto.crypto.hmac256(item.content, ak);\n if(authHash !== item.auth_hash || !item.auth_hash) {\n console.log(\"Authentication hash does not match.\")\n return;\n }\n\n var content = Neeto.crypto.decryptText(item.content, ek);\n item.content = content;\n }\n\n this.decryptItems = function(items, masterKey) {\n items.forEach(function(item){\n if(item.enc_item_key && typeof item.content === 'string') {\n this.decryptSingleItem(item, masterKey);\n }\n }.bind(this));\n }\n\n this.decryptItemsWithLocalKey = function(items) {\n this.decryptItems(items, this.retrieveMk());\n }\n\n this.reencryptAllItemsAndSave = function(user, newMasterKey, oldMasterKey, callback) {\n var items = user.filteredItems();\n items.forEach(function(item){\n if(item.enc_item_key && typeof item.content === 'string') {\n // first decrypt item_key with old key\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, oldMasterKey);\n // now encrypt item_key with new key\n item.enc_item_key = Neeto.crypto.encryptText(item_key, newMasterKey);\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 +{"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","keyData","enc","Hex","parse","ivData","decrypted","AES","decrypt","iv","mode","CBC","padding","pad","Pkcs7","Utf8","text","encrypted","encrypt","salt","Neeto","crypto","generateRandomKey","passphrase","PBKDF2","keySize","substring","length","Base64","base64String","SHA256","SHA1","message","messageData","HmacSHA256","email","password","pw_salt","pw_func","pw_alg","pw_cost","pw_key_size","callback","generateSymmetricKeyPair","keys","pw","mk","defaults","defaultPasswordGenerationParams","pw_nonce","sha1","_","merge","SNCryptoJS","algMapping","algo","SHA512","fnMapping","alg","kdf","output","hasher","iterations","outputLength","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","$qProvider","errorOnUnhandledRejections","$stateProvider","$urlRouterProvider","$locationProvider","state","abstract","parent","views","templateUrl","controller","otherwise","$injector","$location","get","go","path","html5Mode","BaseCtrl","$rootScope","modelManager","directive","$timeout","restrict","scope","save","remove","note","user","controllerAs","bindToController","link","elem","attrs","ctrl","handler","event","ctrlKey","metaKey","String","fromCharCode","which","toLowerCase","preventDefault","saveNote","clickedEditNote","toggleMarkdown","toggleFullScreen","addEventListener","$on","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","$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","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","enumerable","generateUUID","setContentRaw","rawContent","references","reference","push","uniq","updateReferencesLocalMapping","contentType","content_type","item","omit","enc_item_key","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","setMk","post","generateInitialEncryptionKeysForUser","currentKeys","newKeys","_performPasswordChange","reencryptAllItemsAndSave","current_keys","new_keys","patch","verifyEncryptionStatusOfAllItems","allItems","filteredItems","itemsNeedingUpdate","isEncrypted","saveBatchItems","dirtyItems","clearDirtyItems","createRequestParamsForItem","savedItems","savedCounterpart","mergeMetadataFromItem","paramsForItem","additionalFields","forExportFile","itemCopy","cloneDeep","encryptSingleItem","retrieveMk","auth_hash","base64","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","masterKey","item_key","decryptText","generateRandomEncryptionKey","encryptText","ek","firstHalfOfKey","ak","secondHalfOfKey","encryptedContent","authHash","hmac256","local_encryption_scheme","decryptSingleItem","decryptItems","base64Decode","newMasterKey","oldMasterKey","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","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(512/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 var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var decrypted = CryptoJS.AES.decrypt(encrypted_content, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return decrypted.toString(CryptoJS.enc.Utf8);\n }\n\n encryptText(text, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var encrypted = CryptoJS.AES.encrypt(text, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return encrypted.toString();\n }\n\n generateRandomEncryptionKey() {\n var salt = Neeto.crypto.generateRandomKey();\n var passphrase = Neeto.crypto.generateRandomKey();\n return CryptoJS.PBKDF2(passphrase, salt, { keySize: 512/32 }).toString();\n }\n\n firstHalfOfKey(key) {\n return key.substring(0, key.length/2);\n }\n\n secondHalfOfKey(key) {\n return key.substring(key.length/2, key.length);\n }\n\n base64(text) {\n return CryptoJS.enc.Utf8.parse(text).toString(CryptoJS.enc.Base64)\n }\n\n base64Decode(base64String) {\n return CryptoJS.enc.Base64.parse(base64String).toString(CryptoJS.enc.Utf8)\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 hmac256(message, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var messageData = CryptoJS.enc.Utf8.parse(message);\n return CryptoJS.HmacSHA256(messageData, keyData).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 mk = keys[1];\n\n callback({pw: pw, mk: mk});\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 mk = keys[1];\n\n callback(_.merge({pw: pw, mk: mk, 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\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 $timeout(function(){\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 }.bind(this), 100)\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 ($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.enc_item_key;\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 console.log(\"Current user items\", 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 console.log(\"Error getting current user\", error);\n callback(null);\n })\n }\n\n this.login = function(email, password, callback) {\n this.getAuthParamsForEmail(email, function(authParams){\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({email: email, password: password}, authParams), function(keys){\n this.setMk(keys.mk);\n console.log(\"Signing in with\", authParams, \"pw\", keys);\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.setMk(keys.mk);\n keys.mk = 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 mk\n this.reencryptAllItemsAndSave(user, newKeys.mk, currentKeys.mk, function(success){\n if(success) {\n this.setMk(newKeys.mk);\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 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\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 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.retrieveMk());\n params.content = itemCopy.content;\n params.enc_item_key = itemCopy.enc_item_key;\n params.auth_hash = itemCopy.auth_hash;\n }\n else {\n params.content = forExportFile ? itemCopy.content : \"000\" + Neeto.crypto.base64(JSON.stringify(itemCopy.content));\n if(!forExportFile) {\n params.enc_item_key = null;\n params.auth_hash = 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 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 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.retrieveMk = function() {\n if(!this.mk) {\n this.mk = localStorage.getItem(\"mk\");\n }\n return this.mk;\n }\n\n this.setMk = function(mk) {\n localStorage.setItem('mk', mk);\n }\n\n this.signout = function() {\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"mk\");\n }\n\n this.encryptSingleItem = function(item, masterKey) {\n var item_key = null;\n if(item.enc_item_key) {\n item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n } else {\n item_key = Neeto.crypto.generateRandomEncryptionKey();\n item.enc_item_key = Neeto.crypto.encryptText(item_key, masterKey);\n }\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var encryptedContent = \"001\" + Neeto.crypto.encryptText(JSON.stringify(item.content), ek);\n var authHash = Neeto.crypto.hmac256(encryptedContent, ak);\n\n item.content = encryptedContent;\n item.auth_hash = authHash;\n item.local_encryption_scheme = \"1.0\";\n }\n\n this.decryptSingleItem = function(item, masterKey) {\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var authHash = Neeto.crypto.hmac256(item.content, ak);\n if(authHash !== item.auth_hash || !item.auth_hash) {\n console.log(\"Authentication hash does not match.\")\n return;\n }\n\n var content = Neeto.crypto.decryptText(item.content.substring(3, item.content.length), ek);\n item.content = content;\n }\n\n this.decryptItems = function(items, masterKey) {\n items.forEach(function(item){\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // is encrypted\n this.decryptSingleItem(item, masterKey);\n } else {\n // is base64 encoded\n item.content = Neeto.crypto.base64Decode(item.content.substring(3, item.content.length))\n }\n }.bind(this));\n }\n\n this.decryptItemsWithLocalKey = function(items) {\n this.decryptItems(items, this.retrieveMk());\n }\n\n this.reencryptAllItemsAndSave = function(user, newMasterKey, oldMasterKey, callback) {\n var items = user.filteredItems();\n items.forEach(function(item){\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // first decrypt item_key with old key\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, oldMasterKey);\n // now encrypt item_key with new key\n item.enc_item_key = Neeto.crypto.encryptText(item_key, newMasterKey);\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