diff --git a/core/src/main/groovy/com/muwire/core/Core.groovy b/core/src/main/groovy/com/muwire/core/Core.groovy index 1d98a65d..8f84eb3f 100644 --- a/core/src/main/groovy/com/muwire/core/Core.groovy +++ b/core/src/main/groovy/com/muwire/core/Core.groovy @@ -97,8 +97,8 @@ public class Core { final MuWireSettings muOptions private final I2PSession i2pSession; - private final TrustService trustService - private final TrustSubscriber trustSubscriber + final TrustService trustService + final TrustSubscriber trustSubscriber private final PersisterService persisterService private final HostCache hostCache private final ConnectionManager connectionManager diff --git a/core/src/main/groovy/com/muwire/core/trust/RemoteTrustList.groovy b/core/src/main/groovy/com/muwire/core/trust/RemoteTrustList.groovy index e01f9f0c..e983c55b 100644 --- a/core/src/main/groovy/com/muwire/core/trust/RemoteTrustList.groovy +++ b/core/src/main/groovy/com/muwire/core/trust/RemoteTrustList.groovy @@ -10,8 +10,8 @@ import net.i2p.util.ConcurrentHashSet class RemoteTrustList { public enum Status { NEW, UPDATING, UPDATED, UPDATE_FAILED } - private final Persona persona - private final Set good, bad + final Persona persona + final Set good, bad volatile long timestamp volatile boolean forceUpdate Status status = Status.NEW diff --git a/core/src/main/groovy/com/muwire/core/trust/TrustService.groovy b/core/src/main/groovy/com/muwire/core/trust/TrustService.groovy index 5694c5d4..56827ce2 100644 --- a/core/src/main/groovy/com/muwire/core/trust/TrustService.groovy +++ b/core/src/main/groovy/com/muwire/core/trust/TrustService.groovy @@ -130,8 +130,8 @@ class TrustService extends Service { } public static class TrustEntry { - private final Persona persona - private final String reason + final Persona persona + final String reason TrustEntry(Persona persona, String reason) { this.persona = persona this.reason = reason diff --git a/core/src/main/groovy/com/muwire/core/trust/TrustSubscriber.groovy b/core/src/main/groovy/com/muwire/core/trust/TrustSubscriber.groovy index 6ffd1e5f..038f1a9f 100644 --- a/core/src/main/groovy/com/muwire/core/trust/TrustSubscriber.groovy +++ b/core/src/main/groovy/com/muwire/core/trust/TrustSubscriber.groovy @@ -26,7 +26,7 @@ class TrustSubscriber { private final I2PConnector i2pConnector private final MuWireSettings settings - private final Map remoteTrustLists = new ConcurrentHashMap<>() + final Map remoteTrustLists = new ConcurrentHashMap<>() private final Object waitLock = new Object() private volatile boolean shutdown @@ -50,7 +50,7 @@ class TrustSubscriber { thread?.interrupt() updateThreads.shutdownNow() } - + void onTrustSubscriptionEvent(TrustSubscriptionEvent e) { if (!e.subscribe) { remoteTrustLists.remove(e.persona.destination) diff --git a/webui/src/main/java/com/muwire/webui/MuWireClient.java b/webui/src/main/java/com/muwire/webui/MuWireClient.java index 9f51ea20..0b9068e3 100644 --- a/webui/src/main/java/com/muwire/webui/MuWireClient.java +++ b/webui/src/main/java/com/muwire/webui/MuWireClient.java @@ -29,6 +29,7 @@ import com.muwire.core.files.FileLoadedEvent; import com.muwire.core.search.BrowseStatusEvent; import com.muwire.core.search.UIResultBatchEvent; import com.muwire.core.search.UIResultEvent; +import com.muwire.core.trust.TrustEvent; import net.i2p.app.ClientAppManager; import net.i2p.app.ClientAppState; @@ -139,11 +140,15 @@ public class MuWireClient { core.getEventBus().register(BrowseStatusEvent.class, browseManager); core.getEventBus().register(UIResultEvent.class, browseManager); + TrustManager trustManager = new TrustManager(); + core.getEventBus().register(TrustEvent.class, trustManager); + servletContext.setAttribute("searchManager", searchManager); servletContext.setAttribute("downloadManager", downloadManager); servletContext.setAttribute("connectionCounter", connectionCounter); servletContext.setAttribute("fileManager", fileManager); servletContext.setAttribute("browseManager", browseManager); + servletContext.setAttribute("trustManager", trustManager); core.getEventBus().publish(new UILoadedEvent()); } diff --git a/webui/src/main/java/com/muwire/webui/TrustManager.java b/webui/src/main/java/com/muwire/webui/TrustManager.java new file mode 100644 index 00000000..cb42879e --- /dev/null +++ b/webui/src/main/java/com/muwire/webui/TrustManager.java @@ -0,0 +1,16 @@ +package com.muwire.webui; + +import com.muwire.core.trust.TrustEvent; + +public class TrustManager { + + private volatile long revision; + + public long getRevision() { + return revision; + } + + public void onTrustEvent(TrustEvent e) { + revision++; + } +} diff --git a/webui/src/main/java/com/muwire/webui/TrustServlet.java b/webui/src/main/java/com/muwire/webui/TrustServlet.java new file mode 100644 index 00000000..65dbddee --- /dev/null +++ b/webui/src/main/java/com/muwire/webui/TrustServlet.java @@ -0,0 +1,129 @@ +package com.muwire.webui; + +import java.io.ByteArrayInputStream; +import java.io.IOException; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.muwire.core.Core; +import com.muwire.core.Persona; +import com.muwire.core.trust.RemoteTrustList; +import com.muwire.core.trust.TrustService.TrustEntry; + +import net.i2p.data.Base64; +import net.i2p.data.DataHelper; + +public class TrustServlet extends HttpServlet { + + private TrustManager trustManager; + private Core core; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String action = req.getParameter("action"); + if (action == null) { + resp.sendError(403, "Bad action param"); + return; + } + + StringBuilder sb = new StringBuilder(); + sb.append(""); + + if (action.equals("revision")) { + sb.append("").append(trustManager.getRevision()).append(""); + } else if (action.equals("users")) { + sb.append(""); + + sb.append(""); + for (TrustEntry te : core.getTrustService().getGood().values()) { + TEtoXML(te,sb); + } + sb.append(""); + + sb.append(""); + for (TrustEntry te : core.getTrustService().getBad().values()) { + TEtoXML(te, sb); + } + sb.append(""); + + sb.append(""); + + } else if (action.equals("subscriptions")) { + sb.append(""); + + for (RemoteTrustList list : core.getTrustSubscriber().getRemoteTrustLists().values()) { + sb.append(""); + sb.append("").append(Util.escapeHTMLinXML(list.getPersona().getHumanReadableName())).append(""); + sb.append("").append(list.getPersona().toBase64()).append(""); + sb.append("").append(list.getStatus()).append(""); + sb.append("").append(DataHelper.formatTime(list.getTimestamp())).append(""); + sb.append(""); + } + + sb.append(""); + + } else if (action.equals("list")) { + String userB64 = req.getParameter("user"); + Persona p; + try { + p = new Persona(new ByteArrayInputStream(Base64.decode(userB64))); + } catch (Exception bad) { + resp.sendError(403, "Bad param"); + return; + } + + RemoteTrustList list = core.getTrustSubscriber().getRemoteTrustLists().get(p.getDestination()); + if (list == null) + return; + + sb.append(""); + + sb.append(""); + for (TrustEntry te : list.getGood()) { + TEtoXML(te, sb); + } + sb.append(""); + + sb.append(""); + for (TrustEntry te : list.getBad()) { + TEtoXML(te, sb); + } + sb.append(""); + + sb.append(""); + } + + resp.setContentType("text/xml"); + resp.setCharacterEncoding("UTF-8"); + resp.setDateHeader("Expires", 0); + resp.setHeader("Pragma", "no-cache"); + resp.setHeader("Cache-Control", "no-store, max-age=0, no-cache, must-revalidate"); + byte[] out = sb.toString().getBytes("UTF-8"); + resp.setContentLength(out.length); + resp.getOutputStream().write(out); + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + // TODO Auto-generated method stub + super.doPost(req, resp); + } + + @Override + public void init(ServletConfig config) throws ServletException { + core = (Core) config.getServletContext().getAttribute("core"); + trustManager = (TrustManager) config.getServletContext().getAttribute("trustManager"); + } + + private static void TEtoXML(TrustEntry te, StringBuilder sb) { + sb.append(""); + sb.append("").append(Util.escapeHTMLinXML(te.getPersona().getHumanReadableName())).append(""); + sb.append("").append(te.getPersona().toBase64()).append(""); + sb.append("").append(Util.escapeHTMLinXML(te.getReason())).append(""); + sb.append(""); + } +}