From bfe0ab78676edbb2ebeff886dea74296b61795c5 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Mon, 11 Nov 2019 17:48:42 +0000 Subject: [PATCH] wip on hooking UI with core --- .../muwire/core/chat/ChatConnection.groovy | 18 +++++++ .../com/muwire/gui/ChatRoomController.groovy | 35 +++++++++++++ .../com/muwire/gui/ChatRoomModel.groovy | 3 ++ .../views/com/muwire/gui/ChatRoomView.groovy | 52 +++++++++++++++---- .../com/muwire/gui/ChatServerView.groovy | 1 + 5 files changed, 100 insertions(+), 9 deletions(-) diff --git a/core/src/main/groovy/com/muwire/core/chat/ChatConnection.groovy b/core/src/main/groovy/com/muwire/core/chat/ChatConnection.groovy index 652ec102..f6f58fc7 100644 --- a/core/src/main/groovy/com/muwire/core/chat/ChatConnection.groovy +++ b/core/src/main/groovy/com/muwire/core/chat/ChatConnection.groovy @@ -20,6 +20,7 @@ import groovy.util.logging.Log import net.i2p.crypto.DSAEngine import net.i2p.data.Base64 import net.i2p.data.Signature +import net.i2p.data.SigningPrivateKey @Log class ChatConnection implements Closeable { @@ -220,6 +221,23 @@ class ChatConnection implements Closeable { DSAEngine.getInstance().verifySignature(signature, signed, spk) } + public static byte[] sign(UUID uuid, long chatTime, String room, String words, Persona sender, Persona host, SigningPrivateKey spk) { + ByteArrayOutputStream baos = new ByteArrayOutputStream() + DataOutputStream daos = new DataOutputStream(baos) + daos.with { + write(uuid.toString().bytes) + host.write(daos) + sender.write(daos) + writeLong(chatTime) + write(room.getBytes(StandardCharsets.UTF_8)) + write(words.getBytes(StandardCharsets.UTF_8)) + close() + } + byte [] payload = baos.toByteArray() + Signature sig = DSAEngine.getInstance().sign(payload, spk) + sig.getData() + } + void sendChat(ChatMessageEvent e) { def chat = [:] chat.type = "Chat" diff --git a/gui/griffon-app/controllers/com/muwire/gui/ChatRoomController.groovy b/gui/griffon-app/controllers/com/muwire/gui/ChatRoomController.groovy index 952e5882..1343078e 100644 --- a/gui/griffon-app/controllers/com/muwire/gui/ChatRoomController.groovy +++ b/gui/griffon-app/controllers/com/muwire/gui/ChatRoomController.groovy @@ -4,14 +4,49 @@ import griffon.core.artifact.GriffonController import griffon.core.controller.ControllerAction import griffon.inject.MVCMember import griffon.metadata.ArtifactProviderFor +import net.i2p.crypto.DSAEngine +import net.i2p.data.DataHelper +import net.i2p.data.Signature + +import java.nio.charset.StandardCharsets + import javax.annotation.Nonnull +import com.muwire.core.chat.ChatConnection +import com.muwire.core.chat.ChatMessageEvent +import com.muwire.core.chat.ChatServer + @ArtifactProviderFor(GriffonController) class ChatRoomController { @MVCMember @Nonnull ChatRoomModel model + @MVCMember @Nonnull + ChatRoomView view @ControllerAction void say() { + String words = view.sayField.text + view.sayField.setText(null) + + long now = System.currentTimeMillis() + UUID uuid = UUID.randomUUID() + String room = model.console ? ChatServer.CONSOLE : model.room + + byte [] sig = ChatConnection.sign(uuid, now, room, words, model.core.me, mvcGroup.parentGroup.model.host, model.core.spk) + + def event = new ChatMessageEvent(uuid : uuid, + payload : words, + sender : model.core.me, + host : mvcGroup.parentGroup.model.host, + room : room, + chatTime : now, + sig : sig) + + model.core.eventBus.publish(event) + + String toShow = DataHelper.formatTime(now) + " <" + model.core.me.getHumanReadableName() + "> "+words + + view.roomTextArea.append(toShow) + view.roomTextArea.append('\n') } } \ No newline at end of file diff --git a/gui/griffon-app/models/com/muwire/gui/ChatRoomModel.groovy b/gui/griffon-app/models/com/muwire/gui/ChatRoomModel.groovy index fc379429..de2a325a 100644 --- a/gui/griffon-app/models/com/muwire/gui/ChatRoomModel.groovy +++ b/gui/griffon-app/models/com/muwire/gui/ChatRoomModel.groovy @@ -11,4 +11,7 @@ class ChatRoomModel { Core core String tabName String room + boolean console + + def members = [] } \ No newline at end of file diff --git a/gui/griffon-app/views/com/muwire/gui/ChatRoomView.groovy b/gui/griffon-app/views/com/muwire/gui/ChatRoomView.groovy index a051d5d5..95cf8aad 100644 --- a/gui/griffon-app/views/com/muwire/gui/ChatRoomView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/ChatRoomView.groovy @@ -3,6 +3,8 @@ package com.muwire.gui import griffon.core.artifact.GriffonView import griffon.inject.MVCMember import griffon.metadata.ArtifactProviderFor + +import javax.swing.JSplitPane import javax.swing.SwingConstants import java.awt.BorderLayout @@ -20,17 +22,48 @@ class ChatRoomView { def pane def parent + def sayField + def roomTextArea void initUI() { - pane = builder.panel { - borderLayout() - panel(constraints : BorderLayout.CENTER) { - textArea(editable : false) - } - panel(constraints : BorderLayout.SOUTH) { + int rowHeight = application.context.get("row-height") + if (model.console) { + pane = builder.panel { borderLayout() - textField(actionPerformed : {controller.say()}, constraints : BorderLayout.CENTER) - button(text : "Say", constraints : BorderLayout.EAST, sayAction) + panel(constraints : BorderLayout.CENTER) { + gridLayout(rows : 1, cols : 1) + roomTextArea = textArea(editable : false, lineWrap : true, wrapStyleWord : true) + } + panel(constraints : BorderLayout.SOUTH) { + borderLayout() + sayField = textField(actionPerformed : {controller.say()}, constraints : BorderLayout.CENTER) + button(text : "Say", constraints : BorderLayout.EAST, sayAction) + } + } + } else { + pane = builder.panel { + borderLayout() + panel(constraints : BorderLayout.CENTER) { + splitPane(orientation : JSplitPane.HORIZONTAL_SPLIT, continuousLayout : true, dividerLocation : 200) + panel { + table(autoCreateRowSorter : true, rowHeight : rowHeight) { + tableModel(list : model.members) { + closureColumn(header : "Name", type: String, read : {it.getHumanReadableName()}) + closureColumn(header : "Trust Status", type : String, read : {String.valueOf(model.core.trustService.getLevel(it.destination))}) + } + } + } + panel { + gridLayout(rows : 1, cols : 1) + roomTextArea = textArea(editable : false, lineWrap : true, wrapStyleWord : true) + } + } + panel(constraints : BorderLayout.SOUTH) { + borderLayout() + sayField = textField(actionPerformed : {controller.say()}, constraints : BorderLayout.CENTER) + button(text : "Say", constraints : BorderLayout.EAST, sayAction) + } + } } } @@ -50,7 +83,8 @@ class ChatRoomView { button(icon : imageIcon("/close_tab.png"), preferredSize: [20, 20], constraints : BorderLayout.EAST, actionPerformed : closeTab ) } - parent.setTabComponentAt(index, tabPanel) + if (!model.console) + parent.setTabComponentAt(index, tabPanel) } def closeTab = { diff --git a/gui/griffon-app/views/com/muwire/gui/ChatServerView.groovy b/gui/griffon-app/views/com/muwire/gui/ChatServerView.groovy index 85b53570..e9f74b2f 100644 --- a/gui/griffon-app/views/com/muwire/gui/ChatServerView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/ChatServerView.groovy @@ -54,6 +54,7 @@ class ChatServerView { params['core'] = model.core params['tabName'] = model.host.getHumanReadableName() + "-chat-rooms" params['room'] = 'Console' + params['console'] = true mvcGroup.createMVCGroup("chat-room","Console", params) }