Compare commits
114 Commits
Author | SHA1 | Date | |
---|---|---|---|
deb775d243 | |||
8ebc4de1a7 | |||
53b17e206f | |||
7fec0b308f | |||
8db113d0aa | |||
b1a1debef3 | |||
9772a4ed05 | |||
23bed0f483 | |||
496b65274a | |||
7053ae1db3 | |||
7df3407db9 | |||
4e3370b852 | |||
c8f9788e00 | |||
3b0794554c | |||
ca7351592a | |||
bfc73085b0 | |||
6c0e4bb387 | |||
73dc961c79 | |||
7686adfc06 | |||
f13dc8b7ff | |||
e2ffb5e96c | |||
8f7b30078d | |||
b036f269a6 | |||
fa988e6f5b | |||
66d51d4a57 | |||
a8c09545ad | |||
67ce4b6bb1 | |||
4d66666202 | |||
58883084a8 | |||
f3968a1e1b | |||
956ce97006 | |||
a67f32aaca | |||
41a6d50612 | |||
217475ddc9 | |||
2ab41d3c85 | |||
c900f779d9 | |||
9c9547cd60 | |||
09a8ef4fa2 | |||
fedce0aef0 | |||
96088162ed | |||
e81d87724b | |||
c72cbc05fc | |||
8f85913228 | |||
86053fae8d | |||
f6034d6462 | |||
15c827b822 | |||
b307f171de | |||
771f2f63ae | |||
6b35d8f4e8 | |||
300a987392 | |||
12da3aee87 | |||
8080799be5 | |||
41cc69c774 | |||
84d35a67c7 | |||
e0e6a2fa76 | |||
c5ec52dd1f | |||
94d206b798 | |||
8ba3b11b03 | |||
23eb1c5489 | |||
d68fb34dda | |||
acc1d99b34 | |||
9ad45220b8 | |||
fff7c1f9ec | |||
09e20cb0ba | |||
92edebf1fd | |||
9bd163e3e5 | |||
9f1bb7156e | |||
592c7ae638 | |||
4579c6deed | |||
bd2b0ae0bb | |||
173790ed7c | |||
37442a469e | |||
62354cbdcb | |||
a400346f8d | |||
6eab2587a7 | |||
1f67ec12e7 | |||
0281b67bc4 | |||
cbf762852c | |||
55d09a4ca6 | |||
32ea161bdf | |||
6e6e876750 | |||
32c1addde8 | |||
3facee99b1 | |||
d64e3b76ab | |||
a906af63f7 | |||
996953e289 | |||
f544a40229 | |||
2f768fd6d2 | |||
a030fbae4a | |||
224305f501 | |||
4cac8d8541 | |||
9e78559e80 | |||
5cb31ea847 | |||
a618bb279d | |||
7107a2960a | |||
5162dc2d24 | |||
980fc185d5 | |||
2bb222187d | |||
d0459ba062 | |||
d08ac133f8 | |||
b8f5804525 | |||
90a39f35d6 | |||
70cc78b17f | |||
d616bd3156 | |||
9942f1ddf6 | |||
bdca9c7042 | |||
30d9fe1622 | |||
d513dcc95d | |||
d0787a33ad | |||
fb150533bc | |||
18c83f465a | |||
9500378ef7 | |||
bf1c5c2748 | |||
194f65bdb3 |
82
.tx/config
@ -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
|
||||
|
||||
|
13
Dockerfile
@ -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 && \
|
||||
|
49
README.md
@ -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:
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
20
etc/reqs.txt
@ -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
|
@ -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
|
||||
|
@ -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("&", "&")
|
||||
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())
|
||||
|
||||
|
@ -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]
|
||||
|
@ -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")
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
|
@ -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])
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
from __future__ import absolute_import
|
||||
from flask import render_template
|
||||
|
||||
from i2p2www import ANONBIB_CFG, ANONBIB_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(" ", " ")
|
||||
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])
|
||||
|
||||
|
@ -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
|
||||
|
64
i2p2www/blog/2023/01/31/mac-easy-install-notarization.rst
Normal 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 %}
|
@ -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 %}
|
14
i2p2www/blog/2023/03/13/i2p-release-2.2.0.rst
Normal 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 %}
|
89
i2p2www/blog/2023/03/13/new_release_2.2.0.rst
Normal 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
|
67
i2p2www/blog/2023/06/25/new_release_2.3.0.rst
Normal 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
|
@ -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>`_
|
||||
|
||||
|
40
i2p2www/blog/2023/4/12/new_release_2.2.1.rst
Normal 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
|
@ -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)
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
from __future__ import absolute_import
|
||||
from flask import redirect, render_template, request
|
||||
from i2p2www import CURRENT_I2P_VERSION, MIRRORS_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',
|
||||
|
@ -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):
|
||||
|
@ -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
|
||||
|
||||
|
@ -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 \
|
||||
|
@ -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)
|
||||
|
@ -1,3 +1,4 @@
|
||||
from __future__ import absolute_import
|
||||
from pygments.lexer import RegexLexer, bygroups
|
||||
from pygments.token import *
|
||||
|
||||
|
@ -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:
|
||||
|
153
i2p2www/meetings/logs/320.log
Normal 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
|
14
i2p2www/meetings/logs/320.rst
Normal file
@ -0,0 +1,14 @@
|
||||
I2P dev meeting, February 07, 2023 @ 20:00 UTC
|
||||
==============================================
|
||||
|
||||
Quick recap
|
||||
-----------
|
||||
|
||||
* **Present:**
|
||||
|
||||
eyedeekay,
|
||||
zzz,
|
||||
not_bob,
|
||||
echelonMAC,
|
||||
obscuratus
|
||||
|
@ -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
|
||||
|
@ -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: -->
|
||||
|
@ -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 -%}
|
||||
|
@ -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>
|
||||
|
@ -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">
|
||||
|
@ -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">
|
||||
|
@ -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:
|
||||
|
176
i2p2www/pages/downloads/macos.html
Normal 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 %}
|
@ -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' -%}
|
||||
|
@ -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>
|
||||
|
@ -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,
|
||||
}
|
||||
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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 %}… 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>
|
||||
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
<- 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.
|
||||
|
@ -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>
|
||||
|
@ -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 %}
|
||||
|
@ -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' -%}
|
||||
|
@ -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 -%}
|
||||
|
@ -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>
|
||||
|
@ -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% 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>
|
||||
|
@ -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
|
||||
|
@ -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".
|
||||
|
@ -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>
|
||||
|
@ -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> — {% 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> — {% 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> — {% 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> — {% 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> — {% 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> — {% 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> — {% 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> — {% 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> — {% 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 %}
|
||||
|
@ -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 %}
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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))
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
149
i2p2www/spec/proposals/162-congestion-caps.rst
Normal 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) }}
|
154
i2p2www/spec/proposals/163-datagram2.rst
Normal 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) }}
|
125
i2p2www/spec/proposals/164-streaming.rst
Normal 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') }}
|
@ -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
|
||||
==========
|
||||
|
||||
|
@ -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 = {
|
||||
|
@ -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==
|
||||
|
@ -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-----
|
||||
|
@ -1,63 +1,98 @@
|
||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
mQENBFllPP4BCAC00FYAOPuUWVbUcli+MY5U62AHhg3qXu2FMwdi4WJPP38e4Py1
|
||||
xsBNBFllPP4BCAC00FYAOPuUWVbUcli+MY5U62AHhg3qXu2FMwdi4WJPP38e4Py1
|
||||
bYXv3q8kgc4mq/wG2Y0KQtbpJ1sx4ZHv26Ipa2bZH6WyBX+hUc5tzXEe98kBjdXO
|
||||
Pv/RYfUryhfsLpTdzaH0zvaC24gYxP3lpv046X91PvJ9nRgtgRrmGlFnybtDApeA
|
||||
JEdY144EAqt3SVP/tMMGCmrM+0guaDR1N6iLNF0RdpLoplJ/8FrjCwIn7fvvx0gR
|
||||
94anhYBkW3I33NMArQTFDf7blbw3LryVyHtH/3/xnbrQ8d3ISYy2CfP5l8pTNKQh
|
||||
kaSi18O27fL5KS45VxPdt6IuApn0bEqYC8bbABEBAAG0I2V5ZWRlZWtheSA8ZXll
|
||||
ZGVla2F5QHNhZmUtbWFpbC5uZXQ+iQFXBBMBCABBAhsDBQsJCAcCBhUICQoLAgQW
|
||||
AgMBAh4BAheAAhkBFiEEcNIGBzi++AUjrK/311wDs5teFOEFAmPLXQMFCQpst4UA
|
||||
CgkQ11wDs5teFOHuFgf+O22rvadtee/GqayKwrkEZ3SQ/jaJ4Az2fYdDR3Vy0Qx6
|
||||
bRRyHu+9IWQrTsgNyRAiPdZszcKQLFdezW53wDzf+yF2J2loYpuKVkquOSbQVFqL
|
||||
IA+0snPncllAU4cYISNzYULyG8PjwUz8/vBPoF223vaQebGA7PJJ9i8FdrFrH0IJ
|
||||
dgt/zfW5i04xDfKO0kx6eZFjSUUSrWlCCDC1Ww+WkJEUZxyBf+iAevcMTEW/6Kwe
|
||||
BMR8OEhlYUN58NKKB9foAbw9sDDM3dzuTc9zGYFBqIuCsfZ5asI4z4MJasP9PSbU
|
||||
FtunqSgGpiyDWkdD3LfuBY1lrB6TRcM6qPUbaUzvHbQjZXllZGVla2F5IDxoYW5r
|
||||
aGlsbDE5NTgwQGdtYWlsLmNvbT6JAVQEEwEKAD4CGwMFCwkIBwIGFQoJCAsCBBYC
|
||||
AwECHgECF4AWIQRw0gYHOL74BSOsr/fXXAOzm14U4QUCY8tdAwUJCmy3hQAKCRDX
|
||||
XAOzm14U4eayB/9vaGD0j1AkWAqqhwr003/MXEt+3Z7veDwmT5gECs3Of77XWmVx
|
||||
ChW50cgj3uQpKdpozURK03vio3plsSf8Lci3Lg/SGSwoMy7ieLcsCek/D+/hUmCW
|
||||
gISm2o9B17iYB2cI9uBDcFdTXQsZYvWaC82NArbczPwfKlziYpa5KmwO7m6VAB7b
|
||||
MgOef6KynPZwoiE52kXb7RBs/3RgkDH9aVbKC6IDbsXYKksWPiIdlvEfq0eDsZKC
|
||||
uW08dfwLb5HxLD0q2ZmZX2fCv2RpnkD9JKES5pf/G7lozDmfSiBsdvzUJrI1iEpP
|
||||
6+00zEd6mV0WyJTbVOBhaFKJIAyLHYmuOgMgtClleWVkZWVrYXkgPHByb2JsZW1z
|
||||
b2x2ZXJAb3Blbm1haWxib3gub3JnPokBVAQTAQgAPgIbAwULCQgHAgYVCAkKCwIE
|
||||
FgIDAQIeAQIXgBYhBHDSBgc4vvgFI6yv99dcA7ObXhThBQJjy10DBQkKbLeFAAoJ
|
||||
ENdcA7ObXhThmC0H/1cXZLyaI0l8uOzPMYpnnwEWZhdZZp7hAS0Ckmdmupp2IL+T
|
||||
9dOyqYj7km+4siXkJ8x+MqA+gDkvJyE4m76Cxk4lypS4uEG9ItJtCtyK42uN/X+r
|
||||
WOVBoBEKtK9SJP0tPSImZ2wwxX/s0UoDiIK/EIctk9LxnICchXteC2dWxXYPd+ts
|
||||
MMqyebi7keAAFBlPGuZIxUxwlLN1Ea8k11l5FFLVNgclUrAp2KIQKks1VzbypwJn
|
||||
JBOlpw3AG2Ywac9RF2lSk/ytuanXEXVs7OToACFmtOJF+6l/V7YLrd8DyvmGHFBC
|
||||
Q7J396CWFJoVym7NrnfDpwPNwAYq5Bt1HwtWTEK0OmV5ZWRlZWtheSAoYWxpYXMg
|
||||
Zm9yIGlka2kycEBpMnBtYWlsLm9yZykgPGlka2kycEBtYWlsLmkycD6JAVQEEwEK
|
||||
AD4CGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AWIQRw0gYHOL74BSOsr/fXXAOz
|
||||
m14U4QUCY8tdAwUJCmy3hQAKCRDXXAOzm14U4WY1B/0f0P8PjKYNdDxjwSoEmW2q
|
||||
bbqSAjOGYZw6rZshcpbwiRY9XEhkgbucvDOFqtvKllXjquNUEc1nN2EFacqcspys
|
||||
6aQh338H0rGBXazb0kbHMMpUizHasdUYQaS55abzrNDRwva44KXAbXUtFqCON3+z
|
||||
Zun31IB2FOpENR+nceVp2TGormZHnniqeCq7zQ6duIoLuBRhqpBOLhRj3ntfTFxk
|
||||
cIpCFpOyZ4mCrwigFd939o+qwoK6jNyiVe7FLx9zR9i+siOCVUxx+X7qQ8WAalCO
|
||||
zPQTiykEQtx4jzXu2X/cGOmIjoc1KYYQzB+qW2n4iLmztw1KDLNKWzfsAxP4SCru
|
||||
tDpleWVkZWVrYXkgKGFsaWFzIGZvciBpZGtpMnBAbWFpbC5pMnApIDxpZGtpMnBA
|
||||
aTJwbWFpbC5vcmc+iQFUBBMBCgA+AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheA
|
||||
FiEEcNIGBzi++AUjrK/311wDs5teFOEFAmPLXQMFCQpst4UACgkQ11wDs5teFOG3
|
||||
2wf9FVqS+R0Rqmp7+ZbLZ1raKzEjtHu1U9vVWQ33KcJJ5Vzq5XDSu5gS5zOk0Wwv
|
||||
YTx3RNiNyQcfCkYIi46QakuxE7IEwHFgCXfSM0I7hy5rvsXaNpwtYwTbMi7uukt6
|
||||
+6bnGpsumsZPMaYlcBkErOQYj9M9kUeVk4ixFWr3Plve4Ki3yjWfdn8Nkn8qjDGt
|
||||
oge/y8WPyR/f5fpfQZ5hAFEpwu3KakcFU8bzRnav5dery8yxkrUfckpNtQDxTMHc
|
||||
HZ0RhXek+2S9HM/QlCetkIjBsY1o5M7JEjlsKug/uNRMrJ1NWZrvEyLsFS+Zk7Bl
|
||||
hMepcy//0Hu2+dQn0Wcm4cLs4rkBDQRZZTz+AQgAuZSkn0lRHxkS3IhtXowYREQb
|
||||
Qq9jIc51nYNvangbFTK4EoqzVHCP6eMFLr9RtbnxvDD8/VnT2KR2AWyK5qWIV/Zs
|
||||
FsAShPzCKY5Taees2ZP5cV4CPQH5pJQq0tKfu97lKAkzYxtf/f5oKf+SMnLahTkn
|
||||
VbsL4JBJjk/j3zM4uL0WGa6sEGf6S+AcSzzd1s1a9M21kbUwF7xFm+Nh+e8/vGT5
|
||||
ZcKJW7ACsyhcNym9qsNNaO/SIqf9FenPsM7gXa78CzW0XH1DVSBoUbpnnzGt88kF
|
||||
lBHCqXvqNrKRsMQzxJJWJJ1aAm4Z0COpOU7m6vtImootQjr0//QtISSupKQSewAR
|
||||
AQABiQE8BBgBCAAmAhsMFiEEcNIGBzi++AUjrK/311wDs5teFOEFAl4SHx0FCQpQ
|
||||
fJ8ACgkQ11wDs5teFOHLggf/VE7IZx5ZfhRCWAB31pu6ttpwVZ6vH268QlUyiMDj
|
||||
Yt/XwG6zvNQooBFNfzsJNUNAToMkk17rpr/3/U1/e/Q91y+aThl2Z84OVRSqGfIB
|
||||
gDBKM9J19dOGs/4sbowVWoHZ5vPjzGTMCjNEczW4Mqru9WdnlauFvcdVSvK1vMT5
|
||||
sj/TEEqeNlTiKw5V9MQOTZzFyluvrhpAS2HwP8vq4yNRp/fD5Vbniodbf2M8IEDO
|
||||
fBJ4dRmdf2LT3IsYM5sjvfaP6tahSNVkjReE107ZZfSopH0euJ72C1ZnxYLjUFM+
|
||||
6HGvH/LHEo5KY/P3DRqA48Xro/6DQ2maqsiYcAw+H9/0wg==
|
||||
=5V4x
|
||||
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
|
||||
=i+Zz
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
|
Before Width: | Height: | Size: 115 KiB After Width: | Height: | Size: 115 KiB |
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 66 KiB |
Before Width: | Height: | Size: 140 KiB After Width: | Height: | Size: 140 KiB |
Before Width: | Height: | Size: 164 KiB After Width: | Height: | Size: 158 KiB |
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 6.7 KiB |
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 8.7 KiB |
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 87 KiB |
Before Width: | Height: | Size: 309 KiB After Width: | Height: | Size: 242 KiB |
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 32 KiB |