source: apps/i2ptunnel/jsp/index.jsp @ 7d4acb62

Last change on this file since 7d4acb62 was 7d4acb62, checked in by zzz <zzz@…>, 14 months ago

i2ptunnel: Display encrypted b32
Blinding: Allow secret flag without attached secret

  • Property mode set to 100644
File size: 16.0 KB
Line 
1<%
2    // NOTE: Do the header carefully so there is no whitespace before the <?xml... line
3
4    // http://www.crazysquirrel.com/computing/general/form-encoding.jspx
5    if (request.getCharacterEncoding() == null)
6        request.setCharacterEncoding("UTF-8");
7
8    response.setHeader("X-Frame-Options", "SAMEORIGIN");
9    response.setHeader("Content-Security-Policy", "default-src 'self'; style-src 'self' 'unsafe-inline'");
10    response.setHeader("X-XSS-Protection", "1; mode=block");
11    response.setHeader("X-Content-Type-Options", "nosniff");
12    response.setHeader("Referrer-Policy", "no-referrer");
13    response.setHeader("Accept-Ranges", "none");
14
15%><%@page pageEncoding="UTF-8"
16%><%@page trimDirectiveWhitespaces="true"
17%><%@page contentType="text/html" import="net.i2p.i2ptunnel.web.IndexBean"
18%><?xml version="1.0" encoding="UTF-8"?>
19<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
20<jsp:useBean class="net.i2p.i2ptunnel.web.IndexBean" id="indexBean" scope="request" />
21<jsp:setProperty name="indexBean" property="*" />
22<jsp:useBean class="net.i2p.i2ptunnel.ui.Messages" id="intl" scope="request" />
23<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
24<head>
25    <title><%=intl._t("Hidden Services Manager")%></title>
26
27    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
28    <link href="/themes/console/images/favicon.ico" type="image/x-icon" rel="shortcut icon" />
29
30    <% if (indexBean.allowCSS()) {
31  %><link rel="icon" href="<%=indexBean.getTheme()%>images/favicon.ico" />
32    <link href="<%=indexBean.getTheme()%>i2ptunnel.css?<%=net.i2p.CoreVersion.VERSION%>" rel="stylesheet" type="text/css" /> 
33    <% }
34  %>
35</head>
36<body id="tunnelListPage">
37
38<%
39  boolean isInitialized = indexBean.isInitialized();
40  String nextNonce = isInitialized ? net.i2p.i2ptunnel.web.IndexBean.getNextNonce() : null;
41
42  // not synced, oh well
43  int lastID = indexBean.getLastMessageID();
44  String msgs = indexBean.getMessages();
45  if (msgs.length() > 0) {
46%>
47<div class="panel" id="messages">
48    <h2><%=intl._t("Status Messages")%></h2>
49    <table id="statusMessagesTable">
50        <tr>
51            <td id="tunnelMessages">
52        <textarea id="statusMessages" rows="4" cols="60" readonly="readonly"><%=msgs%></textarea>
53            </td>
54        </tr>
55        <tr>
56            <td class="buttons">
57                <a class="control" href="list"><%=intl._t("Refresh")%></a>
58<%
59  if (isInitialized) {
60%>
61                <a class="control" href="list?action=Clear&amp;msgid=<%=lastID%>&amp;nonce=<%=nextNonce%>"><%=intl._t("Clear")%></a>
62<%
63  }  // isInitialized
64%>
65            </td>
66        </tr>
67    </table>
68</div>
69<%
70  }  // !msgs.isEmpty()
71  if (isInitialized) {
72%>
73<div class="panel" id="globalTunnelControl">
74    <h2><%=intl._t("Global Tunnel Control")%></h2>
75    <table>
76        <tr>
77            <td class="buttons">
78                <a class="control" href="wizard"><%=intl._t("Tunnel Wizard")%></a>
79                <a class="control" href="list?nonce=<%=nextNonce%>&amp;action=Stop%20all"><%=intl._t("Stop All")%></a>
80                <a class="control" href="list?nonce=<%=nextNonce%>&amp;action=Start%20all"><%=intl._t("Start All")%></a>
81                <a class="control" href="list?nonce=<%=nextNonce%>&amp;action=Restart%20all"><%=intl._t("Restart All")%></a>
82<%--
83                //this is really bad because it stops and restarts all tunnels, which is probably not what you want
84                <a class="control" href="list?nonce=<%=nextNonce%>&amp;action=Reload%20configuration"><%=intl._t("Reload Config")%></a>
85--%>
86            </td>
87        </tr>
88    </table>
89</div>
90
91<div class="panel" id="servers">
92
93    <h2><%=intl._t("I2P Hidden Services")%></h2>
94
95<table id="serverTunnels">
96    <tr>
97        <th class="tunnelName"><%=intl._t("Name")%></th>
98        <th class="tunnelType"><%=intl._t("Type")%></th>
99        <th class="tunnelLocation"><%=intl._t("Points at")%></th>
100        <th class="tunnelPreview"><%=intl._t("Preview")%></th>
101        <th class="tunnelStatus"><%=intl._t("Status")%></th>
102        <th class="tunnelControl"><%=intl._t("Control")%></th>
103    </tr>
104
105        <%
106        for (int curServer = 0; curServer < indexBean.getTunnelCount(); curServer++) {
107            if (indexBean.isClient(curServer)) continue;
108      %>
109
110
111    <tr class="tunnelProperties">
112        <td class="tunnelName">
113            <a href="edit?tunnel=<%=curServer%>" title="<%=intl._t("Edit Server Tunnel Settings for")%>&nbsp;<%=indexBean.getTunnelName(curServer)%>"><%=indexBean.getTunnelName(curServer)%></a>
114        </td>
115        <td class="tunnelType"><%=indexBean.getTunnelType(curServer)%></td>
116        <td class="tunnelLocation">
117        <%
118            if (indexBean.isServerTargetLinkValid(curServer)) {
119                if (indexBean.isSSLEnabled(curServer)) { %>
120                    <a href="https://<%=indexBean.getServerTarget(curServer)%>/" title="<%=intl._t("Test HTTPS server, bypassing I2P")%>" target="_top"><%=indexBean.getServerTarget(curServer)%> SSL</a>
121             <% } else { %>
122                    <a href="http://<%=indexBean.getServerTarget(curServer)%>/" title="<%=intl._t("Test HTTP server, bypassing I2P")%>" target="_top"><%=indexBean.getServerTarget(curServer)%></a>
123        <%
124                }
125            } else {
126          %><%=indexBean.getServerTarget(curServer)%>
127        <%
128                if (indexBean.isSSLEnabled(curServer)) { %>
129                    SSL
130        <%
131                }
132            }
133          %>
134        </td>
135        <td class="tunnelPreview">
136            <%
137            if (("httpserver".equals(indexBean.getInternalType(curServer)) || ("httpbidirserver".equals(indexBean.getInternalType(curServer)))) && indexBean.getTunnelStatus(curServer) == IndexBean.RUNNING) {
138          %>
139            <a class="control" title="<%=intl._t("Test HTTP server through I2P")%>" href="http://<%=indexBean.getDestHashBase32(curServer)%>" target="_top"><%=intl._t("Preview")%></a>
140            <%
141            } else if (indexBean.getTunnelStatus(curServer) == IndexBean.RUNNING) {
142          %><%=intl._t("Base32 Address")%>:<%=indexBean.getDestHashBase32(curServer)%>
143        <%
144            } else {
145          %><%=intl._t("No Preview")%>
146        <%
147            }
148      %>
149        </td>
150        <td class="tunnelStatus">
151            <%
152            switch (indexBean.getTunnelStatus(curServer)) {
153                case IndexBean.STARTING:
154          %><div class="statusStarting text" title="<%=intl._t("Starting...")%>"><%=intl._t("Starting...")%></div>
155        </td>
156        <td class="tunnelControl">
157            <a class="control" title="<%=intl._t("Stop this Tunnel")%>" href="list?nonce=<%=nextNonce%>&amp;action=stop&amp;tunnel=<%=curServer%>"><%=intl._t("Stop")%></a>
158        <%
159                break;
160                case IndexBean.RUNNING:
161          %><div class="statusRunning text" title="<%=intl._t("Running")%>"><%=intl._t("Running")%></div>
162        </td>
163        <td class="tunnelControl">
164            <a class="control" title="<%=intl._t("Stop this Tunnel")%>" href="list?nonce=<%=nextNonce%>&amp;action=stop&amp;tunnel=<%=curServer%>"><%=intl._t("Stop")%></a>
165        <%
166                break;
167                case IndexBean.NOT_RUNNING:
168          %><div class="statusNotRunning text" title="<%=intl._t("Stopped")%>"><%=intl._t("Stopped")%></div>
169        </td>
170        <td class="tunnelControl">
171            <a class="control" title="<%=intl._t("Start this Tunnel")%>" href="list?nonce=<%=nextNonce%>&amp;action=start&amp;tunnel=<%=curServer%>"><%=intl._t("Start")%></a>
172        <%
173                break;
174            }
175      %>
176        </td>
177    </tr>
178
179    <tr>
180        <td class="tunnelDestination" colspan="6">
181            <span class="tunnelDestinationLabel">
182         <%
183                String name = indexBean.getSpoofedHost(curServer);
184                    if (name == null || name.equals("")) {
185                        name = indexBean.getTunnelName(curServer);
186                        out.write("<b>");
187                        out.write(intl._t("Destination"));
188                        out.write(":</b></span> ");
189                        out.write(indexBean.getDestHashBase32(curServer));
190                   } else {
191                       out.write("<b>");
192                       out.write(intl._t("Hostname"));
193                       out.write(":</b></span> ");
194                       out.write(name);
195                   }
196          %>
197        </td>
198    </tr>
199
200    <%
201            String encName = indexBean.getEncryptedBase32(curServer);
202            if (encName != null && encName.length() > 0) {
203      %>
204    <tr>
205        <td class="tunnelDestination" colspan="6">
206            <span class="tunnelDestinationLabel"><b><%=intl._t("Encrypted")%>:</b></span>
207            <%=encName%>
208        </td>
209    </tr>
210    <%
211            } // encName
212      %>
213
214    <tr>
215        <td class="tunnelDescription" colspan="6">
216            <span class="tunnelDestinationLabel"><b><%=intl._t("Description")%>:</b></span>
217            <%=indexBean.getTunnelDescription(curServer)%>
218        </td>
219    </tr>
220
221        <%
222        } // for loop
223      %>
224
225    <tr>
226        <td class="newTunnel" colspan="6">
227           <form id="addNewServerTunnelForm" action="edit">
228               <b><%=intl._t("New hidden service")%>:</b>&nbsp;
229                    <select name="type">
230                        <option value="httpserver">HTTP</option>
231                        <option value="server"><%=intl._t("Standard")%></option>
232                        <option value="httpbidirserver">HTTP bidir</option>
233                        <option value="ircserver">IRC</option>
234                        <option value="streamrserver">Streamr</option>
235                    </select>
236                    <input class="control" type="submit" value="<%=intl._t("Create")%>" />
237            </form>
238        </td>
239    </tr>
240</table>
241</div>
242
243<div class="panel" id="clients">
244    <h2><%=intl._t("I2P Client Tunnels")%></h2>
245
246<table id="clientTunnels">
247    <tr>
248        <th class="tunnelName"><%=intl._t("Name")%></th>
249        <th class="tunnelType"><%=intl._t("Type")%></th>
250        <th class="tunnelInterface"><%=intl._t("Interface")%></th>
251        <th class="tunnelPort"><%=intl._t("Port")%></th>
252        <th class="tunnelStatus"><%=intl._t("Status")%></th>
253        <th class="tunnelControl"><%=intl._t("Control")%></th>
254    </tr>
255
256        <%
257        for (int curClient = 0; curClient < indexBean.getTunnelCount(); curClient++) {
258            if (!indexBean.isClient(curClient)) continue;
259      %>
260
261
262    <tr class="tunnelProperties">
263        <td class="tunnelName">
264            <a href="edit?tunnel=<%=curClient%>" title="<%=intl._t("Edit Tunnel Settings for")%>&nbsp;<%=indexBean.getTunnelName(curClient)%>"><%=indexBean.getTunnelName(curClient)%></a>
265        </td>
266
267        <td class="tunnelType"><%=indexBean.getTunnelType(curClient)%></td>
268        <td class="tunnelInterface">
269         <%
270               /* should only happen for streamr client */
271               String cHost= indexBean.getClientInterface(curClient);
272               if (cHost == null || "".equals(cHost)) {
273                   out.write("<font color=\"red\">");
274                   out.write(intl._t("Host not set"));
275                   out.write("</font>");
276               } else {
277                   out.write(cHost);
278               }
279          %>
280        </td>
281        <td class="tunnelPort">
282         <%
283               String cPort= indexBean.getClientPort2(curClient);
284               out.write(cPort);
285               if (indexBean.isSSLEnabled(curClient))
286                   out.write(" SSL");
287          %>
288        </td>
289        <td class="tunnelStatus">
290            <%
291            switch (indexBean.getTunnelStatus(curClient)) {
292                case IndexBean.STARTING:
293          %><div class="statusStarting text" title="<%=intl._t("Starting...")%>"><%=intl._t("Starting...")%></div>
294        </td>
295        <td class="tunnelControl">
296            <a class="control" title="<%=intl._t("Stop this Tunnel")%>" href="list?nonce=<%=nextNonce%>&amp;action=stop&amp;tunnel=<%=curClient%>"><%=intl._t("Stop")%></a>
297        <%
298                break;
299                case IndexBean.STANDBY:
300          %><div class="statusStarting text" title="<%=intl._t("Standby")%>"><%=intl._t("Standby")%></div>
301        </td>
302        <td class="tunnelControl">
303            <a class="control" title="Stop this Tunnel" href="list?nonce=<%=nextNonce%>&amp;action=stop&amp;tunnel=<%=curClient%>"><%=intl._t("Stop")%></a>
304        <%
305                break;
306                case IndexBean.RUNNING:
307          %><div class="statusRunning text" title="<%=intl._t("Running")%>"><%=intl._t("Running")%></div>
308        </td>
309        <td class="tunnelControl">
310            <a class="control" title="Stop this Tunnel" href="list?nonce=<%=nextNonce%>&amp;action=stop&amp;tunnel=<%=curClient%>"><%=intl._t("Stop")%></a>
311        <%
312                break;
313                case IndexBean.NOT_RUNNING:
314          %><div class="statusNotRunning text" title="<%=intl._t("Stopped")%>"><%=intl._t("Stopped")%></div>
315        </td>
316        <td class="tunnelControl">
317            <a class="control" title="<%=intl._t("Start this Tunnel")%>" href="list?nonce=<%=nextNonce%>&amp;action=start&amp;tunnel=<%=curClient%>"><%=intl._t("Start")%></a>
318        <%
319                break;
320            }
321      %>
322        </td>
323    </tr>
324    <tr>
325        <td class="tunnelDestination" colspan="6">
326            <span class="tunnelDestinationLabel">
327            <% if ("httpclient".equals(indexBean.getInternalType(curClient)) || "connectclient".equals(indexBean.getInternalType(curClient)) ||
328                   "sockstunnel".equals(indexBean.getInternalType(curClient)) || "socksirctunnel".equals(indexBean.getInternalType(curClient))) { %>
329                <b><%=intl._t("Outproxy")%>:</b>
330            <% } else { %>
331                <b><%=intl._t("Destination")%>:</b>
332            <% } %>
333</span>
334            <%
335               if (indexBean.getIsUsingOutproxyPlugin(curClient)) {
336                   %><%=intl._t("internal plugin")%><%
337               } else {
338                   String cdest = indexBean.getClientDestination(curClient);
339                   if (cdest.length() > 70) { // Probably a B64 (a B32 is 60 chars) so truncate
340                       %><%=cdest.substring(0, 45)%>&hellip;<%=cdest.substring(cdest.length() - 15, cdest.length())%><%
341                   } else if (cdest.length() > 0) {
342                       %><%=cdest%><%
343                   } else {
344                       %><i><%=intl._t("none")%></i><%
345                   }
346               } %>
347        </td>
348    </tr>
349        <% /* TODO SSL outproxy for httpclient if plugin not present */ %>
350    <tr>
351        <td class="tunnelDescription" colspan="6">
352            <span class="tunnelDescriptionLabel"><b><%=intl._t("Description")%>:</b></span>
353            <%=indexBean.getTunnelDescription(curClient)%>
354        </td>
355    </tr>
356        <%
357        }
358      %>
359    <tr>
360        <td class="newTunnel" colspan="6">
361            <form id="addNewClientTunnelForm" action="edit">
362                <b><%=intl._t("New client tunnel")%>:</b>&nbsp;
363                    <select name="type">
364                        <option value="client"><%=intl._t("Standard")%></option>
365                        <option value="httpclient">HTTP/CONNECT</option>
366                        <option value="ircclient">IRC</option>
367                        <option value="sockstunnel">SOCKS 4/4a/5</option>
368                        <option value="socksirctunnel">SOCKS IRC</option>
369                        <option value="connectclient">CONNECT</option>
370                        <option value="streamrclient">Streamr</option>
371                    </select>
372                    <input class="control" type="submit" value="<%=intl._t("Create")%>" />
373            </form>
374        </td>
375    </tr>
376</table>
377</div>
378
379<%
380
381  }  // isInitialized()
382
383%>
384
385</body>
386</html>
Note: See TracBrowser for help on using the repository browser.