114 Commits

Author SHA1 Message Date
deb775d243 Port it to python3 2023-11-23 09:43:42 -05:00
8ebc4de1a7 Re-attempt migration with modernize 2023-11-22 14:48:24 -05:00
zzz
53b17e206f Naming: Fix missing content due to endblock in the middle 2023-11-22 06:46:19 -05:00
zzz
7fec0b308f SAM: Add note about i2pd concurrent accepts 2023-11-17 15:04:09 -05:00
zzz
8db113d0aa Blockfile: Add info on listversion 2023-11-17 08:51:38 -05:00
zzz
b1a1debef3 Blockfile spec fix 2023-11-17 08:32:32 -05:00
zzz
9772a4ed05 Add note on reachability caps 2023-11-11 09:07:01 -05:00
zzz
23bed0f483 Update checklist for tx v3 2023-11-07 13:33:18 -05:00
zzz
496b65274a Add congestion caps to netdb doc 2023-11-05 12:43:31 -05:00
zzz
7053ae1db3 Markdown fixes 2023-10-30 17:49:54 -04:00
7df3407db9 Downloads: remove reference to Easy-Installer from mac install guide page 2023-10-25 16:37:57 -04:00
zzz
4e3370b852 Fill in prop. 164 and update streaming spec to match 2023-10-23 11:22:46 -04:00
zzz
c8f9788e00 dup word 2023-10-23 08:20:14 -04:00
zzz
3b0794554c i2ptunnel: Add more info on x-i2p-gzip and related topics 2023-10-23 06:46:06 -04:00
zzz
ca7351592a Copy port/protocol info to I2CP spec
Add more info on gzip effort 0
2023-10-23 05:47:27 -04:00
zzz
bfc73085b0 typo 2023-10-22 14:18:21 -04:00
zzz
6c0e4bb387 SAM: Add note about concurrent ACCEPTs on 3.1 2023-10-22 11:23:34 -04:00
zzz
73dc961c79 HTML fix 2023-10-21 10:30:56 -04:00
zzz
7686adfc06 Add note that deb repos are down 2023-10-21 10:23:10 -04:00
zzz
f13dc8b7ff SAM: More ports documentation 2023-10-21 09:43:28 -04:00
zzz
e2ffb5e96c SAM: Enhance ports documentation (Gitlab #456) 2023-10-21 09:30:44 -04:00
zzz
8f7b30078d Add ramble.i2p to hosts.txt 2023-10-10 11:59:01 -04:00
b036f269a6 switch to files.* mirror while the other one is down 2023-10-03 20:28:46 -04:00
zzz
fa988e6f5b Renew repo key (gpg format) 2023-10-01 12:54:27 -04:00
zzz
66d51d4a57 Renew repo key 2023-10-01 11:08:35 -04:00
zzz
a8c09545ad I2NP: Add notes about minimum version increase 2023-10-01 07:17:03 -04:00
zzz
67ce4b6bb1 renew my GPG key 2023-10-01 07:12:39 -04:00
zzz
4d66666202 SAM: Add section on accept errors
ref: Gitlab i2p.i2p #399
2023-10-01 07:10:44 -04:00
58883084a8 add a note about name changing the MASTER sessions to PRIMARY sessions. 2023-09-04 12:23:50 -04:00
idk
f3968a1e1b Merge pull request #13 from Shoalsteed/master
Updates to Performance page, Dev docs
2023-07-20 15:52:31 -04:00
956ce97006 Merge branch 'i2p:master' into master 2023-07-20 11:24:28 -04:00
a67f32aaca finally update the release signing keys 2023-07-19 16:44:44 -04:00
41a6d50612 update easy-install download versions 2023-07-13 11:17:16 -04:00
217475ddc9 update easy-install hashes 2023-07-13 11:16:43 -04:00
2ab41d3c85 Use Mac OS instead of Mac OS X, update Easy-Install blog post 2023-07-13 10:19:59 -04:00
c900f779d9 re-add all the pdfs 2023-07-11 19:18:33 -04:00
9c9547cd60 temporarily remove some of the PDFs, will restore in 30min 2023-07-11 19:09:02 -04:00
09a8ef4fa2 clean up metadata from images directory, then run them through pngcrush with debian defaults 2023-07-11 18:41:37 -04:00
fedce0aef0 update translations 2023-07-11 11:49:43 -04:00
96088162ed add easy-install for windows blogpost 2023-07-11 00:23:38 -04:00
e81d87724b reverse order of roadmap to match expectation, newer at top. Update roadmap for 2.4.0. 2023-07-10 14:55:58 -04:00
idk
c72cbc05fc fix href links in the blog post 2023-06-30 15:24:49 -04:00
idk
8f85913228 fix mac downloads 2023-06-30 14:59:56 -04:00
idk
86053fae8d update download hashes 2023-06-30 14:47:52 -04:00
idk
f6034d6462 bump download version 2023-06-30 14:46:44 -04:00
idk
15c827b822 fix some strings, add a blog post, fix docker container 2023-06-30 12:59:25 -04:00
b307f171de Update index.html 2023-05-30 16:59:48 -04:00
771f2f63ae Update index.html
Changes to Performance overview.
2023-05-26 17:18:28 -04:00
6b35d8f4e8 Update new-developers.html
remove link to zzz's forum, make changes to headers and some copy.
2023-05-26 15:08:27 -04:00
idk
300a987392 Merge pull request #12 from Vort/samv3_doc_fix
SAM V3: make example consistent with previous text
2023-05-25 17:07:29 -04:00
idk
12da3aee87 Merge pull request #11 from Shoalsteed/master
Update dev-guidelines.html
2023-05-25 17:06:41 -04:00
idk
8080799be5 remove print call from the blog renderer 2023-05-24 18:11:08 +00:00
41cc69c774 make example consistent with previous text 2023-05-15 09:46:29 +03:00
idk
84d35a67c7 never ever ever leave a {% trans %}{% endtrans %} block empty, or it will break like half the languages for some mysterious reason 2023-05-04 04:25:47 +00:00
idk
e0e6a2fa76 log when running in dev mode 2023-05-04 03:50:00 +00:00
idk
c5ec52dd1f fix missing newlines 2023-05-04 03:42:08 +00:00
idk
94d206b798 try and fix the translations 2023-05-04 02:54:33 +00:00
8ba3b11b03 Merge branch 'i2p:master' into master 2023-04-29 13:45:04 -04:00
idk
23eb1c5489 fix missing bracket on translation tag on software.html, split up environment setup in dockerfile to trade a little space for a lot of time 2023-04-29 16:50:58 +00:00
d68fb34dda Update index.html 2023-04-28 17:36:50 -04:00
acc1d99b34 Update browser-content.html 2023-04-28 15:56:11 -04:00
9ad45220b8 Update dev-guidelines.html
remove Trac references, zzz forum, "we/ our" references , add "release manager."
2023-04-28 15:11:44 -04:00
idk
fff7c1f9ec fix missing translation tag 2023-04-28 19:00:21 +00:00
idk
09e20cb0ba Merge pull request #10 from Shoalsteed/master
Updates to copy
2023-04-27 01:10:05 -04:00
idk
92edebf1fd Merge branch 'master' into master 2023-04-26 17:29:46 -04:00
idk
9bd163e3e5 fix tables on contact page 2023-04-26 21:25:52 +00:00
9f1bb7156e Update reseed.html 2023-04-26 16:26:14 -04:00
592c7ae638 Update anonbib.bib 2023-04-20 15:31:43 -04:00
4579c6deed Update vrp.html 2023-04-17 15:13:40 -04:00
idk
bd2b0ae0bb update android versions 2023-04-17 16:41:48 +00:00
173790ed7c Update faq.html 2023-04-17 11:53:19 -04:00
37442a469e Update contact.html 2023-04-17 11:27:21 -04:00
idk
62354cbdcb fix date on blog post 2023-04-14 02:20:04 +00:00
idk
a400346f8d update version 2023-04-13 20:11:26 +00:00
idk
6eab2587a7 update hashes 2023-04-13 20:11:10 +00:00
1f67ec12e7 Update plugins.html 2023-04-12 17:45:33 -04:00
idk
0281b67bc4 undraft blog post 2023-04-12 20:42:31 +00:00
idk
cbf762852c draft release blog post 2023-04-12 05:02:26 +00:00
55d09a4ca6 Update index.html 2023-04-10 10:38:26 -04:00
32ea161bdf Update index.html 2023-04-10 10:03:19 -04:00
6e6e876750 Update software.html 2023-04-10 09:49:04 -04:00
idk
32c1addde8 remove treasury position, add zzz to past contributors 2023-03-31 21:12:56 +00:00
idk
3facee99b1 update easy-install version number and hash 2023-03-23 12:55:02 +00:00
idk
d64e3b76ab update the contact page 2023-03-21 22:28:22 +00:00
idk
a906af63f7 Merge branch 'readme-refactoring' into 'master'
Adding overview info to README as suggested in issue

See merge request i2p-hackers/i2p.www!23
2023-03-18 17:29:41 +00:00
idk
996953e289 Merge branch 'fix-venv' into 'master'
fix virtualenv setup

Closes #39

See merge request i2p-hackers/i2p.www!24
2023-03-18 17:25:20 +00:00
f544a40229 fix virtualenv setup 2023-03-18 17:25:20 +00:00
idk
2f768fd6d2 update android version 2023-03-18 04:36:53 +00:00
idk
a030fbae4a move blogpost 2023-03-14 06:07:01 +00:00
idk
224305f501 fix blog URL 2023-03-14 03:10:04 +00:00
idk
4cac8d8541 update my public key 2023-03-14 01:57:53 +00:00
idk
9e78559e80 update versions and hashes 2023-03-13 23:18:36 +00:00
idk
5cb31ea847 undraft blog post 2023-03-13 21:29:54 +00:00
idk
a618bb279d write draft release notes 2023-03-13 19:25:55 +00:00
idk
7107a2960a edit statement about release of Mac easy-install on site since release date of 2.2.0 is moved. 2023-03-08 17:00:53 +00:00
idk
5162dc2d24 unindent blog post 2023-02-12 03:37:35 +00:00
idk
980fc185d5 Blog post about Denial of Service attack 2023-02-12 03:33:07 +00:00
zzz
2bb222187d mtg 320 more log cleanup and spelling fixes 2023-02-08 22:56:10 -05:00
idk
d0459ba062 check in meeting logs 2023-02-07 22:21:03 +00:00
idk
d08ac133f8 remove logging messages from meeting log 2023-02-07 22:08:55 +00:00
idk
b8f5804525 check in meeting logs 2023-02-07 22:07:15 +00:00
idk
90a39f35d6 Add missing wizard images, add sadie to author list 2023-02-01 14:15:29 +00:00
zzz
70cc78b17f Prop. 162 updates 2023-02-01 06:57:22 -05:00
idk
d616bd3156 qualify that the recommendation might change in the future 2023-02-01 07:21:15 +00:00
idk
9942f1ddf6 add links to blog posts 2023-02-01 07:07:57 +00:00
idk
bdca9c7042 Add install guide for jar installs on MacOS 2023-02-01 06:58:31 +00:00
idk
30d9fe1622 fix missing image 2023-02-01 00:58:28 +00:00
idk
d513dcc95d add osx install guide images 2023-01-31 23:12:25 +00:00
idk
d0787a33ad Update the about/intro page with @sadie's rewrite and my revisions 2023-01-28 05:03:09 +00:00
idk
fb150533bc update the about intro page 2023-01-28 04:53:40 +00:00
idk
18c83f465a fix easy-install hash 2023-01-26 17:45:05 +00:00
zzz
9500378ef7 new proposals 2023-01-24 08:16:17 -05:00
zzz
bf1c5c2748 grammar 2023-01-23 08:58:22 -05:00
lbt
194f65bdb3 Adding overview info to README as suggested in issue 2023-01-21 11:26:17 +01:00
572 changed files with 63625 additions and 72178 deletions

View File

@ -1,60 +1,60 @@
[main]
host = https://www.transifex.com
host = https://www.transifex.com
lang_map = ru_RU: ru, sv_SE: sv, tr_TR: tr, uk_UA: uk, zh_CN: zh
[I2P.website_about]
file_filter = i2p2www/translations/<lang>/LC_MESSAGES/about.po
source_file = pots/about.pot
source_lang = en
type = PO
[o:otf:p:I2P:r:website_about]
file_filter = i2p2www/translations/<lang>/LC_MESSAGES/about.po
source_file = pots/about.pot
source_lang = en
type = PO
minimum_perc = 3
[I2P.website_blog]
file_filter = i2p2www/translations/<lang>/LC_MESSAGES/blog.po
source_file = pots/blog.pot
source_lang = en
type = PO
[o:otf:p:I2P:r:website_blog]
file_filter = i2p2www/translations/<lang>/LC_MESSAGES/blog.po
source_file = pots/blog.pot
source_lang = en
type = PO
minimum_perc = 2
[I2P.website_comparison]
file_filter = i2p2www/translations/<lang>/LC_MESSAGES/comparison.po
source_file = pots/comparison.pot
source_lang = en
type = PO
[o:otf:p:I2P:r:website_comparison]
file_filter = i2p2www/translations/<lang>/LC_MESSAGES/comparison.po
source_file = pots/comparison.pot
source_lang = en
type = PO
minimum_perc = 10
[I2P.website_docs]
file_filter = i2p2www/translations/<lang>/LC_MESSAGES/docs.po
source_file = pots/docs.pot
source_lang = en
type = PO
[o:otf:p:I2P:r:website_docs]
file_filter = i2p2www/translations/<lang>/LC_MESSAGES/docs.po
source_file = pots/docs.pot
source_lang = en
type = PO
minimum_perc = 3
[I2P.website_get-involved]
file_filter = i2p2www/translations/<lang>/LC_MESSAGES/get-involved.po
source_file = pots/get-involved.pot
source_lang = en
type = PO
[o:otf:p:I2P:r:website_get-involved]
file_filter = i2p2www/translations/<lang>/LC_MESSAGES/get-involved.po
source_file = pots/get-involved.pot
source_lang = en
type = PO
minimum_perc = 3
[I2P.website_misc]
file_filter = i2p2www/translations/<lang>/LC_MESSAGES/misc.po
source_file = pots/misc.pot
source_lang = en
type = PO
[o:otf:p:I2P:r:website_misc]
file_filter = i2p2www/translations/<lang>/LC_MESSAGES/misc.po
source_file = pots/misc.pot
source_lang = en
type = PO
minimum_perc = 10
[I2P.website_priority]
file_filter = i2p2www/translations/<lang>/LC_MESSAGES/priority.po
source_file = pots/priority.pot
source_lang = en
type = PO
[o:otf:p:I2P:r:website_priority]
file_filter = i2p2www/translations/<lang>/LC_MESSAGES/priority.po
source_file = pots/priority.pot
source_lang = en
type = PO
minimum_perc = 10
[I2P.website_research]
file_filter = i2p2www/translations/<lang>/LC_MESSAGES/research.po
source_file = pots/research.pot
source_lang = en
type = PO
[o:otf:p:I2P:r:website_research]
file_filter = i2p2www/translations/<lang>/LC_MESSAGES/research.po
source_file = pots/research.pot
source_lang = en
type = PO
minimum_perc = 10

View File

@ -1,16 +1,19 @@
FROM debian:buster
FROM debian:oldoldstable
ENV SERVERNAME=geti2p.net
ENV SERVERMAIL=example@geti2p.net
ADD . /var/www/i2p.www
WORKDIR /var/www/i2p.www
## Install the dependencies
#RUN #grep -v security.debian /etc/apt/sources.list > /etc/apt/sources.list.bak && \
#grep -v stretch-updates /etc/apt/sources.list.bak > /etc/apt/sources.list && \
RUN apt-get update && \
apt-get -y install apache2 apache2-utils libapache2-mod-wsgi python2-dev python-pip patch python-virtualenv git python-polib && \
apt-get -y install apache2 apache2-utils libapache2-mod-wsgi python2-dev python-pip patch python-virtualenv git python-polib
ADD . /var/www/i2p.www
## Start setting up the site
rm -rfv env && \
RUN rm -rfv env && \
virtualenv --distribute env && \
. env/bin/activate && \
pip install -r etc/reqs.txt && \

View File

@ -1,8 +1,43 @@
# Introduction
This web-server for running the i2p-website is a collection of scripts (aka **The Python Scripts**) and content-files to:
* manage updates (based on git),
* manage translations (generating translation files before the web-server is run),
* manage tags (generating tag files before the web-server is run),
* run a web-server creating/delivering pages on-demand (using WSGI)
This is not a static web-site generator. To see the pages you will need to setup your system for the python and shell-scripts and run the web-server contained as described. Due to heavy use of tags even content changes quickly will require a *build environment* to check your changes (towards breaking the build process). Translations can be done using solely a web-site and then do not require any of this (others will integrate all changes from the web-site using these scripts).
The authors are the I2P team. For details about licensing see [LICENSE.txt](/LICENSE.txt).
# Requirements Overview
If you don't want to deal with the requirements/software, you can use a docker config (see [Dockerfile](/Dockerfile)) which will set these up automatically. Otherwise you will need to satisfy the following requirements (that Dockerfile contains the commands for Debian btw.):
* git
* python2
* pip
* virtualenv
* apache (using WSGI to call the scripts)
* ctags? (was mentioned to be needed as both, system package + python package, but it seems only the python package is being installed?)
* transifex-client? (There is a transifex-client in Debian which might be needed for the translation steps described below?)
**Note** that the scripts will install additional software packages (see /etc/reqs.txt) from outside your distribution (into the virtual environment if using docker) using pip and then do some custom patching (meaning pinned versions?).
**Note** also that the manual way described in the following suggests to use proxychains with Tor to avoid Clearnet traffic, while the Docker version seems to use Clearnet for that.
# I2P website
To run locally (for testing purposes):
- Install proxychains, configure it for Tor
- Install virtualenv and Python 2.7
- (Optional) Install proxychains, configure it for Tor
- Pull in the dependencies:
@ -21,9 +56,13 @@ To run locally (for testing purposes):
- Start the webserver:
```
$ source env/bin/activate # activates virtualenv
$ ./runserver.py
$ deactivate # ..s virtualenv
```
(if the shell in use is not bash, you can append its name to the activator if supported: `...ivate.fish`)
- Open the site at http://localhost:5000/
## Running a mirror
@ -45,7 +84,7 @@ If you want to mirror the I2P website, thanks! Here is a checklist:
## Running a mirror with Docker
It's possible to set up a mirror using apache2 inside of a Docker container.
It is intended to provide a HTTP server, to use HTTPS, using a reverse proxy
It is intended to provide a HTTP-only server. To use HTTPS, using a reverse proxy
is the easiest way. You should not need to make any modifications to the
service running inside the container, but you may make the same modifications
to the containerized mirror that you would to a normal mirror by changing your
@ -57,7 +96,7 @@ settings.
- When you have your mirror configured, add `site-updater-docker.sh` to your crontab
to keep the site up-to-date.
## Configuration
# Configuration and Translations
Configuration files for the various scripts are in `etc/`. Environment variables
in `etc/translation.vars` can be overridden by creating the file
@ -68,7 +107,7 @@ in `etc/translation.vars` can be overridden by creating the file
1. Pull new and updated translations from Transifex:
```
$ tx pull -a
$ tx pull --use-git-timestamps -a
```
2. Correctly format the translations:
@ -126,7 +165,7 @@ in `etc/translation.vars` can be overridden by creating the file
3. Push pots file changes to Transifex:
```
$ tx push -s
$ tx push --use-git-timestamps -s
```
## Updating spec tags:

View File

@ -1,5 +1,56 @@
#! /usr/bin/env sh
virtualenv --distribute env
. env/bin/activate
#./setup_venv.sh
DEV=on ./runserver.py
#! /usr/bin/env bash
## Set additional docker run arguments by changing the variable
## i2p_www_docker_run_args in an optional file called config.sh
## for example
##
##i2p_www_docker_run_args='-d'
## to run the site in the background, or
##
##i2p_www_docker_run_args='-t'
## to emulate a TTY
## To operate a quick and easy mirror of the I2P Site in a container
## simply clone the i2p.www source to a host with Docker installed, then
## add:
##
##i2p_www_docker_run_args='-d'
## to config.sh
##
## Then add:
##
##*/10 * * * * /path/to/i2p.www/site-updater-docker.sh
##
## to a crontab belonging to a member of the `docker` group. To add yourself
## to the `docker` group use the command:
##
##sudo adduser $(whoami) docker
##
## a more secure solution may be to create a user especially to run the
## docker crontab only, who is a member of the docker group. To do this,
##
##sudo adduser --disabled-password --disabled-login --ingroup docker docker
## however the specifics may vary from distribution to distribution.
dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
if [ -f "${dir}/config.sh" ]; then
. "${dir}/config.sh"
fi
if [ -z $port ]; then
port="8090"
fi
if [ -z $i2p_www_branch ]; then
i2p_www_branch=master
fi
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" || exit
cd "$DIR" || exit
git pull origin $i2p_www_branch
docker build $i2p_www_docker_build_args -t mirror.i2p.www$suffix .
docker rm -f mirror.i2p.www$suffix
docker run -it $i2p_www_docker_run_args --env DEV:on --name mirror.i2p.www$suffix --net=host --volume $(pwd)/env:/env mirror.i2p.www$suffix ./runserver.py
docker logs -f mirror.i2p.www$suffix

View File

@ -1,2 +1,7 @@
export venv_dir="env"
export venv="`which virtualenv-2.7 || which virtualenv`"
export spec=""
export venv="/usr/bin/virtualenv"
#if [ x"$venv" = x ]; then
# export venv="`which virtualenv`"
# export spec="-p 2.7"
#fi

View File

@ -1,11 +1,13 @@
pytz>=2012
Flask==1.0.2
Babel==1.3
Flask-Babel==0.9
Flask-Caching==1.4.0
Jinja2==2.10
Pygments==1.6
python-ctags
docutils==0.11
Flask==3.0.0
Babel==2.13.1
Flask-Babel==4.0.0
Flask-Caching==2.1.0
Jinja2==3.1.2
Pygments>=1.6
python-ctags3
docutils==0.20.1
gunicorn==0.17.2
werkzeug==0.16.1
werkzeug>=0.16.1
markupsafe>=2.0.1
six

View File

@ -1,5 +1,7 @@
# -*- coding: utf-8 -*-
from flask import Flask, request, g, redirect, url_for, abort, render_template, send_from_directory, safe_join
from __future__ import absolute_import
from flask import Flask, request, g, redirect, url_for, abort, render_template, send_from_directory
from werkzeug.utils import safe_join
try:
from flaskext.babel import Babel
except ImportError:
@ -22,8 +24,8 @@ except ImportError:
###########
# Constants
CURRENT_I2P_VERSION = '2.1.0'
CURRENT_I2P_FIREFOX_PROFILE_VERSION = '2.1.0'
CURRENT_I2P_VERSION = '2.3.0'
CURRENT_I2P_FIREFOX_PROFILE_VERSION = '2.3.0'
CURRENT_I2P_OSX_VERSION = '1.9.0'
CANONICAL_DOMAIN = 'geti2p.net'
@ -140,7 +142,7 @@ cache = Cache(app, config=CACHE_CONFIG)
#################
# Babel selectors
@babel.localeselector
#@babel.localeselector
def get_locale():
# If viewing specs, require English
if request.path.startswith('/spec'):
@ -152,7 +154,7 @@ def get_locale():
# header the browser transmits. The best match wins.
return request.accept_languages.best_match(SUPPORTED_LANGS)
@babel.domainselector
#@babel.domainselector
def get_domains():
domains = []
frags = request.path.split('/', 2)
@ -167,6 +169,7 @@ def get_domains():
domains.append(DEFAULT_GETTEXT_DOMAIN)
return domains
babel.init_app(app, locale_selector=get_locale, default_domain=get_domains)
##########################
# Hooks - helper functions
@ -213,7 +216,7 @@ def detect_theme():
theme = 'duck'
if 'style' in request.cookies:
theme = request.cookies['style']
if 'theme' in request.args.keys():
if 'theme' in list(request.args.keys()):
theme = request.args['theme']
# TEMPORARY: enable external themes
# TODO: Remove this (and the corresponding lines in global/layout.html
@ -263,5 +266,5 @@ def server_error(error):
return render_template('global/error_500.html'), 500
# Import these to ensure they get loaded
import templatevars
import urls
from . import templatevars
from . import urls

View File

@ -6,14 +6,19 @@
Based on perl code by Eddie Kohler; heavily modified.
"""
from __future__ import absolute_import
from __future__ import print_function
import cStringIO
import re
import sys
import os
import config
from . import config
import rank
from . import rank
from six.moves import map
from six.moves import range
from six.moves import zip
__all__ = [ 'ParseError', 'BibTeX', 'BibTeXEntry', 'htmlize',
'ParsedAuthor', 'FileIter', 'Parser', 'parseFile',
@ -66,7 +71,7 @@ class BibTeX:
"""Add a BibTeX entry to this file."""
k = ent.key
if self.byKey.get(ent.key.lower()):
print >> sys.stderr, "Already have an entry named %s"%k
print("Already have an entry named %s"%k, file=sys.stderr)
return
self.entries.append(ent)
self.byKey[ent.key.lower()] = ent
@ -79,7 +84,7 @@ class BibTeX:
try:
cr = self.byKey[ent['crossref'].lower()]
except KeyError:
print "No such crossref: %s"% ent['crossref']
print("No such crossref: %s"% ent['crossref'])
break
if seen.get(cr.key):
raise ParseError("Circular crossref at %s" % ent.key)
@ -87,12 +92,12 @@ class BibTeX:
del ent.entries['crossref']
if cr.entryLine < ent.entryLine:
print "Warning: crossref %s used after declaration"%cr.key
print("Warning: crossref %s used after declaration"%cr.key)
for k in cr.entries.keys():
if ent.entries.has_key(k):
print "ERROR: %s defined both in %s and in %s"%(
k,ent.key,cr.key)
if k in ent.entries:
print("ERROR: %s defined both in %s and in %s"%(
k,ent.key,cr.key))
else:
ent.entries[k] = cr.entries[k]
@ -105,7 +110,7 @@ class BibTeX:
rk = "title"
for ent in self.entries:
if ent.type in config.OMIT_ENTRIES or not ent.has_key(rk):
if ent.type in config.OMIT_ENTRIES or rk not in ent:
ent.check()
del self.byKey[ent.key.lower()]
else:
@ -130,7 +135,7 @@ def buildAuthorTable(entries):
for e in entries:
for author in e.parsedAuthor:
if result.has_key(author):
if author in result:
continue
c = author
@ -143,14 +148,14 @@ def buildAuthorTable(entries):
if 0:
for a,c in result.items():
if a != c:
print "Collapsing authors: %s => %s" % (a,c)
print("Collapsing authors: %s => %s" % (a,c))
if 0:
print parseAuthor("Franz Kaashoek")[0].collapsesTo(
parseAuthor("M. Franz Kaashoek")[0])
print parseAuthor("Paul F. Syverson")[0].collapsesTo(
parseAuthor("Paul Syverson")[0])
print parseAuthor("Paul Syverson")[0].collapsesTo(
parseAuthor("Paul F. Syverson")[0])
print(parseAuthor("Franz Kaashoek")[0].collapsesTo(
parseAuthor("M. Franz Kaashoek")[0]))
print(parseAuthor("Paul F. Syverson")[0].collapsesTo(
parseAuthor("Paul Syverson")[0]))
print(parseAuthor("Paul Syverson")[0].collapsesTo(
parseAuthor("Paul F. Syverson")[0]))
return result
@ -221,7 +226,7 @@ def splitEntriesByAuthor(entries):
htmlResult[sortkey] = secname
result.setdefault(sortkey, []).append(ent)
sortnames = result.keys()
sortnames = list(result.keys())
sortnames.sort()
sections = [ (htmlResult[n], result[n]) for n in sortnames ]
return sections, url_map
@ -255,13 +260,13 @@ def sortEntriesByDate(entries):
monthname = match.group(1)
mon = MONTHS.index(monthname)
except ValueError:
print "Unknown month %r in %s"%(ent.get("month"), ent.key)
print("Unknown month %r in %s"%(ent.get("month"), ent.key))
mon = 0
try:
date = int(ent['year'])*13 + mon
except KeyError:
print "ERROR: No year field in %s"%ent.key
print("ERROR: No year field in %s"%ent.key)
date = 10000*13
except ValueError:
date = 10000*13
@ -286,7 +291,7 @@ class BibTeXEntry:
def get(self, k, v=None):
return self.entries.get(k,v)
def has_key(self, k):
return self.entries.has_key(k)
return k in self.entries
def __getitem__(self, k):
return self.entries[k]
def __setitem__(self, k, v):
@ -318,7 +323,7 @@ class BibTeXEntry:
else:
df = DISPLAYED_FIELDS
for f in df:
if not self.entries.has_key(f):
if f not in self.entries:
continue
v = self.entries[f]
if v.startswith("<span class='bad'>"):
@ -330,7 +335,7 @@ class BibTeXEntry:
d.append("%%%%% "+("ERROR: Non-ASCII characters: '%r'\n"%np))
d.append(" ")
v = v.replace("&", "&amp;")
if invStrings.has_key(v):
if v in invStrings:
s = "%s = %s,\n" %(f, invStrings[v])
else:
s = "%s = {%s},\n" % (f, v)
@ -359,7 +364,7 @@ class BibTeXEntry:
none."""
errs = self._check()
for e in errs:
print e
print(e)
return not errs
def _check(self):
@ -396,7 +401,7 @@ class BibTeXEntry:
not self['booktitle'].startswith("{Proceedings of"):
errs.append("ERROR: %s's booktitle (%r) doesn't start with 'Proceedings of'" % (self.key, self['booktitle']))
if self.has_key("pages") and not re.search(r'\d+--\d+', self['pages']):
if "pages" in self and not re.search(r'\d+--\d+', self['pages']):
errs.append("ERROR: Misformed pages in %s"%self.key)
if self.type == 'proceedings':
@ -551,8 +556,8 @@ class BibTeXEntry:
cache_section = self.get('www_cache_section', ".")
if cache_section not in config.CACHE_SECTIONS:
if cache_section != ".":
print >>sys.stderr, "Unrecognized cache section %s"%(
cache_section)
print("Unrecognized cache section %s"%(
cache_section), file=sys.stderr)
cache_section="."
for key, name, ext in (('www_abstract_url', 'abstract','abstract'),
@ -766,13 +771,13 @@ class ParsedAuthor:
short = o.first; long = self.first
initials_s = "".join([n[0] for n in short])
initials_l = "".join([n[0] for n in long])
initials_l = "".join([n[0] for n in int])
idx = initials_l.find(initials_s)
if idx < 0:
return self
n = long[:idx]
n = int[:idx]
for i in range(idx, idx+len(short)):
a = long[i]; b = short[i-idx]
a = int[i]; b = short[i-idx]
if a == b:
n.append(a)
elif len(a) == 2 and a[1] == '.' and a[0] == b[0]:
@ -781,7 +786,7 @@ class ParsedAuthor:
n.append(a)
else:
return self
n += long[idx+len(short):]
n += int[idx+len(short):]
if n == self.first:
return self
@ -842,7 +847,7 @@ def _split(s,w=79,indent=8):
first = 1
indentation = ""
while len(s) > w:
for i in xrange(w-1, 20, -1):
for i in range(w-1, 20, -1):
if s[i] == ' ':
r.append(indentation+s[:i])
s = s[i+1:]
@ -866,7 +871,7 @@ class FileIter:
if string:
file = cStringIO.StringIO(string)
if file:
it = iter(file.xreadlines())
it = iter(file)
self.iter = it
assert self.iter
self.lineno = 0
@ -880,7 +885,7 @@ def parseAuthor(s):
try:
return _parseAuthor(s)
except:
print >>sys.stderr, "Internal error while parsing author %r"%s
print("Internal error while parsing author %r"%s, file=sys.stderr)
raise
def _parseAuthor(s):
@ -891,7 +896,7 @@ def _parseAuthor(s):
while s:
s = s.strip()
bracelevel = 0
for i in xrange(len(s)):
for i in range(len(s)):
if s[i] == '{':
bracelevel += 1
elif s[i] == '}':
@ -947,8 +952,8 @@ def _parseAuthor(s):
return parsedAuthors
ALLCHARS = "".join(map(chr,range(256)))
PRINTINGCHARS = "\t\n\r"+"".join(map(chr,range(32, 127)))
ALLCHARS = "".join(map(chr,list(range(256))))
PRINTINGCHARS = "\t\n\r"+"".join(map(chr,list(range(32, 127))))
LC_CHARS = "abcdefghijklmnopqrstuvwxyz"
SV_DELCHARS = ("ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
@ -1049,7 +1054,7 @@ class Parser:
continue
data.append(line)
data.append(" ")
line = it.next()
line = next(it)
self.litStringLine = 0
elif line[0] == '{':
bracelevel += 1
@ -1076,13 +1081,13 @@ class Parser:
#print bracelevel, "C", repr(line)
data.append(line)
data.append(" ")
line = it.next()
line = next(it)
elif line[0] == '#':
print >>sys.stderr, "Weird concat on line %s"%it.lineno
print("Weird concat on line %s"%it.lineno, file=sys.stderr)
elif line[0] in "},":
if not data:
print >>sys.stderr, "No data after field on line %s"%(
it.lineno)
print("No data after field on line %s"%(
it.lineno), file=sys.stderr)
else:
m = RAW_DATA_RE.match(line)
if m:
@ -1170,7 +1175,7 @@ class Parser:
else:
key = v[0]
d = {}
for i in xrange(1,len(v),2):
for i in range(1,len(v),2):
d[v[i].lower()] = v[i+1]
ent = BibTeXEntry(self.curEntType, key, d)
ent.entryLine = self.entryLine
@ -1197,11 +1202,11 @@ class Parser:
def _parse(self):
it = self.fileiter
line = it.next()
line = next(it)
while 1:
# Skip blank lines.
while not line or line.isspace() or OUTER_COMMENT_RE.match(line):
line = it.next()
line = next(it)
# Get the first line of an entry.
m = ENTRY_BEGIN_RE.match(line)
if m:
@ -1215,7 +1220,7 @@ class Parser:
def _advance(it,line):
while not line or line.isspace() or COMMENT_RE.match(line):
line = it.next()
line = next(it)
return line
# Matches a comment line outside of an entry.
@ -1265,5 +1270,5 @@ if __name__ == '__main__':
for e in r.entries:
if e.type in ("proceedings", "journal"): continue
print e.to_html()
print(e.to_html())

View File

@ -1,5 +1,6 @@
# Copyright 2003-2006, Nick Mathewson. See LICENSE for licensing info.
from __future__ import absolute_import
import re
_KEYS = [ "ALL_TAGS",
@ -19,7 +20,7 @@ del _k
def load(cfgFile):
mod = {}
execfile(cfgFile, mod)
exec(compile(open(cfgFile, "rb").read(), cfgFile, 'exec'), mod)
for _k in _KEYS:
try:
globals()[_k]=mod[_k]

View File

@ -8,6 +8,9 @@
Based on the original C++ metaphone implementation.)
"""
from __future__ import print_function
from six.moves import map
from six.moves import range
TRIPLES = {
'dge': 'j',
@ -45,7 +48,7 @@ SINGLETONS = {
'z': 's',
}
ALLCHARS = "".join(map(chr, range(256)))
ALLCHARS = "".join(map(chr, list(range(256))))
NONLCCHARS = "".join([c for c in ALLCHARS if not c.islower()])
def metaphone(s):
"""Return the metaphone equivalent of a provided string"""
@ -182,7 +185,7 @@ def metaphone(s):
return "".join(result)
def demo(a):
print a, "=>", metaphone(a)
print(a, "=>", metaphone(a))
if __name__ == '__main__':
demo("Nick. Mathewson")

View File

@ -4,10 +4,12 @@
# http://scholar.google.com/scholar?as_epq=
# Take care of the caching setup
from __future__ import absolute_import
from __future__ import print_function
cache_expire = 60*60*24*30 # 30 days
# Checks
import config
from . import config
import os
import sys
from os.path import exists, isdir, join, getmtime
@ -32,8 +34,8 @@ def cache_folder():
return r
import re
from urllib2 import urlopen, build_opener
from urllib import quote
from six.moves.urllib.request import urlopen, build_opener
from six.moves.urllib.parse import quote
from datetime import date
import hashlib
@ -64,21 +66,21 @@ def getPageForTitle(title, cache=True, update=True, save=True):
# Access cache or network
if exists(join(cache_folder(), md5h(url))) and cache:
return url, file(join(cache_folder(), md5h(url)),'r').read()
return url, open(join(cache_folder(), md5h(url)),'r').read()
elif update:
print "Downloading rank for %r."%title
print("Downloading rank for %r."%title)
# Make a custom user agent (so that we are not filtered by Google)!
opener = build_opener()
opener.addheaders = [('User-agent', 'Anon.Bib.0.1')]
print "connecting..."
print("connecting...")
connection = opener.open(url)
print "reading"
print("reading")
page = connection.read()
print "done"
print("done")
if save:
file(join(cache_folder(), md5h(url)),'w').write(page)
open(join(cache_folder(), md5h(url)),'w').write(page)
return url, page
else:
return url, None
@ -140,20 +142,20 @@ def get_rank_html(title, years=None, base_url=".", update=True,
def TestScholarFormat():
# We need to ensure that Google Scholar does not change its page format under our feet
# Use some cases to check if all is good
print "Checking google scholar formats..."
print("Checking google scholar formats...")
stopAndGoCites = getCite("Stop-and-Go MIXes: Providing Probabilistic Anonymity in an Open System", False)[0]
dragonCites = getCite("Mixes protected by Dragons and Pixies: an empirical study", False, save=False)[0]
if stopAndGoCites in (0, None):
print """OOPS.\n
print("""OOPS.\n
It looks like Google Scholar changed their URL format or their output format.
I went to count the cites for the Stop-and-Go MIXes paper, and got nothing."""
I went to count the cites for the Stop-and-Go MIXes paper, and got nothing.""")
sys.exit(1)
if dragonCites != None:
print """OOPS.\n
print("""OOPS.\n
It looks like Google Scholar changed their URL format or their output format.
I went to count the cites for a fictitious paper, and found some."""
I went to count the cites for a fictitious paper, and found some.""")
sys.exit(1)
def urlIsUseless(u):
@ -170,7 +172,7 @@ URLTYPES=[ "pdf", "ps", "txt", "ps_gz", "html" ]
if __name__ == '__main__':
# First download the bibliography file.
import BibTeX
from . import BibTeX
suggest = False
if sys.argv[1] == 'suggest':
suggest = True
@ -182,7 +184,7 @@ if __name__ == '__main__':
bib = BibTeX.parseFile(config.MASTER_BIB)
remove_old()
print "Downloading missing ranks."
print("Downloading missing ranks.")
for ent in bib.entries:
getCite(ent['title'], cache=True, update=True)
@ -190,13 +192,13 @@ if __name__ == '__main__':
for ent in bib.entries:
haveOne = False
for utype in URLTYPES:
if ent.has_key("www_%s_url"%utype):
if "www_%s_url"%utype in ent:
haveOne = True
break
if haveOne:
continue
print ent.key, "has no URLs given."
print(ent.key, "has no URLs given.")
urls = [ u for u in getPaperURLs(ent['title']) if not urlIsUseless(u) ]
for u in urls:
print "\t", u
print("\t", u)

View File

@ -8,14 +8,17 @@
cleaned up a little, and all the duplicate entries commented out.
"""
from __future__ import absolute_import
from __future__ import print_function
import sys
import re
from six.moves import zip
assert sys.version_info[:3] >= (2,2,0)
import BibTeX
import config
import metaphone
from . import BibTeX
from . import config
from . import metaphone
_MPCACHE = {}
def soundsLike(s1, s2):
@ -168,16 +171,16 @@ class MasterBibTeX(BibTeX.BibTeX):
matches = m2
if not matches:
print "No match for %s"%e.key
print("No match for %s"%e.key)
if matches[-1][1] is e:
print "%s matches for %s: OK."%(len(matches), e.key)
print("%s matches for %s: OK."%(len(matches), e.key))
else:
print "%s matches for %s: %s is best!" %(len(matches), e.key,
matches[-1][1].key)
print("%s matches for %s: %s is best!" %(len(matches), e.key,
matches[-1][1].key))
if len(matches) > 1:
for g, m in matches:
print "%%%% goodness", g
print m
print("%%%% goodness", g)
print(m)
def noteToURL(note):
@ -202,7 +205,7 @@ def emit(f,ent):
global all_ok
errs = ent._check()
if master.byKey.has_key(ent.key.strip().lower()):
if ent.key.strip().lower() in master.byKey:
errs.append("ERROR: Key collision with master file")
if errs:
@ -232,61 +235,61 @@ def emit(f,ent):
if errs:
all_ok = 0
for e in errs:
print >>f, "%%%%", e
print("%%%%", e, file=f)
print >>f, ent.format(77, 4, v=1, invStrings=invStrings)
print(ent.format(77, 4, v=1, invStrings=invStrings), file=f)
def emitKnown(f, ent, matches):
print >>f, "%% Candidates are:", ", ".join([e.key for g,e in matches])
print >>f, "%%"
print >>f, "%"+(ent.format(77,4,1,invStrings).replace("\n", "\n%"))
print("%% Candidates are:", ", ".join([e.key for g,e in matches]), file=f)
print("%%", file=f)
print("%"+(ent.format(77,4,1,invStrings).replace("\n", "\n%")), file=f)
if __name__ == '__main__':
if len(sys.argv) != 3:
print "reconcile.py expects 2 arguments"
print("reconcile.py expects 2 arguments")
sys.exit(1)
config.load(sys.argv[1])
print "========= Scanning master =========="
print("========= Scanning master ==========")
master = MasterBibTeX()
master = BibTeX.parseFile(config.MASTER_BIB, result=master)
master.buildIndex()
print "========= Scanning new file ========"
print("========= Scanning new file ========")
try:
fn = sys.argv[2]
input = BibTeX.parseFile(fn)
except BibTeX.ParseError, e:
print "Error parsing %s: %s"%(fn,e)
except BibTeX.ParseError as e:
print("Error parsing %s: %s"%(fn,e))
sys.exit(1)
f = open('tmp.bib', 'w')
keys = input.newStrings.keys()
keys = list(input.newStrings.keys())
keys.sort()
for k in keys:
v = input.newStrings[k]
print >>f, "@string{%s = {%s}}"%(k,v)
print("@string{%s = {%s}}"%(k,v), file=f)
invStrings = input.invStrings
for e in input.entries:
if not (e.get('title') and e.get('author')):
print >>f, "%%\n%%%% Not enough information to search for a match: need title and author.\n%%"
print("%%\n%%%% Not enough information to search for a match: need title and author.\n%%", file=f)
emit(f, e)
continue
matches = master.includes(e, all=1)
if not matches:
print >>f, "%%\n%%%% This entry is probably new: No match found.\n%%"
print("%%\n%%%% This entry is probably new: No match found.\n%%", file=f)
emit(f, e)
else:
print >>f, "%%"
print >>f, "%%%% Possible match found for this entry; max goodness",\
matches[-1][0], "\n%%"
print("%%", file=f)
print("%%%% Possible match found for this entry; max goodness",\
matches[-1][0], "\n%%", file=f)
emitKnown(f, e, matches)
if not all_ok:
print >>f, "\n\n\nErrors remain; not finished.\n"
print("\n\n\nErrors remain; not finished.\n", file=f)
f.close()

View File

@ -3,8 +3,9 @@
"""Unit tests for anonbib."""
import BibTeX
import metaphone
from __future__ import absolute_import
from . import BibTeX
from . import metaphone
#import reconcile
#import writeHTML
#import updateCache

View File

@ -4,19 +4,21 @@
"""Download files in bibliography into a local cache.
"""
from __future__ import absolute_import
from __future__ import print_function
import os
import sys
import signal
import time
import gzip
import BibTeX
import config
import urllib2
from . import BibTeX
from . import config
import six.moves.urllib.request, six.moves.urllib.error, six.moves.urllib.parse
import getopt
import socket
import errno
import httplib
import six.moves.http_client
FILE_TYPES = [ "txt", "html", "pdf", "ps", "ps.gz", "abstract" ]
BIN_FILE_TYPES = [ 'pdf', 'ps.gz' ]
@ -53,12 +55,12 @@ def downloadFile(key, ftype, section, url,timeout=None):
signal.alarm(timeout)
try:
try:
infile = urllib2.urlopen(url)
except httplib.InvalidURL, e:
infile = six.moves.urllib.request.urlopen(url)
except six.moves.http_client.InvalidURL as e:
raise UIError("Invalid URL %s: %s"%(url,e))
except IOError, e:
except IOError as e:
raise UIError("Cannot connect to url %s: %s"%(url,e))
except socket.error, e:
except socket.error as e:
if getattr(e,"errno",-1) == errno.EINTR:
raise UIError("Connection timed out to url %s"%url)
else:
@ -80,9 +82,9 @@ def downloadFile(key, ftype, section, url,timeout=None):
outfile.close()
urlfile = open(fnameURL, 'w')
print >>urlfile, time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), file=urlfile)
if "\n" in url: url = url.replace("\n", " ")
print >>urlfile, url
print(url, file=urlfile)
urlfile.close()
os.rename(fnameTmp, fname)
@ -105,7 +107,7 @@ def getCachedURL(key, ftype, section):
lines = f.readlines()
f.close()
if len(lines) != 2:
print >>sys.stderr, "ERROR: unexpected number of lines in", urlFname
print("ERROR: unexpected number of lines in", urlFname, file=sys.stderr)
return lines[1].strip()
def downloadAll(bibtex, missingOnly=0):
@ -119,29 +121,29 @@ def downloadAll(bibtex, missingOnly=0):
if missingOnly:
cachedURL = getCachedURL(key, ftype, section)
if cachedURL == url:
print >>sys.stderr,"Skipping",url
print("Skipping",url, file=sys.stderr)
continue
elif cachedURL is not None:
print >>sys.stderr,"URL for %s.%s has changed"%(key,ftype)
print("URL for %s.%s has changed"%(key,ftype), file=sys.stderr)
else:
print >>sys.stderr,"I have no copy of %s.%s"%(key,ftype)
print("I have no copy of %s.%s"%(key,ftype), file=sys.stderr)
try:
downloadFile(key, ftype, section, url)
print "Downloaded",url
except UIError, e:
print >>sys.stderr, str(e)
print("Downloaded",url)
except UIError as e:
print(str(e), file=sys.stderr)
errors.append((key,ftype,url,str(e)))
except (IOError, socket.error), e:
except (IOError, socket.error) as e:
msg = "Error downloading %s: %s"%(url,str(e))
print >>sys.stderr, msg
print(msg, file=sys.stderr)
errors.append((key,ftype,url,msg))
if urls.has_key("ps") and not urls.has_key("ps.gz"):
if "ps" in urls and "ps.gz" not in urls:
# Say, this is something we'd like to have gzipped locally.
psFname = getCacheFname(key, "ps", section)
psGzFname = getCacheFname(key, "ps.gz", section)
if os.path.exists(psFname) and not os.path.exists(psGzFname):
# This is something we haven't gzipped yet.
print "Compressing a copy of",psFname
print("Compressing a copy of",psFname)
outf = gzip.GzipFile(psGzFname, "wb")
inf = open(psFname, "rb")
while 1:
@ -156,9 +158,9 @@ def downloadAll(bibtex, missingOnly=0):
if __name__ == '__main__':
if len(sys.argv) == 2:
print "Loading from %s"%sys.argv[1]
print("Loading from %s"%sys.argv[1])
else:
print >>sys.stderr, "Expected a single configuration file as an argument"
print("Expected a single configuration file as an argument", file=sys.stderr)
sys.exit(1)
config.load(sys.argv[1])

View File

@ -1,3 +1,4 @@
from __future__ import absolute_import
from flask import render_template
from i2p2www import ANONBIB_CFG, ANONBIB_FILE

View File

@ -3,16 +3,20 @@
"""Generate indices by author, topic, date, and BibTeX key."""
from __future__ import absolute_import
from __future__ import print_function
import sys
import re
import os
import json
from six.moves import map
from six.moves import range
assert sys.version_info[:3] >= (2,2,0)
os.umask(022)
os.umask(0o22)
import BibTeX
import config
from . import BibTeX
from . import config
def getTemplate(name):
f = open(name)
@ -39,15 +43,15 @@ def writeBody(f, sections, section_urls, cache_path, base_url):
sDisp = re.sub(r'\s+', ' ', s.strip())
sDisp = sDisp.replace(" ", "&nbsp;")
if u:
print >>f, ('<li><h3><a name="%s"></a><a href="%s">%s</a></h3>'%(
(BibTeX.url_untranslate(s), u, sDisp)))
print(('<li><h3><a name="%s"></a><a href="%s">%s</a></h3>'%(
(BibTeX.url_untranslate(s), u, sDisp))), file=f)
else:
print >>f, ('<li><h3><a name="%s">%s</a></h3>'%(
BibTeX.url_untranslate(s),sDisp))
print >>f, "<ul class='expand'>"
print(('<li><h3><a name="%s">%s</a></h3>'%(
BibTeX.url_untranslate(s),sDisp)), file=f)
print("<ul class='expand'>", file=f)
for e in entries:
print >>f, e.to_html(cache_path=cache_path, base_url=base_url)
print >>f, "</ul></li>"
print(e.to_html(cache_path=cache_path, base_url=base_url), file=f)
print("</ul></li>", file=f)
def writeHTML(f, sections, sectionType, fieldName, choices,
tag, config, cache_url_path, section_urls={}):
@ -69,7 +73,7 @@ def writeHTML(f, sections, sectionType, fieldName, choices,
#
tagListStr = []
st = config.TAG_SHORT_TITLES.keys()
st = list(config.TAG_SHORT_TITLES.keys())
st.sort()
root = "../"*pathLength(config.TAG_DIRECTORIES[tag])
if root == "": root = "."
@ -104,10 +108,10 @@ def writeHTML(f, sections, sectionType, fieldName, choices,
}
header, footer = getTemplate(config.TEMPLATE_FILE)
print >>f, header%fields
print(header%fields, file=f)
writeBody(f, sections, section_urls, cache_path=cache_url_path,
base_url=root)
print >>f, footer%fields
print(footer%fields, file=f)
def jsonDumper(obj):
if isinstance(obj, BibTeX.BibTeXEntry):
@ -125,7 +129,7 @@ def writePageSet(config, bib, tag):
bib_entries = bib.entries[:]
if not bib_entries:
print >>sys.stderr, "No entries with tag %r; skipping"%tag
print("No entries with tag %r; skipping"%tag, file=sys.stderr)
return
tagdir = config.TAG_DIRECTORIES[tag]
@ -133,7 +137,7 @@ def writePageSet(config, bib, tag):
cache_url_path = BibTeX.smartJoin("../"*pathLength(tagdir),
config.CACHE_DIR)
if not os.path.exists(outdir):
os.makedirs(outdir, 0755)
os.makedirs(outdir, 0o755)
##### Sorted views:
## By topic.
@ -174,7 +178,7 @@ def writePageSet(config, bib, tag):
except ValueError:
last_year = int(entries[-2][1][0].get('year'))
years = map(str, range(first_year, last_year+1))
years = list(map(str, list(range(first_year, last_year+1))))
if entries[-1][0] == 'Unknown':
years.append("Unknown")
@ -216,15 +220,15 @@ def writePageSet(config, bib, tag):
header,footer = getTemplate(config.BIBTEX_TEMPLATE_FILE)
f = open(os.path.join(outdir,"bibtex.html"), 'w')
print >>f, header % { 'command_line' : "",
print(header % { 'command_line' : "",
'title': config.TAG_TITLES[tag],
'root': root }
'root': root }, file=f)
for ent in entries:
print >>f, (
print((
("<tr><td class='bibtex'><a name='%s'>%s</a>"
"<pre class='bibtex'>%s</pre></td></tr>")
%(BibTeX.url_untranslate(ent.key), ent.key, ent.format(90,8,1)))
print >>f, footer
%(BibTeX.url_untranslate(ent.key), ent.key, ent.format(90,8,1))), file=f)
print(footer, file=f)
f.close()
f = open(os.path.join(outdir,"bibtex.json"), 'w')
@ -234,9 +238,9 @@ def writePageSet(config, bib, tag):
if __name__ == '__main__':
if len(sys.argv) == 2:
print "Loading from %s"%sys.argv[1]
print("Loading from %s"%sys.argv[1])
else:
print >>sys.stderr, "Expected a single configuration file as an argument"
print("Expected a single configuration file as an argument", file=sys.stderr)
sys.exit(1)
config.load(sys.argv[1])

View File

@ -287,7 +287,7 @@ SSU2, NTCP2, or SSU.
{%- endtrans %}
{% trans -%}
In the live network, latency and packet loss varies widely.
In the live network, latency and packet loss vary widely.
Even in a test setup, performance depends on configured latency and packet loss.
The i2pd project reports that maximum transfer rates for SSU2 were over 3 times
faster than SSU in some tests. However, they completely redesigned their

View File

@ -0,0 +1,64 @@
{% trans -%}
=======================================
Update on Mac Easy Install Notarization
=======================================
{%- endtrans %}
.. meta::
:author: idk,sadie
:date: 2023-01-31
:category: release
:excerpt: {% trans %}Easy Install Bundle for Mac is stalled{% endtrans %}
{% trans -%}
The I2P Easy-Install Bundle for Mac has been experiencing stalled updates for the past 2 releases due to the departure of its maintainer.
It is recommended that users of the Easy-Install bundle for Mac switch to the classic java-style installer which was recently restored to the download page.
1.9.0 has known security issues and is not suitable for hosting services or any long-term use. Users are advised to migrate away as soon as possible.
Advanced users of the Easy-Install bundle may work around this by compiling the bundle from source and self-signing the software.
{%- endtrans %}
{% trans -%}The Notarization Process For MacOS{%- endtrans %}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
{% trans -%}
There are many steps in the process of distributing an application to Apple users.
In order to distribute an application as a .dmg securely, the application must pass a notarization process.
In order to submit an application for notarization, a developer must sign the application using a set of certificates that includes one for code signing, and one for signing the application itself.
This signing must take place at specific points during the build process, before the final .dmg bundle which is distributed to the end users can be created.
{%- endtrans %}
{% trans -%}
I2P Java is a complex application, and because of this it is a process of trial and error to match the types of code used in the application to Apple's certificates, and where the signing takes place to produce a valid timestamp.
It is due to this complexity that existing documentation for developers is falling short of helping the team understand the correct combination of factors that will result in successful notarization.
{%- endtrans %}
{% trans -%}
These difficulties leave the timeline for completing this process difficult to predict.
We won't know we're done until we are able to clean up the build environment and follow the process end-to-end.
The good news is that we are down to only 4 errors during the notarization process from more than 50 during the first attempt and can reasonably predict that it will be competed before or in time for the next release in April.
{%- endtrans %}
{% trans -%}Options for New macOS I2P Installs and Updates{%- endtrans %}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
{% trans -%}
New I2P participants can still download the Easy Installer for the macOS 1.9.0 software.
I hope to have a release ready near the end of April.
Updates to the latest version will become available as soon as notarization is successful.
{%- endtrans %}
{% trans -%}
The classic install options is also available.
This will require downloading Java and the I2P software via the .jar based installer.
{%- endtrans %}
`{% trans -%}Jar Install Instructions are available here.{%- endtrans %} <https://geti2p.net/en/download/macos>`_
{% trans -%}
Easy-Install users can update to that latest version using a locally-produced development build.
{%- endtrans %}
`{% trans -%}Easy-Install Build Instructions are available here.{%- endtrans %} <https://i2pgit.org/i2p-hackers/i2p-jpackage-mac/-/blob/master/BUILD.md>`_
{% trans -%}
There is also the option to uninstall the software, remove the I2P configuration directory and reinstall I2P using the .jar installer.
{%- endtrans %}

View File

@ -0,0 +1,23 @@
{% trans -%}
==========================================
About the recent Denial of Service attacks
==========================================
{%- endtrans %}
.. meta::
:author: idk,sadie
:date: 2023-02-09
:category: release
:excerpt: {% trans %}I2P remains intact with impaired performance{% endtrans %}
{% trans -%}
The I2P network is currently being affected by a Denial of Service attack.
The floodfill function of the network has been affected, resulting in responses being disrupted and tunnel build success rates dropping.
Participants in the network have experienced difficulties connecting to I2P sites and using I2P services.
Mitigation strategies are being investigated and implemented gradually.
{%- endtrans %}
{% trans -%}
While the attack has degraded performance, the network remains intact and usable.
Java I2P routers appear to be handling the issues better than i2pd routers for now.
Various mitigations should begin to appear in dev builds of both Java and C++ routers in the next week.
{%- endtrans %}

View File

@ -0,0 +1,14 @@
{% trans -%}
=================
I2P Release 2.2.0
=================
{%- endtrans %}
.. meta::
:author: idk
:date: 2023-03-13
:category: release
:excerpt: {% trans %}Moved Post{% endtrans %}
{% trans -%}
`This blog post has been moved here </en/blog/post/2023/03/13/new_release_2.2.0>`_
{%- endtrans %}

View File

@ -0,0 +1,89 @@
{% trans -%}
=================
I2P Release 2.2.0
=================
{%- endtrans %}
.. meta::
:author: idk
:date: 2023-03-13
:category: release
:excerpt: {% trans %}DDoS Mitigations, New Release Maintainer{% endtrans %}
{% trans -%}
We have elected to move forward the 2.2.0 release date, which will be occurring today, March 13, 2023.
This release includes a changes across the NetDB, Floodfill, and Peer-Selection components which improve the ability of the router to survive DDOS attacks.
The attacks are likely to continue, but the improvements to these systems will help to mitigate the risk of DDOS attacks by helping the router identify and de-prioritize routers that appear malicious.
{%- endtrans %}
{% trans -%}
This release also adds replay protection to the Streaming subsystem, which prevents an attacker who can capture an encrypted packet from being able to re-use it by sending it to unintended recipients.
This is a backward-compatible change, so older routers will still be able to use the streaming capabilities of newer routers.
This issue was discovered and fixed internally, by the I2P development team, and is not related to the DDOS attacks.
We have never encountered a replayed streaming packet in the wild and do not believe a streaming replay attack has ever taken place against the I2P network at this time.
{%- endtrans %}
{% trans -%}
As you may have noticed, these release notes and the release itself have been signed by idk, and not zzz.
zzz has chosen to step away from the project and his responsibilities are being taken on by other team members.
As such, the project is working on replacing the network statistics infrastructure and moving the development forum to i2pforum.i2p.
We thank zzz for providing these services for such a long time.
{%- endtrans %}
{% trans -%}
As usual, we recommend that you update to this release.
The best way to maintain security and help the network is to run the latest release.
{%- endtrans %}
**DETAILS**
*Changes*
- {% trans %}i2psnark: New search feature{% endtrans %}
- {% trans %}i2psnark: New max files per torrent config{% endtrans %}
- {% trans %}NetDB: Expiration improvements{% endtrans %}
- {% trans %}NetDB: More restrictions on lookups and exploration{% endtrans %}
- {% trans %}NetDB: Store handling improvements{% endtrans %}
- {% trans %}NTCP2: Banning improvements{% endtrans %}
- {% trans %}Profiles: Adjust capacity estimates{% endtrans %}
- {% trans %}Profiles: Expiration improvements{% endtrans %}
- {% trans %}Router: Initial support for congestion caps (proposal 162){% endtrans %}
- {% trans %}Transports: Add inbound connection limiting{% endtrans %}
- {% trans %}Tunnels: Refactor and improve peer selection{% endtrans %}
- {% trans %}Tunnels: Improve handling of "probabalistic" rejections{% endtrans %}
- {% trans %}Tunnels: Reduce usage of unreachable and floodfill routers{% endtrans %}
*Bug Fixes*
- {% trans %}Docker: Fix graphs not displaying{% endtrans %}
- {% trans %}i2psnark: Fix torrents with '#' in the name{% endtrans %}
- {% trans %}i2psnark standalone: Fix running from outside directory{% endtrans %}
- {% trans %}i2psnark standalone: Remove "Start I2P" menu item from systray{% endtrans %}
- {% trans %}i2ptunnel: Fix typo in HTTPS outproxy hostname{% endtrans %}
- {% trans %}i2ptunnel: Interrupt tunnel build if stop button clicked{% endtrans %}
- {% trans %}i2ptunnel: Return error message to IRC, HTTP, and SOCKS clients on failure to build tunnels{% endtrans %}
- {% trans %}NTCP2: Ensure an IPv6 address is published when firewalled and IPv4 is not{% endtrans %}
- {% trans %}Ratchet: Don't bundle wrong leaseset with ack{% endtrans %}
- {% trans %}Router: Fixes for symmetric NAT errors on 'full cone' NAT{% endtrans %}
- {% trans %}SAM: Interrupt tunnel build if client times out{% endtrans %}
- {% trans %}SSU2: Fix rare peer test NPE{% endtrans %}
- {% trans %}Sybil: Don't blame i2pd publishing ::1{% endtrans %}
- {% trans %}Sybil: Memory usage and priority reduction{% endtrans %}
- {% trans %}Transports: More IP checks{% endtrans %}
*Other*
- {% trans %}Blocklist efficiency improvements{% endtrans %}
- {% trans %}Bundles: Identify Win and Mac bundles in version info{% endtrans %}
- {% trans %}Console: Identify service installs, revision, and build time in version info{% endtrans %}
- {% trans %}Console: NetDB search form and tunnels page improvements (advanced only){% endtrans %}
- {% trans %}Router: Reduce stats memory usage{% endtrans %}
- {% trans %}Tunnels: Reduce "grace period"{% endtrans %}
- {% trans %}Translation updates{% endtrans %}
Full list of fixed bugs: http://git.idk.i2p/i2p-hackers/i2p.i2p/-/issues?scope=all&state=closed&milestone_title=2.2.0

View File

@ -0,0 +1,67 @@
{% trans -%}
=================
I2P Release 2.3.0
=================
{%- endtrans %}
.. meta::
:author: idk
:date: 2023-06-25
:category: release
:excerpt: {% trans %}I2P 2.3.0: Security Fixes, Tweakable Blocklists{% endtrans %}
{% trans -%}
This release contains fixes for CVE-2023-36325.
CVE-2023-36325 is a context-confusion bug which occurred in the bloom filter.
An attacker crafts an I2NP message containing a unique messageID, and sends that messageID to a client.
The message, after passing through the bloom filter, is not allowed to be re-used in a second message.
The attacker then sends the same message directly to the router.
The router passes the message to the bloom filter, and is dropped.
This leaks the information that the messageID has been seen before, giving the attacker a strong reason to believe that the router is hosting the client.
This has been fixed by separting the bloom filter's functionality into different contexts based on whether a message came down a client tunnel, an exploratory tunnel, was sent to the router directly.
Under normal circumstances, this attack takes several days to perform successfully and may be confounded by several factors such as routers restarting during the attack phase and sensitivity to false-positives.
Users of Java I2P are recommended to update immediately to avoid the attack.
{%- endtrans %}
{% trans -%}
In the course of fixing this context confusion bug, we have revised some of our strategies to code defensively, against these types of leaks.
This includes tweaks to the netDb, the rate-limiting mechanisms, and the behavior of floodfill routers.
{%- endtrans %}
{% trans -%}
This release adds not_bob as a second default hosts provider, and adds `notbob.i2p <http://notbob.i2p>`_ and `ramble.i2p <http://ramble.i2p>`_ to the console homepage.
{%- endtrans %}
{% trans -%}
This release also contains a tweakable blocklist.
Blocklisting is semi-permanent, each blocked IP address is normally blocked until the router is restarted.
Users who observe explosive blocklist growth during sybil attacks may opt-in to shorter timeouts by configuring the blocklist to expire entries at an interval.
This feature is off-by-default and is only recommended for advanced users at this time.
{%- endtrans %}
{% trans -%}
This release also includes an API for plugins to modify with the Desktop GUI(DTG).
It is now possible to add menu items to the system tray, enabling more intuitive launching of plugins which use native application interfaces.
{%- endtrans %}
{% trans -%}
As usual, we recommend that you update to this release.
The best way to maintain security and help the network is to run the latest release.
{%- endtrans %}
**DETAILS**
*Changes*
- {% trans %}netDb: Throttle bursts of netDB lookups{% endtrans %}
- {% trans %}Sybil/Blocklist: Allow users to override blocklist expiration with an interval{% endtrans %}
- {% trans %}DTG: Provide an API for extending DTG with a plugin{% endtrans %}
- {% trans %}Addressbook: add notbob's main addressbook to the default subscriptions.{% endtrans %}
- {% trans %}Console: Add Ramble and notbob to console homepage{% endtrans %}
*Bug Fixes*
- {% trans %}Fix replay attack: CVE-2023-36325{% endtrans %}
- {% trans %}Implement handling of multihomed routers in the netDb{% endtrans %}
- {% trans %}Fully copy new leaseSets when a leaseSet recievedAsPublished overwrites a leaseSet recievedAsReply{% endtrans %}
Full list of fixed bugs: http://git.idk.i2p/i2p-hackers/i2p.i2p/-/issues?scope=all&state=closed&milestone_title=2.3.0

View File

@ -0,0 +1,45 @@
{% trans -%}
=======================================
Easy-Install for Windows 2.3.0 Released
=======================================
{%- endtrans %}
.. meta::
:author: idk
:date: 2023-07-10
:category: release
:excerpt: {% trans %}Easy-Install for Windows 2.3.0 Released{% endtrans %}
{% trans -%}
The I2P Easy-Install bundle for Windows version 2.3.0 has now been released.
As usual, this release includes an updated version of the I2P router.
This extends to security issues which affect people hosting services on the network.
{%- endtrans %}
{% trans -%}
This will be the last release of the Easy-Install bundle which will be incompatible with the I2P Desktop GUI.
It has been updated to include new versions of all included webextensions.
A longstanding bug in I2P in Private Browsing which makes it incompatible with custom themes has been fixed.
Users are still advised to *not* install custom themes.
Snark tabs are not automatically pinned to the top of the tab order in Firefox.
Except for using alternate cookieStores, Snark tabs now behave as normal browser tabs.
{%- endtrans %}
{% trans -%}
**Unfortunately, this release is still an unsigned `.exe` installer.**
Please verify the checksum of the installer before using it.
**The updates, on the other hand** are signed by my I2P signing keys and therefore safe.
{%- endtrans %}
{% trans -%}
This release was compiled with OpenJDK 20.
It uses i2p.plugins.firefox version 1.1.0 as a library for launching the browser.
It uses i2p.i2p version 2.3.0 as an I2P router, and to provide applications.
As always it is recommended that you update to the latest version of the I2P router at your earliest convenient opportunity.
{%- endtrans %}
- `Easy-Install Bundle Source <http://git.idk.i2p/i2p-hackers/i2p.firefox/-/tree/i2p-firefox-2.3.0>`_
- `Router Source <http://git.idk.i2p/i2p-hackers/i2p.i2p/-/tree/i2p-2.3.0>`_
- `Profile Manager Source <http://git.idk.i2p/i2p-hackers/i2p.plugins.firefox/-/tree/1.1.0>`_

View File

@ -0,0 +1,40 @@
{% trans -%}
=================
I2P Release 2.2.1
=================
{%- endtrans %}
.. meta::
:author: idk
:date: 2023-04-12
:category: release
:excerpt: {% trans %}Packaging Fixes{% endtrans %}
{% trans -%}
After the I2P 2.2.0 release, which was moved forward to accelerate mitigations for the DDOS attacks, we learned about a few developing issues which made it necessary to build and release new packages.
This release fixes an issue within Ubuntu Lunar and Debian Sid where the router console was inaccessible using an updated version of the jakarta package.
Docker packages were not reading arguments correctly, resulting in inaccessible configuration files.
This issue has also been resolved.
The docker container is now also compatible with Podman.
{%- endtrans %}
{% trans -%}
This release syncs translations with transifex and updates the GeoIP database.
{%- endtrans %}
{% trans -%}
As usual, we recommend that you update to this release.
The best way to maintain security and help the network is to run the latest release.
{%- endtrans %}
**DETAILS**
*Changes*
- {% trans %}Fix missing Java options in docker/rootfs/startapp.sh{% endtrans %}
- {% trans %}Detect when running in Podman instead of regular Docker{% endtrans %}
- {% trans %}Update Tor Browser User-Agent String{% endtrans %}
- {% trans %}Update local GeoIP database{% endtrans %}
- {% trans %}Remove invalid signing keys from old installs{% endtrans %}
- {% trans %}Update Tomcat version in Ubuntu Lunar and Debian Sid{% endtrans %}
Full list of fixed bugs: http://git.idk.i2p/i2p-hackers/i2p.i2p/-/issues?scope=all&state=closed&milestone_title=2.2.1

View File

@ -1,3 +1,4 @@
from __future__ import absolute_import
import codecs
import datetime
from docutils.core import publish_parts
@ -140,6 +141,8 @@ def render_blog_post(slug):
with codecs.open(path, encoding='utf-8') as fd:
content = fd.read()
#print(content)
# render the post with Jinja2 to handle URLs etc.
rendered_content = render_template_string(content)

View File

@ -1,3 +1,4 @@
from __future__ import absolute_import
from flask import abort, g, redirect, render_template, request, url_for
from werkzeug.contrib.atom import AtomFeed

View File

@ -1,3 +1,4 @@
from __future__ import absolute_import
from flask import redirect, render_template, request
from i2p2www import CURRENT_I2P_VERSION, MIRRORS_FILE

View File

@ -1,3 +1,4 @@
from __future__ import absolute_import
from flask import abort, redirect, render_template, request
try:
import json
@ -27,13 +28,13 @@ DEFAULT_MIRROR = {
# "country": "no",
#}
DEFAULT_MIRROR= {
'net': 'clearnet',
'protocol': 'https',
'domain': 'download.i2p2.no',
'org': 'sigterm.no',
'country': 'no',
}
#DEFAULT_MIRROR= {
# 'net': 'clearnet',
# 'protocol': 'https',
# 'domain': 'download.i2p2.no',
# 'org': 'sigterm.no',
# 'country': 'no',
#}
DEFAULT_I2P_MIRROR = {
'net': 'i2p',
@ -90,6 +91,10 @@ def downloads_debian():
def downloads_windows():
return render_template('downloads/windows.html')
# MacOS-specific page
def downloads_macos():
return render_template('downloads/macos.html')
# AIO-Windows-specific page
def downloads_easyinstall():
# TODO: read mirror list or list of available files
@ -162,13 +167,13 @@ def downloads_redirect(version, net, protocol, domain, file):
}
if not protocol:
protocol = mirrors.keys()[randint(0, len(mirrors) - 1)]
protocol = list(mirrors.keys())[randint(0, len(mirrors) - 1)]
if not protocol in mirrors:
abort(404)
mirrors=mirrors[protocol]
if not domain:
domain = mirrors.keys()[randint(0, len(mirrors) - 1)]
domain = list(mirrors.keys())[randint(0, len(mirrors) - 1)]
if not domain in mirrors:
abort(404)
return render_template('downloads/redirect.html',

View File

@ -1,5 +1,7 @@
# -*- coding: utf8 -*-
from __future__ import absolute_import
from __future__ import print_function
import os
import sys
from jinja2 import nodes
@ -9,6 +11,7 @@ from pygments import highlight
from pygments.lexers import get_lexer_by_name, guess_lexer
from pygments.formatters import HtmlFormatter
from pygments.util import ClassNotFound
import six
try:
import ctags
@ -29,8 +32,8 @@ def we_are_frozen():
def module_path():
encoding = sys.getfilesystemencoding()
if we_are_frozen():
return os.path.dirname(unicode(sys.executable, encoding))
return os.path.dirname(unicode(__file__, encoding))
return os.path.dirname(six.text_type(sys.executable, encoding))
return os.path.dirname(six.text_type(__file__, encoding))
class HighlightExtension(Extension):

View File

@ -9,14 +9,21 @@
:license: BSD, see LICENSE for details.
"""
from __future__ import absolute_import
from __future__ import print_function
import os
import sys
import os.path
import StringIO
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
from pygments.formatter import Formatter
from pygments.token import Token, Text, STANDARD_TYPES
from pygments.util import get_bool_opt, get_int_opt, get_list_opt, bytes
from pygments.util import get_bool_opt, get_int_opt, get_list_opt#, bytes
import six
from six.moves import range
try:
import ctags
@ -459,7 +466,7 @@ class I2PHtmlFormatter(Formatter):
"""
if arg is None:
arg = ('cssclass' in self.options and '.'+self.cssclass or '')
if isinstance(arg, basestring):
if isinstance(arg, six.string_types):
args = [arg]
else:
args = list(arg)
@ -473,7 +480,7 @@ class I2PHtmlFormatter(Formatter):
return ', '.join(tmp)
styles = [(level, ttype, cls, style)
for cls, (style, ttype, level) in self.class2style.iteritems()
for cls, (style, ttype, level) in six.iteritems(self.class2style)
if cls and style]
styles.sort()
lines = ['%s { %s } /* %s */' % (prefix(cls), style, repr(ttype)[6:])
@ -511,8 +518,8 @@ class I2PHtmlFormatter(Formatter):
cssfilename = os.path.join(os.path.dirname(filename),
self.cssfile)
except AttributeError:
print >>sys.stderr, 'Note: Cannot determine output file name, ' \
'using current directory as base for the CSS file name'
print('Note: Cannot determine output file name, ' \
'using current directory as base for the CSS file name', file=sys.stderr)
cssfilename = self.cssfile
# write CSS file only if noclobber_cssfile isn't given as an option.
try:
@ -521,7 +528,7 @@ class I2PHtmlFormatter(Formatter):
cf.write(CSSFILE_TEMPLATE %
{'styledefs': self.get_style_defs('body')})
cf.close()
except IOError, err:
except IOError as err:
err.strerror = 'Error writing CSS file: ' + err.strerror
raise

View File

@ -1,5 +1,7 @@
from __future__ import absolute_import
from math import ceil
from werkzeug import import_string, cached_property
from werkzeug.utils import cached_property, import_string
from six.moves import range
########################
# General helper methods
@ -56,7 +58,7 @@ class Pagination(object):
def iter_pages(self, left_edge=2, left_current=2,
right_current=5, right_edge=2):
last = 0
for num in xrange(1, self.pages + 1):
for num in range(1, self.pages + 1):
if num <= left_edge or \
(num > self.page - left_current - 1 and \
num < self.page + right_current) or \

View File

@ -1,3 +1,4 @@
from __future__ import absolute_import
from flask import g, redirect, url_for
@ -23,6 +24,7 @@ LEGACY_FUNCTIONS_MAP={
'easyinstall': {'function': 'downloads_easyinstall', 'params': {}},
'nsis': {'function': 'downloads_easyinstall', 'params': {}},
'windows': {'function': 'downloads_windows', 'params': {}},
'macos': {'function': 'downloads_macos', 'params': {}},
'download': {'function': 'downloads_list', 'params': {}},
'installation': {'function': 'downloads_list', 'params': {}},
'meetings': {'function': 'meetings_index', 'params': {}},
@ -196,7 +198,7 @@ LEGACY_RELEASES_MAP={
'0.9.8': (2013, 9, 30),
'0.9.8.1': (2013, 10, 2),
'0.9.9': (2013, 12, 7),
'0.9.10': (2014, 01, 22),
'0.9.10': (2014, 0o1, 22),
}
def legacy_show(f):
@ -231,5 +233,6 @@ def legacy_release(version):
else:
return legacy_show('release-%s' % version)
def legacy_blog(lang, (year, month, day), title):
def legacy_blog(lang, xxx_todo_changeme, title):
(year, month, day) = xxx_todo_changeme
return redirect(url_for('blog_post', lang=lang, slug=('%d/%02d/%02d/%s' % (year, month, day, title))), 301)

View File

@ -1,3 +1,4 @@
from __future__ import absolute_import
from pygments.lexer import RegexLexer, bygroups
from pygments.token import *

View File

@ -1,3 +1,5 @@
from __future__ import absolute_import
from __future__ import print_function
import codecs
import datetime
from docutils.core import publish_parts
@ -54,7 +56,7 @@ def get_meetings_ids(num=0):
# iterate over all files
for f in v[2]:
# ignore all non-.rst files
print("Meeting file found", f)
print(("Meeting file found", f))
if not f.endswith('.rst'):
continue
try:

View File

@ -0,0 +1,153 @@
(08:01:07 PM) eyedeekay: Hi everybody, sorry I'm late, got disconnected right before the meeting
(08:01:59 PM) eyedeekay: 1. Hi
(08:01:59 PM) eyedeekay: 2. 2.1.0 Status Report
(08:01:59 PM) eyedeekay: 3. 2.2.0 Development Status
(08:01:59 PM) eyedeekay: 4. Congestion Throttling
(08:01:59 PM) eyedeekay: 5. Hypothetical Traffic Management ( Flood of Tor Users)
(08:01:59 PM) eyedeekay: 6. Stickers for translators
(08:01:59 PM) eyedeekay: zzz where do you want to do your report about the DOS? 2 or own topic?
(08:02:45 PM) zzz: let's call it 3b)
(08:02:46 PM) zzz: or 2b)
(08:02:59 PM) eyedeekay: OK 2b then
(08:03:00 PM) zzz: your choice
(08:03:53 PM) eyedeekay: 1. Hi who all is here today besides me and zzz?
(08:03:58 PM) zzz: hi
(08:04:09 PM) not_bob: Here
(08:04:18 PM) echelonMAC: here
(08:04:18 PM) obscuratus: Hi
(08:04:29 PM) eyedeekay: Great turnout, thanks everybody
(08:04:30 PM) echelonMAC: on replacement system.
(08:05:06 PM) eyedeekay: 2. 2.1.0 Status Report
(08:05:15 PM) zzz: irc is laggier than usual so please allow a little extra time for responses
(08:05:38 PM) eyedeekay: Thanks zzz I will keep that in mind
(08:09:02 PM) eyedeekay: Where to even start... my focus has been on Android UX issues in particular fixing up things I was doing wrong when initializing the app
(08:09:04 PM) eyedeekay: Android will get a point release on that account
(08:10:00 PM) eyedeekay: The topic I'm sure is on everybody's mind right now is the network being under attack which has shifted everybody's attention
(08:10:05 PM) eyedeekay: And that is topic 2b
(08:10:59 PM) eyedeekay: Shoot I mixed up the topics, scratch that, that was supposed to go to 3. sorry, long week, lot going on
(08:12:03 PM) eyedeekay: zzz would you do me a favor to take 2? I think I am ill-equipped to present on everything which is going on
(08:12:28 PM) zzz: sure
(08:12:29 PM) zzz: but before I do
(08:12:56 PM) zzz: do you and echelonMAC have a 2.1.0 mac easy-install bundle progress report?
(08:13:17 PM) eyedeekay: Oh yes I can do that
(08:14:38 PM) eyedeekay: So, we've been closing in on issues, and right now echelonMAC and have different hypothesis on what's going on which we're both pursuing
(08:14:38 PM) eyedeekay: My hypothesis is that this all stems from a stale workaround for a bug in Java 14
(08:15:08 PM) eyedeekay: Where jpackage is supposed to sign the dylib files that are packed into a disk image(dmg) but which are in fact left unsigned
(08:15:33 PM) echelonMAC: in short: eyedeekaym did redo the signing script, I can buiodl and sign, but still wrong signing for apple
(08:15:55 PM) eyedeekay: zab worked around this by creating the .app directory and signing the stuff inside it then using jpackage only for the final packaging step
(08:16:35 PM) eyedeekay: so when we upgraded Java's we started signing everything twice, and we no longer needed to do that signing step manually
(08:16:47 PM) eyedeekay: echelonMAC correct me if I'm wrong but you think you have the wrong sort of keys?
(08:17:10 PM) echelonMAC: maybe, maybe not, unsure about that
(08:17:18 PM) echelonMAC: at least the logs showing this error
(08:17:53 PM) zzz: my question was higher level, what's the ETA, is 2.1.0 still a target or has that been abandoned and you're hoping for 2.2.0, or what?
(08:18:15 PM) echelonMAC: 2.1.0 is still the target, but currently no ETA
(08:18:39 PM) echelonMAC: I can build nearly instant, but digging deeper is currently out of time...
(08:18:48 PM) eyedeekay: I still want to cut a release of 2.1.0 as soon as we know we can pass notarization, IMO once we can pass it once we should be able to do it predictably
(08:18:59 PM) zzz: eyedeekay more or less committed to early april 2.2.0 in his blog post, you're not endorsing that ETA echelonMAC ?
(08:19:49 PM) echelonMAC: I am completely helpless and cant predict a ETA, as I do not full yunderstand signing and building yet.
(08:20:12 PM) echelonMAC: more or less, I do follow scripts blindly, if idk can fix the signage, the notarization is a 5 min job.
(08:20:24 PM) echelonMAC: IF the sign does work as appple expect it
(08:20:26 PM) zzz: ok then I recommend an edit of the blog post eyedeekay, let's not promise things we can't deliver on
(08:20:33 PM) eyedeekay: Will do
(08:21:19 PM) zzz: ok thanks you ready for my part of 2) ?
(08:21:41 PM) eyedeekay: Yes please
(08:21:48 PM) zzz: great
(08:22:00 PM) zzz: last meeting was one week after the release, now we're 4 weeks out
(08:22:15 PM) zzz: my hope was that expl. build success would climb steadily
(08:22:35 PM) zzz: from the low-20% to low-30%, and then "pop" out of congestion, back to low 40s
(08:22:45 PM) zzz: only the first part happened
(08:25:20 PM) zzz: and then we swung back and forth between low 20s and low 30s
(08:26:56 PM) zzz: so, we have some theories, see 2b)
(08:26:56 PM) zzz: but I'm happy with the performance of 2.1.0 otherwise
(08:26:56 PM) zzz: not too many bug reports
(08:26:56 PM) zzz: I'll give an overview of what we are fixing in 2b) and 3)
(08:26:56 PM) zzz: about 50% of the network has updated to 2.1.0 or the i2pd equivalent
(08:26:56 PM) zzz: everybody please update if you haven't
(08:26:56 PM) zzz: that's all I have for 2a), but I'll pause for a minute for questions / comments before starting 2b)
(08:28:33 PM) zzz: ok, 2b) current network conditions
(08:28:33 PM) zzz: over the weekend started an unambiguous attack
(08:28:33 PM) zzz: lots of floodfill routers
(08:28:33 PM) zzz: for the most part, the network overall, and java routers, are handling it ok
(08:28:33 PM) zzz: I do have one report of routers crashing with OOM (out of memory)
(08:28:54 PM) zzz: I understand that i2pd routers are really struggling with very low tunnel build success rates
(08:29:06 PM) not_bob: My fleet is up to date.
(08:29:15 PM) zzz: the attack is starting / stopping / changing several times a day
(08:29:37 PM) zzz: so we're only about 60 hours in to understanding it and discussing countermeasures
(08:30:15 PM) zzz: remember the tunnel build problem (now much more likely to be classified as a different attack) started Dec. 19 and took us several weeks to understand and address
(08:30:27 PM) zzz: so it's early days
(08:30:36 PM) not_bob: I have one I2P+ router and it's done well to weather this. But, my i2pd routers not so much. I've seen as low as 3% tunnel build success. I'm currently sitting around 10% on those routers.
(08:31:17 PM) zzz: but this is a straightforward sybil / DHT attack, new to us but familiar to anybody doing peer-to-peer / DHT applications
(08:31:53 PM) zzz: far too early to say if it will require a release ahead of schedule (for java i2p) or if so when
(08:32:23 PM) zzz: EOT, I'll wait a couple minutes for discussion / comments / questions
(08:33:24 PM) eyedeekay: Should people who wind up OOM increase the RAM available to their router?
(08:36:18 PM) zzz: yeah, that's a straightforward mitigation
(08:36:18 PM) zzz: stop your router, edit wrapper.config, restart
(08:36:18 PM) zzz: I expect I'll have mitigations in dev builds in a few days
(08:36:18 PM) dr|z3d: ideally you want your min heap at around 256M and your max ram at 2-3 times that.
(08:36:18 PM) not_bob: I do not currently have any stock I2P routers running.
(08:36:18 PM) zzz: I want to repeat what I said above that the attacks are evolving rapidly, and we want to take our time to address the overall issues
(08:36:18 PM) zzz: not to focus too narrowly on the specifics
(08:37:36 PM) zzz: back to you eyedeekay if there's nothing else on 2b)
(08:38:06 PM) eyedeekay: thanks very much zzz. 3) 2.2.0 Development Status
(08:39:51 PM) eyedeekay: As I mistakenly stated before, my focus has been on Android UX issues in particular fixing up things I was doing wrong when initializing the app, pretty basic stuff all things considered but all of which was due for improvement
(08:39:57 PM) eyedeekay: or outright fixing
(08:40:49 PM) eyedeekay: Examples being fixes for subscriptions and custom ports when building tunnels which got in several user's way after a large increase in users with 2.10
(08:41:07 PM) dr|z3d: as an aside, and to shine some light on the size of the attack, we've got a user reporting ~30K banned routers. so it's non-trivial :)
(08:41:07 PM) dr|z3d: (that'll be shiver, who's here)
(08:42:36 PM) mark22k: I got 56005 banned peers.
(08:42:58 PM) eyedeekay: Holy moley. I have 11027 and I thought that was a lot
(08:43:08 PM) moristo: Is this the work of a nation state--the banned routers or any other noticable patten?
(08:43:50 PM) moristo: Spectrum internet was off yesetrday in FL and Italy the day before.
(08:43:54 PM) moristo: *yesterday.
(08:43:55 PM) zzz: let's get back to 3) please and table further attack discussion until after the meeting
(08:44:05 PM) echelonMAC: Banned Peers (57053)
(08:44:22 PM) moristo: oh, is there a meeting in progress? My bad.
(08:46:50 PM) zzz: eyedeekay, you still with us?
(08:47:11 PM) eyedeekay: yeah I'm here
(08:47:37 PM) zzz: you have more on 3) or is it my turn?
(08:47:37 PM) eyedeekay: started a long one:
(08:47:37 PM) eyedeekay: i2p.firefox(Easy-Install for Windows is also getting worked on, more of the work is being done by removal there, updates are getting simplified now that the old admin-style installs are all migrated to user-style installs
(08:47:37 PM) eyedeekay: portable USB install support is on the horizon for 2.2.0
(08:47:43 PM) eyedeekay: With updates
(08:48:21 PM) eyedeekay: Other issues and user-complaints I'm addressing or deciding how to address are on that issue tracker
(08:48:28 PM) eyedeekay: EOT for me
(08:48:47 PM) zzz: ok you saw the NPE issue in i2p.i2p right?
(08:49:10 PM) eyedeekay: Yes I did, hot on the trail
(08:49:21 PM) zzz: ok holler if you need help ofc
(08:49:24 PM) zzz: 3) for me:
(08:49:47 PM) zzz: I finished the peer selection refactor I've been working on since september, finally
(08:50:31 PM) zzz: I think I fixed the erroneous symmetric nat indications that were in 2.1.0, but need somebody with that problem to test and report
(08:50:59 PM) zzz: got a cool new i2psnark search box
(08:51:19 PM) zzz: almost done with "congestion caps" (proposal 162)
(08:51:31 PM) echelonMAC: :-)
(08:51:49 PM) zzz: and some more tweaks to refine our handling of tunnel build congestion
(08:52:18 PM) zzz: late last week, I thought I was pretty much done with 2.2.0 and could relax for two months until the release
(08:52:31 PM) zzz: so, unfortunately, now we have a lot more to do
(08:52:48 PM) zzz: that's the way it goes sometimes
(08:53:24 PM) not_bob: Thank you for that, a major quality of life improvement.
(08:53:24 PM) zzz: EOT, I'll wait a minute for discussion, then back to you eyedeekay
(08:53:37 PM) zzz: haha not_bob you're welcome
(08:55:00 PM) eyedeekay: Last call for 3?
(08:55:20 PM) eyedeekay: 4. Congestion Throttling - I think this was a tunnel_king topic, is tunnel_king here?
(08:55:42 PM) zzz: back to you eyedeekay
(08:57:39 PM) eyedeekay: 4. Congestion Throttling, 5. Hypothetical Traffic Management ( Flood of Tor Users) - both introduced by tunnel_king, last call for tunnel_king
(08:59:01 PM) eyedeekay: OK last one, 6. Stickers for translators
(08:59:01 PM) eyedeekay: Specifically rules for people receiving stickers outside of the Americas
(08:59:58 PM) zzz: this was my topic, only because unresolved since last meeting
(09:00:28 PM) zzz: echelonMAC you have an answer?
(09:00:41 PM) echelonMAC: not en detail, but who wnats should receive a bunch of stickers if they sent their address
(09:01:04 PM) echelonMAC: aka sned a announcement in transifex and send out after receive of address
(09:01:19 PM) echelonMAC: but currently no new stickers arrivced here
(09:01:35 PM) eyedeekay: Tracking says the 10th
(09:01:55 PM) zzz: I'm awaiting echelonMAC to post the instructions on my forum, then I will copy/paste to transifex
(09:02:17 PM) echelonMAC: ok
(09:02:28 PM) zzz: that's where we've been for a month
(09:02:42 PM) zzz: thanks
(09:03:33 PM) eyedeekay: Anything else for 6 or for the meeting?
(09:03:36 PM) zzz: EOT on 6) for me, back to you eyedeekay
(09:04:32 PM) zzz: one closing word for the meeting: zzz.i2p the best place for news and weather, I'll post there when I know more than I do now
(09:04:32 PM) zzz: thanks
(09:04:55 PM) eyedeekay: Thanks very much for that zzz, and thanks everybody for coming to the meeting
(09:05:44 PM) eyedeekay: See you around IRC and same time next month
(09:08:55 PM) zzz: thanks eyedeekay
(09:08:55 PM) zzz: got thru it without disconnects

View File

@ -0,0 +1,14 @@
I2P dev meeting, February 07, 2023 @ 20:00 UTC
==============================================
Quick recap
-----------
* **Present:**
eyedeekay,
zzz,
not_bob,
echelonMAC,
obscuratus

View File

@ -1,3 +1,4 @@
from __future__ import absolute_import
import codecs
from flask import abort, render_template, request, safe_join, send_from_directory
import os.path

View File

@ -1,12 +1,12 @@
<p>{% trans -%} Your web browser will need to be configured in order to browse web sites on I2P and to utilize the outproxies available within I2P. Below are walkthroughs for some of the most popular browsers. {%- endtrans %}</p>
<p>{% trans -%} A web browser will need to be configured to access sites and services on the I2P network, and to utilize outproxies. Below are walkthroughs for some of the most popular browsers. {%- endtrans %}</p>
<h2>{{ _('Firefox Profile for Windows') }}</h2>
<p>{% trans profile='/firefox' -%} If you are using Windows, the recommended way of accessing I2P is using the
<p>{% trans profile='/firefox' -%} If you are using Windows, the recommended way of accessing the I2P network is using the
<a href='{{ profile }}'>Firefox profile</a>. {%- endtrans %}</p>
<p><strong>{% trans -%} If you used the Easy-Install bundle, the Firefox profile is included and you can skip this page. {%- endtrans %}</strong></p>
<p>{% trans -%} If you do not wish to use that profile or are not on Windows, you need to configure your browser yourself. Read below on how to that. {%- endtrans %}</p>
<p>{% trans -%} If you do not wish to use that profile or are not on Windows, you will need to configure a browser. {%- endtrans %}</p>
<h2>{{ _('How to configure your browser') }}</h2>
<h2>{{ _('How To Configure Your Browser') }}</h2>
<ul>
<li><a href="#firefox">Firefox</a></li>
@ -89,13 +89,13 @@ settings and your browser is set to use the I2P proxy.
<a name="TOS"></a>
<h3>{{ _('Outproxy Terms Of Service') }}</h3>
<p>{% trans -%}
I2P is not designed for creating proxies to the Internet.
Instead, it is meant to be used as an internal network.
The I2P network is a peer-to-peer overlay network.
Proxying to the clearnet is not part of its design or function with regards to its communication protecting network features.
{%- endtrans %}</p>
<p>{% trans -%}
<p><b>The I2P project itself does not run any proxies to the Internet.</b>
<p><b>The I2P Project itself does not run any proxies to the Internet.</b>
The I2P software includes a default outproxy: exit.stormycloud.i2p.
These are run by a volunteer. </p>
These are run by StormyCloud Inc. </p>
<a href="https://stormycloud.org"
target="_blank">https://stormycloud.org</a>
{%- endtrans %}</p>
@ -109,4 +109,4 @@ not allowed via the outproxies.
<p>{% trans -%}
<a href="https://www.torproject.org">Tor</a> provides a browser to use as an outproxy to the Internet.
{%- endtrans %}</p>
<!-- vim: set noai ff=unix nosi ft=html tw=79 et sw=4 ts=4 spell spelllang=en: -->
<!-- vim: set noai ff=unix nosi ft=html tw=79 et sw=4 ts=4 spell spelllang=en: -->

View File

@ -86,6 +86,15 @@ part of <a href="#Post-install_work">starting I2P</a> and configuring it for you
<h2 id="debian">{{ _('Instructions for Debian') }}</h2>
<p><b>WARNING:</b>
Our Debian repos <a href="https://deb.i2p2.de/">deb.i2p2.de</a> and
<a href="http://deb.i2p2.no/">deb.i2p2.no</a> are currently down, and probably will not be back soon.
Please follow <a href="https://i2pforum.net/viewtopic.php?p=2855">these instructions</a>
to use the Ubuntu PPA as a workaround.
We will announce any updates here and on <a href="https://i2pforum.net/">i2pforum.net</a>.
We apologize for the inconvenience.
</p>
<em>{% trans -%}Currently supported architectures{%- endtrans %}: amd64, i386, armhf, arm64, powerpc, ppc64el, s390x</em>
<p>{% trans -%}

View File

@ -29,7 +29,7 @@ services:
<h4 id="volumes">{% trans -%}Volumes{%- endtrans %}</h4>
<p>{% trans -%}The container requires a volume for the configuration data to be mounted. Optionally, you can mount a separate volume for torrent (“i2psnark”) downloads. See the example below.{%- endtrans %}</p>
<h4 id="memory-usage">{% trans -%}Memory usage{%- endtrans %}</h4>
<p>{% trans -%}By the default the image limits the memory available to the Java heap to 512MB. You can override that with the <code>JVM_XMX</code> environment variable.{%- endtrans %}</p>
<p>{% trans -%}By default the image limits the memory available to the Java heap to 512MB. You can override that with the <code>JVM_XMX</code> environment variable.{%- endtrans %}</p>
<h4 id="ports">{% trans -%}Ports{%- endtrans %}</h4>
<p>{% trans -%}There are several ports which are exposed by the image. You can choose which ones to publish depending on your specific needs.{%- endtrans %}</p>
<table>

View File

@ -60,7 +60,7 @@ special configuration. You don't even need to close existing Firefox windows.
{%- set name = 'Windows' -%}
{%- set icon = 'images/download/windows.png' -%}
{%- set filename = 'I2P-Easy-Install-Bundle-%s.exe' -%}
{%- set hash = '862de2f2e05cfc46c2f612656b93dd9c94b6bc7a034912d732dd0ade2ad477f6' -%}
{%- set hash = 'def95180e5783686f68dcf2958cfa693f17a91da53a97f8ae75c98529c4e23a8' -%}
{% call package_outer('windows', name, icon) %}
<div class = "file">

View File

@ -45,7 +45,7 @@ start an installer, "double-click" the downloaded .exe file.
{%- set name = 'Windows' -%}
{%- set icon = 'images/download/windows.png' -%}
{%- set filename = 'I2P-Easy-Install-Bundle-%s.exe' -%}
{%- set hash = '862de2f2e05cfc46c2f612656b93dd9c94b6bc7a034912d732dd0ade2ad477f6' -%}
{%- set hash = 'def95180e5783686f68dcf2958cfa693f17a91da53a97f8ae75c98529c4e23a8' -%}
{% call package_outer('windows', name, icon) %}
<div class = "file">

View File

@ -1,4 +1,4 @@
{% extends "global/layout.html" %} {%- from "downloads/macros" import package, package_outer with context -%} {% set release_signer = 'zzz' %} {% block title %}{{ _('Download') }}{% endblock %} {% block content_nav %}
{% extends "global/layout.html" %} {%- from "downloads/macros" import package, package_outer with context -%} {% set release_signer = 'idk' %} {% block title %}{{ _('Download') }}{% endblock %} {% block content_nav %}
<script type="text/javascript" src="/_static/site.js"></script>
<ul>
<li><a href="#windows">Windows</a></li>
@ -51,16 +51,17 @@ If you would like to try the latest experimental I2P projects, visit the <a href
</div>
{% endcall %}
<h5>{%- trans %}I2P Easy Install Bundle for Mac OS X{%- endtrans %}</h5>
{% call package_outer('mac', "Mac OS X", 'images/download/mac-osx.png') %}
<h3>{% trans %}I2P Easy Install Bundle for Mac OS X{% endtrans %}</h3>
<p>{% trans i2pversion=ver() -%}The I2P Easy Install Bundle for Mac OS X is packaged using OSX's standard ".dmg" package type, which allows it to use Apple's built-in tools to securely, reliably, and easily install the package. It does not require Java to be installed.
<h5>{%- trans %}I2P for Mac OS X{%- endtrans %}</h5>
{% call package('mac') %}
<p>{% trans i2pversion=ver() -%} I2P is available as a Java application for Mac OSX. It is distributed as a Java <code>.jar</code> installer and therefore MacOS will ask you for explicit permission to run the software.
{%- endtrans %}</p>
<div class="file">
<a class="default" href="{{ get_url('downloads_mac') }}">{% trans %}I2P Easy Install Bundle for Mac OS X{% endtrans %}</a>
<p></p>
<a class="default" href="{{ get_url('downloads_mac') }}">{% trans %}Here is a helpful guide to installing I2P for Mac OS using a separate Java installation and the classic installer.{% endtrans %}</a>
</div>
{% endcall %}
<h5>{%- trans %}I2P for Linux{%- endtrans %}</h5>
{% call package('unix') %}
<p>{% trans i2pversion=ver() -%} The most reliable way to launch the installer is from a terminal like this:

View File

@ -0,0 +1,176 @@
{% extends "global/layout.html" %}
{% block title %}Apple MacOS{% endblock %}
{% block accuratefor %}0.9.47{% endblock %}
{% block content %}
<h1>{{ _('Separately Installing I2P and its dependencies on MacOS(The Long Way)') }}</h1>
<p>{% trans -%}
This is a detailed, step-by-step guide to installing and configuring I2P, including all dependencies and setting up a browser, on a new MacOS system.
Many users will be able to skip steps if they already have Java 8 or Firefox installed.{%- endtrans %}</p>
<h2>{{ _('So what are we going to do here?') }}</h2>
<p>{% trans -%}We're going to finish four tasks. We are going to:{%- endtrans %}</p>
<ol>
<li><a href="#part-one-install-java">{% trans -%}Install Java{%- endtrans %}</a></li>
<li><a href="#part-two-install-i2p">{% trans -%}Install I2P{%- endtrans %}</a></li>
<li><a href="#part-three-configure-i2p-app">{% trans -%}Configure I2P App{%- endtrans %}</a></li>
<li><a href="#part-four-configure-i2p-bandwidth">{% trans -%}Configure I2P Bandwidth{%- endtrans %}</a></li>
</ol>
<h3 id="part-one-install-java">{{ _('Part One: Install Java') }}</h3>
<p>{% trans -%}
In order to use I2P, you will need a suitable Java environment.
This guide uses Oracle's Java 8 implementation.
Please install it by following the instructions below:
{%- endtrans %}</p>
<p>{% trans -%}If you already have Java installed, you may{%- endtrans %} <a href="#part-two-install-i2p">Skip This Step</a></p>
<ol>
<li>{% trans -%}Begin by downloading Java, for example, {%- endtrans %} <a href="https://java.com/en/download/">using this version from Oracle</a>.
<ul style="list-style-type: none;">
<li><img src="/_static/images/macos/0-jre.png" alt="You need Oracle Java for MacOS" title="" /></li>
<li><img src="/_static/images/macos/1-jre.png" alt="You need Oracle Java for MacOS" title="" /></li>
</ul></li>
<li>{% trans -%}Double-click the installer you just downloaded and allow the installer permission to proceed.{%- endtrans %}:
<ul style="list-style-type: none;">
<li><img src="/_static/images/macos/2-jre.png" alt="Give the installer permission to proceed" title="" /></li>
</ul></li>
<li>{% trans -%}Accept the License terms.{%- endtrans %}
<ul style="list-style-type: none;">
<li><img src="/_static/images/macos/3-jre.png" alt="Start installing Java" title="" /></li>
</ul></li>
<li>{% trans -%}Java will show you some information about what it is and where it runs while you wait for it to finish installing.{%- endtrans %}
<ul style="list-style-type: none;">
<li><img src="/_static/images/macos/4-jre.png" alt="Wait for the installer" title="" /></li>
</ul></li>
<li>{% trans -%}When Java is done installing, it will look like this.{%- endtrans %}
<ul style="list-style-type: none;">
<li><img src="/_static/images/macos/5-jre.png" alt="Step one complete" title="" /></li>
</ul></li>
</ol>
<h3 id="part-two-install-i2p">{{ _('Part Two: Download and Install I2P from a .jar file') }}</h3>
<ol>
<li>{% trans -%}Download I2P for Unix from{%- endtrans %} <a href="https://geti2p.net/en/download#unix">https://geti2p.net</a>.
<ul style="list-style-type: none;">
<li><img src="/_static/images/macos/0-i2p.png" alt="Download I2P" title="" /></li>
<li><img src="/_static/images/macos/1-i2p.png" alt="Select your Language" title="" /></li>
</ul></li>
<li>{% trans -%}
Because I2P is being installed from a .jar file, it cannot be signed by an Apple certificate.
You will need to allow it special permission to install.
Even though the installer is unsigned, the updates are signed end-to-end by I2P.
{%- endtrans %}
<ul style="list-style-type: none;">
<li><img src="/_static/images/macos/2-i2p.png" alt="Introduction" title="" /></li>
<li><img src="/_static/images/macos/3-i2p.png" alt="Exception" title="" /></li>
<li><img src="/_static/images/macos/4-i2p.png" alt="Profit" title="" /></li>
</ul></li>
<li>{% trans -%}Select a language you are familiar with.{%- endtrans %}
<ul style="list-style-type: none;">
<li><img src="/_static/images/macos/5-i2p.png" alt="Select Components" title="" /></li>
</ul></li>
<li>{% trans -%}
Now the installer is ready to start.
Click next to advance.
{%- endtrans %}
<ul style="list-style-type: none;">
<li><img src="/_static/images/macos/6-i2p.png" alt="Start installing" title="" /></li>
</ul></li>
<li>{% trans -%}
Accept the license.
I2P is Free Software, mostly in the public domain with limited use of GPL2, Creative Commons, and other Free and Open-Source Licenses.
{%- endtrans %}
<ul style="list-style-type: none;">
<li><img src="/_static/images/macos/7-i2p.png" alt="Accept the License Agreement(or mostly lack thereof)" title="" /></li>
</ul></li>
<li>{% trans -%}
Install the I2P router and base config.
It is recommended that you keep the install directory the default.
{%- endtrans %}
<ul style="list-style-type: none;">
<li><img src="/_static/images/macos/8-i2p.png" alt="Install the files" title="" /></li>
</ul></li>
<li>{% trans -%}
I2P is now installed!
The remaining installer pages explain some aspects of running I2P on OSX.
{%- endtrans %}
<ul style="list-style-type: none;">
<li><img src="/_static/images/macos/9-i2p.png" alt="Finish it up" title="" /></li>
<li><img src="/_static/images/macos/10-i2p.png" alt="Finish it up" title="" /></li>
<li><img src="/_static/images/macos/11-i2p.png" alt="Finish it up" title="" /></li>
</ul></li>
</ol>
<h3 id="part-three-configure-i2p-app">{{ _('Part Three: Configure I2P App') }}</h3>
<ol>
<li>{% trans -%}
For convenience, you may want to create a shortcut to launch the I2P router.
Find the "i2p" directory in the "Applications" directory using Finder.
{%- endtrans %}
<ul style="list-style-type: none;">
<li><img src="/_static/images/macos/0-conf.png" alt="Open the Applications dir" title="" /></li>
</ul></li>
<li>{% trans -%}Open the folder and find the Start Router Icon shown.{%- endtrans %}
<ul style="list-style-type: none;">
<li><img src="/_static/images/macos/1-conf.png" alt="Find the launcher" title="" /></li>
</ul></li>
<li>{% trans -%}Click the icon to start the I2P router - it will show up in your dock as shown and you can choose too keep it there.{%- endtrans %}
<ul style="list-style-type: none;">
<li><img src="/_static/images/macos/2-conf.png" alt="Add it to the launch bar" title="" /></li>
</ul></li>
</ol>
<h3 id="part-four-configure-i2p-bandwidth">{{ _('Part Four: Configure I2P Bandwidth') }}</h3>
<ol>
<li>{% trans -%}
When you visit the I2P router console for the first time, it will automatically direct you to the configuration wizard.
Start by selecting a language for the I2P interface.
{%- endtrans %}
<ul style="list-style-type: none;">
<li><img src="/_static/images/macos/0-wiz.png" alt="Start the bandwidth wizard" title="" /></li>
</ul></li>
<li>{% trans -%}Next, pick either a dark or light theme.{%- endtrans %}
<ul style="list-style-type: none;">
<li><img src="/_static/images/macos/1-wiz.png" alt="Let the participant know what the bandwidth test entails" title="" /></li>
</ul></li>
<li>{% trans -%}
The next step is the bandwidth test.
The bandwidth test takes a minute to run completely.
During the bandwidth test, we'll need to connect to the external M-Lab Service, which makes a direct connection to a remote server(Operated by Measurement Lab) to measure your internet speed.
{%- endtrans %}
<ul style="list-style-type: none;">
<li><img src="/_static/images/macos/2-wiz.png" alt="Run the bandwidth test" title="" /></li>
<li><img src="/_static/images/macos/3-wiz.png" alt="Start the bandwidth wizard" title="" /></li>
</ul></li>
<li>{% trans -%}
Confirm the bandwidth measurement and adjust your share percentage.
{%- endtrans %}
<ul style="list-style-type: none;">
<li><img src="/_static/images/macos/4-wiz.png" alt="Let the participant know what the bandwidth test entails" title="" /></li>
</ul></li>
<li>{% trans -%}Confirm your bandwidth settings and adjust how much of your bandwidth you wish to share.{%- endtrans %}
<ul style="list-style-type: none;">
<li><img src="/_static/images/macos/5-wiz.png" alt="Run the bandwidth test" title="" /></li>
</ul></li>
<li>{% trans -%}You're finished! I2P is now configured.{%- endtrans %}
<ul style="list-style-type: none;">
<li><img src="/_static/images/macos/6-wiz.png" alt="Run the bandwidth test" title="" /></li>
</ul></li>
</ol>
<p>{% trans -%}If you want to re-run the welcome wizard after completing it, you can visit the page
on{%- endtrans %} <a href="http://localhost:7657/welcome">your router console</a>.</p>
<p>{% trans -%}That's it! You're now ready to use I2P. You can browse I2P Sites, download files, host services,
e-mail and chat anonymously. Visit the <a href="https://localhost:7657/home">router console homepage</a> to
get started.{%- endtrans %}</p>
{% endblock %}

View File

@ -1,16 +1,16 @@
{% set i2pinstall_windows_hash = '88e0d49090341f5bfa30299c3fa549c365da57a074ef694cf8201666687e583a' %}
{% set i2pinstall_jar_hash = '153c7988e7a9f0c2affd1e001d554e2519dd439c08bd7c024643b749db1308c1' %}
{% set i2psource_hash = '83098c1277204c5569284b32b37ef137656b27bfe15ef903eca2da7c269288d1' %}
{% set i2pupdate_hash = '54cf3f146f3a630fc2486f79f24c9cfc59d4c9974df0c4479251624fa7bc12a1' %}
{% set i2p_android_hash = '126cc7569bf22f3fe4c629cc6e3098669eddd8dad3332ec11c89ec8689e966ad' %}
{% set i2pinstall_windows_hash = '2081f8415013c80daa6b69b6f16f2ebf10aa20ee3cace20936e0268b2e816a3f' %}
{% set i2pinstall_jar_hash = '977ebce33001345731de6fe0b623f59a867de6fa6a6c46d8ad686e306310b28d' %}
{% set i2psource_hash = 'a0a8fb08e9c72eaef22f155b9c9aa0ea90fb331d2bbcf76f82649f0b9efe5f5b' %}
{% set i2pupdate_hash = '59b569dc17fad0e30e246048a3c275e403b308024eb88fda29ae83294bdbe8e6' %}
{% set i2p_android_hash = '272acf543c4489dc3775c07c42eb91710b4ed377c78aff605e3d44e73fad5110' %}
{% set i2p_macnative_hash = '18cb22cfcc3cbe0cec150e89a394d1a35703cb508ed627ef48084b7ba7c90dde' %}
{% set i2p_windows_subver = '' %}
{% set i2p_macosx_launcher_version = '1.9.0' %}
{% set i2p_android_version = '2.1.0' %}
{% set i2p_android_version = '2.2.1' %}
{% set i2p_android_version_kytv = '0.9.22' %}
{% set i2p_android_version_fdroid = '2.0.1' %}
{% set i2p_android_version_fdroid = '2.2.1' %}
{% macro package_outer(type, name, icon) -%}
@ -48,7 +48,7 @@
{%- set signame = 'i2pupdate_%s.zip.sig' -%}
{%- set hash = i2pupdate_hash -%}
{%- elif type == 'macnative' -%}
{%- set name = _('Mac OS X Native (Beta)') -%}
{%- set name = _('Mac OS Native (Beta)') -%}
{%- set icon = 'images/download/mac-osx.png' -%}
{%- set filename = 'I2PMacLauncher-%s-beta-'+i2p_macosx_launcher_version+'.dmg' -%}
{%- set signame = 'I2PMacLauncher-%s-beta-'+i2p_macosx_launcher_version+'.dmg.sig' -%}
@ -60,8 +60,11 @@
{%- set hash = 'geti2p/i2p@sha256:e622209388edc49b99d8216baa731b1f54a0634c87cd47c1739f2188891daf3a' -%}
{%- else -%}
{%- if type == 'mac' -%}
{%- set name = 'Mac OS X' -%}
{%- set name = 'Mac OS' -%}
{%- set icon = 'images/download/mac-osx.png' -%}
{%- set filename = 'i2pinstall_%s.jar' -%}
{%- set signame = 'i2pinstall_%s.jar.sig' -%}
{%- set hash = i2pinstall_jar_hash -%}
{%- elif type == 'unix' -%}
{%- set name = 'Linux / BSD / Solaris' -%}
{%- set icon = 'images/download/freebsd-tux.png' -%}

View File

@ -131,7 +131,11 @@ and configure Firefox for I2P.{%- endtrans %} </p>
<h4>{{ _('Install the I2P Firefox Profile') }}</h4>
<ol>
<li>{% trans -%}Download the Firefox Profile Bundle from the I2P Web Site.{%- endtrans %}
<li>{% trans -%}
Download the Firefox Profile Bundle from the I2P Web Site.
The I2P Firefox Profile has been replaced by the Easy Install Bundle for Windows.
The Easy-Installl can still be used as a profile manager for an Un-Bundled I2P router installed via this procedure.
{%- endtrans %}
<ul style="list-style-type: none;">
<li><img src="/_static/images/download/windows/profile.png" alt="Grab the Firefox Profile" title="" /></li>
</ul></li>

View File

@ -108,7 +108,7 @@
school = {University of Amsterdam},
year = {2018},
month = {June},
www_pdf_url = {https://delaat.net/rp/2017-2018/p97/report.pdf},
www_pdf_url = {https://docslib.org/doc/12313748/blockchain-based-sybil-attack-mitigation-a-case-study-of-the-i2p},
www_section = comm,
}
@ -239,7 +239,7 @@ services, namely Tor, JonDonym, and I2P as case studies; and
(iii) present a mechanism to evaluate anonymity services based
on our factors and measure the level of anonymity.}},
keywords = {Anonymity Factors ; Metrics ; Tor ; I2P ; JonDonym},
www_pdf_url = {https://www.cs.dal.ca/sites/default/files/technical_reports/CS-2017-01.pdf},
www_pdf_url = {https://cdn.dal.ca/content/dam/dalhousie/pdf/faculty/computerscience/technical-reports/CS-2017-01.pdf},
www_section = comm,
}
@ -249,7 +249,7 @@ on our factors and measure the level of anonymity.}},
booktitle = {Proceedings of the 38th IEEE Symposium on Security and Privacy Workshops, 2nd International Workshop on Traffic Measurements for Cybersecurity (WTMC 2017)},
year = {2017},
month = {May},
www_pdf_url = {https://www.cs.dal.ca/sites/default/files/technical_reports/cs-2017-04.pdf},
www_pdf_url = {https://www.researchgate.net/publication/321999503_Effects_of_Shared_Bandwidth_on_Anonymity_of_the_I2P_Network_Users},
www_section = traffic,
}
@ -277,7 +277,7 @@ that presents I2P Observer, a software to collect information about I2P and one
possibilities on I2P.}},
note = {Title : Analysis of the I2P Network. School: Bern University of Applied Sciences - Department of Computer Science},
www_section = traffic,
www_pdf_url = {https://jenix.net/i2p-observer/Analysis_of_the_I2P_Network-Bachelor_Thesis.pdf},
www_pdf_url = {https://docslib.org/doc/6144412/analysis-of-the-i2p-network-information-gathering-and-attack-evaluations},
}
@inproceedings{jeong2016,
@ -301,7 +301,7 @@ that a large number of queries are observed and outlining
various potential directions of addressing such leakage.}},
keywords = {I2P, DNS, privacy, security, network analysis},
www_section = traffic,
www_pdf_url = {https://www.cse.buffalo.edu/~mohaisen/doc/16-sigcomm.pdf},
www_pdf_url = {https://www.cs.ucf.edu/~mohaisen/doc/sigcomm16.pdf},
pages = {557--558},
}
@ -567,7 +567,7 @@ networks},
howpublished = {Seminar, Humboldt University of Berlin},
year = {2011},
month = {November},
www_pdf_url = {http://userpage.fu-berlin.de/~semu/docs/2011_seminar_ehlert_i2p.pdf},
www_pdf_url = {https://www.freehaven.net/anonbib/cache/ehlert2011:usability-comparison-i2p-tor.pdf},
www_section = comm,
}
@ -651,7 +651,7 @@ networks},
abstract={{Today, to be monitored while surfing the web seems to be a natural act and thus tools and applications to achieve online anonymity are more important than ever. The usability of such a tool plays not only a prominent role for each single user; in the area of anonymization networks it usually holds that the protection for every single user is higher, the more users participate. Hence, usability is of great importance, since bad usability decreases the number of potential users. In this paper we examine the usability of four software implementations for anonymous communication techniques especially with regards to the installation procedure. The usability is evaluated with the help of cognitive walk-throughs. We also inspect the quality of service of these implementations by means of a performance test.}},
keywords={Internet;security of data;anonymity networks;anonymization networks;anonymous communication techniques;cognitive walk-throughs;installation;quality of service;software implementations;usability inspection;Communication system security;Inspection;Monitoring;Operating systems;Privacy;Quality management;Quality of service;System testing;Technology management;Usability;AN.ON;Anonymity;HCI;JAP;JonDo;JondoNym;Tor;Usability},
doi={10.1109/CONGRESS.2009.38},
www_pdf_url = {http://pimenidis.org/research/papers/usability-inspection.pdf},
www_pdf_url = {https://www.researchgate.net/publication/224084986_Usability_Inspection_of_Anonymity_Networks},
www_section = comm,
}

View File

@ -1,50 +1,86 @@
{% extends "global/layout.html" %}
{% block title %}{{ _('Intro') }}{% endblock %}
{% block content %}
<h1>{{ _('The Invisible Internet Project') }} (I2P)</h1>
<h2>What is I2P?</h2>
<p>{% trans %}The Invisible Internet Project (I2P) is a fully encrypted private network layer that has been developed with privacy and security by design in order to provide protection for your activity,
location and your identity. The software ships with a router that connects you to the network and applications for sharing, communicating and building. {%- endtrans %}</p>
<h1>{{ _('The Invisible Internet Project') }} (I2P)</h1>
<h3>{% trans -%}I2P Cares About Privacy{%- endtrans %}</h3>
<p>{% trans %}
The Invisible Internet Project began in 2002.
The vision for the project, as described in an interview with Lance James was for the I2P Network "to deliver full anonymity, privacy, and security at the highest level possible. Decentralized and peer to peer Internet means no more worrying about your ISP controlling your traffic. This will allow (people) to do seamless activities and change the way we look at security and even the Internet, utilizing public key cryptography, IP steganography, and message authentication. The Internet that should have been, will be soon."
Since then I2P has evolved to specify and implement a complete suite of network protocols capable of delivering a high level of privacy, security, and authentication to a variety of applications.
{%- endtrans %}</p>
<p>{% trans %}I2P hides the server from the user and the user from the server. All I2P traffic is internal to the I2P network. Traffic inside I2P does not interact with the Internet directly. It is a layer on top of the Internet. It uses encrypted unidirectional tunnels between you and your peers. No one can see where traffic is coming from, where it is going, or what the contents are. Additionally I2P offers resistance to pattern recognition and blocking by censors. Because the network relies on peers to route traffic, location blocking is also reduced.
{%- endtrans %}</p>
<h3>{% trans -%}The I2P network{%- endtrans %}</h3>
<p>{% trans %}
The I2P network is a fully encrypted peer-to-peer overlay network.
An observer cannot see a message's contents, source, or destination.
No one can see where traffic is coming from, where it is going, or what the contents are.
Additionally I2P transports offer resistance to recognition and blocking by censors.
Because the network relies on peers to route traffic, location-based blocking is a challenge that grows with the network.
Every router in the network participates in making the network anonymous.
Except in cases where it would be unsafe, everyone participates in sending and receiving network traffic.
{%- endtrans %}</p>
<h3>{% trans -%}How to Connect to the I2P Network{%- endtrans %}</h3>
<p>{% trans %}The Invisible Internet Project provides software to download that connects you to the network. In addition to the network privacy benefits, I2P provides an application layer that allows people to use and create familiar apps for daily use. I2P provides its own unique DNS so that you can self host or mirror content on the network. You can create and own your own platform that you can add to the I2P directory or only invite your friends. The I2P network functions the same way the Internet does. When you download the I2P software, it includes everything you need to connect, share, and create privately.{%- endtrans %}</p>
<p>{% trans %}
The core software (Java) includes a router that introduces and maintains a connection with the network.
It also provides applications and configuration options to personalize your experience and workflow.
{%- endtrans %}</p>
<h3>{% trans -%}What Can I Do On The I2P Network?{%- endtrans %}</h3>
<p>{% trans %}
The network provides an application layer for services, applications, and network managment.
The network also has its own unique DNS that allows self hosting and mirroring of content from the Internet (Clearnet).
The I2P network functions the same way the Internet does.
The Java software includes a BitTorrent client, and email as well as a static website template.
Other applications can easily be added to your router console.
{%- endtrans %}</p>
<h3>{% trans -%}An Overview of the Network{%- endtrans %}</h3>
<p>{% trans %}I2P uses cryptography to achieve a variety of properties for the tunnels it builds and the communications it transports. I2P tunnels use transports, NTCP2 and SSU, to hide the nature of the traffic being transported over it. Connections are encrypted from router-to-router, and from client-to-client(end-to-end). Forward-secrecy is provided for all connections. Because I2P is cryptographically addressed, I2P addresses are self-authenticating and only belong to the user who generated them.
<p>{% trans %}
I2P uses cryptography to achieve a variety of properties for the tunnels it builds and the communications it transports.
I2P tunnels use transports, NTCP2 and SSU2, to conceal the traffic being transported over it.
Connections are encrypted from router-to-router, and from client-to-client(end-to-end).
Forward-secrecy is provided for all connections.
Because I2P is cryptographically addressed, I2P network addresses are self-authenticating and only belong to the user who generated them.
{%- endtrans %}</p>
<p>{% trans %}I2P is a secure and traffic protecting Internet-like layer. The network is made up of peers ("routers") and unidirectional inbound and outbound virtual tunnels. Routers communicate with each other using protocols built on existing transport mechanisms (TCP, UDP, etc), passing messages. Client applications have their own cryptographic identifier ("Destination") which enables it to send and receive messages. These clients can connect to any router and authorize the temporary allocation ("lease") of some tunnels that will be used for sending and receiving messages through the network. I2P has its own internal network database (using a modification of the Kademlia DHT) for distributing routing and contact information securely.
<p>{% trans %}
The network is made up of peers ("routers") and unidirectional inbound and outbound virtual tunnels.
Routers communicate with each other using protocols built on existing transport mechanisms (TCP, UDP), passing messages.
Client applications have their own cryptographic identifier ("Destination") which enables it to send and receive messages.
These clients can connect to any router and authorize the temporary allocation ("lease") of some tunnels that will be used for sending and receiving messages through the network.
I2P has its own internal network database (using a modification of the Kademlia DHT) for distributing routing and contact information securely.
{%- endtrans %}</p>
<h3>{% trans -%}About Decentralization and I2P{%- endtrans %}</h3>
<h3>{% trans -%}About Decentralization and the I2P Network{%- endtrans %}</h3>
<p>{% trans %}The I2P network is almost completely decentralized, with exception to what are called "Reseed Servers," which is how you first join the network. This is to deal with the DHT ( Distributed Hash Table ) bootstrap problem. Basically, there's not a good and reliable way to get out of running at least one permanent bootstrap node that non-network users can find to get started. Once you're connected to the network, you only discover peers by building "exploratory" tunnels, but to make your initial connection, you need to get a peer set from somewhere. The reseed servers, which you can see listed on http://127.0.0.1:7657/configreseed in the Java I2P router, provide you with those peers. You then connect to them with the I2P router until you find one who you can reach and build exploratory tunnels through. Reseed servers can tell that you bootstrapped from them, but nothing else about your traffic on the I2P network.{%- endtrans %}</p>
<p>{% trans %}
The I2P network is almost completely decentralized, with exception to what are called Reseed Servers.
This is to deal with the DHT ( Distributed Hash Table ) bootstrap problem.
Basically, there is not a good and reliable way to get out of running at least one permanent bootstrap node that non-network participants can find to get started.
Once connected to the network, a router only discovers peers by building "exploratory" tunnels, but to make the initial connection, a reseed host is required to create connections and onboard a new router to the network.
Reseed servers can observe when a new router has downloaded a reseed from them, but nothing else about traffic on the I2P network.
{%- endtrans %}</p>
<h3>{% trans -%}I see IP addresses of all other I2P nodes in the router console. Does that mean my IP address is visible by others?{%- endtrans %}</h3>
<h3>{% trans -%}The I2P Network Does Not Exit Traffic{%- endtrans %}</h3>
<p>{% trans %}Yes, this is how a fully distributed peer-to-peer network works. Every node participates in routing packets for others, so your IP address must be known to establish connections. While the fact that your computer runs I2P is public, nobody can see your activities in it. You can't say if a user behind this IP address is sharing files, hosting a website, doing research or just running a node to contribute bandwidth to the project.{%- endtrans %}
<h3>{% trans -%}What I2P Does Not Do{%- endtrans %}</h3>
<p>{% trans %}The I2P network does not officially "Exit" traffic. It has outproxies to the Internet run by volunteers, which are centralized services. I2P is primarily a hidden service network and outproxying is not an official function, nor is it advised. The privacy benefits you get from participating in the the I2P network come from remaining in the network and not accessing the internet. I2P recommends that you use Tor Browser or a trusted VPN when you want to browse the Internet privately.{%- endtrans %}</p>
<p>{% trans %}
Outproxies to the Internet are run by volunteers, and are centralized services.
The privacy benefits from participating in the the I2P network come from remaining in the network and not accessing the internet.
Tor Browser or a trusted VPN are better options for browsing the Internet privately.
{%- endtrans %}</p>
<h3>{% trans -%}Comparisons{%- endtrans %}</h3>
<p>{% trans -%}
There are a great many other applications and projects working on anonymous
communication and I2P has been inspired by much of their efforts. This is not
a comprehensive list of anonymity resources - both freehaven's
<a href="http://freehaven.net/anonbib/topic.html">Anonymity Bibliography</a>
and GNUnet's <a href="https://www.gnunet.org/links/">related projects</a>
serve that purpose well. That said, a few systems stand out for further
comparison. The following have individual comparison pages:
There are a great many other applications and projects working on anonymous communication and I2P has been inspired by much of their efforts.
This is not a comprehensive list of anonymity resources - both freehaven's <a href="http://freehaven.net/anonbib/topic.html">Anonymity Bibliography</a> and GNUnet's <a href="https://www.gnunet.org/links/">related projects</a> serve that purpose well.
That said, a few systems stand out for further comparison.
The following have individual comparison pages:
{%- endtrans %}</p>
<ul>

View File

@ -2,26 +2,19 @@
{% block title %}{{ _('Performance') }}{% endblock %}
{% block content %}
<h2>{% trans %}How does I2P work, why is it slow, and why does it not use my full bandwidth?{% endtrans %}</h2>
<h2>{% trans %}I2P Network Performance: Speed, Connections and Resource Management{% endtrans %}</h2>
<p>{% trans -%}
Probably one of the most frequent things people ask is "how fast is I2P?",
and no one seems to like the answer - "it depends". After trying out I2P, the
next thing they ask is "will it get faster?", and the answer to that is a most
emphatic <b>yes</b>.
The I2P network is fully dynamic. Each client is known to other nodes and tests locally known nodes for reachability and capacity.
Only reachable and capable nodes are saved to a local NetDB.
During the tunnel building process, the best resources are selected from this pool to build tunnels with.
Because testing happens continuously, the pool of nodes changes.
Each I2P node knows a different part of the NetDB, meaning that each router has a different set of I2P nodes to be used for tunnels.
Even if two routers have the same subset of known nodes, the tests for reachability and capacity will likely show different results, as the other routers could be under load just as one router tests, but be free when the second router tests.
{%- endtrans %}</p>
<p>{% trans -%}
I2P is a full dynamic network. Each client is known to other nodes and tests local known nodes for reachability and capacity.
Only reachable and capable nodes are saved to a local NetDB (This is generally only a portion of the network, around 500-1000).
When I2P builds tunnels, it selects the best resource from this pool. For example, a small subset of 20-50 nodes are only available to build tunnels with.
Because testing happens every minute, the pool of used nodes changes every minute.
Each I2P node knows a different part of the net, meaning that each router has a different set of I2P nodes to be used for tunnels.
Even if two routers have the same subset of known nodes, the tests for reachability and capacity will likely show different results, as the other routers could be under load just as one router tests, but be free if the second router tests.
{%- endtrans %}</p>
<p>{% trans -%}
The above describes why each I2P node has different nodes to build tunnels.
This describes why each I2P node has different nodes to build tunnels.
Because every I2P node has a different latency and bandwith, tunnels (which are built via those nodes) have different latency and bandwidth values.
And because every I2P node has different tunnels built, no two I2P nodes have the same tunnel sets.
{%- endtrans %}</p>
@ -45,22 +38,21 @@ server - hopb1 - hopb2 - hopb3 - hopc1 - hopc2 - hopc3 - client
</pre>
<p>{% trans -%}
As most traffic on I2P (www, torrent,...) needs ack packages until new data is sent, it needs to wait until a ack package returns from the server.
In the end: send data, wait for ack, send more data, wait for ack,..
As the RTT (RoundTripTime) adds up from the latency of each individual I2P node and each connection on this roundtrip, it takes usually 1-3 seconds until a ack package comes back to the client.
With some internals of TCP and I2P transport, a data package has a limited size and cannot be as large as we want it to be.
Together these conditions set a limit of max bandwidth per tunnel of 20-50 kbyte/sec.
But if ONLY ONE hop in the tunnel has only 5 kb/sec bandwidth to spend, the whole tunnel is limited to 5 kb/sec, independent of the
Traffic on the network needs an ACK before new data is sent, it needs to wait until an ACK returns from a server:
send data, wait for ACK, send more data, wait for ACK.
As the RTT (RoundTripTime) adds up from the latency of each individual I2P node and each connection on this roundtrip, it takes usually 1-3 seconds until an ACK comes back to the client.
Because of TCP and I2P transport design, a data package has a limited size.
Together these conditions set a limit max bandwidth per tunnel of 20-50 kbyte/sec.
However, if ONLY ONE hop in the tunnel has only 5 kb/sec bandwidth to spend, the whole tunnel is limited to 5 kb/sec, independent of the
latency and other limitations.
{%- endtrans %}</p>
<p>{% trans -%}
Due to encryption used and other setups in I2P (howto built up tunnels, latency, ...) it is quite expensive in CPU time to build a tunnel. This is
why a destination is only allowed to have a max of 6 IN and 6 OUT tunnels to transport data. With a max of 50 kb/sec per tunnel, a destination could
Encryption, latency, and how a tunnel is built makes it quite expensive in CPU time to build a tunnel. This is
why a destination is only allowed to have a maximum of 6 IN and 6 OUT tunnels to transport data. With a max of 50 kb/sec per tunnel, a destination could
use roughly 300 kb/sec traffic combined ( in reality it could be more if shorter tunnels are used with low or no anonymity available).
Used tunnels are discarded every 10 minutes and new ones are built up.
This change of tunnels (and sometimes clients that shutdown hard due to usage of "shut down at once" or situations where there is power loss) does
sometimes break tunnels and connections, as seen on the IRC2P Network in loss of connection (ping timeout) or on when using eepget.
Used tunnels are discarded every 10 minutes and new ones are built.
This change of tunnels, and sometimes clients that shutdown or lose their connection to the network will sometimes break tunnels and connections. An example of this can be seen on the IRC2P Network in loss of connection (ping timeout) or on when using eepget.
{%- endtrans %}</p>
<p>{% trans -%}
@ -72,28 +64,27 @@ If one distributes these limited numbers across the number of I2P nodes, there i
<p>{% trans -%}
To remain anonymous one router should not be used by the whole network for building tunnels.
If one router does act as a tunnel router for ALL I2P nodes, it becomes a very real central point of failure as well as a central point to grab IPs and data from the clients. This is not good.
I2P attempts to spread the load across a lot of I2P nodes because of this reason.
If one router does act as a tunnel router for ALL I2P nodes, it becomes a very real central point of failure as well as a central point to gather IPs and data from clients.
This is why the network distributes traffic across nodes in the tunnel building process.
{%- endtrans %}</p>
<p>{% trans -%}
Another point is the full mesh network. Each connection hop-hop utilizes one TCP or UDP connection on the I2P nodes. With 1000 connections, one sees
1000 TCP connections. That is quite a lot and some home and small office routers (DSL, cable,..) only allow a small number of connections (or just go mad if you use more than X connections).
I2P tries to limit these connections to be under 1500 per UDP and per TCP type.
This limits the amount of traffic routed across your I2P node as well.
Another consideration for performance is the way I2P handles mesh networking. Each connection hop-hop utilizes one TCP or UDP connection on I2P nodes. With 1000 connections, one sees
1000 TCP connections. That is quite a lot, and some home and small office routers only allow a small number of connections.
I2P tries to limit these connections to under 1500 per UDP and per TCP type.
This limits the amount of traffic routed across an I2P node as well.
{%- endtrans %}</p>
<p>{% trans -%}
In summary, I2P is very complex and there is no easy way to pinpoint why your node is not used.
If your node is reachable and has a bandwidth setting of >128 kbyte/sec shared and is reachable 24/7, it should be used after some time for participating traffic.
If it is down in between, the testing of your I2P node done by other nodes will tell them: you are not reachable. This blocks your node for at least
24h on other nodes. So, the other nodes which tested you as down will not use your node for 24h for building tunnels. This is why your traffic will
be lower after a restart/shutdown for a minimum of 24h.
If a node is reachable, and has a bandwidth setting of >128 kbyte/sec shared and is reachable 24/7, it should be used after some time for participating traffic.
If it is down in between, the testing of an I2P node done by other nodes will tell them it not reachable. This blocks a node for at least
24 hours on other nodes. So, the other nodes which tested that node as down will not use that node for 24 hours for building tunnels. This is why your traffic is
lower after a restart/shutdown of your I2P router for a minimum of 24 hours.
{%- endtrans %}</p>
<p>{% trans -%}
Also: other I2P nodes needs to know your I2P router to test it for reachability and capacity. It takes time for other nodes to get known to your node.
It will be faster if you use I2P and build more tunnels, e.g. use a torrent or www for some time.
Additionally, other I2P nodes need to know an I2P router to test it for reachability and capacity.
This process can be made faster when you interact with the network, for instance by using applications, or visiting I2P sites, which will result in more tunnel building and therefore more activity and reachability for testing by nodes on the network.
{%- endtrans %}</p>
<h2>{{ _('Performance Improvements') }}</h2>

View File

@ -3,14 +3,12 @@
{% block content %}
<h1>{{ _('The I2P Software') }} (I2P)</h1>
<p>{% trans %}When you install the I2P software made available at geti2p.net, you are
actually installing an I2P router and an accompanying bundle of basic
applications. The I2P Java distribution is the first I2P software gateway and
has been actively developed since 2003.{%- endtrans %}</p>
<p>{% trans %}The applications are made available through a webUI, which listens at
127.0.0.1:7657, and the main page of which is called the “Router Console,”
where you monitor the health of your connection to the network and access
applications to use on the network.{%- endtrans %}</p>
<p>{% trans %}The I2P Java distribution is the first I2P software gateway and
has been actively developed since 2003. It includes a router, applications, and the ability to manage and customize your own connection with the I2P network using a built in Hidden Services manager{%- endtrans %}</p>
<p>{% trans %}Applications are made available through a webUI that listens at
127.0.0.1:7657. The main page is called the “Router Console,”
where network connection status is displayed and access
to applications is provided.{%- endtrans %}</p>
<h3>{% trans %}What is included:{%- endtrans %}</h3>
<p>{% trans %}<strong>The Set Up Wizard</strong>: When you download the
I2P software, a set up wizard will guide you through a few configuration steps
@ -18,8 +16,8 @@ while your router is making its first connections to the network. This happens
the same way that your home router connects you to the Internet. During the set
up process, you will be given the option to test your bandwidth and set your
bandwidth limits in order to ensure a good connection as a network peer.{%- endtrans %}</p>
<p>{% trans %}<strong>The I2P Router Console</strong>: Here is where you can see your
network connections and information about your router. You will be able to see how many peers you
<p>{% trans %}<strong>The I2P Router Console</strong>: Here is where you can see your router
network connections. You will be able to see how many peers you
have, and other information that will help if you need to troubleshoot. You can
stop and start the router as well. You will see the applications that the
software includes, as well as links to some community forums and sites on the
@ -47,7 +45,7 @@ a camera. This is especially useful for Android devices.</p>
adapter for forwarding services ( ie SSH ) into I2P and proxying client
requests to and from I2P. It provides a variety of “Tunnel Types” which are
able to do advance filtering of traffic before it reaches I2P.{%- endtrans %}</p>
<h3>{% trans %}Applications Outside I2P to use with I2P{%- endtrans %}</h3>
<h3>{% trans %}I2P Network Compatible Applications{%- endtrans %}</h3>
<p>{% trans browser=site_url('about/browser-config') %}<strong><a href="{{ browser }}">Mozilla Firefox</a></strong>: A web browser with advanced privacy and
security features, this is the best browser to configure to browse I2P
sites.{%- endtrans %}</p>

View File

@ -23,8 +23,9 @@ GPG Key fingerprint: <tt>EA27 06D6 14F5 28DB 764B F47E CFCD C461 75E6 694A</tt>
<h2>{{ _('Forums') }}</h2>
<p>{% trans -%}Please visit our I2P user forum - {%- endtrans %} <a href="http://{{ i2pconv('i2pforum.i2p') }}/">{{ i2pconv('i2pforum.i2p') }}</a> ({% trans -%}available on non-private internet at https://i2pforum.net and on I2P at http://i2pforum.i2p{%- endtrans %})</p>
<p>{% trans zzz=i2pconv('zzz.i2p') -%}
Most of the discussion about I2P's development happens on the <a href="http://{{ zzz }}">I2P developer forum</a> (only reachable from within I2P network). This is usually the best place to start with inquiries, if the dev IRC channel is inactive.
<p>{% trans zzz=i2pconv('i2pforum.i2p') -%}
The discussion about I2P's development happens on the <a href="http://{{ zzz }}">I2P user forum</a>. This is usually the best place to start with developer inquiries, if the dev IRC channel is inactive.
For general support use either the <a href="http://{{ zzz }}">I2P user forum</a> or the Subreddit.
{%- endtrans %}</p>
<h2>{{ _('Social Media') }}</h2>
@ -81,19 +82,14 @@ GPG Key fingerprint: <tt>EA27 06D6 14F5 28DB 764B F47E CFCD C461 75E6 694A</tt>
<table border="0">
<tr>
<td valign="top" rowspan="31"><b>{{ _('Admin') }}</b></td>
<td valign="top"><b>{{ _('Project Manager') }}</b></td>
<td valign="top">zzz</td>
<td valign="top"><i>{{ _('point of contact of last resort') }}</i></td>
<td valign="top"><b>{{ _('I2P Java Release Manager') }}</b></td>
<td valign="top">idk</td>
<td valign="top"><i>{{ _('Builds and signs the releases') }}</i></td>
</tr>
<tr>
<td valign="top"><b>{{ _('Donations treasurer') }}</b></td>
<td valign="top">meeh</td>
<td valign="top"><i>{{ _('manage donations') }}</i></td>
</tr>
<tr>
<td valign="top"><b>{{ _('PR manager') }}</b></td>
<td valign="top"><b>{{ _('Outreach') }}</b></td>
<td valign="top">Sadie</td>
<td valign="top"><i>{{ _('press contact, manages public relations and affairs') }}</i></td>
<td valign="top"><i>{{ _('Coordinator with community, NGOs and human rights groups. Meeting facilitator, Digital Security training and Press') }}</i></td>
</tr>
<tr>
<td valign="top"><b>{{ _('Assistant PR manager') }}</b></td>
@ -103,7 +99,7 @@ GPG Key fingerprint: <tt>EA27 06D6 14F5 28DB 764B F47E CFCD C461 75E6 694A</tt>
<tr>
<td valign="top"><b>{% trans forum=i2pconv('i2pforum.i2p') %}<a href="http://{{ forum }}/">Forum</a> admin{% endtrans %}</b></td>
<td valign="top">eche|on</td>
<td valign="top"><i>{{ _('manage the public user forum') }}</i></td>
<td valign="top"><i>{{ _('I2P public forum maintainer') }}</i></td>
</tr>
<tr>
<td valign="top"><b>{{ _('Download mirrors admin') }}</b></td>
@ -122,68 +118,58 @@ GPG Key fingerprint: <tt>EA27 06D6 14F5 28DB 764B F47E CFCD C461 75E6 694A</tt>
</tr>
<tr>
<td valign="top"><b>{{ _('Packager; Linux') }}</b></td>
<td valign="top">zzz</td>
<td valign="top">idk</td>
<td valign="top"><i>{{ _('Linux (Debian/Ubuntu) distribution packager') }}</i></td>
</tr>
<tr>
<td valign="top"><b>{{ _('Packager; Windows') }}</b></td>
<td valign="top">zzz</td>
<td valign="top">idk</td>
<td valign="top"><i>{{ _('Windows installer packager') }}</i></td>
</tr>
<tr>
<td valign="top"><b>{{ _('Packager; OSX') }}</b></td>
<td valign="top">zlatinb</td>
<td valign="top">echelon</td>
<td valign="top"><i>{{ _('OSX installer packager') }}</i></td>
</tr>
<tr>
<td valign="top"><b>{{ _('Release Manager') }}</b></td>
<td valign="top">zzz</td>
<td valign="top"><i>{{ _('Builds and signs the releases') }}</i></td>
</tr>
<tr>
<td valign="top"><b>{{ _('Release Manager Alternates') }}</b></td>
<td valign="top">eche|on, str4d</td>
<td valign="top">eche|on</td>
<td valign="top"><i>{{ _('Backup release managers') }}</i></td>
</tr>
<tr>
<td valign="top"><b>{{ _('CI admin') }}</b></td>
<td valign="top">idk</td>
<td valign="top"><i>{{ _('Maintain the Continuous Integration infrastructure') }}</i></td>
<td valign="top"><i>{{ _('Maintain Continuous Integration infrastructure') }}</i></td>
</tr>
<tr>
<td valign="top"><b>{{ _('Reseed admin') }}</b></td>
<td valign="top"><b>{{ _('Reseed Admin') }}</b></td>
<td valign="top">backup</td>
<td valign="top"><i>{{ _('Monitors, advises and recruits reseed hosts') }}</i></td>
</tr>
<tr>
<td valign="top"><b>{{ _('Security Researcher') }}</b></td>
<td valign="top" class="blue">[{{ _('vacant') }}]</td>
<td valign="top"><i>{{ _('threat model / crypto expert') }}</i></td>
</tr>
<tr>
<td valign="top"><b><a href="https://i2pgit.org/">Gitlab</a> admin</b></td>
<td valign="top">idk</td>
<td valign="top"><i>{{ _('Manage the project gitlab') }}</i></td>
<td valign="top"><i>{{ _('I2P Gitlab maintainer') }}</i></td>
</tr>
<tr>
<td valign="top"><b><a href="https://i2pgit.org/dashboard/issues">Issue Tracker(Replaces Trac)</a> admin</b></td>
<td valign="top">idk</td>
<td valign="top"><i>{{ _('Manage the project bug tracker') }}</i></td>
</tr>
<tr>
<td valign="top"><b>{{ _('Translation admins') }}</b></td>
<td valign="top">eche|on, zzz, idk, Sadie</td>
<td valign="top"><b>{{ _('Localization') }}</b></td>
<td valign="top">eche|on, idk, Sadie</td>
<td valign="top">Admins on <a href="https://www.transifex.com/projects/p/I2P/">Transifex</a></td>
</tr>
<tr>
<td valign="top"><b>{{ _('User Advocate') }}</b></td>
<td valign="top"><b>{{ _('Translators') }}</b></td>
<td valign="top">{{ _('many many people!') }}</td>
<td valign="top">Translators on <a href="https://www.transifex.com/projects/p/I2P/">Transifex</a></td>
</tr>
<tr>
<td valign="top"><b>{{ _('Usability Lead') }}</b></td>
<td valign="top">Sadie</td>
<td valign="top"><i>{{ _('gather, prioritize, advocate for user needs') }}</i></td>
<td valign="top"><i>{{ _('Usability research') }}</i></td>
</tr>
<tr>
<td valign="top"><b>{{ _('Product Development') }}</b></td>
<td valign="top">Sadie</td>
<td valign="top"><i>{{ _('supervises projects from the early planning stages to project completion') }}</i></td>
<td valign="top"><i>{{ _('supervises projects from the early planning stages to project completion') }}</i></td>
</tr>
<tr>
<td valign="top"><b>{{ _('Website Maintainer') }}</b></td>
@ -193,12 +179,12 @@ GPG Key fingerprint: <tt>EA27 06D6 14F5 28DB 764B F47E CFCD C461 75E6 694A</tt>
<tr>
<td valign="top"><b>{% trans website=site_url() %}<a href="{{ website }}">Webserver</a> admin{% endtrans %}</b></td>
<td valign="top">eche|on</td>
<td valign="top"><i>{{ _('manage the public project webservers') }}</i></td>
<td valign="top"><i>{{ _('manage public project webservers') }}</i></td>
</tr>
<tr>
<td valign="top"><b>{% trans website=site_url() %}<a href="{{ website }}">Website</a> admin{% endtrans %}</b></td>
<td valign="top">idk</td>
<td valign="top"><i>{{ _('manage the public project website content') }}</i></td>
<td valign="top"><i>{{ _('manage the public project website') }}</i></td>
</tr>
<tr>
<td valign="top"><b>{{ _('News Admin') }}</b></td>
@ -210,11 +196,6 @@ GPG Key fingerprint: <tt>EA27 06D6 14F5 28DB 764B F47E CFCD C461 75E6 694A</tt>
<td valign="top">idk</td>
<td valign="top"><i>{{ _('manage the backup news feed') }}</i></td>
</tr>
<tr>
<td valign="top"><b>{{ _('Design and Usability') }}</b></td>
<td valign="top">Sadie, idk</td>
<td valign="top"><i>{{ _('ongoing improvements to user experience for website and software') }}</i></td>
</tr>
<tr>
<td valign="top"><b>Google Play admin</b></td>
<td valign="top">idk</td>
@ -230,31 +211,17 @@ GPG Key fingerprint: <tt>EA27 06D6 14F5 28DB 764B F47E CFCD C461 75E6 694A</tt>
<td valign="top">StormyCloud</td>
<td valign="top"><i></i></td>
</tr>
</table>
<table>
<tr>
<!--<td valign="top"><b>{{ _('Director of passion') }}</b></td>
<td valign="top" class="blue">[{{ _('vacant') }}]</td>
<td valign="top"><i>{{ _('community motivator') }}</i></td>-->
</tr>
<tr><td colspan="4"><hr /></td></tr>
<tr>
<td valign="top" rowspan="17"><b>{{ _('Dev') }}</b></td>
<td valign="top"><b>{{ _('Core Lead') }}</b></td>
<td valign="top">zzz</td>
<td valign="top"><i>{{ _('lead dev for the SDK and router') }}</i></td>
</tr>
<tr>
<td valign="top" rowspan="17"><b>{{ _('I2P Core Integration Mainatainers') }}</b></td>
<td valign="top"><b>{% trans postman=i2pconv('hq.postman.i2p') %}<a href="http://{{ postman }}/">I2P mail</a> lead{% endtrans %}</b></td>
<td valign="top">postman</td>
<td valign="top"><i>{{ _('organize and develop the i2p mail system') }}</i></td>
</tr>
<tr>
<td valign="top"><b>{% trans bote=i2pconv('bote.i2p') %}<a href="http://{{ bote }}/">I2P-Bote</a> lead{% endtrans %}</b></td>
<td valign="top">str4d</td>
<td valign="top"><i>{{ _('I2P-Bote plugin') }}</i></td>
</tr>
<tr>
<td valign="top"><b>{% trans forum=i2pconv('i2pforum.i2p') %}<a href="http://{{ forum }}/viewforum.php?f=12">I2PSnark</a> lead{% endtrans %}</b></td>
<td valign="top">zzz</td>
<td valign="top">idk</td>
<td valign="top"><i>{{ _('Maintains the integrated Bittorrent client') }}</i></td>
</tr>
<tr>
@ -264,7 +231,7 @@ GPG Key fingerprint: <tt>EA27 06D6 14F5 28DB 764B F47E CFCD C461 75E6 694A</tt>
</tr>
<tr>
<td valign="top"><b>{{ _('Susimail lead') }}</b></td>
<td valign="top">zzz</td>
<td valign="top">idk</td>
<td valign="top"><i>{{ _('Susimail development') }}</i></td>
</tr>
<tr>
@ -279,14 +246,9 @@ GPG Key fingerprint: <tt>EA27 06D6 14F5 28DB 764B F47E CFCD C461 75E6 694A</tt>
</tr>
<tr>
<td valign="top"><b>{{ _('SAM') }}</b></td>
<td valign="top">zzz</td>
<td valign="top">idk</td>
<td valign="top"><i>{{ _('SAM maintainer') }}</i></td>
</tr>
<tr>
<td valign="top"><b>{{ _('Translators') }}</b></td>
<td valign="top">{{ _('many many people!') }}</td>
<td valign="top">Translators on <a href="https://www.transifex.com/projects/p/I2P/">Transifex</a></td>
</tr>
<tr>
<tr>
<td valign="top" rowspan="6"><b>{{ _('Contributors') }}</b></td>
@ -298,7 +260,7 @@ GPG Key fingerprint: <tt>EA27 06D6 14F5 28DB 764B F47E CFCD C461 75E6 694A</tt>
<td valign="top"><i>{{ _('desktopgui, dijjer port') }}</i></td>
</tr>
<tr>
<td valign="top">zzz</td>
<td valign="top">idk</td>
<td valign="top"><i>{{ _('Debian/Ubuntu Packager and PPA maintainer') }}</i></td>
</tr>
<tr>
@ -310,12 +272,17 @@ GPG Key fingerprint: <tt>EA27 06D6 14F5 28DB 764B F47E CFCD C461 75E6 694A</tt>
<td valign="top" class="blue">[{{ _('vacant') }}]</td>
<td valign="top" class="blue"><i>{{ _('Help needed on many fronts!') }}</i></td>
</tr>
<tr><td colspan="4"><hr /></td></tr>
</table>
<table>
<tr>
<td valign="top" rowspan="39" colspan="2"><b>{{ _('Past contributors') }}</b></td>
<td valign="top">mihi</td>
<td valign="top"><i>{{ _('I2PTunnel development, ministreaming library') }}</i></td>
</tr>
<tr>
<td valign="top">zzz</td>
<td valign="top"><i>{{ _('Project lead, Lead Developer, Lead Maintainer, Forum Administrator, many other roles') }}</i></td>
</tr>
<tr>
<td valign="top">jrandom</td>
<td valign="top"><i>{{ _('Project lead, Syndie lead') }}</i></td>
@ -467,7 +434,7 @@ GPG Key fingerprint: <tt>EA27 06D6 14F5 28DB 764B F47E CFCD C461 75E6 694A</tt>
<td valign="top" colspan="2">{% trans %}&hellip; and many others{% endtrans %}</td>
</tr>
<tr>
<td><a href="site_url(about/hall-of-fame)">Hall of Fame!</a></td>
<td>{% trans website=site_url('about/hall-of-fame') %}<a href="{{ website }}">Hall of Fame!</a>{% endtrans %}</td>
</tr>
</table>

View File

@ -1,7 +1,7 @@
{% extends "global/layout.html" %}
{% block title %}I2PTunnel{% endblock %}
{% block lastupdated %}2022-10{% endblock %}
{% block accuratefor %}0.9.56{% endblock %}
{% block lastupdated %}2023-10{% endblock %}
{% block accuratefor %}0.9.59{% endblock %}
{% block content %}
<h2 id="overview">{% trans %}Overview{% endtrans %}</h2>
@ -107,28 +107,118 @@ and to provide a better user experience.
<li>Over 20 unique translated, styled, and formatted error pages for various errors
<li>Internal web server to serve forms, CSS, images, and errors
</ul>
<li>Transparent response decompression:
<ul><li>If the server-side HTTP proxy compressed the response,
the HTTP client proxy transparently decompresses it.
</ul>
</ul>
<h4>Transparent Response Compression</h4>
<p>
The i2ptunnel compression is requested with the HTTP header:
The i2ptunnel response compression is requested with the HTTP header:
</p>
<ul>
<li><b>X-Accept-Encoding: </b> x-i2p-gzip;q=1.0, identity;q=0.5, deflate;q=0, gzip;q=0, *;q=0</li>
</ul>
<p>
The server side strips this hop-by-hop header before sending the request to the web server.
The elaborate header with all the q values is not necessary;
servers should just look for "x-i2p-gzip" anywhere in the header.
</p>
<p>
The response indicating i2ptunnel compression contains the following HTTP header:
The server side determines whether to compress the response based on
the headers received from the webserver, including
Content-Type, Content-Length, and Content-Encoding,
to assess if the response is compressible and is worth the additional CPU required.
If the server side compresses the response, it adds the following HTTP header:
</p>
<ul>
<li><b>Content-Encoding: </b> x-i2p-gzip</li>
</ul>
<p>
If this header is present in the response,
the HTTP client proxy transparently decompresses it.
The client side strips this header and gunzips before sending the response to the browser.
Note that we still have the underlying gzip compression at the I2CP layer,
which is still effective if the response is not compressed at the HTTP layer.
</p>
<p>
This design and the current implementation violate RFC 2616 in several ways:
</p>
<ul><li>
X-Accept-Encoding is not a standard header
</li><li>
Does not dechunk/chunk per-hop; it passes through chunking end-to-end
</li><li>
Passes Transfer-Encoding header through end-to-end
</li><li>
Uses Content-Encoding, not Transfer-Encoding, to specify the per-hop encoding
</li><li>
Prohibits x-i2p gzipping when Content-Encoding is set (but we probably don't want to do that anyway)
</li><li>
The server side gzips the server-sent chunking, rather than doing dechunk-gzip-rechunk and dechunk-gunzip-rechunk
</li><li>
The gzipped content is not chunked afterwards.
RFC 2616 requires that all Transfer-Encoding other than "identity" is chunked.
</li><li>
Because there is no chunking outside (after) the gzip,
it is more difficult to find the end of the data, making any implementation of keepalive harder.
</li><li>
RFC 2616 says Content-Length must not be sent if Transfer-Encoding is present,
but we do. The spec says ignore Content-Length if Transfer-Encoding is present,
which the browsers do, so it works for us.
</li></ul>
<p>
Changes to implement a standards-compliant hop-by-hop compression in a backward-compatible
manner are a topic for further study.
Any change to dechunk-gzip-rechunk would require a new encoding type, perhaps
x-i2p-gzchunked.
This would be identical to Transfer-Encoding: gzip, but would have to be
signalled differently for compatibility reasons.
Any change would require a formal proposal.
</p>
<h4>Transparent Request Compression</h4>
<p>
Not supported, although POST would benefit.
Note that we still have the underlying gzip compression at the I2CP layer.
</p>
<h4>Persistence</h4>
<p>
The client and server proxies do not currently support RFC 2616 HTTP persistent sockets
on any of the three hops (browser socket, I2P socket, server socket).
Connection: close headers are injected at every hop.
Changes to implement a persistence are under investigation.
These changes should be standards-complaint and backwards-compatible,
and would not require a formal proposal.
</p>
<h4>Pipelining</h4>
<p>
The client and server proxies do not currently support RFC 2616 HTTP pipelining
and there are no plans to do so.
Modern browswers do not support pipelining through proxies because
most proxies cannot implement it correctly.
</p>
<h4>Compatibility</h4>
<p>
Proxy implementations must work correctly with other implementations
on the other side. Client proxies should work without a
HTTP-aware server proxy (i.e. a standard tunnel) on the server side.
Not all implementations support x-i2p-gzip.
</p>
<h4>User Agent</h4>
<p>{% trans -%}
Depending on if the tunnel is using an outproxy or not it will append the following User-Agent:
{%- endtrans %}</p>

View File

@ -1,7 +1,7 @@
{% extends "global/layout.html" %}
{% block title %}SAM V3{% endblock %}
{% block lastupdated %}2023-01{% endblock %}
{% block accuratefor %}API 0.9.57{% endblock %}
{% block lastupdated %}2023-11{% endblock %}
{% block accuratefor %}API 0.9.59{% endblock %}
{% block content %}
<p>SAM is a simple client protocol for interacting with I2P.
SAM is the recommended protocol for non-Java applications to connect to the I2P network,
@ -570,9 +570,45 @@ For PROTOCOL, which may be specified only for RAW, the valid range is 0-255, and
For SESSION commands, the specified ports and protocol are the defaults for that session.
For individual streams or datagrams, the specified ports and protocol override the session defaults.
For received streams or datagrams, the indicated ports and protocol are as received from <a href="{{ site_url('docs/protocol/i2cp') }}">I2CP</a>.
</p><p>
</p>
<h4>Important Differences from Standard IP</h4>
I2CP ports are for I2P sockets and datagrams. They are unrelated to your local sockets connecting to SAM.
<ul><li>
Port 0 is valid and has special meaning.
</li><li>
Ports 1-1023 are not special or privileged.
</li><li>
Servers listen on port 0 by default, which means "all ports".
</li><li>
Clients send to port 0 by default, which means "any port".
</li><li>
Clients send from port 0 by default, which means "unspecified".
</li><li>
Servers may have a service listening on port 0 and other services listening on higher ports.
If so, the port 0 service is the default, and will be connected to if the incoming
socket or datagram port does not match another service.
</li><li>
Most I2P destinations only have one service running on them, so you may use the defaults, and ignore I2CP port configuration.
</li><li>
SAM 3.2 or 3.3 is required to specify I2CP ports.
</li><li>
If you don't need I2CP ports, you don't need SAM 3.2 or 3.3; 3.1 is sufficient.
</li><li>
Protocol 0 is valid and means "any protocol". This is not recommended, and probably will not work.
</li><li>
I2P sockets are tracked by an internal connection ID.
Therefore, there is no requirement that the 5-tuple of dest:port:dest:port:protocol be unique.
For example, there may be multiple sockets with the same ports between two destinations.
Clients do not need to pick a "free port" for an outbound connection.
</li></ul>
<p>
If you are designing a SAM 3.3 application with multiple subsessions, think carefully
about how to use ports and protocols effectively.
See the <a href="{{ site_url('docs/protocol/i2cp') }}">I2CP</a> specification for more information.
</p><p>
</p>
@ -635,7 +671,7 @@ See additional notes about the
in the Destination Key Generation section below.
</p><p>
If the signing private key is all zeros, the
If the signing private key is all zeros,
the <a href="{{ site_url('docs/spec/common-structures') }}#struct_OfflineSignature">Offline Signature</a> section follows.
Offline signatures are only supported for STREAM and RAW sessions.
Offline signatures may not be created with DESTINATION=TRANSIENT.
@ -677,7 +713,7 @@ For most low- to medium-bandwidth and low- to medium-connection counts,
2 or 3 is sufficient.
Please specify the tunnel quantities in the SESSION CREATE message
to get consistent performance with the Java I2P and i2pd routers,
using the options e.g. inbound.length=3 outbound.length=3.
using the options e.g. inbound.quantity=3 outbound.quantity=3.
These and other options <a href="#options">are documented in the links below</a>.
</p><p>
@ -883,6 +919,8 @@ ACCEPT is not allowed while there is an active FORWARD on the session.
As of SAM 3.2,
multiple concurrent pending STREAM ACCEPTs are allowed on the same session ID (even with the same port).
Prior to 3.2, concurrent accepts would fail with ALREADY_ACCEPTING.
Note: Java I2P also supports concurrent ACCEPTs on SAM 3.1, as of release 0.9.24 (2016-01).
i2pd also supports concurrent ACCEPTs on SAM 3.1, as of release 2.50.0 (2023-12).
</p>
<h4>Accept Response</h4>
@ -944,6 +982,26 @@ passing through the current socket is forwarded from and to the connected
I2P destination peer, until one of the peer closes the socket.
</p>
<h4>Errors After OK</h4>
<p>
In rare cases, the SAM bridge may encounter an error after sending RESULT=OK,
but before a connection comes in and sending the $destination line to the client.
These errors may include router shutdown, router restart, and session close.
In these cases, when SILENT=false, the SAM bridge may, but is not required to
(implementation-dependent), send the line:
<pre>
&lt;- STREAM STATUS
RESULT=I2P_ERROR
[MESSAGE=...]
</pre>
before immediately closing the socket. This line is not, of course, decodable as a
valid Base 64 destination.
</p>
<h3>SAM Virtual Streams : FORWARD</h3>
<p>
A client can use a regular socket server and wait for connection requests
@ -1390,6 +1448,12 @@ as appropriate. Support for the ID parameter may be added in a future release.
Version 3.3 was introduced in I2P release 0.9.25.
</i></p>
<p><i>
In an earlier version of this specification, PRIMARY sessions were known as
MASTER sessions. In both <code>i2pd</code> and <code>I2P+</code>, they are still
known only as MASTER sessions.
</i></p>
<p>
SAM v3.3 adds support for running streaming, datagrams, and raw subsessions on the same
primary session, and for running multiple subsessions of the same style.

View File

@ -1,7 +1,7 @@
{% extends "global/layout.html" %}
{% block title %}{% trans %}The Network Database{% endtrans %}{% endblock %}
{% block lastupdated %}2023-01{% endblock %}
{% block accuratefor %}0.9.57{% endblock %}
{% block lastupdated %}2023-11{% endblock %}
{% block accuratefor %}0.9.59{% endblock %}
{% block content %}
<h2>{% trans %}Overview{% endtrans %}</h2>
@ -46,7 +46,10 @@ to be present:
<li><b>caps</b>
({% trans %}Capabilities flags - used to indicate floodfill participation, approximate bandwidth, and perceived reachability{% endtrans %})
<ul>
<li><b>D</b>: Medium congestion (as of release 0.9.58)</li>
<li><b>E</b>: High congestion (as of release 0.9.58)</li>
<li><b>f</b>: {% trans %}Floodfill{% endtrans %}</li>
<li><b>G</b>: Rejecting all tunnels (as of release 0.9.58)</li>
<li><b>H</b>: {% trans %}Hidden{% endtrans %}</li>
<li><b>K</b>: {% trans amount='12 KBps' %}Under {{amount }} shared bandwidth{% endtrans %}</li>
<li><b>L</b>: {% trans amount='12 - 48 KBps' %}{{ amount }} shared bandwidth{% endtrans %} ({% trans %}default{% endtrans %})</li>
@ -70,6 +73,13 @@ For compatibility with older routers, a router may publish multiple bandwidth le
</li>
</ul>
<p>
Notes on R/U capabilities:
A router should usually publish the R or U capability, unless the reachability state is currently unknown.
R means that the router is directly reachable (no introducers required, not firewalled) on at least one transport address.
U means that the router is NOT directly reachable on ANY transport address.
<p>
Deprecated options:
<ul>
<li><strike>coreVersion</strike>

View File

@ -1,7 +1,7 @@
{% extends "global/layout.html" %}
{% block title %}{% trans %}Naming and Address Book{% endtrans %}{% endblock %}
{% block lastupdated %}2020-07{% endblock %}
{% block accuratefor %}0.9.46{% endblock %}
{% block lastupdated %}2023-11{% endblock %}
{% block accuratefor %}0.9.59{% endblock %}
{% block content %}
<h2 id="overview">{% trans %}Overview{% endtrans %}</h2>
@ -486,7 +486,6 @@ are used, however there are some exceptions where they may fail if the
name does not immediately resolve. I2PTunnel will fail, for example, if
the name does not resolve to a destination.
{%- endtrans %}</p>
{% endblock %}
<h2 id="newbase32">Extended Base32 Names</h2>
@ -621,3 +620,5 @@ exceed the DNS max label length of 63 chars. Browsers probably do not care.
No backward compatibility issues. Longer b32 addresses will fail to be converted
to 32-byte hashes in old software.
</li></ul>
{% endblock %}

View File

@ -5,8 +5,8 @@
{% block content %}
<h2>{% trans %}General Information{% endtrans %}</h2>
<p>{% trans -%}
I2P includes a plugin architecture
to support easy development and installation of additional software.
The I2P network includes a plugin architecture
to support both easy development and installation of new plugins.
{%- endtrans %}</p>
<p>{% trans -%}
@ -14,7 +14,7 @@ There are now plugins available that support distributed email, blogs, IRC
clients, distributed file storage, wikis, and more.
{%- endtrans %}</p>
<h3>{% trans -%}Easy Installation of Applications{%- endtrans %}</h3>
<h3>{% trans -%}Adding Plugins To Your I2P Router{%- endtrans %}</h3>
<p>{% trans -%}
I2P Plugins can be installed by copying the plugin download URL onto
the appropriate section on the <a href="http://127.0.0.1:7657/configplugins">Router Console Plugin Configuration Page</a>.
@ -131,8 +131,7 @@ builds).
<h3>{% trans %}Development{% endtrans %}</h3>
<p>{% trans pluginspec=site_url('docs/spec/plugin'), zzz=i2pconv('zzz.i2p') -%}
See the latest <a href="{{ pluginspec }}">plugin specification</a> and the
<a href="http://{{ zzz }}/forums/16">plugin forum</a> on {{ zzz }}.
See the latest <a href="{{ pluginspec }}">plugin specification</a>
{%- endtrans %}</p>
<p>{% trans pluginsite=i2pconv('plugins.i2p') -%}
@ -141,10 +140,6 @@ as <a href="http://{{ pluginsite }}/plugins/snowman">snowman</a>, were developed
specifically as examples.
{%- endtrans %}</p>
<p>{% trans -%}
<b>Developers wanted!</b> Plugins are a great way to learn more about I2P
or easily add some feature.
{%- endtrans %}</p>
<h3>{% trans %}Getting Started{% endtrans %}</h3>
<p>{% trans url='https://github.com/i2p/i2p.scripts/tree/master/plugin/makeplugin.sh' -%}

View File

@ -1,7 +1,7 @@
{% extends "global/layout.html" %}
{% block title %}I2CP{% endblock %}
{% block lastupdated %}2020-09{% endblock %}
{% block accuratefor %}0.9.47{% endblock %}
{% block lastupdated %}2023-10{% endblock %}
{% block accuratefor %}0.9.59{% endblock %}
{% block content %}
<p>{% trans -%}
The I2P Client Protocol (I2CP) exposes a strong separation of concerns between
@ -923,7 +923,17 @@ to work reliably in the presence of multiple channels.
<p>{% trans -%}
The gzip function cannot be completely turned off, however setting i2cp.gzip=false
turns the gzip effort setting to 0, which may save a little CPU.
{%- endtrans %}</p>
{%- endtrans %}
Implementations may select different gzip efforts on a per-socket or
per-message basis, depending on an assessment of the compressibility
of the contents. Due to the compressibility of destination padding implemented in
API 0.9.57 (proposal 161), compression of the streaming SYN packets
in each direction, and of repliable datagrams, is recommended even if
the payload is not compressible.
Implementations may wish to write a trivial gzip/gunzip function for
a gzip effort of 0, which will provide large efficiency gains
over a gzip library for this case.
</p>
<table border=1>
<tr>
<th>{% trans %}Bytes{% endtrans %}</th>
@ -972,6 +982,44 @@ specified by <a href="http://www.ietf.org/rfc/rfc1952.txt">RFC 1952</a>.
{%- endtrans %}</p>
<h2>Important Differences from Standard IP</h2>
<p>
I2CP ports are for I2P sockets and datagrams. They are unrelated to your local sockets or ports.
Because I2P did not support ports and protocol numbers prior to release 0.7.1,
ports and protocol numbers are somewhat different from that in standard IP,
for backward compatibility:
</p>
<ul><li>
Port 0 is valid and has special meaning.
</li><li>
Ports 1-1023 are not special or privileged.
</li><li>
Servers listen on port 0 by default, which means "all ports".
</li><li>
Clients send to port 0 by default, which means "any port".
</li><li>
Clients send from port 0 by default, which means "unspecified".
</li><li>
Servers may have a service listening on port 0 and other services listening on higher ports.
If so, the port 0 service is the default, and will be connected to if the incoming
socket or datagram port does not match another service.
</li><li>
Most I2P destinations only have one service running on them, so you may use the defaults, and ignore I2CP port configuration.
</li><li>
Protocol 0 is valid and means "any protocol". However, this is not recommended, and probably will not work.
Streaming requires that the protocol number is set to 6.
</li><li>
Streaming sockets are tracked by an internal connection ID.
Therefore, there is no requirement that the 5-tuple of dest:port:dest:port:protocol be unique.
For example, there may be multiple sockets with the same ports between two destinations.
Clients do not need to pick a "free port" for an outbound connection.
</li></ul>
<h2 id="future">{% trans %}Future Work{% endtrans %}</h2>
<ul>
<li>{% trans -%}

View File

@ -5,29 +5,28 @@
{% block content %}
<h2 id="about">{% trans %}About Reseed hosts{% endtrans %}</h2>
<h2 id="about">{% trans %}About Reseed Hosts{% endtrans %}</h2>
<p>{% trans -%}
Reseed hosts are needed to for bootstrapping, that is, providing the initial set
of I2P nodes for your I2P node to talk to. Depending on the status of your node
it may need to bootstrap every now and then if many of the nodes it knows of
aren't contactable.
Reseed hosts are needed for new routers to integrate with the I2P network.
During the bootstrapping process, reseed hosts provide an initial set of nodes for
a new router to make connections with. Occasionally an already integrated router
may need to go through the reseed process if it is experiencing connection issues with the network.
This is most often caused by its known nodes not being available.
{%- endtrans %}</p>
<p>{% trans -%}
Reseeding is done over an encrypted connection and all of the bootstrap
information is signed by the reseed host you connect to, making it impossible
for an unauthenticated source to provide you with false information.
information is signed by the reseed host you connect to. This makes it impossible
for an unauthenticated source to provide false information.
{%- endtrans %}</p>
<h2 id="running">{% trans %}Running a Reseed host{% endtrans %}</h2>
<p>
{% trans -%}Operating a reseed server can be accessible to any sysadmin familiar
with I2P, and we encourage new reseed operators to get in contact with us at
<a href="http://zzz.i2p">the development forums</a>. The more reseed hosts that
are run, the more resilient the I2P network becomes, and the harder it is to
prevent users of I2P from connecting to the network.
{% trans -%}Operating a reseed server will be familair for most sysadmins who have experience with
I2P. More reseed hosts result in more resilient I2P network connections for new
participating routers. It also makes it harder to prevent new routers from connecting to the I2P network.
{%- endtrans %}
</p>
@ -36,29 +35,27 @@ prevent users of I2P from connecting to the network.
<li><a href="https://i2pgit.org/idk/reseed-tools">Reseed Software and Documentation</a></li>
</ul>
<h2 id="other">{% trans %}Other ways of Reseeding{% endtrans %}</h2>
<h2 id="other">{% trans %}Other Ways Of Reseeding{% endtrans %}</h2>
<p>
{% trans -%}
In order to make I2P more reslient, other kinds of reseeding are possible. One
important way of carrying out a reseed is the file-based reseed, where a user
Other options for reseeding include file-based reseeds, where a user
with a running I2P router generates a reseed file for a friend and transfers it
to them as a .zip file. Others use cloud-based infrastructure to resist
censorship. These reseed methods provide functionality which aids people in
situations where reseeds are restricted.
to them as a .zip file. Using cloud-based infrastructure helps to resist
censorship, which aids people in situations where reseeds may be restricted.
{%- endtrans %}
</p>
<ul>
<li><a href="{{ site_url('blog/post/2020/06/07/file-based-reseed') }}">File Based Reseed</a></li>
<li><a href="https://homepage.np-tokumei.net/post/notes-i2p-reseed-over-cloudflare/">I2P Reseed over Cloudflare</a></li>
<li><a href="https://homepage.np-tokumei.net/post/notes-i2p-reseed-over-cloudflare/">I2P Reseed Over Cloudflare</a></li>
<li><a href="https://homepage.np-tokumei.net/post/notes-censorship-resistant-i2p-reseeding/">Censorship Resistant I2P Reseeding</a></li>
</ul>
<h2 id="thank you">{% trans %}Thank you Reseed Operators{% endtrans %}</h2>
<h2 id="thank you">{% trans %}Thank You Reseed Operators{% endtrans %}</h2>
<p>
{%-trans -%}
If you are running a reseed server, We would like to thank you for helping to
If you are running a reseed server, thank you for helping to
make the I2P network stronger and more resilient than ever.
{%- endtrans-%}
</p>

View File

@ -116,37 +116,30 @@ Try hovering your cursor over the other lines of information for a brief descrip
<h3 id="badcontent"><span class="permalink"><a href="#badcontent">
{% trans %}I am opposed to certain types of content. How do I keep from distributing, storing, or accessing them?{% endtrans %}</a></span>
</h3>
<p>{% trans -%}
I2P is an anonymous network - it is designed to withstand attempts at blocking or censoring of content, thus providing a means for communication that anyone can use.
<p>{% trans -%}
I2P traffic that transits through your router is encrypted with several layers of encryption.
Except in the case of a serious security vulnerability (of which none are currently known),
it is not possible to know what the contents of the traffic are and thus not possible to distinguish between traffic which one is opposed to or not opposed to.
We consider the 3 parts of the question:
it is not possible to know the content, origin or destination of routed traffic.
{%- endtrans %}</p>
<ul>
<li>
{% trans -%}
<b>Distribution</b><br>
All traffic on I2P is encrypted in multiple layers. You don't know a message's contents, source, or destination.
All traffic you route is internal to the I2P network, you are not an <a href="#exit">exit node</a> (referred to as an outproxy in our documentation).
Your only alternative is to refuse to route <i>any</i> traffic, by setting your share bandwidth or maximum participating tunnels to 0 (see above).
It would be nice if you didn't do this, you should help the network by routing traffic for others.
Over 95&#37; of users route traffic for others.
All traffic on the I2P network is encrypted in multiple layers. You don't know a message's contents, source, or destination.
Traffic is internal to the I2P network, you are not an <a href="#exit">exit node</a> (referred to as an outproxy in our documentation).
{%- endtrans %}
</li>
<li>
{% trans -%}
<b>Storage</b><br>
I2P does not do distributed storage of content, this has to be specifically installed and configured by the user (with Tahoe-LAFS, for example).
The I2P network does not do distributed storage of content, this has to be specifically installed and configured by the user (with Tahoe-LAFS, for example).
That is a feature of a different anonymous network, <a href="http://freenetproject.org/">Freenet</a>.
By running I2P, you are not storing content for anyone.
By running an I2P router, you are not storing content for anyone.
{%- endtrans %}
</li>
<li>
{% trans -%}
<b>Access</b><br>
If there are hidden services which you dislike, you may refrain from visiting them.
Your router will not request any content without your specific instruction to do so.{%- endtrans %}
</li>
</ul>

View File

@ -1,29 +1,21 @@
{% extends "global/layout.html" %}
{% block title %}{{ _('Release Signing Key') }}{% endblock %}
{% block content %}
<p>{% trans -%}
Windows installers for releases 0.9.38 and later are signed by zlatinb.
{%- endtrans %}<br>
<a href="{{ url_for('static', filename='zlatinb.key.crt') }}" >{% trans %}Download code signing certificate{% endtrans %}</a>
</p>
<p>{% trans -%}
Mac OSX installers for releases 0.9.38 and later are signed by zlatinb.
{%- endtrans %}<br>
<a href="{{ url_for('static', filename='zlatinb.key.crt') }}" >{% trans %}Download code signing certificate{% endtrans %}</a>
</p>
Releases 0.9.57 forward are signed by idk. His current public key is:
{%- endtrans %}</p>
<p>
<a href="{{ url_for('static', filename='idk.key.asc') }}" >{% trans %}Download PGP public key{% endtrans %}</a>
</p><p>
<p>{% trans -%}
Releases 0.7.6 and later are signed by zzz. His current public key is:
Releases 0.7.6 and 0.9.56 are signed by zzz. His current public key is:
{%- endtrans %}</p>
<p>
<a href="{{ url_for('static', filename='zzz.key.asc') }}" >{% trans %}Download PGP public key{% endtrans %}</a>
</p><p>
zzz's GPG subkeys were renewed in March 2019.
Use the link above to download the current public keys,
or download the key 415576BAA76E0BED from a key server.
Following is the original May 2014 announcement of the new keys.
</p><p>
</p>
<p>
<pre>
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

View File

@ -20,7 +20,7 @@ check with the appropriate developer for guidance.
<ul>
<li>{% trans -%}
Please don't just "write code". If you can, participate in other development activities, including:
development discussions and support on IRC, zzz.i2p, and i2pforum.i2p; testing;
development discussions and support on IRC, i2pforum.i2p; testing;
bug reporting and responses; documentation; code reviews; etc.
{%- endtrans %}</li>
<li>{% trans -%}
@ -34,9 +34,9 @@ the checkin deadline for a release.
<h3>{{ _('Release Cycle') }}</h3>
<p>
Our normal release cycle is 6-12 weeks.
The normal release cycle is 6-12 weeks.
Following are the approximate deadlines within a typical 8-week cycle.
Actual deadlines for each release are set by the lead developer after consultation with the full team.
Actual deadlines for each release are set by the release manager after consultation with the full team.
</p>
<ul>
@ -151,7 +151,7 @@ Be familiar with common Java pitfalls that are caught by findbugs.
Run 'ant findbugs' to learn more.
{%- endtrans %}</li>
<li>
We require Java 8 to build and run I2P as of release 0.9.47.
Java 8 is required to build and run I2P as of release 0.9.47.
Do not use Java 7 or 8 classes or methods in embedded subsystems: addressbook, core, i2ptunnel.jar (non-UI), mstreaming, router, routerconsole (news only), streaming.
These subsystems are used by
Android and embedded applications that require only Java 6. All classes must be available in Android API 14.
@ -258,7 +258,7 @@ Only check in code that you wrote yourself.
Before checking in any code or library jars from other sources,
justify why it is necessary,
verify the license is compatible,
and obtain approval from the lead developer.
and obtain approval from the release manager.
{%- endtrans %}</li>
<li>{% trans -%}
If you do obtain approval to add external code or jars,
@ -278,19 +278,18 @@ Include the license and source information in the checkin comment.
<h3>{{ _('Bugs') }}</h3>
<ul>
<li>{% trans trac=i2pconv('trac.i2p2.i2p') -%}
Managing Trac tickets is everybody's job, please help.
Monitor {{ trac }} for tickets you have been assigned or can help with.
Assign, categorize, comment on, fix, or close tickets if you can.
Managing issues are everybody's job, please help.
Monitor {{ Gitlab }} for issues you can help with.
Comment on, fix, and close issues if you can.
{%- endtrans %}</li>
<li>{% trans -%}
New developers should start by fixing a bug.
Search for bugs with the 'easy' keyword on trac.
When you have a fix, attach your patch to the ticket and add the keyword 'review-needed'.
Do not close the ticket until it's been successfully reviewed and you've checked your changes in.
New developers should start by fixing issues.
When you have a fix, attach your patch to the issue and add the keyword 'review-needed'.
Do not close the issue until it's been successfully reviewed and you've checked your changes in.
Once you've done this smoothly for a couple of tickets, you may follow the normal procedure below.
{%- endtrans %}</li>
<li>{% trans -%}
Close a ticket when you think you've fixed it.
Close an issue when you think you've fixed it.
We don't have a test department to verify and close tickets.
If you arent sure you fixed it, close it and add a note saying
"I think I fixed it, please test and reopen if it's still broken".

View File

@ -3,7 +3,7 @@
{% block lastupdated %}2021-01{% endblock %}
{% block content_nav %}
<ol>
<li><a href="#basic-study">{% trans %}Basic study{% endtrans %}</a></li>
<li><a href="#basic-study">{% trans %}Get to Know Java{% endtrans %}</a></li>
<li><a href="#getting-the-i2p-code">{% trans %}Getting the I2P code{% endtrans %}</a>
<ul>
<li><a href="#git">{% trans %}The new way: Git{% endtrans %}</a></li>
@ -28,10 +28,10 @@ Not quite ready for coding?
Try <a href="{{ volunteer }}">getting involved</a> first.
{%- endtrans %}</p>
<h2 id="basic-study">{% trans %}Basic study{% endtrans %}</h2>
<h2 id="get-to-know-java">{% trans %}Get to Know Java{% endtrans %}</h2>
<p>{% trans -%}
Basic development on the I2P router or the embedded applications uses Java as the main development language.
The I2P router and its embedded applications use Java as the main development language.
If you don't have experience with Java, you can always have a look at <a href="http://www.mindview.net/Books/TIJ/">Thinking in Java</a>.
{%- endtrans %}</p>
<p>{% trans intro=site_url('docs/how/intro'), docs=site_url('docs'), techintro=site_url('docs/how/tech-intro') -%}
@ -52,7 +52,7 @@ you need to get the source code:
<h3 id="git">{% trans %}Our current way: Git{% endtrans %}</h3>
<p>{% trans trac="https://i2pgit.org" -%}I2P has official Git services and accepts contributions via Git at <a href="{{ trac }}">our own gitlab</a>.
Trac issues have also been migrated there and the former Trac is not available anymore by now. Two-way syncing of
Trac issues have also been migrated to Git issues. Two-way syncing of
issues between Gitlab and Github is a work-in-progress.{%- endtrans %}</p>
<li>{% trans git_url='https://git-scm.com/' -%}
@ -100,9 +100,8 @@ see the <a href="{{ apps }}">application development guide</a>.
{%- endtrans %}</p>
<h2 id="development-ideas">{% trans %}Development ideas{% endtrans %}</h2>
<p>{% trans zzz=i2pconv('zzz.i2p'), todo=site_url('get-involved/todo'), trac='https://i2pgit.org/i2p-hackers/i2p.i2p/issues' -%}
See <a href="http://{{ zzz }}/forums/3">zzz's TODO lists</a>,
<a href="{{ todo }}">this website's TODO list</a> or
<p>{% trans todo=site_url('get-involved/todo'), trac='https://i2pgit.org/i2p-hackers/i2p.i2p/issues' -%}
See <a href="{{ todo }}">the project TODO list</a> or
<a href="{{ trac }}">the issue list on GitLab</a>
for ideas.
{%- endtrans %}</p>

View File

@ -1,26 +1,23 @@
{% extends "global/layout.html" %} {% block title %}{% trans %}Get Involved{% endtrans %}{% endblock %} {% block content %}
<h2>{% trans %}There are many ways you can help I2P.{% endtrans %}</h2>
<h3>{% trans %}Grow the Community{% endtrans %}</h3>
<h2>{% trans %}Contribute to the I2P Network{% endtrans %}</h2>
<ul>
<li><b>{% trans %}Support I2P Core Development{% endtrans %}</b>{% trans %}The project hosts meetings on the first Tuesday of every month that are open to the community. This is a great opportunity to see what is happening with I2P core development and
familiarize yourself with Roadmap tasks. Additionally, protocol development meetings take place every Tuesday and zzz's development forum is available all of the time as a place to participate in development and issues that need fixing. See the
new developer's guide for how to get started.{% endtrans %}
</li>
<li><b>{% trans %}Spread the Word.{% endtrans %}</b> &mdash; {% trans -%} Tell people about I2P on forums, blogs, and comments to articles. Fix up the
<a href="https://wikipedia.org/wiki/I2P">Wikipedia article about I2P in your language</a>. Tell your friends, and more importantly, use I2P to communicate with your friends. We have many tools that can help you keep your private conversations
private. {%- endtrans %}
</li>
<li><b>{% trans %}Support I2P Core Development{% endtrans %}</b>{% trans %} The project hosts meetings on the first Tuesday of every month that are open to the community. This is a great opportunity to see what is happening with I2P core development and
familiarize yourself with Roadmap tasks. {% endtrans %}
</li>
<li><b><a href="{{ newtrans }}">{{ _('Translation and Documentation') }}</a></b> &mdash; {% trans newtrans=site_url('get-involved/guides/new-translators') -%} Help translate the website and the software into your language. Translators are a very important
part of this decentralized project and your work is always appreciated. See the new translator's guide for details. The project also welcomes support to help keep its documentation updated. See the <a href="{{ newtrans }}">new translator's guide</a> for details. {%- endtrans %}
part of this decentralized project and your work is always appreciated. The project also welcomes support to help keep its documentation updated. See the <a href="{{ newtrans }}">new translator's guide</a> for details. {%- endtrans %}
</li>
</ul>
<h3>{% trans %}Host Services for Yourself and Others{% endtrans %}</h3>
<ul>
<li><b><a href="{{ site_url('/about/software') }}">{{ _('Services') }}</a></b> &mdash; {% trans -%} Self-hosting almost anything, from an SSH server for yourself to an ActivityPub forum for everyone and anything in between, is helpful to the I2P network,
especially if you write down instructions for others. Almost anything you can think of can be made to work with I2P, and your service is valuable to the network. {%- endtrans %}
especially if you write down instructions for others. Almost anything you can think of can be made to work with I2P. {%- endtrans %}
</li>
<li><b><a href="{{ reseed }}">{{ _('Reseeding') }}</a></b> &mdash; {% trans reseed=site_url('get-involved/guides/reseed') -%} Getting new users onto the network is a very important task, and that task is handled by our reseed servers. The more reseed
servers we have, the more de-centralized and redundant our infrastructure is. It's a big responsibility, but it's pretty easy to set up a reseed server for new routers to bootstrap from. Detailed instructions are on our <a href="{{ reseed }}">reseed server page</a>.
<li><b><a href="{{ reseed }}">{{ _('Reseeding') }}</a></b> &mdash; {% trans reseed=site_url('get-involved/guides/reseed') -%} Getting new participanting routers onto the network is a very important task, and that task is handled by reseed servers. The more reseed
servers the network has, the more de-centralized and redundant its infrastructure becomes. It's a big responsibility, but it's pretty easy to set up a reseed server for new routers to bootstrap from. Detailed instructions can be found here <a href="{{ reseed }}">reseed server page</a>.
{%- endtrans %}
</li>
</ul>
@ -29,18 +26,16 @@
<li><b><a href="{{ site_url('/get-involved/guides/dev-guidelines') }}">{{ _('Applications') }}</a></b> &mdash; {% trans apps=site_url('get-involved/develop/applications') -%} Write or port applications for I2P. There's some guidelines and a list of ideas
on the <a href="{{ apps }}">applications page</a>. {%- endtrans %}
</li>
<li><a href="{{ site_url('/get-involved/guides/new-developers') }}"><b>{{ _('Coding') }}</a></b> &mdash; {% trans trac=i2pconv('trac.i2p2.i2p'), zzz=i2pconv('zzz.i2p'), newdevs=site_url('get-involved/guides/new-developers') -%} There's plenty to do if
you know Java or are ready to learn. Check for open tickets on <a href="http://{{ trac }}/report/1">Trac</a> or the TODO list on <a href="http://{{ zzz }}">{{ zzz }}</a> for some ideas on where to start. See the <a href="{{ newdevs }}">new developer's guide</a> for details. {%- endtrans %}
</li>
<li><b><a href="{{ site_url('research/index') }}">{{ _('Analysis') }}</b> &mdash; {% trans threatmodel=site_url('docs/how/threat-model') -%} Study or test the code to look for vulnerabilities. Both anonymity vulnerabilities from the various
<li><b><a href="{{ site_url('research/index') }}">{{ _('Research') }}</b> &mdash; {% trans threatmodel=site_url('docs/how/threat-model') -%} Study or test I2P code to look for vulnerabilities. Both anonymity vulnerabilities from the various
<a href="{{ threatmodel }}">threat models</a>, and DOS and other weaknesses due to security holes, benefit from ongoing research. {%- endtrans %}
</li>
</ul>
<h4>{% trans %}When you're ready, join us on our Gitlab{% endtrans %}</h4>
<h4>{% trans %}Join I2P On Gitlab{% endtrans %}</h4>
<ul>
<li><strong><a href="http://git.idk.i2p">{% trans %}Inside I2P - (http://git.idk.i2p){% endtrans %}</a></strong>
</li>
<li><strong><a href="https://i2pgit.org">{% trans %}Outside I2P - (https://i2pgit.org){% endtrans %}</a></strong>
</li>
</ul>
{% endblock %}
{% endblock %}

View File

@ -15,79 +15,190 @@
Older releases are at the bottom of the page.
</p>
<h2 id="1.5.0">1.5.0 (API 0.9.51)</h2>
<p><b>Released: Aug. 23, 2021</b></p>
<h2 id="2.4.0">2.4.0 (API 0.9.60)</h2>
<p><b>Target release: September 2023</b></p>
<ul>
<li>
Accelerate rekeying routers to ECIES
NetDB context management
</li>
<li>
Start work on SSU2
Streaming replay fix
</li>
<li>
Implement new tunnel build messages (proposal 157)
Handle congestion capabilities by deprioritizing overloaded routers
</li>
<li>
Support dmg and exe automatic updates
"Install Plugin from File" command-line option
</li>
<li>
New native OSX installer
Generic UDP Tunnels in HSM
</li>
<li>
X-I2P-Location(alt-svc) locations for built-in I2P Site
Revive Android helper library
</li>
<li>
RRD4J 3.8
</li>
<li>
Create C, CGo, SWIG bindings for libi2pd
Website Migration
</li>
</ul>
<h2 id="1.6.1">1.6.1 (API 0.9.52)</h2>
<p><b>Released: Nov. 29, 2021</b></p>
<h2 id="2.3.0">2.3.0 (API 0.9.59)</h2>
<p><b>Target release: June 2023</b></p>
<ul>
<li>
Accelerate rekeying routers to ECIES
Tunnel peer selection improvements
</li>
<li>
SSU performance improvements
User-Configurable blocklist expiration
</li>
<li>
Improve SSU peer test security
Throttle fast bursts of lookup from same source
</li>
<li>
Add theme selection to new-install wizard
Fix replay detection information leak
</li>
<li>
Continue work on SSU2 (proposal 159)
NetDB fixes for multihomed leaseSets
</li>
<li>
Send new tunnel build messages (proposal 157)
</li>
<li>
Include automatic browser configuration tool in IzPack installer
</li>
<li>
Make Fork-and-Exec Plugins Managable
</li>
<li>
Document jpackage install processes
</li>
<li>
Complete, document Go/Java Plugin Generation Tools
</li>
<li>
Reseed Plugin - Run a self-signed HTTPS reseed as a Java router plugin with no configuration.
NetDB fixes for leaseSets which were received as a reply before being recieved as a store
</li>
</ul>
<h2 id="2.2.0">2.2.0 (API 0.9.58)</h2>
<p><b>Target release: April 2023</b></p>
<ul>
<li>
Tunnel peer selection improvements
</li>
<li>
Streaming replay fix
</li>
</ul>
<h2 id="2.1.0">2.1.0 (API 0.9.57)</h2>
<p><b>Released: January 10, 2023</b></p>
<ul>
<li>
SSU2 fixes
</li>
<li>
Tunnel build congestion fixes
</li>
<li>
SSU peer test and symmetric NAT detction fixes
</li>
<li>
Fix broken LS2 encrypted leasesets
</li>
<li>
Option to disable SSU 1 (preliminary)
</li>
<li>
Compressible padding (proposal 161)
</li>
<li>
New console peers status tab
</li>
<li>
Add torsocks support to SOCKS proxy and other SOCKS improvements and fixes
</li>
</ul>
<h2 id="2.0.0">2.0.0 (API 0.9.56)</h2>
<p><b>Released: November 21, 2022</b></p>
<ul>
<li>
SSU2 connection migration
</li>
<li>
SSU2 immediate acks
</li>
<li>
Enable SSU2 by default
</li>
<li>
SHA-256 digest proxy authentication in i2ptunnel
</li>
<li>
Update Android build process to use modern AGP, end need of deprecated Maven plugin in Android build
</li>
<li>
Cross-Platform(Desktop) I2P browser auto-configuration support
</li>
</ul>
<h2 id="1.9.0">1.9.0 (API 0.9.55)</h2>
<p><b>Released: August 22, 2022</b></p>
<ul>
<li>
SSU2 peer test and relay implementation
</li>
<li>
SSU2 fixes
</li>
<li>
SSU MTU/PMTU improvements
</li>
<li>
Enable SSU2 for a small portion of routers
</li>
<li>
Add deadlock detector
</li>
<li>
More certificate import fixes
</li>
<li>
Fix i2psnark DHT restart after router restart
</li>
</ul>
<h2 id="1.8.0">1.8.0 (API 0.9.54)</h2>
<p><b>Released: May 23, 2022</b></p>
<ul>
<li>
Router family fixes and improvements
</li>
<li>
Soft restart fixes
</li>
<li>
SSU fixes and performance improvements
</li>
<li>
I2PSnark standalond fixes and improvements
</li>
<li>
Avoid Sybil penalty for trusted families
</li>
<li>
Reduce tunnel build reply timeout
</li>
<li>
UPnP fixes
</li>
<li>
Remove BOB source
</li>
<li>
Certificate import fixes
</li>
<li>
Tomcat 9.0.62
</li>
<li>
Refactoring to support SSU2 (proposal 159)
</li>
<li>
Initial implementation of SSU2 base protocol (proposal 159)
</li>
<li>
SAM authorization popup for Android apps
</li>
<li>
Improve support for custom directory installs in i2p.firefox
</li>
</ul>
<h2 id="1.7.0">1.7.0 (API 0.9.53)</h2>
<p><b>Released: Feb. 21, 2022</b></p>
@ -148,176 +259,72 @@
</li>
</ul>
<h2 id="1.8.0">1.8.0 (API 0.9.54)</h2>
<p><b>Released: May 23, 2022</b></p>
<h2 id="1.6.1">1.6.1 (API 0.9.52)</h2>
<p><b>Released: Nov. 29, 2021</b></p>
<ul>
<li>
Router family fixes and improvements
Accelerate rekeying routers to ECIES
</li>
<li>
Soft restart fixes
SSU performance improvements
</li>
<li>
SSU fixes and performance improvements
Improve SSU peer test security
</li>
<li>
I2PSnark standalond fixes and improvements
Add theme selection to new-install wizard
</li>
<li>
Avoid Sybil penalty for trusted families
Continue work on SSU2 (proposal 159)
</li>
<li>
Reduce tunnel build reply timeout
Send new tunnel build messages (proposal 157)
</li>
<li>
UPnP fixes
Include automatic browser configuration tool in IzPack installer
</li>
<li>
Remove BOB source
Make Fork-and-Exec Plugins Managable
</li>
<li>
Certificate import fixes
Document jpackage install processes
</li>
<li>
Tomcat 9.0.62
Complete, document Go/Java Plugin Generation Tools
</li>
<li>
Refactoring to support SSU2 (proposal 159)
</li>
<li>
Initial implementation of SSU2 base protocol (proposal 159)
</li>
<li>
SAM authorization popup for Android apps
</li>
<li>
Improve support for custom directory installs in i2p.firefox
Reseed Plugin - Run a self-signed HTTPS reseed as a Java router plugin with no configuration.
</li>
</ul>
<h2 id="1.9.0">1.9.0 (API 0.9.55)</h2>
<p><b>Released: August 22, 2022</b></p>
<h2 id="1.5.0">1.5.0 (API 0.9.51)</h2>
<p><b>Released: Aug. 23, 2021</b></p>
<ul>
<li>
SSU2 peer test and relay implementation
Accelerate rekeying routers to ECIES
</li>
<li>
SSU2 fixes
Start work on SSU2
</li>
<li>
SSU MTU/PMTU improvements
Implement new tunnel build messages (proposal 157)
</li>
<li>
Enable SSU2 for a small portion of routers
Support dmg and exe automatic updates
</li>
<li>
Add deadlock detector
New native OSX installer
</li>
<li>
More certificate import fixes
X-I2P-Location(alt-svc) locations for built-in I2P Site
</li>
<li>
Fix i2psnark DHT restart after router restart
RRD4J 3.8
</li>
<li>
Create C, CGo, SWIG bindings for libi2pd
</li>
</ul>
<h2 id="2.0.0">2.0.0 (API 0.9.56)</h2>
<p><b>Released: November 21, 2022</b></p>
<ul>
<li>
SSU2 connection migration
</li>
<li>
SSU2 immediate acks
</li>
<li>
Enable SSU2 by default
</li>
<li>
SHA-256 digest proxy authentication in i2ptunnel
</li>
<li>
Update Android build process to use modern AGP, end need of deprecated Maven plugin in Android build
</li>
<li>
Cross-Platform(Desktop) I2P browser auto-configuration support
</li>
</ul>
<h2 id="2.1.0">2.1.0 (API 0.9.57)</h2>
<p><b>Released: January 10, 2023</b></p>
<ul>
<li>
SSU2 fixes
</li>
<li>
Tunnel build congestion fixes
</li>
<li>
SSU peer test and symmetric NAT detction fixes
</li>
<li>
Fix broken LS2 encrypted leasesets
</li>
<li>
Option to disable SSU 1 (preliminary)
</li>
<li>
Compressible padding (proposal 161)
</li>
<li>
New console peers status tab
</li>
<li>
Add torsocks support to SOCKS proxy and other SOCKS improvements and fixes
</li>
</ul>
<h2 id="2.2.0">2.2.0 (API 0.9.58)</h2>
<p><b>Target release: April 2023</b></p>
<ul>
<li>
Tunnel peer selection improvements
</li>
<li>
i2psnark UDP tracker support (proposal 160) ?
</li>
<li>
Custom reseed service entry for Android
</li>
<li>
UDP Hidden Service/Client support in Hidden Services Manager
</li>
<li>
Automatic reseed servers from .onion URLs
</li>
<li>
VPN-Mode Support in Android for browser configuration
</li>
<li>
Fix WebSockets in HTTP Server Tunnels
</li>
</ul>
<h4><a href="roadmap-archive">{% trans %}Looking for older releases? Check the roadmap archive by following this link.{% endtrans %}</a></h4>
{% endblock %}

View File

@ -8,11 +8,8 @@
<h3>{{ _('Research on the I2P Network') }}</h3>
<p>{% trans -%}
I2P is a very unique project that unfortunately has not received the wider
academic attention it deserves. To date, most research focus on anonymous and
onion-routing technology has been around Tor, and while those papers benefit us
as well, there is a great need for I2P-focused research. This plays a key role
in both maintaining the security and integrity of the network, as well as
Research plays a key role
in both maintaining the security and integrity of the I2P network, as well as
opening doors for more impactful future development.
{%- endtrans %}</p>
@ -32,9 +29,9 @@ A list of known published papers about I2P is available <a href="{{ papers
{%- endtrans %}</p>
<p>{% trans %}
This page aims to outline the most needed fields of research, notes to
potential researchers, our general safety guidelines as well as an expanding
list of open questions that you can begin on at any time.
This page outlines the most needed fields of research, notes to
potential researchers, general safety guidelines as well as an expanding
list of open research questions.
{% endtrans %}</p>
<h2>{{ _('Notes to Researchers:') }}</h2>
@ -43,12 +40,9 @@ list of open questions that you can begin on at any time.
<p>{% trans -%}
While all research on the I2P network is beneficial and appreciated, there are
certain areas which are more in need than others - most so in defensive
research. Most people enjoy coming up with fun ways to launch offensives
certain areas that are more in need than others. Most research focuses on testing offensives
against anonymous software, and this is further reinforced by the incentives in
academic institutions. While we know it is often not the first choice for
researchers, We would certainly appreciate any and all work towards ways to
fortify the network!
academic institutions. The project would appreciate research and testing that will support fortifying the I2P network.
{%- endtrans %}</p>
<h3>{{ _('Offensive and Analytic Tests') }}</h3>

View File

@ -7,13 +7,13 @@
This process is subject to change. Please refer to this page for the current VRP.
{%- endtrans %}</p>
<p>{% trans %}This page was last updated in June 2020.{%- endtrans %}</p>
<p>{% trans %}This page was last updated April 2023.{%- endtrans %}</p>
<p>{% trans %}Researchers: while you research/hack, we ask that you refrain from the following: - Performing active exploits or Denial of Service attacks on the
i2p network - Performing social engineering on i2p development team members - Performing any physical or electronic attempts against i2p property and/or data
<p>{% trans %}Researchers: during your study and network testing, we ask that you refrain from the following: - Performing active exploits or Denial of Service attacks on the
I2P network - Performing social engineering on I2P team and community members - Performing any physical or electronic attempts against I2P property and/or data
centers{%- endtrans %}</p>
<p>{% trans %}As i2p is an open-source community, many volunteers and development team members run their own I2P Sites as well as public (“non-private internet”) domains. These
sites/servers are NOT in the scope of the vulnerability assessment / response process, only the underlying code of i2p is.{%- endtrans %}</p>
<p>{% trans %}As I2P is an open-source community, many volunteers and development team members run their own I2P Sites as well as public (“non-private internet”) domains. These
sites/servers are NOT in the scope of the vulnerability assessment / response process, only the underlying code of I2P is.{%- endtrans %}</p>
<h2 id="i.-point-of-contact-for-security-issues">I. {{ _('Point of Contact for Security Issues') }}</h2>
@ -22,7 +22,7 @@ sites/servers are NOT in the scope of the vulnerability assessment / response pr
<h2 id="ii.-security-response-team">II. {{ _('Security Response Team') }}</h2>
<p>{% trans -%}
Echelon is the trusted security point-of-contact. He forwards e-mails to team members as appropriate.
Echelon is the trusted security point-of-contact. He forwards emails to team members as appropriate.
{%- endtrans %}</p>
<h2 id="iii.-incident-response">III. {{ _('Incident Response') }}</h2>

View File

@ -1,3 +1,4 @@
from __future__ import absolute_import
from flask import g, make_response, render_template, request, safe_join
import os.path
@ -124,6 +125,9 @@ def render_sitemap():
urls.append({
'path': '/download/windows',
})
urls.append({
'path': '/download/macos',
})
# Render and return the sitemap
response = make_response(render_template('global/sitemap.xml', url_root=url_root, langs=LANG_FRAGS,
curlang=to_url(g.lang), urls=urls))

View File

@ -3,8 +3,8 @@ Blockfile and Hosts Database Specification
==========================================
.. meta::
:category: Formats
:lastupdated: 2020-09
:accuratefor: 0.9.47
:lastupdated: 2023-11
:accuratefor: 0.9.59
.. contents::
@ -188,6 +188,12 @@ entries containing only one entry:
Comma-separated list of host databases, to be searched in-order for
lookups. Almost always "privatehosts.txt,userhosts.txt,hosts.txt".
listversion_*
The version of each database in lists, for example: listversion_hosts.txt=4.
Used to identify partial or aborted upgrade of individual lists.
(as of database version 4)
Reverse Lookup Skiplist
-----------------------
@ -240,8 +246,8 @@ The DestEntry Properties typically contains:
"a"
The time added (Java long time in ms)
"a"
The time added (Java long time in ms)
"m"
The time last modified (Java long time in ms)
"notes"
User-supplied comments

View File

@ -3,8 +3,8 @@ I2CP Specification
==================
.. meta::
:category: Protocols
:lastupdated: 2021-12
:accuratefor: 0.9.52
:lastupdated: 2023-10
:accuratefor: 0.9.59
.. contents::
@ -303,6 +303,8 @@ below.
Reconfigure Session message supported
Ports and protocol numbers in gzip header
0.7 Dest Lookup and Dest Reply messages supported
0.6.5 or lower All messages and features not listed above

View File

@ -3,8 +3,8 @@ I2NP Specification
==================
.. meta::
:category: Protocols
:lastupdated: 2022-12
:accuratefor: 0.9.57
:lastupdated: 2023-10
:accuratefor: 0.9.59
.. contents::
@ -49,6 +49,10 @@ below.
0.9.51 Short tunnel build messages for ECIES-X25519 routers
Minimum peers will build tunnels through, as of 0.9.58
Minimum floodfill peers will send DSM to, as of 0.9.58
0.9.49 Garlic messages to ECIES-X25519 routers
0.9.48 ECIES-X25519 Routers

View File

@ -0,0 +1,149 @@
============================
Congestion Caps
============================
.. meta::
:author: dr|z3d, idk, orignal, zzz
:created: 2023-01-24
:thread: http://zzz.i2p/topics/3516
:lastupdated: 2023-02-01
:status: Open
:target: 0.9.59
.. contents::
Overview
========
Add congestion indicators to the published Router Info (RI).
Motivation
==========
Bandwidth "caps" (capabilities) indicate share bandwidth limits and reachability but not congestion state.
A congestion indicator will help routers avoid attempting to build through a congested router,
which contributes to more congestion and reduced tunnel build success.
Design
======
Define new caps to indicate various levels of congestion or capacity issues.
These will go in the top-level RI caps, not the address caps.
Congestion Definition
----------------------
Congestion, in general, means that the peer is unlikely to
receive and accept a tunnel build request.
How to define or classify congestion levels is implementation-specific.
Implementations may consider one or more of the following:
- At or near bandwidth limits
- At or near max participating tunnels
- At or near max connections on one or more transports
- Over threshold for queue depth, latency, or CPU usage; internal queue overflow
- Base platform / OS CPU and memory capabilities
- Perceived network congestion
- Network state such as firewalled or symmetric NAT or hidden or proxied
- Configured not to accept tunnels
Congestion state should be based on an average of conditions
over several minutes, not an instantaneous measurement.
Specification
=============
Update [NETDB]_ as follows:
.. raw:: html
{% highlight %}
D: Medium congestion, or a low-performance router (e.g. Android, Raspberry Pi)
Other routers should downgrade or limit this router's
apparent tunnel capacity in the profile.
E: High congestion, this router is near or at some limit,
and is rejecting or dropping most tunnel requests.
If this RI was published in the last 15 minutes, other routers
should severely downgrade or limit this router's capacity.
If this RI is older than 15 minutes, treat as 'D'.
G: This router is temporarily or permanently rejecting all tunnels.
Do not attempt to build a tunnel through this router,
until a new RI is received without the 'G'.
{% endhighlight %}
For consistency, implementations should add any congestion cap
at the end (after R or U).
Security Analysis
=================
Any published peer information cannot be trusted.
Caps, like anything else in the Router Info, may be spoofed.
We never use anything in the Router Info to up-rate a router's perceived capacity.
Publishing congestion indicators, telling peers to avoid this router, is inherently
much more secure than permissive or capacity indicators solicting more tunnels.
The current bandwidth capacity indicators (L-P, X) are trusted only to avoid
very low-bandwidth routers. The "U" (unreachable) cap has a similar effect.
Any published congestion indicator should have the same effect as
rejecting or dropping a tunnel build request, with similar security properties.
Notes
=====
Peers must not to completely avoid 'D' routers, only derate them.
Care must be taken not to completely avoid 'E' routers,
so when the whole network is in congestion and publishing 'E',
things don't completely break.
Routers may use different strategies for what types of tunnels to build through 'D' and 'E' routers,
for example exploratory vs. client, or high vs. low bandwidth client tunnels.
Routers should probably not publish a congestion cap at startup or shutdown by default,
even if their network state is unknown, to prevent restart detection by peers.
Compatibility
===============
No issues, all implementations ignore unknown caps.
Migration
=========
Implementations may add support at any time, no coordination needed.
Preliminary plan:
Publish caps in 0.9.58 (April 2023);
act on published caps in 0.9.59 (July 2023).
References
==========
.. [NETDB]
{{ site_url('docs/how/network-database', True) }}

View File

@ -0,0 +1,154 @@
===================================
Datagram2 Protocol
===================================
.. meta::
:author: zzz
:created: 2023-01-24
:thread: http://zzz.i2p/topics/3540
:lastupdated: 2023-01-24
:status: Open
:target: 0.9.60
.. contents::
Overview
========
Pulled out from [Prop123]_ as a separate proposal. Copied from [Prop123]_:
Offline signatures cannot be verified in the repliable datagram processing.
Needs a flag to indicate offline signed but there's no place to put a flag.
Will require a completely new protocol number and format.
to be added to the [DATAGRAMS]_ specification.
Let's call it "Datagram2".
Motivation
==========
Left over from LS2 work otherwise completed in 2019.
Design
======
Define new protocol 19 - Repliable datagram with options.
New signature specification.
Specification
=============
Add Datagram2 to [DATAGRAMS]_ as follows:
Format
-------
Preliminary, copied from [Prop123]_:
.. raw:: html
{% highlight %}
From (387+ bytes)
Flags (2 bytes)
Bit order: 15 14 ... 3 2 1 0
Bit 0: If 0, no offline keys; if 1, offline keys
Bits 1-15: set to 0 for compatibility with future uses
If flag indicates offline keys, the offline signature section:
Expires timestamp
(4 bytes, big endian, seconds since epoch, rolls over in 2106)
Transient sig type (2 bytes, big endian)
Transient signing public key (length as implied by sig type)
Signature of expires timestamp, transient sig type,
and public key, by the destination public key,
length as implied by destination public key sig type.
This section can, and should, be generated offline.
Payload
Signature
{% endhighlight %}
Signatures
----------
TBD
Prelude: "DatagramProtocol" ?
SAM
---
Add STYLE=DATAGRAM2
Security Analysis
=================
Notes
=====
Compatibility
===============
None
Migration
=========
Each UDP application must separately detect support and migrate.
Bittorrent DHT: Needs extension flag probably,
e.g. i2p_dg2, coordinate with BiglyBT
Bittorrent UDP Announces [Prop160]_: Design in from the beginning?
Coorindate with BiglyBT, i2psnark, zzzot
Bote: Unlikely
Streamr: Just switch, nobody's using it
SAM UDP apps: None known
References
==========
.. [DATAGRAMS]
{{ spec_url('datagrams') }}
.. [I2CP]
{{ spec_url('i2cp') }}
.. [Prop123]
{{ proposal_url('123') }}
.. [Prop160]
{{ proposal_url('160') }}
.. [BT-SPEC]
{{ site_url('docs/applications/bittorrent', True) }}

View File

@ -0,0 +1,125 @@
===================================
Streaming Updates
===================================
.. meta::
:author: zzz
:created: 2023-01-24
:thread: http://zzz.i2p/topics/3541
:lastupdated: 2023-10-23
:status: Closed
:target: 0.9.58
:implementedin: 0.9.58
.. contents::
Overview
========
Java I2P and i2pd routers older than API 0.9.58 (released March 2023)
are vulnerable to a streaming SYN packet replay attack.
This is a protocol design issue, not an implementation bug.
SYN packets are signed, but the signature of the initial SYN packet sent from Alice to Bob
is not bound to Bob's identity, so Bob may store and replay that packet,
sending it to some victim Charlie. Charlie will think that the packet came from
Alice and respond to her. In most cases, this is harmless, but
the SYN packet may contain initial data (such as a GET or POST) that
Charlie will process immediately.
Design
======
The fix is for Alice to include Bob's destination hash in the signed SYN data.
Bob verifies on reception that that hash matches his hash.
Any potential attack victim Charlie
checks this data and rejects the SYN if it does not match his hash.
By using the NACKs option field in the SYN to store the hash,
the change is backward-compatible, because NACKs are not expected to be included
in the SYN packet and are currently ignored.
All options are covered by the signature, as usual, so Bob may not
rewrite the hash.
If Alice and Charlie are API 0.9.58 or newer, any replay attempt by Bob will be rejected.
Specification
=============
Update [STREAMING]_ to add the following section:
Replay prevention
-----------------
To prevent Bob from using a replay attack by storing a valid signed SYNCHRONIZE packet
received from Alice and later sending it to a victim Charlie,
Alice must include Bob's destination hash in the SYNCHRONIZE packet as follows:
.. raw:: html
{% highlight lang='dataspec' %}
Set NACK count field to 8
Set the NACKs field to Bob's 32-byte destination hash
{% endhighlight %}
Upon reception of a SYNCHRONIZE, if the NACK count field is 8,
Bob must interpret the NACKs field as a 32-byte destination hash,
and must verify that it matches his destination hash.
He must also verify the signature of the packet as usual,
as that covers the entire packet including the NACK count and NACKs fields.
If the NACK count is 8 and the NACKs field does not match,
Bob must drop the packet.
This is required for versions 0.9.58 and higher.
This is backward-compatible with older versions,
because NACKs are not expected in a SYNCHRONIZE packet.
Destinations do not and cannot know what version the other end is running.
No change is necessary for the SYNCHRONIZE ACK packet sent from Bob to Alice;
do not include NACKs in that packet.
Security Analysis
=================
This issue has been present in the streaming protocol since it was created in 2004.
It was discovered internally by I2P developers.
We have no evidence that the issue was ever been exploited.
Actual chance of exploitation success may vary widely depending
on the application-layer protocol and service.
Peer-to-peer applications are probably more likely to be affected
than client/server applications.
Compatibility
===============
No issues. All known implementations currently ignore the NACKs field in the SYN packet.
And even if they did not ignore it, and attempted to interpret it
as NACKs for 8 different messages, those messages would not be outstanding
during the SYNCHRONIZE handshake and the NACKs would not make any sense.
Migration
=========
Implementations may add support at any time, no coordination is needed.
Java I2P and i2pd routers implemented this in API 0.9.58 (released March 2023).
References
==========
.. [STREAMING]
{{ spec_url('streaming') }}

View File

@ -3,8 +3,8 @@ Streaming Protocol Specification
================================
.. meta::
:category: Protocols
:lastupdated: 2023-01
:accuratefor: 0.9.57
:lastupdated: 2023-10
:accuratefor: 0.9.59
.. contents::
@ -34,6 +34,8 @@ Java I2P version in which they were implemented.
============== ================================================================
Router Version Streaming Features
============== ================================================================
0.9.58 Bob's hash in NACKs field of SYN packet
0.9.39 OFFLINE_SIGNATURE option
0.9.36 I2CP protocol number enforced
@ -114,11 +116,15 @@ Framing is provided by the lower layers - I2CP and I2NP.
below.
NACK count :: 1 byte `Integer`
The number of 4-byte NACKs in the next field
The number of 4-byte NACKs in the next field,
or 8 when used together with SYNCHRONIZE for replay prevention
as of 0.9.58; see below.
NACKs :: $nc * 4 byte `Integer`s
Sequence numbers less than ackThrough that are not yet received. Two
NACKs of a packet is a request for a 'fast retransmit' of that packet.
Also used together with SYNCHRONIZE for replay prevention
as of 0.9.58; see below.
resendDelay :: 1 byte `Integer`
How long is the creator of this packet going to wait before
@ -243,6 +249,39 @@ in the option.
If more option fields are defined in the future, they must be accounted for.
Replay prevention
-----------------
To prevent Bob from using a replay attack by storing a valid signed SYNCHRONIZE packet
received from Alice and later sending it to a victim Charlie,
Alice must include Bob's destination hash in the SYNCHRONIZE packet as follows:
.. raw:: html
{% highlight lang='dataspec' %}
Set NACK count field to 8
Set the NACKs field to Bob's 32-byte destination hash
{% endhighlight %}
Upon reception of a SYNCHRONIZE, if the NACK count field is 8,
Bob must interpret the NACKs field as a 32-byte destination hash,
and must verify that it matches his destination hash.
He must also verify the signature of the packet as usual,
as that covers the entire packet including the NACK count and NACKs fields.
If the NACK count is 8 and the NACKs field does not match,
Bob must drop the packet.
This is required for versions 0.9.58 and higher.
This is backward-compatible with older versions,
because NACKs are not expected in a SYNCHRONIZE packet.
Destinations do not and cannot know what version the other end is running.
No change is necessary for the SYNCHRONIZE ACK packet sent from Bob to Alice;
do not include NACKs in that packet.
References
==========

View File

@ -1,3 +1,4 @@
from __future__ import absolute_import
import codecs
from collections import defaultdict
from docutils import io
@ -23,6 +24,7 @@ import os.path
from i2p2www import PROPOSAL_DIR, SPEC_DIR
from i2p2www import helpers
from six.moves import range
SPEC_METATAGS = {

View File

@ -60,3 +60,4 @@ outproxy.bandura.i2p=0ikome0k4G3MdbxO~ZR6VEVUE782Fi4jtAtQ9WYdXhsug~FBbjUqHUlqsX~
wiki.i2p-projekt.i2p=Y2t37BDz4~Th--CvXrSTw03ty7hKdLqi4TV3~GDzcaJwKZ7dHY21w4dVP0H02ZyXikuPwZQYNV~a8zo2ivaWDMUe~WrSAa-t1WL-5W6Rqtleuin84wli-tC1B1k4M1woAi0lKkKRPZijihY3iyywZZLpxcQIlL89~bKvUrjwLcyl9toGb519LhTKrbw0p-E6GLznwWT1~juASxJXYrwx3cSi5PC53MWVhy856WG8xUIXMqg495V9r83frmhq8FJDLaJ0v1WqMxQUQVcx2B8LF2saIg~dUN0Ig3Ke5B7vm7IsgIteZpuOnZyw8DLi0Tfg7ECztwenyvCjx-cciNY8xudy0-biaPMEAjs6YCIz6pyWmxUTR81o2aFIe-hMWSH3gBMLFh10LVLeON~lUNVBv9gLqXJwwgIW7NE0Ap640Re7c5W5kMh-tm4JqyB8V9DTUDfPE2JlTq~f44Ob9ncDbE6lShj1U0~xl3ttoaDWfTo6uC0Bh7x8oMh4aYRNgNdeBQAEAAcAAA==#!action=addsubdomain#date=1579351233#olddest=8ZAW~KzGFMUEj0pdchy6GQOOZbuzbqpWtiApEj8LHy2~O~58XKxRrA43cA23a9oDpNZDqWhRWEtehSnX5NoCwJcXWWdO1ksKEUim6cQLP-VpQyuZTIIqwSADwgoe6ikxZG0NGvy5FijgxF4EW9zg39nhUNKRejYNHhOBZKIX38qYyXoB8XCVJybKg89aMMPsCT884F0CLBKbHeYhpYGmhE4YW~aV21c5pebivvxeJPWuTBAOmYxAIgJE3fFU-fucQn9YyGUFa8F3t-0Vco-9qVNSEWfgrdXOdKT6orr3sfssiKo3ybRWdTpxycZ6wB4qHWgTSU5A-gOA3ACTCMZBsASN3W5cz6GRZCspQ0HNu~R~nJ8V06Mmw~iVYOu5lDvipmG6-dJky6XRxCedczxMM1GWFoieQ8Ysfuxq-j8keEtaYmyUQme6TcviCEvQsxyVirr~dTC-F8aZ~y2AlG5IJz5KD02nO6TRkI2fgjHhv9OZ9nskh-I2jxAzFP6Is1kyAAAA#oldname=i2p-projekt.i2p#oldsig=oYbjpN4ee6NCq4jO1G3bV-6ZzzIw4E5~bSkXdNrKfajZWLHBW9rxTw==#sig=BMaMVYz6rXNGqq5HiVY9KzbaME0-YqsP6lelFntQK~eaxPpQzIHu~FkaUVUl3I8kJ~aWy2u95~Fz2Z8Wu8~~BA==
stormycloud.i2p=ZvTcy3AWfaqfF1ilXT7v7Q9ljT8MR1kbPsqRP3X8rin7DPORIhhfhveOHlZerUy~kSpJxnXHoFSvKzW7MhPVrLNs~aeiFobEEJ06NqTVARCMEL194VOhi7jkNehkvvg07FM3cpT0acA7OSUyx8g7xNATiXyYWjWWvfGc~I1uhdzNLapNksrT5LJdHPNMpjP~QXifz9hLYPf0WM8wrg2uTZ0k3An5YZFt1D4hxOONqiLevOFhnauQlKAFjpJ-h~f1PH3L6-qnwaPJmR0WXeMs3Cm38cIS4QKkjUZfYE66Gn7fnS2uo5mo3VDpufP8jU2fzxwylok4MsHPYQfVloF9SbS5PxCNaHzgyIchOaI4aQ0VEz6YymRrwTGqd515PXvgBxZwFmP8h-aFCWPl~zRK9W0beoBi~Hryf3wLSShjgJyotWEwjn05HV~jzkfd6r8zSev8IErdjqQoL7fwn6BKgp1CMvcsZHROmBpGWHu~pumFZCm2P-iM5U~YvFIEhLXBBQAEAAcAAA==#!date=1653318605#sig=7hrZC5ntQcLteUrJTptovOCMBtsze2WwxrqG-l77AfBJGe9jJFdh7zSvnncsDe9EOwJWFsq~zJwdWPAsL6PSDA==
exit.stormycloud.i2p=Ms6qmq4ZpttjEZK8r7ev38BL8dyT~-ENUK~j74G-nN-WIN7-rUJWbbYAyagQOyerJ31Bf52vtJeXPVHGQdUnbOgBmNkN-Hoo6LkDle1Su7eKYlOrbE2RNihOCh-U0Yq7vDYDBnKI8ldE7s24RY4Nmk1ZlVq8nQwT~RrNf0nbBKBjgGKJkmsfBq6i0G6eZN9Cy2Ip6uGbG70jHzzyAqW9hLUxLArVZKNMAh-fzgGUQkj3llOMqJ5NQqZn2sMrcKkO~c2nn65KNYp2zAGUnbzz3y5M~BOBj9egGYzoakDpGTEpErNj8PiO3oDeKrlgsFFsfmfcMyTKrv82FhBiwxi-izX~P7vo7wcOqhmfic5jqgzY5J-8hEpg0LerjcrW0GjOzHra20GclknvtY5M9m9eUJnRDt43n5IwBrO6-C3VJJLvWvi1gabEP2wuKvAcgHcLn6vU1reqS7QwT~Y-bteoUEw1gZ-GCPkRhGKmr6d2NyxLzEEJispBLoCoTWKPZCHkBQAEAAcAAA==#!action=addsubdomain#date=1654125792#olddest=ZvTcy3AWfaqfF1ilXT7v7Q9ljT8MR1kbPsqRP3X8rin7DPORIhhfhveOHlZerUy~kSpJxnXHoFSvKzW7MhPVrLNs~aeiFobEEJ06NqTVARCMEL194VOhi7jkNehkvvg07FM3cpT0acA7OSUyx8g7xNATiXyYWjWWvfGc~I1uhdzNLapNksrT5LJdHPNMpjP~QXifz9hLYPf0WM8wrg2uTZ0k3An5YZFt1D4hxOONqiLevOFhnauQlKAFjpJ-h~f1PH3L6-qnwaPJmR0WXeMs3Cm38cIS4QKkjUZfYE66Gn7fnS2uo5mo3VDpufP8jU2fzxwylok4MsHPYQfVloF9SbS5PxCNaHzgyIchOaI4aQ0VEz6YymRrwTGqd515PXvgBxZwFmP8h-aFCWPl~zRK9W0beoBi~Hryf3wLSShjgJyotWEwjn05HV~jzkfd6r8zSev8IErdjqQoL7fwn6BKgp1CMvcsZHROmBpGWHu~pumFZCm2P-iM5U~YvFIEhLXBBQAEAAcAAA==#oldname=stormycloud.i2p#oldsig=N1FSIv1OYX~CDdJiGNPtmVvvNQG7LFzGZzyWH9g0d~HMLc-igxUwsp6mWO9oIFePr~-D-eZ-wewUYmaKBm89Bg==#sig=bLFzyq9ubUO0dvuAnKCiz02EI4xj4Fb6l1C0Z~c-gZPYiWo7VWoMBUdib2L5kBNCRyj7Mx--zKHfGOOuWoGOBw==
ramble.i2p=xyOqhmjnO6Sc-t~2aeSW31bNkYTmhfHdQ7lYV-ENZ2AtkzMm4EsuNZLBQ9pMLV5ADc7lB1~l0q6jB~qstXL~vkIyPjfLWFSma0bCawCLgQrnC4RB3cbYxCF4CrD~-6Vb2GvV4jhrEnBLixtTqXMtW00otmuuzwWS80Pus4laOy066PuPPZR9QebY18W5Ae7-Hgaz92KNjtkkFe3IjPi05vM0g3rLiXpL-69hgyEy-1plJikdGD4wtiPmHr6utB5GVXvU4pBI0g-0CW9-OXDjAZLwBK33hVIGgDudYOmxiw-mAi227AIZBS~t-uQJHsyRZ0FWs0Kmj2mGupqz2fThuUW-UNOJL3FyvgTJawZ5Y4y0-76szgc~o6s33fnTQTwD1UdGXAy1TcRsUh16wyR-3lS8Ig6foTlzTD-LO0PF7WSWZzatwk6aQdTgjNW72a33DISA7Ry6G5M9J321XHyA52SpkbyqPxSj-BjqZX-vGozShBe1Q3fgkFzUPTnax-QNBQAEAAcAAA==#!date=1607587030#sig=Oq-xYrbUQkBqVU39e8-KX5-uSyemy3iStol-CU3lu2KBkmeDDL0KeuETM-kKat2cR4q3B4DpGFRlRlZq~rYaCA==

View File

@ -153,18 +153,18 @@ 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
@ -253,7 +253,7 @@ hMIuXhrBXYogeXaAhvDmDghf4fvPsLQ/mcpWm7KnfniRAeujB2j1Icz8PJzh2uZ8
PNQcWczkMNs7EigCBTjZ4lDC0ETt/xYFy7iO6lcgZM6tIKDOTNzWuH5sU0jdPB71
uPnRAf2gILLD9DV4dPyepTnjCb1vJFVUyYwQMLCk9qHHfS10agL8/HBq49tharsL
0/gvr1/+uR3xoSHAZP/GojGmFd7Yh3ogXXOilbJhsdgnjIkEWwQYAQoAJgIbAhYh
BHhA52EPKLkEdTVJ12fs5WBbzxNGBQJhO2zlBQkR67OvAinBXSAEGQEKAAYFAlMs
BHhA52EPKLkEdTVJ12fs5WBbzxNGBQJlGYJRBQkVojwbAinBXSAEGQEKAAYFAlMs
fjYACgkQ0kHOvzyrXgYJJg/7BQagkXz4uxLu1wfMHD0ZUrXjVAgNq+mKUDGsCVPI
6ULPsPlzptyl6v7NJIR12Kb7YKrTXlmGSBNsyUNaYHXPRn2EYTx7ix+JCx1Kq3eO
lOob3HtfKdd3hl0d480XULgE+iSwsb52RwkVinX52+vfOs0D5APmEwd4+a5QoUZb
@ -265,16 +265,16 @@ KwfcEoj9+mGOFUrZSKNHiUdT0IGW43dMqMMKiki1sLHX4kxlVtSXgXzteZiOEby0
corySfd9pqxyQetCPWft+yDUMAX/Ax1u5+4bBsD5qzm4MFfcM393A25rwou8Bq4R
MWmhKQhzJXG4DnBlgrhJeg44s51ucpfY0PGfYFe5MRGACRg8ji6/vZe/yU8wue60
BUtTdjp01n51Bb9mZTJzSVjCkg7f7FH9hdyTgJljLxPLuu/e0f+oqS7boQX4G32X
6kUJEGfs5WBbzxNGogkP/RL1fYK3cC0CvYZF1NqqPAXcFp5hSifsLRqKfCJHZn4P
SfaYmlq6kvBjtduMbWXzfzzMpbtAd4HQxgSBh22O+C38K8LhOHgtafiU961Iw8Es
N8OyTE4IVs8T5aWa9F/Y1Kra5AX9eOB4Jlwo74yMKQbNBTjbFvO86sPRB1Ny/Uih
LyYNiy7YTmmPrDryj+F9i8wYsi/X7hsIOTKk1NrFlGgNy1we4ltI3z1Yp1TVGB7C
ZbOExL5yavgB9Hjlh3oN/aIUNoJhPjCCgQ172W5awni6TOkhlICmVzJZ20QWyF/C
7XAiHiTCovw1yUXF0QsSErvh8AsRkYni/AMGQRc9QbLQjFvFd7swlgzIL0mvsTec
sCltksPh2jRNWm+MyrkREOZNX+r6weLhPCPm/3cphBXz/PG/JV3Cj/wAAYRroKhN
3DNMRM7AonvLnE1PuvFROgBvci8VVShDmNRl27SIxCLKS1syO1cP9BZaFvzuvK99
uPJvLJoWZIJt5h0bgFC5vb5sVLQPYt0CfWsc+nyhamc6IiRuHKGcP79FqMMp+KJ9
W6ZoTWO7urfPGLtyHXCSprr9VGy0n+RswFeK3bpCVtGZvBSmIoF0XfqosfWFCwxI
f1tXwL7zv4M93RY/kcwEJeDTDTs168VrLkpASaTqJ6BGaxbsn0Q2/d0p8nzBPUSa
=DSs3
6kUJEGfs5WBbzxNG6RQQAKk8zkerNDVIX/RukRyI6W80Q4+x8NdPMOlk4j3ExNC5
YFOwQck6YNYU/F0HpQRQs9tPYE8OmxvJ2KIUZjnhapRGIM2Mp0nfFu8W9ke0gylx
A1AzMWH+09H1Qs8mijD1OYxjmtYsGevSx2YDb/zA5pfe1Mt51ZVDt7IvOSmz5ePf
ovgU3HQYmCBlAPD+Q/XFyGUa2rioTvOr0/oxo9gOpnRHJ3TzyeXjDIEL7B+2LvjO
NQkLTEr7tQqEmHnfr0TOJlTXWusMxQAwPQ0uMMSTd39GieTwLz8vLW+h0vu0hsZF
M3Bp/f+NhGBzMRmwp2eEO6qC45Ggx1+01ttxqqMajDa9B6TPTse5N52hajAN6dl9
im9TFk6jTsBQSS1gKG5KT+CtwtcxnXUra8m8/j3UGKdcCaFlSYDT5uf+eHCDog2S
uMyiuFmgfdbXWVk1w4Ps5FEEPg/cZDjqZSN5brxtyl+kAKvvcfuzPrUbzLQZXteV
O0dzqVA05NxmgwoEKvaOTkg6dDjL+gmilDJjNDEvPEN1yj8PMq52YiXpLIosvYMX
P2KAMAsWEoeooPds+fd9Yr41qHtP5OVSbVuNOj4NRJDBz6vBy00vVnnuRTca24jT
xjesA1GVPD9hO9qYFHK8ntO6GtmKEbTa9jDZEVJnQ6yDs9v6WXTC/ZskszL4euma
=Tgt6
-----END PGP PUBLIC KEY BLOCK-----

View File

@ -1,63 +1,98 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=5V4x
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
=i+Zz
-----END PGP PUBLIC KEY BLOCK-----

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 KiB

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 309 KiB

After

Width:  |  Height:  |  Size: 242 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 32 KiB

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