diff --git a/apps/susidns/readme.txt b/apps/susidns/readme.txt new file mode 100644 index 0000000000000000000000000000000000000000..fe8de7107b7ea5cb3555540cdd1112c13562160e --- /dev/null +++ b/apps/susidns/readme.txt @@ -0,0 +1,4 @@ +The src/ dir contains susidns 0.13 retrieved from http://susi.i2p/ on 2005/09/15 +The contents are released under GPL. Please see http://susi.i2p/ for more info +The paths in the src/build.xml were updated to reference jars in the i2p +source tree. diff --git a/apps/susidns/src/WEB-INF/lib/jstl.jar b/apps/susidns/src/WEB-INF/lib/jstl.jar new file mode 100644 index 0000000000000000000000000000000000000000..893b4dd1dc99f6f23502f645b36fb5c9e6a39382 Binary files /dev/null and b/apps/susidns/src/WEB-INF/lib/jstl.jar differ diff --git a/apps/susidns/src/WEB-INF/lib/standard.jar b/apps/susidns/src/WEB-INF/lib/standard.jar new file mode 100644 index 0000000000000000000000000000000000000000..e84c1a23ca74575bca6e8ee5171c68727e906d06 Binary files /dev/null and b/apps/susidns/src/WEB-INF/lib/standard.jar differ diff --git a/apps/susidns/src/WEB-INF/web-template.xml b/apps/susidns/src/WEB-INF/web-template.xml new file mode 100644 index 0000000000000000000000000000000000000000..94ba90174afd16a7adb780f3a871a3acea34b177 --- /dev/null +++ b/apps/susidns/src/WEB-INF/web-template.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE web-app + PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" + "http://java.sun.com/j2ee/dtds/web-app_2.2.dtd"> +<web-app> + <display-name>susidns</display-name> + <!-- precompiled servlets --> + <session-config> + <session-timeout> + 30 + </session-timeout> + </session-config> + <welcome-file-list> + <welcome-file>index.html</welcome-file> + <welcome-file>index.jsp</welcome-file> + </welcome-file-list> +</web-app> \ No newline at end of file diff --git a/apps/susidns/src/build.xml b/apps/susidns/src/build.xml new file mode 100644 index 0000000000000000000000000000000000000000..d2df7cc08b27d464c8aa221004c5331057df8b31 --- /dev/null +++ b/apps/susidns/src/build.xml @@ -0,0 +1,80 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project name="susidns" default="all" basedir="."> + <property name="jetty" value="../../jetty/" /> + <property name="project" value="susidns" /> + <property name="src" value="java/src" /> + <property name="bin" value="./WEB-INF/classes" /> + <property name="lib" value="${jetty}/jettylib" /> + <property name="tmp" value="./tmp" /> + <property name="jsp" value="./jsp" /> + <path id="cp"> + <pathelement path="${classpath}" /> + <pathelement location="${bin}" /> + <pathelement location="${lib}/javax.servlet.jar"/> + <pathelement location="${lib}/org.mortbay.jetty.jar"/> + <pathelement location="WEB-INF/lib/jstl.jar" /> + <pathelement location="WEB-INF/lib/standard.jar" /> + <pathelement location="${lib}/jasper-compiler.jar" /> + <pathelement location="${lib}/jasper-runtime.jar" /> + <pathelement location="${lib}/javax.servlet.jar" /> + <pathelement location="${lib}/commons-logging.jar" /> + <pathelement location="${lib}/commons-el.jar" /> + <pathelement location="${lib}/ant.jar" /> + <pathelement location="../../../core/java/build/i2p.jar" /> + </path> + <target name="compile"> + <mkdir dir="${bin}" /> + <javac debug="true" deprecation="on" source="1.3" target="1.3" + classpathref="cp" destdir="${bin}" srcdir="${src}" includes="**/*.java" /> + </target> + <target name="precompilejsp"> + <delete file="WEB-INF/web-fragment.xml" /> + <delete file="WEB-INF/web-out.xml" /> + <mkdir dir="${tmp}" /> + <java classname="org.apache.jasper.JspC" fork="true" classpathref="cp"> + <arg value="-d" /> + <arg value="WEB-INF/classes" /> + <arg value="-v" /> + <arg value="-p" /> + <arg value="i2p.susi.dns.jsp" /> + <arg value="-webinc" /> + <arg value="WEB-INF/web-fragment.xml" /> + <arg value="-webapp" /> + <arg value="./jsp" /> + </java> + <javac debug="true" deprecation="on" source="1.3" target="1.3" + destdir="${bin}" srcdir="./WEB-INF/classes" includes="**/*.java" classpathref="cp"> + </javac> + <copy file="WEB-INF/web-template.xml" tofile="WEB-INF/web-out.xml" /> + <loadfile property="jspc.web.fragment" srcfile="WEB-INF/web-fragment.xml" /> + <replace file="WEB-INF//web-out.xml"> + <replacefilter token="<!-- precompiled servlets -->" value="${jspc.web.fragment}" /> + </replace> + </target> + <target name="all" depends="compile,precompilejsp,war"/> + <target name="war"> + <war destfile="${project}.war" webxml="WEB-INF/web-out.xml"> + <fileset dir="."> + <include name="WEB-INF/**/*.class"/> + <include name="WEB-INF/lib/*.jar"/> + <include name="${src}/**/*.java"/> + <include name="jsp/*.jsp"/> + <include name="images/*.png"/> + <include name="css.css"/> + <include name="index.html"/> + <include name="build.xml"/> + <include name="WEB-INF/web-template.xml"/> + <include name="WEB-INF/web-out.xml"/> + <include name="WEB-INF/classes/${project}.properties"/> + </fileset> + </war> + </target> + <target name="clean"> + <delete file="susidns.war" /> + <delete> + <fileset dir="." includes="**/*.class" /> + <fileset dir="." includes="tmp" /> + </delete> + </target> + <target name="distclean" depends="clean" /> +</project> diff --git a/apps/susidns/src/css.css b/apps/susidns/src/css.css new file mode 100644 index 0000000000000000000000000000000000000000..74f0b6605273e48ae01bcc24370f251091bfd4b6 --- /dev/null +++ b/apps/susidns/src/css.css @@ -0,0 +1,94 @@ +p { + font-family:Verdana,Tahoma,Arial,Helvetica; + color:black; + line-height:12pt; + margin-left:5mm; + margin-right:5mm; + font-size:10pt; +} + +span.addrhlpr { + font-size:7pt; +} + +h3 { + font-family:Verdana,Tahoma,Arial,Helvetica; + color:black; + font-size:12pt; + letter-spacing:2pt; + line-height:18pt; + font-weight:bold; +} + +body { + background-color: white; + color:black; +} + +a { + color:#327BBF; + text-decoration:none; +} + +a:hover { + text-decoration:underline; +} + +th { + font-family:Verdana,Tahoma,Arial,Helvetica; + color:black; + line-height:12pt; + margin-left:5mm; + margin-right:5mm; + font-size:10pt; +} + +td { + font-family:Verdana,Tahoma,Arial,Helvetica; + color:black; + line-height:12pt; + margin-left:5mm; + margin-right:5mm; + font-size:10pt; + vertical-align:center; +} + +li { + font-family:Verdana,Tahoma,Arial,Helvetica; + color:black; + line-height:12pt; + margin-left:5mm; + margin-right:5mm; + font-size:10pt; +} + +tr.list1 { + background-color:#E0E0E0; +} + +tr.list0 { + background-color:white; +} + +p.messages { + background-color:#92CAFF; + color:#327BBF; + color:black; + border-style:dotted; + padding-top: 5mm; + padding-right: 5mm; + padding-bottom: 5mm; + padding-left: 5mm; +} + +#help { + border-style:dotted; + padding-top: 5mm; + padding-right: 5mm; + padding-bottom: 5mm; + padding-left: 5mm; +} + +p.footer { + font-size:7pt; +} \ No newline at end of file diff --git a/apps/susidns/src/images/add.png b/apps/susidns/src/images/add.png new file mode 100644 index 0000000000000000000000000000000000000000..8ea13225a551f454a71f088df341f880bbacf2e4 Binary files /dev/null and b/apps/susidns/src/images/add.png differ diff --git a/apps/susidns/src/images/delete.png b/apps/susidns/src/images/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..736eaf24676b37173e09a874309258ff32194d33 Binary files /dev/null and b/apps/susidns/src/images/delete.png differ diff --git a/apps/susidns/src/images/how.png b/apps/susidns/src/images/how.png new file mode 100644 index 0000000000000000000000000000000000000000..8d1e26192b6e0005b5e94c35a712faf98fc68084 Binary files /dev/null and b/apps/susidns/src/images/how.png differ diff --git a/apps/susidns/src/images/logo.png b/apps/susidns/src/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7cf9954786c84fe0d218c0e6a6361d7ea07673e9 Binary files /dev/null and b/apps/susidns/src/images/logo.png differ diff --git a/apps/susidns/src/images/reload.png b/apps/susidns/src/images/reload.png new file mode 100644 index 0000000000000000000000000000000000000000..b0503ac5b3919a7c30f468d1d57f07de53314b2a Binary files /dev/null and b/apps/susidns/src/images/reload.png differ diff --git a/apps/susidns/src/images/save.png b/apps/susidns/src/images/save.png new file mode 100644 index 0000000000000000000000000000000000000000..0743f3879efe9d0f876da3d7f505b06110c51d22 Binary files /dev/null and b/apps/susidns/src/images/save.png differ diff --git a/apps/susidns/src/images/search.png b/apps/susidns/src/images/search.png new file mode 100644 index 0000000000000000000000000000000000000000..ce46f1d378e455b2ed5d0bc82afd12bcc3878425 Binary files /dev/null and b/apps/susidns/src/images/search.png differ diff --git a/apps/susidns/src/index.html b/apps/susidns/src/index.html new file mode 100644 index 0000000000000000000000000000000000000000..288537ac920c423f55021739e6e6c390364b5907 --- /dev/null +++ b/apps/susidns/src/index.html @@ -0,0 +1,11 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> +<head> +<meta http-equiv="refresh" content="0;url=index.jsp" /> +<title>susidns</title> +</head> +<body> +<a href="index.jsp">Enter</a> +</body> +</html> + \ No newline at end of file diff --git a/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java b/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java new file mode 100644 index 0000000000000000000000000000000000000000..5d91d469ccb4b44b88bb731bd0f13a6b2bd48fd8 --- /dev/null +++ b/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java @@ -0,0 +1,61 @@ +/* + * Created on Sep 02, 2005 + * + * This file is part of susidns project, see http://susi.i2p/ + * + * Copyright (C) 2005 <susi23@mail.i2p> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Revision: 1.1 $ + */ + +package i2p.susi.dns; + +public class AddressBean +{ + private String name, destination; + + public AddressBean() + { + + } + + public AddressBean(String name, String destination) + { + this.name = name; + this.destination = destination; + } + + public String getDestination() + { + return destination; + } + + public void setDestination(String destination) + { + this.destination = destination; + } + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } +} diff --git a/apps/susidns/src/java/src/i2p/susi/dns/AddressByNameSorter.java b/apps/susidns/src/java/src/i2p/susi/dns/AddressByNameSorter.java new file mode 100644 index 0000000000000000000000000000000000000000..1c503a999965de268bb9a3fc85984fc196df5002 --- /dev/null +++ b/apps/susidns/src/java/src/i2p/susi/dns/AddressByNameSorter.java @@ -0,0 +1,44 @@ +/* + * Created on Sep 02, 2005 + * + * This file is part of susidns project, see http://susi.i2p/ + * + * Copyright (C) 2005 <susi23@mail.i2p> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Revision: 1.2 $ + */ + +package i2p.susi.dns; + +import java.util.Comparator; + +public class AddressByNameSorter implements Comparator +{ + public int compare(Object arg0, Object arg1) + { + AddressBean a = (AddressBean)arg0; + AddressBean b = (AddressBean)arg1; + + if( a == null ) + return 1; + + if( b == null ) + return -1; + + return a.getName().compareToIgnoreCase(b.getName()); + } +} diff --git a/apps/susidns/src/java/src/i2p/susi/dns/AddressbookBean.java b/apps/susidns/src/java/src/i2p/susi/dns/AddressbookBean.java new file mode 100644 index 0000000000000000000000000000000000000000..e287fcb4e893d2d2afea273671051f4f3d614252 --- /dev/null +++ b/apps/susidns/src/java/src/i2p/susi/dns/AddressbookBean.java @@ -0,0 +1,262 @@ +/* + * Created on Sep 02, 2005 + * + * This file is part of susidns project, see http://susi.i2p/ + * + * Copyright (C) 2005 <susi23@mail.i2p> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Revision: 1.7 $ + */ + +package i2p.susi.dns; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.Properties; + +public class AddressbookBean +{ + private String book, action, serial, lastSerial, filter, search, hostname, destination; + private Properties properties, addressbook; + private int trClass; + private LinkedList deletionMarks; + private static Comparator sorter; + + static { + sorter = new AddressByNameSorter(); + } + public String getSearch() { + return search; + } + public void setSearch(String search) { + this.search = search; + } + public boolean isHasFilter() + { + return filter != null && filter.length() > 0; + } + public void setTrClass(int trClass) { + this.trClass = trClass; + } + public int getTrClass() { + trClass = 1 - trClass; + return trClass; + } + public boolean isIsEmpty() + { + return ! isNotEmpty(); + } + public boolean isNotEmpty() + { + return addressbook != null && addressbook.size() > 0; + } + public AddressbookBean() + { + properties = new Properties(); + deletionMarks = new LinkedList(); + } + private long configLastLoaded = 0; + private void loadConfig() + { + long currentTime = System.currentTimeMillis(); + + if( properties.size() > 0 && currentTime - configLastLoaded < 10000 ) + return; + + try { + properties.clear(); + properties.load( new FileInputStream( ConfigBean.configFileName ) ); + configLastLoaded = currentTime; + } + catch (Exception e) { + Debug.debug( e.getClass().getName() + ": " + e.getMessage() ); + } + } + public String getFileName() + { + loadConfig(); + String filename = properties.getProperty( getBook() + "_addressbook" ); + return ConfigBean.addressbookPrefix + filename; + } + private Object[] entries; + + public Object[] getEntries() + { + return entries; + } + public String getAction() { + return action; + } + public void setAction(String action) { + this.action = action; + } + public String getBook() + { + if( book == null || ( book.compareToIgnoreCase( "master" ) != 0 && + book.compareToIgnoreCase( "router" ) != 0 ) && + book.compareToIgnoreCase( "published" ) != 0 ) + book = "master"; + + return book; + } + public void setBook(String book) { + this.book = book; + } + public String getSerial() { + lastSerial = "" + Math.random(); + action = null; + return lastSerial; + } + public void setSerial(String serial) { + this.serial = serial; + } + public String getMessages() + { + loadConfig(); + + String message = ""; + + if( action != null ) { + if( lastSerial != null && serial != null && serial.compareTo( lastSerial ) == 0 ) { + boolean changed = false; + if( action.compareToIgnoreCase( "add") == 0 ) { + if( addressbook != null && hostname != null && destination != null ) { + addressbook.put( hostname, destination ); + changed = true; + message += "Destination added.<br/>"; + } + } + if( action.compareToIgnoreCase( "delete" ) == 0 ) { + Iterator it = deletionMarks.iterator(); + int deleted = 0; + while( it.hasNext() ) { + String name = (String)it.next(); + addressbook.remove( name ); + changed = true; + deleted++; + } + if( changed ) { + message += "" + deleted + " destination(s) deleted.<br/>"; + } + } + if( changed ) { + try { + save(); + message += "Addressbook saved.<br/>"; + } catch (Exception e) { + Debug.debug( e.getClass().getName() + ": " + e.getMessage() ); + message += "ERROR: Could not write addressbook file.<br/>"; + } + } + } + else { + message += "Invalid nonce. Are you being spoofed?"; + } + } + + action = null; + + addressbook = new Properties(); + + try { + addressbook.load( new FileInputStream( getFileName() ) ); + LinkedList list = new LinkedList(); + Enumeration e = addressbook.keys(); + while( e.hasMoreElements() ) { + String name = (String)e.nextElement(); + String destination = addressbook.getProperty( name ); + if( filter != null && filter.length() > 0 ) { + if( filter.compareTo( "0-9" ) == 0 ) { + char first = name.charAt(0); + if( first < '0' || first > '9' ) + continue; + } + else if( ! name.toLowerCase().startsWith( filter.toLowerCase() ) ) { + continue; + } + } + if( search != null && search.length() > 0 ) { + if( name.indexOf( search ) == -1 ) { + continue; + } + } + list.addLast( new AddressBean( name, destination ) ); + } + + Object array[] = list.toArray(); + Arrays.sort( array, sorter ); + entries = array; + } + catch (Exception e) { + Debug.debug( e.getClass().getName() + ": " + e.getMessage() ); + } + + if( message.length() > 0 ) + message = "<p class=\"messages\">" + message + "</p>"; + return message; + } + + private void save() throws IOException + { + String filename = properties.getProperty( getBook() + "_addressbook" ); + + addressbook.store( new FileOutputStream( ConfigBean.addressbookPrefix + filename ), null ); + } + public String getFilter() { + return filter; + } + + public boolean isMaster() + { + return getBook().compareToIgnoreCase( "master" ) == 0; + } + public boolean isRouter() + { + return getBook().compareToIgnoreCase( "router" ) == 0; + } + public void setFilter(String filter) { + if( filter != null && ( filter.length() == 0 || filter.compareToIgnoreCase( "none" ) == 0 ) ) { + filter = null; + search = null; + } + this.filter = filter; + } + public String getDestination() { + return destination; + } + public void setDestination(String destination) { + this.destination = destination; + } + public String getHostname() { + return hostname; + } + public void setResetDeletionMarks( String dummy ) { + deletionMarks.clear(); + } + public void setMarkedForDeletion( String name ) { + deletionMarks.addLast( name ); + } + public void setHostname(String hostname) { + this.hostname = hostname; + } +} diff --git a/apps/susidns/src/java/src/i2p/susi/dns/ConfigBean.java b/apps/susidns/src/java/src/i2p/susi/dns/ConfigBean.java new file mode 100644 index 0000000000000000000000000000000000000000..bfcac13ff5157b68e4f004ff9d43d3bbe8b875f9 --- /dev/null +++ b/apps/susidns/src/java/src/i2p/susi/dns/ConfigBean.java @@ -0,0 +1,157 @@ +/* + * Created on Sep 02, 2005 + * + * This file is part of susidns project, see http://susi.i2p/ + * + * Copyright (C) 2005 <susi23@mail.i2p> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Revision: 1.3 $ + */ + +package i2p.susi.dns; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.Serializable; + +public class ConfigBean implements Serializable { + + /* + * as this is not provided as constant in addressbook, we define it here + */ + public static String addressbookPrefix = "addressbook/"; + public static String configFileName = addressbookPrefix + "config.txt"; + + private String action, config; + private String serial, lastSerial; + private boolean saved; + + public static String getConfigFileName() { + return configFileName; + } + + public String getfileName() { + return getConfigFileName(); + } + + public boolean isSaved() { + return saved; + } + + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } + + public String getConfig() + { + if( config != null ) + return config; + + reload(); + + return config; + } + + private void reload() + { + File file = new File( configFileName ); + if( file != null && file.isFile() ) { + StringBuffer buf = new StringBuffer(); + try { + BufferedReader br = new BufferedReader( new FileReader( file ) ); + String line; + while( ( line = br.readLine() ) != null ) { + buf.append( line ); + buf.append( "\n" ); + } + config = buf.toString(); + saved = true; + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + + private void save() + { + File file = new File( configFileName ); + try { + PrintWriter out = new PrintWriter( new FileOutputStream( file ) ); + out.print( config ); + out.flush(); + out.close(); + saved = true; + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + public void setConfig(String config) { + this.config = config; + this.saved = false; + + /* + * as this is a property file we need a newline at the end of the last line! + */ + if( ! this.config.endsWith( "\n" ) ) { + this.config += "\n"; + } + } + public String getMessages() { + String message = ""; + if( action != null ) { + if( lastSerial != null && serial != null && serial.compareTo( lastSerial ) == 0 ) { + if( action.compareToIgnoreCase( "save") == 0 ) { + save(); + message = "Configuration saved."; + } + else if( action.compareToIgnoreCase( "reload") == 0 ) { + reload(); + message = "Configuration reloaded."; + } + } + else { + message = "Invalid nonce. Are you being spoofed?"; + } + } + if( message.length() > 0 ) + message = "<p class=\"messages\">" + message + "</p>"; + return message; + } + public String getSerial() + { + lastSerial = "" + Math.random(); + action = null; + return lastSerial; + } + public void setSerial(String serial ) { + this.serial = serial; + } +} diff --git a/apps/susidns/src/java/src/i2p/susi/dns/Debug.java b/apps/susidns/src/java/src/i2p/susi/dns/Debug.java new file mode 100644 index 0000000000000000000000000000000000000000..977f7caded0148a45b9a11783c3a009943ea8359 --- /dev/null +++ b/apps/susidns/src/java/src/i2p/susi/dns/Debug.java @@ -0,0 +1,56 @@ +/* + * Created on Sep 02, 2005 + * + * This file is part of susidns project, see http://susi.i2p/ + * + * Copyright (C) 2005 <susi23@mail.i2p> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Revision: 1.1 $ + */ + +package i2p.susi.dns; + +import net.i2p.I2PAppContext; +import net.i2p.util.Log; + +public class Debug +{ + private static Log _log; + private static I2PAppContext _context; + + static + { + try { + _context = I2PAppContext.getGlobalContext(); // new I2PAppContext(); + _log = _context.logManager().getLog(Debug.class); + } + catch( NoClassDefFoundError e ) { + _context = null; + _log = null; + } + } + + public static void debug( String msg ) + { + if( _log != null ) { + _log.debug( msg ); + } + else { + System.err.println( "DEBUG: [susidns] " + msg ); + } + } +} diff --git a/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java b/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java new file mode 100644 index 0000000000000000000000000000000000000000..2fb04b00a3000ddcd61c67736ad8bd51c4f19221 --- /dev/null +++ b/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java @@ -0,0 +1,171 @@ +/* + * Created on Sep 02, 2005 + * + * This file is part of susidns project, see http://susi.i2p/ + * + * Copyright (C) 2005 <susi23@mail.i2p> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Revision: 1.3 $ + */ + +package i2p.susi.dns; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.Properties; + +public class SubscriptionsBean +{ + private String action, fileName, content, serial, lastSerial; + private boolean saved; + + Properties properties; + + public SubscriptionsBean() + { + properties = new Properties(); + } + private long configLastLoaded = 0; + private void loadConfig() + { + long currentTime = System.currentTimeMillis(); + + if( properties.size() > 0 && currentTime - configLastLoaded < 10000 ) + return; + + try { + properties.clear(); + properties.load( new FileInputStream( ConfigBean.configFileName ) ); + configLastLoaded = currentTime; + } + catch (Exception e) { + Debug.debug( e.getClass().getName() + ": " + e.getMessage() ); + } + } + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } + + public String getFileName() + { + loadConfig(); + + fileName = ConfigBean.addressbookPrefix + properties.getProperty( "subscriptions", "subscriptions.txt" ); + + return fileName; + } + private void reload() + { + File file = new File( getFileName() ); + if( file != null && file.isFile() ) { + StringBuffer buf = new StringBuffer(); + try { + BufferedReader br = new BufferedReader( new FileReader( file ) ); + String line; + while( ( line = br.readLine() ) != null ) { + buf.append( line ); + buf.append( "\n" ); + } + content = buf.toString(); + saved = true; + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + + private void save() + { + File file = new File( getFileName() ); + try { + PrintWriter out = new PrintWriter( new FileOutputStream( file ) ); + out.print( content ); + out.flush(); + out.close(); + saved = true; + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + public String getMessages() { + String message = ""; + if( action != null ) { + if( lastSerial != null && serial != null && serial.compareTo( lastSerial ) == 0 ) { + if( action.compareToIgnoreCase( "save") == 0 ) { + save(); + message = "Subscriptions saved."; + } + else if( action.compareToIgnoreCase( "reload") == 0 ) { + reload(); + message = "Subscriptions reloaded."; + } + } + else { + message = "Invalid nonce. Are you being spoofed?"; + } + } + if( message.length() > 0 ) + message = "<p class=\"messages\">" + message + "</p>"; + return message; + } + public String getSerial() + { + lastSerial = "" + Math.random(); + action = null; + return lastSerial; + } + public void setSerial(String serial ) { + this.serial = serial; + } + public void setContent(String content) { + this.content = content; + this.saved = false; + + /* + * as this is a property file we need a newline at the end of the last line! + */ + if( ! this.content.endsWith( "\n" ) ) { + this.content += "\n"; + } + } + public String getContent() + { + if( content != null ) + return content; + + reload(); + + return content; + } +} diff --git a/apps/susidns/src/java/src/i2p/susi/dns/VersionBean.java b/apps/susidns/src/java/src/i2p/susi/dns/VersionBean.java new file mode 100644 index 0000000000000000000000000000000000000000..3e7a572e73e6f0add959ae6ee033275c0697e133 --- /dev/null +++ b/apps/susidns/src/java/src/i2p/susi/dns/VersionBean.java @@ -0,0 +1,39 @@ +/* + * Created on Sep 02, 2005 + * + * This file is part of susidns project, see http://susi.i2p/ + * + * Copyright (C) 2005 <susi23@mail.i2p> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Revision: 1.4 $ + */ + +package i2p.susi.dns; + +public class VersionBean { + + private static String version = "0.4"; + private static String url = "http://susi.i2p/?i2paddresshelper=T2DU1KAz3meB0B53U8Y06-I7vHR7XmC0qXAJfLW6b-1L1FVKoySRZz4xazHAwyv2xtRpvKrv6ukLm1tThEW0zQWtZPtX8G6KkzMibD8t7IS~4yw-9VkBtUydyYfsX08AK3v~-egSW8HCXTdyIJVtrETJb337VDUHW-7D4L1JLbwSH4if2ooks6yFTrljK5aVMi-16dZOVvmoyJc3jBqSdK6kraO4gW5-vHTmbLwL498p9nug1KOg1DqgN2GeU5X1QlVrlpFb~IIfdP~O8NT7u-LAjW3jSJsMbLDHMSYTIhC7xmJIiBoi-qk8p6TLynAmvJ7HRvbx4N1EB-uJHyD16wsZkkHyEOfmXbj0ZqLyKEGb3thPwCz-M9v~c2Qt3WbwjXJAtHpjlHkdJ4Fg91cX2oak~JoapnPf6Syw8hko5syf6VVoCYLnrrYyM8oGl8mLclHkj~VCidQNqMSM74IhrHfK6HmRikqtZBexb5M6wfMTTqBvaHURdD21GOpFKYBUAAAA"; + + public String getVersion() { + return version; + } + + public String getUrl() { + return url; + } +} diff --git a/apps/susidns/src/jsp/addressbook.jsp b/apps/susidns/src/jsp/addressbook.jsp new file mode 100644 index 0000000000000000000000000000000000000000..113e1e7d916cc4bcce4142f0aa9c42ad012505e6 --- /dev/null +++ b/apps/susidns/src/jsp/addressbook.jsp @@ -0,0 +1,168 @@ +<% +/* + * Created on Sep 02, 2005 + * + * This file is part of susidns project, see http://susi.i2p/ + * + * Copyright (C) 2005 <susi23@mail.i2p> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Revision: 1.22 $ + */ +%> +<%@ page contentType="text/html"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<jsp:useBean id="version" class="i2p.susi.dns.VersionBean" scope="application" /> +<jsp:useBean id="book" class="i2p.susi.dns.AddressbookBean" scope="session" /> +<jsp:setProperty name="book" property="*" /> +<jsp:setProperty name="book" property="resetDeletionMarks" value="1"/> +<c:forEach items="${paramValues.checked}" var="checked"> +<jsp:setProperty name="book" property="markedForDeletion" value="${checked}"/> +</c:forEach> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> +<head> +<title>${book.book} addressbook - susidns v${version.version}</title> +<link rel="stylesheet" type="text/css" href="css.css"> +</head> +<body> + +<div id="logo"> +<img src="images/logo.png" alt="susidns logo" border="0"/> +</div> + +<div id="navi"> +<p>addressbooks +<a href="addressbook.jsp?book=master">master</a> | +<a href="addressbook.jsp?book=router">router</a> | +<a href="addressbook.jsp?book=published">published</a> * +<a href="subscriptions.jsp">subscriptions</a> * +<a href="config.jsp">configuration</a> +</p> +</div> + +<div id="headline"> +<h3>${book.book} addressbook at ${book.fileName}</h3> +</div> + +<div id="messages">${book.messages}</div> + +<div id="filter"> +<p>Filter: <a href="addressbook.jsp?filter=a">a</a> +<a href="addressbook.jsp?filter=b">b</a> +<a href="addressbook.jsp?filter=c">c</a> +<a href="addressbook.jsp?filter=d">d</a> +<a href="addressbook.jsp?filter=e">e</a> +<a href="addressbook.jsp?filter=f">f</a> +<a href="addressbook.jsp?filter=g">g</a> +<a href="addressbook.jsp?filter=h">h</a> +<a href="addressbook.jsp?filter=i">i</a> +<a href="addressbook.jsp?filter=j">j</a> +<a href="addressbook.jsp?filter=k">k</a> +<a href="addressbook.jsp?filter=l">l</a> +<a href="addressbook.jsp?filter=m">m</a> +<a href="addressbook.jsp?filter=n">n</a> +<a href="addressbook.jsp?filter=o">o</a> +<a href="addressbook.jsp?filter=p">p</a> +<a href="addressbook.jsp?filter=q">q</a> +<a href="addressbook.jsp?filter=r">r</a> +<a href="addressbook.jsp?filter=s">s</a> +<a href="addressbook.jsp?filter=t">t</a> +<a href="addressbook.jsp?filter=u">u</a> +<a href="addressbook.jsp?filter=v">v</a> +<a href="addressbook.jsp?filter=w">w</a> +<a href="addressbook.jsp?filter=x">x</a> +<a href="addressbook.jsp?filter=y">y</a> +<a href="addressbook.jsp?filter=z">z</a> +<a href="addressbook.jsp?filter=0-9">0-9</a> +<a href="addressbook.jsp?filter=none">all</a></p> +<c:if test="${book.hasFilter}"> +<p>Current filter: ${book.filter}</p> +</c:if> +</div> + +<form method="POST" action="addressbook.jsp"> +<div id="search"> +<table><tr> +<td class="search">Search: <input type="text" name="search" value="${book.search}" size="20" /></td> +<td class="search"><input type="image" src="images/search.png" name="submitsearch" value="search" alt="Search" /></td> +</tr> +</table> +</div> + +</form> + +<form method="POST" action="addressbook.jsp"> +<input type="hidden" name="serial" value="${book.serial}"/> + +<c:if test="${book.notEmpty}"> + +<div id="book"> +<jsp:setProperty name="book" property="trClass" value="0" /> +<table class="book" cellspacing="0" cellpadding="5"> +<tr class="head"> + +<c:if test="${book.master || book.router}"> +<th> </th> +</c:if> + +<th>Name</th> +<th>Destination</th> +</tr> +<c:forEach items="${book.entries}" var="addr"> +<tr class="list${book.trClass}"> +<c:if test="${book.master || book.router}"> +<td class="checkbox"><input type="checkbox" name="checked" value="${addr.name}" alt="Mark for deletion"></td> +</c:if> +<td class="names"><a href="http://${addr.name}/">${addr.name}</a> - +<span class="addrhlpr"><a href="http://${addr.name}/?i2paddresshelper=${addr.destination}">(addrhlpr)</a></span> +</td> +<td class="destinations"><input type="text" name="dest_${addr.name}" value="${addr.destination}" size="20"></td> +</tr> +</c:forEach> +</table> +</div> + +<c:if test="${book.master}||${book.router}"> +<div id="buttons"> +<p class="buttons"><input type="image" name="action" value="delete" src="images/delete.png" alt="Delete checked" /> +</p> +</div> +</c:if> + +</c:if> + +<c:if test="${book.isEmpty}"> +<div id="book"> +<p class="book">The ${book.book} addressbook is empty.</p> +</div> +</c:if> + +<div id="add"> +<p class="add"> +<h3>Add new destination:</h3> +Hostname: <input type="text" name="hostname" value="" size="20"> Destination: <input type="text" name="destination" value="" size="20"><br/> +<input type="image" name="action" value="add" src="images/add.png" alt="Add destination" /> +</p> +</div> + +</form> + +<div id="footer"> +<p class="footer">susidns v${version.version} © <a href="${version.url}">susi</a> 2005</p> +</div> +</body> +</html> diff --git a/apps/susidns/src/jsp/config.jsp b/apps/susidns/src/jsp/config.jsp new file mode 100644 index 0000000000000000000000000000000000000000..938f600096b6fdf06d559198f4def0ea3e635b33 --- /dev/null +++ b/apps/susidns/src/jsp/config.jsp @@ -0,0 +1,96 @@ +<% +/* + * Created on Sep 02, 2005 + * + * This file is part of susidns project, see http://susi.i2p/ + * + * Copyright (C) 2005 <susi23@mail.i2p> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Revision: 1.14 $ + */ +%> +<%@ page contentType="text/html" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<jsp:useBean id="version" class="i2p.susi.dns.VersionBean" scope="application"/> +<jsp:useBean id="cfg" class="i2p.susi.dns.ConfigBean" scope="session"/> +<jsp:setProperty name="cfg" property="*" /> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> +<head> +<title>configuration - susidns v${version.version}</title> +<link rel="stylesheet" type="text/css" href="css.css"> +</head> +<body> +<div id="logo"> +<img src="images/logo.png" alt="susidns logo" border="0"/> +</div> +<div id="navi"> +<p> +addressbooks +<a href="addressbook.jsp?book=master">master</a> | +<a href="addressbook.jsp?book=router">router</a> | +<a href="addressbook.jsp?book=published">published</a> * +<a href="subscriptions.jsp">subscriptions</a> * +<a href="config.jsp">configuration</a> +</p> +</div> +<div id="headline"> +<h3>${cfg.fileName}</h3> +</div> +<div id="messages">${cfg.messages}</div> +<form method="POST" action="config.jsp"> +<div id="config"> +<input type="hidden" name="serial" value="${cfg.serial}" /> +<textarea name="config" rows="10" cols="80">${cfg.config}</textarea> +</div> +<div id="buttons"> +<input type="image" src="images/save.png" name="action" value="save" alt="Save Config"/> +<input type="image" src="images/reload.png" name="action" value="reload" alt="Reload Config"/> +</div> +</form> +<div id="help"> +<h3>Hints</h3> +<ol> +<li>All file or directory paths here are relative to the addressbooks working directory, which normally +is located at $I2P/addressbook/.</li> +<li>If you want to manually add lines to an addressbook, add them to the master addressbook. The router +addressbook and the published addressbook are overwritten by the addressbook application.</li> +<li><b>Important:</b>When you publish your addressbook, <b>ALL</b> destinations appear there, even those +from your master addressbook. Unfortunately the master addressbook points to your userhosts.txt, which was +used for private destinations before. So if you want to keep the destinations in your userhosts.txt secret, +please change the master addressbook to a different file before turning on addressbook publishing.</li> +</ol> +<h3>Options</h3> +<ul> +<li><b>subscriptions</b> - file containing the list of subscriptions URLs (no need to change)</li> +<li><b>update_delay</b> - update interval in hours (no need to change)</li> +<li><b>published_addressbook</b> - your public hosts.txt file (choose a path within your webserver document root)</li> +<li><b>router_addressbook</b> - your hosts.txt (no need to change)</li> +<li><b>master_addressbook</b> - your personal addressbook, it gets never overwritten by the addressbook</li> +<li><b>proxy_port</b> - http port for your eepProxy (no need to change)</li> +<li><b>proxy_host</b> - hostname for your eepProxy (no need to change)</li> +<li><b>should_publish</b> - true/false whether to write the published addressbook</li> +<li><b>etags</b> - file containing the etags header from the fetched subscription URLs (no need to change)</li> +<li><b>last_modified</b> - file containing the modification timestamp for each fetched subscription URL (no need to change)</li> +<li><b>log</b> - file to log activity to (change to /dev/null if you like)</li> +</ul> +</div> +<div id="footer"> +<p class="footer">susidns v${version.version} © <a href="${version.url}">susi</a> 2005 </p> +</div> +</body> +</html> \ No newline at end of file diff --git a/apps/susidns/src/jsp/index.jsp b/apps/susidns/src/jsp/index.jsp new file mode 100644 index 0000000000000000000000000000000000000000..1a29759b326a5837d3ee2858ca2527df4b35068b --- /dev/null +++ b/apps/susidns/src/jsp/index.jsp @@ -0,0 +1,80 @@ +<% +/* + * Created on Sep 02, 2005 + * + * This file is part of susidns project, see http://susi.i2p/ + * + * Copyright (C) 2005 <susi23@mail.i2p> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Revision: 1.1 $ + */ +%> +<%@ page contentType="text/html"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<jsp:useBean id="version" class="i2p.susi.dns.VersionBean" scope="application" /> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> +<head> +<title>introduction - susidns v${version.version}</title> +<link rel="stylesheet" type="text/css" href="css.css"> +</head> +<body> + +<div id="logo"> +<img src="images/logo.png" alt="susidns logo" border="0"/> +</div> + +<div id="navi"> +<p>addressbooks +<a href="addressbook.jsp?book=master">master</a> | +<a href="addressbook.jsp?book=router">router</a> | +<a href="addressbook.jsp?book=published">published</a> * +<a href="subscriptions.jsp">subscriptions</a> * +<a href="config.jsp">configuration</a> +</p> +</div> + +<div id="content"> +<h3>Huh? what addressbook?</h3> +<p> +The addressbook application is part of your i2p installation. It regularly updates your hosts.txt file +from distributed sources. It keeps your hosts.txt up to date, so it automatically contains all new +eepsites announced on <a href="http://orion.i2p">orion</a> +or in the <a href="http://forum.i2p/viewforum.php?f=16">forum</a>. +</p> +<p> +(To speak the truth: In its default configuration the addressbook does not poll +orion, but dev.i2p only. Subscribing to <a href="http://orion.i2p">orion</a> is an easy task, +just add <a href="http://orion.i2p/hosts.txt">http://orion.i2p/hosts.txt</a> to your <a href="subscriptions.jsp">subscriptions</a> file.) +</p> +<p>If you have questions about naming in i2p, there is an excellent <a href="http://forum.i2p.net/viewtopic.php?t=134">introduction</a> +from duck in the forum.</p> +<h3>How does the addressbook work?</h3> +<p>The addressbook application regularly (normally once per hour) polls your subscriptions and merges their content +into your so called router addressbook (normally your plain hosts.txt). Then it merges your so called master addressbook (normally +your userhosts.txt) into the router addressbook as well. If configured the router addressbook is now written to the so published addressbook, +which is a publicly available copy of your hosts.txt somewhere in your eepsites document root. (Yes, this means that, with activated publication, +your once private keys from userhosts.txt now are publicly available for everybody.) +</p> +<p><img src="images/how.png" border="0" alt="addressbook working scheme"/></p> +</div> + +<div id="footer"> +<p class="footer">susidns v${version.version} © <a href="${version.url}">susi</a> 2005</p> +</div> +</body> +</html> diff --git a/apps/susidns/src/jsp/subscriptions.jsp b/apps/susidns/src/jsp/subscriptions.jsp new file mode 100644 index 0000000000000000000000000000000000000000..9e78de8a1966d2cb5ce4a39e170c9ff01928d77e --- /dev/null +++ b/apps/susidns/src/jsp/subscriptions.jsp @@ -0,0 +1,78 @@ +<% +/* + * Created on Sep 02, 2005 + * + * This file is part of susidns project, see http://susi.i2p/ + * + * Copyright (C) 2005 <susi23@mail.i2p> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Revision: 1.7 $ + */ +%> +<%@ page contentType="text/html"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<jsp:useBean id="version" class="i2p.susi.dns.VersionBean" scope="application" /> +<jsp:useBean id="subs" class="i2p.susi.dns.SubscriptionsBean" scope="session" /> +<jsp:setProperty name="subs" property="*" /> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> +<head> +<title>subscriptions - susidns v${version.version}</title> +<link rel="stylesheet" type="text/css" href="css.css"> +</head> +<body> +<div id="logo"> +<img src="images/logo.png" alt="susidns logo" border="0"/> +</div> +<div id="navi"> +<p>addressbooks +<a href="addressbook.jsp?book=master">master</a> | +<a href="addressbook.jsp?book=router">router</a> | +<a href="addressbook.jsp?book=published">published</a> * +<a href="subscriptions.jsp">subscriptions</a> * +<a href="config.jsp">configuration</a> +</p> +</div> +<div id="headline"> +<h3>${subs.fileName}</h3> +</div> +<div id="messages">${subs.messages}</div> +<form method="POST" action="subscriptions.jsp"> +<div id="content"> +<input type="hidden" name="serial" value="${subs.serial}" /> +<textarea name="content" rows="10" cols="80">${subs.content}</textarea> +</div> +<div id="buttons"> +<input type="image" src="images/save.png" name="action" value="save" alt="Save Subscriptions" /> +<input type="image" src="images/reload.png" name="action" value="reload" alt="Reload Subscriptions" /> +</div> +</form> +<div id="help"> +<h3>Explanation</h3> +<p class="help"> +The subscription file contains a list of (i2p) URLs. The addressbook application +regularly (once per hour) checks this list for new eepsites. Those URLs simply contain the published hosts.txt +file of other people. Default subscription is the hosts.txt from dev.i2p. The most +popular collaboration site for eepsite is orion.i2p. So its a good idea to add http://orion.i2p/hosts.txt +as a 2nd subscription. +</p> +</div> +<div id="footer"> +<p class="footer">susidns v${version.version} © <a href="${version.url}">susi</a> 2005</p> +</div> +</body> +</html>