From ecaec1df3b9920dde4f16ea703e2198939a06268 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Mon, 4 May 2020 23:16:32 +0100 Subject: [PATCH] sign tool --- gui/griffon-app/conf/Config.groovy | 5 ++ .../com/muwire/gui/SignController.groovy | 55 ++++++++++++++++ .../models/com/muwire/gui/SignModel.groovy | 9 +++ .../views/com/muwire/gui/MainFrameView.groovy | 5 ++ .../views/com/muwire/gui/SignView.groovy | 66 +++++++++++++++++++ 5 files changed, 140 insertions(+) create mode 100644 gui/griffon-app/controllers/com/muwire/gui/SignController.groovy create mode 100644 gui/griffon-app/models/com/muwire/gui/SignModel.groovy create mode 100644 gui/griffon-app/views/com/muwire/gui/SignView.groovy diff --git a/gui/griffon-app/conf/Config.groovy b/gui/griffon-app/conf/Config.groovy index e72c6b6b..8638ff80 100644 --- a/gui/griffon-app/conf/Config.groovy +++ b/gui/griffon-app/conf/Config.groovy @@ -136,4 +136,9 @@ mvcGroups { view = 'com.muwire.gui.WatchedDirectoryView' controller = 'com.muwire.gui.WatchedDirectoryController' } + 'sign' { + model = 'com.muwire.gui.SignModel' + view = 'com.muwire.gui.SignView' + controller = 'com.muwire.gui.SignController' + } } diff --git a/gui/griffon-app/controllers/com/muwire/gui/SignController.groovy b/gui/griffon-app/controllers/com/muwire/gui/SignController.groovy new file mode 100644 index 00000000..95c0d41f --- /dev/null +++ b/gui/griffon-app/controllers/com/muwire/gui/SignController.groovy @@ -0,0 +1,55 @@ +package com.muwire.gui + +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.Base64 + +import java.awt.Toolkit +import java.awt.datatransfer.StringSelection + +import javax.annotation.Nonnull +import javax.swing.JOptionPane + +import com.muwire.core.Constants +import com.muwire.core.Core +import com.muwire.core.util.DataUtil + +@ArtifactProviderFor(GriffonController) +class SignController { + + Core core + + @MVCMember @Nonnull + SignView view + + @ControllerAction + void sign() { + String plain = view.plainTextArea.getText() + if (plain.length() > Constants.MAX_COMMENT_LENGTH) { + JOptionPane.showMessageDialog(null, "Text to sign is too long - ${plain.length()} bytes. The maximum size is $Constants.MAX_COMMENT_LENGTH bytes", + "Text Too Long", JOptionPane.WARNING_MESSAGE) + return + } + + byte[] payload = DataUtil.encodei18nString(plain) + def sig = DSAEngine.getInstance().sign(payload, core.spk) + view.signedTextArea.setText(Base64.encode(sig.data)) + } + + @ControllerAction + void copy() { + String signed = view.signedTextArea.getText() + StringSelection selection = new StringSelection(signed) + def clipboard = Toolkit.getDefaultToolkit().getSystemClipboard() + clipboard.setContents(selection, null) + } + + @ControllerAction + void close() { + view.dialog.setVisible(false) + mvcGroup.destroy() + } +} \ No newline at end of file diff --git a/gui/griffon-app/models/com/muwire/gui/SignModel.groovy b/gui/griffon-app/models/com/muwire/gui/SignModel.groovy new file mode 100644 index 00000000..a806ee86 --- /dev/null +++ b/gui/griffon-app/models/com/muwire/gui/SignModel.groovy @@ -0,0 +1,9 @@ +package com.muwire.gui + +import griffon.core.artifact.GriffonModel +import griffon.transform.Observable +import griffon.metadata.ArtifactProviderFor + +@ArtifactProviderFor(GriffonModel) +class SignModel { +} \ 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 cd0498e2..665f9e48 100644 --- a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy @@ -144,6 +144,11 @@ class MainFrameView { mvcGroup.createMVCGroup("chat-monitor","chat-monitor",env) } }) + menuItem("Sign Tool", actionPerformed : { + def env = [:] + env['core'] = model.core + mvcGroup.createMVCGroup("sign",env) + }) } } borderLayout() diff --git a/gui/griffon-app/views/com/muwire/gui/SignView.groovy b/gui/griffon-app/views/com/muwire/gui/SignView.groovy new file mode 100644 index 00000000..5a4444e2 --- /dev/null +++ b/gui/griffon-app/views/com/muwire/gui/SignView.groovy @@ -0,0 +1,66 @@ +package com.muwire.gui + +import griffon.core.artifact.GriffonView +import griffon.inject.MVCMember +import griffon.metadata.ArtifactProviderFor + +import javax.swing.JDialog +import javax.swing.SwingConstants + +import java.awt.BorderLayout +import java.awt.event.WindowAdapter +import java.awt.event.WindowEvent + +import javax.annotation.Nonnull + +@ArtifactProviderFor(GriffonView) +class SignView { + @MVCMember @Nonnull + FactoryBuilderSupport builder + + def mainFrame + def dialog + def p + def plainTextArea + def signedTextArea + + void initUI() { + mainFrame = application.windowManager.findWindow("main-frame") + + dialog = new JDialog(mainFrame, "Sign Text", true) + + p = builder.panel { + borderLayout() + panel (constraints : BorderLayout.NORTH) { + label("Enter text to be signed") + } + panel (constraints : BorderLayout.CENTER) { + gridLayout(rows : 2, cols: 1) + scrollPane { + plainTextArea = textArea(rows : 10, columns : 50, editable : true, lineWrap: true, wrapStyleWord : true) + } + scrollPane { + signedTextArea = textArea(rows : 10, columns : 50, editable : false, lineWrap : true, wrapStyleWord : true) + } + } + panel (constraints : BorderLayout.SOUTH) { + button(text : "Sign", signAction) + button(text : "Copy To Clipboard", copyAction) + button(text : "Dismiss", closeAction) + } + } + } + + void mvcGroupInit(Map args) { + dialog.getContentPane().add(p) + dialog.pack() + dialog.setLocationRelativeTo(mainFrame) + dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE) + dialog.addWindowListener( new WindowAdapter() { + public void windowClosed(WindowEvent e) { + mvcGroup.destroy() + } + }) + dialog.show() + } +} \ No newline at end of file