forked from cory/tildefriends
		
	Sending encrypted messages. Revealing some weird behavior, but it's working.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4438 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
		@@ -88,6 +88,9 @@ tfrpc.register(function apps() {
 | 
			
		||||
tfrpc.register(async function try_decrypt(id, content) {
 | 
			
		||||
	return await ssb.privateMessageDecrypt(id, content);
 | 
			
		||||
});
 | 
			
		||||
tfrpc.register(async function encrypt(id, recipients, content) {
 | 
			
		||||
	return await ssb.privateMessageEncrypt(id, recipients, content);
 | 
			
		||||
});
 | 
			
		||||
ssb.addEventListener('broadcasts', async function() {
 | 
			
		||||
	await tfrpc.rpc.set('broadcasts', await ssb.getBroadcasts());
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -176,7 +176,7 @@ class TfComposeElement extends LitElement {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	submit() {
 | 
			
		||||
	async submit() {
 | 
			
		||||
		let self = this;
 | 
			
		||||
		let draft = this.get_draft();
 | 
			
		||||
		let edit = this.renderRoot.getElementById('edit');
 | 
			
		||||
@@ -195,14 +195,24 @@ class TfComposeElement extends LitElement {
 | 
			
		||||
			message.contentWarning = draft.content_warning;
 | 
			
		||||
		}
 | 
			
		||||
		console.log('Would post:', message);
 | 
			
		||||
		tfrpc.rpc.appendMessage(this.whoami, message).then(function() {
 | 
			
		||||
			edit.value = '';
 | 
			
		||||
			self.change();
 | 
			
		||||
			self.notify(undefined);
 | 
			
		||||
			self.requestUpdate();
 | 
			
		||||
		}).catch(function(error) {
 | 
			
		||||
		if (draft.encrypt_to) {
 | 
			
		||||
			let to = new Set(draft.encrypt_to);
 | 
			
		||||
			to.add(this.whoami);
 | 
			
		||||
			to = [...to];
 | 
			
		||||
			console.log('encrypting to', to);
 | 
			
		||||
			message = await tfrpc.rpc.encrypt(this.whoami, to, JSON.stringify(message));
 | 
			
		||||
			console.log('encrypted as', message);
 | 
			
		||||
		}
 | 
			
		||||
		try {
 | 
			
		||||
			await tfrpc.rpc.appendMessage(this.whoami, message).then(function() {
 | 
			
		||||
				edit.value = '';
 | 
			
		||||
				self.change();
 | 
			
		||||
				self.notify(undefined);
 | 
			
		||||
				self.requestUpdate();
 | 
			
		||||
			});
 | 
			
		||||
		} catch (error) {
 | 
			
		||||
			alert(error.message);
 | 
			
		||||
		});
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	discard() {
 | 
			
		||||
@@ -244,6 +254,16 @@ class TfComposeElement extends LitElement {
 | 
			
		||||
			preview.innerHTML = this.process_text(edit.value);
 | 
			
		||||
			this.last_updated_text = edit.value;
 | 
			
		||||
		}
 | 
			
		||||
		let encrypt = this.renderRoot.getElementById('encrypt_to');
 | 
			
		||||
		if (encrypt) {
 | 
			
		||||
			let tribute = new Tribute({
 | 
			
		||||
				values: Object.entries(this.users).map(x => ({key: x[1].name, value: x[0]})),
 | 
			
		||||
				selectTemplate: function(item) {
 | 
			
		||||
					return item.original.value;
 | 
			
		||||
				},
 | 
			
		||||
			});
 | 
			
		||||
			tribute.attach(encrypt);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	remove_mention(id) {
 | 
			
		||||
@@ -354,6 +374,45 @@ class TfComposeElement extends LitElement {
 | 
			
		||||
		return this.drafts[this.branch || ''] || {};
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	update_encrypt(event) {
 | 
			
		||||
		let input = event.srcElement;
 | 
			
		||||
		let matches = input.value.match(/@.*?\.ed25519/g);
 | 
			
		||||
		if (matches) {
 | 
			
		||||
			let draft = this.get_draft();
 | 
			
		||||
			let to = [...new Set(matches.concat(draft.encrypt_to))];
 | 
			
		||||
			this.set_encrypt(to);
 | 
			
		||||
			input.value = '';
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	render_encrypt() {
 | 
			
		||||
		let draft = this.get_draft();
 | 
			
		||||
		if (draft.encrypt_to === undefined) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		return html`
 | 
			
		||||
			<div style="display: flex; flex-direction: row; width: 100%">
 | 
			
		||||
				<label for="encrypt_to">🔐 To:</label>
 | 
			
		||||
				<input type="text" id="encrypt_to" style="display: flex; flex: 1 1" @input=${this.update_encrypt}></input>
 | 
			
		||||
				<input type="button" value="🚮" @click=${() => this.set_encrypt(undefined)}></input>
 | 
			
		||||
			</div>
 | 
			
		||||
			<ul>
 | 
			
		||||
				${draft.encrypt_to.map(x => html`
 | 
			
		||||
					<li>
 | 
			
		||||
						<tf-user id=${x} .users=${this.users}></tf-user>
 | 
			
		||||
						<input type="button" value="🚮" @click=${() => this.set_encrypt(draft.encrypt_to.filter(id => id != x))}></input>
 | 
			
		||||
					</li>`)}
 | 
			
		||||
			</ul>
 | 
			
		||||
		`;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	set_encrypt(encrypt) {
 | 
			
		||||
		let draft = this.get_draft();
 | 
			
		||||
		draft.encrypt_to = encrypt;
 | 
			
		||||
		this.notify(draft);
 | 
			
		||||
		this.requestUpdate();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	render() {
 | 
			
		||||
		let self = this;
 | 
			
		||||
		let draft = self.get_draft();
 | 
			
		||||
@@ -361,7 +420,11 @@ class TfComposeElement extends LitElement {
 | 
			
		||||
			draft.content_warning !== undefined ?
 | 
			
		||||
			html`<div id="content_warning_preview" class="content_warning">${draft.content_warning}</div>` :
 | 
			
		||||
			undefined;
 | 
			
		||||
		let encrypt = draft.encrypt_to !== undefined ?
 | 
			
		||||
			undefined :
 | 
			
		||||
			html`<input type="button" value="🔐" @click=${() => this.set_encrypt([])}></input>`;
 | 
			
		||||
		let result = html`
 | 
			
		||||
			${this.render_encrypt()}
 | 
			
		||||
			<div style="display: flex; flex-direction: row; width: 100%">
 | 
			
		||||
				<textarea id="edit" @input=${this.input} @change=${this.change} @paste=${this.paste} style="flex: 1 0 50%">${draft.text}</textarea>
 | 
			
		||||
				<div style="flex: 1 0 50%">
 | 
			
		||||
@@ -375,6 +438,7 @@ class TfComposeElement extends LitElement {
 | 
			
		||||
			<input type="button" id="submit" value="Submit" @click=${this.submit}></input>
 | 
			
		||||
			<input type="button" value="Attach" @click=${this.attach}></input>
 | 
			
		||||
			${this.render_attach_app_button()}
 | 
			
		||||
			${encrypt}
 | 
			
		||||
			<input type="button" value="Discard" @click=${this.discard}></input>
 | 
			
		||||
		`;
 | 
			
		||||
		return result;
 | 
			
		||||
 
 | 
			
		||||
@@ -243,7 +243,11 @@ class TfMessageElement extends LitElement {
 | 
			
		||||
	async try_decrypt(content) {
 | 
			
		||||
		let result = await tfrpc.rpc.try_decrypt(this.whoami, content);
 | 
			
		||||
		if (result) {
 | 
			
		||||
			this.decrypted = JSON.parse(result);
 | 
			
		||||
			try {
 | 
			
		||||
				this.decrypted = JSON.parse(result);
 | 
			
		||||
			} catch {
 | 
			
		||||
				this.decrypted = result;
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			this.decrypted = false;
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user