package freenet.clients.http; import java.io.IOException; import java.net.URI; import java.util.Comparator; import freenet.client.HighLevelSimpleClient; import freenet.l10n.NodeL10n; import freenet.node.Node; import freenet.node.NodeClientCore; import freenet.node.OpennetPeerNodeStatus; import freenet.node.PeerNodeStatus; import freenet.support.HTMLNode; import freenet.support.SimpleFieldSet; import freenet.support.TimeUtil; import freenet.support.api.HTTPRequest; public class OpennetConnectionsToadlet extends ConnectionsToadlet implements LinkEnabledCallback { protected OpennetConnectionsToadlet(Node n, NodeClientCore core, HighLevelSimpleClient client) { super(n, core, client); } @Override protected void drawNameColumn(HTMLNode peerRow, PeerNodeStatus peerNodeStatus, boolean advanced) { // Do nothing - no names on opennet } @Override protected void drawPrivateNoteColumn(HTMLNode peerRow, PeerNodeStatus peerNodeStatus, boolean fProxyJavascriptEnabled) { // Do nothing - no private notes either (no such thing as negative trust in cyberspace) } @Override protected boolean hasNameColumn() { return false; } @Override protected boolean hasPrivateNoteColumn() { return false; } @Override protected SimpleFieldSet getNoderef() { return node.exportOpennetPublicFieldSet(); } @Override protected PeerNodeStatus[] getPeerNodeStatuses(boolean noHeavy) { return node.peers.getOpennetPeerNodeStatuses(noHeavy); } @Override public boolean isEnabled(ToadletContext ctx) { return node.isOpennetEnabled(); } @Override protected String getPageTitle(String titleCountString) { return NodeL10n.getBase().getString("OpennetConnectionsToadlet.fullTitle", new String[] {"counts"}, new String[] {titleCountString} ); } @Override protected boolean shouldDrawNoderefBox(boolean advancedModeEnabled) { return advancedModeEnabled; } @Override protected boolean showPeerActionsBox() { // No per-peer actions supported on opennet - there's no point, they'll only reconnect, // possibly as a different identity. And we don't want to be able to send N2NTM spam either. return false; } @Override protected void drawPeerActionSelectBox(HTMLNode peerForm, boolean advancedModeEnabled) { // Do nothing, see showPeerActionsBox(). } @Override protected String getPeerListTitle() { return NodeL10n.getBase().getString("OpennetConnectionsToadlet.peersListTitle"); } @Override protected boolean acceptRefPosts() { return true; } @Override protected String defaultRedirectLocation() { return "/opennet/"; } @Override protected boolean isOpennet() { return true; } protected class OpennetComparator extends ComparatorByStatus { OpennetComparator(String sortBy, boolean reversed) { super(sortBy, reversed); } @Override protected int customCompare(PeerNodeStatus firstNode, PeerNodeStatus secondNode, String sortBy) { if(sortBy.equals("successTime")) { long t1 = ((OpennetPeerNodeStatus)firstNode).timeLastSuccess; long t2 = ((OpennetPeerNodeStatus)secondNode).timeLastSuccess; if(t1 > t2) return reversed ? 1 : -1; else if(t2 > t1) return reversed ? -1 : 1; } return super.customCompare(firstNode, secondNode, sortBy); } } @Override protected Comparator<PeerNodeStatus> comparator(String sortBy, boolean reversed) { return new OpennetComparator(sortBy, reversed); } @Override SimpleColumn[] endColumnHeaders(boolean advancedMode) { if(!advancedMode) return null; return new SimpleColumn[] { new SimpleColumn() { @Override protected void drawColumn(HTMLNode peerRow, PeerNodeStatus peerNodeStatus) { OpennetPeerNodeStatus status = (OpennetPeerNodeStatus) peerNodeStatus; long tLastSuccess = status.timeLastSuccess; peerRow.addChild("td", "class", "peer-last-success", tLastSuccess > 0 ? TimeUtil.formatTime(System.currentTimeMillis() - tLastSuccess) : "NEVER"); } @Override public String getExplanationKey() { return "OpennetConnectionsToadlet.successTime"; } @Override public String getSortString() { return "successTime"; } @Override public String getTitleKey() { return "OpennetConnectionsToadlet.successTimeTitle"; } }}; } @Override public String path() { return "/strangers/"; } @Override public void handleMethodGET(URI uri, HTTPRequest request, ToadletContext ctx) throws ToadletContextClosedException, IOException, RedirectException { super.handleMethodGET(uri, request, ctx); } @Override public void handleMethodPOST(URI uri, HTTPRequest request, ToadletContext ctx) throws ToadletContextClosedException, IOException, RedirectException { super.handleMethodPOST(uri, request, ctx); } }