Changeset 751134f5


Ignore:
Timestamp:
Dec 31, 2010 1:52:45 AM (9 years ago)
Author:
m1xxy <m1xxy@…>
Branches:
master
Children:
ba8c8aa
Parents:
4025a57 (diff), 8ab18925 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

merge of '6ac923b4b6f858e909094ff3d0fbfbbfba7ff9d4'

and '8b279c27b4d263a1c9cc02ab7fe2e448e652f469'

Files:
2 added
28 edited

Legend:

Unmodified
Added
Removed
  • apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java

    r4025a57 r751134f5  
    330330        // Opera and text-mode browsers: no &thinsp; and no input type=image values submitted
    331331        String ua = req.getHeader("User-Agent");
    332         boolean isDegraded = ua != null && (ua.startsWith("Opera") || ua.startsWith("Lynx") ||
     332        boolean isDegraded = ua != null && (ua.startsWith("Lynx") ||
    333333                                            ua.startsWith("ELinks") || ua.startsWith("Dillo"));
    334334
     335        boolean noThinsp = isDegraded || ua.startsWith("Opera");
    335336        if (_manager.util().connected()) {
    336337            if (isDegraded)
    337338                out.write("<a href=\"/i2psnark/?action=StopAll&amp;nonce=" + _nonce + "\"><img title=\"");
    338             else
    339                 out.write("<input type=\"image\" name=\"action\" value=\"StopAll\" title=\"");
     339            else {
     340                // http://www.onenaught.com/posts/382/firefox-4-change-input-type-image-only-submits-x-and-y-not-name
     341                //out.write("<input type=\"image\" name=\"action\" value=\"StopAll\" title=\"");
     342                out.write("<input type=\"image\" name=\"action_StopAll\" value=\"foo\" title=\"");
     343            }
    340344            out.write(_("Stop all torrents and the I2P tunnel"));
    341345            out.write("\" src=\"" + _imgPath + "stop_all.png\" alt=\"");
     
    348352                out.write("<a href=\"/i2psnark/?action=StartAll&amp;nonce=" + _nonce + "\"><img title=\"");
    349353            else
    350                 out.write("<input type=\"image\" name=\"action\" value=\"StartAll\" title=\"");
     354                out.write("<input type=\"image\" name=\"action_StartAll\" value=\"foo\" title=\"");
    351355            out.write(_("Start all torrents and the I2P tunnel"));
    352356            out.write("\" src=\"" + _imgPath + "start_all.png\" alt=\"");
     
    363367            boolean showDebug = "2".equals(peerParam);
    364368            boolean showPeers = showDebug || "1".equals(peerParam) || Base64.encode(snark.meta.getInfoHash()).equals(peerParam);
    365             displaySnark(out, snark, uri, i, stats, showPeers, isDegraded, showDebug);
     369            displaySnark(out, snark, uri, i, stats, showPeers, isDegraded, noThinsp, showDebug);
    366370        }
    367371
     
    405409        String action = req.getParameter("action");
    406410        if (action == null) {
    407             _manager.addMessage("No action specified");
    408             return;
     411            // http://www.onenaught.com/posts/382/firefox-4-change-input-type-image-only-submits-x-and-y-not-name
     412            Map params = req.getParameterMap();
     413            for (Object o : params.keySet()) {
     414                String key = (String) o;
     415                if (key.startsWith("action_") && key.endsWith(".x")) {
     416                    action = key.substring(0, key.length() - 2).substring(7);
     417                    break;
     418                }
     419            }
     420            if (action == null) {
     421                _manager.addMessage("No action specified");
     422                return;
     423            }
    409424        }
    410425        // sadly, Opera doesn't send value with input type=image, so we have to use GET there
     
    699714    private static final int MAX_DISPLAYED_ERROR_LENGTH = 43;
    700715    private void displaySnark(PrintWriter out, Snark snark, String uri, int row, long stats[], boolean showPeers,
    701                               boolean isDegraded, boolean showDebug) throws IOException {
     716                              boolean isDegraded, boolean noThinsp, boolean showDebug) throws IOException {
    702717        String filename = snark.torrent;
    703718        File f = new File(filename);
     
    759774                statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "trackererror.png\" title=\"" + err + "\"></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Tracker Error") +
    760775                               ": <a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">" +
    761                                curPeers + thinsp(isDegraded) +
     776                               curPeers + thinsp(noThinsp) +
    762777                               ngettext("1 peer", "{0} peers", knownPeers) + "</a>";
    763778            else if (isRunning)
    764779                statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "trackererror.png\" title=\"" + err + "\"></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Tracker Error") +
    765                                ": " + curPeers + thinsp(isDegraded) +
     780                               ": " + curPeers + thinsp(noThinsp) +
    766781                               ngettext("1 peer", "{0} peers", knownPeers);
    767782            else {
     
    775790                statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "seeding.png\" ></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Seeding") +
    776791                               ": <a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">" +
    777                                curPeers + thinsp(isDegraded) +
     792                               curPeers + thinsp(noThinsp) +
    778793                               ngettext("1 peer", "{0} peers", knownPeers) + "</a>";
    779794            else if (isRunning)
    780795                statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "seeding.png\" ></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Seeding") +
    781                                ": " + curPeers + thinsp(isDegraded) +
     796                               ": " + curPeers + thinsp(noThinsp) +
    782797                               ngettext("1 peer", "{0} peers", knownPeers);
    783798            else
     
    787802                statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "downloading.png\" ></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("OK") +
    788803                               ": <a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">" +
    789                                curPeers + thinsp(isDegraded) +
     804                               curPeers + thinsp(noThinsp) +
    790805                               ngettext("1 peer", "{0} peers", knownPeers) + "</a>";
    791806            else if (isRunning && curPeers > 0 && downBps > 0)
    792807                statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "downloading.png\" ></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("OK") +
    793                                ": " + curPeers + thinsp(isDegraded) +
     808                               ": " + curPeers + thinsp(noThinsp) +
    794809                               ngettext("1 peer", "{0} peers", knownPeers);
    795810            else if (isRunning && curPeers > 0 && !showPeers)
    796811                statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "stalled.png\" ></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Stalled") +
    797812                               ": <a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">" +
    798                                curPeers + thinsp(isDegraded) +
     813                               curPeers + thinsp(noThinsp) +
    799814                               ngettext("1 peer", "{0} peers", knownPeers) + "</a>";
    800815            else if (isRunning && curPeers > 0)
    801816                statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "stalled.png\" ></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Stalled") +
    802                                ": " + curPeers + thinsp(isDegraded) +
     817                               ": " + curPeers + thinsp(noThinsp) +
    803818                               ngettext("1 peer", "{0} peers", knownPeers);
    804819            else if (isRunning && knownPeers > 0)
    805820                statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "nopeers.png\" ></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("No Peers") +
    806                                ": 0" + thinsp(isDegraded) + knownPeers ;
     821                               ": 0" + thinsp(noThinsp) + knownPeers ;
    807822            else if (isRunning)
    808823                statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "nopeers.png\" ></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("No Peers");
     
    881896        out.write("<td align=\"right\" class=\"snarkTorrentDownloaded " + rowClass + "\">");
    882897        if (remaining > 0)
    883             out.write(formatSize(total-remaining) + thinsp(isDegraded) + formatSize(total));
     898            out.write(formatSize(total-remaining) + thinsp(noThinsp) + formatSize(total));
    884899        else
    885900            out.write(formatSize(total)); // 3GB
     
    906921                out.write("<a href=\"/i2psnark/?action=Stop_" + b64 + "&amp;nonce=" + _nonce + "\"><img title=\"");
    907922            else
    908                 out.write("<input type=\"image\" name=\"action\" value=\"Stop_" + b64 + "\" title=\"");
     923                out.write("<input type=\"image\" name=\"action_Stop_" + b64 + "\" value=\"foo\" title=\"");
    909924            out.write(_("Stop the torrent"));
    910925            out.write("\" src=\"" + _imgPath + "stop.png\" alt=\"");
     
    918933                    out.write("<a href=\"/i2psnark/?action=Start_" + b64 + "&amp;nonce=" + _nonce + "\"><img title=\"");
    919934                else
    920                     out.write("<input type=\"image\" name=\"action\" value=\"Start_" + b64 + "\" title=\"");
     935                    out.write("<input type=\"image\" name=\"action_Start_" + b64 + "\" value=\"foo\" title=\"");
    921936                out.write(_("Start the torrent"));
    922937                out.write("\" src=\"" + _imgPath + "start.png\" alt=\"");
     
    930945                out.write("<a href=\"/i2psnark/?action=Remove_" + b64 + "&amp;nonce=" + _nonce + "\"><img title=\"");
    931946            else
    932                 out.write("<input type=\"image\" name=\"action\" value=\"Remove_" + b64 + "\" title=\"");
     947                out.write("<input type=\"image\" name=\"action_Remove_" + b64 + "\" value=\"foo\" title=\"");
    933948            out.write(_("Remove the torrent from the active list, deleting the .torrent file"));
    934949            out.write("\" onclick=\"if (!confirm('");
     
    947962                out.write("<a href=\"/i2psnark/?action=Delete_" + b64 + "&amp;nonce=" + _nonce + "\"><img title=\"");
    948963            else
    949                 out.write("<input type=\"image\" name=\"action\" value=\"Delete_" + b64 + "\" title=\"");
     964                out.write("<input type=\"image\" name=\"action_Delete_" + b64 + "\" value=\"foo\" title=\"");
    950965            out.write(_("Delete the .torrent file and the associated data file(s)"));
    951966            out.write("\" onclick=\"if (!confirm('");
     
    13851400        StringBuilder buf = new StringBuilder(256);
    13861401        // browsers seem to work without doing this but let's be strict
    1387         String link = s.replace("&", "&amp;");
     1402        String link = s.replace("&", "&amp;").replace(" ", "%20");
    13881403        buf.append("<a href=\"").append(link).append("\">").append(link).append("</a>");
    13891404        return buf.toString();
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java

    r4025a57 r751134f5  
    260260    /*
    261261     *  Streamr client is a UDP server, use the listenPort field for targetPort
    262      *  and the listenOnInterface field for the targetHost
    263262     */
    264263    private void startStreamrClient() {
    265         String targetHost = getListenOnInterface();
     264        String targetHost = getTargetHost();
    266265        String targetPort = getListenPort();
    267266        String dest = getTargetDestination();
     
    271270    /**
    272271     *  Streamr server is a UDP client, use the targetPort field for listenPort
    273      *  and the targetHost field for the listenOnInterface
    274272     */
    275273    private void startStreamrServer() {
    276         String listenOn = getTargetHost();
     274        String listenOn = getListenOnInterface();
    277275        if ( (listenOn != null) && (listenOn.length() > 0) ) {
    278276            _tunnel.runListenOn(new String[] { listenOn }, this);
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java

    r4025a57 r751134f5  
    1313import java.util.Properties;
    1414import java.util.StringTokenizer;
     15import java.util.Set;
    1516
    1617import net.i2p.data.Base64;
     
    2324import net.i2p.i2ptunnel.TunnelController;
    2425import net.i2p.i2ptunnel.TunnelControllerGroup;
     26import net.i2p.util.Addresses;
    2527
    2628/**
     
    313315    public boolean isRouterContext() {
    314316        return _context.isRouterContext();
     317    }
     318
     319    /** @since 0.8.3 */
     320    public Set<String> interfaceSet() {
     321        return Addresses.getAllAddresses();
    315322    }
    316323
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java

    r4025a57 r751134f5  
    6464    private String _port;
    6565    private String _reachableBy;
    66     private String _reachableByOther;
    6766    private String _targetDestination;
    6867    private String _targetHost;
     
    433432    public String getClientInterface(int tunnel) {
    434433        TunnelController tun = getController(tunnel);
    435         if (tun != null)
    436             return tun.getListenOnInterface();
    437         else
    438             return "";
     434        if (tun != null) {
     435            if ("streamrclient".equals(tun.getType()))
     436                return tun.getTargetHost();
     437            else
     438                return tun.getListenOnInterface();
     439        } else
     440            return "127.0.0.1";
    439441    }
    440442   
     
    479481    }
    480482   
     483    /**
     484     * Call this to see if it is ok to linkify getServerTarget()
     485     * @since 0.8.3
     486     */
     487    public boolean isServerTargetLinkValid(int tunnel) {
     488        TunnelController tun = getController(tunnel);
     489        return tun != null &&
     490               "httpserver".equals(tun.getType()) &&
     491               tun.getTargetHost() != null &&
     492               tun.getTargetPort() != null;
     493    }
     494
     495    /**
     496     * @return valid host:port only if isServerTargetLinkValid() is true
     497     */
    481498    public String getServerTarget(int tunnel) {
    482499        TunnelController tun = getController(tunnel);
    483         if (tun != null)
    484             return tun.getTargetHost() + ':' + tun.getTargetPort();
    485         else
     500        if (tun != null) {
     501            String host;
     502            if ("streamrserver".equals(tun.getType()))
     503                host = tun.getListenOnInterface();
     504            else
     505                host = tun.getTargetHost();
     506            String port = tun.getTargetPort();
     507            if (host == null)
     508                host = "<font color=\"red\">" + _("Host not set") + "</font>";
     509            else if (host.indexOf(':') >= 0)
     510                host = '[' + host + ']';
     511            if (port == null)
     512                port = "<font color=\"red\">" + _("Port not set") + "</font>";
     513            return host + ':' + port;
     514       }  else
    486515            return "";
    487516    }
     
    576605    }
    577606    /**
    578      * what interface should this client/httpclient/ircclient listen on (unless
    579      * overridden by the setReachableByOther() field)
     607     * what interface should this client/httpclient/ircclient listen on
    580608     */
    581609    public void setReachableBy(String reachableBy) {
    582610        _reachableBy = (reachableBy != null ? reachableBy.trim() : null);
    583     }
    584     /**
    585      * If specified, defines the exact IP interface to listen for requests
    586      * on (in the case of client/httpclient/ircclient tunnels)
    587      */
    588     public void setReachableByOther(String reachableByOther) {
    589         _reachableByOther = (reachableByOther != null ? reachableByOther.trim() : null);
    590611    }
    591612    /** What peer does this client tunnel point at */
     
    892913        updateConfigGeneric(config);
    893914       
     915        if ((isClient(_type) && !"streamrclient".equals(_type)) || "streamrserver".equals(_type)) {
     916            // streamrserver uses interface
     917            if (_reachableBy != null)
     918                config.setProperty("interface", _reachableBy);
     919            else
     920                config.setProperty("interface", "");
     921        } else {
     922            // streamrclient uses targetHost
     923            if (_targetHost != null)
     924                config.setProperty("targetHost", _targetHost);
     925        }
     926
    894927        if (isClient(_type)) {
    895928            // generic client stuff
    896929            if (_port != null)
    897930                config.setProperty("listenPort", _port);
    898             if (_reachableByOther != null)
    899                 config.setProperty("interface", _reachableByOther);
    900             else if (_reachableBy != null)
    901                 config.setProperty("interface", _reachableBy);
    902             else
    903                 config.setProperty("interface", "");
    904 
    905931            config.setProperty("sharedClient", _sharedClient + "");
    906932            for (String p : _booleanClientOpts)
     
    911937        } else {
    912938            // generic server stuff
    913             if (_targetHost != null)
    914                 config.setProperty("targetHost", _targetHost);
    915939            if (_targetPort != null)
    916940                config.setProperty("targetPort", _targetPort);
     
    941965            if (_port != null)
    942966                config.setProperty("listenPort", _port);
    943             if (_reachableByOther != null)
    944                 config.setProperty("interface", _reachableByOther);
    945             else if (_reachableBy != null)
     967            if (_reachableBy != null)
    946968                config.setProperty("interface", _reachableBy);
    947969            else if (_targetHost != null)
  • apps/i2ptunnel/jsp/editClient.jsp

    r4025a57 r751134f5  
    8181         <% } else { %>
    8282                <label><%=intl._("Access Point")%>:</label>
    83          <% } %>
     83         <% } /* streamrclient */ %>
    8484            </div>
    8585            <div id="portField" class="rowItem">
     
    9696                <input type="text" size="6" maxlength="5" id="port" name="port" title="Access Port Number" value="<%=editBean.getClientPort(curTunnel)%>" class="freetext" />               
    9797            </div>
    98          <% String otherInterface = "";
    99             String clientInterface = editBean.getClientInterface(curTunnel);
    100             if ("streamrclient".equals(tunnelType)) {   
    101                 otherInterface = clientInterface;
    102             } else { %>
    10398            <div id="reachField" class="rowItem">
    10499                <label for="reachableBy" accesskey="r">
    105                     <%=intl._("Reachable by")%>(<span class="accessKey">R</span>):
    106                 </label>
    107                 <select id="reachableBy" name="reachableBy" title="Valid IP for Client Access" class="selectbox">
    108                   <%   if (!("127.0.0.1".equals(clientInterface)) &&
    109                            !("0.0.0.0".equals(clientInterface)) &&
    110                             (clientInterface != null) &&
    111                             (clientInterface.trim().length() > 0)) {
    112                             otherInterface = clientInterface;
    113                        }
    114                   %><option value="127.0.0.1"<%=("127.0.0.1".equals(clientInterface) ? " selected=\"selected\"" : "")%>><%=intl._("Locally (127.0.0.1)")%></option>
    115                     <option value="0.0.0.0"<%=("0.0.0.0".equals(clientInterface) ? " selected=\"selected\"" : "")%>><%=intl._("Everyone (0.0.0.0)")%></option>
    116                     <option value="other"<%=(!("".equals(otherInterface))    ? " selected=\"selected\"" : "")%>><%=intl._("LAN Hosts (Please specify your LAN address)")%></option>
    117                 </select>               
    118             </div>
    119          <% } // streamrclient %>
    120             <div id="otherField" class="rowItem">
    121                 <label for="reachableByOther" accesskey="O">
    122          <% if ("streamrclient".equals(tunnelType)) { %>
    123                     Host:
    124                     <% String vvv = otherInterface;
    125                        if (vvv == null || "".equals(vvv.trim())) {
     100         <%
     101            if ("streamrclient".equals(tunnelType)) {
     102                       out.write("Host:");
     103                       String targetHost = editBean.getTargetHost(curTunnel);
     104                       if (targetHost == null || "".equals(targetHost.trim())) {
    126105                           out.write(" <font color=\"red\">(");
    127106                           out.write(intl._("required"));
    128107                           out.write(")</font>");
    129108                       }   
    130                      %>
     109          %>
     110                </label>
     111                <input type="text" size="20" id="targetHost" name="targetHost" title="Target Hostname or IP" value="<%=targetHost%>" class="freetext" />               
    131112         <% } else { %>
    132                     <%=intl._("Other")%>(<span class="accessKey">O</span>):
    133          <% } %>
    134                 </label>
    135                 <input type="text" size="20" id="reachableByOther" name="reachableByOther" title="Alternative IP for Client Access" value="<%=otherInterface%>" class="freetext" />               
    136             </div>
    137                                            
     113                    <%=intl._("Reachable by")%>(<span class="accessKey">R</span>):
     114                </label>
     115                <select id="reachableBy" name="reachableBy" title="IP for Client Access" class="selectbox">
     116              <%
     117                    String clientInterface = editBean.getClientInterface(curTunnel);
     118                    for (String ifc : editBean.interfaceSet()) {
     119                        out.write("<option value=\"");
     120                        out.write(ifc);
     121                        out.write('\"');
     122                        if (ifc.equals(clientInterface))
     123                            out.write(" selected=\"selected\"");
     124                        out.write('>');
     125                        out.write(ifc);
     126                        out.write("</option>\n");
     127                    }
     128              %>
     129                </select>               
     130         <% } /* streamrclient */ %>
     131            </div>
     132
    138133            <div class="subdivider">
    139134                <hr />
  • apps/i2ptunnel/jsp/editServer.jsp

    r4025a57 r751134f5  
    9090         <% } %>
    9191            </div>
     92         <% if (!"streamrserver".equals(tunnelType)) { %>
    9293            <div id="hostField" class="rowItem">
    9394                <label for="targetHost" accesskey="H">
    94          <% if ("streamrserver".equals(tunnelType)) { %>
    95                     <%=intl._("Reachable by")%>(<span class="accessKey">R</span>):
    96          <% } else { %>
    9795                    <%=intl._("Host")%>(<span class="accessKey">H</span>):
    98          <% } %>
    9996                </label>
    10097                <input type="text" size="20" id="targetHost" name="targetHost" title="Target Hostname or IP" value="<%=editBean.getTargetHost(curTunnel)%>" class="freetext" />               
    10198            </div>
     99         <% } /* !streamrserver */ %>
    102100            <div id="portField" class="rowItem">
    103101                <label for="targetPort" accesskey="P">
     
    114112            </div>
    115113           
    116             <% if ("httpbidirserver".equals(tunnelType)) {
    117             %>
     114         <% if ("httpbidirserver".equals(tunnelType)) { %>
    118115            <div class="subdivider">
    119116                <hr />
     
    135132                 <input type="text" size="6" maxlength="5" id="port" name="port" title="Access Port Number" value="<%=editBean.getClientPort(curTunnel)%>" class="freetext" />
    136133            </div>
    137             <% String otherInterface = "";
    138             String clientInterface = editBean.getClientInterface(curTunnel);
    139             %>
     134         <% } /* httpbidirserver */ %>
     135         <% if ("httpbidirserver".equals(tunnelType) || "streamrserver".equals(tunnelType)) { %>
    140136            <div id="reachField" class="rowItem">
    141137                <label for="reachableBy" accesskey="r">
    142138                    <%=intl._("Reachable by")%>(<span class="accessKey">R</span>):
    143139                </label>
    144                 <select id="reachableBy" name="reachableBy" title="Valid IP for Client Access" class="selectbox">
    145                   <%   if (!("127.0.0.1".equals(clientInterface)) &&
    146                            !("0.0.0.0".equals(clientInterface)) &&
    147                             (clientInterface != null) &&
    148                             (clientInterface.trim().length() > 0)) {
    149                             otherInterface = clientInterface;
    150                        }
    151                   %><option value="127.0.0.1"<%=("127.0.0.1".equals(clientInterface) ? " selected=\"selected\"" : "")%>><%=intl._("Locally (127.0.0.1)")%></option>
    152                     <option value="0.0.0.0"<%=("0.0.0.0".equals(clientInterface) ? " selected=\"selected\"" : "")%>><%=intl._("Everyone (0.0.0.0)")%></option>
    153                     <option value="other"<%=(!("".equals(otherInterface))    ? " selected=\"selected\"" : "")%>><%=intl._("LAN Hosts (Please specify your LAN address)")%></option>
     140                <select id="reachableBy" name="reachableBy" title="IP for Client Access" class="selectbox">
     141              <%
     142                    String clientInterface = editBean.getClientInterface(curTunnel);
     143                    for (String ifc : editBean.interfaceSet()) {
     144                        out.write("<option value=\"");
     145                        out.write(ifc);
     146                        out.write('\"');
     147                        if (ifc.equals(clientInterface))
     148                            out.write(" selected=\"selected\"");
     149                        out.write('>');
     150                        out.write(ifc);
     151                        out.write("</option>\n");
     152                    }
     153              %>
    154154                </select>               
    155             </div>
    156             <div id="otherField" class="rowItem">
    157                 <label for="reachableByOther" accesskey="O">
    158                     <%=intl._("Other")%>(<span class="accessKey">O</span>):
    159                 </label>
    160                 <input type="text" size="20" id="reachableByOther" name="reachableByOther" title="Alternative IP for Client Access" value="<%=otherInterface%>" class="freetext" />               
    161             </div>
    162             <% } %>
     155            </div>
     156         <% } /* httpbidirserver || streamrserver */ %>
     157
    163158            <div class="subdivider">
    164159                <hr />
     
    303298                <hr />
    304299            </div>
    305          <% } // !streamrserver %>
     300         <% } /* !streamrserver */ %>
    306301
    307302            <div id="optionsField" class="rowItem">
  • apps/i2ptunnel/jsp/index.jsp

    r4025a57 r751134f5  
    9696            <span class="text">
    9797        <%
    98             if ("httpserver".equals(indexBean.getInternalType(curServer))) {
     98            if (indexBean.isServerTargetLinkValid(curServer)) {
    9999          %>
    100100            <a href="http://<%=indexBean.getServerTarget(curServer)%>/" title="Test HTTP server, bypassing I2P"><%=indexBean.getServerTarget(curServer)%></a>
     
    214214        <div class="portField rowItem">
    215215            <label><%=intl._("Port")%>:</label>
    216             <span class="text"><%=indexBean.getClientPort(curClient)%></span>
     216            <span class="text">
     217         <%
     218               String cPort= indexBean.getClientPort(curClient);
     219               if ("".equals(cPort)) {
     220                   out.write("<font color=\"red\">");
     221                   out.write(intl._("Port not set"));
     222                   out.write("</font>");
     223               } else {
     224                   out.write(cPort);
     225               }
     226          %>
     227            </span>
    217228        </div>
    218229        <div class="typeField rowItem">
     
    222233        <div class="interfaceField rowItem">
    223234            <label><%=intl._("Interface")%>:</label>
    224             <span class="text"><%=indexBean.getClientInterface(curClient)%></span>
     235            <span class="text">
     236         <%
     237               /* should only happen for streamr client */
     238               String cHost= indexBean.getClientInterface(curClient);
     239               if ("".equals(cHost)) {
     240                   out.write("<font color=\"red\">");
     241                   out.write(intl._("Hort not set"));
     242                   out.write("</font>");
     243               } else {
     244                   out.write(cHost);
     245               }
     246          %>
     247            </span>
    225248        </div>
    226249        <div class="statusField rowItem">
  • core/java/src/net/i2p/crypto/ElGamalAESEngine.java

    r4025a57 r751134f5  
    328328            if ((len < 0) || (len > decrypted.length - cur - Hash.HASH_LENGTH - 1))
    329329                throw new Exception("Invalid size of payload (" + len + ", remaining " + (decrypted.length-cur) +")");
    330             byte hashval[] = new byte[Hash.HASH_LENGTH];
    331             System.arraycopy(decrypted, cur, hashval, 0, Hash.HASH_LENGTH);
     330            //byte hashval[] = new byte[Hash.HASH_LENGTH];
     331            //System.arraycopy(decrypted, cur, hashval, 0, Hash.HASH_LENGTH);
     332            //readHash = new Hash();
     333            //readHash.setData(hashval);
     334            readHash = Hash.create(decrypted, cur);
    332335            cur += Hash.HASH_LENGTH;
    333             readHash = new Hash();
    334             readHash.setData(hashval);
    335336            byte flag = decrypted[cur++];
    336337            if (flag == 0x01) {
  • core/java/src/net/i2p/crypto/ElGamalEngine.java

    r4025a57 r751134f5  
    203203
    204204        //ByteArrayInputStream bais = new ByteArrayInputStream(val, i, val.length - i);
    205         byte hashData[] = new byte[Hash.HASH_LENGTH];
    206         System.arraycopy(val, i + 1, hashData, 0, Hash.HASH_LENGTH);
    207         Hash hash = new Hash(hashData);
     205        //byte hashData[] = new byte[Hash.HASH_LENGTH];
     206        //System.arraycopy(val, i + 1, hashData, 0, Hash.HASH_LENGTH);
     207        //Hash hash = new Hash(hashData);
     208        Hash hash = Hash.create(val, i + 1);
    208209        byte rv[] = new byte[payloadLen];
    209210        System.arraycopy(val, i + 1 + Hash.HASH_LENGTH, rv, 0, rv.length);
  • core/java/src/net/i2p/crypto/SHA256Generator.java

    r4025a57 r751134f5  
    3636        byte rv[] = digest.digest();
    3737        releaseGnu(digest);
    38         return new Hash(rv);
     38        //return new Hash(rv);
     39        return Hash.create(rv);
    3940    }
    4041   
  • core/java/src/net/i2p/data/Hash.java

    r4025a57 r751134f5  
    2626    public final static int HASH_LENGTH = 32;
    2727    public final static Hash FAKE_HASH = new Hash(new byte[HASH_LENGTH]);
     28    private static final int CACHE_SIZE = 2048;
    2829   
     30    private static final SDSCache<Hash> _cache = new SDSCache(Hash.class, HASH_LENGTH, CACHE_SIZE);
     31
     32    /**
     33     * Pull from cache or return new
     34     * @since 0.8.3
     35     */
     36    public static Hash create(byte[] data) {
     37        return _cache.get(data);
     38    }
     39
     40    /**
     41     * Pull from cache or return new
     42     * @since 0.8.3
     43     */
     44    public static Hash create(byte[] data, int off) {
     45        return _cache.get(data, off);
     46    }
     47
     48    /**
     49     * Pull from cache or return new
     50     * @since 0.8.3
     51     */
     52    public static Hash create(InputStream in) throws IOException {
     53        return _cache.get(in);
     54    }
     55
    2956    public Hash() {
    3057        super();
  • core/java/src/net/i2p/data/KeysAndCert.java

    r4025a57 r751134f5  
    6262   
    6363    public void readBytes(InputStream in) throws DataFormatException, IOException {
    64         _publicKey = new PublicKey();
    65         _publicKey.readBytes(in);
    66         _signingKey = new SigningPublicKey();
    67         _signingKey.readBytes(in);
     64        //_publicKey = new PublicKey();
     65        //_publicKey.readBytes(in);
     66        _publicKey = PublicKey.create(in);
     67        //_signingKey = new SigningPublicKey();
     68        //_signingKey.readBytes(in);
     69        _signingKey = SigningPublicKey.create(in);
    6870        //_certificate = new Certificate();
    6971        //_certificate.readBytes(in);
  • core/java/src/net/i2p/data/Lease.java

    r4025a57 r751134f5  
    111111   
    112112    public void readBytes(InputStream in) throws DataFormatException, IOException {
    113         _gateway = new Hash();
    114         _gateway.readBytes(in);
     113        //_gateway = new Hash();
     114        //_gateway.readBytes(in);
     115        _gateway = Hash.create(in);
    115116        _tunnelId = new TunnelId();
    116117        _tunnelId.readBytes(in);
  • core/java/src/net/i2p/data/PublicKey.java

    r4025a57 r751134f5  
    1010 */
    1111
     12import java.io.InputStream;
     13import java.io.IOException;
     14
    1215/**
    1316 * Defines the PublicKey as defined by the I2P data structure spec.
     
    1922public class PublicKey extends SimpleDataStructure {
    2023    public final static int KEYSIZE_BYTES = 256;
     24    private static final int CACHE_SIZE = 256;
     25
     26    private static final SDSCache<PublicKey> _cache = new SDSCache(PublicKey.class, KEYSIZE_BYTES, CACHE_SIZE);
     27
     28    /**
     29     * Pull from cache or return new
     30     * @since 0.8.3
     31     */
     32    public static PublicKey create(InputStream in) throws IOException {
     33        return _cache.get(in);
     34    }
    2135
    2236    public PublicKey() {
  • core/java/src/net/i2p/data/SigningPublicKey.java

    r4025a57 r751134f5  
    1010 */
    1111
     12import java.io.InputStream;
     13import java.io.IOException;
     14
    1215/**
    1316 * Defines the SigningPublicKey as defined by the I2P data structure spec.
     
    2023public class SigningPublicKey extends SimpleDataStructure {
    2124    public final static int KEYSIZE_BYTES = 128;
     25    private static final int CACHE_SIZE = 256;
     26
     27    private static final SDSCache<SigningPublicKey> _cache = new SDSCache(SigningPublicKey.class, KEYSIZE_BYTES, CACHE_SIZE);
     28
     29    /**
     30     * Pull from cache or return new
     31     * @since 0.8.3
     32     */
     33    public static SigningPublicKey create(InputStream in) throws IOException {
     34        return _cache.get(in);
     35    }
    2236
    2337    public SigningPublicKey() {
  • core/java/src/net/i2p/data/i2cp/DestLookupMessage.java

    r4025a57 r751134f5  
    3434
    3535    protected void doReadMessage(InputStream in, int size) throws I2CPMessageException, IOException {
    36         Hash h = new Hash();
     36        //Hash h = new Hash();
    3737        try {
    38             h.readBytes(in);
    39         } catch (DataFormatException dfe) {
     38            //h.readBytes(in);
     39            _hash = Hash.create(in);
     40        //} catch (DataFormatException dfe) {
     41        } catch (IllegalArgumentException dfe) {
    4042            throw new I2CPMessageException("Unable to load the hash", dfe);
    4143        }
    42         _hash = h;
     44        //_hash = h;
    4345    }
    4446
  • core/java/src/net/i2p/data/i2cp/RequestLeaseSetMessage.java

    r4025a57 r751134f5  
    8787            _endpoints.clear();
    8888            for (int i = 0; i < numTunnels; i++) {
    89                 Hash router = new Hash();
    90                 router.readBytes(in);
     89                //Hash router = new Hash();
     90                //router.readBytes(in);
     91                Hash router = Hash.create(in);
    9192                TunnelId tunnel = new TunnelId();
    9293                tunnel.readBytes(in);
  • core/java/src/net/i2p/util/ByteCache.java

    r4025a57 r751134f5  
    22
    33import java.util.Arrays;
    4 import java.util.HashMap;
    54import java.util.Map;
    65import java.util.Queue;
     6import java.util.concurrent.ConcurrentHashMap;
    77import java.util.concurrent.LinkedBlockingQueue;
    88
     
    5858public final class ByteCache {
    5959
    60     private static final Map<Integer, ByteCache> _caches = new HashMap(16);
     60    private static final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(ByteCache.class);
     61    private static final Map<Integer, ByteCache> _caches = new ConcurrentHashMap(16);
    6162
    6263    /**
     
    7576     * Get a cache responsible for objects of the given size
    7677     *
    77      * @param cacheSize how large we want the cache to grow before using on
    78      *                  demand allocation
     78     * @param cacheSize how large we want the cache to grow
     79     *                  (number of objects, NOT memory size)
     80     *                  before discarding released objects.
    7981     *                  Since 0.7.14, a limit of 1MB / size is enforced
    8082     *                  for the typical 128MB max memory JVM
     
    8587            cacheSize = MAX_CACHE / size;
    8688        Integer sz = Integer.valueOf(size);
    87         ByteCache cache = null;
    88         synchronized (_caches) {
    89             if (!_caches.containsKey(sz))
    90                 _caches.put(sz, new ByteCache(cacheSize, size));
    91             cache = _caches.get(sz);
    92         }
     89        ByteCache cache = _caches.get(sz);
     90        if (cache == null) {
     91            cache = new ByteCache(cacheSize, size);
     92            _caches.put(sz, cache);
     93;       }
    9394        cache.resize(cacheSize);
    9495        //I2PAppContext.getGlobalContext().logManager().getLog(ByteCache.class).error("ByteCache size: " + size + " max: " + cacheSize, new Exception("from"));
     
    103104        for (ByteCache bc : _caches.values())
    104105            bc.clear();
    105         I2PAppContext.getGlobalContext().logManager().getLog(ByteCache.class).warn("WARNING: Low memory, clearing byte caches");
    106     }
    107 
    108     private Log _log;
     106        _log.warn("WARNING: Low memory, clearing byte caches");
     107    }
     108
    109109    /** list of available and available entries */
    110110    private Queue<ByteArray> _available;
     
    117117   
    118118    /** how often do we cleanup the cache */
    119     private static final int CLEANUP_FREQUENCY = 30*1000;
     119    private static final int CLEANUP_FREQUENCY = 33*1000;
    120120    /** if we haven't exceeded the cache size in 2 minutes, cut our cache in half */
    121121    private static final long EXPIRE_PERIOD = 2*60*1000;
     
    127127        _entrySize = entrySize;
    128128        _lastOverflow = -1;
    129         SimpleScheduler.getInstance().addPeriodicEvent(new Cleanup(), CLEANUP_FREQUENCY);
    130         _log = I2PAppContext.getGlobalContext().logManager().getLog(ByteCache.class);
    131         I2PAppContext.getGlobalContext().statManager().createRateStat("byteCache.memory." + entrySize, "Memory usage (B)", "Router", new long[] { 60*1000 });
     129        SimpleScheduler.getInstance().addPeriodicEvent(new Cleanup(), CLEANUP_FREQUENCY + (entrySize % 7));   //stagger
     130        I2PAppContext.getGlobalContext().statManager().createRateStat("byteCache.memory." + entrySize, "Memory usage (B)", "Router", new long[] { 10*60*1000 });
    132131    }
    133132   
  • history.txt

    r4025a57 r751134f5  
     12010-12-30 zzz
     2    * Data Structures:
     3      - New SDSCache for SimpleDataStructures
     4      - New SimpleByteCache for byte[]
     5      - Cache Hash, PublicKey, and SigningPublicKey
     6      - Remove global lock in ByteCache
     7    * I2CP: Missing piece of parallel naming lookup
     8    * i2psnark: Fix buttons on Firefox 4.0b
     9    * i2ptunnel:
     10      - Use dropdown box to select interface for clients
     11      - Warn on index page if required fields not set
     12
    1132010-12-29 zzz
    214    * Console: Add 500 error page
     
    4355        (can only be smaller than the router timeout for now)
    4456      - Extend dest lookup router timeout from 10s to 15s
    45     * i2psnark: Backport TrackerClient NPE fix
     57    * i2psnark:
     58      - Backport TrackerClient NPE fix
     59      - Fix last piece length calculation for torrents > 2GB (ticket #361)
    4660    * i2ptunnel:
    4761      - Get Log from the logManager instead of instantiating,
  • router/java/src/net/i2p/data/i2np/BuildRequestRecord.java

    r4025a57 r751134f5  
    9494     */
    9595    public Hash readNextIdentity() {
    96         byte rv[] = new byte[Hash.HASH_LENGTH];
    97         System.arraycopy(_data.getData(), _data.getOffset() + OFF_SEND_IDENT, rv, 0, Hash.HASH_LENGTH);
    98         return new Hash(rv);
     96        //byte rv[] = new byte[Hash.HASH_LENGTH];
     97        //System.arraycopy(_data.getData(), _data.getOffset() + OFF_SEND_IDENT, rv, 0, Hash.HASH_LENGTH);
     98        //return new Hash(rv);
     99        return Hash.create(_data.getData(), _data.getOffset() + OFF_SEND_IDENT);
    99100    }
    100101    /**
  • router/java/src/net/i2p/data/i2np/DatabaseLookupMessage.java

    r4025a57 r751134f5  
    134134        int curIndex = offset;
    135135       
    136         byte keyData[] = new byte[Hash.HASH_LENGTH];
    137         System.arraycopy(data, curIndex, keyData, 0, Hash.HASH_LENGTH);
    138         curIndex += Hash.HASH_LENGTH;
    139         _key = new Hash(keyData);
    140        
    141         byte fromData[] = new byte[Hash.HASH_LENGTH];
    142         System.arraycopy(data, curIndex, fromData, 0, Hash.HASH_LENGTH);
    143         curIndex += Hash.HASH_LENGTH;
    144         _fromHash = new Hash(fromData);
     136        //byte keyData[] = new byte[Hash.HASH_LENGTH];
     137        //System.arraycopy(data, curIndex, keyData, 0, Hash.HASH_LENGTH);
     138        _key = Hash.create(data, curIndex);
     139        curIndex += Hash.HASH_LENGTH;
     140        //_key = new Hash(keyData);
     141       
     142        //byte fromData[] = new byte[Hash.HASH_LENGTH];
     143        //System.arraycopy(data, curIndex, fromData, 0, Hash.HASH_LENGTH);
     144        _fromHash = Hash.create(data, curIndex);
     145        curIndex += Hash.HASH_LENGTH;
     146        //_fromHash = new Hash(fromData);
    145147       
    146148        boolean tunnelSpecified = false;
     
    169171        Set<Hash> peers = new HashSet(numPeers);
    170172        for (int i = 0; i < numPeers; i++) {
    171             byte peer[] = new byte[Hash.HASH_LENGTH];
    172             System.arraycopy(data, curIndex, peer, 0, Hash.HASH_LENGTH);
     173            //byte peer[] = new byte[Hash.HASH_LENGTH];
     174            //System.arraycopy(data, curIndex, peer, 0, Hash.HASH_LENGTH);
     175            Hash p = Hash.create(data, curIndex);
    173176            curIndex += Hash.HASH_LENGTH;
    174             peers.add(new Hash(peer));
     177            peers.add(p);
    175178        }
    176179        _dontIncludePeers = peers;
  • router/java/src/net/i2p/data/i2np/DatabaseSearchReplyMessage.java

    r4025a57 r751134f5  
    5656        int curIndex = offset;
    5757       
    58         byte keyData[] = new byte[Hash.HASH_LENGTH];
    59         System.arraycopy(data, curIndex, keyData, 0, Hash.HASH_LENGTH);
     58        //byte keyData[] = new byte[Hash.HASH_LENGTH];
     59        //System.arraycopy(data, curIndex, keyData, 0, Hash.HASH_LENGTH);
     60        _key = Hash.create(data, curIndex);
    6061        curIndex += Hash.HASH_LENGTH;
    61         _key = new Hash(keyData);
     62        //_key = new Hash(keyData);
    6263       
    6364        int num = (int)DataHelper.fromLong(data, curIndex, 1);
     
    6667        _peerHashes.clear();
    6768        for (int i = 0; i < num; i++) {
    68             byte peer[] = new byte[Hash.HASH_LENGTH];
    69             System.arraycopy(data, curIndex, peer, 0, Hash.HASH_LENGTH);
     69            //byte peer[] = new byte[Hash.HASH_LENGTH];
     70            //System.arraycopy(data, curIndex, peer, 0, Hash.HASH_LENGTH);
     71            Hash p = Hash.create(data, curIndex);
    7072            curIndex += Hash.HASH_LENGTH;
    71             addReply(new Hash(peer));
     73            addReply(p);
    7274        }
    7375           
    74         byte from[] = new byte[Hash.HASH_LENGTH];
    75         System.arraycopy(data, curIndex, from, 0, Hash.HASH_LENGTH);
     76        //byte from[] = new byte[Hash.HASH_LENGTH];
     77        //System.arraycopy(data, curIndex, from, 0, Hash.HASH_LENGTH);
     78        _from = Hash.create(data, curIndex);
    7679        curIndex += Hash.HASH_LENGTH;
    77         _from = new Hash(from);
     80        //_from = new Hash(from);
    7881
    7982        //_context.statManager().addRateData("netDb.searchReplyMessageReceive", num*32 + 64, 1);
  • router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java

    r4025a57 r751134f5  
    114114        int curIndex = offset;
    115115       
    116         byte keyData[] = new byte[Hash.HASH_LENGTH];
    117         System.arraycopy(data, curIndex, keyData, 0, Hash.HASH_LENGTH);
     116        //byte keyData[] = new byte[Hash.HASH_LENGTH];
     117        //System.arraycopy(data, curIndex, keyData, 0, Hash.HASH_LENGTH);
     118        _key = Hash.create(data, curIndex);
    118119        curIndex += Hash.HASH_LENGTH;
    119         _key = new Hash(keyData);
     120        //_key = new Hash(keyData);
    120121       
    121122        _type = (int)DataHelper.fromLong(data, curIndex, 1);
     
    131132            curIndex += 4;
    132133           
    133             byte gw[] = new byte[Hash.HASH_LENGTH];
    134             System.arraycopy(data, curIndex, gw, 0, Hash.HASH_LENGTH);
     134            //byte gw[] = new byte[Hash.HASH_LENGTH];
     135            //System.arraycopy(data, curIndex, gw, 0, Hash.HASH_LENGTH);
     136            _replyGateway = Hash.create(data, curIndex);
    135137            curIndex += Hash.HASH_LENGTH;
    136             _replyGateway = new Hash(gw);
     138            //_replyGateway = new Hash(gw);
    137139        } else {
    138140            _replyTunnel = null;
  • router/java/src/net/i2p/data/i2np/DeliveryInstructions.java

    r4025a57 r751134f5  
    9191                break;
    9292            case FLAG_MODE_DESTINATION:
    93                 Hash destHash = new Hash();
    94                 destHash.readBytes(in);
     93                //Hash destHash = new Hash();
     94                //destHash.readBytes(in);
     95                Hash destHash = Hash.create(in);
    9596                setDestination(destHash);
    9697                break;
    9798            case FLAG_MODE_ROUTER:
    98                 Hash routerHash = new Hash();
    99                 routerHash.readBytes(in);
     99                //Hash routerHash = new Hash();
     100                //routerHash.readBytes(in);
     101                Hash routerHash = Hash.create(in);
    100102                setRouter(routerHash);
    101103                break;
    102104            case FLAG_MODE_TUNNEL:
    103                 Hash tunnelRouterHash = new Hash();
    104                 tunnelRouterHash.readBytes(in);
     105                //Hash tunnelRouterHash = new Hash();
     106                //tunnelRouterHash.readBytes(in);
     107                Hash tunnelRouterHash = Hash.create(in);
    105108                setRouter(tunnelRouterHash);
    106109                TunnelId id = new TunnelId();
     
    141144                break;
    142145            case FLAG_MODE_DESTINATION:
    143                 byte destHash[] = new byte[Hash.HASH_LENGTH];
    144                 System.arraycopy(data, cur, destHash, 0, Hash.HASH_LENGTH);
     146                //byte destHash[] = new byte[Hash.HASH_LENGTH];
     147                //System.arraycopy(data, cur, destHash, 0, Hash.HASH_LENGTH);
     148                Hash dh = Hash.create(data, cur);
    145149                cur += Hash.HASH_LENGTH;
    146                 setDestination(new Hash(destHash));
     150                setDestination(dh);
    147151                break;
    148152            case FLAG_MODE_ROUTER:
    149                 byte routerHash[] = new byte[Hash.HASH_LENGTH];
    150                 System.arraycopy(data, cur, routerHash, 0, Hash.HASH_LENGTH);
     153                //byte routerHash[] = new byte[Hash.HASH_LENGTH];
     154                //System.arraycopy(data, cur, routerHash, 0, Hash.HASH_LENGTH);
     155                Hash rh = Hash.create(data, cur);
    151156                cur += Hash.HASH_LENGTH;
    152                 setRouter(new Hash(routerHash));
     157                setRouter(rh);
    153158                break;
    154159            case FLAG_MODE_TUNNEL:
    155                 byte tunnelRouterHash[] = new byte[Hash.HASH_LENGTH];
    156                 System.arraycopy(data, cur, tunnelRouterHash, 0, Hash.HASH_LENGTH);
     160                //byte tunnelRouterHash[] = new byte[Hash.HASH_LENGTH];
     161                //System.arraycopy(data, cur, tunnelRouterHash, 0, Hash.HASH_LENGTH);
     162                Hash trh = Hash.create(data, cur);
    157163                cur += Hash.HASH_LENGTH;
    158                 setRouter(new Hash(tunnelRouterHash));
     164                setRouter(trh);
    159165                setTunnelId(new TunnelId(DataHelper.fromLong(data, cur, 4)));
    160166                cur += 4;
  • router/java/src/net/i2p/router/RouterVersion.java

    r4025a57 r751134f5  
    1919    public final static String ID = "Monotone";
    2020    public final static String VERSION = CoreVersion.VERSION;
    21     public final static long BUILD = 4;
     21    public final static long BUILD = 5;
    2222
    2323    /** for example "-test" */
  • router/java/src/net/i2p/router/client/LookupDestJob.java

    r4025a57 r751134f5  
    2929    public void runJob() {
    3030        DoneJob done = new DoneJob(getContext());
    31         getContext().netDb().lookupLeaseSet(_hash, done, done, 10*1000);
     31        // TODO add support for specifying the timeout in the lookup message
     32        getContext().netDb().lookupLeaseSet(_hash, done, done, 15*1000);
    3233    }
    3334
     
    4243                returnDest(ls.getDestination());
    4344            else
    44                 returnDest(null);
     45                returnHash(_hash);
    4546        }
    4647    }
     
    5253        } catch (I2CPMessageException ime) {}
    5354    }
     55
     56    /**
     57     *  Return the failed hash so the client can correlate replies with requests
     58     *  @since 0.8.3
     59     */
     60    private void returnHash(Hash h) {
     61        DestReplyMessage msg = new DestReplyMessage(h);
     62        try {
     63            _runner.doSend(msg);
     64        } catch (I2CPMessageException ime) {}
     65    }
    5466}
  • router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java

    r4025a57 r751134f5  
    1414import java.util.zip.GZIPOutputStream;
    1515
     16import net.i2p.data.Base64;
    1617import net.i2p.data.DataFormatException;
    1718import net.i2p.data.DataHelper;
     
    291292        }
    292293    }
    293    
     294
    294295    private Hash getHash(String name) {
    295296        String key = name.substring("profile-".length());
    296297        key = key.substring(0, key.length() - ".dat".length());
    297         Hash h = new Hash();
     298        //Hash h = new Hash();
    298299        try {
    299             h.fromBase64(key);
     300            //h.fromBase64(key);
     301            byte[] b = Base64.decode(key);
     302            if (b == null)
     303                return null;
     304            Hash h = Hash.create(b);
    300305            return h;
    301         } catch (DataFormatException dfe) {
     306        } catch (Exception dfe) {
    302307            _log.warn("Invalid base64 [" + key + "]", dfe);
    303308            return null;
  • router/java/src/net/i2p/router/tunnel/FragmentHandler.java

    r4025a57 r751134f5  
    328328        }
    329329        if ( (type == TYPE_ROUTER) || (type == TYPE_TUNNEL) ) {
    330             byte h[] = new byte[Hash.HASH_LENGTH];
    331330            if (offset + Hash.HASH_LENGTH >= preprocessed.length)
    332331                return -1;
    333             System.arraycopy(preprocessed, offset, h, 0, Hash.HASH_LENGTH);
    334             router = new Hash(h);
     332            //byte h[] = new byte[Hash.HASH_LENGTH];
     333            //System.arraycopy(preprocessed, offset, h, 0, Hash.HASH_LENGTH);
     334            //router = new Hash(h);
     335            router = Hash.create(preprocessed, offset);
    335336            offset += Hash.HASH_LENGTH;
    336337        }
Note: See TracChangeset for help on using the changeset viewer.