diff --git a/main.go b/main.go index 2da625f..3c0afb6 100644 --- a/main.go +++ b/main.go @@ -279,7 +279,6 @@ func nodeCreate(w http.ResponseWriter, r *http.Request) {// {{{ }) }// }}} func nodeUpdate(w http.ResponseWriter, r *http.Request) {// {{{ - log.Println("/node/update") var err error var session Session diff --git a/static/js/node.mjs b/static/js/node.mjs index 22df9e7..bec4d80 100644 --- a/static/js/node.mjs +++ b/static/js/node.mjs @@ -54,11 +54,7 @@ export class NodeUI extends Component { let page = '' switch(this.page.value) { case 'node': - if(node.ID == 0) { - page = html` - ${children.length > 0 ? html`
${children}
` : html``} - ` - } else { + if(node.ID > 0) { let padlock = '' if(node.CryptoKeyID > 0) padlock = html`` @@ -213,8 +209,7 @@ export class NodeUI extends Component { }//}}} saveNode() {//{{{ let content = this.nodeContent.current.contentDiv.current.value - this.node.value.setContent(content) - this.node.value.save(()=>this.props.app.nodeModified.value = false) + this.node.value.save(content, ()=>this.props.app.nodeModified.value = false) }//}}} renameNode() {//{{{ let name = prompt("New name") @@ -304,7 +299,7 @@ class NodeContent extends Component { textarea.parentNode.dataset.replicatedValue = textarea.value }//}}} unlock() {//{{{ - let pass = prompt(`Password for "${this.props.model.description}"`) + let pass = prompt("Password") if(!pass) return @@ -402,21 +397,21 @@ export class Node { }) .catch(this.app.responseError) }//}}} - async save(callback) {//{{{ - try { - await this.#encrypt() + async save(content, callback) {//{{{ + let update_content = content + /* + * XXX - fix encrypting when saving + if(this.CryptoKeyID != 0) + update_content = await this.#encrypt(content) + */ - let req = { - NodeID: this.ID, - Content: this._content, - CryptoKeyID: this.CryptoKeyID, - } - this.app.request('/node/update', req) - .then(callback) - .catch(this.app.responseError) - } catch (err) { - this.app.responseError(err) - } + this.app.request('/node/update', { + NodeID: this.ID, + Content: update_content, + CryptoKeyID: this.CryptoKeyID, + }) + .then(callback) + .catch(this.app.responseError) }//}}} rename(name, callback) {//{{{ this.app.request('/node/rename', { @@ -459,26 +454,30 @@ export class Node { }) }//}}} content() {//{{{ - if(this.CryptoKeyID != 0 && !this._decrypted) + if(this.CryptoKeyID != 0 && !this._decrypted) { this.#decrypt() + } return this._content }//}}} - setContent(new_content) {//{{{ - this._content = new_content - if(this.CryptoKeyID == 0) - // Logic behind plaintext not being decrypted is that - // only encrypted values can be in a decrypted state. - this._decrypted = false - else - this._decrypted = true - }//}}} - async setCryptoKey(new_key) {//{{{ - return this.#encrypt(true, new_key) + + async encrypt(obj_key) {//{{{ + if(obj_key.ID != this.CryptoKeyID) + throw('Invalid key') + + let crypto = new Crypto(obj_key.key) + this._decrypted = false + + let counter = await obj_key.counter() + + this.content = sjcl.codec.base64.fromBits( + crypto.encrypt( + sjcl.codec.utf8String.toBits(this.content), + counter, + false, + ) + ) }//}}} #decrypt() {//{{{ - if(this.CryptoKeyID == 0 || this._decrypted) - return - let obj_key = this.app.nodeUI.current.getKey(this.CryptoKeyID) if(obj_key === null || obj_key.ID != this.CryptoKeyID) throw('Invalid key') @@ -486,7 +485,7 @@ export class Node { // Ask user to unlock key first var pass = null while(pass || obj_key.status() == 'locked') { - pass = prompt(`Password for "${obj_key.description}"`) + pass = prompt("Password") if(!pass) throw new Error(`Key "${obj_key.description}" is locked`) @@ -507,25 +506,10 @@ export class Node { crypto.decrypt(this._content) ) }//}}} - async #encrypt(change_key = false, new_key = null) {//{{{ - // Nothing to do if not changing key and already encrypted. - if(!change_key && this.CryptoKeyID != 0 && !this._decrypted) - return this._content - - let content = this.content() - - // Changing key to no encryption or already at no encryption - - // set to not decrypted (only encrypted values can be - // decrypted) and return plain value. - if((change_key && new_key === null) || (!change_key && this.CryptoKeyID == 0)) { - this._decrypted = false - this.CryptoKeyID = 0 - return content - } - - let key_id = change_key ? new_key.ID : this.CryptoKeyID - let obj_key = this.app.nodeUI.current.getKey(key_id) - if(obj_key === null || obj_key.ID != key_id) + /* + async #encrypt(content) {//{{{ + let obj_key = this.app.nodeUI.current.getKey(this.CryptoKeyID) + if(obj_key === null || obj_key.ID != this.CryptoKeyID) throw('Invalid key') if(obj_key.status() == 'locked') @@ -534,11 +518,9 @@ export class Node { let crypto = new Crypto(obj_key.key) let content_bits = sjcl.codec.utf8String.toBits(content) let counter = await this.app.nodeUI.current.keyCounter() - this.CryptoKeyID = obj_key.ID - this._content = crypto.encrypt(content_bits, counter, true) - this._decrypted = false - return this._content + return crypto.encrypt(content_bits, counter, true) }//}}} + */ } class Menu extends Component { @@ -699,26 +681,38 @@ class NodeProperties extends Component { ` }//}}} - async save() {//{{{ + save() {//{{{ let nodeui = this.props.nodeui let node = nodeui.node.value // Find the actual key object used for encryption - let new_key = nodeui.getKey(this.selected_key_id) - let current_key = nodeui.getKey(node.CryptoKeyID) + let encrypt_key = nodeui.getKey(this.selected_key_id) + let decrypt_key = nodeui.getKey(node.CryptoKeyID) - if(current_key && current_key.status() == 'locked') { + if(decrypt_key && decrypt_key.status() == 'locked') { alert("Decryption key is locked and can not be used.") return } - if(new_key && new_key.status() == 'locked') { + if(encrypt_key && encrypt_key.status() == 'locked') { alert("Key is locked and can not be used.") return } - await node.setCryptoKey(new_key) - node.save(()=>this.props.nodeui.showPage('node')) + // Currently not encrypted - encrypt with new key. + let crypto = new Crypto(selected_key.key) + if(node.CryptoKeyID == 0) { + let encrypted = crypto.encrypt( + sjcl.codec.utf8String.toBits(node.Content()), + 1n, + ) + console.log(encrypted) + } + + /* + crypto.encrypt( + ) + */ }//}}} }