Change from jsp to java servlet
Start controller from servlet, not clients.config, to avoid class loader issues Fix webapps.config location Fix console link Fix classpath issues Add status info using TorConfig Requires RouterAppManager fix in i2p.i2p.zzz.outproxy Bump to 0.2
This commit is contained in:
@ -12,7 +12,7 @@
|
||||
<target name="plugin" depends="war">
|
||||
<!-- get version number -->
|
||||
<buildnumber file="scripts/build.number" />
|
||||
<property name="release.number" value="1.0.0-0.1" />
|
||||
<property name="release.number" value="1.0.0-0.2" />
|
||||
|
||||
<!-- make the update xpi2p -->
|
||||
<copy file="LICENSE.txt" todir="plugin/" overwrite="true" />
|
||||
|
@ -1,6 +1,3 @@
|
||||
clientApp.0.main=net.i2p.orchid.OrchidController
|
||||
clientApp.0.name=Orchid
|
||||
clientApp.0.args=$PLUGIN
|
||||
clientApp.0.delay=60
|
||||
clientApp.0.startOnLoad=true
|
||||
clientApp.0.classpath=$PLUGIN/lib/orchid.jar,$PLUGIN/lib/xmlrpc-commons.jar,$PLUGIND/lib/xmlrpc-client.jar
|
||||
# alpha versions of the plugin started the controller in clients.config;
|
||||
# it is now started by the servlet, so bundle an empty file here to
|
||||
# overwrite and prevent double-instantiation
|
||||
|
1
plugin/console/webapps.config
Normal file
1
plugin/console/webapps.config
Normal file
@ -0,0 +1 @@
|
||||
webapps.orchid.classpath=$PLUGIN/lib/orchid.jar,$PLUGIN/lib/xmlrpc-commons.jar,$PLUGIN/lib/xmlrpc-client.jar
|
@ -1 +0,0 @@
|
||||
webapps.orchid.classpath=$I2P/lib/orchid.jar,$I2P/lib/xmlrpc-commons.jar,$PLUGIN/lib/xmlrpc-client.jar
|
@ -1,14 +1,12 @@
|
||||
name=orchid
|
||||
signer=zzz-plugin@mail.i2p
|
||||
consoleLinkName=Orchid
|
||||
consoleLinkURL=/orchid
|
||||
consoleLinkURL=/orchid/
|
||||
description=Tor Outproxy
|
||||
author=zzz
|
||||
updateURL=http://stats.i2p/i2p/plugins/orchid-update.xpi2p
|
||||
websiteURL=http://zzz.i2p/forums/16
|
||||
license=BSD
|
||||
min-jetty-version=7
|
||||
# TODO higher for hook
|
||||
# TODO will be 0.9.11 for i2ptunnel hooks
|
||||
min-i2p-version=0.9.9
|
||||
# ???
|
||||
min-java-version=1.5
|
||||
|
@ -7,11 +7,8 @@
|
||||
<pathelement path="${java.class.path}" />
|
||||
<pathelement location="${i2plib}/i2p.jar" />
|
||||
<pathelement location="${ant.home}/lib/ant.jar"/>
|
||||
<pathelement location="${jettylib}/org.mortbay.jetty.jar"/>
|
||||
<pathelement location="${jettylib}/jasper-runtime.jar" />
|
||||
<pathelement location="${jettylib}/javax.servlet.jar" />
|
||||
<pathelement location="${jettylib}/jetty-util.jar" />
|
||||
<pathelement location="${jettylib}/jetty-xml.jar" />
|
||||
<pathelement location="${jettylib}/commons-logging.jar" />
|
||||
<pathelement location="${jettylib}/commons-el.jar" />
|
||||
<pathelement location="../lib/xmlrpc-client-${xmlrpc.version}.jar" />
|
||||
@ -33,13 +30,13 @@
|
||||
debug="true" deprecation="on" source="1.5" target="1.5"
|
||||
destdir="./build/obj"
|
||||
includeAntRuntime="false"
|
||||
classpath="${i2plib}/i2p.jar:${i2plib}/i2ptunnel.jar:${i2plib}/i2psnark.jar:${i2plib}/mstreaming.jar:${i2plib}/systray.jar:${jettylib}/org.mortbay.jetty.jar:${jettylib}/jetty-util.jar:${jettylib}/jetty-xml.jar:../lib/xmlrpc-client-${xmlrpc.version}.jar:../lib/xmlrpc-common-${xmlrpc.version}.jar" >
|
||||
classpath="${i2plib}/i2p.jar:../lib/xmlrpc-client-${xmlrpc.version}.jar:../lib/xmlrpc-common-${xmlrpc.version}.jar:${jettylib}/javax.servlet.jar" >
|
||||
<compilerarg line="${javac.compilerargs}" />
|
||||
</javac>
|
||||
</target>
|
||||
|
||||
<target name="jar" depends="builddep, compile">
|
||||
<jar destfile="build/orchid.jar" basedir="./build/obj" includes="**/*.class" >
|
||||
<jar destfile="build/orchid.jar" basedir="./build/obj" includes="**/*.class" excludes="**/web/* **/messages_*.class" >
|
||||
</jar>
|
||||
</target>
|
||||
|
||||
@ -62,6 +59,7 @@
|
||||
<arg value="jsp/" />
|
||||
</java>
|
||||
|
||||
<!--
|
||||
<javac
|
||||
debug="true"
|
||||
deprecation="on"
|
||||
@ -72,6 +70,7 @@
|
||||
includeAntRuntime="false"
|
||||
classpathref="jspcp"
|
||||
failonerror="true" />
|
||||
-->
|
||||
|
||||
<copy file="jsp/WEB-INF/web.xml" tofile="build/web.xml" />
|
||||
<loadfile property="jspc.web.fragment" srcfile="build/web-fragment.xml" />
|
||||
@ -82,8 +81,8 @@
|
||||
</target>
|
||||
|
||||
<target name="war" depends="precompilejsp">
|
||||
<copy file="jsp/index.html" todir="build/war" />
|
||||
<war destfile="build/orchid.war.jar" webxml="build/web.xml">
|
||||
<classes dir="./build/obj" includes="**/web/*" />
|
||||
<fileset dir="build/war" />
|
||||
</war>
|
||||
</target>
|
||||
|
@ -24,6 +24,7 @@ import java.util.Locale;
|
||||
import java.util.Properties;
|
||||
|
||||
import com.subgraph.orchid.TorClient;
|
||||
import com.subgraph.orchid.TorConfig;
|
||||
import com.subgraph.orchid.TorInitializationListener;
|
||||
|
||||
import net.i2p.I2PAppContext;
|
||||
@ -213,5 +214,16 @@ public class OrchidController implements ClientApp, TorInitializationListener, O
|
||||
throw ioe;
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized TorConfig getConfig() {
|
||||
if (_client != null)
|
||||
return _client.getConfig();
|
||||
// else load from file
|
||||
return null;
|
||||
}
|
||||
|
||||
public synchronized void saveConfig() {
|
||||
// ...
|
||||
}
|
||||
}
|
||||
|
||||
|
151
src/java/net/i2p/orchid/web/BasicServlet.java
Normal file
151
src/java/net/i2p/orchid/web/BasicServlet.java
Normal file
@ -0,0 +1,151 @@
|
||||
// ========================================================================
|
||||
// Copyright 199-2004 Mort Bay Consulting Pty. Ltd.
|
||||
// ------------------------------------------------------------------------
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
// ========================================================================
|
||||
|
||||
package net.i2p.orchid.web;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
|
||||
import javax.servlet.ServletConfig;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.UnavailableException;
|
||||
import javax.servlet.http.HttpServlet;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import net.i2p.I2PAppContext;
|
||||
import net.i2p.data.ByteArray;
|
||||
import net.i2p.data.DataHelper;
|
||||
import net.i2p.util.ByteCache;
|
||||
import net.i2p.util.Log;
|
||||
import net.i2p.util.SystemVersion;
|
||||
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/**
|
||||
* Based on DefaultServlet from Jetty 6.1.26, heavily simplified
|
||||
* and modified to remove all dependencies on Jetty libs.
|
||||
*
|
||||
* Supports HEAD and GET only, for resources from the .war and local files.
|
||||
* Supports files and resource only.
|
||||
* Supports MIME types with local overrides and additions.
|
||||
* Supports Last-Modified.
|
||||
* Supports single request ranges.
|
||||
*
|
||||
* Does not support directories or "welcome files".
|
||||
* Does not support gzip.
|
||||
* Does not support multiple request ranges.
|
||||
* Does not cache.
|
||||
*
|
||||
* POST returns 405.
|
||||
* Directories return 403.
|
||||
* Jar resources are sent with a long cache directive.
|
||||
*
|
||||
* ------------------------------------------------------------
|
||||
*
|
||||
* The default servlet.
|
||||
* This servlet, normally mapped to /, provides the handling for static
|
||||
* content, OPTION and TRACE methods for the context.
|
||||
* The following initParameters are supported, these can be set
|
||||
* on the servlet itself:
|
||||
* <PRE>
|
||||
*
|
||||
* resourceBase Set to replace the context resource base
|
||||
|
||||
* warBase Path allowed for resource in war
|
||||
*
|
||||
* </PRE>
|
||||
*
|
||||
*
|
||||
* @author Greg Wilkins (gregw)
|
||||
* @author Nigel Canonizado
|
||||
*
|
||||
* @since Jetty 7
|
||||
*/
|
||||
class BasicServlet extends HttpServlet
|
||||
{
|
||||
protected final I2PAppContext _context;
|
||||
protected final Log _log;
|
||||
protected File _resourceBase;
|
||||
private String _warBase;
|
||||
|
||||
/** same as PeerState.PARTSIZE */
|
||||
private static final int BUFSIZE = 16*1024;
|
||||
private ByteCache _cache = ByteCache.getInstance(16, BUFSIZE);
|
||||
|
||||
private static final int WAR_CACHE_CONTROL_SECS = 24*60*60;
|
||||
private static final int FILE_CACHE_CONTROL_SECS = 24*60*60;
|
||||
|
||||
public BasicServlet() {
|
||||
super();
|
||||
_context = I2PAppContext.getGlobalContext();
|
||||
_log = _context.logManager().getLog(getClass());
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
public void init(ServletConfig cfg) throws ServletException {
|
||||
super.init(cfg);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
protected void doPost(HttpServletRequest request, HttpServletResponse response)
|
||||
throws ServletException, IOException
|
||||
{
|
||||
response.sendError(405);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
/* (non-Javadoc)
|
||||
* @see javax.servlet.http.HttpServlet#doTrace(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
||||
*/
|
||||
protected void doTrace(HttpServletRequest request, HttpServletResponse response)
|
||||
throws ServletException, IOException
|
||||
{
|
||||
response.sendError(405);
|
||||
}
|
||||
|
||||
protected void doOptions(HttpServletRequest request, HttpServletResponse response)
|
||||
throws ServletException, IOException
|
||||
{
|
||||
response.sendError(405);
|
||||
}
|
||||
|
||||
protected void doDelete(HttpServletRequest request, HttpServletResponse response)
|
||||
throws ServletException, IOException
|
||||
{
|
||||
response.sendError(405);
|
||||
}
|
||||
|
||||
/**
|
||||
* Simple version of URIUtil.addPaths()
|
||||
* @param path may be null
|
||||
*/
|
||||
protected static String addPaths(String base, String path) {
|
||||
if (path == null)
|
||||
return base;
|
||||
String rv = (new File(base, path)).toString();
|
||||
if (SystemVersion.isWindows())
|
||||
rv = rv.replace("\\", "/");
|
||||
return rv;
|
||||
}
|
||||
}
|
201
src/java/net/i2p/orchid/web/OrchidServlet.java
Normal file
201
src/java/net/i2p/orchid/web/OrchidServlet.java
Normal file
@ -0,0 +1,201 @@
|
||||
package net.i2p.orchid.web;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
|
||||
import javax.servlet.ServletConfig;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import com.subgraph.orchid.TorConfig;
|
||||
|
||||
import net.i2p.app.ClientAppManager;
|
||||
import net.i2p.orchid.OrchidController;
|
||||
import net.i2p.util.I2PAppThread;
|
||||
import net.i2p.util.Translate;
|
||||
|
||||
/**
|
||||
* From base in i2psnark
|
||||
*/
|
||||
public class OrchidServlet extends BasicServlet {
|
||||
/** generally "/orchid" */
|
||||
private String _contextPath;
|
||||
/** generally "orchid" */
|
||||
private String _contextName;
|
||||
private volatile OrchidController _manager;
|
||||
private volatile boolean _isRunning;
|
||||
private static long _nonce;
|
||||
|
||||
private static final String DEFAULT_NAME = "orchid";
|
||||
public static final String PROP_CONFIG_FILE = "orchid.configFile";
|
||||
private static final String DOCTYPE = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n";
|
||||
private static final String FOOTER = "</div></center></body></html>";
|
||||
private static final String BUNDLE = "net.i2p.orchid.messages";
|
||||
|
||||
|
||||
public OrchidServlet() {
|
||||
super();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(ServletConfig cfg) throws ServletException {
|
||||
super.init(cfg);
|
||||
String cpath = getServletContext().getContextPath();
|
||||
_contextPath = cpath == "" ? "/" : cpath;
|
||||
_contextName = cpath == "" ? DEFAULT_NAME : cpath.substring(1).replace("/", "_");
|
||||
_nonce = _context.random().nextLong();
|
||||
_isRunning = true;
|
||||
(new Starter()).start();
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait for the ClientAppManager
|
||||
*/
|
||||
private class Starter extends I2PAppThread {
|
||||
public void run() {
|
||||
File f = new File(_context.getAppDir(), "plugins");
|
||||
f = new File(f, _contextName);
|
||||
String[] args = new String[] { f.toString() };
|
||||
while (_isRunning) {
|
||||
ClientAppManager cam = _context.clientAppManager();
|
||||
if (cam != null) {
|
||||
_manager = new OrchidController(_context, cam, args);
|
||||
_manager.startup();
|
||||
break;
|
||||
} else {
|
||||
try {
|
||||
Thread.sleep(10*1000);
|
||||
} catch (InterruptedException ie) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroy() {
|
||||
_isRunning = false;
|
||||
if (_manager != null)
|
||||
_manager.shutdown();
|
||||
super.destroy();
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle what we can here, calling super.doGet() for the rest.
|
||||
* @since 0.8.3
|
||||
*/
|
||||
@Override
|
||||
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
|
||||
doGetAndPost(request, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle what we can here, calling super.doPost() for the rest.
|
||||
* @since Jetty 7
|
||||
*/
|
||||
@Override
|
||||
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
|
||||
doGetAndPost(request, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle all here
|
||||
*/
|
||||
private void doGetAndPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
|
||||
String method = req.getMethod();
|
||||
// this is the part after /i2psnark
|
||||
String path = req.getServletPath();
|
||||
resp.setHeader("X-Frame-Options", "SAMEORIGIN");
|
||||
|
||||
req.setCharacterEncoding("UTF-8");
|
||||
resp.setCharacterEncoding("UTF-8");
|
||||
resp.setContentType("text/html; charset=UTF-8");
|
||||
|
||||
PrintWriter out = resp.getWriter();
|
||||
out.write(DOCTYPE + "<html>\n" +
|
||||
"<head>\n" +
|
||||
"<title>");
|
||||
out.write(_("Orchid Controller"));
|
||||
out.write("</title>\n");
|
||||
|
||||
out.write("</head>\n");
|
||||
out.write("<body><div>");
|
||||
OrchidController c = _manager;
|
||||
if (c != null) {
|
||||
out.write("Status is: " + c.getState());
|
||||
ClientAppManager cam = _context.clientAppManager();
|
||||
if (cam != null)
|
||||
out.write("<br>Registered? " + (cam.getRegisteredApp("outproxy") != null));
|
||||
else
|
||||
out.write("<br>Not registered, no client manager");
|
||||
TorConfig tc = c.getConfig();
|
||||
if (tc != null)
|
||||
out.write(getHTMLConfig(tc));
|
||||
} else {
|
||||
out.write("Status is: UNINITIALIZED");
|
||||
}
|
||||
out.write(FOOTER);
|
||||
}
|
||||
|
||||
private static String getHTMLConfig(TorConfig tc) {
|
||||
StringBuilder buf = new StringBuilder(1024);
|
||||
buf.append("<p>Configuration");
|
||||
buf.append("<table cellspacing=\"8\">");
|
||||
buf.append("<tr><th>Config</th><th>Value</th></tr>");
|
||||
buf.append("<tr><td>Circuit Build Timeout</td><td>").append(tc.getCircuitBuildTimeout()).append("</tr>");
|
||||
buf.append("<tr><td>Circuit Stream Timeout</td><td>").append(tc.getCircuitStreamTimeout()).append("</tr>");
|
||||
buf.append("<tr><td>Circuit Idle Timeout</td><td>").append(tc.getCircuitIdleTimeout()).append("</tr>");
|
||||
buf.append("<tr><td>New Circuit Period</td><td>").append(tc.getNewCircuitPeriod()).append("</tr>");
|
||||
buf.append("<tr><td>Max Circuit Dirtiness</td><td>").append(tc.getMaxCircuitDirtiness()).append("</tr>");
|
||||
buf.append("<tr><td>Max Client Circuits Pending</td><td>").append(tc.getMaxClientCircuitsPending()).append("</tr>");
|
||||
buf.append("<tr><td>Enforce Distinct Subnets</td><td>").append(tc.getEnforceDistinctSubnets()).append("</tr>");
|
||||
buf.append("<tr><td>Number of Entry Guards</td><td>").append(tc.getNumEntryGuards()).append("</tr>");
|
||||
buf.append("<tr><td>Long Lived Ports</td><td>").append(tc.getLongLivedPorts()).append("</tr>");
|
||||
buf.append("<tr><td>Exclude Nodes</td><td>").append(tc.getExcludeNodes()).append("</tr>");
|
||||
buf.append("<tr><td>Exclude Exit Nodes</td><td>").append(tc.getExcludeExitNodes()).append("</tr>");
|
||||
buf.append("<tr><td>Exit Nodes</td><td>").append(tc.getExitNodes()).append("</tr>");
|
||||
buf.append("<tr><td>Entry Nodes</td><td>").append(tc.getEntryNodes()).append("</tr>");
|
||||
buf.append("<tr><td>Strict Nodes</td><td>").append(tc.getStrictNodes()).append("</tr>");
|
||||
buf.append("<tr><td>Fascist Firewall</td><td>").append(tc.getFascistFirewall()).append("</tr>");
|
||||
buf.append("<tr><td>Firewall Ports</td><td>").append(tc.getFirewallPorts()).append("</tr>");
|
||||
buf.append("<tr><td>Safe Socks</td><td>").append(tc.getSafeSocks()).append("</tr>");
|
||||
buf.append("<tr><td>Safe Logging</td><td>").append(tc.getSafeLogging()).append("</tr>");
|
||||
buf.append("<tr><td>Warn Unsafe Socks</td><td>").append(tc.getWarnUnsafeSocks()).append("</tr>");
|
||||
buf.append("<tr><td>Client Reject Internal Address</td><td>").append(tc.getClientRejectInternalAddress()).append("</tr>");
|
||||
buf.append("<tr><td>Handshake V3 Enabled</td><td>").append(tc.getHandshakeV3Enabled()).append("</tr>");
|
||||
buf.append("<tr><td>Handshake V2 Enabled</td><td>").append(tc.getHandshakeV2Enabled()).append("</tr>");
|
||||
buf.append("<tr><td>Use NTor Handshake</td><td>").append(tc.getUseNTorHandshake()).append("</tr>");
|
||||
buf.append("<tr><td>Use Microdescriptors</td><td>").append(tc.getUseMicrodescriptors()).append("</tr>");
|
||||
buf.append("<tr><td>Use Bridges</td><td>").append(tc.getUseBridges()).append("</tr>");
|
||||
buf.append("<tr><td>Bridges</td><td>").append(tc.getBridges()).append("</tr>");
|
||||
buf.append("</table>");
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
/** translate */
|
||||
private String _(String s) {
|
||||
return Translate.getString(s, _context, BUNDLE);
|
||||
}
|
||||
|
||||
/** translate */
|
||||
private String _(String s, Object o) {
|
||||
return Translate.getString(s, o, _context, BUNDLE);
|
||||
}
|
||||
|
||||
/** translate */
|
||||
private String _(String s, Object o, Object o2) {
|
||||
return Translate.getString(s, o, o2, _context, BUNDLE);
|
||||
}
|
||||
|
||||
/** translate (ngettext) @since 0.7.14 */
|
||||
private String ngettext(String s, String p, int n) {
|
||||
return Translate.getString(n, s, p, _context, BUNDLE);
|
||||
}
|
||||
|
||||
/** dummy for tagging */
|
||||
private static String ngettext(String s, String p) {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
@ -1,11 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
|
||||
|
||||
<servlet>
|
||||
<servlet-name>net.i2p.orchid.web.OrchidServlet</servlet-name>
|
||||
<servlet-class>net.i2p.orchid.web.OrchidServlet</servlet-class>
|
||||
<load-on-startup>1</load-on-startup>
|
||||
</servlet>
|
||||
|
||||
<!-- precompiled servlets -->
|
||||
|
||||
<welcome-file-list>
|
||||
<welcome-file>index.html</welcome-file>
|
||||
<welcome-file>index.jsp</welcome-file>
|
||||
</welcome-file-list>
|
||||
<servlet-mapping>
|
||||
<servlet-name>net.i2p.orchid.web.OrchidServlet</servlet-name>
|
||||
<url-pattern>/</url-pattern>
|
||||
</servlet-mapping>
|
||||
|
||||
<servlet-mapping>
|
||||
<servlet-name>net.i2p.orchid.web.OrchidServlet</servlet-name>
|
||||
<url-pattern>/index.jsp</url-pattern>
|
||||
</servlet-mapping>
|
||||
|
||||
</web-app>
|
||||
|
@ -1,10 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0;url=index.jsp" />
|
||||
<title>zzzot</title>
|
||||
</head>
|
||||
<body>
|
||||
<a href="index.jsp">Enter</a>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,18 +0,0 @@
|
||||
<%@page import="net.i2p.orchid.OrchidController" %>
|
||||
<html>
|
||||
<head>
|
||||
<title>Orchid</title>
|
||||
</head><body style="background-color: #000; color: #c30; font-size: 400%;">
|
||||
<p>
|
||||
orchid
|
||||
<p>
|
||||
start/stop
|
||||
<p>
|
||||
<table cellspacing="8">
|
||||
<tr><td>Status:<td align="right">
|
||||
xxx
|
||||
<tr><td>Also:<td align="right">
|
||||
yyy
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
Reference in New Issue
Block a user