source: apps/i2ptunnel/jsp/editServer.jsi @ 6722485

Last change on this file since 6722485 was 6722485, checked in by zzz <zzz@…>, 18 months ago

whitespace

  • Property mode set to 100644
File size: 52.3 KB
Line 
1<%
2                String tunnelTypeName;
3                String tunnelType;
4                if (curTunnel >= 0) {
5                    tunnelTypeName = editBean.getTunnelType(curTunnel);
6                    tunnelType = editBean.getInternalType(curTunnel);
7                  %><h2><%=intl._t("Edit Server Settings")%> (<%=editBean.getTunnelName(curTunnel)%>)</h2><%
8                } else {
9                    tunnelTypeName = editBean.getTypeName(request.getParameter("type"));
10                    tunnelType = net.i2p.data.DataHelper.stripHTML(request.getParameter("type"));
11                  %><h2><%=intl._t("New Server Settings")%></h2><%
12                } %>
13                <input type="hidden" name="tunnel" value="<%=curTunnel%>" />
14                <input type="hidden" name="nonce" value="<%=net.i2p.i2ptunnel.web.IndexBean.getNextNonce()%>" />
15                <input type="hidden" name="type" value="<%=tunnelType%>" />
16<%
17                // these are four keys that are generated automatically on first save,
18                // and we want to persist in i2ptunnel.config, but don't want to
19                // show clogging up the custom options form.
20                String key = editBean.getKey1(curTunnel);
21                if (key != null && key.length() > 0) { %>
22                    <input type="hidden" name="key1" value="<%=key%>" />
23<%              }
24                key = editBean.getKey2(curTunnel);
25                if (key != null && key.length() > 0) { %>
26                    <input type="hidden" name="key2" value="<%=key%>" />
27<%              }
28                key = editBean.getKey3(curTunnel);
29                if (key != null && key.length() > 0) { %>
30                    <input type="hidden" name="key3" value="<%=key%>" />
31<%              }
32                key = editBean.getKey4(curTunnel);
33                if (key != null && key.length() > 0) { %>
34                    <input type="hidden" name="key4" value="<%=key%>" />
35<%              } %>
36                <input type="submit" class="default" name="action" value="Save changes" />
37    <table id="serverTunnelEdit" class="tunnelConfig">
38        <tr>
39            <th>
40                <%=intl._t("Name")%>
41            </th><th>
42                <%=intl._t("Type")%>
43            </th>
44        </tr><tr>
45            <td>
46                <input type="text" size="30" maxlength="50" name="name" title="<%=intl._t("Name of tunnel to be displayed on Tunnel Manager home page and the router console sidebar")%>" value="<%=editBean.getTunnelName(curTunnel)%>" class="freetext tunnelName" />
47            </td><td>
48                <%=tunnelTypeName%>
49            </td>
50        </tr><tr>
51            <th>
52                <%=intl._t("Description")%>
53            </th><th>
54                <%=intl._t("Auto Start Tunnel")%>
55            </th>
56        </tr><tr>
57            <td>
58                <input type="text" size="60" maxlength="80" name="nofilter_description" title="<%=intl._t("Description of tunnel to be displayed on Tunnel Manager home page")%>" value="<%=editBean.getTunnelDescription(curTunnel)%>" class="freetext tunnelDescriptionText" />
59            </td><td>
60                <label title="<%=intl._t("Enable this option to ensure this service is available when the router starts")%>"><input value="1" type="checkbox" name="startOnLoad"<%=(editBean.startAutomatically(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />
61                <%=intl._t("Automatically start tunnel when router starts")%></label>
62            </td>
63        </tr><tr>
64            <th colspan="2">
65         <% if ("streamrserver".equals(tunnelType)) { %>
66                <%=intl._t("Access Point")%>
67         <% } else { %>
68                <%=intl._t("Target")%>
69         <% } %>
70            </th>
71        </tr><tr>
72         <% if (!"streamrserver".equals(tunnelType)) { %>
73            <td>
74                <b><%=intl._t("Host")%>:</b>
75                <input type="text" size="20" name="targetHost" title="<%=intl._t("Hostname or IP address of the target server")%>" value="<%=editBean.getTargetHost(curTunnel)%>" class="freetext host" />
76            </td>
77<%          } /* !streamrserver */ %>
78            <td>
79                <b><%=intl._t("Port")%>:</b>
80                    <% String value = editBean.getTargetPort(curTunnel);
81                       if (value == null || "".equals(value.trim())) {
82                           out.write(" <span class=\"required\"><font color=\"red\">(");
83                           out.write(intl._t("required"));
84                           out.write(")</font></span>");
85                       }
86%>
87                <input type="text" size="6" maxlength="5" id="targetPort" name="targetPort" title="<%=intl._t("Specify the port the server is running on")%>" value="<%=editBean.getTargetPort(curTunnel)%>" class="freetext port" placeholder="required" />
88<%          if (!"streamrserver".equals(tunnelType)) { %>
89                <label title="<%=intl._t("To avoid traffic sniffing if connecting to a remote server, you can enable an SSL connection. Note that the target server must be configured to accept SSL connections.")%>"><input value="1" type="checkbox" name="useSSL"<%=(editBean.isSSLEnabled(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />
90                <%=intl._t("Use SSL to connect to target")%></label>
91<%          } /* !streamrserver */ %>
92            </td>
93<%          if ("httpbidirserver".equals(tunnelType)) { %>
94        </tr><tr>
95            <th colspan="2">
96                <%=intl._t("Access Point")%>
97            </th>
98        </tr><tr>
99            <td>
100                <b><%=intl._t("Port")%>:</b>
101
102<%                      String value4 = editBean.getClientPort(curTunnel);
103                        if (value4 == null || "".equals(value4.trim())) {
104                            out.write(" <span class=\"required\"><font color=\"red\">(");
105                            out.write(intl._t("required"));
106                            out.write(")</font></span>");
107                        }
108%>
109                 <input type="text" size="6" maxlength="5" name="port" title="<%=intl._t("Port required to access service (this can be a different port to the port the service is hosted on)")%>" value="<%=editBean.getClientPort(curTunnel)%>" class="freetext port" placeholder="required" />
110            </td>
111<%          } /* httpbidirserver */
112            if ("httpbidirserver".equals(tunnelType) || "streamrserver".equals(tunnelType)) {
113%>
114            <td>
115                <b><%=intl._t("Reachable by")%>:</b>
116
117                <select id="reachableBy" name="reachableBy" title="<%=intl._t("Listening interface (IP address) for client access (normally 127.0.0.1)")%>" class="selectbox">
118<%
119                    String clientInterface = editBean.getClientInterface(curTunnel);
120                    for (String ifc : editBean.interfaceSet()) {
121                        out.write("<option value=\"");
122                        out.write(ifc);
123                        out.write('\"');
124                        if (ifc.equals(clientInterface))
125                            out.write(" selected=\"selected\"");
126                        out.write('>');
127                        out.write(ifc);
128                        out.write("</option>\n");
129                    }
130%>
131                </select>
132            </td>
133         <% } /* httpbidirserver || streamrserver */ %>
134        </tr>
135<%          if (("httpserver".equals(tunnelType)) || ("httpbidirserver".equals(tunnelType))) {
136%>
137        <tr>
138            <th>
139                <%=intl._t("Website Hostname")%>
140            </th>
141            <th></th>
142        </tr><tr>
143            <td colspan="2">
144                <input type="text" size="20" id="websiteName" name="spoofedHost" title="<%=intl._t("Website Hostname e.g. mysite.i2p")%>" value="<%=editBean.getSpoofedHost(curTunnel)%>" class="freetext" />
145                <%=intl._t("(leave blank for outproxies)")%>
146            </td>
147        </tr>
148            <% }
149          %>
150        <tr>
151            <th>
152                <%=intl._t("Local destination")%>
153            </th><th>
154                <%=intl._t("Private key file")%>
155            </th>
156        </tr><tr>
157            <td>
158                <div class="displayText" title="<%=intl._t("Read Only: Local Destination (if known)")%>" tabindex="0" onblur="resetScrollLeft(this)"><%=editBean.getDestinationBase64(curTunnel)%></div>
159            </td><td>
160                    <% String value3 = editBean.getPrivateKeyFile(curTunnel);
161                       if (value3 == null || "".equals(value3.trim())) {
162                           out.write(" <span class=\"required\"><font color=\"red\">(");
163                           out.write(intl._t("required"));
164                           out.write(")</font></span>");
165                       }
166                     %>
167                <input type="text" size="30" id="privKeyFile" name="privKeyFile" title="<%=intl._t("Path to Private Key File")%>" value="<%=editBean.getPrivateKeyFile(curTunnel)%>" class="freetext" placeholder="required" />
168            </td>
169        </tr>
170<%
171  /******
172               if (("httpserver".equals(tunnelType)) || ("httpbidirserver".equals(tunnelType))) {
173                   String sig = editBean.getNameSignature(curTunnel);
174                   if (sig.length() > 0) {
175          %><div id="sigField" class="rowItem">
176                    <%=intl._t("Hostname Signature")%>
177                <input type="text" size="30" readonly="readonly" title="<%=intl._t("Use to prove that the website name is for this destination")%>" value="<%=sig%>" wrap="off" class="freetext" />
178            </div>
179         <%
180                   }  // sig
181               }  // type
182  ****/
183
184            String b64 = editBean.getDestinationBase64(curTunnel);
185            net.i2p.util.PortMapper pm = net.i2p.I2PAppContext.getGlobalContext().portMapper();
186            boolean hasImagegen = pm.getPort(net.i2p.util.PortMapper.SVC_IMAGEGEN) > 0;
187            boolean hasSusiDNS = pm.getPort(net.i2p.util.PortMapper.SVC_SUSIDNS) > 0;
188            if (!"".equals(b64)) {
189%>
190        <tr>
191<%
192                b64 = b64.replace("=", "%3d");
193                String name = editBean.getSpoofedHost(curTunnel);
194                if (name == null || name.equals(""))
195                    name = editBean.getTunnelName(curTunnel);
196                // mysite.i2p is set in the installed i2ptunnel.config
197                if (name != null && !name.equals("") && !name.equals("mysite.i2p") && !name.contains(" ") && name.endsWith(".i2p")) {
198%>
199
200            <td class="buttons" colspan="2">
201<%
202                    if (hasImagegen) {
203%>
204              <a class="control" title="<%=intl._t("Generate a QR Code for this domain")%>" href="/imagegen/qr?s=320&amp;t=<%=name%>&amp;c=http%3a%2f%2f<%=name%>%2f%3fi2paddresshelper%3d<%=b64%>" target="_top"><%=intl._t("Generate QR Code")%></a>
205<%
206                    }
207                    if (hasSusiDNS) {
208%>
209              <a class="control" title="<%=intl._t("Add to Private addressbook")%>" href="/susidns/addressbook.jsp?book=private&amp;hostname=<%=name%>&amp;destination=<%=b64%>#add"><%=intl._t("Add to local addressbook")%></a>
210<%
211                    }
212%>
213              <a class="control" title="<%=intl._t("Register, unregister or change details for hostname")%>" href="register?tunnel=<%=curTunnel%>"><%=intl._t("Registration Authentication")%></a>
214<%
215                    if (("httpserver".equals(tunnelType)) || ("httpbidirserver".equals(tunnelType))) {
216%>
217              <a class="control" title="<%=intl._t("HTTPS configuration")%>" href="ssl?tunnel=<%=curTunnel%>"><%=intl._t("SSL Wizard")%></a>
218<%
219                    }
220%>
221            </td>
222<%
223                } else {
224%>
225            <td class="infohelp" colspan="2">
226                <%=intl._t("Note: In order to enable QR code generation or registration authentication, configure the Website Hostname field (for websites) or the Name field (everything else) above with an .i2p suffixed hostname e.g. mynewserver.i2p")%>
227            </td>
228<%
229                }  // name
230%>
231        </tr>
232<%
233            }  // b64
234
235%>
236    </table>
237
238    <h3><%=intl._t("Advanced networking options")%></h3>
239
240    <table id="#advancedServerTunnelOptions" class="tunnelConfig">
241        <tr>
242            <th colspan="2">
243                <%=intl._t("Tunnel Options")%>
244            </th>
245        </tr>
246
247<%     if (editBean.isAdvanced()) {
248      %><tr>
249            <th colspan="2">
250                <%=intl._t("Inbound")%>
251            </th>
252        </tr><%
253      }  // isAdvanced()
254%>
255
256        <tr>
257            <td>
258                <b><%=intl._t("Length")%></b>
259            </td><td>
260                <b><%=intl._t("Variance")%></b>
261            </td>
262        </tr><tr>
263            <td>
264                <select id="tunnelDepth" name="tunnelDepth" title="<%=intl._t("Length of each Tunnel")%>" class="selectbox">
265                    <% int tunnelDepth = editBean.getTunnelDepth(curTunnel, 3);
266                  %><option value="0"<%=(tunnelDepth == 0 ? " selected=\"selected\"" : "") %>><%=intl._t("0 hop tunnel (no anonymity)")%></option>
267                    <option value="1"<%=(tunnelDepth == 1 ? " selected=\"selected\"" : "") %>><%=intl._t("1 hop tunnel (low anonymity)")%></option>
268                    <option value="2"<%=(tunnelDepth == 2 ? " selected=\"selected\"" : "") %>><%=intl._t("2 hop tunnel (medium anonymity)")%></option>
269                    <option value="3"<%=(tunnelDepth == 3 ? " selected=\"selected\"" : "") %>><%=intl._t("3 hop tunnel (high anonymity)")%></option>
270<%                 if (editBean.isAdvanced()) {
271                  %><option value="4"<%=(tunnelDepth == 4 ? " selected=\"selected\"" : "") %>>4 hop tunnel</option>
272                    <option value="5"<%=(tunnelDepth == 5 ? " selected=\"selected\"" : "") %>>5 hop tunnel</option>
273                    <option value="6"<%=(tunnelDepth == 6 ? " selected=\"selected\"" : "") %>>6 hop tunnel</option>
274                    <option value="7"<%=(tunnelDepth == 7 ? " selected=\"selected\"" : "") %>>7 hop tunnel</option>
275<%                 } else if (tunnelDepth > 3) {
276                %>    <option value="<%=tunnelDepth%>" selected="selected"><%=tunnelDepth%> <%=intl._t("hop tunnel (very poor performance)")%></option>
277<%                 }
278              %></select>
279            </td><td>
280                <select id="tunnelVariance" name="tunnelVariance" title="<%=intl._t("Level of Randomization for Tunnel Depth")%>" class="selectbox">
281                    <% int tunnelVariance = editBean.getTunnelVariance(curTunnel, 0);
282                  %><option value="0"<%=(tunnelVariance  ==  0 ? " selected=\"selected\"" : "") %>><%=intl._t("0 hop variance (no randomization, consistent performance)")%></option>
283                    <option value="1"<%=(tunnelVariance  ==  1 ? " selected=\"selected\"" : "") %>><%=intl._t("+ 0-1 hop variance (medium additive randomization, subtractive performance)")%></option>
284                    <option value="2"<%=(tunnelVariance  ==  2 ? " selected=\"selected\"" : "") %>><%=intl._t("+ 0-2 hop variance (high additive randomization, subtractive performance)")%></option>
285                    <option value="-1"<%=(tunnelVariance == -1 ? " selected=\"selected\"" : "") %>><%=intl._t("+/- 0-1 hop variance (standard randomization, standard performance)")%></option>
286                    <option value="-2"<%=(tunnelVariance == -2 ? " selected=\"selected\"" : "") %>><%=intl._t("+/- 0-2 hop variance (not recommended)")%></option>
287<%                 if (tunnelVariance > 2 || tunnelVariance < -2) {
288                %>    <option value="<%=tunnelVariance%>" selected="selected"><%= (tunnelVariance > 2 ? "+ " : "+/- ") %>0-<%=tunnelVariance%> <%=intl._t("hop variance")%></option>
289<%                 }
290              %></select>
291            </td>
292        </tr><tr>
293            <td>
294                <b><%=intl._t("Count")%></b>
295            </td><td>
296                <b><%=intl._t("Backup Count")%></b>
297            </td>
298        </tr><tr>
299            <td>
300                <select id="tunnelQuantity" name="tunnelQuantity" title="<%=intl._t("Number of Tunnels in Group")%>" class="selectbox">
301                    <%=editBean.getQuantityOptions(curTunnel, editBean.isAdvanced() ? 1 : 0)%>
302                </select>
303            </td><td>
304                <select id="tunnelBackupQuantity" name="tunnelBackupQuantity" title="<%=intl._t("Number of Reserve Tunnels")%>" class="selectbox">
305<%                 int tunnelBackupQuantity = editBean.getTunnelBackupQuantity(curTunnel, 0);
306                   if (editBean.isAdvanced()) {
307                       // TODO ngettext
308                  %><option value="0"<%=(tunnelBackupQuantity == 0 ? " selected=\"selected\"" : "") %>>0 <%=intl._t("backup tunnels")%></option>
309                    <option value="1"<%=(tunnelBackupQuantity == 1 ? " selected=\"selected\"" : "") %>>1 <%=intl._t("backup tunnels")%></option>
310                    <option value="2"<%=(tunnelBackupQuantity == 2 ? " selected=\"selected\"" : "") %>>2 <%=intl._t("backup tunnels")%></option>
311                    <option value="3"<%=(tunnelBackupQuantity == 3 ? " selected=\"selected\"" : "") %>>3 <%=intl._t("backup tunnels")%></option>
312<%
313                   } else {
314                  %><option value="0"<%=(tunnelBackupQuantity == 0 ? " selected=\"selected\"" : "") %>><%=intl._t("0 backup tunnels (0 redundancy, no added resource usage)")%></option>
315                    <option value="1"<%=(tunnelBackupQuantity == 1 ? " selected=\"selected\"" : "") %>><%=intl._t("1 backup tunnel each direction (low redundancy, low resource usage)")%></option>
316                    <option value="2"<%=(tunnelBackupQuantity == 2 ? " selected=\"selected\"" : "") %>><%=intl._t("2 backup tunnels each direction (medium redundancy, medium resource usage)")%></option>
317                    <option value="3"<%=(tunnelBackupQuantity == 3 ? " selected=\"selected\"" : "") %>><%=intl._t("3 backup tunnels each direction (high redundancy, high resource usage)")%></option>
318<%                 } // isAdvanced()
319                   if (tunnelBackupQuantity > 3) {
320                %>    <option value="<%=tunnelBackupQuantity%>" selected="selected"><%=tunnelBackupQuantity%> <%=intl._t("backup tunnels")%></option>
321<%                 }
322              %></select>
323            </td>
324        </tr>
325
326<%     if (editBean.isAdvanced()) {
327       // repeat four options above for outbound
328      %><tr>
329            <th colspan="2">
330                <%=intl._t("Outbound")%>
331            </th>
332        </tr><tr>
333            <td>
334                <b><%=intl._t("Length")%></b>
335            </td><td>
336                <b><%=intl._t("Variance")%></b>
337            </td>
338        </tr><tr>
339            <td>
340                <select id="tunnelDepthOut" name="tunnelDepthOut" title="<%=intl._t("Length of each Tunnel")%>" class="selectbox">
341                    <% int tunnelDepthOut = editBean.getTunnelDepthOut(curTunnel, 3);
342                  %><option value="0"<%=(tunnelDepthOut == 0 ? " selected=\"selected\"" : "") %>><%=intl._t("0 hop tunnel (no anonymity)")%></option>
343                    <option value="1"<%=(tunnelDepthOut == 1 ? " selected=\"selected\"" : "") %>><%=intl._t("1 hop tunnel (low anonymity)")%></option>
344                    <option value="2"<%=(tunnelDepthOut == 2 ? " selected=\"selected\"" : "") %>><%=intl._t("2 hop tunnel (medium anonymity)")%></option>
345                    <option value="3"<%=(tunnelDepthOut == 3 ? " selected=\"selected\"" : "") %>><%=intl._t("3 hop tunnel (high anonymity)")%></option>
346                    <option value="4"<%=(tunnelDepthOut == 4 ? " selected=\"selected\"" : "") %>>4 hop tunnel</option>
347                    <option value="5"<%=(tunnelDepthOut == 5 ? " selected=\"selected\"" : "") %>>5 hop tunnel</option>
348                    <option value="6"<%=(tunnelDepthOut == 6 ? " selected=\"selected\"" : "") %>>6 hop tunnel</option>
349                    <option value="7"<%=(tunnelDepthOut == 7 ? " selected=\"selected\"" : "") %>>7 hop tunnel</option>
350                </select>
351            </td><td>
352                <select id="tunnelVarianceOut" name="tunnelVarianceOut" title="<%=intl._t("Level of Randomization for Tunnel Depth")%>" class="selectbox">
353<%                 int tunnelVarianceOut = editBean.getTunnelVarianceOut(curTunnel, 0);
354                  %><option value="0"<%=(tunnelVarianceOut  ==  0 ? " selected=\"selected\"" : "") %>><%=intl._t("0 hop variance (no randomization, consistent performance)")%></option>
355                    <option value="1"<%=(tunnelVarianceOut  ==  1 ? " selected=\"selected\"" : "") %>><%=intl._t("+ 0-1 hop variance (medium additive randomization, subtractive performance)")%></option>
356                    <option value="2"<%=(tunnelVarianceOut  ==  2 ? " selected=\"selected\"" : "") %>><%=intl._t("+ 0-2 hop variance (high additive randomization, subtractive performance)")%></option>
357                    <option value="-1"<%=(tunnelVarianceOut == -1 ? " selected=\"selected\"" : "") %>><%=intl._t("+/- 0-1 hop variance (standard randomization, standard performance)")%></option>
358                    <option value="-2"<%=(tunnelVarianceOut == -2 ? " selected=\"selected\"" : "") %>><%=intl._t("+/- 0-2 hop variance (not recommended)")%></option>
359<%                 if (tunnelVarianceOut > 2 || tunnelVarianceOut < -2) {
360                %>    <option value="<%=tunnelVarianceOut%>" selected="selected"><%= (tunnelVarianceOut > 2 ? "+ " : "+/- ") %>0-<%=tunnelVarianceOut%> <%=intl._t("hop variance")%></option>
361<%                 }
362              %></select>
363            </td>
364        </tr><tr>
365            <td>
366                <b><%=intl._t("Count")%></b>
367            </td><td>
368                <b><%=intl._t("Backup Count")%></b>
369            </td>
370        </tr><tr>
371            <td>
372                <select id="tunnelQuantityOut" name="tunnelQuantityOut" title="<%=intl._t("Number of Tunnels in Group")%>" class="selectbox">
373                    <%=editBean.getQuantityOptions(curTunnel, 2)%>
374                </select>
375            </td><td>
376                <select id="tunnelBackupQuantityOut" name="tunnelBackupQuantityOut" title="<%=intl._t("Number of Reserve Tunnels")%>" class="selectbox">
377<%                     int tunnelBackupQuantityOut = editBean.getTunnelBackupQuantityOut(curTunnel, 0);
378                       // TODO ngettext
379                  %><option value="0"<%=(tunnelBackupQuantityOut == 0 ? " selected=\"selected\"" : "") %>>0 <%=intl._t("backup tunnels")%></option>
380                    <option value="1"<%=(tunnelBackupQuantityOut == 1 ? " selected=\"selected\"" : "") %>>1 <%=intl._t("backup tunnels")%></option>
381                    <option value="2"<%=(tunnelBackupQuantityOut == 2 ? " selected=\"selected\"" : "") %>>2 <%=intl._t("backup tunnels")%></option>
382                    <option value="3"<%=(tunnelBackupQuantityOut == 3 ? " selected=\"selected\"" : "") %>>3 <%=intl._t("backup tunnels")%></option>
383<%                 if (tunnelBackupQuantityOut > 3) {
384                %>    <option value="<%=tunnelBackupQuantityOut%>" selected="selected"><%=tunnelBackupQuantityOut%> <%=intl._t("backup tunnels")%></option>
385<%                 }
386              %></select>
387            </td>
388        </tr>
389<%
390      }  // isAdvanced() End outbound config section
391
392            if (!"streamrserver".equals(tunnelType)) {
393%>
394        <tr>
395            <th colspan="2">
396                <%=intl._t("Profile")%>
397            </th>
398        </tr><tr>
399            <td colspan="2">
400                <select id="profile" name="profile" title="<%=intl._t("Connection Profile")%>" class="selectbox">
401                    <% boolean interactiveProfile = editBean.isInteractive(curTunnel);
402                  %><option <%=(interactiveProfile == true  ? "selected=\"selected\" " : "")%>value="interactive"><%=intl._t("interactive connection")%> </option>
403                    <option <%=(interactiveProfile == false ? "selected=\"selected\" " : "")%>value="bulk"><%=intl._t("bulk connection (downloads/websites/BT)")%> </option>
404                </select>
405            </td>
406        </tr>
407<%
408            } /* !streamrserver */
409
410            if (!editBean.isRouterContext()) {
411%>
412        <tr>
413            <th colspan="2">
414                <%=intl._t("Router I2CP Address")%>
415            </th>
416        </tr><tr>
417            <td>
418                <b><%=intl._t("Host")%>:</b>
419                <input type="text" id="clientHost" name="clientHost" size="20" title="<%=intl._t("I2CP Hostname or IP")%>" value="<%=editBean.getI2CPHost(curTunnel)%>" class="freetext" />
420            </td><td>
421                <b><%=intl._t("Port")%>:</b>
422                <input type="text" id="clientPort" name="clientport" size="20" title="<%=intl._t("I2CP Port Number")%>" value="<%=editBean.getI2CPPort(curTunnel)%>" class="freetext" />
423            </td>
424        </tr>
425<%
426            } // !isRouterContext
427
428            // TODO, encrypted + offline is unimplemented
429            if (!editBean.getIsOfflineKeys(curTunnel)) {
430%>
431        <tr>
432            <th colspan="2">
433                <%=intl._t("Encrypt Leaseset")%>
434            </th>
435        </tr><tr>
436            <td colspan="2">
437<%
438                   String curEncryptMode = editBean.getEncryptMode(curTunnel);
439%>
440                <select id="encryptMode" name="encryptMode" class="selectbox">
441                <option title="<%=intl._t("Allow all clients to connect to this service")%>" value="0" <%=(curEncryptMode.equals("0") ? " selected=\"selected\"" : "")%> >
442                    <%=intl._t("Disable")%></option>
443<%
444                if (curEncryptMode.equals("10")) {
445%>
446                <option title="<%=intl._t("Allow all clients to connect to this service")%>" value="10" <%=(curEncryptMode.equals("10") ? " selected=\"selected\"" : "")%> >
447                    <%=intl._t("Disable")%> (LS2)</option>
448<%
449                } // mode = 10
450%>
451                <option title="<%=intl._t("Send key to all users.")%>" value="1" <%=(curEncryptMode.equals("1") ? " selected=\"selected\"" : "")%> >
452                    <%=intl._t("Encrypted")%> (AES)</option>
453<%
454                int curSigType = editBean.getSigType(curTunnel, tunnelType);
455                boolean allowBlinding = (curSigType == 7 || curSigType == 11);
456                if (allowBlinding) {
457%>
458                <option title="<%=intl._t("Prevents server discovery by floodfills")%>" value="2" <%=(curEncryptMode.equals("2") ? " selected=\"selected\"" : "")%> >
459                    <%=intl._t("Blinded")%></option>
460<%
461                     if (true /* editBean.isAdvanced() */) {
462%>
463                <option title="<%=intl._t("Send password to all users.")%>" value="3" <%=(curEncryptMode.equals("3") ? " selected=\"selected\"" : "")%> >
464                    <%=intl._t("Blinded with lookup password")%></option>
465                <option title="<%=intl._t("Send key to all users.")%>" value="4" <%=(curEncryptMode.equals("4") ? " selected=\"selected\"" : "")%> >
466                    <%=intl._t("Encrypted")%> (PSK)</option>
467                <option title="<%=intl._t("Send key and password to all users.")%>" value="5" <%=(curEncryptMode.equals("5") ? " selected=\"selected\"" : "")%> >
468                    <%=intl._t("Encrypted with lookup password")%> (PSK)</option>
469                <option title="<%=intl._t("Send individual key to each user.")%>" value="6" <%=(curEncryptMode.equals("6") ? " selected=\"selected\"" : "")%> >
470                    <%=intl._t("Encrypted with per-user key")%> (PSK)</option>
471                <option title="<%=intl._t("Send individual key to each user.") + ' '%> <%=intl._t("Send password to all users.")%>" value="7" <%=(curEncryptMode.equals("7") ? " selected=\"selected\"" : "")%> >
472                    <%=intl._t("Encrypted with lookup password and per-user key")%> (PSK)</option>
473                <option title="<%=intl._t("Enter key from each user.")%>" value="8" <%=(curEncryptMode.equals("8") ? " selected=\"selected\"" : "")%> >
474                    <%=intl._t("Encrypted with per-user key")%> (DH)</option>
475                <option title="<%=intl._t("Enter key from each user.") + ' '%> <%=intl._t("Send password to all users.")%>" value="9" <%=(curEncryptMode.equals("9") ? " selected=\"selected\"" : "")%> >
476                    <%=intl._t("Encrypted with lookup password and per-user key")%> (DH)</option>
477<%
478                     } // isAdvanced()
479                } // allowBlinding
480%>
481                </select>
482            </td>
483        </tr><tr>
484            <td>
485<%
486                if (allowBlinding /* && editBean.isAdvanced() */) {
487%>
488                <b><%=intl._t("Optional lookup password")%>:</b>
489<%
490                } // allowBlinding
491%>
492            </td><td>
493<%
494                // even if not shown, we need to preserve the param as a hidden input below
495                // as it's the key we use to decrypt the PSK/DH LS on the router side
496                boolean showSharedKey = curEncryptMode.equals("1") || curEncryptMode.equals("4") || curEncryptMode.equals("5");
497                if (showSharedKey) {
498%>
499                <b><%=intl._t("Encryption Key")%></b>
500<%
501                } // showSharedKey
502%>
503            </td>
504        </tr><tr>
505            <td>
506<%
507                if (allowBlinding /* && editBean.isAdvanced() */) {
508%>
509                <input type="password" name="nofilter_blindedPassword" title="<%=intl._t("Set password required to access this service")%>" value="<%=editBean.getBlindedPassword(curTunnel)%>" class="freetext password" />
510<%
511                } // allowBlinding
512%>
513            </td><td>
514                <input type="<%=showSharedKey ? "text" : "hidden"%>" size="44" id="leasesetKey" name="encryptKey" title="<%=intl._t("Encryption key required to access this service")%>" readonly="readonly" value="<%=editBean.getEncryptKey(curTunnel)%>" class="freetext"/>
515            </td>
516        </tr>
517<%
518                if (allowBlinding /* && editBean.isAdvanced() */) {
519                    boolean pskClient = curEncryptMode.equals("6") || curEncryptMode.equals("7");
520                    boolean dhClient = curEncryptMode.equals("8") || curEncryptMode.equals("9");
521                    if (pskClient || dhClient) {
522                        // b64Name:b64Key
523                        java.util.List<String> clientAuths = editBean.getClientAuths(curTunnel, dhClient);
524                        if (!clientAuths.isEmpty()) {
525%>
526        <tr><td><b><%=intl._t("Revoke")%>&nbsp;&nbsp;&nbsp;&nbsp;<%=intl._t("Client Name")%></b></td><td><b><%=intl._t("Client Key")%></b></td></tr>
527<%
528                            int i = 0;
529                            for (String clientAuth : clientAuths) {
530                                String[] split = net.i2p.data.DataHelper.split(clientAuth, ":", 2);
531                                String cname, ckey;
532                                if (split.length == 2) {
533                                    cname = split[0];
534                                    ckey = split[1];
535                                } else {
536                                    cname = "";
537                                    ckey = split[0];
538                                }
539                                if (cname.length() > 0) {
540                                    cname = net.i2p.data.DataHelper.escapeHTML(net.i2p.data.DataHelper.getUTF8(net.i2p.data.Base64.decode(cname)));
541                                } else {
542                                    cname = intl._t("Client") + ' ' + (i + 1);
543                                }
544%>
545                <tr>
546                <td><input value="<%=i%>" type="checkbox" name="revokeClient" class="tickbox" />
547                    <input type="text" value="<%=cname%>" size="44" name="nofilter_clientName" class="freetext" /></td>
548                <td><input type="text" id="leasesetKey" value="<%=ckey%>" size="44" name="clientKey" readonly="readonly" class="freetext" />
549                </tr>
550<%
551                                i++;
552                            } // for
553                        } // isEmpty
554%>
555        <tr><td><b><%=intl._t("Add")%>&nbsp;&nbsp;&nbsp;&nbsp;<%=intl._t("Client Name")%></b></td><td>
556<%
557                            if (dhClient) {
558%>
559                    <b><%=intl._t("Client Key")%></b>
560<%
561                            } // dhClient
562%>
563                </td></tr><tr>
564                <td><input value="1" type="checkbox" name="addClient" class="tickbox" />
565                    <input type="text" value="<%=intl._t("Client") + ' ' + (clientAuths.size() + 1)%>" size="44" name="nofilter_newClientName" class="freetext" /></td>
566                <td>
567<%
568                            if (dhClient) {
569%>
570                    <input type="text" id="leasesetKey" value="" size="44" maxlength="44" name="newClientKey" class="freetext" />
571<%
572                            } // dhClient
573%>
574                </td></tr>
575<%
576                    } // pskClient || dhClient
577                } // allowBlinding
578            } // !isOffline
579%>
580        <tr>
581            <th colspan="2">
582                <%=intl._t("Restricted Access List")%>
583            </th>
584        </tr><tr>
585            <td colspan="2">
586                <span class="multiOption"><label title="<%=intl._t("Allow all clients to connect to this service")%>"><input value="0" type="radio" name="accessMode"<%=(editBean.getAccessMode(curTunnel).equals("0") ? " checked=\"checked\"" : "")%> class="tickbox" />
587                    <%=intl._t("Disable")%></label></span>
588                <span class="multiOption"><label title="<%=intl._t("Prevent listed clients from connecting to this service")%>"><input value="2" type="radio" name="accessMode"<%=(editBean.getAccessMode(curTunnel).equals("2") ? " checked=\"checked\"" : "")%> class="tickbox" />
589                    <%=intl._t("Blacklist")%></label></span>
590                <span class="multiOption"><label title="<%=intl._t("Only allow listed clients to connect to this service")%>"><input value="1" type="radio" name="accessMode"<%=(editBean.getAccessMode(curTunnel).equals("1") ? " checked=\"checked\"" : "")%> class="tickbox" />
591                    <%=intl._t("Whitelist")%></label></span>
592            </td>
593        </tr><tr>
594            <td colspan="2">
595                <b><%=intl._t("Access List Description")%></b> (<%=intl._t("Specify clients, 1 per line")%>)
596            </td>
597        </tr><tr>
598            <td colspan="2">
599                <textarea rows="2" style="height: 8em;" cols="60" name="accessList" title="<%=intl._t("Control access to this service")%>" wrap="off" spellcheck="false"><%=editBean.getAccessList(curTunnel)%></textarea>
600            </td>
601        </tr><tr>
602            <td colspan="2">
603                <b><%=intl._t("Filter Definition File")%></b>
604            </td>
605        </tr><tr>
606            <td colspan="2">
607                <%=intl._t("You can define an advanced filter for this tunnel.")%> (<a href="http://i2p-projekt.i2p/spec/filter-format" target="_blank"><%=intl._t("Format Specification")%></a>) 
608            </td>
609        </tr><tr>
610            <td colspan="2">
611                <label for="filterDefinition"><%=intl._t("Absolute path to file containing filter definition")%></label>
612                <input type="text" id="filterDefinition" name="filterDefinition" value="<%=editBean.getFilterDefinition(curTunnel)%>" size="80"/>
613            </td>
614        </tr><tr>
615            <th colspan="2">
616                <%=intl._t("Server Access Options")%>
617            </th>
618        </tr>
619<%
620               if (("httpserver".equals(tunnelType)) || ("httpbidirserver".equals(tunnelType))) {
621%>
622        <tr>
623            <td>
624                <label title="<%=intl._t("Prevent clients from accessing this service via an inproxy")%>"><input value="1" type="checkbox" name="rejectInproxy"<%=(editBean.isRejectInproxy(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />
625                <%=intl._t("Block Access via Inproxies")%></label>
626            </td><td>
627                <label><input value="1" type="checkbox" name="rejectReferer"<%=(editBean.isRejectReferer(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />
628                <%=intl._t("Block Accesses containing Referers")%></label>
629            </td>
630        </tr><tr>
631            <td>
632                <label title="<%=intl._t("Deny User-Agents matching these strings (probably from inproxies)")%>"><input value="1" type="checkbox" name="rejectUserAgents"<%=(editBean.isRejectUserAgents(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />
633                <%=intl._t("Block these User-Agents")%></label>
634            </td><td>
635                <input type="text" id="userAgents" name="userAgents" size="20" title="<%=intl._t("comma separated, e.g. Mozilla,Opera (case-sensitive)")%>" value="<%=editBean.getUserAgents(curTunnel)%>" class="freetext" />
636            </td>
637        </tr>
638<%             } // httpserver
639%>
640        <tr>
641            <td>
642                <label title="<%=intl._t("Use unique IP addresses for each connecting client (local non-SSL servers only)")%>"><input value="1" type="checkbox" name="uniqueLocal"<%=(editBean.getUniqueLocal(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />
643                <%=intl._t("Unique Local Address per Client")%></label>
644            </td><td>
645                <label title="<%=intl._t("Only enable if you are hosting this service on multiple routers")%>"><input value="1" type="checkbox" name="multihome"<%=(editBean.getMultihome(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />
646                <%=intl._t("Optimize for Multihoming")%></label>
647            </td>
648        </tr><tr>
649            <th colspan="2">
650                <%=intl._t("Server Throttling")%>
651            </th>
652        </tr><tr>
653            <td id="throttle" colspan="4">
654                <table id="throttler">
655                    <tr>
656                        <th colspan="5">
657                            <%=intl._t("Inbound connection limits (0=unlimited)")%>
658                        </th>
659                    </tr><tr>
660                        <td></td>
661                        <td><b><%=intl._t("Per Minute")%></b></td>
662                        <td><b><%=intl._t("Per Hour")%></b></td>
663                        <td><b><%=intl._t("Per Day")%></b></td>
664                        <td class="blankColumn"></td>
665                    </tr><tr>
666                        <td><b><%=intl._t("Per Client")%></b></td>
667                        <td>
668                            <input type="text" name="limitMinute" title="<%=intl._t("Maximum number of web page requests per minute for a unique client before access to the server is blocked")%>" value="<%=editBean.getLimitMinute(curTunnel)%>" class="freetext" />
669                        </td><td>
670                            <input type="text" name="limitHour" title="<%=intl._t("Maximum number of web page requests per hour for a unique client before access to the server is blocked")%>" value="<%=editBean.getLimitHour(curTunnel)%>" class="freetext" />
671                        </td><td>
672                            <input type="text" name="limitDay" title="<%=intl._t("Maximum number of web page requests per day for a unique client before access to the server is blocked")%>" value="<%=editBean.getLimitDay(curTunnel)%>" class="freetext" />
673                        </td><td class="blankColumn"></td>
674                    </tr><tr>
675                        <td><b><%=intl._t("Total")%></b></td>
676                        <td>
677                            <input type="text" name="totalMinute" title="<%=intl._t("Total number of web page requests per minute before access to the server is blocked")%>" value="<%=editBean.getTotalMinute(curTunnel)%>" class="freetext" />
678                        </td><td>
679                            <input type="text" name="totalHour" title="<%=intl._t("Total number of web page requests per hour before access to the server is blocked")%>" value="<%=editBean.getTotalHour(curTunnel)%>" class="freetext" />
680                        </td><td>
681                            <input type="text" name="totalDay" title="<%=intl._t("Total number of web page requests per day before access to the server is blocked")%>" value="<%=editBean.getTotalDay(curTunnel)%>" class="freetext" />
682                        </td><td class="blankColumn"></td>
683                    </tr><tr>
684                        <th colspan="5"><%=intl._t("Max concurrent connections (0=unlimited)")%></th>
685                    </tr><tr>
686                        <td></td><td>
687                            <input type="text" name="maxStreams" title="<%=intl._t("Maximum number of simultaneous client connections")%>" value="<%=editBean.getMaxStreams(curTunnel)%>" class="freetext" />
688                        </td><td></td><td></td><td class="blankColumn"></td>
689                    </tr>
690<%
691               if (("httpserver".equals(tunnelType)) || ("httpbidirserver".equals(tunnelType))) {
692%>
693                    <tr>
694                        <th colspan="5">
695                            <%=intl._t("POST limits (0=unlimited)")%>
696                        </th>
697                    </tr><tr>
698                        <td></td><td>
699                            <b><%=intl._t("Per Period")%></b>
700                        </td><td>
701                            <b><%=intl._t("Ban Duration")%></b>
702                        </td><td></td><td class="blankColumn"></td>
703                    </tr><tr>
704                        <td>
705                            <b><%=intl._t("Per Client")%>
706                            </b>
707                        </td><td>
708                            <input type="text" name="postMax" title="<%=intl._t("Maximum number of post requests permitted for a unique client for the configured timespan")%>" value="<%=editBean.getPostMax(curTunnel)%>" class="freetext quantity"/>
709                        </td><td colspan="2">
710                            <input type="text" name="postBanTime" title="<%=intl._t("If a client exceeds the maximum number of post requests per allocated period, enforce a ban for this number of minutes")%>" value="<%=editBean.getPostBanTime(curTunnel)%>" class="freetext period"/>
711                            <%=intl._t("minutes")%>
712                        </td><td class="blankColumn"></td>
713                    </tr><tr>
714                        <td>
715                            <b><%=intl._t("Total")%>
716                            </b>
717                        </td><td>
718                            <input type="text" name="postTotalMax" title="<%=intl._t("Total number of post requests permitted for the configured timespan")%>" value="<%=editBean.getPostTotalMax(curTunnel)%>" class="freetext quantity"/>
719                        </td><td colspan="2">
720                            <input type="text" name="postTotalBanTime" title="<%=intl._t("If the maximum number of post requests per allocated period is exceeded, enforce a global access ban for this number of minutes")%>" value="<%=editBean.getPostTotalBanTime(curTunnel)%>" class="freetext period"/>
721                            <%=intl._t("minutes")%>
722                        </td><td class="blankColumn"></td>
723                    </tr><tr>
724                        <td>
725                            <b><%=intl._t("POST limit period")%>
726                            </b>
727                        </td><td colspan="2">
728                            <input type="text" name="postCheckTime" title="<%=intl._t("Timespan for the maximum number of post requests to be reached before a ban is triggered")%>" value="<%=editBean.getPostCheckTime(curTunnel)%>" class="freetext period"/>
729                            <%=intl._t("minutes")%>
730                        </td><td></td><td class="blankColumn"></td>
731                    </tr>
732<%             } // httpserver
733%>
734
735                </table>
736            </td>
737        </tr><tr>
738            <th colspan="2">
739                <%=intl._t("Reduce tunnel quantity when idle")%>
740            </th>
741        </tr><tr>
742            <td colspan="2">
743                <label><input value="1" type="checkbox" id="startOnLoad" name="reduce" <%=(editBean.getReduce(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />
744                <%=intl._t("Reduce tunnel quantity when idle to conserve resources")%></label>
745            </td>
746        </tr><tr>
747            <td>
748                <b><%=intl._t("Reduced tunnel count")%>:</b>
749                <input type="text" id="reduceCount" name="reduceCount" size="1" maxlength="1" title="<%=intl._t("Number of tunnels to keep open to maintain availability of service")%>" value="<%=editBean.getReduceCount(curTunnel)%>" class="freetext quantity" />
750            </td>
751
752            <td>
753                <b><%=intl._t("Idle period")%>:</b>
754                <input type="text" id="reduceTime" name="reduceTime" size="4" maxlength="4" title="<%=intl._t("Period of inactivity before tunnel number is reduced")%>" value="<%=editBean.getReduceTime(curTunnel)%>" class="freetext period" />
755                <%=intl._t("minutes")%>
756            </td>
757        </tr>
758<% /***************** %>
759        <tr>
760            <th colspan="2">
761                <%=intl._t("New Certificate type")%>
762            </th>
763        </tr><tr>
764            <td colspan="2">
765                <span class="multiOption"><label title="<%=intl._t("No Certificate")%>"><%=intl._t("None")%>
766                <input value="0" type="radio" id="startOnLoad" name="cert"<%=(editBean.getCert(curTunnel)==0 ? " checked=\"checked\"" : "")%> class="tickbox" /></label></span>
767                <span class="multiOption"><label title="<%=intl._t("Hashcash Certificate")%>"><%=intl._t("Hashcash (effort)")%>
768                <input value="1" type="radio" id="startOnLoad" name="cert"<%=(editBean.getCert(curTunnel)==1 ? " checked=\"checked\"" : "")%> class="tickbox" /></label>
769                <input type="text" id="port" name="effort" size="2" maxlength="2" title="<%=intl._t("Hashcash Effort")%>" value="<%=editBean.getEffort(curTunnel)%>" class="freetext" /></span>
770            </td>
771        </tr><tr>
772            <th>
773                <%=intl._t("Hashcash Calc Time")%>
774            </th><th>
775                <%=intl._t("Hidden")%>
776            </th>
777        </tr><tr>
778            <td>
779                <button class="control" type="submit" name="action" value="Estimate" title="<%=intl._t("Estimate Calculation Time")%>"><%=intl._t("Estimate")%></button>
780            </td><td>
781                <input value="2" type="radio" id="startOnLoad" name="cert" title="<%=intl._t("Hidden Certificate")%>"<%=(editBean.getCert(curTunnel)==2 ? " checked=\"checked\"" : "")%> class="tickbox" />
782            </td>
783        </tr><tr>
784            <th colspan="2">
785                <%=intl._t("Signed Certificate")%>
786            </th>
787        </tr><tr>
788            <td colspan="2">
789                <label title="<%=intl._t("Signed Certificate")%>"><%=intl._t("Signed (signed by)")%>:
790                <input value="3" type="radio" id="startOnLoad" name="cert"<%=(editBean.getCert(curTunnel)==3 ? " checked=\"checked\"" : "")%> class="tickbox" /></label>
791                <input type="text" id="port" name="signer" size="50" title="<%=intl._t("Cert Signer")%>" value="<%=editBean.getSigner(curTunnel)%>" class="freetext" />
792            </td>
793        </tr><tr>
794            <th colspan="2">
795                <%=intl._t("Modify Certificate")%>&nbsp;<%=intl._t("(Tunnel must be stopped first)")%>
796            </th>
797        </tr><tr>
798            <td colspan="2">
799                <button class="control" type="submit" name="action" value="Modify" title="<%=intl._t("Force new Certificate now")%>"><%=intl._t("Modify")%></button>
800            </td>
801        </tr>
802<%
803   **********************/
804            int currentSigType = editBean.getSigType(curTunnel, tunnelType);
805            if (true /* editBean.isAdvanced() */ ) {
806                String disabled = editBean.canChangeSigType(curTunnel) ? "" : " disabled=\"disabled\" ";
807%>
808        <tr>
809            <th colspan="2">
810                <%=intl._t("Signature type")%> <%-- (<%=intl._t("Experts only! Changes B32!")%>) --%>
811            </th>
812        </tr><tr>
813            <td colspan="2">
814                <select id="sigType" name="sigType" class="selectbox">
815                    <option title="<%=intl._t("Legacy option (deprecated), provided for backward compatibility")%>" value="0" <%=(currentSigType==0 ? " selected=\"selected\"" : disabled)%> >
816                    DSA-SHA1</option>
817<%           if (editBean.isSigTypeAvailable(1)) { %>
818                    <option value="1" <%=(currentSigType==1 ? " selected=\"selected\"" : disabled)%> >
819                    ECDSA-P256</option>
820<%            }
821              if (editBean.isSigTypeAvailable(2)) { %>
822                    <option value="2" <%=(currentSigType==2 ? " selected=\"selected\"" : disabled)%> >
823                    ECDSA-P384</option>
824<%            }
825              if (editBean.isSigTypeAvailable(3)) { %>
826                    <option value="3" <%=(currentSigType==3 ? " selected=\"selected\"" : disabled)%> >
827                    ECDSA-P521</option>
828<%            }
829              if (editBean.isSigTypeAvailable(7)) { %>
830                    <option title="<%=intl._t("This is the default, recommended option")%>" value="7" <%=(currentSigType==7 ? " selected=\"selected\"" : disabled)%> >
831                    Ed25519-SHA-512</option>
832<%            }
833              if (editBean.isSigTypeAvailable(11)) { %>
834                    <option title="<%=intl._t("Experimental")%>" value="11" <%=(currentSigType==11 ? " selected=\"selected\"" : disabled)%> >
835                    Red25519-SHA-512</option>
836<%            }   // isAvailable
837%>
838                </select>
839            </td>
840        </tr>
841<%          } // isAdvanced
842
843            /* alternate dest, only if current dest is set and is DSA_SHA1 */
844
845            if (currentSigType == 0 && !"".equals(b64) && !"streamrserver".equals(tunnelType)) {
846%>
847        <tr>
848            <th colspan="2">
849                <%=intl._t("Alternate private key file")%> (Ed25519-SHA-512)
850            </th>
851        </tr><tr>
852            <td colspan="2">
853                <input type="text" class="freetext" size="30" id="altPrivKeyFile" name="altPrivKeyFile" title="<%=intl._t("Path to Private Key File")%>" value="<%=editBean.getAltPrivateKeyFile(curTunnel)%>" />
854            </td>
855        </tr>
856<%
857              String ab64 = editBean.getAltDestinationBase64(curTunnel);
858              if (!"".equals(ab64)) {
859%>
860        <tr>
861            <th colspan="2">
862                <%=intl._t("Alternate local destination")%>
863            </th>
864        </tr><tr>
865            <td colspan="2">
866                <div class="displayText" title="<%=intl._t("Read Only: Alternate Local Destination")%>" onblur="resetScrollLeft(this)"><%=ab64%></div>
867            </td>
868        </tr><tr>
869            <td colspan="2">
870                <%=editBean.getAltDestHashBase32(curTunnel)%>
871            </td>
872        </tr>
873<%
874                ab64 = ab64.replace("=", "%3d");
875                String name = editBean.getSpoofedHost(curTunnel);
876                if (name == null || name.equals(""))
877                    name = editBean.getTunnelName(curTunnel);
878                // mysite.i2p is set in the installed i2ptunnel.config
879                if (name != null && !name.equals("") && !name.equals("mysite.i2p") && !name.contains(" ") && name.endsWith(".i2p")) {
880%>
881        <tr>
882            <td class="buttons" colspan="2">
883<%
884                    if (hasImagegen) {
885%>
886              <a class="control" title="<%=intl._t("Generate QR Code")%>" href="/imagegen/qr?s=320&amp;t=<%=name%>&amp;c=http%3a%2f%2f<%=name%>%2f%3fi2paddresshelper%3d<%=ab64%>" target="_top"><%=intl._t("Generate QR Code")%></a>
887<%
888                    }
889                    if (hasSusiDNS) {
890%>
891              <a class="control" title="<%=intl._t("Add to Private addressbook")%>" href="/susidns/addressbook.jsp?book=private&amp;hostname=<%=name%>&amp;destination=<%=ab64%>#add"><%=intl._t("Add to local addressbook")%></a>
892<%
893                    }
894                } else {
895%>
896        <tr>
897            <td colspan="2">
898                <%=intl._t("Note: In order to enable QR code generation or registration authentication, configure the Website Hostname field (for websites) or the Name field (everything else) above with an .i2p suffixed hostname e.g. mynewserver.i2p")%>
899            </td>
900        </tr>
901<%
902                }  // name
903              }  // ab64
904           } // currentSigType
905%>
906        <tr>
907            <th colspan="2">
908                <%=intl._t("Custom options")%>
909            </th>
910        </tr><tr>
911            <td colspan="2">
912                <input type="text" class="freetext" id="customOptions" name="nofilter_customOptions" size="60" title="<%=intl._t("Advanced tunnel, streaming, and I2CP options")%>" value="<%=editBean.getCustomOptions(curTunnel)%>" />
913            </td>
914        </tr><tr>
915            <td class="buttons" colspan="2">
916                    <input type="hidden" value="true" name="removeConfirm" />
917                    <button id="controlCancel" class="control" type="submit" name="action" value=""><%=intl._t("Cancel")%></button>
918                    <button id="controlDelete" <%=(editBean.allowJS() ? "onclick=\"if (!confirm('Are you sure you want to delete?')) { return false; }\" " : "")%>class="control" type="submit" name="action" value="Delete this proxy" title="<%=intl._t("Delete this Proxy (cannot be undone)")%>"><%=intl._t("Delete")%></button>
919                    <button id="controlSave" class="control" type="submit" name="action" value="Save changes"><%=intl._t("Save")%></button>
920            </td>
921        </tr>
922</table>
Note: See TracBrowser for help on using the repository browser.