X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fde%2Ftodesbaum%2Fjsite%2Fapplication%2FWebOfTrustInterface.java;h=ff9d33fc8a7a3e729d4b0a2bc91c805b42f1352a;hb=8db42d2121e8ee465ab8380a66febde1949a0106;hp=d1fd31d4f17d7319a937518b741164a082cad8d9;hpb=8b9cdbbb17878232fb2400a48e154823b7a306bf;p=jSite.git diff --git a/src/main/java/de/todesbaum/jsite/application/WebOfTrustInterface.java b/src/main/java/de/todesbaum/jsite/application/WebOfTrustInterface.java index d1fd31d..ff9d33f 100644 --- a/src/main/java/de/todesbaum/jsite/application/WebOfTrustInterface.java +++ b/src/main/java/de/todesbaum/jsite/application/WebOfTrustInterface.java @@ -1,5 +1,5 @@ /* - * jSite - WebOfTrustInterface.java - Copyright © 2012 David Roden + * jSite - WebOfTrustInterface.java - Copyright © 2012–2019 David Roden * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,6 +18,8 @@ package de.todesbaum.jsite.application; +import static java.util.Collections.emptyList; + import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -38,7 +40,7 @@ import de.todesbaum.util.freenet.fcp2.wot.OwnIdentity; * * @author David ‘Bombe’ Roden <bombe@freenetproject.org> */ -public class WebOfTrustInterface implements Runnable { +public class WebOfTrustInterface { /** The logger. */ private static final Logger logger = Logging.getLogger(WebOfTrustInterface.class); @@ -46,18 +48,9 @@ public class WebOfTrustInterface implements Runnable { /** Unique ID for the command identifier. */ private static final AtomicLong commandCounter = new AtomicLong(System.nanoTime()); - /** Object used for synchronization. */ - private final Object syncObject = new Object(); - /** The freenet interface. */ private final Freenet7Interface freenetInterface; - /** Whether the interface should stop. */ - private boolean shouldStop; - - /** The own identities. */ - private final List ownIdentities = new ArrayList(); - /** * Creates a new web of trust interface. * @@ -79,139 +72,91 @@ public class WebOfTrustInterface implements Runnable { * @return The list of own identities */ public List getOwnIdentities() { - synchronized (ownIdentities) { - return new ArrayList(ownIdentities); - } - } + try { + + /* connect. */ + Connection connection = freenetInterface.getConnection("jSite-WoT-Connector"); + logger.log(Level.INFO, String.format("Trying to connect to node at %s...", freenetInterface.getNode())); + if (!connection.connect()) { + logger.log(Level.WARNING, "Connection failed."); + return emptyList(); + } + Client client = new Client(connection); - // - // ACTIONS - // + /* send FCP command to WebOfTrust plugin. */ + sendFcpCommandToWotPlugin(client); - /** - * Starts the web of trust interface. - */ - public void start() { - Thread webOfTrustThread = new Thread(this, "WebOfTrust Interface"); - webOfTrustThread.start(); - } + /* read a message. */ + Message message = null; + while (!client.isDisconnected() && (message == null)) { + message = client.readMessage(1000); + } + if (message == null) { + return emptyList(); + } - /** - * Stops the web of trust interface - */ - public void stop() { - synchronized (syncObject) { - shouldStop = true; - syncObject.notifyAll(); + /* evaluate message. */ + List ownIdentities = parseOwnIdentitiesFromMessage(message); + + /* disconnect. */ + logger.log(Level.INFO, "Disconnecting from Node."); + connection.disconnect(); + return ownIdentities; + } catch (IOException ioe1) { + logger.log(Level.WARNING, String.format("Communication with node at %s failed.", freenetInterface.getNode()), ioe1); + return emptyList(); } } - // - // PRIVATE METHODS - // + private void sendFcpCommandToWotPlugin(Client client) throws IOException { + String messageIdentifier = "jSite-WoT-Command-" + commandCounter.getAndIncrement(); + FcpPluginMessage pluginMessage = new FcpPluginMessage(messageIdentifier); + pluginMessage.setPluginName("plugins.WebOfTrust.WebOfTrust"); + pluginMessage.setParameter("Message", "GetOwnIdentities"); + client.execute(pluginMessage); + } - /** - * Returns whether the web of trust interface should stop. - * - * @return {@code true} if the web of trust interface should stop, - * {@code false} otherwise - */ - private boolean shouldStop() { - synchronized (syncObject) { - return shouldStop; + private List parseOwnIdentitiesFromMessage(Message message) { + List ownIdentities = new ArrayList(); + if (message.getName().equals("FCPPluginReply")) { + logger.log(Level.FINE, "Got matching Reply from WebOfTrust."); + /* parse identities. */ + int identityCounter = -1; + while (message.get("Replies.Identity" + ++identityCounter) != null) { + String id = message.get("Replies.Identity" + identityCounter); + String nickname = message.get("Replies.Nickname" + identityCounter); + String requestUri = shortenUri(message.get("Replies.RequestURI" + identityCounter)); + String insertUri = shortenUri(message.get("Replies.InsertURI" + identityCounter)); + DefaultOwnIdentity ownIdentity = new DefaultOwnIdentity(id, nickname, requestUri, insertUri); + logger.log(Level.FINE, String.format("Parsed Own Identity %s.", ownIdentity)); + ownIdentities.add(ownIdentity); + } + logger.log(Level.INFO, String.format("Parsed %d Own Identities.", ownIdentities.size())); + } else if ("ProtocolError".equals(message.getName())) { + logger.log(Level.WARNING, "WebOfTrust Plugin not found!"); + } else if ("Error".equals(message.getName())) { + logger.log(Level.WARNING, "WebOfTrust Plugin returned an error!"); } + return ownIdentities; } - // - // RUNNABLE METHODS - // - /** - * {@inheritDoc} + * Returns the essential parts of an URI, consisting of only the + * private/public key, decryption key, and the flags. + * + * @param uri + * The URI to shorten + * @return The shortened URI */ - @Override - public void run() { - boolean waitBeforeReconnect = false; - while (!shouldStop()) { - - /* wait a minute before reconnecting for another try. */ - if (waitBeforeReconnect) { - logger.log(Level.FINE, "Waiting 60 seconds before reconnecting."); - synchronized (syncObject) { - try { - syncObject.wait(60 * 1000); - } catch (InterruptedException ie1) { - /* ignore. */ - } - } - if (shouldStop()) { - continue; - } - } else { - waitBeforeReconnect = true; - } - - try { - - /* connect. */ - Connection connection = freenetInterface.getConnection("jSite-WoT-Connector"); - logger.log(Level.INFO, String.format("Trying to connect to node at %s...", freenetInterface.getNode())); - if (!connection.connect()) { - logger.log(Level.WARNING, "Connection failed."); - continue; - } - Client client = new Client(connection); - - /* send FCP command to WebOfTrust plugin. */ - String messageIdentifier = "jSite-WoT-Command-" + commandCounter.getAndIncrement(); - FcpPluginMessage pluginMessage = new FcpPluginMessage(messageIdentifier); - pluginMessage.setPluginName("plugins.WebOfTrust.WebOfTrust"); - pluginMessage.setParameter("Message", "GetOwnIdentities"); - client.execute(pluginMessage); - - /* read a message. */ - Message message = null; - while (!client.isDisconnected() && !shouldStop() && (message == null)) { - message = client.readMessage(1000); - } - if (message == null) { - continue; - } - - /* evaluate message. */ - if (message.getName().equals("FCPPluginReply")) { - logger.log(Level.FINE, "Got matching Reply from WebOfTrust."); - /* parse identities. */ - List ownIdentities = new ArrayList(); - int identityCounter = -1; - while (message.get("Replies.Identity" + ++identityCounter) != null) { - String id = message.get("Replies.Identity" + identityCounter); - String nickname = message.get("Replies.Nickname " + identityCounter); - String requestUri = message.get("Replies.RequestURI" + identityCounter); - String insertUri = message.get("Replies.InsertURI" + identityCounter); - DefaultOwnIdentity ownIdentity = new DefaultOwnIdentity(id, nickname, requestUri, insertUri); - logger.log(Level.FINE, String.format("Parsed Own Identity %s.", ownIdentity)); - ownIdentities.add(ownIdentity); - } - logger.log(Level.INFO, String.format("Parsed %d Own Identities.", ownIdentities.size())); - - synchronized (this.ownIdentities) { - this.ownIdentities.clear(); - this.ownIdentities.addAll(ownIdentities); - } - } else if ("ProtocolError".equals(message.getName())) { - logger.log(Level.WARNING, "WebOfTrust Plugin not found!"); - } - - /* disconnect. */ - logger.log(Level.INFO, "Disconnecting from Node."); - connection.disconnect(); - - } catch (IOException ioe1) { - logger.log(Level.WARNING, String.format("Communication with node at %s failed.", freenetInterface.getNode()), ioe1); - } - + private static String shortenUri(String uri) { + String shortenedUri = uri; + if (shortenedUri.charAt(3) == '@') { + shortenedUri = shortenedUri.substring(4); + } + if (shortenedUri.indexOf('/') > -1) { + shortenedUri = shortenedUri.substring(0, shortenedUri.indexOf('/')); } + return shortenedUri; } }