wip on end-to-end flow

pull/53/head
Zlatin Balevsky 2020-11-03 22:26:02 +00:00
parent f5bc2b8529
commit 1af12e3743
No known key found for this signature in database
GPG Key ID: A72832072D525E41
9 changed files with 44 additions and 9 deletions

View File

@ -692,7 +692,7 @@ class ConnectionAcceptor {
throw new Exception("invalid ETTER")
Map<String,String> headers = DataUtil.readAllHeaders(dis)
if (headers['Version'] != 1)
if (headers['Version'] != "1")
throw new Exception("unrecognized version")
int count = Integer.parseInt(headers['Count'])

View File

@ -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() {

View File

@ -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)

View File

@ -1,5 +1,7 @@
package com.muwire.core.messenger
class UIMessageEvent extends MWMessage {
import com.muwire.core.Event
class UIMessageEvent extends Event {
MWMessage message
}

View File

@ -794,6 +794,7 @@ class MainFrameController {
def params = [:]
params.recipient = te.persona
params.core = core
mvcGroup.createMVCGroup("new-message", UUID.randomUUID().toString(), params)
}

View File

@ -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<Persona> 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

View File

@ -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()

View File

@ -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
}

View File

@ -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()