From 1af12e3743c7fed9197767a907adc57abd3816a1 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Tue, 3 Nov 2020 22:26:02 +0000 Subject: [PATCH] wip on end-to-end flow --- .../core/connection/ConnectionAcceptor.groovy | 2 +- .../com/muwire/core/messenger/MWMessage.groovy | 3 ++- .../com/muwire/core/messenger/Messenger.groovy | 15 ++++++++++----- .../muwire/core/messenger/UIMessageEvent.groovy | 4 +++- .../com/muwire/gui/MainFrameController.groovy | 1 + .../com/muwire/gui/NewMessageController.groovy | 12 ++++++++++++ .../models/com/muwire/gui/MainFrameModel.groovy | 11 ++++++++++- .../models/com/muwire/gui/NewMessageModel.groovy | 4 ++++ .../views/com/muwire/gui/MainFrameView.groovy | 1 + 9 files changed, 44 insertions(+), 9 deletions(-) diff --git a/core/src/main/groovy/com/muwire/core/connection/ConnectionAcceptor.groovy b/core/src/main/groovy/com/muwire/core/connection/ConnectionAcceptor.groovy index 297bc2fb..35159c83 100644 --- a/core/src/main/groovy/com/muwire/core/connection/ConnectionAcceptor.groovy +++ b/core/src/main/groovy/com/muwire/core/connection/ConnectionAcceptor.groovy @@ -692,7 +692,7 @@ class ConnectionAcceptor { throw new Exception("invalid ETTER") Map headers = DataUtil.readAllHeaders(dis) - if (headers['Version'] != 1) + if (headers['Version'] != "1") throw new Exception("unrecognized version") int count = Integer.parseInt(headers['Count']) diff --git a/core/src/main/groovy/com/muwire/core/messenger/MWMessage.groovy b/core/src/main/groovy/com/muwire/core/messenger/MWMessage.groovy index 74a23908..3b07ebee 100644 --- a/core/src/main/groovy/com/muwire/core/messenger/MWMessage.groovy +++ b/core/src/main/groovy/com/muwire/core/messenger/MWMessage.groovy @@ -33,6 +33,7 @@ class MWMessage { this.timestamp = timestamp this.attachments = attachments this.recipients = recipients + this.body = body byte [] signablePayload = signablePayload() Signature signature = DSAEngine.getInstance().sign(signablePayload, spk) @@ -107,7 +108,7 @@ class MWMessage { byte [] signable = signablePayload() def spk = sender.destination.getSigningPublicKey() def signature = new Signature(spk.getType(), sig) - DSAEngine.getInstance().verifySig(signature, signable, spk) + DSAEngine.getInstance().verifySignature(signature, signable, spk) } private byte [] getPayload() { diff --git a/core/src/main/groovy/com/muwire/core/messenger/Messenger.groovy b/core/src/main/groovy/com/muwire/core/messenger/Messenger.groovy index ef2e24b8..a6bd32c8 100644 --- a/core/src/main/groovy/com/muwire/core/messenger/Messenger.groovy +++ b/core/src/main/groovy/com/muwire/core/messenger/Messenger.groovy @@ -8,6 +8,7 @@ import java.util.concurrent.ExecutorService import java.util.concurrent.Executors import java.util.concurrent.ThreadFactory import java.util.logging.Level +import java.util.zip.GZIPOutputStream import com.muwire.core.EventBus import com.muwire.core.MuWireSettings @@ -116,13 +117,14 @@ class Messenger { String name = deriveName(message) File f = new File(outbox, name) File target = new File(sent, name) - Files.move(f.toPath(), target.toPath(), StandardCopyOption.ATOMIC_MOVE) + Files.move(f.toPath(), target.toPath(), StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING) eventBus.publish(new MessageSentEvent(message : message)) + log.fine("moved message to ${message.recipients} to sent folder") } private static String deriveName(MWMessage message) { String ih = Base64.encode(message.getInfoHash().getRoot()) - "${ih}_${message.sender.getHumanReadableName()}_${message.timestamp}" + "${ih}_${message.sender.getHumanReadableName()}_${message.timestamp}.mwmessage" } private synchronized void send() { @@ -132,7 +134,7 @@ class Messenger { if (inProcess.contains(candidate)) continue inProcess.add(candidate) - netIO.execute(deliver(candidate)) + netIO.execute({deliver(candidate)}) } } @@ -161,13 +163,16 @@ class Messenger { try { Endpoint e = connector.connect(recipient.destination) OutputStream os = e.getOutputStream() - os.write("ETTER\r\n".getBytes(StandardCharsets.US_ASCII)) + os.write("LETTER\r\n".getBytes(StandardCharsets.US_ASCII)) os.write("Version:1\r\n".getBytes(StandardCharsets.US_ASCII)) os.write("Count:1\r\n".getBytes(StandardCharsets.US_ASCII)) os.write("\r\n".getBytes(StandardCharsets.US_ASCII)) + os = new GZIPOutputStream(os) message.write(os) os.flush() - os.close() + try { + os.close() + } catch (Exception ignore) {} return true } catch (Exception e) { log.log(Level.WARNING, "failed to send message to ${recipient.getHumanReadableName()}", e) diff --git a/core/src/main/groovy/com/muwire/core/messenger/UIMessageEvent.groovy b/core/src/main/groovy/com/muwire/core/messenger/UIMessageEvent.groovy index c844bb6b..3eb1db1c 100644 --- a/core/src/main/groovy/com/muwire/core/messenger/UIMessageEvent.groovy +++ b/core/src/main/groovy/com/muwire/core/messenger/UIMessageEvent.groovy @@ -1,5 +1,7 @@ package com.muwire.core.messenger -class UIMessageEvent extends MWMessage { +import com.muwire.core.Event + +class UIMessageEvent extends Event { MWMessage message } diff --git a/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy b/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy index 67d844a1..34ad136a 100644 --- a/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy +++ b/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy @@ -794,6 +794,7 @@ class MainFrameController { def params = [:] params.recipient = te.persona + params.core = core mvcGroup.createMVCGroup("new-message", UUID.randomUUID().toString(), params) } diff --git a/gui/griffon-app/controllers/com/muwire/gui/NewMessageController.groovy b/gui/griffon-app/controllers/com/muwire/gui/NewMessageController.groovy index cb91fc0c..61d45d85 100644 --- a/gui/griffon-app/controllers/com/muwire/gui/NewMessageController.groovy +++ b/gui/griffon-app/controllers/com/muwire/gui/NewMessageController.groovy @@ -6,6 +6,10 @@ import griffon.inject.MVCMember import griffon.metadata.ArtifactProviderFor import javax.annotation.Nonnull +import com.muwire.core.Persona +import com.muwire.core.messenger.MWMessage +import com.muwire.core.messenger.UIMessageEvent + @ArtifactProviderFor(GriffonController) class NewMessageController { @MVCMember @Nonnull @@ -15,7 +19,15 @@ class NewMessageController { @ControllerAction void send() { + Set recipients = new HashSet<>() + recipients.add(model.recipient) + MWMessage message = new MWMessage(model.core.me, recipients, view.subjectField.text, + System.currentTimeMillis(), view.bodyArea.getText(), Collections.emptySet(), model.core.spk) + model.core.eventBus.publish(new UIMessageEvent(message : message)) + application.mvcGroupManager.groups["MainFrame"].model.addToOutbox(message) + + cancel() } @ControllerAction diff --git a/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy b/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy index 9b55eef0..7c1ee6eb 100644 --- a/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy +++ b/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy @@ -833,6 +833,15 @@ class MainFrameModel { } } + void addToOutbox(MWMessage message) { + messageHeadersMap.get(OUTBOX).add(message) + if (folderIdx == OUTBOX) { + messageHeaders.clear() + messageHeaders.addAll(messageHeadersMap.get(OUTBOX)) + view.messageHeaderTable.model.fireTableDataChanged() + } + } + void onMessageLoadedEvent(MessageLoadedEvent e) { runInsideUIAsync { int idx = 0 @@ -844,7 +853,7 @@ class MainFrameModel { throw new IllegalStateException("unknown folder $e.folder") } - + messageHeadersMap.get(idx).add(e.message) if (idx == folderIdx) { messageHeaders.clear() diff --git a/gui/griffon-app/models/com/muwire/gui/NewMessageModel.groovy b/gui/griffon-app/models/com/muwire/gui/NewMessageModel.groovy index ca3aa985..9a3fd201 100644 --- a/gui/griffon-app/models/com/muwire/gui/NewMessageModel.groovy +++ b/gui/griffon-app/models/com/muwire/gui/NewMessageModel.groovy @@ -1,14 +1,18 @@ package com.muwire.gui +import com.muwire.core.Core +import com.muwire.core.EventBus import com.muwire.core.Persona import com.muwire.core.messenger.MWMessage import griffon.core.artifact.GriffonModel import griffon.transform.Observable +import net.i2p.data.SigningPrivateKey import griffon.metadata.ArtifactProviderFor @ArtifactProviderFor(GriffonModel) class NewMessageModel { + Core core MWMessage reply Persona recipient } \ No newline at end of file diff --git a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy index 3510d7e6..2d4b5c6d 100644 --- a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy @@ -1244,6 +1244,7 @@ class MainFrameView { messageHeaderTable.model.fireTableDataChanged() }) + messageHeaderTable.setDefaultRenderer(Long.class, new DateRenderer()) messageHeaderTable.rowSorter.addRowSorterListener({evt -> lastMessageHeaderTableSortEvent = evt}) messageHeaderTable.rowSorter.setSortsOnUpdates(true) selectionModel = messageHeaderTable.getSelectionModel()