Compare commits

..

1 Commits

249 changed files with 1965 additions and 3116 deletions

View File

@@ -1,31 +0,0 @@
.idea
.git
Dockerfile
# Gradle
.gradle
build
apps/BOB/build
apps/addressbook/build
apps/desktopgui/build
apps/i2pcontrol/build
apps/i2psnark/build
apps/i2ptunnel/build
apps/imagegen/build
apps/jetty/build
apps/jrobin/build
apps/ministreaming/java/build
apps/ministreaming/build
apps/routerconsole/build
apps/sam/build
apps/streaming/build
apps/susidns/build
apps/susimail/build
apps/systray/build
core/java/build
core/build
installer/build
router/java/build
router/build

6
.gitignore vendored
View File

@@ -54,10 +54,4 @@ sloccount.sc
.settings/
# IDEA
*.iml
.idea
# Gradle
.gradle
# TODO: why does this file appear?
apps/routerconsole/jsp/favicon.ico

View File

@@ -1,68 +0,0 @@
image: openjdk:8-alpine
stages:
- test
- build
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- $HOME/.gradle/caches/
- $HOME/.gradle/wrapper/
- .gradle
test:
stage: test
coverage: '/Total.*?([0-9]{1,3})%/'
before_script:
- apk add --no-cache grep
script:
- ./gradlew codeCoverageReport
# The actual output that will be parsed by the code coverage
- grep -oP "Total.*?%" build/reports/jacoco/html/index.html
only:
- merge_requests
- tags
# Make sure we can build a docker image
# It's cached for later jobs
build_docker:
stage: build
image: docker:19.03.12
services:
- docker:19.03.12-dind
script:
# Try to load latest branch image from local tar or from registry
- find ..
- docker load -i ci-exports/$CI_COMMIT_REF_SLUG.tar || docker pull $CI_REGISTRY_IMAGE:latest || true
- docker build --cache-from $CI_REGISTRY_IMAGE:latest --tag $CI_REGISTRY_IMAGE:latest .
- mkdir -p ci-exports/
- docker save $CI_REGISTRY_IMAGE:latest > ci-exports/$CI_COMMIT_REF_SLUG.tar
variables:
# When using dind service, we need to instruct docker to talk with
# the daemon started inside of the service. The daemon is available
# with a network connection instead of the default
# /var/run/docker.sock socket. Docker 19.03 does this automatically
# by setting the DOCKER_HOST in
# https://github.com/docker-library/docker/blob/d45051476babc297257df490d22cbd806f1b11e4/19.03/docker-entrypoint.sh#L23-L29
#
# The 'docker' hostname is the alias of the service container as described at
# https://docs.gitlab.com/ee/ci/docker/using_docker_images.html#accessing-the-services.
#
# Specify to Docker where to create the certificates, Docker will
# create them automatically on boot, and will create
# `/certs/client` that will be shared between the service and job
# container, thanks to volume mount from config.toml
DOCKER_TLS_CERTDIR: "/certs"
# Use TLS https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#tls-enabled
DOCKER_HOST: tcp://docker:2376
cache:
# The same key should be used across branches
key: "$CI_COMMIT_REF_SLUG"
paths:
- ci-exports/
only:
- master
- merge_requests
- tags

6
.idea/ant.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AntConfiguration">
<buildFile url="file://$PROJECT_DIR$/build.xml" />
</component>
</project>

41
.idea/compiler.xml generated Normal file
View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel>
<module name="addressbook_main" target="1.7" />
<module name="addressbook_test" target="1.7" />
<module name="BOB_main" target="1.7" />
<module name="BOB_test" target="1.7" />
<module name="core_main" target="1.7" />
<module name="core_test" target="1.7" />
<module name="desktopgui_main" target="1.7" />
<module name="desktopgui_test" target="1.7" />
<module name="i2psnark_main" target="1.7" />
<module name="i2psnark_test" target="1.7" />
<module name="i2ptunnel_main" target="1.7" />
<module name="i2ptunnel_test" target="1.7" />
<module name="installer_main" target="1.7" />
<module name="installer_test" target="1.7" />
<module name="jetty_main" target="1.7" />
<module name="jetty_test" target="1.7" />
<module name="jrobin_main" target="1.7" />
<module name="jrobin_test" target="1.7" />
<module name="ministreaming_main" target="1.7" />
<module name="ministreaming_test" target="1.7" />
<module name="router_main" target="1.7" />
<module name="router_test" target="1.7" />
<module name="routerconsole_main" target="1.7" />
<module name="routerconsole_test" target="1.7" />
<module name="sam_main" target="1.7" />
<module name="sam_test" target="1.7" />
<module name="streaming_main" target="1.7" />
<module name="streaming_test" target="1.7" />
<module name="susidns_main" target="1.7" />
<module name="susidns_test" target="1.7" />
<module name="susimail_main" target="1.7" />
<module name="susimail_test" target="1.7" />
<module name="systray_main" target="1.7" />
<module name="systray_test" target="1.7" />
</bytecodeTargetLevel>
</component>
</project>

3
.idea/copyright/profiles_settings.xml generated Normal file
View File

@@ -0,0 +1,3 @@
<component name="CopyrightManager">
<settings default="" />
</component>

View File

@@ -0,0 +1,9 @@
<component name="libraryTable">
<library name="javax.servlet.jsp-2.2.0.v201112011158">
<CLASSES>
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jsp/javax.servlet.jsp-2.2.0.v201112011158.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

22
.idea/libraries/jettylib.xml generated Normal file
View File

@@ -0,0 +1,22 @@
<component name="libraryTable">
<library name="jettylib">
<CLASSES>
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-security-8.1.17.v20150415.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-servlets-8.1.17.v20150415.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-deploy-8.1.17.v20150415.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-util-8.1.17.v20150415.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-servlet-8.1.17.v20150415.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-http-8.1.17.v20150415.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-xml-8.1.17.v20150415.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-server-8.1.17.v20150415.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/servlet-api-3.0.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-jmx-8.1.17.v20150415.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-webapp-8.1.17.v20150415.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-io-8.1.17.v20150415.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-continuation-8.1.17.v20150415.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/lib/jetty-rewrite-8.1.17.v20150415.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

9
.idea/libraries/jrobin_1_5_9_1.xml generated Normal file
View File

@@ -0,0 +1,9 @@
<component name="libraryTable">
<library name="jrobin-1.5.9.1">
<CLASSES>
<root url="jar://$PROJECT_DIR$/apps/jrobin/jrobin-1.5.9.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

10
.idea/libraries/lib.xml generated Normal file
View File

@@ -0,0 +1,10 @@
<component name="libraryTable">
<library name="lib">
<CLASSES>
<root url="jar://$PROJECT_DIR$/apps/susidns/src/lib/jstl.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/susidns/src/lib/standard.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

9
.idea/libraries/start.xml generated Normal file
View File

@@ -0,0 +1,9 @@
<component name="libraryTable">
<library name="start">
<CLASSES>
<root url="jar://$PROJECT_DIR$/apps/jetty/jetty-distribution-8.1.17.v20150415/start.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

9
.idea/libraries/systray4j.xml generated Normal file
View File

@@ -0,0 +1,9 @@
<component name="libraryTable">
<library name="systray4j">
<CLASSES>
<root url="jar://$PROJECT_DIR$/apps/systray/java/lib/systray4j.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

9
.idea/libraries/tomcat_coyote_util.xml generated Normal file
View File

@@ -0,0 +1,9 @@
<component name="libraryTable">
<library name="tomcat-coyote-util">
<CLASSES>
<root url="jar://$PROJECT_DIR$/apps/jetty/apache-tomcat/lib/tomcat-coyote-util.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

12
.idea/libraries/tomcat_lib.xml generated Normal file
View File

@@ -0,0 +1,12 @@
<component name="libraryTable">
<library name="tomcat-lib">
<CLASSES>
<root url="jar://$PROJECT_DIR$/apps/jetty/apache-tomcat-deployer/lib/tomcat-juli.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/apache-tomcat-deployer/lib/el-api.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/apache-tomcat-deployer/lib/jasper.jar!/" />
<root url="jar://$PROJECT_DIR$/apps/jetty/apache-tomcat-deployer/lib/jasper-el.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

9
.idea/libraries/wrapper.xml generated Normal file
View File

@@ -0,0 +1,9 @@
<component name="libraryTable">
<library name="wrapper">
<CLASSES>
<root url="jar://$PROJECT_DIR$/installer/lib/wrapper/all/wrapper.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

9
.idea/libraries/wrapper_win.xml generated Normal file
View File

@@ -0,0 +1,9 @@
<component name="libraryTable">
<library name="wrapper-win">
<CLASSES>
<root url="jar://$PROJECT_DIR$/installer/lib/wrapper/win-all/wrapper.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

57
.idea/misc.xml generated Normal file
View File

@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ClientPropertiesManager">
<properties class="javax.swing.AbstractButton">
<property name="hideActionText" class="java.lang.Boolean" />
</properties>
<properties class="javax.swing.JComponent">
<property name="html.disable" class="java.lang.Boolean" />
</properties>
<properties class="javax.swing.JEditorPane">
<property name="JEditorPane.w3cLengthUnits" class="java.lang.Boolean" />
<property name="JEditorPane.honorDisplayProperties" class="java.lang.Boolean" />
<property name="charset" class="java.lang.String" />
</properties>
<properties class="javax.swing.JList">
<property name="List.isFileList" class="java.lang.Boolean" />
</properties>
<properties class="javax.swing.JPasswordField">
<property name="JPasswordField.cutCopyAllowed" class="java.lang.Boolean" />
</properties>
<properties class="javax.swing.JSlider">
<property name="Slider.paintThumbArrowShape" class="java.lang.Boolean" />
<property name="JSlider.isFilled" class="java.lang.Boolean" />
</properties>
<properties class="javax.swing.JTable">
<property name="Table.isFileList" class="java.lang.Boolean" />
<property name="JTable.autoStartsEdit" class="java.lang.Boolean" />
<property name="terminateEditOnFocusLost" class="java.lang.Boolean" />
</properties>
<properties class="javax.swing.JToolBar">
<property name="JToolBar.isRollover" class="java.lang.Boolean" />
</properties>
<properties class="javax.swing.JTree">
<property name="JTree.lineStyle" class="java.lang.String" />
</properties>
<properties class="javax.swing.text.JTextComponent">
<property name="caretAspectRatio" class="java.lang.Double" />
<property name="caretWidth" class="java.lang.Integer" />
</properties>
</component>
<component name="EntryPointsManager">
<entry_points version="2.0" />
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
<OptionsSetting value="true" id="Add" />
<OptionsSetting value="true" id="Remove" />
<OptionsSetting value="true" id="Checkout" />
<OptionsSetting value="true" id="Update" />
<OptionsSetting value="true" id="Status" />
<OptionsSetting value="true" id="Edit" />
<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.7" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build" />
</component>
</project>

80
.idea/modules.xml generated Normal file
View File

@@ -0,0 +1,80 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/BOB/BOB.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/BOB/BOB.iml" group="apps/BOB" />
<module fileurl="file://$PROJECT_DIR$/apps/BOB/BOB.iml" filepath="$PROJECT_DIR$/apps/BOB/BOB.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/BOB/BOB_main.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/BOB/BOB_main.iml" group="apps/BOB" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/BOB/BOB_test.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/BOB/BOB_test.iml" group="apps/BOB" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/addressbook/addressbook.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/addressbook/addressbook.iml" group="apps/addressbook" />
<module fileurl="file://$PROJECT_DIR$/apps/addressbook/addressbook.iml" filepath="$PROJECT_DIR$/apps/addressbook/addressbook.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/addressbook/addressbook_main.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/addressbook/addressbook_main.iml" group="apps/addressbook" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/addressbook/addressbook_test.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/addressbook/addressbook_test.iml" group="apps/addressbook" />
<module fileurl="file://$PROJECT_DIR$/apps/admin/admin.iml" filepath="$PROJECT_DIR$/apps/admin/admin.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/apps.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/apps.iml" group="apps" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/core/core.iml" filepath="$PROJECT_DIR$/.idea/modules/core/core.iml" group="core" />
<module fileurl="file://$PROJECT_DIR$/core/core.iml" filepath="$PROJECT_DIR$/core/core.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/core/core_main.iml" filepath="$PROJECT_DIR$/.idea/modules/core/core_main.iml" group="core" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/core/core_test.iml" filepath="$PROJECT_DIR$/.idea/modules/core/core_test.iml" group="core" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/desktopgui/desktopgui.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/desktopgui/desktopgui.iml" group="apps/desktopgui" />
<module fileurl="file://$PROJECT_DIR$/apps/desktopgui/desktopgui.iml" filepath="$PROJECT_DIR$/apps/desktopgui/desktopgui.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/desktopgui/desktopgui_main.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/desktopgui/desktopgui_main.iml" group="apps/desktopgui" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/desktopgui/desktopgui_test.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/desktopgui/desktopgui_test.iml" group="apps/desktopgui" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/i2p.i2p.sl.iml" filepath="$PROJECT_DIR$/.idea/modules/i2p.i2p.sl.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/i2psnark/i2psnark.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/i2psnark/i2psnark.iml" group="apps/i2psnark" />
<module fileurl="file://$PROJECT_DIR$/apps/i2psnark/i2psnark.iml" filepath="$PROJECT_DIR$/apps/i2psnark/i2psnark.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/i2psnark/i2psnark_main.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/i2psnark/i2psnark_main.iml" group="apps/i2psnark" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/i2psnark/i2psnark_test.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/i2psnark/i2psnark_test.iml" group="apps/i2psnark" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/i2ptunnel/i2ptunnel.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/i2ptunnel/i2ptunnel.iml" group="apps/i2ptunnel" />
<module fileurl="file://$PROJECT_DIR$/apps/i2ptunnel/i2ptunnel.iml" filepath="$PROJECT_DIR$/apps/i2ptunnel/i2ptunnel.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/i2ptunnel/i2ptunnel_main.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/i2ptunnel/i2ptunnel_main.iml" group="apps/i2ptunnel" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/i2ptunnel/i2ptunnel_test.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/i2ptunnel/i2ptunnel_test.iml" group="apps/i2ptunnel" />
<module fileurl="file://$PROJECT_DIR$/apps/imagegen/identicon/identicon.iml" filepath="$PROJECT_DIR$/apps/imagegen/identicon/identicon.iml" />
<module fileurl="file://$PROJECT_DIR$/apps/imagegen/imagegen/imagegen.iml" filepath="$PROJECT_DIR$/apps/imagegen/imagegen/imagegen.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/installer/installer.iml" filepath="$PROJECT_DIR$/.idea/modules/installer/installer.iml" group="installer" />
<module fileurl="file://$PROJECT_DIR$/installer/installer.iml" filepath="$PROJECT_DIR$/installer/installer.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/installer/installer_main.iml" filepath="$PROJECT_DIR$/.idea/modules/installer/installer_main.iml" group="installer" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/installer/installer_test.iml" filepath="$PROJECT_DIR$/.idea/modules/installer/installer_test.iml" group="installer" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/jetty/jetty.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/jetty/jetty.iml" group="apps/jetty" />
<module fileurl="file://$PROJECT_DIR$/apps/jetty/jetty.iml" filepath="$PROJECT_DIR$/apps/jetty/jetty.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/jetty/jetty_main.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/jetty/jetty_main.iml" group="apps/jetty" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/jetty/jetty_test.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/jetty/jetty_test.iml" group="apps/jetty" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/jrobin/jrobin.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/jrobin/jrobin.iml" group="apps/jrobin" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/jrobin/jrobin_main.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/jrobin/jrobin_main.iml" group="apps/jrobin" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/jrobin/jrobin_test.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/jrobin/jrobin_test.iml" group="apps/jrobin" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/ministreaming/ministreaming.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/ministreaming/ministreaming.iml" group="apps/ministreaming" />
<module fileurl="file://$PROJECT_DIR$/apps/ministreaming/ministreaming.iml" filepath="$PROJECT_DIR$/apps/ministreaming/ministreaming.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/ministreaming/ministreaming_main.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/ministreaming/ministreaming_main.iml" group="apps/ministreaming" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/ministreaming/ministreaming_test.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/ministreaming/ministreaming_test.iml" group="apps/ministreaming" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/router/router.iml" filepath="$PROJECT_DIR$/.idea/modules/router/router.iml" group="router" />
<module fileurl="file://$PROJECT_DIR$/router/router.iml" filepath="$PROJECT_DIR$/router/router.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/router/router_main.iml" filepath="$PROJECT_DIR$/.idea/modules/router/router_main.iml" group="router" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/router/router_test.iml" filepath="$PROJECT_DIR$/.idea/modules/router/router_test.iml" group="router" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/routerconsole/routerconsole.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/routerconsole/routerconsole.iml" group="apps/routerconsole" />
<module fileurl="file://$PROJECT_DIR$/apps/routerconsole/routerconsole.iml" filepath="$PROJECT_DIR$/apps/routerconsole/routerconsole.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/routerconsole/routerconsole_main.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/routerconsole/routerconsole_main.iml" group="apps/routerconsole" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/routerconsole/routerconsole_test.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/routerconsole/routerconsole_test.iml" group="apps/routerconsole" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/sam/sam.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/sam/sam.iml" group="apps/sam" />
<module fileurl="file://$PROJECT_DIR$/apps/sam/sam.iml" filepath="$PROJECT_DIR$/apps/sam/sam.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/sam/sam_main.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/sam/sam_main.iml" group="apps/sam" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/sam/sam_test.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/sam/sam_test.iml" group="apps/sam" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/streaming/streaming.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/streaming/streaming.iml" group="apps/streaming" />
<module fileurl="file://$PROJECT_DIR$/apps/streaming/streaming.iml" filepath="$PROJECT_DIR$/apps/streaming/streaming.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/streaming/streaming_main.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/streaming/streaming_main.iml" group="apps/streaming" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/streaming/streaming_test.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/streaming/streaming_test.iml" group="apps/streaming" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/susidns/susidns.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/susidns/susidns.iml" group="apps/susidns" />
<module fileurl="file://$PROJECT_DIR$/apps/susidns/susidns.iml" filepath="$PROJECT_DIR$/apps/susidns/susidns.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/susidns/susidns_main.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/susidns/susidns_main.iml" group="apps/susidns" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/susidns/susidns_test.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/susidns/susidns_test.iml" group="apps/susidns" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/susimail/susimail.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/susimail/susimail.iml" group="apps/susimail" />
<module fileurl="file://$PROJECT_DIR$/apps/susimail/susimail.iml" filepath="$PROJECT_DIR$/apps/susimail/susimail.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/susimail/susimail_main.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/susimail/susimail_main.iml" group="apps/susimail" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/susimail/susimail_test.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/susimail/susimail_test.iml" group="apps/susimail" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/systray/systray.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/systray/systray.iml" group="apps/systray" />
<module fileurl="file://$PROJECT_DIR$/apps/systray/systray.iml" filepath="$PROJECT_DIR$/apps/systray/systray.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/systray/systray_main.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/systray/systray_main.iml" group="apps/systray" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/apps/systray/systray_test.iml" filepath="$PROJECT_DIR$/.idea/modules/apps/systray/systray_test.iml" group="apps/systray" />
<module fileurl="file://$PROJECT_DIR$/apps/imagegen/zxing/zxing.iml" filepath="$PROJECT_DIR$/apps/imagegen/zxing/zxing.iml" />
</modules>
</component>
</project>

6
.idea/runConfigurations/updater.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="updater" type="AntRunConfiguration" factoryName="Ant Target">
<antsettings antfile="file://$PROJECT_DIR$/build.xml" target="updater" />
<method />
</configuration>
</component>

View File

@@ -1,17 +1,17 @@
language: java
dist: bionic
dist: xenial
jdk:
- oraclejdk11
matrix:
include:
- jdk: oraclejdk11
- jdk: oraclejdk8
addons:
sonarcloud:
organization: "i2p"
before_install:
- sed -i "1iplugins {\n id 'org.sonarqube' version '3.0'\n}\n" build.gradle
- sed -i "1iplugins {\n id 'org.sonarqube' version '2.6.1'\n}\n" build.gradle
- jdk: openjdk8
before_cache:
@@ -24,11 +24,13 @@ cache:
- $HOME/.sonar/cache/
- .gradle
env:
- SONAR_SCANNER_OPTS="-Xmx2048m"
script:
- travis_wait 45 ./tests/scripts/travis.sh
- |
if [ "$TRAVIS_JDK_VERSION" == "oraclejdk8" ]; then
./gradlew sonarqube codeCoverageReport
else
./gradlew check codeCoverageReport
fi
after_success:
- bash <(curl -s https://codecov.io/bash)

View File

@@ -619,21 +619,21 @@ trans.tr_TR = installer/resources/eepsite/docroot/help/index_tr.html
;; Text on /console
;;
type = HTML
source_file = apps/routerconsole/resources/docs/readme.html
source_file = installer/resources/readme/readme.html
source_lang = en
trans.ar = apps/routerconsole/resources/docs/readme_ar.html
trans.de = apps/routerconsole/resources/docs/readme_de.html
trans.fr = apps/routerconsole/resources/docs/readme_fr.html
trans.ar = installer/resources/readme/readme_ar.html
trans.de = installer/resources/readme/readme_de.html
trans.fr = installer/resources/readme/readme_fr.html
;; Java converts id to in
trans.id = apps/routerconsole/resources/docs/readme_in.html
trans.it = apps/routerconsole/resources/docs/readme_it.html
trans.ja = apps/routerconsole/resources/docs/readme_ja.html
trans.pl = apps/routerconsole/resources/docs/readme_pl.html
trans.pt = apps/routerconsole/resources/docs/readme_pt.html
trans.ro = apps/routerconsole/resources/docs/readme_ro.html
trans.ru_RU = apps/routerconsole/resources/docs/readme_ru.html
trans.tr_TR = apps/routerconsole/resources/docs/readme_tr.html
trans.zh_CN = apps/routerconsole/resources/docs/readme_zh.html
trans.id = installer/resources/readme/readme_in.html
trans.it = installer/resources/readme/readme_it.html
trans.ja = installer/resources/readme/readme_ja.html
trans.pl = installer/resources/readme/readme_pl.html
trans.pt = installer/resources/readme/readme_pt.html
trans.ro = installer/resources/readme/readme_ro.html
trans.ru_RU = installer/resources/readme/readme_ru.html
trans.tr_TR = installer/resources/readme/readme_tr.html
trans.zh_CN = installer/resources/readme/readme_zh.html
[main]
host = https://www.transifex.com

14
Docker.entrypoint.sh Normal file
View File

@@ -0,0 +1,14 @@
#!/bin/sh
export JAVA_HOME=/opt/jdk/jre
# Ensure user rights
chown -R i2p:nobody /opt/i2p
chmod -R u+rwx /opt/i2p
gosu i2p /opt/i2p/i2psvc /opt/i2p/wrapper.config wrapper.pidfile=/var/tmp/i2p.pid \
wrapper.name=i2p \
wrapper.displayname="I2P Service" \
wrapper.statusfile=/var/tmp/i2p.status \
wrapper.java.statusfile=/var/tmp/i2p.java.status \
wrapper.logfile=/var/tmp/wrapper.log

View File

@@ -1,47 +1,62 @@
# Use a multi-stage build to reduce the size of the resulting image
# We need alpine >v3 in order to install an apache-ant > 1.9
FROM alpine:3 as builder
ENV I2P_PREFIX="/opt/i2p"
FROM meeh/java8server:latest
# Docker image based on Alpine with Java.
WORKDIR /tmp/build
COPY . ./
# We use Oracle Java to run I2P, but uses the openjdk to build it.
# Build installer
RUN apk --no-cache add build-base gettext tar bzip2 apache-ant openjdk8 expect
RUN echo "noExe=true" >> build.properties
RUN ant installer-linux
RUN mkdir -p /opt
RUN mv i2pinstall*.jar /tmp/i2pinstall.jar
# Install i2p using the installer into I2P_PREFIX
RUN expect -f ./Docker.expt
RUN cd ${I2P_PREFIX}
RUN rm -fr man docs *.bat *.command *.app
MAINTAINER Mikal Villa <mikal@sigterm.no>
# Second stage only using the installer from the last stage
# ---------------------------------------------------------
# We can't use alpine here as the java service wrapper is built with glibc
# alpine uses musl
FROM openjdk:11.0-jre-slim
ARG I2P_UID=1000
ARG I2P_USER=i2p
ENV GIT_BRANCH="master"
ENV I2P_PREFIX="/opt/i2p"
ENV PATH=${I2P_PREFIX}/bin:$PATH
ENV JAVA_HOME=/usr/lib/jvm/default-jvm
# "install" i2p by copying over installed files
COPY --from=builder /opt/i2p ${I2P_PREFIX}
COPY docker/* /opt/i2p/
ENV GOSU_VERSION=1.7
ENV GOSU_SHASUM="34049cfc713e8b74b90d6de49690fa601dc040021980812b2f1f691534be8a50 /usr/local/bin/gosu"
# Setup user and fix permissions in
RUN adduser --system --uid ${I2P_UID} --home /user ${I2P_USER} \
&& chown -R ${I2P_USER} /user \
&& chown -R ${I2P_USER} ${I2P_PREFIX} \
&& chmod -R u+rwx ${I2P_PREFIX}
RUN mkdir /user && adduser -S -h /user i2p && chown -R i2p:nobody /user
EXPOSE 7654 7656 7657 7658 4444 6668 8998 7659 7660 4445
# Adding files first, since Docker.expt is required for installation
ADD Docker.expt /tmp/Docker.expt
ADD Docker.entrypoint.sh /entrypoint.sh
USER i2p
ENTRYPOINT [ "/opt/i2p/i2psvc" ]
CMD [ "/opt/i2p/wrapper.config", "wrapper.pidfile=/var/tmp/i2p.pid", "wrapper.name=i2p", "wrapper.displayname=\"I2P Service\"" , "wrapper.statusfile=/var/tmp/i2p.status", "wrapper.java.statusfile=/var/tmp/i2p.java.status", "wrapper.logfile=/var/tmp/wrapper.log" ]
# Required for wget https
RUN apk add --no-cache openssl
# Gosu is a replacement for su/sudo in docker and not a backdoor :) See https://github.com/tianon/gosu
RUN wget -O /usr/local/bin/gosu https://github.com/tianon/gosu/releases/download/${GOSU_VERSION}/gosu-amd64 \
&& echo "${GOSU_SHASUM}" | sha256sum -c && chmod +x /usr/local/bin/gosu
#
# Each RUN is a layer, adding the dependencies and building i2pd in one layer takes around 8-900Mb, so to keep the
# image under 200mb we need to remove all the build dependencies in the same "RUN" / layer.
#
# The main layer
RUN apk --no-cache add build-base git gettext tar bzip2 apache-ant openjdk8 expect \
&& mkdir -p /usr/src/build \
&& cd /usr/src/build \
&& git clone -b ${GIT_BRANCH} https://github.com/i2p/i2p.i2p.git \
&& cd /usr/src/build/i2p.i2p \
&& echo "noExe=true" >> build.properties \
&& ant installer-linux \
&& cp i2pinstall*.jar /tmp/i2pinstall.jar \
&& mkdir -p /opt \
&& chown i2p:root /opt \
&& chmod u+rw /opt \
&& gosu i2p expect -f /tmp/Docker.expt \
&& cd ${I2P_PREFIX} \
&& rm -fr man docs *.bat *.command *.app /tmp/i2pinstall.jar /tmp/Docker.expt \
&& rm -fr /usr/src/build \
&& apk --purge del build-base apache-ant expect tcl expat git openjdk8 openjdk8-jre openjdk8-jre-base openjdk8-jre-lib bzip2 tar \
binutils-libs binutils pkgconfig libcurl libc-dev musl-dev g++ make fortify-headers pkgconf giflib libssh2 libxdmcp libxcb \
libx11 pcre alsa-lib libxi libxrender libxml2 readline bash openssl \
&& rm -fr /usr/lib/jvm/default-jre \
&& ln -sf /opt/jdk/jre /usr/lib/jvm/default-jre \
&& chmod a+x /entrypoint.sh
EXPOSE 7654 7656 7657 7658 4444 6668 8998 7659 7660 4445 15000-20000
ENTRYPOINT [ "/entrypoint.sh" ]

View File

@@ -77,7 +77,7 @@ class Daemon {
* client applications.
* @param published
* The published AddressBook. This address book is published on
* the user's I2P Site so that others may subscribe to it.
* the user's eepsite so that others may subscribe to it.
* May be null.
* If non-null, overwrite with the new addressbook.
* @param subscriptions
@@ -111,7 +111,7 @@ class Daemon {
* The NamingService to update, generally the root NamingService from the context.
* @param published
* The published AddressBook. This address book is published on
* the user's I2P Site so that others may subscribe to it.
* the user's eepsite so that others may subscribe to it.
* May be null.
* If non-null, overwrite with the new addressbook.
* @param subscriptions

View File

@@ -2,7 +2,6 @@ sourceSets {
main {
java {
srcDir 'src'
srcDir 'build/messages-src'
}
}
}
@@ -13,14 +12,3 @@ dependencies {
compile project(':installer')
compile project(':apps:systray')
}
// Create the java files from the po files. The jar task will compile them.
// This requires gettext 0.19 or higher.
// We don't support the "slow way"
task bundle {
doLast {
if (!(new File("$buildDir/classes/java/main/net/i2p/desktopgui/messages_de.class")).exists())
println "apps/desktopgui/bundle-messages.sh".execute().text
}
}
jar.dependsOn bundle

View File

@@ -86,8 +86,6 @@
<jar basedir="${build}" excludes="messages-src/**" destfile="${dist}/${jar}">
<manifest>
<attribute name="Main-Class" value="net.i2p.desktopgui.Main"/>
<attribute name="Implementation-Version" value="${full.version}" />
<attribute name="Built-By" value="${build.built-by}" />
<attribute name="Build-Date" value="${build.timestamp}" />
<attribute name="Base-Revision" value="${workspace.version}" />
<attribute name="Workspace-Changes" value="${workspace.changes.tr}" />

1
apps/desktopgui/bundle-messages.sh Executable file → Normal file
View File

@@ -11,7 +11,6 @@
# zzz - public domain
# Mathiasdm - modifications for desktopgui
#
cd `dirname $0`
CLASS=net.i2p.desktopgui.messages
TMPFILE=build/javafiles.txt
export TZ=UTC

View File

@@ -1,22 +0,0 @@
plugins {
id 'war'
}
sourceSets {
main {
java {
srcDir 'java'
}
}
}
dependencies {
providedCompile project(':router')
providedCompile project(':apps:jetty')
providedCompile files('../../installer/lib/wrapper/all/wrapper.jar')
}
war {
archiveName 'jsonrpc.war'
webXml = file('web.xml')
}

View File

@@ -55,7 +55,7 @@ import java.util.StringTokenizer;
* This handles the starting and stopping of Jetty
* from a single static class so it can be called via clients.config.
*
* This makes installation of a new I2P Site a turnkey operation.
* This makes installation of a new eepsite a turnkey operation.
*
* Usage: I2PControlController -d $PLUGIN [start|stop]
*

View File

@@ -6,14 +6,13 @@ sourceSets {
main {
java {
srcDir 'java/src'
srcDir 'java/build/messages-src'
}
}
}
dependencies {
compile project(':core')
providedCompile project(':apps:systray')
compile project(':apps:systray')
compile 'gnu.getopt:java-getopt:1.0.13'
providedCompile project(':apps:ministreaming')
providedCompile project(':apps:jetty')
@@ -35,26 +34,10 @@ artifacts {
archives i2psnarkJar
}
// Create the java files from the po files. The jar task will compile them.
// This requires gettext 0.19 or higher.
// We don't support the "slow way"
task bundle {
doLast {
if (!(new File("$buildDir/classes/java/main/org/klomp/snark/web/messages_de.class")).exists())
println "apps/i2psnark/java/bundle-messages.sh".execute().text
}
}
war.dependsOn bundle
war {
rootSpec.exclude('/org/klomp/snark/*.class')
rootSpec.exclude('/org/klomp/snark/bencode/**')
rootSpec.exclude('/org/klomp/snark/comments/**')
rootSpec.exclude('/org/klomp/snark/dht/**')
rootSpec.exclude('/org/klomp/snark/standalone/**')
from ('resources', {
into ".resources"
})
into '.icons', {
from 'icons'
}
webInf {
into 'classes/org/klomp/snark/web'
from 'mime.properties'

View File

@@ -10,7 +10,6 @@
#
# zzz - public domain
#
cd `dirname $0`
CLASS=org.klomp.snark.web.messages
TMPFILE=build/javafiles.txt
export TZ=UTC

View File

@@ -5,10 +5,8 @@ import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
@@ -59,6 +57,7 @@ public class I2PSnarkUtil {
private int _i2cpPort;
private final Map<String, String> _opts;
private volatile I2PSocketManager _manager;
private boolean _configured;
private volatile boolean _connecting;
private final Set<Hash> _banlist;
private int _maxUploaders;
@@ -85,10 +84,6 @@ public class I2PSnarkUtil {
public static final String PROP_MAX_BW = "i2cp.outboundBytesPerSecond";
public static final boolean DEFAULT_USE_DHT = true;
public static final String EEPGET_USER_AGENT = "I2PSnark";
private static final List<String> HIDDEN_I2CP_OPTS = Arrays.asList(new String[] {
PROP_MAX_BW, "inbound.length", "outbound.length", "inbound.quantity", "outbound.quantity"
});
public I2PSnarkUtil(I2PAppContext ctx) {
this(ctx, "i2psnark");
@@ -147,34 +142,25 @@ public class I2PSnarkUtil {
/** @since 0.9.1 */
public I2PAppContext getContext() { return _context; }
/**
* @param i2cpHost may be null for no change
* @param i2cpPort may be 0 for no change
* @param opts may be null for no change
*/
public boolean configured() { return _configured; }
@SuppressWarnings({"unchecked", "rawtypes"})
public void setI2CPConfig(String i2cpHost, int i2cpPort, Map opts) {
if (i2cpHost != null)
_i2cpHost = i2cpHost;
if (i2cpPort > 0)
_i2cpPort = i2cpPort;
if (opts != null) {
synchronized(_opts) {
// removed options...
for (Iterator<String> iter = _opts.keySet().iterator(); iter.hasNext(); ) {
String k = iter.next();
if (!HIDDEN_I2CP_OPTS.contains(k) && !opts.containsKey(k))
iter.remove();
}
_opts.putAll(opts);
}
}
// can't remove any options this way...
if (opts != null)
_opts.putAll(opts);
// this updates the session options and tells the router
setMaxUpBW(_maxUpBW);
_configured = true;
}
public void setMaxUploaders(int limit) {
_maxUploaders = limit;
_configured = true;
}
/**
@@ -183,16 +169,13 @@ public class I2PSnarkUtil {
*/
public void setMaxUpBW(int limit) {
_maxUpBW = limit;
synchronized(_opts) {
_opts.put(PROP_MAX_BW, Integer.toString(limit * (1024 * 6 / 5))); // add a little for overhead
}
_opts.put(PROP_MAX_BW, Integer.toString(limit * (1024 * 6 / 5))); // add a little for overhead
_configured = true;
if (_manager != null) {
I2PSession sess = _manager.getSession();
if (sess != null) {
Properties newProps = new Properties();
synchronized(_opts) {
newProps.putAll(_opts);
}
newProps.putAll(_opts);
sess.updateOptions(newProps);
}
}
@@ -200,24 +183,17 @@ public class I2PSnarkUtil {
public void setMaxConnections(int limit) {
_maxConnections = limit;
_configured = true;
}
public void setStartupDelay(int minutes) {
_startupDelay = minutes;
_configured = true;
}
public String getI2CPHost() { return _i2cpHost; }
public int getI2CPPort() { return _i2cpPort; }
/**
* @return a copy
*/
public Map<String, String> getI2CPOptions() {
synchronized(_opts) {
return new HashMap<String, String>(_opts);
}
}
public Map<String, String> getI2CPOptions() { return _opts; }
public String getEepProxyHost() { return _proxyHost; }
public int getEepProxyPort() { return _proxyPort; }
public boolean getEepProxySet() { return _shouldProxy; }
@@ -249,8 +225,9 @@ public class I2PSnarkUtil {
if (_log.shouldLog(Log.DEBUG))
_log.debug("Connecting to I2P", new Exception("I did it"));
Properties opts = _context.getProperties();
synchronized(_opts) {
opts.putAll(_opts);
if (_opts != null) {
for (Map.Entry<String, String> entry : _opts.entrySet() )
opts.setProperty(entry.getKey(), entry.getValue());
}
// override preference and start with two tunnels. IdleChecker will ramp up/down as necessary
String sin = opts.getProperty("inbound.quantity");

View File

@@ -1068,8 +1068,7 @@ class PeerCoordinator implements PeerListener
// just in case
removePartialPiece(piece);
// Oops. We didn't actually download this then... :(
// Reports of counter going negative?
//downloaded.addAndGet(0 - metainfo.getPieceLength(piece));
downloaded.addAndGet(0 - metainfo.getPieceLength(piece));
// Mark this peer as not having the piece. PeerState will update its bitfield.
for (Piece pc : wantedPieces) {
if (pc.getId() == piece) {

View File

@@ -461,7 +461,7 @@ public class I2PSnarkServlet extends BasicServlet {
*/
private boolean writeTorrents(PrintWriter out, HttpServletRequest req, boolean canWrite) throws IOException {
/** dl, ul, down rate, up rate, peers, size */
final long stats[] = new long[6];
final long stats[] = {0,0,0,0,0,0};
String peerParam = req.getParameter("p");
String stParam = req.getParameter("st");
@@ -2479,8 +2479,8 @@ public class I2PSnarkServlet extends BasicServlet {
if (!_context.isRouterContext()) {
try {
// class only in standalone builds
Class<?> helper = Class.forName("org.klomp.snark.standalone.ConfigUIHelper");
Method getLangSettings = helper.getMethod("getLangSettings", I2PAppContext.class);
Class helper = Class.forName("org.klomp.snark.standalone.ConfigUIHelper");
Method getLangSettings = helper.getMethod("getLangSettings", new Class[] {I2PAppContext.class});
String langSettings = (String) getLangSettings.invoke(null, _context);
// If we get to here, we have the language settings
out.write("<tr><td>");

View File

@@ -6,8 +6,6 @@ sourceSets {
main {
java {
srcDir 'java/src'
srcDir 'java/build/messages-src'
srcDir 'java/build/messages-proxy-src'
}
}
test {
@@ -19,31 +17,13 @@ sourceSets {
dependencies {
compile project(':core')
providedCompile project(':apps:ministreaming')
compile project(':apps:ministreaming')
compile 'gnu.getopt:java-getopt:1.0.13'
providedCompile project(':apps:jetty')
}
// Create the java files from the po files. The jar task will compile them.
// This requires gettext 0.19 or higher.
// We don't support the "slow way"
task bundleProxy {
doLast {
if (!(new File("$buildDir/classes/java/main/net/i2p/i2ptunnel/proxy/messages_de.class")).exists())
println "apps/i2ptunnel/java/bundle-messages-proxy.sh".execute().text
}
}
task bundle {
doLast {
if (!(new File("$buildDir/classes/java/main/net/i2p/i2ptunnel/web/messages_de.class")).exists())
println "apps/i2ptunnel/java/bundle-messages.sh".execute().text
}
}
task i2ptunnelJar(type: Jar) {
from sourceSets.main.output
exclude '**/web/*.class'
exclude '**/ui/*.class'
exclude '**/EditBean.class'
exclude '**/IndexBean.class'
@@ -51,21 +31,8 @@ task i2ptunnelJar(type: Jar) {
attributes 'Main-Class': 'net.i2p.i2ptunnel.I2PTunnel'
attributes 'Class-Path': 'i2p.jar mstreaming.jar'
}
from ('resources', {
into "net/i2p/i2ptunnel/resources"
})
from ('../routerconsole/jsp', {
include 'themes/console/*/*.css'
include 'themes/console/images/i2plogo.png'
include 'themes/console/images/favicon.ico'
include 'themes/console/images/itoopie_sm.png'
into "net/i2p/i2ptunnel/resources"
})
}
i2ptunnelJar.dependsOn bundleProxy
war.dependsOn bundle
// not needed unless we're building for both android and regular
task tempBeansJar(type: Jar) {
from sourceSets.main.output
include '**/EditBean.class'
@@ -74,7 +41,6 @@ task tempBeansJar(type: Jar) {
baseName = 'temp-beans'
}
// only for android
task uiJar(type: Jar) {
baseName = 'i2ptunnel-ui'
from sourceSets.main.output
@@ -85,26 +51,12 @@ task uiJar(type: Jar) {
}
artifacts {
archives i2ptunnelJar //, tempBeansJar, uiJar
archives i2ptunnelJar, tempBeansJar, uiJar
}
war {
include '**/EditBean.class'
include '**/ui/*.class'
include '**/IndexBean.class'
from 'jsp'
rootSpec.exclude('/net/i2p/i2ptunnel/*.class')
rootSpec.exclude('/net/i2p/i2ptunnel/access')
rootSpec.exclude('/net/i2p/i2ptunnel/irc')
rootSpec.exclude('/net/i2p/i2ptunnel/localServer')
rootSpec.exclude('/net/i2p/i2ptunnel/proxy')
rootSpec.exclude('/net/i2p/i2ptunnel/socks')
rootSpec.exclude('/net/i2p/i2ptunnel/streamr')
rootSpec.exclude('/net/i2p/i2ptunnel/udp')
rootSpec.exclude('/net/i2p/i2ptunnel/udpTunnel')
exclude 'jsp/web.xml'
exclude '*.jsi'
exclude '*.jsp'
webXml = file('jsp/web.xml')
}

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="test/junit"/>
<classpathentry combineaccessrules="false" kind="src" path="/i2p_sdk"/>
<classpathentry combineaccessrules="false" kind="src" path="/ministreaming"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
<classpathentry kind="output" path="build/obj"/>
</classpath>

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>i2ptunnel</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@@ -86,12 +86,7 @@
<target name="jar" depends="builddep, compile, bundle-proxy, jarUpToDate, listChangedFiles" unless="jar.uptodate" >
<!-- set if unset -->
<property name="workspace.changes.j.tr" value="" />
<mkdir dir="./build/obj/net/i2p/i2ptunnel/resources"/>
<copy todir="./build/obj/net/i2p/i2ptunnel/resources">
<fileset dir="../../routerconsole/jsp/" includes="themes/console/*/*.css themes/console/images/i2plogo.png themes/console/images/favicon.ico themes/console/images/itoopie_sm.png" />
<fileset dir="../resources" includes="**/*.ht" />
</copy>
<jar destfile="./build/i2ptunnel.jar" basedir="./build/obj" excludes="**/ui/*.class **/web/*.class" >
<jar destfile="./build/i2ptunnel.jar" basedir="./build/obj" includes="**/*.class" excludes="**/ui/*.class **/web/*.class" >
<manifest>
<attribute name="Main-Class" value="net.i2p.i2ptunnel.I2PTunnel" />
<attribute name="${manifest.classpath.name}" value="i2p.jar mstreaming.jar" />
@@ -235,7 +230,7 @@
<pathelement location="../../../build/i2p.jar" />
</classpath>
<arg value="tag" />
<arg value="../resources/proxy/" />
<arg value="../../../installer/resources/proxy/" />
<arg value="build/Proxy.java" />
</java>
</target>

View File

@@ -10,7 +10,6 @@
#
# zzz - public domain
#
cd `dirname $0`
CLASS=net.i2p.i2ptunnel.proxy.messages
TMPFILE=build/javafiles-proxy.txt
export TZ=UTC

View File

@@ -10,7 +10,6 @@
#
# zzz - public domain
#
cd `dirname $0`
CLASS=net.i2p.i2ptunnel.web.messages
TMPFILE=build/javafiles.txt
export TZ=UTC

View File

@@ -291,13 +291,10 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
_socketManagerState = SocketManagerState.INIT;
// We could be here a LONG time, holding the lock
socketManager = buildSocketManager(tunnel, pkf);
/*
since we enabled ratchet by default, we're not compatible with ancient servers anyway.
// FIXME may not be the right place for this
I2PSession sub = addSubsession(tunnel);
if (sub != null && _log.shouldLog(Log.WARN))
_log.warn("Added subsession " + sub);
*/
} else {
if (_log.shouldLog(Log.INFO))
_log.info(tunnel.getClientOptions().getProperty("inbound.nickname") + ": Not building a new socket manager since the old one is open [s=" + s + "]");
@@ -310,15 +307,9 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
if (_log.shouldLog(Log.INFO))
_log.info(tunnel.getClientOptions().getProperty("inbound.nickname") + ": Building a new socket manager since there is no other one");
socketManager = buildSocketManager(tunnel, pkf);
/*
since we enabled ratchet by default, we're not compatible with ancient servers anyway.
I2PSession sub = addSubsession(tunnel);
if (sub != null && _log.shouldLog(Log.WARN))
_log.warn("Added subsession " + sub);
*/
}
return socketManager;
}
@@ -328,9 +319,7 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
*
* @return subsession, or null if none was added
* @since 0.9.20
* @deprecated unused as of 0.9.49
*/
@Deprecated
protected static synchronized I2PSession addSubsession(I2PTunnel tunnel) {
I2PSession sess = socketManager.getSession();
if (sess.getMyDestination().getSigType() == SigType.DSA_SHA1)

View File

@@ -68,7 +68,7 @@ import net.i2p.util.PortMapper;
* Rewrite as http://i2p/$b64key/...
*
* If the $site resolves with the I2P naming service, then it is directed towards
* that I2P Site, otherwise it is directed towards this client's outproxy (typically
* that eepsite, otherwise it is directed towards this client's outproxy (typically
* "squid.i2p"). Only HTTP and HTTPS are supported (no ftp, mailto, etc). Both GET
* and POST have been tested, though other $methods should work.
*
@@ -678,7 +678,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
// allow i2paddresshelper=<b32>.b32.i2p syntax.
/*
also i2paddresshelper=name.i2p for aliases
i.e. on your I2P Site put
i.e. on your eepsite put
<a href="?i2paddresshelper=name.i2p">This is the name I want to be called.</a>
*/
Destination _dest = _context.namingService().lookup(ahelperKey);
@@ -1351,7 +1351,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
}
// Redirect to non-addresshelper URL to not clog the browser address bar
// and not pass the parameter to the I2P Site.
// and not pass the parameter to the eepsite.
// This also prevents the not-found error page from looking bad
// Syndie can't handle a redirect of a POST
if (ahelperPresent && !"POST".equals(method) && !"PUT".equals(method)) {

View File

@@ -7,7 +7,6 @@ import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
@@ -41,7 +40,6 @@ import net.i2p.data.Base64;
import net.i2p.data.DataHelper;
import net.i2p.data.Destination;
import net.i2p.data.i2cp.MessageStatusMessage;
import net.i2p.i2ptunnel.localServer.LocalHTTPServer;
import net.i2p.util.EepGet;
import net.i2p.util.EventDispatcher;
import net.i2p.util.InternalSocket;
@@ -672,7 +670,8 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem
* @since 0.9.4 moved from I2PTunnelHTTPClient
*/
protected static String getErrorPage(I2PAppContext ctx, String base, String backup) {
String file = "proxy/" + base + "-header.ht";
File errorDir = new File(ctx.getBaseDir(), "docs");
File file = new File(errorDir, base + "-header.ht");
try {
return readFile(ctx, file);
} catch(IOException ioe) {
@@ -684,24 +683,20 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem
private static final String BUNDLE_NAME = "net.i2p.i2ptunnel.proxy.messages";
/**
* As of 0.9.49, loads the error pages from the jar, not the file system.
* @since 0.9.4 moved from I2PTunnelHTTPClient
*/
private static String readFile(I2PAppContext ctx, String file) throws IOException {
private static String readFile(I2PAppContext ctx, File file) throws IOException {
Reader reader = null;
char[] buf = new char[512];
StringBuilder out = new StringBuilder(2048);
InputStream in = LocalHTTPServer.getResource(file);
if (in == null)
throw new IOException();
try {
boolean hasSusiDNS = ctx.portMapper().isRegistered(PortMapper.SVC_SUSIDNS);
boolean hasI2PTunnel = ctx.portMapper().isRegistered(PortMapper.SVC_I2PTUNNEL);
if (hasSusiDNS && hasI2PTunnel) {
reader = new TranslateReader(ctx, BUNDLE_NAME, in);
reader = new TranslateReader(ctx, BUNDLE_NAME, new FileInputStream(file));
} else {
// strip out the addressbook links
reader = new InputStreamReader(in, "UTF-8");
reader = new InputStreamReader(new FileInputStream(file), "UTF-8");
int len;
while((len = reader.read(buf)) > 0) {
out.append(buf, 0, len);
@@ -739,7 +734,6 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem
String rv = out.toString();
return rv;
} finally {
try { in.close(); } catch (IOException ioe) {}
try {
if(reader != null)
reader.close();

View File

@@ -218,14 +218,6 @@ public class TunnelControllerGroup implements ClientApp {
}
}
/**
* Helper
* @since 0.9.49
*/
public I2PAppContext getContext() {
return _context;
}
/**
* ClientApp interface
* @throws IllegalArgumentException if unable to load config from file
@@ -383,8 +375,6 @@ public class TunnelControllerGroup implements ClientApp {
* @throws IllegalArgumentException if unable to load from file
*/
private synchronized void loadControllers(File cfgFile, boolean shouldMigrate) {
if (_log.shouldInfo())
_log.info("Getting controllers from config file " + cfgFile);
File dir = new SecureDirectory(_context.getConfigDir(), CONFIG_DIR);
List<Properties> props = null;
if (cfgFile.exists()) {
@@ -970,6 +960,9 @@ public class TunnelControllerGroup implements ClientApp {
* @since 0.9.42
*/
private List<TunnelController> getControllers(File cfgFile) {
if (_log.shouldInfo())
_log.info("Getting controllers from config file " + cfgFile);
synchronized (this) {
if (!_controllersLoaded)
loadControllers(cfgFile);

View File

@@ -5,7 +5,6 @@ package net.i2p.i2ptunnel.localServer;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
@@ -125,30 +124,32 @@ public abstract class LocalHTTPServer {
if ((method.equals("GET") || method.equals("HEAD")) &&
targetRequest.startsWith("/themes/") &&
!targetRequest.contains("..")) {
String filename = targetRequest.substring(1);
String filename = null;
try {
filename = targetRequest.substring(8); // "/themes/".length
} catch (IndexOutOfBoundsException ioobe) {
return;
}
// theme hack
if (filename.startsWith("themes/console/default/"))
if (filename.startsWith("console/default/"))
filename = filename.replaceFirst("default", context.getProperty("routerconsole.theme", "light"));
InputStream in = getResource(filename);
if (in != null) {
try {
String type;
if (filename.endsWith(".css"))
type = "text/css";
else if (filename.endsWith(".ico"))
type = "image/x-icon";
else if (filename.endsWith(".png"))
type = "image/png";
else if (filename.endsWith(".jpg"))
type = "image/jpeg";
else type = "text/html";
out.write("HTTP/1.1 200 OK\r\nContent-Type: ".getBytes("UTF-8"));
out.write(type.getBytes("UTF-8"));
out.write("\r\nCache-Control: max-age=86400\r\nConnection: close\r\nProxy-Connection: close\r\n\r\n".getBytes("UTF-8"));
DataHelper.copy(in, out);
} finally {
try { in.close(); } catch (IOException ioe) {}
}
File themesDir = new File(context.getBaseDir(), "docs/themes");
File file = new File(themesDir, filename);
if (file.exists() && !file.isDirectory()) {
String type;
if (filename.endsWith(".css"))
type = "text/css";
else if (filename.endsWith(".ico"))
type = "image/x-icon";
else if (filename.endsWith(".png"))
type = "image/png";
else if (filename.endsWith(".jpg"))
type = "image/jpeg";
else type = "text/html";
out.write("HTTP/1.1 200 OK\r\nContent-Type: ".getBytes("UTF-8"));
out.write(type.getBytes("UTF-8"));
out.write("\r\nCache-Control: max-age=86400\r\nConnection: close\r\nProxy-Connection: close\r\n\r\n".getBytes("UTF-8"));
FileUtil.readFile(filename, themesDir.getAbsolutePath(), out);
return;
}
}
@@ -482,15 +483,6 @@ public abstract class LocalHTTPServer {
return buf.toString();
}
/**
* @param resource relative path
* @return stream or null if not found
* @since 0.9.49
*/
public static InputStream getResource(String resource) {
return LocalHTTPServer.class.getResourceAsStream("/net/i2p/i2ptunnel/resources/" + resource);
}
/** these strings go in the jar, not the war */
private static final String BUNDLE_NAME = "net.i2p.i2ptunnel.proxy.messages";

View File

@@ -88,53 +88,24 @@ public class GeneralHelper {
return null;
}
/**
* Save the configuration for a new or existing tunnel to disk.
* For new tunnels, adds to controller and (if configured) starts it.
*/
public List<String> saveTunnel(int tunnel, TunnelConfig config) {
return saveTunnel(_context, _group, tunnel, config);
}
/**
* Save the configuration for a new or existing tunnel to disk.
* For new tunnels, adds to controller and (if configured) starts it.
*
* @param context unused, taken from tcg
*/
public static List<String> saveTunnel(I2PAppContext context, TunnelControllerGroup tcg, int tunnel, TunnelConfig config) {
List<String> msgs = new ArrayList<String>();
TunnelController cur = updateTunnelConfig(tcg, tunnel, config, msgs);
msgs.addAll(saveConfig(tcg, cur));
public static List<String> saveTunnel(
I2PAppContext context, TunnelControllerGroup tcg, int tunnel, TunnelConfig config) {
List<String> msgs = updateTunnelConfig(tcg, tunnel, config);
msgs.addAll(saveConfig(context, tcg, tunnel));
return msgs;
}
/**
* Update the config and if shared, adjust and save the config of other shared clients.
* If a new tunnel, this will call tcg.addController(), and start it if so configured.
* This does NOT save this tunnel's config. Caller must call saveConfig() also.
*/
protected static List<String> updateTunnelConfig(TunnelControllerGroup tcg, int tunnel, TunnelConfig config) {
List<String> msgs = new ArrayList<String>();
updateTunnelConfig(tcg, tunnel, config, msgs);
return msgs;
}
/**
* Update the config and if shared, adjust and save the config of other shared clients.
* If a new tunnel, this will call tcg.addController(), and start it if so configured.
* This does NOT save this tunnel's config. Caller must call saveConfig() also.
*
* @param msgs out parameter, messages will be added
* @return the old or new controller, non-null.
* @since 0.9.49
*/
private static TunnelController updateTunnelConfig(TunnelControllerGroup tcg, int tunnel, TunnelConfig config, List<String> msgs) {
// Get current tunnel controller
TunnelController cur = getController(tcg, tunnel);
Properties props = config.getConfig();
List<String> msgs = new ArrayList<String>();
String type = props.getProperty(TunnelController.PROP_TYPE);
if (TunnelController.TYPE_STD_CLIENT.equals(type) || TunnelController.TYPE_IRC_CLIENT.equals(type)) {
//
@@ -183,8 +154,20 @@ public class GeneralHelper {
tcg.addController(cur);
if (cur.getStartOnLoad())
cur.startTunnelBackground();
try {
tcg.saveConfig(cur);
} catch (IOException ioe) {
msgs.add("Failed to save initial tunnel config after creation " +
cur.getName() + ", check logs:" + ioe);
}
} else {
cur.setConfig(props, "");
try {
tcg.saveConfig(cur);
} catch (IOException ioe) {
msgs.add("Failed to save initial tunnel config after creation " +
cur.getName() + ", check logs:" + ioe);
}
}
// Only modify other shared tunnels
// if the current tunnel is shared, and of supported type
@@ -205,13 +188,14 @@ public class GeneralHelper {
try {
tcg.saveConfig(c);
} catch (IOException ioe) {
msgs.add(0, _t("Failed to save configuration", tcg.getContext()) + ": " + ioe);
msgs.add("Failed to save initial tunnel config after creation " +
cur.getName() + ", check logs:" + ioe);
}
}
}
}
return cur;
return msgs;
}
/**
@@ -256,35 +240,16 @@ public class GeneralHelper {
to.setConfig(cOpt, "");
}
/**
* Save the configuration for an existing tunnel to disk.
* New tunnels must use saveConfig(..., TunnelController).
*
* @param context unused, taken from tcg
* @param tunnel must already exist
* @since 0.9.49
*/
protected static List<String> saveConfig(I2PAppContext context, TunnelControllerGroup tcg, int tunnel) {
TunnelController cur = getController(tcg, tunnel);
if (cur == null) {
List<String> rv = tcg.clearAllMessages();
rv.add("Invalid tunnel number");
return rv;
}
return saveConfig(tcg, cur);
}
/**
* Save the configuration to disk.
* For new and existing tunnels.
* Does NOT call tcg.addController() for new tunnels. See udpateConfig()
*
* @since 0.9.49
*/
private static List<String> saveConfig(TunnelControllerGroup tcg, TunnelController cur) {
I2PAppContext context = tcg.getContext();
protected static List<String> saveConfig(
I2PAppContext context, TunnelControllerGroup tcg, int tunnel) {
List<String> rv = tcg.clearAllMessages();
try {
TunnelController cur = getController(tcg, tunnel);
if (cur == null) {
//List<String> msgs = new ArrayList<String>();
rv.add("Invalid tunnel number");
return rv;
}
tcg.saveConfig(cur);
rv.add(0, _t("Configuration changes saved", context));
} catch (IOException ioe) {

View File

@@ -18,7 +18,7 @@
<div class="panel" id="overview"><h2><%=intl._t("Hidden Services Manager")%></h2><p>
<%=intl._t("These are the local services provided by your router.")%>
&nbsp;
<%=intl._t("By default, most of your client services (email, HTTP proxy, IRC) will share the same set of tunnels and be listed as \"Shared Clients\".")%>
<%=intl._t("By default, most of your client services (email, HTTP proxy, IRC) will share the same set of tunnels and be listed as \"Shared Clients\" and \"Shared Clients(DSA)\".")%>
</p></div>
<%
boolean isInitialized = indexBean.isInitialized();

View File

@@ -221,6 +221,10 @@ hr {
padding: 7px 8px 3px;
}
button.control, input.control {
padding: 5px 8px !important;
}
.control:hover, .control:focus {
text-decoration: none;
color: #19191f;
@@ -655,6 +659,7 @@ input {
#tunnelDepth, #tunnelVariance, #tunnelQuantity, #tunnelBackupQuantity,
#tunnelDepthOut, #tunnelVarianceOut, #tunnelQuantityOut, #tunnelBackupQuantityOut,
#localDestination, #customOptions, #leasesetKey, #name, #description, textarea[name="accessList"] {
width: 100% !important;
margin: 0 !important;
text-align: left !important;
}
@@ -956,6 +961,7 @@ input.tunnelName, input.tunnelDescriptionText, #userAgents, .freetext.tunnelDesc
#customOptions {
margin-top: 15px !important;
width: 99%;
width: calc(100% - 10px) !important;
}
#tunnelDepth, #tunnelVariance, #tunnelQuantity, #tunnelBackupQuantity,

View File

@@ -134,7 +134,7 @@
<%=intl._t("Try this if none of the tunnel types below fit your requirements, or you don't know what type of tunnel you need.")%>
</td></tr>
<tr><td>HTTP/HTTPS</td><td>
<%=intl._t("Tunnel that acts as an HTTP proxy for reaching I2P Sites inside I2P.")%>
<%=intl._t("Tunnel that acts as an HTTP proxy for reaching eepsites inside I2P.")%>
<%=intl._t("Set your browser to use this tunnel as an http proxy, or set your \"http_proxy\" environment variable for command-line applications in GNU/Linux.")%>
<%=intl._t("Websites outside I2P can also be reached if an HTTP proxy within I2P is known.")%>
</td></tr>
@@ -161,7 +161,7 @@
</td></tr>
<tr><td>HTTP</td><td>
<%=intl._t("A server tunnel that is customised for HTTP connections.")%>
<%=intl._t("Use this tunnel type if you want to host an I2P Site.")%>
<%=intl._t("Use this tunnel type if you want to host an eepsite.")%>
</td></tr>
<tr><td>IRC</td><td>
<%=intl._t("A customised server tunnel for hosting IRC networks inside I2P.")%>

View File

@@ -1,25 +0,0 @@
plugins {
id 'war'
}
sourceSets {
main {
java {
srcDir 'identicon/core/src/main/java'
srcDir 'imagegen/webapp/src/main/java'
srcDir 'zxing/core/src/main/java'
srcDir 'zxing/javase/src/main/java'
}
}
}
dependencies {
compile project(':core')
providedCompile project(':apps:jetty')
}
war {
from 'imagegen/webapp/src/main/webapp/imagegen.css'
from 'imagegen/webapp/src/main/webapp/index.html'
webXml = file('imagegen/webapp/src/main/webapp/WEB-INF/web.xml')
}

View File

@@ -9,8 +9,8 @@ sourceSets {
}
dependencies {
ext.jettyVersion = '9.3.29.v20201019'
ext.tomcatVersion = '9.0.40'
ext.jettyVersion = '9.2.25.v20180606'
ext.tomcatVersion = '8.5.40'
compile project(':core')
compile 'org.eclipse.jetty:jetty-http:' + ext.jettyVersion
compile 'org.eclipse.jetty:jetty-io:' + ext.jettyVersion

View File

@@ -439,7 +439,6 @@
<copy todir="build/obj" file="resources/log4j.properties" />
<jar destfile="./jettylib/jetty-i2p.jar" basedir="./build/obj" includes="**/*.class log4j.properties" >
<manifest>
<attribute name="Implementation-Version" value="${full.version}" />
<attribute name="Built-By" value="${build.built-by}" />
<attribute name="Build-Date" value="${build.timestamp}" />
<attribute name="Base-Revision" value="${workspace.version}" />

View File

@@ -14,8 +14,6 @@
package net.i2p.jetty;
import java.nio.channels.ClosedChannelException;
import net.i2p.I2PAppContext;
import net.i2p.util.Log;
@@ -129,7 +127,7 @@ public class I2PLogger implements Logger
if (th != null) {
if (_log.shouldLog(Log.WARN))
_log.warn(msg, th);
else if (!(th instanceof ClosedChannelException))
else
_log.logAlways(Log.WARN, msg + ": " + th);
} else {
_log.logAlways(Log.WARN, msg);

View File

@@ -317,7 +317,7 @@ public class I2PRequestLog extends AbstractLifeCycle implements RequestLog
buf.append(request.getMethod());
buf.append(' ');
u8buf.append(request.getRequestURI());
u8buf.append(request.getHttpURI().toString());
buf.append(' ');
buf.append(request.getProtocol());

View File

@@ -8,7 +8,6 @@ sourceSets {
main {
java {
srcDir 'java/src'
srcDir 'java/build/messages-src'
}
}
test {
@@ -22,17 +21,6 @@ dependencies {
api project(':core')
}
// Create the java files from the po files. The jar task will compile them.
// This requires gettext 0.19 or higher.
// We don't support the "slow way"
task bundle {
doLast {
if (!(new File("$buildDir/classes/java/main/net/i2p/client/streaming/messages_de.class")).exists())
println "apps/ministreaming/java/bundle-messages.sh".execute().text
}
}
jar.dependsOn bundle
jar {
manifest {
attributes 'Specification-Title': 'I2P Streaming API'

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="test/junit"/>
<classpathentry kind="src" path="demo"/>
<classpathentry combineaccessrules="false" kind="src" path="/i2p_sdk"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="output" path="build/obj"/>
</classpath>

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>ministreaming</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@@ -10,7 +10,6 @@
#
# zzz - public domain
#
cd `dirname $0`
CLASS=net.i2p.client.streaming.messages
TMPFILE=build/javafiles.txt
export TZ=UTC

View File

@@ -60,6 +60,6 @@ public class I2PSocketExceptionTest {
public void testUnknownStatus() {
I2PSocketException e = new I2PSocketException(255);
assertThat(e.getStatus(), is(255));
assertThat(e.getMessage(), endsWith(": 255"));
assertThat(e.getMessage(), is("Failure code: 255"));
}
}

View File

@@ -7,9 +7,6 @@ sourceSets {
main {
java {
srcDir 'java/src'
srcDir 'java/build/messages-src'
srcDir 'java/build/messages-countries-src'
srcDir 'java/build/messages-news-src'
}
}
}
@@ -43,27 +40,7 @@ if (System.getenv("TARGET_JAVA_HOME") == null && JavaVersion.current() != JavaVe
test.dependsOn scalaTest
}
// Create the java files from the po files. The jar task will compile them.
// This requires gettext 0.19 or higher.
// We don't support the "slow way"
task bundleJar {
doLast {
if (!(new File("$buildDir/classes/java/main/net/i2p/router/countries/messages_de.class")).exists())
println "apps/routerconsole/java/bundle-messages-countries.sh".execute().text
if (!(new File("$buildDir/classes/java/main/net/i2p/router/news/messages_de.class")).exists())
println "apps/routerconsole/java/bundle-messages-news.sh".execute().text
}
}
task bundle {
doLast {
if (!(new File("$buildDir/classes/java/main/net/i2p/router/web/messages_de.class")).exists())
println "apps/routerconsole/java/bundle-messages.sh".execute().text
}
}
task consoleJar(type: Jar) {
from sourceSets.main.output
exclude 'net/i2p/router/web/helpers/**'
jar {
manifest {
// Top level installer will rename to jrobin.jar
// DTG added in 0.8.4, not in the classpath for very old installs,
@@ -73,30 +50,12 @@ task consoleJar(type: Jar) {
// All new jetty 7 jars should have been in 0.9.6, added in 0.9.7
attributes 'Class-Path': 'i2p.jar router.jar jrobin.jar desktopgui.jar i2psnark.jar jstl.jar standard.jar jetty-continuation.jar jetty-http.jar jetty-io.jar jetty-security.jar jetty-servlet.jar jetty-servlets.jar jetty-util.jar jetty-webapp.jar'
}
from ('resources-news', {
into "net/i2p/router/news/resources"
})
}
consoleJar.dependsOn bundleJar
war.dependsOn bundle
artifacts {
archives consoleJar
}
war {
rootSpec.exclude('/com/vuze/**/*')
rootSpec.exclude('/edu/internet2/**/*')
rootSpec.exclude('/net/i2p/router/news/*')
rootSpec.exclude('/net/i2p/router/sybil/*')
rootSpec.exclude('/net/i2p/router/update/*')
rootSpec.exclude('/net/i2p/router/web/*.class')
from 'jsp'
exclude 'jsp/web.xml'
exclude '*.jsi'
exclude '*.jsp'
// Remove classes from the classpath, they are in the jar.
// If we return to precompiling jsps this needs to change.
classpath = []
webXml = file('jsp/web.xml')
from ('resources', {
into "WEB-INF/classes/net/i2p/router/web/resources"
})
}

View File

@@ -140,11 +140,7 @@
<copy file="src/edu/internet2/ndt/locale/Tcpbw100_msgs_nl_NL.properties" tofile="build/obj/edu/internet2/ndt/locale/Tcpbw100_msgs_nl.properties" />
<copy file="src/edu/internet2/ndt/locale/Tcpbw100_msgs_pt_BR.properties" tofile="build/obj/edu/internet2/ndt/locale/Tcpbw100_msgs_pt.properties" />
<copy file="src/edu/internet2/ndt/locale/Tcpbw100_msgs_ru_RU.properties" tofile="build/obj/edu/internet2/ndt/locale/Tcpbw100_msgs_ru.properties" />
<mkdir dir="build/obj/net/i2p/router/news/resources" />
<copy todir="build/obj/net/i2p/router/news/resources" >
<fileset dir="../resources-news" />
</copy>
<jar destfile="./build/routerconsole.jar" basedir="./build/obj" excludes="net/i2p/router/web/helpers/**/* net/i2p/router/web/servlets/**/* net/i2p/router/web/resources/**/*">
<jar destfile="./build/routerconsole.jar" basedir="./build/obj" excludes="net/i2p/router/web/helpers/* net/i2p/router/web/servlets/*">
<manifest>
<!-- DTG added in 0.8.4, not in the classpath for very old installs, before we changed wrapper.config to specify * -->
<!-- very old installs don't have i2psnark,jstl,standard in the classpath... not added in WebAppConfiguration any more -->
@@ -164,11 +160,7 @@
<!-- newsxml.jar only (subset of routerconsole, no war) for Android -->
<target name="newsxmljar" depends="compileNewsOnly" >
<mkdir dir="build/obj/net/i2p/router/news/resources" />
<copy todir="build/obj/net/i2p/router/news/resources" >
<fileset dir="../resources-news" />
</copy>
<jar destfile="./build/newsxml.jar" basedir="./build/obj" includes="net/i2p/router/news/**/*" >
<jar destfile="./build/newsxml.jar" basedir="./build/obj" includes="**/*.class">
</jar>
</target>
@@ -346,13 +338,10 @@
<target name="war" depends="precompilejsp, warUpToDate, listChangedFiles2" unless="war.uptodate" >
<!-- set if unset -->
<property name="workspace.changes.w.tr" value="" />
<!-- Don't include the css in the war, the main build.xml will copy it to docs/themes/console/ -->
<copy file="../jsp/themes/console/images/favicon.ico" tofile="../jsp/favicon.ico" />
<mkdir dir="build/obj/net/i2p/router/web/resources" />
<copy todir="build/obj/net/i2p/router/web/resources" >
<fileset dir="../resources" />
</copy>
<war destfile="build/routerconsole.war" webxml="../jsp/web-out.xml"
basedir="../jsp/" excludes="web.xml, **/*.java, *.jsp, *.jsi, web-fragment.xml, web-out.xml">
basedir="../jsp/" excludes="web.xml, *.css, **/*.java, *.jsp, *.jsi, web-fragment.xml, web-out.xml">
<manifest>
<attribute name="Implementation-Version" value="${full.version}" />
<attribute name="Built-By" value="${build.built-by}" />
@@ -362,9 +351,8 @@
<attribute name="X-Compile-Source-JDK" value="${javac.version}" />
<attribute name="X-Compile-Target-JDK" value="${javac.version}" />
</manifest>
<classes dir="./build/obj" includes="net/i2p/router/web/helpers/* net/i2p/router/web/servlets/* net/i2p/router/web/resources/**/*" />
<classes dir="./build/obj" includes="net/i2p/router/web/helpers/* net/i2p/router/web/servlets/*" />
</war>
<delete file="../jsp/favicon.ico" />
</target>
<target name="warUpToDate">

View File

@@ -10,7 +10,6 @@
#
# zzz - public domain
#
cd `dirname $0`
CLASS=net.i2p.router.countries.messages
TMPFILE=build/javafiles-countries.txt
export TZ=UTC
@@ -34,9 +33,9 @@ fi
# set LG2 to the language you need in environment variables to enable this
#
# generate strings/Countries.java from ../../../core/resources/countries.txt
# generate strings/Countries.java from ../../../installer/resources/countries.txt
#
CFILE=../../../core/resources/countries.txt
CFILE=../../../installer/resources/countries.txt
# add ../java/ so the refs will work in the po file
JFILE=../java/build/Countries.java
if [ $CFILE -nt $JFILE -o ! -s $JFILE ]

View File

@@ -10,7 +10,6 @@
#
# zzz - public domain
#
cd `dirname $0`
CLASS=net.i2p.router.news.messages
TMPFILE=build/javafiles-news.txt
export TZ=UTC

View File

@@ -10,7 +10,6 @@
#
# zzz - public domain
#
cd `dirname $0`
CLASS=net.i2p.router.web.messages
TMPFILE=build/javafiles.txt
export TZ=UTC
@@ -40,7 +39,6 @@ fi
ROUTERFILES="\
../../../router/java/src/net/i2p/router/Blocklist.java \
../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java \
../../../router/java/src/net/i2p/router/sybil/Analysis.java \
../../../router/java/src/net/i2p/router/tasks/CoalesceStatsEvent.java \
../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java \
../../../router/java/src/net/i2p/router/transport/GetBidsJob.java \

View File

@@ -1,7 +1,7 @@
package net.i2p.router.news;
import java.io.File;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.Reader;
import java.text.DateFormat;
@@ -190,17 +190,12 @@ public class NewsManager implements ClientApp {
}
private List<NewsEntry> parseInitialNews() {
InputStream is = NewsManager.class.getResourceAsStream("/net/i2p/router/news/resources/docs/initialNews/initialNews.xml");
if (is == null) {
if (_log.shouldWarn())
_log.warn("failed to load initial news");
return Collections.emptyList();
}
File file = new File(_context.getBaseDir(), "docs/initialNews/initialNews.xml");
Reader reader = null;
try {
char[] buf = new char[512];
StringBuilder out = new StringBuilder(2048);
reader = new TranslateReader(_context, BUNDLE_NAME, is);
reader = new TranslateReader(_context, BUNDLE_NAME, new FileInputStream(file));
int len;
while((len = reader.read(buf)) > 0) {
out.append(buf, 0, len);
@@ -211,17 +206,14 @@ public class NewsManager implements ClientApp {
rv.get(0).updated = _context.clock().now();
} else {
if (_log.shouldWarn())
_log.warn("failed to load initial news");
_log.warn("failed to load " + file);
}
return rv;
} catch (IOException ioe) {
if (_log.shouldWarn())
_log.warn("failed to load initial news", ioe);
_log.warn("failed to load " + file, ioe);
return Collections.emptyList();
} finally {
try {
is.close();
} catch (IOException foo) {}
try {
if (reader != null)
reader.close();

View File

@@ -33,6 +33,7 @@ import net.i2p.router.peermanager.DBHistory;
import net.i2p.router.peermanager.PeerProfile;
import net.i2p.router.tunnel.pool.TunnelPool;
import net.i2p.router.util.HashDistance;
import net.i2p.router.web.Messages;
import net.i2p.stat.Rate;
import net.i2p.stat.RateAverages;
import net.i2p.stat.RateStat;
@@ -40,7 +41,6 @@ import net.i2p.util.Addresses;
import net.i2p.util.Log;
import net.i2p.util.ObjectCounter;
import net.i2p.util.SystemVersion;
import net.i2p.util.Translate;
/**
*
@@ -94,10 +94,9 @@ public class Analysis extends JobImpl implements RouterApp {
private static final double POINTS_NEW = 4.0;
private static final double POINTS_BANLIST = 25.0;
public static final boolean DEFAULT_BLOCK = true;
public static final double DEFAULT_BLOCK_THRESHOLD = 50.0;
public static final double DEFAULT_BLOCK_THRESHOLD = 75.0;
public static final long DEFAULT_BLOCK_TIME = 7*24*60*60*1000L;
public static final long DEFAULT_REMOVE_TIME = 10*24*60*60*1000L;
public static final long SHORT_REMOVE_TIME = 2*24*60*60*1000L;
public static final long DEFAULT_REMOVE_TIME = 30*24*60*60*1000L;
public static final long DEFAULT_FREQUENCY = 24*60*60*1000L;
public static final float MIN_BLOCK_POINTS = 12.01f;
@@ -844,10 +843,8 @@ public class Analysis extends JobImpl implements RouterApp {
return Util.biLog2(a);
}
private static final String BUNDLE_NAME = "net.i2p.router.web.messages";
private String _t(String s) {
return Translate.getString(s, _context, BUNDLE_NAME);
return Messages.getString(s, _context);
}
/**
@@ -863,6 +860,6 @@ public class Analysis extends JobImpl implements RouterApp {
* Use autoboxing to call with ints, longs, floats, etc.
*/
private String _t(String s, Object o) {
return Translate.getString(s, o, _context, BUNDLE_NAME);
return Messages.getString(s, o, _context);
}
}

View File

@@ -19,12 +19,11 @@ import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import net.i2p.I2PAppContext;
import net.i2p.app.ClientApp;
import net.i2p.app.ClientAppManager;
import net.i2p.data.Base64;
import net.i2p.data.DataFormatException;
import net.i2p.data.DataHelper;
import net.i2p.data.Hash;
import net.i2p.router.web.helpers.SybilRenderer;
import net.i2p.util.Log;
import net.i2p.util.FileSuffixFilter;
import net.i2p.util.SecureDirectory;
@@ -181,18 +180,7 @@ public class PersistSybil {
* @since 0.9.41
*/
public synchronized void removeOld() {
// if we don't have a console, don't keep too many
long removeTime = Analysis.SHORT_REMOVE_TIME;
ClientAppManager cmgr = _context.clientAppManager();
if (cmgr != null) {
ClientApp console = cmgr.getRegisteredApp("console");
if (console != null)
removeTime = Analysis.DEFAULT_REMOVE_TIME;
}
long age = _context.getProperty(Analysis.PROP_REMOVETIME, removeTime);
long freq2 = 2 * _context.getProperty(Analysis.PROP_FREQUENCY, Analysis.DEFAULT_FREQUENCY);
if (age < freq2)
age = freq2;
long age = _context.getProperty(Analysis.PROP_REMOVETIME, Analysis.DEFAULT_REMOVE_TIME);
if (age < 60*1000)
return;
long cutoff = _context.clock().now() - age;

View File

@@ -5,6 +5,5 @@ store and load the results.
</p>
<p>
Since 0.9.38.
Moved from console to router in 0.9.49.
</p>
</body></html>

View File

@@ -21,7 +21,6 @@ public class CSSHelper extends HelperBase {
/** @since 0.9.33 moved from ConfigUIHelper */
public static final String PROP_THEME_PFX = PROP_THEME_NAME + '.';
public static final String DEFAULT_THEME = "light";
public static final String ALT_THEME = "dark";
public static final String BASE_THEME_PATH = "/themes/console/";
private static final String FORCE = "classic";
public static final String PROP_REFRESH = "routerconsole.summaryRefresh";

View File

@@ -1,10 +1,6 @@
package net.i2p.router.web;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Locale;
import net.i2p.util.FileUtil;
@@ -16,15 +12,12 @@ public class ContentHelper extends HelperBase {
private String _lang;
/**
* Caution, use absolute paths only for getContent() and getTextContent(),
* do not assume files are in CWD.
* Caution, use absolute paths only, do not assume files are in CWD
*/
public void setPage(String page) { _page = page; }
public void setStartAtBeginning(String moo) {
_startAtBeginning = Boolean.parseBoolean(moo);
}
public void setLang(String l) {
/*****
if((_lang == null || !_lang.equals(l)) && (l != null)) {

View File

@@ -13,6 +13,4 @@ public class GraphConstants {
public static final int DEFAULT_Y = 100;
public static final int MAX_X = 2048;
public static final int MAX_Y = 1024;
public static final String PROP_UTC = "routerconsole.graphUTC";
}

View File

@@ -1009,7 +1009,7 @@ public class PluginStarter implements Runnable {
return false;
boolean rv = group.activeCount() > 0;
// Plugins start before the I2P Site, and will create the static Timer thread
// Plugins start before the eepsite, and will create the static Timer thread
// in RolloverFileOutputStream, which never stops. Don't count it.
// Ditto HSQLDB Timer (jwebcache)
if (rv) {

View File

@@ -35,6 +35,7 @@ import net.i2p.jetty.I2PLogger;
import net.i2p.router.RouterContext;
import net.i2p.router.app.RouterApp;
import net.i2p.router.news.NewsManager;
import net.i2p.router.sybil.Analysis;
import net.i2p.router.update.ConsoleUpdateManager;
import net.i2p.util.Addresses;
import net.i2p.util.FileSuffixFilter;
@@ -900,6 +901,14 @@ public class RouterConsoleRunner implements RouterApp {
if (_mgr == null)
_context.addShutdownTask(new ServerShutdown());
ConfigServiceHandler.registerSignalHandler(_context);
if (_mgr != null &&
//_context.getBooleanProperty(HelperBase.PROP_ADVANCED) &&
!SystemVersion.isSlow() &&
_context.getProperty(Analysis.PROP_FREQUENCY, Analysis.DEFAULT_FREQUENCY) > 0) {
// registers and starts itself
Analysis.getInstance(_context);
}
}
/**

View File

@@ -1,7 +1,6 @@
package net.i2p.router.web;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Collections;
@@ -23,7 +22,6 @@ import net.i2p.router.RouterContext;
import static net.i2p.router.web.GraphConstants.*;
import net.i2p.stat.Rate;
import net.i2p.stat.RateStat;
import net.i2p.util.FileSuffixFilter;
import net.i2p.util.FileUtil;
import net.i2p.util.Log;
import net.i2p.util.SystemVersion;
@@ -45,7 +43,7 @@ public class StatSummarizer implements Runnable, ClientApp {
private final Log _log;
/** list of SummaryListener instances */
private final List<SummaryListener> _listeners;
private static final int MAX_CONCURRENT_PNG = SystemVersion.isSlow() ? 1 : 3;
private static final int MAX_CONCURRENT_PNG = SystemVersion.isARM() ? 2 : 3;
private final Semaphore _sem;
private volatile boolean _isRunning;
private volatile Thread _thread;
@@ -93,24 +91,6 @@ public class StatSummarizer implements Runnable, ClientApp {
String spec = _context.getProperty("stat.summaries", DEFAULT_DATABASES);
String[] rates = DataHelper.split(spec, ",");
syncThreads = Math.min(rates.length / 2, 4);
// delete files for unconfigured rates
Set<String> configured = new HashSet<String>(rates.length);
for (String r : rates) {
configured.add(SummaryListener.createName(_context, r));
}
File rrdDir = new File(_context.getRouterDir(), SummaryListener.RRD_DIR);
FileFilter filter = new FileSuffixFilter(SummaryListener.RRD_PREFIX, SummaryListener.RRD_SUFFIX);
File[] files = rrdDir.listFiles(filter);
if (files != null) {
for (int i = 0; i < files.length; i++) {
File f = files[i];
String name = f.getName();
String hash = name.substring(SummaryListener.RRD_PREFIX.length(), name.length() - SummaryListener.RRD_SUFFIX.length());
if (!configured.contains(hash)) {
f.delete();
}
}
}
} else {
syncThreads = 0;
deleteOldRRDs();

View File

@@ -35,8 +35,8 @@ public class SummaryListener implements RateSummaryListener {
public static final String PROP_PERSISTENT = "routerconsole.graphPersistent";
/** note that .jrb files are NOT compatible with .rrd files */
static final String RRD_DIR = "rrd";
static final String RRD_PREFIX = "rrd-";
static final String RRD_SUFFIX = ".jrb";
private static final String RRD_PREFIX = "rrd-";
private static final String RRD_SUFFIX = ".jrb";
static final ConsolFun CF = ConsolFun.AVERAGE;
static final DsType DS = DsType.GAUGE;
private static final double XFF = 0.9d;

View File

@@ -162,9 +162,6 @@ class SummaryRenderer {
def.setFont(RrdGraphDef.FONTTAG_LEGEND, legnd);
def.setFont(RrdGraphDef.FONTTAG_TITLE, large);
boolean localTime = !_context.getBooleanProperty(GraphConstants.PROP_UTC);
if (localTime)
def.setTimeZone(SystemVersion.getSystemTimeZone(_context));
def.setTimeSpan(start/1000, end/1000);
def.setMinValue(0d);
String name = _listener.getRate().getRateStat().getName();
@@ -251,39 +248,23 @@ class SummaryRenderer {
if (!hideLegend) {
// '07 Jul 21:09' with month name in the system locale
// TODO: Fix Arabic time display
SimpleDateFormat sdf = new SimpleDateFormat("dd MMM HH:mm");
Map<Long, String> events = ((RouterContext)_context).router().eventLog().getEvents(EventLog.STARTED, start);
if (localTime) {
for (Map.Entry<Long, String> event : events.entrySet()) {
long started = event.getKey().longValue();
if (started > start && started < end) {
String legend;
if (Messages.isRTL(lang)) {
// RTL languages
legend = _t("Restart") + ' ' + DataHelper.formatTime(started) + " - " + event.getValue() + "\\l";
} else {
legend = _t("Restart") + ' ' + DataHelper.formatTime(started) + " [" + event.getValue() + "]\\l";
}
def.vrule(started / 1000, RESTART_BAR_COLOR, legend, 2.0f);
for (Map.Entry<Long, String> event : events.entrySet()) {
long started = event.getKey().longValue();
if (started > start && started < end) {
// String legend = _t("Restart") + ' ' + sdf.format(new Date(started)) + " UTC " + event.getValue() + "\\l";
String legend;
if (Messages.isRTL(lang)) {
// RTL languages
legend = _t("Restart") + ' ' + sdf.format(new Date(started)) + " - " + event.getValue() + "\\l";
} else {
legend = _t("Restart") + ' ' + sdf.format(new Date(started)) + " [" + event.getValue() + "]\\l";
}
def.vrule(started / 1000, RESTART_BAR_COLOR, legend, 2.0f);
}
def.comment(DataHelper.formatTime(start) + "" + DataHelper.formatTime(end) + "\\r");
} else {
SimpleDateFormat sdf = new SimpleDateFormat("dd MMM HH:mm");
for (Map.Entry<Long, String> event : events.entrySet()) {
long started = event.getKey().longValue();
if (started > start && started < end) {
String legend;
if (Messages.isRTL(lang)) {
// RTL languages
legend = _t("Restart") + ' ' + sdf.format(new Date(started)) + " - " + event.getValue() + "\\l";
} else {
legend = _t("Restart") + ' ' + sdf.format(new Date(started)) + " [" + event.getValue() + "]\\l";
}
def.vrule(started / 1000, RESTART_BAR_COLOR, legend, 2.0f);
}
}
def.comment(sdf.format(new Date(start)) + "" + sdf.format(new Date(end)) + " UTC\\r");
}
def.comment(sdf.format(new Date(start)) + "" + sdf.format(new Date(end)) + " UTC\\r");
}
if (!showCredit)
def.setShowSignature(false);

View File

@@ -65,7 +65,7 @@ public class CertHelper extends HelperBase {
if (!hasTunnels)
output(_t("SAM"), null);
// I2P Site
// Eepsite
tunnelDir = new File(dir, EEPSITE_DIR);
hasTunnels = false;
tunnels = tunnelDir.listFiles(new FileSuffixFilter(".crt"));

View File

@@ -9,8 +9,6 @@ import java.util.Locale;
import java.util.Properties;
import java.util.Set;
import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.i2p.app.ClientApp;
import net.i2p.app.ClientAppState;
@@ -39,15 +37,6 @@ public class ConfigClientsHelper extends HelperBase {
public static final String PROP_ENABLE_CLIENT_CHANGE = "routerconsole.enableClientChange";
public static final String PROP_ENABLE_PLUGIN_INSTALL = "routerconsole.enablePluginInstall";
/**
* simple regex from
* https://stackoverflow.com/questions/8204680/java-regex-email
* not the massive RFC 822 compliant one
* modified so .i2p will work
*/
private static final Pattern VALID_EMAIL_ADDRESS_REGEX =
Pattern.compile("[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z2]{2,6}", Pattern.CASE_INSENSITIVE);
public ConfigClientsHelper() {}
/** @since 0.9.14.1 */
@@ -313,13 +302,10 @@ public class ConfigClientsHelper extends HelperBase {
}
s = stripHTML(appProps, "author");
if (s != null) {
String[] authors = DataHelper.split(s, "[,; \r\n\t]");
Matcher m = VALID_EMAIL_ADDRESS_REGEX.matcher(s);
String author = m.find() ? m.group() : null;
desc.append("<tr><td><b>")
.append(_t("Author")).append("</b></td><td>");
if (author != null)
desc.append("<a href=\"mailto:").append(author).append("\">").append(s).append("</a>");
if (s.indexOf('@') > 0)
desc.append("<a href=\"mailto:").append(s).append("\">").append(s).append("</a>");
else
desc.append(s);
}

View File

@@ -76,7 +76,6 @@ public class ConfigUIHelper extends HelperBase {
Set<String> rv = new TreeSet<String>();
// add a failsafe even if we can't find any themes
rv.add(CSSHelper.DEFAULT_THEME);
rv.add(CSSHelper.ALT_THEME);
File dir = new File(_context.getBaseDir(), "docs/themes/console");
File[] files = dir.listFiles();
if (files == null)

View File

@@ -32,8 +32,6 @@ import net.i2p.util.SystemVersion;
public class FileDumpHelper extends HelperBase {
private static final boolean isWindows = SystemVersion.isWindows();
private static final String LINK = "http://git.idk.i2p/i2p-hackers/i2p.i2p/-/tree/";
public String getFileSummary() {
StringBuilder buf = new StringBuilder(16*1024);
buf.append("<table id=\"jardump\">\n<tr><th>File</th><th>Size</th><th>Date</th><th>SHA 256</th><th>Revision</th>" +
@@ -58,7 +56,7 @@ public class FileDumpHelper extends HelperBase {
}
Collections.sort(flist);
for (File f : flist) {
dumpFile(buf, f, true);
dumpFile(buf, f);
}
}
@@ -67,14 +65,14 @@ public class FileDumpHelper extends HelperBase {
buf.append("<tr><th class=\"subheading routerfiles\" colspan=\"9\"><b>Router Jar Files:</b> <code>");
buf.append(dir.getAbsolutePath());
buf.append("</code></th></tr>\n");
dumpDir(buf, dir, ".jar", true);
dumpDir(buf, dir, ".jar");
// our wars
dir = new File(_context.getBaseDir(), "webapps");
buf.append("<tr><th class=\"subheading routerfiles\" colspan=\"9\"><b>Router War Files:</b> <code>");
buf.append(dir.getAbsolutePath());
buf.append("</code></th></tr>\n");
dumpDir(buf, dir, ".war", true);
dumpDir(buf, dir, ".war");
// plugins
File pluginDir = new File(_context.getConfigDir(), PluginStarter.PLUGIN_DIR);
@@ -89,9 +87,9 @@ public class FileDumpHelper extends HelperBase {
buf.append("<tr><th class=\"subheading pluginfiles\" colspan=\"9\"><b>Plugin File Location:</b> <code>");
buf.append(dir.getAbsolutePath());
buf.append("</code></th></tr>");
dumpDir(buf, dir, ".jar", false);
dumpDir(buf, dir, ".jar");
dir = new File(files[i], "console/webapps");
dumpDir(buf, dir, ".war", false);
dumpDir(buf, dir, ".war");
}
}
@@ -99,23 +97,23 @@ public class FileDumpHelper extends HelperBase {
return buf.toString();
}
private static void dumpDir(StringBuilder buf, File dir, String suffix, boolean linkrev) {
private static void dumpDir(StringBuilder buf, File dir, String suffix) {
File[] files = dir.listFiles(new FileSuffixFilter(suffix));
if (files == null)
return;
Arrays.sort(files);
for (int i = 0; i < files.length; i++) {
dumpFile(buf, files[i], linkrev);
dumpFile(buf, files[i]);
}
}
private static void dumpFile(StringBuilder buf, File f, boolean linkrev) {
private static void dumpFile(StringBuilder buf, File f) {
buf.append("<tr><td><b title=\"").append(f.getAbsolutePath()).append("\">").append(f.getName()).append("</b></td>" +
"<td align=\"right\">").append(f.length()).append("</td>" +
"<td>");
long mod = f.lastModified();
if (mod > 0)
buf.append(DataHelper.formatTime(mod));
buf.append((new Date(mod)).toString());
else
buf.append("<font color=\"red\">Not found</font>");
buf.append("</td><td align=\"center\">");
@@ -145,13 +143,13 @@ public class FileDumpHelper extends HelperBase {
if (s != null && s.length() > 20) {
if (iv != null)
buf.append("<br>");
if (linkrev)
buf.append("<a href=\"").append(LINK).append(s).append("\">");
// fix and uncomment if a reliable viewmtn host appears
//buf.append("<a href=\"http://killyourtv.i2p/viewmtn/revision/info/").append(s)
// .append("\">");
buf.append("<span class=\"revision\"><tt>").append(s.substring(0, 20)).append("</tt>" +
"<br>" +
"<tt>").append(s.substring(20)).append("</tt></span>");
if (linkrev)
buf.append("</a>");
//buf.append("</tt>");
}
buf.append("</td><td>");
s = getAtt(att, "Created-By");

View File

@@ -32,7 +32,6 @@ public class GraphHelper extends FormHandler {
private int _refreshDelaySeconds;
private boolean _persistent;
private boolean _graphHideLegend;
private boolean _utc;
private String _stat;
private int _end;
@@ -132,9 +131,6 @@ public class GraphHelper extends FormHandler {
/** @since 0.9.32 */
public void setHideLegend(String foo) { _graphHideLegend = true; }
/** @since 0.9.49 */
public void setUtc(String foo) { _utc = true; }
/**
* For single stat page
* @since 0.9
@@ -161,8 +157,6 @@ public class GraphHelper extends FormHandler {
else if (title.equals("bw.recvRate")) hasRx = true;
}
boolean hideLegend = _context.getProperty(PROP_LEGEND, DEFAULT_LEGEND);
// param is ignored, we get it from the property, but add it to defeat caching on change
boolean utc = _context.getBooleanProperty(PROP_UTC);
if (hasTx && hasRx && !_showEvents) {
// remove individual tx/rx graphs if displaying combined
@@ -176,7 +170,6 @@ public class GraphHelper extends FormHandler {
+ "&amp;c=" + (3 * _periodCount )
+ "&amp;w=" + (3 * _width)
+ "&amp;h=" + (3 * _height)
+ (utc ? "&amp;utc" : "")
+ "\">");
String title = _t("Combined bandwidth graph");
_out.write("<img class=\"statimage\""
@@ -191,8 +184,6 @@ public class GraphHelper extends FormHandler {
// no legend, no height difference needed
_out.write("&amp;height=" + (_height));
}
if (utc)
_out.write("&amp;utc");
_out.write("&amp;hideLegend=" + hideLegend
+ "\" alt=\"" + title + "\" title=\"" + title + "\"></a>\n");
}
@@ -208,7 +199,6 @@ public class GraphHelper extends FormHandler {
+ "&amp;w=" + (3 * _width)
+ "&amp;h=" + (3 * _height)
+ (_showEvents ? "&amp;showEvents=1" : "")
+ (utc ? "&amp;utc" : "")
+ "\">");
_out.write("<img class=\"statimage\" border=\"0\""
+ " src=\"viewstat.jsp?stat="
@@ -219,7 +209,6 @@ public class GraphHelper extends FormHandler {
+ "&amp;width=" + _width
+ "&amp;height=" + _height
+ "&amp;hideLegend=" + hideLegend
+ (utc ? "&amp;utc" : "")
+ "\" alt=\"" + title
+ "\" title=\"" + title + "\"></a>\n");
}
@@ -400,7 +389,7 @@ public class GraphHelper extends FormHandler {
+ "\">" + _t("pixels wide") + "&nbsp;&nbsp;&nbsp;<input size=\"4\" style=\"text-align: right;\" type=\"text\" name=\"height\" value=\"" + _height
+ "\">" + _t("pixels high") + "</span><br><span class=\"nowrap\">\n<b>");
_out.write(_t("Display period") + ":</b> <input size=\"4\" style=\"text-align: right;\" type=\"text\" name=\"periodCount\" value=\"" + _periodCount + "\">" + _t("minutes") + "</span><br><span class=\"nowrap\">\n<b>");
_out.write(_t("Display period") + ":</b> <input size=\"5\" style=\"text-align: right;\" type=\"text\" name=\"periodCount\" value=\"" + _periodCount + "\">" + _t("minutes") + "</span><br><span class=\"nowrap\">\n<b>");
_out.write(_t("Refresh delay") + ":</b> <select name=\"refreshDelay\">");
@@ -428,12 +417,6 @@ public class GraphHelper extends FormHandler {
if (hideLegend)
_out.write(HelperBase.CHECKED);
_out.write(">" + _t("Do not show legend on graphs") + "</label></span><br><span class=\"nowrap\">\n<b>");
_out.write(_t("UTC") + ":</b> ");
_out.write("<label><input type=\"checkbox\" class=\"optbox\" value=\"true\" name=\"utc\"");
boolean utc = _context.getBooleanProperty(PROP_UTC);
if (utc)
_out.write(HelperBase.CHECKED);
_out.write(">" + _t("Use UTC time on graphs") + "</label></span><br><span class=\"nowrap\">\n<b>");
_out.write(_t("Persistence") +
":</b> <label><input type=\"checkbox\" class=\"optbox\" value=\"true\" name=\"persistent\"");
boolean persistent = _context.getBooleanPropertyDefaultTrue(SummaryListener.PROP_PERSISTENT);
@@ -494,7 +477,6 @@ public class GraphHelper extends FormHandler {
_refreshDelaySeconds != _context.getProperty(PROP_REFRESH, DEFAULT_REFRESH) ||
_showEvents != _context.getBooleanProperty(PROP_EVENTS) ||
_graphHideLegend != _context.getProperty(PROP_LEGEND, DEFAULT_LEGEND) ||
_utc != _context.getBooleanProperty(PROP_UTC) ||
_persistent != _context.getBooleanPropertyDefaultTrue(SummaryListener.PROP_PERSISTENT)) {
Map<String, String> changes = new HashMap<String, String>();
changes.put(PROP_X, Integer.toString(_width));
@@ -504,7 +486,6 @@ public class GraphHelper extends FormHandler {
changes.put(PROP_EVENTS, Boolean.toString(_showEvents));
changes.put(PROP_LEGEND, Boolean.toString(_graphHideLegend));
changes.put(SummaryListener.PROP_PERSISTENT, Boolean.toString(_persistent));
changes.put(PROP_UTC, Boolean.toString(_utc));
boolean warn = _persistent != _context.getBooleanPropertyDefaultTrue(SummaryListener.PROP_PERSISTENT);
_context.router().saveConfig(changes, null);
addFormNotice(_t("Graph settings saved"));

View File

@@ -68,7 +68,7 @@ public class HomeHelper extends HelperBase {
//_x("Dev Builds") + S + _x("Development builds of I2P") + S + "http://bobthebuilder.i2p/" + S + I + "script_gear.png" + S +
_x("Dev Forum") + S + _x("Development forum") + S + "http://zzz.i2p/" + S + I + "group_gear.png" + S +
//_x("diftracker") + S + _x("Bittorrent tracker") + S + "http://diftracker.i2p/" + S + I + "i2psnark.png" + S +
//"echelon.i2p" + S + _x("I2P Applications") + S + "http://echelon.i2p/" + S + I + "echelon.png" + S +
"echelon.i2p" + S + _x("I2P Applications") + S + "http://echelon.i2p/" + S + I + "echelon.png" + S +
//"exchanged.i2p" + S + _x("Anonymous cryptocurrency exchange") + S + "http://exchanged.i2p/" + S + I + "exchanged.png" + S +
_x("I2P FAQ") + S + _x("Frequently Asked Questions") + S + "http://i2p-projekt.i2p/faq" + S + I + "question.png" + S +
_x("I2P Forum") + S + _x("Community forum") + S + "http://i2pforum.i2p/" + S + I + "group.png" + S +
@@ -83,7 +83,7 @@ public class HomeHelper extends HelperBase {
//_x("Key Server") + S + _x("OpenPGP Keyserver") + S + "http://keys.i2p/" + S + I + "education.png" + S +
//"killyourtv.i2p" + S + _x("Debian and Tahoe-LAFS repositories") + S + "http://killyourtv.i2p/" + S + I + "television_delete.png" + S +
_x("MuWire") + S + _x("Easy anonymous file sharing") + S + "http://muwire.i2p/" + S + I + "muwire.png" + S +
//_x("Open4You") + S + _x("Free I2P Site hosting with PHP and MySQL") + S + "http://open4you.i2p/" + S + I + "open4you-logo.png" + S +
//_x("Open4You") + S + _x("Free eepsite hosting with PHP and MySQL") + S + "http://open4you.i2p/" + S + I + "open4you-logo.png" + S +
//_x("Pastebin") + S + _x("Encrypted I2P Pastebin") + S + "http://zerobin.i2p/" + S + I + "paste_plain.png" + S +
_x("Planet I2P") + S + _x("I2P News") + S + "http://planet.i2p/" + S + I + "world.png" + S +
//_x("I2P Plugins") + S + _x("Add-on directory") + S + "http://i2pwiki.i2p/index.php?title=Plugins" + S + I + "info/plugin_link.png" + S +
@@ -307,7 +307,7 @@ public class HomeHelper extends HelperBase {
for (App app : apps) {
String url;
if (app.name.equals(website) && app.url.equals("http://127.0.0.1:7658/")) {
// fixup I2P Site link
// fixup eepsite link
url = SummaryBarRenderer.getEepsiteURL(pm);
if (url == null)
continue;

View File

@@ -5,7 +5,6 @@ import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import net.i2p.crypto.EncType;
import net.i2p.crypto.SigType;
import net.i2p.data.DataHelper;
import net.i2p.util.SystemVersion;
@@ -29,7 +28,6 @@ public class NetDbHelper extends FormHandler {
private boolean _debug;
private boolean _graphical;
private SigType _type;
private EncType _etype;
private String _newNonce;
private boolean _postOK;
@@ -121,12 +119,6 @@ public class NetDbHelper extends FormHandler {
_type = SigType.parseSigType(f);
}
/** @since 0.9.49 */
public void setEtype(String f) {
if (f != null && f.length() > 0)
_etype = EncType.parseEncType(f);
}
/** @since 0.9.28 */
public void setMtu(String f) {
if (f != null && f.length() > 0)
@@ -279,10 +271,10 @@ public class NetDbHelper extends FormHandler {
if (_routerPrefix != null || _version != null || _country != null ||
_family != null || _caps != null || _ip != null || _sybil != null ||
_port != 0 || _type != null || _mtu != null || _ipv6 != null ||
_ssucaps != null || _transport != null || _cost != 0 || _etype != null) {
_ssucaps != null || _transport != null || _cost != 0) {
renderer.renderRouterInfoHTML(_out, _limit, _page,
_routerPrefix, _version, _country,
_family, _caps, _ip, _sybil, _port, _type, _etype,
_family, _caps, _ip, _sybil, _port, _type,
_mtu, _ipv6, _ssucaps, _transport, _cost);
} else if (_lease) {
renderer.renderLeaseSetHTML(_out, _debug);
@@ -316,7 +308,7 @@ public class NetDbHelper extends FormHandler {
if (_routerPrefix != null || _version != null || _country != null ||
_family != null || _caps != null || _ip != null || _sybil != null ||
_port != 0 || _type != null || _mtu != null || _ipv6 != null ||
_ssucaps != null || _transport != null || _cost != 0 || _etype != null)
_ssucaps != null || _transport != null || _cost != 0)
return 2;
if (_full == 2)
return 3;
@@ -377,7 +369,6 @@ public class NetDbHelper extends FormHandler {
"<tr><td>Capabilities:</td><td><input type=\"text\" name=\"caps\"></td><td>e.g. f or XOfR</td></tr>\n" +
"<tr><td>Cost:</td><td><input type=\"text\" name=\"cost\"></td><td></td></tr>\n" +
"<tr><td>Country Code:</td><td><input type=\"text\" name=\"c\"></td><td>e.g. ru</td></tr>\n" +
"<tr><td>Encryption Type:</td><td><input type=\"text\" name=\"etype\"></td><td></td></tr>\n" +
"<tr><td>Router Family:</td><td><input type=\"text\" name=\"fam\"></td><td></td></tr>\n" +
"<tr><td>Hash Prefix:</td><td><input type=\"text\" name=\"r\"></td><td></td></tr>\n" +
"<tr><td>IP or Hostname:</td><td><input type=\"text\" name=\"ip\"></td><td>host name, IPv4, or IPv6, /24,/16,/8 suffixes optional for IPv4, prefix ok for IPv6</td></tr>\n" +

View File

@@ -104,7 +104,7 @@ class NetDbRenderer {
public void renderRouterInfoHTML(Writer out, int pageSize, int page,
String routerPrefix, String version,
String country, String family, String caps,
String ip, String sybil, int port, SigType type, EncType etype,
String ip, String sybil, int port, SigType type,
String mtu, String ipv6, String ssucaps,
String tr, int cost) throws IOException {
StringBuilder buf = new StringBuilder(4*1024);
@@ -162,8 +162,6 @@ class NetDbRenderer {
ubuf.append("&amp;tr=").append(tr);
if (type != null)
ubuf.append("&amp;type=").append(type);
if (etype != null)
ubuf.append("&amp;etype=").append(etype);
if (ip != null)
ubuf.append("&amp;ip=").append(ip);
if (port != 0)
@@ -222,8 +220,7 @@ class NetDbRenderer {
// 'O' will catch PO and XO also
(caps != null && hasCap(ri, caps)) ||
(tr != null && ri.getTargetAddress(tr) != null) ||
(type != null && type == ri.getIdentity().getSigType()) ||
(etype != null && etype == ri.getIdentity().getEncType())) {
(type != null && type == ri.getIdentity().getSigType())) {
if (skipped < toSkip) {
skipped++;
continue;
@@ -519,7 +516,7 @@ class NetDbRenderer {
buf.append("<b>").append(_t("Destination")).append(":</b> ");
TunnelPoolSettings in = _context.tunnelManager().getInboundSettings(key);
if (in != null && in.getDestinationNickname() != null)
buf.append(DataHelper.escapeHTML(in.getDestinationNickname()));
buf.append(in.getDestinationNickname());
else
buf.append(dest.toBase64().substring(0, 6));
buf.append("</th></tr>\n");

View File

@@ -1,90 +0,0 @@
package net.i2p.router.web.helpers;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Locale;
import net.i2p.router.web.HelperBase;
import net.i2p.router.web.Messages;
/**
* @since 0.9.49
*/
public class ResourceHelper extends HelperBase {
protected String _page;
private int _maxLines;
/**
* Use relative path for getResource().
*/
public void setPage(String page) { _page = page; }
public void setMaxLines(String lines) {
if (lines != null) {
try {
_maxLines = Integer.parseInt(lines);
} catch (NumberFormatException nfe) {
_maxLines = -1;
}
} else {
_maxLines = -1;
}
}
/**
* Convert file.ext to file_lang.ext if it exists.
* Get lang from the cgi lang param, then properties, then from the default locale.
* _context must be set to check the property.
* @return "" on error
*/
public String getResource() {
if (_page == null || _page.contains(".."))
return "";
String lang = null;
String page = null;
int lastdot = _page.lastIndexOf('.');
if (lastdot <= 0) {
page = _page;
} else {
if (_context != null)
lang = _context.getProperty(Messages.PROP_LANG);
if (lang == null || lang.length() <= 0) {
lang = Locale.getDefault().getLanguage();
if (lang == null || lang.length() <= 0)
page = _page;
}
}
if (page == null) {
if (lang.equals("en"))
page = _page;
else
page = _page.substring(0, lastdot) + '_' + lang + _page.substring(lastdot);
}
InputStream is = ResourceHelper.class.getResourceAsStream("/net/i2p/router/web/resources/" + page);
if (is == null) {
is = ResourceHelper.class.getResourceAsStream("/net/i2p/router/web/resources/" + _page);
if (is == null)
return "";
}
BufferedReader in = null;
StringBuilder buf = new StringBuilder(20000);
try {
in = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String line = null;
int i = 0;
while ( (line = in.readLine()) != null) {
buf.append(line);
buf.append('\n');
if (_maxLines > 0 && ++i >= _maxLines)
break;
}
} catch (IOException ioe) {
} finally {
if (in != null) try { in.close(); } catch (IOException ioe) {}
try { is.close(); } catch (IOException ioe) {}
}
return buf.toString();
}
}

View File

@@ -22,8 +22,8 @@ class Dummy {
_t("Web console");
_t("SAM application bridge");
_t("Application tunnels");
_t("My I2P Site web server");
_t("I2P webserver (I2P Site)");
_t("My eepsite web server");
_t("I2P webserver (eepsite)");
_t("Browser launch at startup");
_t("BOB application bridge");
_t("I2P Router Console");
@@ -34,8 +34,9 @@ class Dummy {
// note that if the wording changes in i2ptunnel.config, we have to
// keep the old string here as well for existing installs
_t("shared clients");
_t("shared clients (DSA)");
_t("IRC proxy");
_t("I2P Site");
_t("eepsite");
_t("I2P webserver");
_t("HTTP Proxy");
// hardcoded in i2psnark

View File

@@ -46,7 +46,7 @@
</td>
</tr>
<tr>
<th id="upnpconfig"><%=intl._t("UPnP Configuration")%>&nbsp;<a href="peers?tx=upnp">[<%=intl._t("UPnP Status")%>]</a></th>
<th id="upnpconfig"><%=intl._t("UPnP Configuration")%>&nbsp;<a href="peers#upnp">[<%=intl._t("UPnP Status")%>]</a></th>
</tr>
<tr>
<td>

View File

@@ -25,7 +25,7 @@
<jsp:setProperty name="updatehelper" property="contextId" value="<%=i2pcontextId%>" />
<jsp:getProperty name="updatehelper" property="newsStatus" /><br>
</div><div class="main" id="console">
<jsp:useBean class="net.i2p.router.web.helpers.ResourceHelper" id="contenthelper" scope="request" />
<jsp:useBean class="net.i2p.router.web.ContentHelper" id="contenthelper" scope="request" />
<div class="welcome">
<div class="langbox" title="<%=intl._t("Configure Language")%>">
<a href="/configui#langheading"><img src="/themes/console/images/info/control.png" alt="<%=intl._t("Configure Language")%>"></a>
@@ -33,8 +33,9 @@
<a name="top"></a>
<h2><%=intl._t("Welcome to I2P")%></h2>
</div>
<jsp:setProperty name="contenthelper" property="page" value="docs/readme.html" />
<% java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getBaseDir(), "docs/readme.html"); %>
<jsp:setProperty name="contenthelper" property="page" value="<%=fpath.getAbsolutePath()%>" />
<jsp:setProperty name="contenthelper" property="maxLines" value="300" />
<jsp:setProperty name="contenthelper" property="contextId" value="<%=i2pcontextId%>" />
<jsp:getProperty name="contenthelper" property="resource" />
<jsp:getProperty name="contenthelper" property="content" />
</div></body></html>

View File

@@ -76,18 +76,8 @@
net.i2p.data.Hash h = dest.calculateHash();
net.i2p.crypto.SessionKeyManager skm = ctx.clientManager().getClientSessionKeyManager(h);
if (skm != null) {
out.print("<div class=\"debug_section\" id=\"cskm" + (i++) + "\"><h2>");
net.i2p.router.TunnelPoolSettings tps = ctx.tunnelManager().getInboundSettings(h);
if (tps != null) {
String nick = tps.getDestinationNickname();
if (nick != null)
out.print(net.i2p.data.DataHelper.escapeHTML(nick));
else
out.print("<font size=\"-2\">" + dest.toBase32() + "</font>");
} else {
out.print("<font size=\"-2\">" + dest.toBase32() + "</font>");
}
out.print(" Session Key Manager</h2>");
out.print("<div class=\"debug_section\" id=\"cskm" + (i++) + "\">");
out.print("<h2><font size=\"-2\">" + dest.toBase32() + "</font> Session Key Manager</h2>");
skm.renderStatusHTML(out);
out.print("</div>");
}

View File

@@ -12,8 +12,8 @@
* with headers set so the browser caches.
*
* As of 0.9.36:
* All new and changed flags must go in the ../resources/docs/icons/flags16x11/ dir,
* which is copied into the war and will be checked first by flags.jsp.
* All new and changed flags must go in the flags16x11/ dir,
* which will be checked first by flags.jsp.
* The flags/ dir is the original set from famfamfam,
* which may be symlinked in package installs.
*
@@ -23,54 +23,44 @@ if (c != null &&
(c.length() == 2 || c.length() == 7) &&
c.replaceAll("[a-z0-9_]", "").length() == 0) {
String flagSet = "flags16x11";
String s = request.getParameter("s");
java.io.File ffile;
long lastmod;
java.io.InputStream fin = flags_jsp.class.getResourceAsStream("/net/i2p/router/web/resources/docs/icons/" + flagSet + '/' + c + ".png");
if (fin != null) {
// found in the war
java.io.File war = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getBaseDir(), "webapps/routerconsole.war");
ffile = null;
lastmod = war.lastModified();
} else {
// fallback to flags dir, which will be symlinked to /usr/share/flags/countries/16x11 for package builds
String base = net.i2p.I2PAppContext.getGlobalContext().getBaseDir().getAbsolutePath() +
String base = net.i2p.I2PAppContext.getGlobalContext().getBaseDir().getAbsolutePath() +
java.io.File.separatorChar +
"docs" + java.io.File.separatorChar + "icons";
String file = "flags" + java.io.File.separatorChar + c + ".png";
String file = flagSet + java.io.File.separatorChar + c + ".png";
java.io.File ffile = new java.io.File(base, file);
if (!ffile.exists()) {
// fallback to flags dir, which will be symlinked to /usr/share/flags/countries/16x11 for package builds
file = "flags" + java.io.File.separatorChar + c + ".png";
ffile = new java.io.File(base, file);
long length = ffile.length();
if (length <= 0) {
response.sendError(403, "Flag not found");
return;
}
response.setHeader("Content-Length", Long.toString(length));
lastmod = ffile.lastModified();
}
long lastmod = ffile.lastModified();
if (lastmod > 0) {
long iflast = request.getDateHeader("If-Modified-Since");
// iflast is -1 if not present; round down file time
if (iflast >= ((lastmod / 1000) * 1000)) {
response.setStatus(304);
if (fin != null)
fin.close();
return;
}
response.setDateHeader("Last-Modified", lastmod);
// cache for a day
response.setDateHeader("Expires", net.i2p.I2PAppContext.getGlobalContext().clock().now() + 86400000l);
response.setHeader("Cache-Control", "public, max-age=604800");
response.setHeader("X-Content-Type-Options", "nosniff");
}
// cache for a day
response.setDateHeader("Expires", net.i2p.I2PAppContext.getGlobalContext().clock().now() + 86400000l);
response.setHeader("Cache-Control", "public, max-age=604800");
response.setHeader("X-Content-Type-Options", "nosniff");
long length = ffile.length();
if (length > 0)
response.setHeader("Content-Length", Long.toString(length));
response.setContentType("image/png");
response.setHeader("Accept-Ranges", "none");
java.io.FileInputStream fin = null;
java.io.OutputStream cout = response.getOutputStream();
try {
// flags dir may be a symlink, which readFile will reject
// We carefully vetted the "c" value above.
//net.i2p.util.FileUtil.readFile(file, base, cout);
if (fin == null)
fin = new java.io.FileInputStream(ffile);
fin = new java.io.FileInputStream(ffile);
net.i2p.data.DataHelper.copy(fin, cout);
} catch (java.io.IOException ioe) {
// prevent 'Committed' IllegalStateException from Jetty

Binary file not shown.

After

Width:  |  Height:  |  Size: 668 B

View File

@@ -73,12 +73,20 @@ img {
border: none;
}
img:not(img[src$="i2plogo.png"]){
image-rendering: -moz-crisp-edges;
image-rendering: -o-crisp-edges;
image-rendering: -webkit-optimize-contrast;
image-rendering: crisp-edges;
-ms-interpolation-mode: nearest-neighbor;
img[src$="bound.png"] {
filter: hue-rotate(-40deg);
}
a img[src$="bound.png"] {
filter: hue-rotate(-40deg) drop-shadow(0 0 1px #ccf);
}
a:hover img[src$="bound.png"] {
filter: hue-rotate(-40deg) drop-shadow(0 0 1px #f60);
}
a img {
filter: drop-shadow(0 0 1px #ccf);
}
a:hover img {
@@ -113,11 +121,14 @@ pre {
padding: 8px;
margin-bottom: 2px;
text-align: center !important;
border: 1px solid #dee2e6;
color: #33333f;
font-size: 8pt;
clear: left;/* fixes a bug in Opera */
border-radius: 2px;
background: #fafaff;
box-shadow: inset 0 0 0 1px #dee2e6;
filter: drop-shadow(0 0 1px #999daf);
}
.routersummary div[style="height: 36px;"] {
@@ -4155,13 +4166,12 @@ button.download.control:hover, button.download.control:focus {
text-indent: 0;
text-align: left;
min-width: 0 !important;
padding: 5px 7px 1px 22px !important;
padding: 5px 7px 5px 22px !important;
text-transform: capitalize;
}
.routersummary .cancel {
text-transform: capitalize;
padding: 5px 7px 1px 22px !important;
}
.routersummary .reload[value="restartImmediate"] {
@@ -6574,8 +6584,9 @@ h3#displayevents {
}
form[action="events"] {
border: 1px solid #ddf;
border: 1px solid #7778bf;
padding: 10px 10px 10px 50px;
margin: -16px 0 -2px 0;
background: url(/themes/console/images/info/logs.png) 12px center no-repeat;
background-size: 28px 28px;
}

8
apps/sam/java/.classpath Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry combineaccessrules="false" kind="src" path="/i2p_sdk"/>
<classpathentry combineaccessrules="false" kind="src" path="/ministreaming"/>
<classpathentry kind="output" path="build"/>
</classpath>

17
apps/sam/java/.project Normal file
View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>sam</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="test/junit"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
<classpathentry combineaccessrules="false" kind="src" path="/i2p_sdk"/>
<classpathentry combineaccessrules="false" kind="src" path="/ministreaming"/>
<classpathentry kind="output" path="build/obj"/>
</classpath>

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>streaming</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@@ -24,7 +24,7 @@ public class MessageOutputStreamTest extends TestCase {
@Test
public void test() throws Exception {
Receiver receiver = new Receiver();
MessageOutputStream out = new MessageOutputStream(_context, _st2, receiver, 100, 100);
MessageOutputStream out = new MessageOutputStream(_context, _st2, receiver, 100);
byte buf[] = new byte[128*1024];
_context.random().nextBytes(buf);
out.write(buf);

Some files were not shown because too many files have changed in this diff Show More