public void renderStatusHTML(Writer out) throws IOException { StringBuilder buf = new StringBuilder(1024); // move to the jsp //buf.append("<h2>Banned Peers</h2>"); Map<Hash, Banlist.Entry> entries = new TreeMap<Hash, Banlist.Entry>(new HashComparator()); entries.putAll(_context.banlist().getEntries()); if (entries.isEmpty()) { buf.append("<i>").append(_("none")).append("</i>"); out.write(buf.toString()); return; } buf.append("<ul>"); for (Map.Entry<Hash, Banlist.Entry> e : entries.entrySet()) { Hash key = e.getKey(); Banlist.Entry entry = e.getValue(); long expires = entry.expireOn-_context.clock().now(); if (expires <= 0) continue; buf.append("<li>").append(_context.commSystem().renderPeerHTML(key)); buf.append(' '); String expireString = DataHelper.formatDuration2(expires); if (key.equals(Hash.FAKE_HASH)) buf.append(_("Permanently banned")); else if (expires < 5l*24*60*60*1000) buf.append(_("Temporary ban expiring in {0}", expireString)); else buf.append(_("Banned until restart or in {0}", expireString)); Set<String> transports = entry.transports; if ( (transports != null) && (!transports.isEmpty()) ) buf.append(" on the following transport: ").append(transports); if (entry.cause != null) { buf.append("<br>\n"); if (entry.causeCode != null) buf.append(_(entry.cause, entry.causeCode)); else buf.append(_(entry.cause)); } if (!key.equals(Hash.FAKE_HASH)) { buf.append(" (<a href=\"configpeer?peer=").append(key.toBase64()) .append("#unsh\">").append(_("unban now")).append("</a>)"); } buf.append("</li>\n"); } buf.append("</ul>\n"); out.write(buf.toString()); out.flush(); }
/** * Send to a subset of all floodfill peers. We do this to implement Kademlia within the * floodfills, i.e. we flood to those closest to the key. */ public void flood(DatabaseEntry ds) { Hash key = ds.getHash(); Hash rkey = _context.routingKeyGenerator().getRoutingKey(key); FloodfillPeerSelector sel = (FloodfillPeerSelector) getPeerSelector(); List<Hash> peers = sel.selectFloodfillParticipants(rkey, MAX_TO_FLOOD, getKBuckets()); int flooded = 0; for (int i = 0; i < peers.size(); i++) { Hash peer = peers.get(i); RouterInfo target = lookupRouterInfoLocally(peer); if ((target == null) || (_context.banlist().isBanlisted(peer))) continue; // Don't flood a RI back to itself // Not necessary, a ff will do its own flooding (reply token == 0) // if (peer.equals(target.getIdentity().getHash())) // continue; if (peer.equals(_context.routerHash())) continue; DatabaseStoreMessage msg = new DatabaseStoreMessage(_context); msg.setEntry(ds); OutNetMessage m = new OutNetMessage( _context, msg, _context.clock().now() + FLOOD_TIMEOUT, FLOOD_PRIORITY, target); // note send failure but don't give credit on success // might need to change this Job floodFail = new FloodFailedJob(_context, peer); m.setOnFailedSendJob(floodFail); _context.commSystem().processMessage(m); flooded++; if (_log.shouldLog(Log.INFO)) _log.info("Flooding the entry for " + key.toBase64() + " to " + peer.toBase64()); } if (_log.shouldLog(Log.INFO)) _log.info("Flooded the data to " + flooded + " of " + peers.size() + " peers"); }