mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-03-07 06:09:42 +00:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3ab5ac66b6 |
@@ -1,39 +0,0 @@
|
|||||||
# editorconfig.org
|
|
||||||
|
|
||||||
root = true
|
|
||||||
|
|
||||||
[*]
|
|
||||||
# Unix style files
|
|
||||||
end_of_line = lf
|
|
||||||
charset = utf-8
|
|
||||||
trim_trailing_whitespace = true
|
|
||||||
insert_final_newline = true
|
|
||||||
|
|
||||||
[Makefile,Makefile.*]
|
|
||||||
indent_style = tab
|
|
||||||
indent_size = 4
|
|
||||||
|
|
||||||
[*.cmd]
|
|
||||||
indent_style = space
|
|
||||||
indent_size = 2
|
|
||||||
end_of_line = crlf
|
|
||||||
|
|
||||||
[*.{h,cpp}]
|
|
||||||
indent_style = tab
|
|
||||||
indent_size = 4
|
|
||||||
|
|
||||||
[*.rc]
|
|
||||||
indent_style = space
|
|
||||||
indent_size = 4
|
|
||||||
|
|
||||||
[*.{md,markdown}]
|
|
||||||
indent_style = space
|
|
||||||
indent_size = 2
|
|
||||||
trim_trailing_whitespace = false
|
|
||||||
|
|
||||||
[*.yml]
|
|
||||||
indent_style = space
|
|
||||||
indent_size = 2
|
|
||||||
|
|
||||||
[*.patch]
|
|
||||||
trim_trailing_whitespace = false
|
|
||||||
39
.github/workflows/build-deb.yml
vendored
39
.github/workflows/build-deb.yml
vendored
@@ -1,39 +0,0 @@
|
|||||||
name: Build Debian packages
|
|
||||||
|
|
||||||
on: [push, pull_request]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
name: ${{ matrix.dist }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
dist: ['buster', 'bullseye', 'bookworm']
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Build package
|
|
||||||
uses: jtdor/build-deb-action@v1
|
|
||||||
with:
|
|
||||||
docker-image: debian:${{ matrix.dist }}-slim
|
|
||||||
buildpackage-opts: --build=binary --no-sign
|
|
||||||
before-build-hook: debchange --controlmaint --local "+${{ github.sha }}~${{ matrix.dist }}" -b --distribution ${{ matrix.dist }} "CI build"
|
|
||||||
extra-build-deps: devscripts git
|
|
||||||
|
|
||||||
- name: Upload package
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: i2pd_${{ matrix.dist }}
|
|
||||||
path: debian/artifacts/i2pd_*.deb
|
|
||||||
|
|
||||||
- name: Upload debugging symbols
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: i2pd-dbgsym_${{ matrix.dist }}
|
|
||||||
path: debian/artifacts/i2pd-dbgsym_*.deb
|
|
||||||
19
.github/workflows/build-freebsd.yml
vendored
19
.github/workflows/build-freebsd.yml
vendored
@@ -4,29 +4,18 @@ on: [push, pull_request]
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: macos-10.15
|
||||||
name: with UPnP
|
name: with UPnP
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- uses: actions/checkout@v2
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Test in FreeBSD
|
- name: Test in FreeBSD
|
||||||
id: test
|
id: test
|
||||||
uses: vmactions/freebsd-vm@v1
|
uses: vmactions/freebsd-vm@v0.1.5
|
||||||
with:
|
with:
|
||||||
usesh: true
|
usesh: true
|
||||||
mem: 2048
|
mem: 2048
|
||||||
sync: rsync
|
prepare: pkg install -y devel/cmake devel/gmake devel/boost-libs security/openssl net/miniupnpc
|
||||||
copyback: true
|
|
||||||
prepare: pkg install -y devel/cmake devel/gmake devel/boost-libs security/openssl net/miniupnpc
|
|
||||||
run: |
|
run: |
|
||||||
cd build
|
cd build
|
||||||
cmake -DWITH_UPNP=ON -DCMAKE_BUILD_TYPE=Release .
|
cmake -DWITH_UPNP=ON -DCMAKE_BUILD_TYPE=Release .
|
||||||
gmake -j2
|
gmake -j2
|
||||||
|
|
||||||
- name: Upload artifacts
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: i2pd-freebsd
|
|
||||||
path: build/i2pd
|
|
||||||
|
|||||||
8
.github/workflows/build-osx.yml
vendored
8
.github/workflows/build-osx.yml
vendored
@@ -6,21 +6,15 @@ jobs:
|
|||||||
build:
|
build:
|
||||||
name: With USE_UPNP=${{ matrix.with_upnp }}
|
name: With USE_UPNP=${{ matrix.with_upnp }}
|
||||||
runs-on: macOS-latest
|
runs-on: macOS-latest
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: true
|
fail-fast: true
|
||||||
matrix:
|
matrix:
|
||||||
with_upnp: ['yes', 'no']
|
with_upnp: ['yes', 'no']
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- uses: actions/checkout@v2
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: install packages
|
- name: install packages
|
||||||
run: |
|
run: |
|
||||||
find /usr/local/bin -lname '*/Library/Frameworks/Python.framework/*' -delete
|
|
||||||
brew update
|
brew update
|
||||||
brew install boost miniupnpc openssl@1.1
|
brew install boost miniupnpc openssl@1.1
|
||||||
|
|
||||||
- name: build application
|
- name: build application
|
||||||
run: make HOMEBREW=1 USE_UPNP=${{ matrix.with_upnp }} PREFIX=$GITHUB_WORKSPACE/output -j3
|
run: make HOMEBREW=1 USE_UPNP=${{ matrix.with_upnp }} PREFIX=$GITHUB_WORKSPACE/output -j3
|
||||||
|
|||||||
52
.github/workflows/build-windows-msvc.yml
vendored
52
.github/workflows/build-windows-msvc.yml
vendored
@@ -1,52 +0,0 @@
|
|||||||
name: Build on Windows with MSVC
|
|
||||||
|
|
||||||
on: [push, pull_request]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
name: Build
|
|
||||||
runs-on: windows-latest
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Build and install zlib
|
|
||||||
run: |
|
|
||||||
powershell -Command "(Invoke-WebRequest -Uri https://raw.githubusercontent.com/r4sas/zlib.install/master/install.bat -OutFile install_zlib.bat)"
|
|
||||||
powershell -Command "(Get-Content install_zlib.bat) | Set-Content install_zlib.bat" # fixing line endings
|
|
||||||
set BUILD_TYPE=Debug
|
|
||||||
./install_zlib.bat
|
|
||||||
set BUILD_TYPE=Release
|
|
||||||
./install_zlib.bat
|
|
||||||
del install_zlib.bat
|
|
||||||
|
|
||||||
- name: Install Boost
|
|
||||||
uses: crazy-max/ghaction-chocolatey@v2
|
|
||||||
with:
|
|
||||||
args: install boost-msvc-14.3 --version=1.81.0
|
|
||||||
|
|
||||||
- name: Install OpenSSL
|
|
||||||
uses: crazy-max/ghaction-chocolatey@v2
|
|
||||||
with:
|
|
||||||
args: install openssl
|
|
||||||
|
|
||||||
- name: Configure
|
|
||||||
working-directory: build
|
|
||||||
run: cmake -DWITH_STATIC=ON .
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
working-directory: build
|
|
||||||
run: cmake --build . --config Debug -- -m
|
|
||||||
|
|
||||||
- name: Upload artifacts
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: i2pd-msvc
|
|
||||||
path: build/Debug/i2pd.*
|
|
||||||
|
|
||||||
86
.github/workflows/build-windows.yml
vendored
86
.github/workflows/build-windows.yml
vendored
@@ -8,106 +8,44 @@ defaults:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
name: ${{ matrix.arch }}
|
name: Building using ${{ matrix.arch }} toolchain
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: true
|
||||||
matrix:
|
matrix:
|
||||||
include: [
|
include: [
|
||||||
{ msystem: UCRT64, arch: ucrt-x86_64, arch_short: x64-ucrt, compiler: gcc },
|
{ msystem: UCRT64, arch: ucrt-x86_64, arch_short: x64-ucrt },
|
||||||
{ msystem: CLANG64, arch: clang-x86_64, arch_short: x64-clang, compiler: clang },
|
{ msystem: MINGW64, arch: x86_64, arch_short: x64 },
|
||||||
{ msystem: MINGW64, arch: x86_64, arch_short: x64, compiler: gcc },
|
{ msystem: MINGW32, arch: i686, arch_short: x86 }
|
||||||
{ msystem: MINGW32, arch: i686, arch_short: x86, compiler: gcc }
|
|
||||||
]
|
]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- uses: actions/checkout@v2
|
||||||
uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Setup MSYS2
|
- name: Setup MSYS2
|
||||||
uses: msys2/setup-msys2@v2
|
uses: msys2/setup-msys2@v2
|
||||||
with:
|
with:
|
||||||
msystem: ${{ matrix.msystem }}
|
msystem: ${{ matrix.msystem }}
|
||||||
install: base-devel git mingw-w64-${{ matrix.arch }}-${{ matrix.compiler }} mingw-w64-${{ matrix.arch }}-boost mingw-w64-${{ matrix.arch }}-openssl mingw-w64-${{ matrix.arch }}-miniupnpc
|
install: base-devel mingw-w64-${{ matrix.arch }}-gcc mingw-w64-${{ matrix.arch }}-boost mingw-w64-${{ matrix.arch }}-openssl mingw-w64-${{ matrix.arch }}-miniupnpc
|
||||||
update: true
|
update: true
|
||||||
|
|
||||||
- name: Install additional clang packages
|
|
||||||
if: ${{ matrix.msystem == 'CLANG64' }}
|
|
||||||
run: pacman --noconfirm -S mingw-w64-${{ matrix.arch }}-gcc-compat
|
|
||||||
|
|
||||||
- name: Build application
|
- name: Build application
|
||||||
run: |
|
run: |
|
||||||
mkdir -p obj/Win32 obj/libi2pd obj/libi2pd_client obj/daemon
|
mkdir -p obj/Win32 obj/libi2pd obj/libi2pd_client obj/daemon
|
||||||
make USE_UPNP=yes DEBUG=no USE_GIT_VERSION=yes -j3
|
make USE_UPNP=yes DEBUG=no USE_GIT_VERSION=yes -j3
|
||||||
|
|
||||||
- name: Upload artifacts
|
- name: Upload artifacts
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
name: i2pd-${{ matrix.arch_short }}.exe
|
name: i2pd-${{ matrix.arch_short }}.exe
|
||||||
path: i2pd.exe
|
path: i2pd.exe
|
||||||
|
|
||||||
build-cmake:
|
|
||||||
name: CMake ${{ matrix.arch }}
|
|
||||||
runs-on: windows-latest
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include: [
|
|
||||||
{ msystem: UCRT64, arch: ucrt-x86_64, arch_short: x64-ucrt, compiler: gcc },
|
|
||||||
{ msystem: CLANG64, arch: clang-x86_64, arch_short: x64-clang, compiler: clang },
|
|
||||||
{ msystem: MINGW64, arch: x86_64, arch_short: x64, compiler: gcc },
|
|
||||||
{ msystem: MINGW32, arch: i686, arch_short: x86, compiler: gcc }
|
|
||||||
]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Setup MSYS2
|
|
||||||
uses: msys2/setup-msys2@v2
|
|
||||||
with:
|
|
||||||
msystem: ${{ matrix.msystem }}
|
|
||||||
install: base-devel git mingw-w64-${{ matrix.arch }}-cmake mingw-w64-${{ matrix.arch }}-ninja mingw-w64-${{ matrix.arch }}-${{ matrix.compiler }} mingw-w64-${{ matrix.arch }}-boost mingw-w64-${{ matrix.arch }}-openssl mingw-w64-${{ matrix.arch }}-miniupnpc
|
|
||||||
update: true
|
|
||||||
|
|
||||||
- name: Build application
|
|
||||||
run: |
|
|
||||||
cd build
|
|
||||||
cmake -DWITH_GIT_VERSION=ON -DWITH_STATIC=ON -DWITH_UPNP=ON -DCMAKE_BUILD_TYPE=Release .
|
|
||||||
cmake --build . -- -j3
|
|
||||||
|
|
||||||
- name: Upload artifacts
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: i2pd-cmake-${{ matrix.arch_short }}.exe
|
|
||||||
path: build/i2pd.exe
|
|
||||||
|
|
||||||
build-xp:
|
build-xp:
|
||||||
name: XP
|
name: Building for Windows XP
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- uses: actions/checkout@v2
|
||||||
uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Setup MSYS2
|
- name: Setup MSYS2
|
||||||
uses: msys2/setup-msys2@v2
|
uses: msys2/setup-msys2@v2
|
||||||
with:
|
with:
|
||||||
msystem: MINGW32
|
msystem: MINGW32
|
||||||
install: base-devel git mingw-w64-i686-gcc mingw-w64-i686-boost mingw-w64-i686-openssl mingw-w64-i686-miniupnpc
|
install: base-devel git mingw-w64-i686-gcc mingw-w64-i686-boost mingw-w64-i686-openssl mingw-w64-i686-miniupnpc
|
||||||
update: true
|
update: true
|
||||||
|
|
||||||
- name: Build WinXP-capable CRT packages
|
- name: Build WinXP-capable CRT packages
|
||||||
run: |
|
run: |
|
||||||
git clone https://github.com/msys2/MINGW-packages
|
git clone https://github.com/msys2/MINGW-packages
|
||||||
@@ -126,14 +64,12 @@ jobs:
|
|||||||
pacman --noconfirm -U mingw-w64-i686-libwinpthread-git-*-any.pkg.tar.zst mingw-w64-i686-winpthreads-git-*-any.pkg.tar.zst
|
pacman --noconfirm -U mingw-w64-i686-libwinpthread-git-*-any.pkg.tar.zst mingw-w64-i686-winpthreads-git-*-any.pkg.tar.zst
|
||||||
popd
|
popd
|
||||||
popd
|
popd
|
||||||
|
|
||||||
- name: Build application
|
- name: Build application
|
||||||
run: |
|
run: |
|
||||||
mkdir -p obj/Win32 obj/libi2pd obj/libi2pd_client obj/daemon
|
mkdir -p obj/Win32 obj/libi2pd obj/libi2pd_client obj/daemon
|
||||||
make USE_UPNP=yes DEBUG=no USE_GIT_VERSION=yes USE_WINXP_FLAGS=yes -j3
|
make USE_UPNP=yes DEBUG=no USE_GIT_VERSION=yes USE_WINXP_FLAGS=yes -j3
|
||||||
|
|
||||||
- name: Upload artifacts
|
- name: Upload artifacts
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
name: i2pd-xp.exe
|
name: i2pd-xp.exe
|
||||||
path: i2pd.exe
|
path: i2pd.exe
|
||||||
|
|||||||
73
.github/workflows/build.yml
vendored
73
.github/workflows/build.yml
vendored
@@ -5,45 +5,84 @@ on: [push, pull_request]
|
|||||||
jobs:
|
jobs:
|
||||||
build-make:
|
build-make:
|
||||||
name: Make with USE_UPNP=${{ matrix.with_upnp }}
|
name: Make with USE_UPNP=${{ matrix.with_upnp }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-18.04
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: true
|
fail-fast: true
|
||||||
matrix:
|
matrix:
|
||||||
with_upnp: ['yes', 'no']
|
with_upnp: ['yes', 'no']
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- uses: actions/checkout@v2
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: install packages
|
- name: install packages
|
||||||
run: |
|
run: |
|
||||||
|
sudo add-apt-repository ppa:mhier/libboost-latest
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install build-essential libboost-all-dev libminiupnpc-dev libssl-dev zlib1g-dev
|
sudo apt-get install build-essential libboost1.74-dev libminiupnpc-dev libssl-dev zlib1g-dev
|
||||||
|
|
||||||
- name: build application
|
- name: build application
|
||||||
run: make USE_UPNP=${{ matrix.with_upnp }} -j3
|
run: make USE_UPNP=${{ matrix.with_upnp }} -j3
|
||||||
|
|
||||||
build-cmake:
|
build-cmake:
|
||||||
name: CMake with -DWITH_UPNP=${{ matrix.with_upnp }}
|
name: CMake with -DWITH_UPNP=${{ matrix.with_upnp }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-18.04
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: true
|
fail-fast: true
|
||||||
matrix:
|
matrix:
|
||||||
with_upnp: ['ON', 'OFF']
|
with_upnp: ['ON', 'OFF']
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- uses: actions/checkout@v2
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: install packages
|
- name: install packages
|
||||||
run: |
|
run: |
|
||||||
|
sudo add-apt-repository ppa:mhier/libboost-latest
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install build-essential cmake libboost-all-dev libminiupnpc-dev libssl-dev zlib1g-dev
|
sudo apt-get install build-essential cmake libboost1.74-dev libminiupnpc-dev libssl-dev zlib1g-dev
|
||||||
|
|
||||||
- name: build application
|
- name: build application
|
||||||
run: |
|
run: |
|
||||||
cd build
|
cd build
|
||||||
cmake -DWITH_UPNP=${{ matrix.with_upnp }} .
|
cmake -DWITH_UPNP=${{ matrix.with_upnp }} .
|
||||||
make -j3
|
make -j3
|
||||||
|
build-deb-stretch:
|
||||||
|
name: Build package for stretch
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: change debian changelog
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install devscripts
|
||||||
|
debchange -v "`git describe --tags`-stretch" -b -M --distribution stretch "trunk build"
|
||||||
|
- uses: singingwolfboy/build-dpkg-stretch@v1
|
||||||
|
id: build
|
||||||
|
with:
|
||||||
|
args: --unsigned-source --unsigned-changes -b
|
||||||
|
- uses: actions/upload-artifact@v1
|
||||||
|
with:
|
||||||
|
name: ${{ steps.build.outputs.filename }}
|
||||||
|
path: ${{ steps.build.outputs.filename }}
|
||||||
|
- uses: actions/upload-artifact@v1
|
||||||
|
with:
|
||||||
|
name: ${{ steps.build.outputs.filename-dbgsym }}
|
||||||
|
path: ${{ steps.build.outputs.filename-dbgsym }}
|
||||||
|
build-deb-buster:
|
||||||
|
name: Build package for buster
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: change debian changelog
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install devscripts
|
||||||
|
debchange -v "`git describe --tags`-buster" -b -M --distribution buster "trunk build"
|
||||||
|
- uses: singingwolfboy/build-dpkg-buster@v1
|
||||||
|
id: build
|
||||||
|
with:
|
||||||
|
args: --unsigned-source --unsigned-changes -b
|
||||||
|
- uses: actions/upload-artifact@v1
|
||||||
|
with:
|
||||||
|
name: ${{ steps.build.outputs.filename }}
|
||||||
|
path: ${{ steps.build.outputs.filename }}
|
||||||
|
- uses: actions/upload-artifact@v1
|
||||||
|
with:
|
||||||
|
name: ${{ steps.build.outputs.filename-dbgsym }}
|
||||||
|
path: ${{ steps.build.outputs.filename-dbgsym }}
|
||||||
|
|||||||
169
.github/workflows/docker.yml
vendored
169
.github/workflows/docker.yml
vendored
@@ -1,140 +1,63 @@
|
|||||||
name: Build containers
|
name: Build containers
|
||||||
|
|
||||||
on:
|
on: [push]
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- openssl
|
|
||||||
- docker
|
|
||||||
paths:
|
|
||||||
- .github/workflows/docker.yml
|
|
||||||
- contrib/docker/**
|
|
||||||
- contrib/certificates/**
|
|
||||||
- daemon/**
|
|
||||||
- i18n/**
|
|
||||||
- libi2pd/**
|
|
||||||
- libi2pd_client/**
|
|
||||||
- Makefile
|
|
||||||
- Makefile.linux
|
|
||||||
tags:
|
|
||||||
- '*'
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
docker:
|
||||||
name: Building container for ${{ matrix.platform }}
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
permissions:
|
permissions:
|
||||||
packages: write
|
packages: write
|
||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
include: [
|
|
||||||
{ platform: 'linux/amd64', archname: 'amd64' },
|
|
||||||
{ platform: 'linux/386', archname: 'i386' },
|
|
||||||
{ platform: 'linux/arm64', archname: 'arm64' },
|
|
||||||
{ platform: 'linux/arm/v7', archname: 'armv7' },
|
|
||||||
]
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Set up QEMU
|
- name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@v2
|
uses: docker/setup-qemu-action@v1
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v2
|
uses: docker/setup-buildx-action@v1
|
||||||
|
|
||||||
- name: Login to DockerHub
|
- name: Login to DockerHub
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v1
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Login to GitHub Container registry
|
- name: Login to GitHub Container registry
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v1
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.actor }}
|
username: ${{ github.actor }}
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Build container for ${{ matrix.archname }}
|
- name: Build and push trunk container
|
||||||
uses: docker/build-push-action@v3
|
if: ${{ !startsWith(github.ref, 'refs/tags/') }}
|
||||||
with:
|
uses: docker/build-push-action@v2
|
||||||
context: ./contrib/docker
|
with:
|
||||||
file: ./contrib/docker/Dockerfile
|
context: ./contrib/docker
|
||||||
platforms: ${{ matrix.platform }}
|
file: ./contrib/docker/Dockerfile
|
||||||
push: true
|
platforms: linux/amd64,linux/386,linux/arm64,linux/arm/v7
|
||||||
tags: |
|
push: true
|
||||||
purplei2p/i2pd:latest-${{ matrix.archname }}
|
tags: |
|
||||||
ghcr.io/purplei2p/i2pd:latest-${{ matrix.archname }}
|
purplei2p/i2pd:latest
|
||||||
provenance: false
|
ghcr.io/purplei2p/i2pd:latest
|
||||||
|
|
||||||
push:
|
- name: Set env
|
||||||
name: Pushing merged manifest
|
if: ${{ startsWith(github.ref, 'refs/tags/') }}
|
||||||
runs-on: ubuntu-latest
|
run: echo "RELEASE_VERSION=${GITHUB_REF:10}" >> $GITHUB_ENV
|
||||||
|
|
||||||
permissions:
|
- name: Build and push release container
|
||||||
packages: write
|
if: ${{ startsWith(github.ref, 'refs/tags/') }}
|
||||||
contents: read
|
uses: docker/build-push-action@v2
|
||||||
|
with:
|
||||||
needs: build
|
context: ./contrib/docker
|
||||||
|
file: ./contrib/docker/Dockerfile
|
||||||
steps:
|
platforms: linux/amd64,linux/386,linux/arm64,linux/arm/v7
|
||||||
- name: Checkout
|
push: true
|
||||||
uses: actions/checkout@v3
|
tags: |
|
||||||
|
purplei2p/i2pd:latest
|
||||||
- name: Set up QEMU
|
purplei2p/i2pd:release-${{ env.RELEASE_VERSION }}
|
||||||
uses: docker/setup-qemu-action@v2
|
ghcr.io/purplei2p/i2pd:latest
|
||||||
|
ghcr.io/purplei2p/i2pd:release-${{ env.RELEASE_VERSION }}
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v2
|
|
||||||
|
|
||||||
- name: Login to DockerHub
|
|
||||||
uses: docker/login-action@v2
|
|
||||||
with:
|
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Login to GitHub Container registry
|
|
||||||
uses: docker/login-action@v2
|
|
||||||
with:
|
|
||||||
registry: ghcr.io
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Create and push latest manifest image to Docker Hub
|
|
||||||
if: ${{ !startsWith(github.ref, 'refs/tags/') }}
|
|
||||||
uses: Noelware/docker-manifest-action@master
|
|
||||||
with:
|
|
||||||
inputs: purplei2p/i2pd:latest
|
|
||||||
images: purplei2p/i2pd:latest-amd64,purplei2p/i2pd:latest-i386,purplei2p/i2pd:latest-arm64,purplei2p/i2pd:latest-armv7
|
|
||||||
push: true
|
|
||||||
|
|
||||||
- name: Create and push latest manifest image to GHCR
|
|
||||||
if: ${{ !startsWith(github.ref, 'refs/tags/') }}
|
|
||||||
uses: Noelware/docker-manifest-action@master
|
|
||||||
with:
|
|
||||||
inputs: ghcr.io/purplei2p/i2pd:latest
|
|
||||||
images: ghcr.io/purplei2p/i2pd:latest-amd64,ghcr.io/purplei2p/i2pd:latest-i386,ghcr.io/purplei2p/i2pd:latest-arm64,ghcr.io/purplei2p/i2pd:latest-armv7
|
|
||||||
push: true
|
|
||||||
|
|
||||||
- name: Store release version to env
|
|
||||||
if: ${{ startsWith(github.ref, 'refs/tags/') }}
|
|
||||||
run: echo "RELEASE_VERSION=${GITHUB_REF:10}" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: Create and push release manifest to Docker Hub
|
|
||||||
if: ${{ startsWith(github.ref, 'refs/tags/') }}
|
|
||||||
uses: Noelware/docker-manifest-action@master
|
|
||||||
with:
|
|
||||||
inputs: purplei2p/i2pd:latest,purplei2p/i2pd:latest-release,purplei2p/i2pd:release-${{ env.RELEASE_VERSION }}
|
|
||||||
images: purplei2p/i2pd:latest-amd64,purplei2p/i2pd:latest-i386,purplei2p/i2pd:latest-arm64,purplei2p/i2pd:latest-armv7
|
|
||||||
push: true
|
|
||||||
|
|
||||||
- name: Create and push release manifest to GHCR
|
|
||||||
if: ${{ startsWith(github.ref, 'refs/tags/') }}
|
|
||||||
uses: Noelware/docker-manifest-action@master
|
|
||||||
with:
|
|
||||||
inputs: ghcr.io/purplei2p/i2pd:latest,ghcr.io/purplei2p/i2pd:latest-release,ghcr.io/purplei2p/i2pd:release-${{ env.RELEASE_VERSION }}
|
|
||||||
images: ghcr.io/purplei2p/i2pd:latest-amd64,ghcr.io/purplei2p/i2pd:latest-i386,ghcr.io/purplei2p/i2pd:latest-arm64,ghcr.io/purplei2p/i2pd:latest-armv7
|
|
||||||
push: true
|
|
||||||
|
|||||||
275
ChangeLog
275
ChangeLog
@@ -1,277 +1,6 @@
|
|||||||
# for this file format description,
|
# for this file format description,
|
||||||
# see https://github.com/olivierlacan/keep-a-changelog
|
# see https://github.com/olivierlacan/keep-a-changelog
|
||||||
|
|
||||||
## [2.50.2] - 2024-01-06
|
|
||||||
###Fixed
|
|
||||||
- Crash with OpenSSL 3.2.0
|
|
||||||
- False positive clock skew detection
|
|
||||||
|
|
||||||
## [2.50.1] - 2023-12-23
|
|
||||||
###Fixed
|
|
||||||
- Support for new EdDSA usage behavior in OpenSSL 3.2.0
|
|
||||||
|
|
||||||
## [2.50.0] - 2023-12-18
|
|
||||||
### Added
|
|
||||||
- Support of concurrent ACCEPTs on SAM 3.1
|
|
||||||
- Haiku OS support
|
|
||||||
- Low bandwidth and far routers can expire before 1 hour
|
|
||||||
### Changed
|
|
||||||
- Don't pick too active peer for first hop
|
|
||||||
- Try peer test again if status is Unknown
|
|
||||||
- Send peer tests with random delay
|
|
||||||
- Reseeds list
|
|
||||||
### Fixed
|
|
||||||
- XSS vulnerability in addresshelper
|
|
||||||
- Publishing NAT64 ipv6 addresses
|
|
||||||
- Deadlock in AsyncSend callback
|
|
||||||
|
|
||||||
## [2.49.0] - 2023-09-18
|
|
||||||
### Added
|
|
||||||
- Handle SOCK5 authorization with empty user/password
|
|
||||||
- Drop incoming transport sessions from too old or from future routers
|
|
||||||
- Memory pool for router profiles
|
|
||||||
- Allow 0 hops in explicitPeers
|
|
||||||
### Changed
|
|
||||||
- Separate network and testing status
|
|
||||||
- Remove AVX code
|
|
||||||
- Improve NTCP2 transport session logging
|
|
||||||
- Select router with ipv4 for tunnel endpoint
|
|
||||||
- Consider all addresses non-published for U and H routers even if they have host/port
|
|
||||||
- Don't pick completely unreachable routers for tunnels
|
|
||||||
- Exclude SSU1 introducers from SSU2 addresses
|
|
||||||
- Don't create paired inbound tunnel if length is different
|
|
||||||
- Remove introducer from RouterInfo after 60 minutes
|
|
||||||
- Reduce SSU2 keep alive interval and add keep alive interval variance
|
|
||||||
- Don't pick too old sessions for introducer
|
|
||||||
### Fixed
|
|
||||||
- Version of the subnegotiation in user/password SOCKS5 response
|
|
||||||
- Send keepalive for existing session with introducer
|
|
||||||
- Buffer offset for EVP_EncryptFinal_ex() to include outlen
|
|
||||||
- Termination block size processing for transport sessions
|
|
||||||
- Crash if deleted BOB destination was shared between few BOB sessions
|
|
||||||
- Introducers with zero tag
|
|
||||||
- Padding for SSU2 path response
|
|
||||||
|
|
||||||
## [2.48.0] - 2023-06-12
|
|
||||||
### Added
|
|
||||||
- Allow user/password authentication method for SOCK5 proxy
|
|
||||||
- Publish reject all congestion cap 'G' if transit is not accepted
|
|
||||||
- 'critical' log level
|
|
||||||
- Print b32 on webconsole destination page
|
|
||||||
- Webconsole button to drop a remote LeaseSet
|
|
||||||
- limits.zombies param - minimum percentage of successfully created tunnels for routers cleanup
|
|
||||||
- Recognize real routers if successfully connected or responded to tunnel build request
|
|
||||||
### Changed
|
|
||||||
- Bypass slow transport sessions for first hop selection
|
|
||||||
- Limit AESNI inline asm to x86/x64
|
|
||||||
- Create smaller I2NP packets if possible
|
|
||||||
- Make router unreachable if AEAD tag verification fails in SessionCreated
|
|
||||||
- Don't include a router to floodfills list until it's confirmed as real
|
|
||||||
- Drop LeaseSet store request if not floodfill
|
|
||||||
- Bypass medium congestion('D') routers for client tunnels
|
|
||||||
- Publish encrypted RouterInfo through tunnels
|
|
||||||
- Check if s is valid x25519 public key
|
|
||||||
- Check if socket is open before sending data in SSU2
|
|
||||||
### Fixed
|
|
||||||
- Webconsole empty page if destination is not found
|
|
||||||
- i2p.streaming.answerPings param
|
|
||||||
- Reload tunnels
|
|
||||||
- Address caps for unspecified ipv6 address
|
|
||||||
- Incomplete HTTP headers in I2P tunnels
|
|
||||||
- SSU2 socket network exceptions on Windows
|
|
||||||
- Use of 'server' type tunnel port as inport (#1936)
|
|
||||||
|
|
||||||
## [2.47.0] - 2023-03-11
|
|
||||||
### Added
|
|
||||||
- Congestion caps
|
|
||||||
- SAM UDP port parameter
|
|
||||||
- Support domain addresses for yggdrasil reseeds
|
|
||||||
### Changed
|
|
||||||
- DHT for floodfills instead plain list
|
|
||||||
- Process router's messages in separate thread
|
|
||||||
- Don't publish non-reachable router
|
|
||||||
- Send and check target destination in first streaming SYN packet
|
|
||||||
- Reseeds list
|
|
||||||
### Fixed
|
|
||||||
- Memory leak in windows network state detection
|
|
||||||
- Reseed attempts from invalid address
|
|
||||||
|
|
||||||
## [2.46.1] - 2023-02-20
|
|
||||||
### Fixed
|
|
||||||
- Race condition while getting router's peer profile
|
|
||||||
- Creation of new router.info
|
|
||||||
- Displaying LeaseSets in the webconsole
|
|
||||||
- Crash when processing ACK request
|
|
||||||
|
|
||||||
## [2.46.0] - 2023-02-15
|
|
||||||
### Added
|
|
||||||
- Limit number of acked SSU2 packets to 511
|
|
||||||
- Localization to Swedish, Portuguese, Turkish, Polish
|
|
||||||
- Periodically send Datetime block in NTCP2 and SSU2
|
|
||||||
- Don't select random port from reserved
|
|
||||||
- In memory table for peer profiles
|
|
||||||
- Store if router was unreachable in it's peer profile
|
|
||||||
- Show IPv6 addresses in square brackets in webconsole
|
|
||||||
- Check referer when processing Addresshelper
|
|
||||||
### Changed
|
|
||||||
- Algorithm for tunnel creation success rate calculation
|
|
||||||
- Drop incoming NTCP2 and SSU2 connection if published IP doesn't match actual endpoint
|
|
||||||
- Exclude actually unreachable router from netdb for 2 hours
|
|
||||||
- Select first hop from high bandwidth peers for client tunnels
|
|
||||||
- Drop too long or too short LeaseSet
|
|
||||||
- Delete router from netdb if became invalid after update
|
|
||||||
- Terminate existing session if clock skew detected
|
|
||||||
- Close previous UDP socket if open before reopening
|
|
||||||
- Minimal version for floodfill is 0.9.51
|
|
||||||
- Sort transports by endpoints in webconsole
|
|
||||||
### Fixed
|
|
||||||
- Deadlock during processing I2NP block with Garlic in ECIES encrypted message to router
|
|
||||||
- Race condition with encrypted LeaseSets
|
|
||||||
- HTTP query detection
|
|
||||||
- Connection attempts to IPs from invalid ranges
|
|
||||||
- Publish "0.0.0.0" in RouterInfo
|
|
||||||
- Crash upon receiving PeerTest 7
|
|
||||||
- Tunnels for closed SAM session socket
|
|
||||||
- Missing NTCP2 address in RouterInfo if enabled back
|
|
||||||
|
|
||||||
## [2.45.1] - 2023-01-11
|
|
||||||
### Added
|
|
||||||
- Full Cone NAT status error
|
|
||||||
### Changed
|
|
||||||
- Drop duplicated I2NP messages in SSU2
|
|
||||||
- Set rejection code 30 if tunnel with id already exists
|
|
||||||
- Network status is always OK if peer test msg 5 received
|
|
||||||
### Fixed
|
|
||||||
- UPnP crash if SSU2 or NTCP2 is disabled
|
|
||||||
- Crash on termination for some platforms
|
|
||||||
|
|
||||||
## [2.45.0] - 2023-01-03
|
|
||||||
### Added
|
|
||||||
- Test for Symmetric NAT with peer test msgs 6 and 7
|
|
||||||
- Webconsole "No Descriptors" router error state
|
|
||||||
- 1 and 15 seconds bandwidth calculation for i2pcontrol
|
|
||||||
- Show non-zero send queue size for transports in web console
|
|
||||||
- Compressible padding for I2P addresses
|
|
||||||
- Localization to Czech
|
|
||||||
- Don't accept incoming session from invalid/reserved addresses for NTCP2 and SSU2
|
|
||||||
- Limit simultaneous tunnel build requests by 4 per pool
|
|
||||||
### Changed
|
|
||||||
- Removed SSU support
|
|
||||||
- Reduced bandwidth calculation interval from 60 to 15 seconds
|
|
||||||
- Increased default max transit tunnels number from 2500 to 5000 or 10000 for floodfill
|
|
||||||
- Transit tunnels limit is doubled if floodfill mode is enabled
|
|
||||||
- NTCP2 and SSU2 timestamps are rounded to seconds
|
|
||||||
- Drop RouterInfos and LeaseSets with timestamp from future
|
|
||||||
- Don't delete unreachable routers if tunnel creation success rate is too low
|
|
||||||
- Refuse duplicated incoming pending NTCP2 session from same IP
|
|
||||||
- Don't send SSU2 termination again if termination received block received
|
|
||||||
- Handle standard network error for SSU2 without throwing an exception
|
|
||||||
- Don't select overloaded peer for next tunnel
|
|
||||||
- Remove "X-Requested-With" in HTTP Proxy for non-AJAX requests
|
|
||||||
### Fixed
|
|
||||||
- File descriptors leak
|
|
||||||
- Random crash on AddressBook update
|
|
||||||
- Crash if incorrect LeaseSet size
|
|
||||||
- Spamming to log if no descriptors
|
|
||||||
- ::1 address in RouterInfo
|
|
||||||
- SSU2 network error handling (especially for Windows)
|
|
||||||
- Race condition with pending outgoing SSU2 sessions
|
|
||||||
- RTT self-reduction for long-live streams
|
|
||||||
|
|
||||||
## [2.44.0] - 2022-11-20
|
|
||||||
### Added
|
|
||||||
- SSL connection for server I2P tunnels
|
|
||||||
- Localization to Italian and Spanish
|
|
||||||
- SSU2 through SOCKS5 UDP proxy
|
|
||||||
- Reload tunnels through web console
|
|
||||||
- SSU2 send immediate ack request flag
|
|
||||||
- SSU2 send and verify path challenge
|
|
||||||
- Configurable ssu2.mtu4 and ssu2.mtu6
|
|
||||||
### Changed
|
|
||||||
- SSU2 is enabled and SSU is disabled by default
|
|
||||||
- Separate network status and error
|
|
||||||
- Random selection between NTCP2 and SSU2 priority
|
|
||||||
- Added notbob.i2p to jump services
|
|
||||||
- Remove DoNotTrack flag from HTTP Request header
|
|
||||||
- Skip addresshelper page if destination was not changed
|
|
||||||
- SSU2 allow different ports from RelayReponse and HolePunch
|
|
||||||
- SSU2 resend PeerTest msg 1 and msg 2
|
|
||||||
- SSU2 Send Retry instead SessionCreated if clock skew detected
|
|
||||||
### Fixed
|
|
||||||
- Long HTTP headers for HTTP proxy and HTTP server tunnel
|
|
||||||
- SSU2 resends and resend limits
|
|
||||||
- Crash at startup if addressbook is disabled
|
|
||||||
- NTCP2 ipv6 connection through SOCKS5 proxy
|
|
||||||
- SSU2 SessionRequest with zero token
|
|
||||||
- SSU2 MTU less than 1280
|
|
||||||
- SSU2 port=1
|
|
||||||
- Incorrect addresses from network interfaces
|
|
||||||
- Definitions for Darwin PPC; do not use pthread_setname_np
|
|
||||||
|
|
||||||
## [2.43.0] - 2022-08-22
|
|
||||||
### Added
|
|
||||||
- Complete SSU2 implementation
|
|
||||||
- Localization to Chinese
|
|
||||||
- Send RouterInfo update for long live sessions
|
|
||||||
- Explicit ipv6 ranges of known tunnel brokers for MTU detection
|
|
||||||
- Always send "Connection: close" and strip out Keep-Alive for server HTTP tunnel
|
|
||||||
- Show ports for all transports in web console
|
|
||||||
- Translation of webconsole site title
|
|
||||||
- Support for Windows ProgramData path when running as service
|
|
||||||
- Ability to turn off address book
|
|
||||||
- Handle signals TSTP and CONT to stop and resume network
|
|
||||||
### Changed
|
|
||||||
- Case insensitive headers for server HTTP tunnel
|
|
||||||
- Do not show 'Address registration' line if LeaseSet is encrypted
|
|
||||||
- SSU2 transports have higher priority than SSU
|
|
||||||
- Disable ElGamal precalculated table if no SSU
|
|
||||||
- Deprecate limits.ntcpsoft, limits.ntcphard and limits.ntcpthreads config options
|
|
||||||
- SSU2 is enabled and SSU is disabled by default for new installations
|
|
||||||
### Fixed
|
|
||||||
- Typo with Referer header name in HTTP proxy
|
|
||||||
- Can't handle garlic message from an exploratory tunnel
|
|
||||||
- Incorrect encryption key for exploratory lookup reply
|
|
||||||
- Bound checks issues in LeaseSets code
|
|
||||||
- MTU detection on Windows
|
|
||||||
- Crash on stop of active server tunnel
|
|
||||||
- Send datagram to wrong destination in SAM
|
|
||||||
- Incorrect static key in RouterInfo if the keys were regenerated
|
|
||||||
- Duplicated sessions in BOB
|
|
||||||
|
|
||||||
## [2.42.1] - 2022-05-24
|
|
||||||
### Fixed
|
|
||||||
- Incorrect jump link in HTTP Proxy
|
|
||||||
|
|
||||||
## [2.42.0] - 2022-05-22
|
|
||||||
### Added
|
|
||||||
- Preliminary SSU2 implementation
|
|
||||||
- Tunnel length variance
|
|
||||||
- Localization to French
|
|
||||||
- Daily cleanup of obsolete peer profiles
|
|
||||||
- Ordered jump services list in HTTP proxy
|
|
||||||
- Win32 service
|
|
||||||
- Show port for local non-published SSU addresses in web console
|
|
||||||
### Changed
|
|
||||||
- Maximum RouterInfo length increased to 3K
|
|
||||||
- Skip unknown addresses in RouterInfo
|
|
||||||
- Don't pick own router for peer test
|
|
||||||
- Reseeds list
|
|
||||||
- Internal numeric id for families
|
|
||||||
- Use ipv6 preference only when netinet headers not used
|
|
||||||
- Close stream if delete requested
|
|
||||||
- Remove version from title in web console
|
|
||||||
- Drop MESHNET build option
|
|
||||||
- Set data path before initialization
|
|
||||||
- Don't show registration block in web console if token is not provided
|
|
||||||
### Fixed
|
|
||||||
- Encrypted LeaseSet for EdDSA signature
|
|
||||||
- Clients tunnels are not built if clock is not synced on start
|
|
||||||
- Incorrect processing of i2cp.dontPublishLeaseSet param
|
|
||||||
- UDP tunnels reload
|
|
||||||
- Build for LibreSSL 3.5.2
|
|
||||||
- Race condition in short tunnel build message
|
|
||||||
- Race condition in local RouterInfo buffer allocation
|
|
||||||
|
|
||||||
## [2.41.0] - 2022-02-20
|
## [2.41.0] - 2022-02-20
|
||||||
### Added
|
### Added
|
||||||
- Clock syncronization through SSU
|
- Clock syncronization through SSU
|
||||||
@@ -618,7 +347,7 @@
|
|||||||
### Added
|
### Added
|
||||||
- Client auth flag for b33 address
|
- Client auth flag for b33 address
|
||||||
### Changed
|
### Changed
|
||||||
- Remove incoming NTCP2 session from pending list when established
|
- Remove incoming NTCP2 session from pending list when established
|
||||||
- Handle errors for NTCP2 SessionConfrimed send
|
- Handle errors for NTCP2 SessionConfrimed send
|
||||||
### Fixed
|
### Fixed
|
||||||
- Failure to start on Windows XP
|
- Failure to start on Windows XP
|
||||||
@@ -922,7 +651,7 @@
|
|||||||
### Added
|
### Added
|
||||||
- Datagram i2p tunnels
|
- Datagram i2p tunnels
|
||||||
- Unique local addresses for server tunnels
|
- Unique local addresses for server tunnels
|
||||||
- Configurable list of reseed servers and initial addressbook
|
- Configurable list of reseed servers and initial addressbook
|
||||||
- Configurable netid
|
- Configurable netid
|
||||||
- Initial iOS support
|
- Initial iOS support
|
||||||
|
|
||||||
|
|||||||
2
LICENSE
2
LICENSE
@@ -1,4 +1,4 @@
|
|||||||
Copyright (c) 2013-2023, The PurpleI2P Project
|
Copyright (c) 2013-2020, The PurpleI2P Project
|
||||||
|
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
|
|||||||
46
Makefile
46
Makefile
@@ -4,7 +4,7 @@ SYS := $(shell $(CXX) -dumpmachine)
|
|||||||
|
|
||||||
ifneq (, $(findstring darwin, $(SYS)))
|
ifneq (, $(findstring darwin, $(SYS)))
|
||||||
SHARED_SUFFIX = dylib
|
SHARED_SUFFIX = dylib
|
||||||
else ifneq (, $(findstring mingw, $(SYS))$(findstring windows-gnu, $(SYS))$(findstring cygwin, $(SYS)))
|
else ifneq (, $(findstring mingw, $(SYS))$(findstring cygwin, $(SYS)))
|
||||||
SHARED_SUFFIX = dll
|
SHARED_SUFFIX = dll
|
||||||
else
|
else
|
||||||
SHARED_SUFFIX = so
|
SHARED_SUFFIX = so
|
||||||
@@ -40,6 +40,12 @@ USE_GIT_VERSION := $(or $(USE_GIT_VERSION),no)
|
|||||||
# for MacOS only, waiting for "1", not "yes"
|
# for MacOS only, waiting for "1", not "yes"
|
||||||
HOMEBREW := $(or $(HOMEBREW),0)
|
HOMEBREW := $(or $(HOMEBREW),0)
|
||||||
|
|
||||||
|
# Client protocols
|
||||||
|
USE_I2PC := $(or $(USE_I2PC),yes)
|
||||||
|
USE_I2CP := $(or $(USE_I2CP),yes)
|
||||||
|
USE_SAM := $(or $(USE_SAM),yes)
|
||||||
|
USE_BOB := $(or $(USE_BOB),yes)
|
||||||
|
|
||||||
ifeq ($(DEBUG),yes)
|
ifeq ($(DEBUG),yes)
|
||||||
CXX_DEBUG = -g
|
CXX_DEBUG = -g
|
||||||
else
|
else
|
||||||
@@ -47,8 +53,17 @@ else
|
|||||||
LD_DEBUG = -s
|
LD_DEBUG = -s
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq (, $(DESTDIR))
|
ifeq ($(USE_I2PC),yes)
|
||||||
PREFIX = $(DESTDIR)
|
NEEDED_CXXFLAGS += -DWITH_I2PC
|
||||||
|
endif
|
||||||
|
ifeq ($(USE_I2CP),yes)
|
||||||
|
NEEDED_CXXFLAGS += -DWITH_I2CP
|
||||||
|
endif
|
||||||
|
ifeq ($(USE_SAM),yes)
|
||||||
|
NEEDED_CXXFLAGS += -DWITH_SAM
|
||||||
|
endif
|
||||||
|
ifeq ($(USE_BOB),yes)
|
||||||
|
NEEDED_CXXFLAGS += -DWITH_BOB
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq (, $(findstring darwin, $(SYS)))
|
ifneq (, $(findstring darwin, $(SYS)))
|
||||||
@@ -58,31 +73,26 @@ ifneq (, $(findstring darwin, $(SYS)))
|
|||||||
else
|
else
|
||||||
include Makefile.osx
|
include Makefile.osx
|
||||||
endif
|
endif
|
||||||
else ifneq (, $(findstring mingw, $(SYS))$(findstring windows-gnu, $(SYS))$(findstring cygwin, $(SYS)))
|
|
||||||
DAEMON_SRC += Win32/DaemonWin32.cpp Win32/Win32App.cpp Win32/Win32Service.cpp Win32/Win32NetState.cpp
|
|
||||||
include Makefile.mingw
|
|
||||||
else ifneq (, $(findstring linux, $(SYS))$(findstring gnu, $(SYS)))
|
else ifneq (, $(findstring linux, $(SYS))$(findstring gnu, $(SYS)))
|
||||||
DAEMON_SRC += $(DAEMON_SRC_DIR)/UnixDaemon.cpp
|
DAEMON_SRC += $(DAEMON_SRC_DIR)/UnixDaemon.cpp
|
||||||
include Makefile.linux
|
include Makefile.linux
|
||||||
else ifneq (, $(findstring freebsd, $(SYS))$(findstring openbsd, $(SYS)))
|
else ifneq (, $(findstring freebsd, $(SYS))$(findstring openbsd, $(SYS)))
|
||||||
DAEMON_SRC += $(DAEMON_SRC_DIR)/UnixDaemon.cpp
|
DAEMON_SRC += $(DAEMON_SRC_DIR)/UnixDaemon.cpp
|
||||||
include Makefile.bsd
|
include Makefile.bsd
|
||||||
else ifneq (, $(findstring haiku, $(SYS)))
|
else ifneq (, $(findstring mingw, $(SYS))$(findstring cygwin, $(SYS)))
|
||||||
DAEMON_SRC += $(DAEMON_SRC_DIR)/UnixDaemon.cpp
|
DAEMON_SRC += Win32/DaemonWin32.cpp Win32/Win32App.cpp Win32/Win32Service.cpp Win32/Win32NetState.cpp
|
||||||
include Makefile.haiku
|
include Makefile.mingw
|
||||||
else # not supported
|
else # not supported
|
||||||
$(error Not supported platform)
|
$(error Not supported platform)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
INCFLAGS += -I$(LIB_SRC_DIR) -I$(LIB_CLIENT_SRC_DIR) -I$(LANG_SRC_DIR)
|
|
||||||
DEFINES += -DOPENSSL_SUPPRESS_DEPRECATED
|
|
||||||
NEEDED_CXXFLAGS += -MMD -MP
|
|
||||||
|
|
||||||
ifeq ($(USE_GIT_VERSION),yes)
|
ifeq ($(USE_GIT_VERSION),yes)
|
||||||
GIT_VERSION := $(shell git describe --tags)
|
GIT_VERSION := $(shell git describe --tags)
|
||||||
DEFINES += -DGITVER=$(GIT_VERSION)
|
NEEDED_CXXFLAGS += -DGITVER=\"$(GIT_VERSION)\"
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
NEEDED_CXXFLAGS += -MMD -MP -I$(LIB_SRC_DIR) -I$(LIB_CLIENT_SRC_DIR) -I$(LANG_SRC_DIR)
|
||||||
|
|
||||||
LIB_OBJS += $(patsubst %.cpp,obj/%.o,$(LIB_SRC))
|
LIB_OBJS += $(patsubst %.cpp,obj/%.o,$(LIB_SRC))
|
||||||
LIB_CLIENT_OBJS += $(patsubst %.cpp,obj/%.o,$(LIB_CLIENT_SRC))
|
LIB_CLIENT_OBJS += $(patsubst %.cpp,obj/%.o,$(LIB_CLIENT_SRC))
|
||||||
LANG_OBJS += $(patsubst %.cpp,obj/%.o,$(LANG_SRC))
|
LANG_OBJS += $(patsubst %.cpp,obj/%.o,$(LANG_SRC))
|
||||||
@@ -115,17 +125,17 @@ wrapper: api_client $(SHLIB_WRAP) $(ARLIB_WRAP)
|
|||||||
## custom FLAGS to work at build-time.
|
## custom FLAGS to work at build-time.
|
||||||
|
|
||||||
obj/%.o: %.cpp | mk_obj_dir
|
obj/%.o: %.cpp | mk_obj_dir
|
||||||
$(CXX) $(CXXFLAGS) $(NEEDED_CXXFLAGS) $(DEFINES) $(INCFLAGS) -c -o $@ $<
|
$(CXX) $(CXXFLAGS) $(NEEDED_CXXFLAGS) $(INCFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
# '-' is 'ignore if missing' on first run
|
# '-' is 'ignore if missing' on first run
|
||||||
-include $(DEPS)
|
-include $(DEPS)
|
||||||
|
|
||||||
$(I2PD): $(DAEMON_OBJS) $(ARLIB) $(ARLIB_CLIENT) $(ARLIB_LANG)
|
$(I2PD): $(DAEMON_OBJS) $(ARLIB) $(ARLIB_CLIENT) $(ARLIB_LANG)
|
||||||
$(CXX) $(DEFINES) $(LDFLAGS) -o $@ $^ $(LDLIBS)
|
$(CXX) -o $@ $(LDFLAGS) $^ $(LDLIBS)
|
||||||
|
|
||||||
$(SHLIB): $(LIB_OBJS)
|
$(SHLIB): $(LIB_OBJS) $(SHLIB_LANG)
|
||||||
ifneq ($(USE_STATIC),yes)
|
ifneq ($(USE_STATIC),yes)
|
||||||
$(CXX) $(LDFLAGS) -shared -o $@ $^ $(LDLIBS)
|
$(CXX) $(LDFLAGS) -shared -o $@ $^ $(LDLIBS) $(SHLIB_LANG)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
$(SHLIB_CLIENT): $(LIB_CLIENT_OBJS) $(SHLIB) $(SHLIB_LANG)
|
$(SHLIB_CLIENT): $(LIB_CLIENT_OBJS) $(SHLIB) $(SHLIB_LANG)
|
||||||
|
|||||||
@@ -6,8 +6,7 @@ CXXFLAGS ?= ${CXX_DEBUG} -Wall -Wextra -Wno-unused-parameter -pedantic -Wno-misl
|
|||||||
## (e.g. -fstack-protector-strong -Wformat -Werror=format-security), we do not want to remove
|
## (e.g. -fstack-protector-strong -Wformat -Werror=format-security), we do not want to remove
|
||||||
## -std=c++11. If you want to remove this variable please do so in a way that allows setting
|
## -std=c++11. If you want to remove this variable please do so in a way that allows setting
|
||||||
## custom FLAGS to work at build-time.
|
## custom FLAGS to work at build-time.
|
||||||
NEEDED_CXXFLAGS = -std=c++11
|
NEEDED_CXXFLAGS = -std=c++11 -D_GLIBCXX_USE_NANOSLEEP=1
|
||||||
DEFINES = -D_GLIBCXX_USE_NANOSLEEP=1
|
|
||||||
INCFLAGS = -I/usr/include/ -I/usr/local/include/
|
INCFLAGS = -I/usr/include/ -I/usr/local/include/
|
||||||
LDFLAGS = ${LD_DEBUG} -Wl,-rpath,/usr/local/lib -L/usr/local/lib
|
LDFLAGS = ${LD_DEBUG} -Wl,-rpath,/usr/local/lib -L/usr/local/lib
|
||||||
LDLIBS = -lcrypto -lssl -lz -lboost_system -lboost_date_time -lboost_filesystem -lboost_program_options -lpthread
|
LDLIBS = -lcrypto -lssl -lz -lboost_system -lboost_date_time -lboost_filesystem -lboost_program_options -lpthread
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
CXX = g++
|
|
||||||
CXXFLAGS := -Wall -std=c++11
|
|
||||||
INCFLAGS = -I/system/develop/headers
|
|
||||||
DEFINES = -D_DEFAULT_SOURCE -D_GNU_SOURCE
|
|
||||||
LDLIBS = -lbe -lbsd -lnetwork -lz -lcrypto -lssl -lboost_system -lboost_date_time -lboost_filesystem -lboost_program_options -lpthread
|
|
||||||
|
|
||||||
ifeq ($(USE_UPNP),yes)
|
|
||||||
DEFINES += -DUSE_UPNP
|
|
||||||
LDLIBS += -lminiupnpc
|
|
||||||
endif
|
|
||||||
@@ -39,18 +39,13 @@ ifeq ($(USE_AESNI),yes)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
install: all
|
install: all
|
||||||
install -d ${PREFIX}/bin
|
install -d ${PREFIX}/bin ${PREFIX}/etc/i2pd ${PREFIX}/etc/i2pd/tunnels.conf.d ${PREFIX}/share/doc/i2pd ${PREFIX}/share/i2pd ${PREFIX}/share/man/man1 ${PREFIX}/var/lib/i2pd
|
||||||
install -m 755 ${I2PD} ${PREFIX}/bin
|
install -m 755 ${I2PD} ${PREFIX}/bin/
|
||||||
install -d ${PREFIX}/etc ${PREFIX}/etc/i2pd ${PREFIX}/etc/i2pd/tunnels.conf.d
|
|
||||||
install -m 644 contrib/i2pd.conf contrib/subscriptions.txt contrib/tunnels.conf ${PREFIX}/etc/i2pd
|
install -m 644 contrib/i2pd.conf contrib/subscriptions.txt contrib/tunnels.conf ${PREFIX}/etc/i2pd
|
||||||
install -d ${PREFIX}/share ${PREFIX}/share/doc ${PREFIX}/share/doc/i2pd
|
|
||||||
install -m 644 ChangeLog LICENSE README.md contrib/i2pd.conf contrib/subscriptions.txt contrib/tunnels.conf ${PREFIX}/share/doc/i2pd
|
|
||||||
install -d ${PREFIX}/share/i2pd
|
|
||||||
@cp -R contrib/certificates ${PREFIX}/share/i2pd/
|
@cp -R contrib/certificates ${PREFIX}/share/i2pd/
|
||||||
install -d ${PREFIX}/share/man ${PREFIX}/share/man/man1
|
install -m 644 ChangeLog LICENSE README.md contrib/i2pd.conf contrib/subscriptions.txt contrib/tunnels.conf ${PREFIX}/share/doc/i2pd
|
||||||
@gzip -kf debian/i2pd.1 && install debian/i2pd.1.gz ${PREFIX}/share/man/man1
|
@gzip -kf debian/i2pd.1 && install debian/i2pd.1.gz ${PREFIX}/share/man/man1
|
||||||
install -d ${PREFIX}/var ${PREFIX}/var/lib ${PREFIX}/var/lib/i2pd
|
@ln -sf ${PREFIX}/share/i2pd/certificates ${PREFIX}/var/lib/i2pd/
|
||||||
@ln -sf ${PREFIX}/share/i2pd/certificates ${PREFIX}/var/lib/i2pd/certificates
|
|
||||||
@ln -sf ${PREFIX}/etc/i2pd/tunnels.conf.d ${PREFIX}/var/lib/i2pd/tunnels.d
|
@ln -sf ${PREFIX}/etc/i2pd/tunnels.conf.d ${PREFIX}/var/lib/i2pd/tunnels.d
|
||||||
@ln -sf ${PREFIX}/etc/i2pd/i2pd.conf ${PREFIX}/var/lib/i2pd/i2pd.conf
|
@ln -sf ${PREFIX}/etc/i2pd/i2pd.conf ${PREFIX}/var/lib/i2pd/i2pd.conf
|
||||||
@ln -sf ${PREFIX}/etc/i2pd/subscriptions.txt ${PREFIX}/var/lib/i2pd/subscriptions.txt
|
@ln -sf ${PREFIX}/etc/i2pd/subscriptions.txt ${PREFIX}/var/lib/i2pd/subscriptions.txt
|
||||||
|
|||||||
@@ -20,11 +20,7 @@ else ifeq ($(shell expr match ${CXXVER} "4\.[8-9]"),3) # gcc 4.8 - 4.9
|
|||||||
else ifeq ($(shell expr match ${CXXVER} "[5-6]"),1) # gcc 5 - 6
|
else ifeq ($(shell expr match ${CXXVER} "[5-6]"),1) # gcc 5 - 6
|
||||||
NEEDED_CXXFLAGS += -std=c++11
|
NEEDED_CXXFLAGS += -std=c++11
|
||||||
LDLIBS = -latomic
|
LDLIBS = -latomic
|
||||||
else ifeq ($(shell expr match ${CXXVER} "[7-9]"),1) # gcc 7 - 9
|
else ifeq ($(shell expr match ${CXXVER} "[1,7-9]"),1) # gcc >= 7
|
||||||
NEEDED_CXXFLAGS += -std=c++17
|
|
||||||
LDLIBS = -latomic
|
|
||||||
else ifeq ($(shell expr match ${CXXVER} "1[0-9]"),2) # gcc 10+
|
|
||||||
# NEEDED_CXXFLAGS += -std=c++20
|
|
||||||
NEEDED_CXXFLAGS += -std=c++17
|
NEEDED_CXXFLAGS += -std=c++17
|
||||||
LDLIBS = -latomic
|
LDLIBS = -latomic
|
||||||
else # not supported
|
else # not supported
|
||||||
@@ -58,29 +54,23 @@ endif
|
|||||||
|
|
||||||
# UPNP Support (miniupnpc 1.5 and higher)
|
# UPNP Support (miniupnpc 1.5 and higher)
|
||||||
ifeq ($(USE_UPNP),yes)
|
ifeq ($(USE_UPNP),yes)
|
||||||
DEFINES += -DUSE_UPNP
|
NEEDED_CXXFLAGS += -DUSE_UPNP
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(USE_AESNI),yes)
|
ifeq ($(USE_AESNI),yes)
|
||||||
ifneq (, $(findstring i386, $(SYS))$(findstring i686, $(SYS))$(findstring x86_64, $(SYS))) # only x86-based CPU supports that
|
ifneq (, $(findstring i386, $(SYS))$(findstring i686, $(SYS))$(findstring x86_64, $(SYS))) # only x86-based CPU supports that
|
||||||
NEEDED_CXXFLAGS += -maes
|
NEEDED_CXXFLAGS += -D__AES__ -maes
|
||||||
DEFINES += -D__AES__
|
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
install: all
|
install: all
|
||||||
install -d ${PREFIX}/bin
|
install -d ${PREFIX}/bin ${PREFIX}/etc ${PREFIX}/etc/i2pd ${PREFIX}/etc/i2pd/tunnels.conf.d ${PREFIX}/usr ${PREFIX}/usr/share ${PREFIX}/usr/share/doc/i2pd ${PREFIX}/usr/share/i2pd ${PREFIX}/usr/share/man ${PREFIX}/usr/share/man/man1 ${PREFIX}/var/lib ${PREFIX}/var/lib/i2pd
|
||||||
install -m 755 ${I2PD} ${PREFIX}/bin
|
install -m 755 ${I2PD} ${PREFIX}/bin/
|
||||||
install -d ${PREFIX}/etc ${PREFIX}/etc/i2pd ${PREFIX}/etc/i2pd/tunnels.conf.d
|
|
||||||
install -m 644 contrib/i2pd.conf contrib/subscriptions.txt contrib/tunnels.conf ${PREFIX}/etc/i2pd
|
install -m 644 contrib/i2pd.conf contrib/subscriptions.txt contrib/tunnels.conf ${PREFIX}/etc/i2pd
|
||||||
install -d ${PREFIX}/share ${PREFIX}/share/doc ${PREFIX}/share/doc/i2pd
|
@cp -R contrib/certificates ${PREFIX}/usr/share/i2pd/
|
||||||
install -m 644 ChangeLog LICENSE README.md contrib/i2pd.conf contrib/subscriptions.txt contrib/tunnels.conf ${PREFIX}/share/doc/i2pd
|
install -m 644 ChangeLog LICENSE README.md contrib/i2pd.conf contrib/subscriptions.txt contrib/tunnels.conf ${PREFIX}/usr/share/doc/i2pd
|
||||||
install -d ${PREFIX}/share/i2pd
|
@gzip -kf debian/i2pd.1 && install debian/i2pd.1.gz ${PREFIX}/usr/share/man/man1
|
||||||
@cp -R contrib/certificates ${PREFIX}/share/i2pd/
|
@ln -sf ${PREFIX}/usr/share/i2pd/certificates ${PREFIX}/var/lib/i2pd/
|
||||||
install -d ${PREFIX}/share/man ${PREFIX}/share/man/man1
|
|
||||||
@gzip -kf debian/i2pd.1 && install debian/i2pd.1.gz ${PREFIX}/share/man/man1
|
|
||||||
install -d ${PREFIX}/var ${PREFIX}/var/lib ${PREFIX}/var/lib/i2pd
|
|
||||||
@ln -sf ${PREFIX}/share/i2pd/certificates ${PREFIX}/var/lib/i2pd/certificates
|
|
||||||
@ln -sf ${PREFIX}/etc/i2pd/tunnels.conf.d ${PREFIX}/var/lib/i2pd/tunnels.d
|
@ln -sf ${PREFIX}/etc/i2pd/tunnels.conf.d ${PREFIX}/var/lib/i2pd/tunnels.d
|
||||||
@ln -sf ${PREFIX}/etc/i2pd/i2pd.conf ${PREFIX}/var/lib/i2pd/i2pd.conf
|
@ln -sf ${PREFIX}/etc/i2pd/i2pd.conf ${PREFIX}/var/lib/i2pd/i2pd.conf
|
||||||
@ln -sf ${PREFIX}/etc/i2pd/subscriptions.txt ${PREFIX}/var/lib/i2pd/subscriptions.txt
|
@ln -sf ${PREFIX}/etc/i2pd/subscriptions.txt ${PREFIX}/var/lib/i2pd/subscriptions.txt
|
||||||
|
|||||||
@@ -3,51 +3,58 @@ USE_WIN32_APP := yes
|
|||||||
|
|
||||||
WINDRES = windres
|
WINDRES = windres
|
||||||
|
|
||||||
CXXFLAGS := $(CXX_DEBUG) -fPIC -msse
|
CXXFLAGS := $(CXX_DEBUG) -DWIN32_LEAN_AND_MEAN -fPIC -msse
|
||||||
INCFLAGS := -I$(DAEMON_SRC_DIR) -IWin32
|
INCFLAGS = -I$(DAEMON_SRC_DIR) -IWin32
|
||||||
LDFLAGS := ${LD_DEBUG} -static -fPIC -msse
|
LDFLAGS := ${LD_DEBUG} -static
|
||||||
|
|
||||||
NEEDED_CXXFLAGS += -std=c++17
|
# detect proper flag for c++11 support by compilers
|
||||||
DEFINES += -DWIN32_LEAN_AND_MEAN
|
CXXVER := $(shell $(CXX) -dumpversion)
|
||||||
|
ifeq ($(shell expr match ${CXXVER} "[4]\.[7-9]\|4\.1[0-9]\|[5-6]"),4) # gcc 4.7 - 6
|
||||||
|
NEEDED_CXXFLAGS += -std=c++11
|
||||||
|
else ifeq ($(shell expr match ${CXXVER} "[1,7-9]"),1) # gcc >= 7
|
||||||
|
NEEDED_CXXFLAGS += -std=c++17
|
||||||
|
else # not supported
|
||||||
|
$(error Compiler too old)
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Boost libraries suffix
|
||||||
|
BOOST_SUFFIX = -mt
|
||||||
|
|
||||||
# UPNP Support
|
# UPNP Support
|
||||||
ifeq ($(USE_UPNP),yes)
|
ifeq ($(USE_UPNP),yes)
|
||||||
DEFINES += -DUSE_UPNP -DMINIUPNP_STATICLIB
|
CXXFLAGS += -DUSE_UPNP -DMINIUPNP_STATICLIB
|
||||||
LDLIBS = -lminiupnpc
|
LDLIBS = -lminiupnpc
|
||||||
endif
|
endif
|
||||||
|
|
||||||
LDLIBS += \
|
LDLIBS += \
|
||||||
$(MINGW_PREFIX)/lib/libboost_system-mt.a \
|
-lboost_system$(BOOST_SUFFIX) \
|
||||||
$(MINGW_PREFIX)/lib/libboost_date_time-mt.a \
|
-lboost_date_time$(BOOST_SUFFIX) \
|
||||||
$(MINGW_PREFIX)/lib/libboost_filesystem-mt.a \
|
-lboost_filesystem$(BOOST_SUFFIX) \
|
||||||
$(MINGW_PREFIX)/lib/libboost_program_options-mt.a \
|
-lboost_program_options$(BOOST_SUFFIX) \
|
||||||
$(MINGW_PREFIX)/lib/libssl.a \
|
-lssl \
|
||||||
$(MINGW_PREFIX)/lib/libcrypto.a \
|
-lcrypto \
|
||||||
$(MINGW_PREFIX)/lib/libz.a \
|
-lz \
|
||||||
-lwsock32 \
|
-lwsock32 \
|
||||||
-lws2_32 \
|
-lws2_32 \
|
||||||
-liphlpapi \
|
|
||||||
-lcrypt32 \
|
|
||||||
-lgdi32 \
|
-lgdi32 \
|
||||||
|
-liphlpapi \
|
||||||
-lole32 \
|
-lole32 \
|
||||||
-luuid \
|
-luuid \
|
||||||
-lpthread
|
-lpthread
|
||||||
|
|
||||||
ifeq ($(USE_WIN32_APP), yes)
|
ifeq ($(USE_WIN32_APP), yes)
|
||||||
DEFINES += -DWIN32_APP
|
NEEDED_CXXFLAGS += -DWIN32_APP
|
||||||
LDFLAGS += -mwindows
|
LDFLAGS += -mwindows
|
||||||
DAEMON_RC += Win32/Resource.rc
|
DAEMON_RC += Win32/Resource.rc
|
||||||
DAEMON_OBJS += $(patsubst %.rc,obj/%.o,$(DAEMON_RC))
|
DAEMON_OBJS += $(patsubst %.rc,obj/%.o,$(DAEMON_RC))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(USE_WINXP_FLAGS), yes)
|
ifeq ($(USE_WINXP_FLAGS), yes)
|
||||||
DEFINES += -DWINVER=0x0501 -D_WIN32_WINNT=0x0501
|
NEEDED_CXXFLAGS += -DWINVER=0x0501 -D_WIN32_WINNT=0x0501
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(USE_AESNI),yes)
|
ifeq ($(USE_AESNI),yes)
|
||||||
NEEDED_CXXFLAGS += -maes
|
NEEDED_CXXFLAGS += -D__AES__ -maes
|
||||||
LDFLAGS += -maes
|
|
||||||
DEFINES += -D__AES__
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(USE_ASLR),yes)
|
ifeq ($(USE_ASLR),yes)
|
||||||
@@ -55,4 +62,4 @@ ifeq ($(USE_ASLR),yes)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
obj/%.o : %.rc | mk_obj_dir
|
obj/%.o : %.rc | mk_obj_dir
|
||||||
$(WINDRES) $(DEFINES) $(INCFLAGS) --preprocessor-arg=-MMD --preprocessor-arg=-MP --preprocessor-arg=-MF$@.d -i $< -o $@
|
$(WINDRES) -i $< -o $@
|
||||||
|
|||||||
18
Makefile.osx
18
Makefile.osx
@@ -1,10 +1,10 @@
|
|||||||
CXX = clang++
|
CXX = clang++
|
||||||
CXXFLAGS := ${CXX_DEBUG} -Wall -std=c++11
|
CXXFLAGS := ${CXX_DEBUG} -Wall -std=c++11 -DMAC_OSX
|
||||||
INCFLAGS = -I/usr/local/include
|
INCFLAGS = -I/usr/local/include
|
||||||
DEFINES := -DMAC_OSX
|
|
||||||
LDFLAGS := -Wl,-rpath,/usr/local/lib -L/usr/local/lib
|
LDFLAGS := -Wl,-rpath,/usr/local/lib -L/usr/local/lib
|
||||||
LDFLAGS += -Wl,-dead_strip
|
LDFLAGS += -Wl,-dead_strip
|
||||||
LDFLAGS += -Wl,-dead_strip_dylibs
|
LDFLAGS += -Wl,-dead_strip_dylibs
|
||||||
|
LDFLAGS += -Wl,-bind_at_load
|
||||||
|
|
||||||
ifeq ($(USE_STATIC),yes)
|
ifeq ($(USE_STATIC),yes)
|
||||||
LDLIBS = -lz /usr/local/lib/libcrypto.a /usr/local/lib/libssl.a /usr/local/lib/libboost_system.a /usr/local/lib/libboost_date_time.a /usr/local/lib/libboost_filesystem.a /usr/local/lib/libboost_program_options.a -lpthread
|
LDLIBS = -lz /usr/local/lib/libcrypto.a /usr/local/lib/libssl.a /usr/local/lib/libboost_system.a /usr/local/lib/libboost_date_time.a /usr/local/lib/libboost_filesystem.a /usr/local/lib/libboost_program_options.a -lpthread
|
||||||
@@ -14,7 +14,7 @@ endif
|
|||||||
|
|
||||||
ifeq ($(USE_UPNP),yes)
|
ifeq ($(USE_UPNP),yes)
|
||||||
LDFLAGS += -ldl
|
LDFLAGS += -ldl
|
||||||
DEFINES += -DUSE_UPNP
|
CXXFLAGS += -DUSE_UPNP
|
||||||
ifeq ($(USE_STATIC),yes)
|
ifeq ($(USE_STATIC),yes)
|
||||||
LDLIBS += /usr/local/lib/libminiupnpc.a
|
LDLIBS += /usr/local/lib/libminiupnpc.a
|
||||||
else
|
else
|
||||||
@@ -22,12 +22,8 @@ ifeq ($(USE_UPNP),yes)
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
OSARCH = $(shell uname -p)
|
ifeq ($(USE_AESNI),yes)
|
||||||
|
CXXFLAGS += -D__AES__ -maes
|
||||||
ifneq ($(OSARCH),powerpc)
|
else
|
||||||
ifeq ($(USE_AESNI),yes)
|
CXXFLAGS += -msse
|
||||||
CXXFLAGS += -D__AES__ -maes
|
|
||||||
else
|
|
||||||
CXXFLAGS += -msse
|
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
34
README.md
34
README.md
@@ -69,12 +69,12 @@ Build instructions:
|
|||||||
|
|
||||||
**Supported systems:**
|
**Supported systems:**
|
||||||
|
|
||||||
* GNU/Linux (Debian, Ubuntu, etc) - [](https://github.com/PurpleI2P/i2pd/actions/workflows/build.yml)
|
* GNU/Linux - [](https://github.com/PurpleI2P/i2pd/actions/workflows/build.yml)
|
||||||
* CentOS, Fedora, Mageia - [](https://copr.fedorainfracloud.org/coprs/supervillain/i2pd/package/i2pd-git/)
|
* CentOS / Fedora / Mageia - [](https://copr.fedorainfracloud.org/coprs/supervillain/i2pd/package/i2pd-git/)
|
||||||
* Alpine, ArchLinux, openSUSE, Gentoo, etc.
|
* Alpine, ArchLinux, openSUSE, Gentoo, Debian, Ubuntu, etc.
|
||||||
* Windows - [](https://github.com/PurpleI2P/i2pd/actions/workflows/build-windows.yml)
|
* Windows - [](https://github.com/PurpleI2P/i2pd/actions/workflows/build-windows.yml)
|
||||||
* Mac OS - [](https://github.com/PurpleI2P/i2pd/actions/workflows/build-osx.yml)
|
* Mac OS X - [](https://github.com/PurpleI2P/i2pd/actions/workflows/build-osx.yml)
|
||||||
* Docker image - [](https://github.com/PurpleI2P/i2pd/actions/workflows/docker.yml)
|
* Docker image - [](https://hub.docker.com/r/purplei2p/i2pd/builds/) [](https://github.com/PurpleI2P/i2pd/actions/workflows/docker.yml)
|
||||||
* Snap - [](https://snapcraft.io/i2pd) [](https://snapcraft.io/i2pd)
|
* Snap - [](https://snapcraft.io/i2pd) [](https://snapcraft.io/i2pd)
|
||||||
* FreeBSD - [](https://github.com/PurpleI2P/i2pd/actions/workflows/build-freebsd.yml)
|
* FreeBSD - [](https://github.com/PurpleI2P/i2pd/actions/workflows/build-freebsd.yml)
|
||||||
* Android - [](https://github.com/PurpleI2P/i2pd-android/actions/workflows/android.yml)
|
* Android - [](https://github.com/PurpleI2P/i2pd-android/actions/workflows/android.yml)
|
||||||
@@ -99,23 +99,13 @@ Current status: [](http
|
|||||||
Donations
|
Donations
|
||||||
---------
|
---------
|
||||||
|
|
||||||
**E-Mail**: ```i2porignal at yandex.com```
|
BTC: 3MDoGJW9TLMTCDGrR9bLgWXfm6sjmgy86f
|
||||||
|
LTC: LKQirrYrDeTuAPnpYq5y7LVKtywfkkHi59
|
||||||
**BTC**: ```3MDoGJW9TLMTCDGrR9bLgWXfm6sjmgy86f```
|
ETH: 0x9e5bac70d20d1079ceaa111127f4fb3bccce379d
|
||||||
|
DASH: Xw8YUrQpYzP9tZBmbjqxS3M97Q7v3vJKUF
|
||||||
**LTC**: ```LKQirrYrDeTuAPnpYq5y7LVKtywfkkHi59```
|
ZEC: t1cTckLuXsr1dwVrK4NDzfhehss4NvMadAJ
|
||||||
|
GST: GbD2JSQHBHCKLa9WTHmigJRpyFgmBj4woG
|
||||||
**ETH**: ```0x9e5bac70d20d1079ceaa111127f4fb3bccce379d```
|
XMR: 497pJc7X4xqKvcLBLpSUtRgWqMMyo24u4btCos3cak6gbMkpobgSU6492ztUcUBghyeHpYeczB55s38NpuHoH5WGNSPDRMH
|
||||||
|
|
||||||
**GST**: ```GbD2JSQHBHCKLa9WTHmigJRpyFgmBj4woG```
|
|
||||||
|
|
||||||
**DASH**: ```Xw8YUrQpYzP9tZBmbjqxS3M97Q7v3vJKUF```
|
|
||||||
|
|
||||||
**ZEC**: ```t1cTckLuXsr1dwVrK4NDzfhehss4NvMadAJ```
|
|
||||||
|
|
||||||
**ANC**: ```AQJYweYYUqM1nVfLqfoSMpUMfzxvS4Xd7z```
|
|
||||||
|
|
||||||
**XMR**: ```497pJc7X4xqKvcLBLpSUtRgWqMMyo24u4btCos3cak6gbMkpobgSU6492ztUcUBghyeHpYeczB55s38NpuHoH5WGNSPDRMH```
|
|
||||||
|
|
||||||
License
|
License
|
||||||
-------
|
-------
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2023, The PurpleI2P Project
|
* Copyright (c) 2013-2022, The PurpleI2P Project
|
||||||
*
|
*
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
* This file is part of Purple i2pd project and licensed under BSD3
|
||||||
*
|
*
|
||||||
@@ -29,7 +29,7 @@ namespace util
|
|||||||
setlocale(LC_CTYPE, "");
|
setlocale(LC_CTYPE, "");
|
||||||
SetConsoleCP(1251);
|
SetConsoleCP(1251);
|
||||||
SetConsoleOutputCP(1251);
|
SetConsoleOutputCP(1251);
|
||||||
//setlocale(LC_ALL, "Russian");
|
setlocale(LC_ALL, "Russian");
|
||||||
setlocale(LC_TIME, "C");
|
setlocale(LC_TIME, "C");
|
||||||
|
|
||||||
i2p::log::SetThrowFunction ([](const std::string& s)
|
i2p::log::SetThrowFunction ([](const std::string& s)
|
||||||
@@ -47,7 +47,7 @@ namespace util
|
|||||||
I2PService service((PSTR)SERVICE_NAME);
|
I2PService service((PSTR)SERVICE_NAME);
|
||||||
if (!I2PService::Run(service))
|
if (!I2PService::Run(service))
|
||||||
{
|
{
|
||||||
LogPrint(eLogCritical, "Daemon: Service failed to run w/err 0x%08lx\n", GetLastError());
|
LogPrint(eLogError, "Daemon: Service failed to run w/err 0x%08lx\n", GetLastError());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -61,10 +61,10 @@ namespace util
|
|||||||
setlocale(LC_CTYPE, "");
|
setlocale(LC_CTYPE, "");
|
||||||
SetConsoleCP(1251);
|
SetConsoleCP(1251);
|
||||||
SetConsoleOutputCP(1251);
|
SetConsoleOutputCP(1251);
|
||||||
//setlocale(LC_ALL, "Russian");
|
setlocale(LC_ALL, "Russian");
|
||||||
setlocale(LC_TIME, "C");
|
setlocale(LC_TIME, "C");
|
||||||
#ifdef WIN32_APP
|
#ifdef WIN32_APP
|
||||||
if (!i2p::win32::StartWin32App (isDaemon)) return false;
|
if (!i2p::win32::StartWin32App ()) return false;
|
||||||
#endif
|
#endif
|
||||||
bool ret = Daemon_Singleton::start();
|
bool ret = Daemon_Singleton::start();
|
||||||
if (ret && i2p::log::Logger().GetLogType() == eLogFile)
|
if (ret && i2p::log::Logger().GetLogType() == eLogFile)
|
||||||
|
|||||||
@@ -1,36 +1,36 @@
|
|||||||
#include "resource.h"
|
#include "resource.h"
|
||||||
|
|
||||||
#define APSTUDIO_READONLY_SYMBOLS
|
#define APSTUDIO_READONLY_SYMBOLS
|
||||||
#include "winres.h"
|
#include "winres.h"
|
||||||
#undef APSTUDIO_READONLY_SYMBOLS
|
#undef APSTUDIO_READONLY_SYMBOLS
|
||||||
|
|
||||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||||
#pragma code_page(1252)
|
#pragma code_page(1252)
|
||||||
|
|
||||||
#ifdef APSTUDIO_INVOKED
|
#ifdef APSTUDIO_INVOKED
|
||||||
1 TEXTINCLUDE
|
1 TEXTINCLUDE
|
||||||
BEGIN
|
BEGIN
|
||||||
"resource.h\0"
|
"resource.h\0"
|
||||||
END
|
END
|
||||||
|
|
||||||
2 TEXTINCLUDE
|
2 TEXTINCLUDE
|
||||||
BEGIN
|
BEGIN
|
||||||
"#include ""winres.h""\r\n"
|
"#include ""winres.h""\r\n"
|
||||||
"\0"
|
"\0"
|
||||||
END
|
END
|
||||||
|
|
||||||
3 TEXTINCLUDE
|
3 TEXTINCLUDE
|
||||||
BEGIN
|
BEGIN
|
||||||
"\r\n"
|
"\r\n"
|
||||||
"\0"
|
"\0"
|
||||||
END
|
END
|
||||||
#endif // APSTUDIO_INVOKED
|
#endif // APSTUDIO_INVOKED
|
||||||
|
|
||||||
MAINICON ICON "mask.ico"
|
MAINICON ICON "mask.ico"
|
||||||
#endif // English (United States) resources
|
#endif // English (United States) resources
|
||||||
|
|
||||||
#ifndef APSTUDIO_INVOKED
|
#ifndef APSTUDIO_INVOKED
|
||||||
#include "Resource.rc2"
|
#include "Resource.rc2"
|
||||||
#endif // not APSTUDIO_INVOKED
|
#endif // not APSTUDIO_INVOKED
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#error this file is not editable by Microsoft Visual C++
|
#error this file is not editable by Microsoft Visual C++
|
||||||
#endif //APSTUDIO_INVOKED
|
#endif //APSTUDIO_INVOKED
|
||||||
|
|
||||||
#include "version.h"
|
#include "../libi2pd/version.h"
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION I2PD_VERSION_MAJOR,I2PD_VERSION_MINOR,I2PD_VERSION_MICRO,I2PD_VERSION_PATCH
|
FILEVERSION I2PD_VERSION_MAJOR,I2PD_VERSION_MINOR,I2PD_VERSION_MICRO,I2PD_VERSION_PATCH
|
||||||
@@ -25,7 +25,7 @@ BEGIN
|
|||||||
VALUE "FileDescription", "C++ I2P daemon"
|
VALUE "FileDescription", "C++ I2P daemon"
|
||||||
VALUE "FileVersion", I2PD_VERSION
|
VALUE "FileVersion", I2PD_VERSION
|
||||||
VALUE "InternalName", CODENAME
|
VALUE "InternalName", CODENAME
|
||||||
VALUE "LegalCopyright", "Copyright (C) 2013-2023, The PurpleI2P Project"
|
VALUE "LegalCopyright", "Copyright (C) 2013-2022, The PurpleI2P Project"
|
||||||
VALUE "OriginalFilename", "i2pd"
|
VALUE "OriginalFilename", "i2pd"
|
||||||
VALUE "ProductName", "Purple I2P"
|
VALUE "ProductName", "Purple I2P"
|
||||||
VALUE "ProductVersion", I2P_VERSION
|
VALUE "ProductVersion", I2P_VERSION
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2022, The PurpleI2P Project
|
* Copyright (c) 2013-2020, The PurpleI2P Project
|
||||||
*
|
*
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
* This file is part of Purple i2pd project and licensed under BSD3
|
||||||
*
|
*
|
||||||
@@ -45,7 +45,6 @@ namespace i2p
|
|||||||
namespace win32
|
namespace win32
|
||||||
{
|
{
|
||||||
DWORD g_GracefulShutdownEndtime = 0;
|
DWORD g_GracefulShutdownEndtime = 0;
|
||||||
bool g_isWinService;
|
|
||||||
|
|
||||||
static void ShowPopupMenu (HWND hWnd, POINT *curpos, int wDefaultItem)
|
static void ShowPopupMenu (HWND hWnd, POINT *curpos, int wDefaultItem)
|
||||||
{
|
{
|
||||||
@@ -145,34 +144,35 @@ namespace win32
|
|||||||
s << bytes << " Bytes\n";
|
s << bytes << " Bytes\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ShowNetworkStatus (std::stringstream& s, RouterStatus status, bool testing)
|
static void ShowNetworkStatus (std::stringstream& s, RouterStatus status)
|
||||||
{
|
{
|
||||||
switch (status)
|
switch (status)
|
||||||
{
|
{
|
||||||
case eRouterStatusOK: s << "OK"; break;
|
case eRouterStatusOK: s << "OK"; break;
|
||||||
|
case eRouterStatusTesting: s << "Test"; break;
|
||||||
case eRouterStatusFirewalled: s << "FW"; break;
|
case eRouterStatusFirewalled: s << "FW"; break;
|
||||||
case eRouterStatusUnknown: s << "Unk"; break;
|
case eRouterStatusUnknown: s << "Unk"; break;
|
||||||
case eRouterStatusProxy: s << "Proxy"; break;
|
case eRouterStatusProxy: s << "Proxy"; break;
|
||||||
case eRouterStatusMesh: s << "Mesh"; break;
|
case eRouterStatusMesh: s << "Mesh"; break;
|
||||||
default: s << "Unk";
|
case eRouterStatusError:
|
||||||
};
|
|
||||||
if (testing)
|
|
||||||
s << " (Test)";
|
|
||||||
if (i2p::context.GetError () != eRouterErrorNone)
|
|
||||||
{
|
|
||||||
switch (i2p::context.GetError ())
|
|
||||||
{
|
{
|
||||||
case eRouterErrorClockSkew:
|
s << "Err";
|
||||||
s << " - Clock skew";
|
switch (i2p::context.GetError ())
|
||||||
|
{
|
||||||
|
case eRouterErrorClockSkew:
|
||||||
|
s << " - Clock skew";
|
||||||
|
break;
|
||||||
|
case eRouterErrorOffline:
|
||||||
|
s << " - Offline";
|
||||||
|
break;
|
||||||
|
case eRouterErrorSymmetricNAT:
|
||||||
|
s << " - Symmetric NAT";
|
||||||
|
break;
|
||||||
|
default: ;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case eRouterErrorOffline:
|
|
||||||
s << " - Offline";
|
|
||||||
break;
|
|
||||||
case eRouterErrorSymmetricNAT:
|
|
||||||
s << " - Symmetric NAT";
|
|
||||||
break;
|
|
||||||
default: ;
|
|
||||||
}
|
}
|
||||||
|
default: s << "Unk";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,11 +180,11 @@ namespace win32
|
|||||||
{
|
{
|
||||||
s << "\n";
|
s << "\n";
|
||||||
s << "Status: ";
|
s << "Status: ";
|
||||||
ShowNetworkStatus (s, i2p::context.GetStatus (), i2p::context.GetTesting ());
|
ShowNetworkStatus (s, i2p::context.GetStatus ());
|
||||||
if (i2p::context.SupportsV6 ())
|
if (i2p::context.SupportsV6 ())
|
||||||
{
|
{
|
||||||
s << " / ";
|
s << " / ";
|
||||||
ShowNetworkStatus (s, i2p::context.GetStatusV6 (), i2p::context.GetTestingV6 ());
|
ShowNetworkStatus (s, i2p::context.GetStatusV6 ());
|
||||||
}
|
}
|
||||||
s << "; ";
|
s << "; ";
|
||||||
s << "Success Rate: " << i2p::tunnel::tunnels.GetTunnelCreationSuccessRate() << "%\n";
|
s << "Success Rate: " << i2p::tunnel::tunnels.GetTunnelCreationSuccessRate() << "%\n";
|
||||||
@@ -349,9 +349,6 @@ namespace win32
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if (__cplusplus >= 201703L) // C++ 17 or higher
|
|
||||||
[[fallthrough]];
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
case WM_TRAYICON:
|
case WM_TRAYICON:
|
||||||
{
|
{
|
||||||
@@ -421,9 +418,8 @@ namespace win32
|
|||||||
return DefWindowProc( hWnd, uMsg, wParam, lParam);
|
return DefWindowProc( hWnd, uMsg, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool StartWin32App (bool isWinService)
|
bool StartWin32App ()
|
||||||
{
|
{
|
||||||
g_isWinService = isWinService;
|
|
||||||
if (FindWindow (I2PD_WIN32_CLASSNAME, TEXT("i2pd")))
|
if (FindWindow (I2PD_WIN32_CLASSNAME, TEXT("i2pd")))
|
||||||
{
|
{
|
||||||
MessageBox(NULL, TEXT("I2Pd is running already"), TEXT("Warning"), MB_OK);
|
MessageBox(NULL, TEXT("I2Pd is running already"), TEXT("Warning"), MB_OK);
|
||||||
@@ -452,9 +448,7 @@ namespace win32
|
|||||||
MessageBox(NULL, "Failed to create main window", TEXT("Warning!"), MB_ICONERROR | MB_OK | MB_TOPMOST);
|
MessageBox(NULL, "Failed to create main window", TEXT("Warning!"), MB_ICONERROR | MB_OK | MB_TOPMOST);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// COM requires message loop to work, which is not implemented in service mode
|
SubscribeToEvents();
|
||||||
if (!g_isWinService)
|
|
||||||
SubscribeToEvents();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -474,8 +468,7 @@ namespace win32
|
|||||||
HWND hWnd = FindWindow (I2PD_WIN32_CLASSNAME, TEXT("i2pd"));
|
HWND hWnd = FindWindow (I2PD_WIN32_CLASSNAME, TEXT("i2pd"));
|
||||||
if (hWnd)
|
if (hWnd)
|
||||||
PostMessage (hWnd, WM_COMMAND, MAKEWPARAM(ID_EXIT, 0), 0);
|
PostMessage (hWnd, WM_COMMAND, MAKEWPARAM(ID_EXIT, 0), 0);
|
||||||
else if(!g_isWinService)
|
// UnSubscribeFromEvents(); // TODO: understand why unsubscribing crashes app
|
||||||
UnSubscribeFromEvents();
|
|
||||||
UnregisterClass (I2PD_WIN32_CLASSNAME, GetModuleHandle(NULL));
|
UnregisterClass (I2PD_WIN32_CLASSNAME, GetModuleHandle(NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ namespace win32
|
|||||||
{
|
{
|
||||||
extern DWORD g_GracefulShutdownEndtime;
|
extern DWORD g_GracefulShutdownEndtime;
|
||||||
|
|
||||||
bool StartWin32App (bool isWinService);
|
bool StartWin32App ();
|
||||||
void StopWin32App ();
|
void StopWin32App ();
|
||||||
int RunWin32App ();
|
int RunWin32App ();
|
||||||
bool GracefulShutdown ();
|
bool GracefulShutdown ();
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ IUnknown *pUnknown = nullptr;
|
|||||||
INetworkListManager *pNetworkListManager = nullptr;
|
INetworkListManager *pNetworkListManager = nullptr;
|
||||||
IConnectionPointContainer *pCPContainer = nullptr;
|
IConnectionPointContainer *pCPContainer = nullptr;
|
||||||
IConnectionPoint *pConnectPoint = nullptr;
|
IConnectionPoint *pConnectPoint = nullptr;
|
||||||
CNetworkListManagerEvent *pNetEvent = nullptr;
|
|
||||||
DWORD Cookie = 0;
|
DWORD Cookie = 0;
|
||||||
|
|
||||||
void SubscribeToEvents()
|
void SubscribeToEvents()
|
||||||
@@ -30,11 +29,7 @@ void SubscribeToEvents()
|
|||||||
if (SUCCEEDED(Result))
|
if (SUCCEEDED(Result))
|
||||||
{
|
{
|
||||||
VARIANT_BOOL IsConnect = VARIANT_FALSE;
|
VARIANT_BOOL IsConnect = VARIANT_FALSE;
|
||||||
#if defined(_MSC_VER)
|
|
||||||
Result = pNetworkListManager->get_IsConnectedToInternet(&IsConnect);
|
|
||||||
#else
|
|
||||||
Result = pNetworkListManager->IsConnectedToInternet(&IsConnect);
|
Result = pNetworkListManager->IsConnectedToInternet(&IsConnect);
|
||||||
#endif
|
|
||||||
if (SUCCEEDED(Result)) {
|
if (SUCCEEDED(Result)) {
|
||||||
i2p::transport::transports.SetOnline (true);
|
i2p::transport::transports.SetOnline (true);
|
||||||
LogPrint(eLogInfo, "NetState: Current state: ", IsConnect == VARIANT_TRUE ? "connected" : "disconnected");
|
LogPrint(eLogInfo, "NetState: Current state: ", IsConnect == VARIANT_TRUE ? "connected" : "disconnected");
|
||||||
@@ -46,8 +41,8 @@ void SubscribeToEvents()
|
|||||||
Result = pCPContainer->FindConnectionPoint(IID_INetworkListManagerEvents, &pConnectPoint);
|
Result = pCPContainer->FindConnectionPoint(IID_INetworkListManagerEvents, &pConnectPoint);
|
||||||
if(SUCCEEDED(Result))
|
if(SUCCEEDED(Result))
|
||||||
{
|
{
|
||||||
pNetEvent = new CNetworkListManagerEvent;
|
CNetworkListManagerEvent *NetEvent = new CNetworkListManagerEvent;
|
||||||
Result = pConnectPoint->Advise((IUnknown *)pNetEvent, &Cookie);
|
Result = pConnectPoint->Advise((IUnknown *)NetEvent, &Cookie);
|
||||||
if (SUCCEEDED(Result))
|
if (SUCCEEDED(Result))
|
||||||
LogPrint(eLogInfo, "NetState: Successfully subscribed to NetworkListManagerEvent messages");
|
LogPrint(eLogInfo, "NetState: Successfully subscribed to NetworkListManagerEvent messages");
|
||||||
else
|
else
|
||||||
@@ -64,7 +59,6 @@ void SubscribeToEvents()
|
|||||||
|
|
||||||
void UnSubscribeFromEvents()
|
void UnSubscribeFromEvents()
|
||||||
{
|
{
|
||||||
LogPrint(eLogInfo, "NetState: Unsubscribing from NetworkListManagerEvents");
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (pConnectPoint) {
|
if (pConnectPoint) {
|
||||||
@@ -72,9 +66,6 @@ void UnSubscribeFromEvents()
|
|||||||
pConnectPoint->Release();
|
pConnectPoint->Release();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pNetEvent)
|
|
||||||
pNetEvent->Release();
|
|
||||||
|
|
||||||
if (pCPContainer)
|
if (pCPContainer)
|
||||||
pCPContainer->Release();
|
pCPContainer->Release();
|
||||||
|
|
||||||
|
|||||||
@@ -19,18 +19,21 @@ class CNetworkListManagerEvent : public INetworkListManagerEvents
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CNetworkListManagerEvent() : m_ref(1) { }
|
CNetworkListManagerEvent() : m_ref(1) { }
|
||||||
|
~CNetworkListManagerEvent() { }
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject)
|
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject)
|
||||||
{
|
{
|
||||||
|
HRESULT Result = S_OK;
|
||||||
if (IsEqualIID(riid, IID_IUnknown)) {
|
if (IsEqualIID(riid, IID_IUnknown)) {
|
||||||
*ppvObject = (IUnknown *)this;
|
*ppvObject = (IUnknown *)this;
|
||||||
} else if (IsEqualIID(riid ,IID_INetworkListManagerEvents)) {
|
} else if (IsEqualIID(riid ,IID_INetworkListManagerEvents)) {
|
||||||
*ppvObject = (INetworkListManagerEvents *)this;
|
*ppvObject = (INetworkListManagerEvents *)this;
|
||||||
} else {
|
} else {
|
||||||
return E_NOINTERFACE;
|
Result = E_NOINTERFACE;
|
||||||
}
|
}
|
||||||
AddRef();
|
AddRef();
|
||||||
return S_OK;
|
|
||||||
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
ULONG STDMETHODCALLTYPE AddRef()
|
ULONG STDMETHODCALLTYPE AddRef()
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ BOOL I2PService::isService()
|
|||||||
HWINSTA hWinStation = GetProcessWindowStation();
|
HWINSTA hWinStation = GetProcessWindowStation();
|
||||||
if (hWinStation != NULL)
|
if (hWinStation != NULL)
|
||||||
{
|
{
|
||||||
USEROBJECTFLAGS uof = { FALSE, FALSE, 0 };
|
USEROBJECTFLAGS uof = { 0 };
|
||||||
if (GetUserObjectInformation(hWinStation, UOI_FLAGS, &uof, sizeof(USEROBJECTFLAGS), NULL) && ((uof.dwFlags & WSF_VISIBLE) == 0))
|
if (GetUserObjectInformation(hWinStation, UOI_FLAGS, &uof, sizeof(USEROBJECTFLAGS), NULL) && ((uof.dwFlags & WSF_VISIBLE) == 0))
|
||||||
{
|
{
|
||||||
bIsService = TRUE;
|
bIsService = TRUE;
|
||||||
@@ -119,12 +119,12 @@ void I2PService::Start(DWORD dwArgc, PSTR *pszArgv)
|
|||||||
}
|
}
|
||||||
catch (DWORD dwError)
|
catch (DWORD dwError)
|
||||||
{
|
{
|
||||||
LogPrint(eLogCritical, "Win32Service: Start error: ", dwError);
|
LogPrint(eLogError, "Win32Service: Start error: ", dwError);
|
||||||
SetServiceStatus(SERVICE_STOPPED, dwError);
|
SetServiceStatus(SERVICE_STOPPED, dwError);
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
LogPrint(eLogCritical, "Win32Service: failed to start: ", EVENTLOG_ERROR_TYPE);
|
LogPrint(eLogError, "Win32Service: failed to start: ", EVENTLOG_ERROR_TYPE);
|
||||||
SetServiceStatus(SERVICE_STOPPED);
|
SetServiceStatus(SERVICE_STOPPED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -162,7 +162,7 @@ void I2PService::Stop()
|
|||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
LogPrint(eLogCritical, "Win32Service: Failed to stop: ", EVENTLOG_ERROR_TYPE);
|
LogPrint(eLogError, "Win32Service: Failed to stop: ", EVENTLOG_ERROR_TYPE);
|
||||||
SetServiceStatus(dwOriginalState);
|
SetServiceStatus(dwOriginalState);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -191,12 +191,12 @@ void I2PService::Pause()
|
|||||||
}
|
}
|
||||||
catch (DWORD dwError)
|
catch (DWORD dwError)
|
||||||
{
|
{
|
||||||
LogPrint(eLogCritical, "Win32Service: Pause error: ", dwError);
|
LogPrint(eLogError, "Win32Service: Pause error: ", dwError);
|
||||||
SetServiceStatus(SERVICE_RUNNING);
|
SetServiceStatus(SERVICE_RUNNING);
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
LogPrint(eLogCritical, "Win32Service: Failed to pause: ", EVENTLOG_ERROR_TYPE);
|
LogPrint(eLogError, "Win32Service: Failed to pause: ", EVENTLOG_ERROR_TYPE);
|
||||||
SetServiceStatus(SERVICE_RUNNING);
|
SetServiceStatus(SERVICE_RUNNING);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -215,12 +215,12 @@ void I2PService::Continue()
|
|||||||
}
|
}
|
||||||
catch (DWORD dwError)
|
catch (DWORD dwError)
|
||||||
{
|
{
|
||||||
LogPrint(eLogCritical, "Win32Service: Continue error: ", dwError);
|
LogPrint(eLogError, "Win32Service: Continue error: ", dwError);
|
||||||
SetServiceStatus(SERVICE_PAUSED);
|
SetServiceStatus(SERVICE_PAUSED);
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
LogPrint(eLogCritical, "Win32Service: Failed to resume: ", EVENTLOG_ERROR_TYPE);
|
LogPrint(eLogError, "Win32Service: Failed to resume: ", EVENTLOG_ERROR_TYPE);
|
||||||
SetServiceStatus(SERVICE_PAUSED);
|
SetServiceStatus(SERVICE_PAUSED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -238,11 +238,11 @@ void I2PService::Shutdown()
|
|||||||
}
|
}
|
||||||
catch (DWORD dwError)
|
catch (DWORD dwError)
|
||||||
{
|
{
|
||||||
LogPrint(eLogCritical, "Win32Service: Shutdown error: ", dwError);
|
LogPrint(eLogError, "Win32Service: Shutdown error: ", dwError);
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
LogPrint(eLogCritical, "Win32Service: Failed to shut down: ", EVENTLOG_ERROR_TYPE);
|
LogPrint(eLogError, "Win32Service: Failed to shut down: ", EVENTLOG_ERROR_TYPE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
BIN
Win32/mask.bmp
Normal file
BIN
Win32/mask.bmp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 25 KiB |
14
build/.gitignore
vendored
14
build/.gitignore
vendored
@@ -1,13 +1,6 @@
|
|||||||
# Various generated files
|
# Various generated files
|
||||||
/CMakeFiles/
|
/CMakeFiles/
|
||||||
/Testing/
|
|
||||||
/tests/
|
|
||||||
/.ninja_*
|
|
||||||
/arch.c
|
|
||||||
/build.ninja
|
|
||||||
/i2pd
|
/i2pd
|
||||||
/i2pd.exe
|
|
||||||
/i2pd.exe.debug
|
|
||||||
/libi2pd.a
|
/libi2pd.a
|
||||||
/libi2pdclient.a
|
/libi2pdclient.a
|
||||||
/libi2pdlang.a
|
/libi2pdlang.a
|
||||||
@@ -15,13 +8,8 @@
|
|||||||
/CMakeCache.txt
|
/CMakeCache.txt
|
||||||
/CPackConfig.cmake
|
/CPackConfig.cmake
|
||||||
/CPackSourceConfig.cmake
|
/CPackSourceConfig.cmake
|
||||||
/CTestTestfile.cmake
|
|
||||||
/install_manifest.txt
|
/install_manifest.txt
|
||||||
/Makefile
|
/arch.c
|
||||||
# windows build script
|
# windows build script
|
||||||
i2pd*.zip
|
i2pd*.zip
|
||||||
build*.log
|
build*.log
|
||||||
# MVS project files
|
|
||||||
*.vcxproj
|
|
||||||
*.vcxproj.filters
|
|
||||||
*.sln
|
|
||||||
|
|||||||
@@ -1,32 +1,14 @@
|
|||||||
cmake_minimum_required(VERSION 3.7)
|
cmake_minimum_required(VERSION 3.7)
|
||||||
|
cmake_policy(VERSION 3.7)
|
||||||
if(${CMAKE_VERSION} VERSION_LESS 3.22)
|
project("i2pd")
|
||||||
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
|
|
||||||
else()
|
|
||||||
cmake_policy(VERSION 3.22)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# for debugging
|
# for debugging
|
||||||
#set(CMAKE_VERBOSE_MAKEFILE on)
|
#set(CMAKE_VERBOSE_MAKEFILE on)
|
||||||
|
|
||||||
# paths
|
# Win32 build with cmake is not supported
|
||||||
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules")
|
if(WIN32 OR MSVC OR MSYS OR MINGW)
|
||||||
set(CMAKE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/..")
|
message(SEND_ERROR "cmake build for windows is not supported. Please use MSYS2 with makefiles in project root.")
|
||||||
|
endif()
|
||||||
set(LIBI2PD_SRC_DIR ${CMAKE_SOURCE_DIR}/libi2pd)
|
|
||||||
set(LIBI2PD_CLIENT_SRC_DIR ${CMAKE_SOURCE_DIR}/libi2pd_client)
|
|
||||||
set(LANG_SRC_DIR ${CMAKE_SOURCE_DIR}/i18n)
|
|
||||||
set(DAEMON_SRC_DIR ${CMAKE_SOURCE_DIR}/daemon)
|
|
||||||
|
|
||||||
include(Version)
|
|
||||||
set_version("${LIBI2PD_SRC_DIR}/version.h" PROJECT_VERSION)
|
|
||||||
|
|
||||||
project(
|
|
||||||
i2pd
|
|
||||||
VERSION ${PROJECT_VERSION}
|
|
||||||
HOMEPAGE_URL "https://i2pd.website/"
|
|
||||||
LANGUAGES C CXX
|
|
||||||
)
|
|
||||||
|
|
||||||
# configurable options
|
# configurable options
|
||||||
option(WITH_AESNI "Use AES-NI instructions set" ON)
|
option(WITH_AESNI "Use AES-NI instructions set" ON)
|
||||||
@@ -35,31 +17,30 @@ option(WITH_LIBRARY "Build library" ON)
|
|||||||
option(WITH_BINARY "Build binary" ON)
|
option(WITH_BINARY "Build binary" ON)
|
||||||
option(WITH_STATIC "Static build" OFF)
|
option(WITH_STATIC "Static build" OFF)
|
||||||
option(WITH_UPNP "Include support for UPnP client" OFF)
|
option(WITH_UPNP "Include support for UPnP client" OFF)
|
||||||
option(WITH_GIT_VERSION "Use git commit info as version" OFF)
|
|
||||||
option(WITH_ADDRSANITIZER "Build with address sanitizer unix only" OFF)
|
option(WITH_ADDRSANITIZER "Build with address sanitizer unix only" OFF)
|
||||||
option(WITH_THREADSANITIZER "Build with thread sanitizer unix only" OFF)
|
option(WITH_THREADSANITIZER "Build with thread sanitizer unix only" OFF)
|
||||||
option(BUILD_TESTING "Build tests" OFF)
|
|
||||||
|
|
||||||
IF(BUILD_TESTING)
|
# paths
|
||||||
enable_testing()
|
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules")
|
||||||
ENDIF()
|
set(CMAKE_SOURCE_DIR "..")
|
||||||
|
|
||||||
# Handle paths nicely
|
#Handle paths nicely
|
||||||
include(GNUInstallDirs)
|
include(GNUInstallDirs)
|
||||||
|
|
||||||
# Architecture
|
# architecture
|
||||||
include(TargetArch)
|
include(TargetArch)
|
||||||
target_architecture(ARCHITECTURE)
|
target_architecture(ARCHITECTURE)
|
||||||
|
|
||||||
include(CheckAtomic)
|
set(LIBI2PD_SRC_DIR ../libi2pd)
|
||||||
|
set(LIBI2PD_CLIENT_SRC_DIR ../libi2pd_client)
|
||||||
if(WITH_STATIC)
|
set(LANG_SRC_DIR ../i18n)
|
||||||
if(MSVC)
|
set(DAEMON_SRC_DIR ../daemon)
|
||||||
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include_directories(${LIBI2PD_SRC_DIR})
|
include_directories(${LIBI2PD_SRC_DIR})
|
||||||
|
include_directories(${LIBI2PD_CLIENT_SRC_DIR})
|
||||||
|
include_directories(${LANG_SRC_DIR})
|
||||||
|
include_directories(${DAEMON_SRC_DIR})
|
||||||
|
|
||||||
FILE(GLOB LIBI2PD_SRC ${LIBI2PD_SRC_DIR}/*.cpp)
|
FILE(GLOB LIBI2PD_SRC ${LIBI2PD_SRC_DIR}/*.cpp)
|
||||||
add_library(libi2pd ${LIBI2PD_SRC})
|
add_library(libi2pd ${LIBI2PD_SRC})
|
||||||
set_target_properties(libi2pd PROPERTIES PREFIX "")
|
set_target_properties(libi2pd PROPERTIES PREFIX "")
|
||||||
@@ -70,9 +51,11 @@ if(WITH_LIBRARY)
|
|||||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
COMPONENT Libraries)
|
COMPONENT Libraries)
|
||||||
|
# TODO Make libi2pd available to 3rd party projects via CMake as imported target
|
||||||
|
# FIXME This pulls stdafx
|
||||||
|
# install(EXPORT libi2pd DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
include_directories(${LIBI2PD_CLIENT_SRC_DIR})
|
|
||||||
FILE(GLOB CLIENT_SRC ${LIBI2PD_CLIENT_SRC_DIR}/*.cpp)
|
FILE(GLOB CLIENT_SRC ${LIBI2PD_CLIENT_SRC_DIR}/*.cpp)
|
||||||
add_library(libi2pdclient ${CLIENT_SRC})
|
add_library(libi2pdclient ${CLIENT_SRC})
|
||||||
set_target_properties(libi2pdclient PROPERTIES PREFIX "")
|
set_target_properties(libi2pdclient PROPERTIES PREFIX "")
|
||||||
@@ -85,7 +68,6 @@ if(WITH_LIBRARY)
|
|||||||
COMPONENT Libraries)
|
COMPONENT Libraries)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
include_directories(${LANG_SRC_DIR})
|
|
||||||
FILE(GLOB LANG_SRC ${LANG_SRC_DIR}/*.cpp)
|
FILE(GLOB LANG_SRC ${LANG_SRC_DIR}/*.cpp)
|
||||||
add_library(libi2pdlang ${LANG_SRC})
|
add_library(libi2pdlang ${LANG_SRC})
|
||||||
set_target_properties(libi2pdlang PROPERTIES PREFIX "")
|
set_target_properties(libi2pdlang PROPERTIES PREFIX "")
|
||||||
@@ -98,78 +80,39 @@ if(WITH_LIBRARY)
|
|||||||
COMPONENT Libraries)
|
COMPONENT Libraries)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
include_directories(${DAEMON_SRC_DIR})
|
|
||||||
|
|
||||||
set(DAEMON_SRC
|
set(DAEMON_SRC
|
||||||
"${DAEMON_SRC_DIR}/Daemon.cpp"
|
"${DAEMON_SRC_DIR}/Daemon.cpp"
|
||||||
"${DAEMON_SRC_DIR}/HTTPServer.cpp"
|
"${DAEMON_SRC_DIR}/HTTPServer.cpp"
|
||||||
"${DAEMON_SRC_DIR}/I2PControl.cpp"
|
"${DAEMON_SRC_DIR}/I2PControl.cpp"
|
||||||
"${DAEMON_SRC_DIR}/I2PControlHandlers.cpp"
|
|
||||||
"${DAEMON_SRC_DIR}/i2pd.cpp"
|
"${DAEMON_SRC_DIR}/i2pd.cpp"
|
||||||
"${DAEMON_SRC_DIR}/UPnP.cpp"
|
"${DAEMON_SRC_DIR}/UPnP.cpp"
|
||||||
)
|
)
|
||||||
|
|
||||||
if(WIN32)
|
|
||||||
set(WIN32_SRC_DIR ${CMAKE_SOURCE_DIR}/Win32)
|
|
||||||
include_directories(${WIN32_SRC_DIR})
|
|
||||||
|
|
||||||
list(APPEND DAEMON_SRC
|
|
||||||
"${WIN32_SRC_DIR}/DaemonWin32.cpp"
|
|
||||||
"${WIN32_SRC_DIR}/Win32App.cpp"
|
|
||||||
"${WIN32_SRC_DIR}/Win32Service.cpp"
|
|
||||||
"${WIN32_SRC_DIR}/Win32NetState.cpp"
|
|
||||||
)
|
|
||||||
|
|
||||||
file(GLOB WIN32_RC ${WIN32_SRC_DIR}/*.rc)
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWIN32_APP -DWIN32_LEAN_AND_MEAN -DNOMINMAX")
|
|
||||||
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WITH_UPNP)
|
if(WITH_UPNP)
|
||||||
add_definitions(-DUSE_UPNP)
|
add_definitions(-DUSE_UPNP)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(WITH_GIT_VERSION)
|
|
||||||
include(GetGitRevisionDescription)
|
|
||||||
git_describe(GIT_VERSION)
|
|
||||||
add_definitions(-DGITVER=${GIT_VERSION})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
add_definitions(-DMAC_OSX)
|
add_definitions(-DMAC_OSX)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(HAIKU)
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Winvalid-pch -Wno-unused-parameter")
|
||||||
add_definitions(-D_DEFAULT_SOURCE -D_GNU_SOURCE)
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -pedantic")
|
||||||
endif()
|
# TODO: The following is incompatible with static build and enabled hardening for OpenWRT.
|
||||||
|
# Multiple definitions of __stack_chk_fail(libssp & libc)
|
||||||
|
set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -flto -s -ffunction-sections -fdata-sections")
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "-Wl,--gc-sections") # -flto is added from above
|
||||||
|
|
||||||
if(MSVC)
|
# check for c++17 & c++11 support
|
||||||
add_definitions(-DWINVER=0x0600)
|
include(CheckCXXCompilerFlag)
|
||||||
add_definitions(-D_WIN32_WINNT=0x0600)
|
CHECK_CXX_COMPILER_FLAG("-std=c++17" CXX17_SUPPORTED)
|
||||||
|
CHECK_CXX_COMPILER_FLAG("-std=c++11" CXX11_SUPPORTED)
|
||||||
|
if(CXX17_SUPPORTED)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
|
||||||
|
elseif(CXX11_SUPPORTED)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
||||||
else()
|
else()
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Winvalid-pch -Wno-unused-parameter -Wno-uninitialized")
|
message(SEND_ERROR "C++17 nor C++11 standard not seems to be supported by compiler. Too old version?")
|
||||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -pedantic")
|
|
||||||
# TODO: The following is incompatible with static build and enabled hardening for OpenWRT.
|
|
||||||
# Multiple definitions of __stack_chk_fail(libssp & libc)
|
|
||||||
if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
|
||||||
set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -flto -s")
|
|
||||||
endif()
|
|
||||||
set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -ffunction-sections -fdata-sections")
|
|
||||||
set(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "-Wl,--gc-sections") # -flto is added from above
|
|
||||||
|
|
||||||
# check for c++17 & c++11 support
|
|
||||||
include(CheckCXXCompilerFlag)
|
|
||||||
|
|
||||||
CHECK_CXX_COMPILER_FLAG("-std=c++17" CXX17_SUPPORTED)
|
|
||||||
CHECK_CXX_COMPILER_FLAG("-std=c++11" CXX11_SUPPORTED)
|
|
||||||
|
|
||||||
if(CXX17_SUPPORTED)
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
|
|
||||||
elseif(CXX11_SUPPORTED)
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
|
||||||
else()
|
|
||||||
message(SEND_ERROR "C++17 nor C++11 standard not seems to be supported by compiler. Too old version?")
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||||
@@ -201,11 +144,8 @@ endif()
|
|||||||
|
|
||||||
# Note: AES-NI and AVX is available on x86-based CPU's.
|
# Note: AES-NI and AVX is available on x86-based CPU's.
|
||||||
# Here also ARM64 implementation, but currently we don't support it.
|
# Here also ARM64 implementation, but currently we don't support it.
|
||||||
# MSVC is not supported due to different ASM processing, so we hope OpenSSL has its own checks to run optimized code.
|
|
||||||
if(WITH_AESNI AND (ARCHITECTURE MATCHES "x86_64" OR ARCHITECTURE MATCHES "i386"))
|
if(WITH_AESNI AND (ARCHITECTURE MATCHES "x86_64" OR ARCHITECTURE MATCHES "i386"))
|
||||||
if(NOT MSVC)
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -maes")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -maes")
|
|
||||||
endif()
|
|
||||||
add_definitions(-D__AES__)
|
add_definitions(-D__AES__)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -223,48 +163,27 @@ if(WITH_THREADSANITIZER)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Use std::atomic instead of GCC builtins on macOS PowerPC:
|
|
||||||
# For more information refer to: https://github.com/PurpleI2P/i2pd/issues/1726#issuecomment-1306335111
|
|
||||||
# This has been fixed in Boost 1.81, nevertheless we retain the setting for the sake of compatibility.
|
|
||||||
if(APPLE AND CMAKE_OSX_ARCHITECTURES MATCHES "ppc")
|
|
||||||
add_definitions(-DBOOST_SP_USE_STD_ATOMIC)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# libraries
|
# libraries
|
||||||
|
# TODO: once CMake 3.1+ becomes mainstream, see e.g. http://stackoverflow.com/a/29871891/673826
|
||||||
|
# use imported Threads::Threads instead
|
||||||
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||||
find_package(Threads REQUIRED)
|
if(IOS)
|
||||||
|
set(CMAKE_THREAD_LIBS_INIT "-lpthread")
|
||||||
|
set(CMAKE_HAVE_THREADS_LIBRARY 1)
|
||||||
|
set(CMAKE_USE_WIN32_THREADS_INIT 0)
|
||||||
|
set(CMAKE_USE_PTHREADS_INIT 1)
|
||||||
|
else()
|
||||||
|
find_package(Threads REQUIRED)
|
||||||
|
endif()
|
||||||
|
if(THREADS_HAVE_PTHREAD_ARG) # compile time flag
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
|
||||||
|
endif()
|
||||||
|
|
||||||
if(WITH_STATIC)
|
if(WITH_STATIC)
|
||||||
if(NOT MSVC)
|
|
||||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(Boost_USE_STATIC_LIBS ON)
|
set(Boost_USE_STATIC_LIBS ON)
|
||||||
if(MSVC)
|
set(Boost_USE_STATIC_RUNTIME ON)
|
||||||
set(Boost_USE_STATIC_RUNTIME ON)
|
|
||||||
else()
|
|
||||||
set(Boost_USE_STATIC_RUNTIME OFF)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(MSVC)
|
|
||||||
set(OPENSSL_MSVC_STATIC_RT ON)
|
|
||||||
endif()
|
|
||||||
set(OPENSSL_USE_STATIC_LIBS ON)
|
|
||||||
|
|
||||||
set(ZLIB_USE_STATIC_LIBS ON)
|
|
||||||
if(MSVC)
|
|
||||||
set(ZLIB_NAMES zlibstatic zlibstat)
|
|
||||||
else()
|
|
||||||
set(ZLIB_NAMES libz zlibstatic zlibstat zlib z)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WITH_UPNP)
|
|
||||||
set(MINIUPNPC_USE_STATIC_LIBS ON)
|
|
||||||
add_definitions(-DMINIUPNP_STATICLIB)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(BUILD_SHARED_LIBS OFF)
|
set(BUILD_SHARED_LIBS OFF)
|
||||||
|
|
||||||
if(${CMAKE_CXX_COMPILER} MATCHES ".*-openwrt-.*")
|
if(${CMAKE_CXX_COMPILER} MATCHES ".*-openwrt-.*")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
|
||||||
# set(CMAKE_THREAD_LIBS_INIT "gcc_eh -Wl,--whole-archive -lpthread -Wl,--no-whole-archive")
|
# set(CMAKE_THREAD_LIBS_INIT "gcc_eh -Wl,--whole-archive -lpthread -Wl,--no-whole-archive")
|
||||||
@@ -274,28 +193,24 @@ else()
|
|||||||
# TODO: Consider separate compilation for LIBI2PD_SRC for library.
|
# TODO: Consider separate compilation for LIBI2PD_SRC for library.
|
||||||
# No need in -fPIC overhead for binary if not interested in library
|
# No need in -fPIC overhead for binary if not interested in library
|
||||||
# HINT: revert c266cff CMakeLists.txt: compilation speed up
|
# HINT: revert c266cff CMakeLists.txt: compilation speed up
|
||||||
if(NOT MSVC)
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
|
add_definitions(-DBOOST_SYSTEM_DYN_LINK -DBOOST_FILESYSTEM_DYN_LINK -DBOOST_PROGRAM_OPTIONS_DYN_LINK -DBOOST_DATE_TIME_DYN_LINK -DBOOST_REGEX_DYN_LINK)
|
||||||
endif()
|
|
||||||
add_definitions(-DBOOST_ATOMIC_DYN_LINK -DBOOST_SYSTEM_DYN_LINK -DBOOST_FILESYSTEM_DYN_LINK -DBOOST_PROGRAM_OPTIONS_DYN_LINK -DBOOST_DATE_TIME_DYN_LINK -DBOOST_REGEX_DYN_LINK)
|
|
||||||
if(WIN32)
|
|
||||||
set(Boost_USE_STATIC_LIBS OFF)
|
|
||||||
set(Boost_USE_STATIC_RUNTIME OFF)
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
find_package(Boost REQUIRED COMPONENTS system filesystem program_options date_time OPTIONAL_COMPONENTS atomic)
|
target_link_libraries(libi2pdclient libi2pd libi2pdlang)
|
||||||
if(NOT DEFINED Boost_FOUND)
|
|
||||||
|
find_package(Boost COMPONENTS system filesystem program_options date_time REQUIRED)
|
||||||
|
if(NOT DEFINED Boost_INCLUDE_DIRS)
|
||||||
message(SEND_ERROR "Boost is not found, or your boost version was below 1.46. Please download Boost!")
|
message(SEND_ERROR "Boost is not found, or your boost version was below 1.46. Please download Boost!")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
find_package(OpenSSL REQUIRED)
|
find_package(OpenSSL REQUIRED)
|
||||||
if(NOT DEFINED OPENSSL_FOUND)
|
if(NOT DEFINED OPENSSL_INCLUDE_DIR)
|
||||||
message(SEND_ERROR "Could not find OpenSSL. Please download and install it first!")
|
message(SEND_ERROR "Could not find OpenSSL. Please download and install it first!")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(OPENSSL_VERSION VERSION_GREATER_EQUAL "3.0.0")
|
if(OPENSSL_VERSION VERSION_GREATER_EQUAL "3.0.0")
|
||||||
add_definitions(-DOPENSSL_SUPPRESS_DEPRECATED)
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(WITH_UPNP)
|
if(WITH_UPNP)
|
||||||
@@ -315,6 +230,8 @@ endif()
|
|||||||
# load includes
|
# load includes
|
||||||
include_directories(SYSTEM ${Boost_INCLUDE_DIRS} ${OPENSSL_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR})
|
include_directories(SYSTEM ${Boost_INCLUDE_DIRS} ${OPENSSL_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR})
|
||||||
|
|
||||||
|
include(CheckAtomic)
|
||||||
|
|
||||||
# show summary
|
# show summary
|
||||||
message(STATUS "---------------------------------------")
|
message(STATUS "---------------------------------------")
|
||||||
message(STATUS "Build type : ${CMAKE_BUILD_TYPE}")
|
message(STATUS "Build type : ${CMAKE_BUILD_TYPE}")
|
||||||
@@ -330,64 +247,40 @@ message(STATUS " LIBRARY : ${WITH_LIBRARY}")
|
|||||||
message(STATUS " BINARY : ${WITH_BINARY}")
|
message(STATUS " BINARY : ${WITH_BINARY}")
|
||||||
message(STATUS " STATIC BUILD : ${WITH_STATIC}")
|
message(STATUS " STATIC BUILD : ${WITH_STATIC}")
|
||||||
message(STATUS " UPnP : ${WITH_UPNP}")
|
message(STATUS " UPnP : ${WITH_UPNP}")
|
||||||
if(WITH_GIT_VERSION)
|
|
||||||
message(STATUS " GIT VERSION : ${WITH_GIT_VERSION} (${GIT_VERSION})")
|
|
||||||
else()
|
|
||||||
message(STATUS " GIT VERSION : ${WITH_GIT_VERSION}")
|
|
||||||
endif()
|
|
||||||
message(STATUS " ADDRSANITIZER : ${WITH_ADDRSANITIZER}")
|
message(STATUS " ADDRSANITIZER : ${WITH_ADDRSANITIZER}")
|
||||||
message(STATUS " THREADSANITIZER : ${WITH_THREADSANITIZER}")
|
message(STATUS " THREADSANITIZER : ${WITH_THREADSANITIZER}")
|
||||||
message(STATUS "---------------------------------------")
|
message(STATUS "---------------------------------------")
|
||||||
|
|
||||||
if(WITH_BINARY)
|
if(WITH_BINARY)
|
||||||
if(WIN32)
|
add_executable("${PROJECT_NAME}" ${DAEMON_SRC})
|
||||||
add_executable("${PROJECT_NAME}" WIN32 ${DAEMON_SRC} ${WIN32_RC})
|
|
||||||
else()
|
|
||||||
add_executable("${PROJECT_NAME}" ${DAEMON_SRC})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WIN32)
|
|
||||||
list(APPEND MINGW_EXTRA "wsock32" "ws2_32" "iphlpapi")
|
|
||||||
# OpenSSL may require Crypt32 library on MSVC build, which is not added by CMake lesser than 3.21
|
|
||||||
if(MSVC AND ${CMAKE_VERSION} VERSION_LESS 3.21)
|
|
||||||
list(APPEND MINGW_EXTRA "crypt32")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WITH_STATIC)
|
if(WITH_STATIC)
|
||||||
if(NOT MSVC)
|
set_target_properties("${PROJECT_NAME}" PROPERTIES LINK_FLAGS "-static")
|
||||||
set_target_properties("${PROJECT_NAME}" PROPERTIES LINK_FLAGS "-static")
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(WITH_HARDENING AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
if(WITH_HARDENING AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||||
set_target_properties("${PROJECT_NAME}" PROPERTIES LINK_FLAGS "-z relro -z now")
|
set_target_properties("${PROJECT_NAME}" PROPERTIES LINK_FLAGS "-z relro -z now")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(WITH_UPNP)
|
||||||
|
set(UPNP_LIB ${MINIUPNPC_LIBRARY})
|
||||||
|
endif()
|
||||||
|
|
||||||
# FindBoost pulls pthread for thread which is broken for static linking at least on Ubuntu 15.04
|
# FindBoost pulls pthread for thread which is broken for static linking at least on Ubuntu 15.04
|
||||||
list(GET Boost_LIBRARIES -1 LAST_Boost_LIBRARIES)
|
list(GET Boost_LIBRARIES -1 LAST_Boost_LIBRARIES)
|
||||||
if(${LAST_Boost_LIBRARIES} MATCHES ".*pthread.*")
|
if(${LAST_Boost_LIBRARIES} MATCHES ".*pthread.*")
|
||||||
list(REMOVE_AT Boost_LIBRARIES -1)
|
list(REMOVE_AT Boost_LIBRARIES -1)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# synchronization library is incompatible with Windows 7
|
|
||||||
if(WIN32)
|
|
||||||
get_target_property(BOOSTFSLIBS Boost::filesystem INTERFACE_LINK_LIBRARIES)
|
|
||||||
list(REMOVE_ITEM BOOSTFSLIBS synchronization)
|
|
||||||
set_target_properties(Boost::filesystem PROPERTIES INTERFACE_LINK_LIBRARIES "${BOOSTFSLIBS}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WITH_STATIC)
|
if(WITH_STATIC)
|
||||||
set(DL_LIB ${CMAKE_DL_LIBS})
|
set(DL_LIB ${CMAKE_DL_LIBS})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
target_link_libraries("${PROJECT_NAME}" libi2pd libi2pdclient libi2pdlang ${Boost_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto ${MINIUPNPC_LIBRARY} ZLIB::ZLIB Threads::Threads ${MINGW_EXTRA} ${DL_LIB} ${CMAKE_REQUIRED_LIBRARIES})
|
target_link_libraries(libi2pd ${Boost_LIBRARIES} ${ZLIB_LIBRARY})
|
||||||
|
target_link_libraries("${PROJECT_NAME}" libi2pd libi2pdclient libi2pdlang ${DL_LIB} ${Boost_LIBRARIES} ${OPENSSL_LIBRARIES} ${UPNP_LIB} ${ZLIB_LIBRARY} ${CMAKE_THREAD_LIBS_INIT} ${DL_LIB} ${CMAKE_REQUIRED_LIBRARIES})
|
||||||
|
|
||||||
install(TARGETS "${PROJECT_NAME}" RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT Runtime)
|
install(TARGETS "${PROJECT_NAME}" RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT Runtime)
|
||||||
set(APPS "\${CMAKE_INSTALL_PREFIX}/bin/${PROJECT_NAME}${CMAKE_EXECUTABLE_SUFFIX}")
|
set(APPS "\${CMAKE_INSTALL_PREFIX}/bin/${PROJECT_NAME}${CMAKE_EXECUTABLE_SUFFIX}")
|
||||||
set(DIRS "${Boost_LIBRARY_DIR};${OPENSSL_INCLUDE_DIR}/../bin;${ZLIB_INCLUDE_DIR}/../bin;/mingw32/bin")
|
set(DIRS "${Boost_LIBRARY_DIR};${OPENSSL_INCLUDE_DIR}/../bin;${ZLIB_INCLUDE_DIR}/../bin;/mingw32/bin")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(BUILD_TESTING)
|
|
||||||
add_subdirectory(${CMAKE_SOURCE_DIR}/tests ${CMAKE_CURRENT_BINARY_DIR}/tests)
|
|
||||||
endif()
|
|
||||||
|
|||||||
@@ -52,28 +52,22 @@ REM converting configuration files to DOS format (make usable in Windows Notepad
|
|||||||
%xSH% "unix2dos contrib/i2pd.conf contrib/tunnels.conf contrib/tunnels.d/* contrib/webconsole/style.css" >> build\build.log 2>&1
|
%xSH% "unix2dos contrib/i2pd.conf contrib/tunnels.conf contrib/tunnels.d/* contrib/webconsole/style.css" >> build\build.log 2>&1
|
||||||
|
|
||||||
REM Prepare binary signing command if signing key and password provided
|
REM Prepare binary signing command if signing key and password provided
|
||||||
if defined SIGN (
|
if defined SIGNKEY (
|
||||||
echo Signing enabled
|
|
||||||
|
|
||||||
for %%X in (signtool.exe) do (set xSIGNTOOL=%%~$PATH:X)
|
|
||||||
if not defined xSIGNTOOL (
|
|
||||||
if not defined SIGNTOOL (
|
|
||||||
echo Error: Can't find signtool. Please provide path to binary using SIGNTOOL variable.
|
|
||||||
exit /b 1
|
|
||||||
) else (
|
|
||||||
set "xSIGNTOOL=%SIGNTOOL%"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
if defined SIGNKEY (
|
|
||||||
set "xSIGNKEYOPTS=/f ^"%SIGNKEY%^""
|
|
||||||
)
|
|
||||||
|
|
||||||
if defined SIGNPASS (
|
if defined SIGNPASS (
|
||||||
set "xSIGNPASSOPTS=/p ^"%SIGNPASS%^""
|
echo Signing options found
|
||||||
)
|
|
||||||
|
|
||||||
set "xSIGNOPTS=sign /tr http://timestamp.digicert.com /td sha256 /fd sha256 %xSIGNKEYOPTS% %xSIGNPASSOPTS%"
|
for %%X in (signtool.exe) do (set xSIGNTOOL=%%~$PATH:X)
|
||||||
|
if not defined xSIGNTOOL (
|
||||||
|
if not defined SIGNTOOL (
|
||||||
|
echo Error: Can't find signtool. Please provide path to binary using SIGNTOOL variable.
|
||||||
|
exit /b 1
|
||||||
|
) else (
|
||||||
|
set "xSIGNTOOL=%SIGNTOOL%"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
set "xSIGNOPTS=sign /tr http://timestamp.digicert.com /td sha256 /fd sha256 /f ^"%SIGNKEY%^" /p ^"%SIGNPASS%^""
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
REM starting building
|
REM starting building
|
||||||
|
|||||||
@@ -1,23 +1,18 @@
|
|||||||
# atomic builtins are required for threading support.
|
# atomic builtins are required for threading support.
|
||||||
|
|
||||||
INCLUDE(CheckCXXSourceCompiles)
|
INCLUDE(CheckCXXSourceCompiles)
|
||||||
INCLUDE(CheckLibraryExists)
|
|
||||||
|
|
||||||
# Sometimes linking against libatomic is required for atomic ops, if
|
# Sometimes linking against libatomic is required for atomic ops, if
|
||||||
# the platform doesn't support lock-free atomics.
|
# the platform doesn't support lock-free atomics.
|
||||||
|
|
||||||
function(check_working_cxx_atomics varname)
|
function(check_working_cxx_atomics varname)
|
||||||
set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
|
set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
|
||||||
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++11")
|
set(CMAKE_REQUIRED_FLAGS "-std=c++11")
|
||||||
CHECK_CXX_SOURCE_COMPILES("
|
CHECK_CXX_SOURCE_COMPILES("
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
std::atomic<int> x;
|
std::atomic<int> x;
|
||||||
std::atomic<short> y;
|
|
||||||
std::atomic<char> z;
|
|
||||||
int main() {
|
int main() {
|
||||||
++z;
|
return x;
|
||||||
++y;
|
|
||||||
return ++x;
|
|
||||||
}
|
}
|
||||||
" ${varname})
|
" ${varname})
|
||||||
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
|
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
|
||||||
@@ -32,7 +27,6 @@ function(check_working_cxx_atomics64 varname)
|
|||||||
std::atomic<uint64_t> x (0);
|
std::atomic<uint64_t> x (0);
|
||||||
int main() {
|
int main() {
|
||||||
uint64_t i = x.load(std::memory_order_relaxed);
|
uint64_t i = x.load(std::memory_order_relaxed);
|
||||||
(void)i;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
" ${varname})
|
" ${varname})
|
||||||
@@ -40,16 +34,15 @@ int main() {
|
|||||||
endfunction(check_working_cxx_atomics64)
|
endfunction(check_working_cxx_atomics64)
|
||||||
|
|
||||||
|
|
||||||
# Check for (non-64-bit) atomic operations.
|
# This isn't necessary on MSVC, so avoid command-line switch annoyance
|
||||||
if(MSVC)
|
# by only running on GCC-like hosts.
|
||||||
set(HAVE_CXX_ATOMICS_WITHOUT_LIB True)
|
if (LLVM_COMPILER_IS_GCC_COMPATIBLE)
|
||||||
else()
|
|
||||||
# First check if atomics work without the library.
|
# First check if atomics work without the library.
|
||||||
check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITHOUT_LIB)
|
check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITHOUT_LIB)
|
||||||
# If not, check if the library exists, and atomics work with it.
|
# If not, check if the library exists, and atomics work with it.
|
||||||
if(NOT HAVE_CXX_ATOMICS_WITHOUT_LIB)
|
if(NOT HAVE_CXX_ATOMICS_WITHOUT_LIB)
|
||||||
check_library_exists(atomic __atomic_fetch_add_4 "" HAVE_LIBATOMIC)
|
check_library_exists(atomic __atomic_fetch_add_4 "" HAVE_LIBATOMIC)
|
||||||
if(HAVE_LIBATOMIC)
|
if( HAVE_LIBATOMIC )
|
||||||
list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic")
|
list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic")
|
||||||
check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITH_LIB)
|
check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITH_LIB)
|
||||||
if (NOT HAVE_CXX_ATOMICS_WITH_LIB)
|
if (NOT HAVE_CXX_ATOMICS_WITH_LIB)
|
||||||
@@ -65,20 +58,20 @@ endif()
|
|||||||
if(MSVC)
|
if(MSVC)
|
||||||
set(HAVE_CXX_ATOMICS64_WITHOUT_LIB True)
|
set(HAVE_CXX_ATOMICS64_WITHOUT_LIB True)
|
||||||
else()
|
else()
|
||||||
# First check if atomics work without the library.
|
|
||||||
check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITHOUT_LIB)
|
check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITHOUT_LIB)
|
||||||
# If not, check if the library exists, and atomics work with it.
|
endif()
|
||||||
if(NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB)
|
|
||||||
check_library_exists(atomic __atomic_load_8 "" HAVE_CXX_LIBATOMICS64)
|
# If not, check if the library exists, and atomics work with it.
|
||||||
if(HAVE_CXX_LIBATOMICS64)
|
if(NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB)
|
||||||
list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic")
|
check_library_exists(atomic __atomic_load_8 "" HAVE_CXX_LIBATOMICS64)
|
||||||
check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITH_LIB)
|
if(HAVE_CXX_LIBATOMICS64)
|
||||||
if (NOT HAVE_CXX_ATOMICS64_WITH_LIB)
|
list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic")
|
||||||
message(FATAL_ERROR "Host compiler must support 64-bit std::atomic!")
|
check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITH_LIB)
|
||||||
endif()
|
if (NOT HAVE_CXX_ATOMICS64_WITH_LIB)
|
||||||
else()
|
message(FATAL_ERROR "Host compiler must support std::atomic!")
|
||||||
message(FATAL_ERROR "Host compiler appears to require libatomic for 64-bit operations, but cannot find it.")
|
|
||||||
endif()
|
endif()
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "Host compiler appears to require libatomic, but cannot find it.")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -87,6 +80,7 @@ endif()
|
|||||||
## assumes C++11 <atomic> works.
|
## assumes C++11 <atomic> works.
|
||||||
CHECK_CXX_SOURCE_COMPILES("
|
CHECK_CXX_SOURCE_COMPILES("
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
|
#include <Intrin.h> /* Workaround for PR19898. */
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#endif
|
#endif
|
||||||
int main() {
|
int main() {
|
||||||
|
|||||||
@@ -1,55 +0,0 @@
|
|||||||
# - Try to find the CHECK libraries
|
|
||||||
# Once done this will define
|
|
||||||
#
|
|
||||||
# CHECK_FOUND - system has check
|
|
||||||
# CHECK_INCLUDE_DIRS - the check include directory
|
|
||||||
# CHECK_LIBRARIES - check library
|
|
||||||
#
|
|
||||||
# Copyright (c) 2007 Daniel Gollub <gollub@b1-systems.de>
|
|
||||||
# Copyright (c) 2007-2009 Bjoern Ricks <bjoern.ricks@gmail.com>
|
|
||||||
#
|
|
||||||
# Redistribution and use is allowed according to the terms of the New
|
|
||||||
# BSD license.
|
|
||||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
|
||||||
|
|
||||||
|
|
||||||
INCLUDE( FindPkgConfig )
|
|
||||||
|
|
||||||
IF ( Check_FIND_REQUIRED )
|
|
||||||
SET( _pkgconfig_REQUIRED "REQUIRED" )
|
|
||||||
ELSE( Check_FIND_REQUIRED )
|
|
||||||
SET( _pkgconfig_REQUIRED "" )
|
|
||||||
ENDIF ( Check_FIND_REQUIRED )
|
|
||||||
|
|
||||||
IF ( CHECK_MIN_VERSION )
|
|
||||||
PKG_SEARCH_MODULE( CHECK ${_pkgconfig_REQUIRED} check>=${CHECK_MIN_VERSION} )
|
|
||||||
ELSE ( CHECK_MIN_VERSION )
|
|
||||||
PKG_SEARCH_MODULE( CHECK ${_pkgconfig_REQUIRED} check )
|
|
||||||
ENDIF ( CHECK_MIN_VERSION )
|
|
||||||
|
|
||||||
# Look for CHECK include dir and libraries
|
|
||||||
IF( NOT CHECK_FOUND AND NOT PKG_CONFIG_FOUND )
|
|
||||||
|
|
||||||
FIND_PATH( CHECK_INCLUDE_DIRS check.h )
|
|
||||||
|
|
||||||
FIND_LIBRARY( CHECK_LIBRARIES NAMES check )
|
|
||||||
|
|
||||||
IF ( CHECK_INCLUDE_DIRS AND CHECK_LIBRARIES )
|
|
||||||
SET( CHECK_FOUND 1 )
|
|
||||||
IF ( NOT Check_FIND_QUIETLY )
|
|
||||||
MESSAGE ( STATUS "Found CHECK: ${CHECK_LIBRARIES}" )
|
|
||||||
ENDIF ( NOT Check_FIND_QUIETLY )
|
|
||||||
ELSE ( CHECK_INCLUDE_DIRS AND CHECK_LIBRARIES )
|
|
||||||
IF ( Check_FIND_REQUIRED )
|
|
||||||
MESSAGE( FATAL_ERROR "Could NOT find CHECK" )
|
|
||||||
ELSE ( Check_FIND_REQUIRED )
|
|
||||||
IF ( NOT Check_FIND_QUIETLY )
|
|
||||||
MESSAGE( STATUS "Could NOT find CHECK" )
|
|
||||||
ENDIF ( NOT Check_FIND_QUIETLY )
|
|
||||||
ENDIF ( Check_FIND_REQUIRED )
|
|
||||||
ENDIF ( CHECK_INCLUDE_DIRS AND CHECK_LIBRARIES )
|
|
||||||
ENDIF( NOT CHECK_FOUND AND NOT PKG_CONFIG_FOUND )
|
|
||||||
|
|
||||||
# Hide advanced variables from CMake GUIs
|
|
||||||
MARK_AS_ADVANCED( CHECK_INCLUDE_DIRS CHECK_LIBRARIES )
|
|
||||||
|
|
||||||
@@ -1,284 +0,0 @@
|
|||||||
# - Returns a version string from Git
|
|
||||||
#
|
|
||||||
# These functions force a re-configure on each git commit so that you can
|
|
||||||
# trust the values of the variables in your build system.
|
|
||||||
#
|
|
||||||
# get_git_head_revision(<refspecvar> <hashvar> [ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR])
|
|
||||||
#
|
|
||||||
# Returns the refspec and sha hash of the current head revision
|
|
||||||
#
|
|
||||||
# git_describe(<var> [<additional arguments to git describe> ...])
|
|
||||||
#
|
|
||||||
# Returns the results of git describe on the source tree, and adjusting
|
|
||||||
# the output so that it tests false if an error occurs.
|
|
||||||
#
|
|
||||||
# git_describe_working_tree(<var> [<additional arguments to git describe> ...])
|
|
||||||
#
|
|
||||||
# Returns the results of git describe on the working tree (--dirty option),
|
|
||||||
# and adjusting the output so that it tests false if an error occurs.
|
|
||||||
#
|
|
||||||
# git_get_exact_tag(<var> [<additional arguments to git describe> ...])
|
|
||||||
#
|
|
||||||
# Returns the results of git describe --exact-match on the source tree,
|
|
||||||
# and adjusting the output so that it tests false if there was no exact
|
|
||||||
# matching tag.
|
|
||||||
#
|
|
||||||
# git_local_changes(<var>)
|
|
||||||
#
|
|
||||||
# Returns either "CLEAN" or "DIRTY" with respect to uncommitted changes.
|
|
||||||
# Uses the return code of "git diff-index --quiet HEAD --".
|
|
||||||
# Does not regard untracked files.
|
|
||||||
#
|
|
||||||
# Requires CMake 2.6 or newer (uses the 'function' command)
|
|
||||||
#
|
|
||||||
# Original Author:
|
|
||||||
# 2009-2020 Ryan Pavlik <ryan.pavlik@gmail.com> <abiryan@ryand.net>
|
|
||||||
# http://academic.cleardefinition.com
|
|
||||||
#
|
|
||||||
# Copyright 2009-2013, Iowa State University.
|
|
||||||
# Copyright 2013-2020, Ryan Pavlik
|
|
||||||
# Copyright 2013-2020, Contributors
|
|
||||||
# SPDX-License-Identifier: BSL-1.0
|
|
||||||
# Distributed under the Boost Software License, Version 1.0.
|
|
||||||
# (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
# http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
|
|
||||||
if(__get_git_revision_description)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
set(__get_git_revision_description YES)
|
|
||||||
|
|
||||||
# We must run the following at "include" time, not at function call time,
|
|
||||||
# to find the path to this module rather than the path to a calling list file
|
|
||||||
get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH)
|
|
||||||
|
|
||||||
# Function _git_find_closest_git_dir finds the next closest .git directory
|
|
||||||
# that is part of any directory in the path defined by _start_dir.
|
|
||||||
# The result is returned in the parent scope variable whose name is passed
|
|
||||||
# as variable _git_dir_var. If no .git directory can be found, the
|
|
||||||
# function returns an empty string via _git_dir_var.
|
|
||||||
#
|
|
||||||
# Example: Given a path C:/bla/foo/bar and assuming C:/bla/.git exists and
|
|
||||||
# neither foo nor bar contain a file/directory .git. This wil return
|
|
||||||
# C:/bla/.git
|
|
||||||
#
|
|
||||||
function(_git_find_closest_git_dir _start_dir _git_dir_var)
|
|
||||||
set(cur_dir "${_start_dir}")
|
|
||||||
set(git_dir "${_start_dir}/.git")
|
|
||||||
while(NOT EXISTS "${git_dir}")
|
|
||||||
# .git dir not found, search parent directories
|
|
||||||
set(git_previous_parent "${cur_dir}")
|
|
||||||
get_filename_component(cur_dir "${cur_dir}" DIRECTORY)
|
|
||||||
if(cur_dir STREQUAL git_previous_parent)
|
|
||||||
# We have reached the root directory, we are not in git
|
|
||||||
set(${_git_dir_var}
|
|
||||||
""
|
|
||||||
PARENT_SCOPE)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
set(git_dir "${cur_dir}/.git")
|
|
||||||
endwhile()
|
|
||||||
set(${_git_dir_var}
|
|
||||||
"${git_dir}"
|
|
||||||
PARENT_SCOPE)
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
function(get_git_head_revision _refspecvar _hashvar)
|
|
||||||
_git_find_closest_git_dir("${CMAKE_CURRENT_SOURCE_DIR}" GIT_DIR)
|
|
||||||
|
|
||||||
if("${ARGN}" STREQUAL "ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR")
|
|
||||||
set(ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR TRUE)
|
|
||||||
else()
|
|
||||||
set(ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR FALSE)
|
|
||||||
endif()
|
|
||||||
if(NOT "${GIT_DIR}" STREQUAL "")
|
|
||||||
file(RELATIVE_PATH _relative_to_source_dir "${CMAKE_SOURCE_DIR}"
|
|
||||||
"${GIT_DIR}")
|
|
||||||
if("${_relative_to_source_dir}" MATCHES "[.][.]" AND NOT ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR)
|
|
||||||
# We've gone above the CMake root dir.
|
|
||||||
set(GIT_DIR "")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
if("${GIT_DIR}" STREQUAL "")
|
|
||||||
set(${_refspecvar}
|
|
||||||
"GITDIR-NOTFOUND"
|
|
||||||
PARENT_SCOPE)
|
|
||||||
set(${_hashvar}
|
|
||||||
"GITDIR-NOTFOUND"
|
|
||||||
PARENT_SCOPE)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Check if the current source dir is a git submodule or a worktree.
|
|
||||||
# In both cases .git is a file instead of a directory.
|
|
||||||
#
|
|
||||||
if(NOT IS_DIRECTORY ${GIT_DIR})
|
|
||||||
# The following git command will return a non empty string that
|
|
||||||
# points to the super project working tree if the current
|
|
||||||
# source dir is inside a git submodule.
|
|
||||||
# Otherwise the command will return an empty string.
|
|
||||||
#
|
|
||||||
execute_process(
|
|
||||||
COMMAND "${GIT_EXECUTABLE}" rev-parse
|
|
||||||
--show-superproject-working-tree
|
|
||||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
|
||||||
OUTPUT_VARIABLE out
|
|
||||||
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
if(NOT "${out}" STREQUAL "")
|
|
||||||
# If out is empty, GIT_DIR/CMAKE_CURRENT_SOURCE_DIR is in a submodule
|
|
||||||
file(READ ${GIT_DIR} submodule)
|
|
||||||
string(REGEX REPLACE "gitdir: (.*)$" "\\1" GIT_DIR_RELATIVE
|
|
||||||
${submodule})
|
|
||||||
string(STRIP ${GIT_DIR_RELATIVE} GIT_DIR_RELATIVE)
|
|
||||||
get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH)
|
|
||||||
get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE}
|
|
||||||
ABSOLUTE)
|
|
||||||
set(HEAD_SOURCE_FILE "${GIT_DIR}/HEAD")
|
|
||||||
else()
|
|
||||||
# GIT_DIR/CMAKE_CURRENT_SOURCE_DIR is in a worktree
|
|
||||||
file(READ ${GIT_DIR} worktree_ref)
|
|
||||||
# The .git directory contains a path to the worktree information directory
|
|
||||||
# inside the parent git repo of the worktree.
|
|
||||||
#
|
|
||||||
string(REGEX REPLACE "gitdir: (.*)$" "\\1" git_worktree_dir
|
|
||||||
${worktree_ref})
|
|
||||||
string(STRIP ${git_worktree_dir} git_worktree_dir)
|
|
||||||
_git_find_closest_git_dir("${git_worktree_dir}" GIT_DIR)
|
|
||||||
set(HEAD_SOURCE_FILE "${git_worktree_dir}/HEAD")
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
set(HEAD_SOURCE_FILE "${GIT_DIR}/HEAD")
|
|
||||||
endif()
|
|
||||||
set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data")
|
|
||||||
if(NOT EXISTS "${GIT_DATA}")
|
|
||||||
file(MAKE_DIRECTORY "${GIT_DATA}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT EXISTS "${HEAD_SOURCE_FILE}")
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
set(HEAD_FILE "${GIT_DATA}/HEAD")
|
|
||||||
configure_file("${HEAD_SOURCE_FILE}" "${HEAD_FILE}" COPYONLY)
|
|
||||||
|
|
||||||
configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in"
|
|
||||||
"${GIT_DATA}/grabRef.cmake" @ONLY)
|
|
||||||
include("${GIT_DATA}/grabRef.cmake")
|
|
||||||
|
|
||||||
set(${_refspecvar}
|
|
||||||
"${HEAD_REF}"
|
|
||||||
PARENT_SCOPE)
|
|
||||||
set(${_hashvar}
|
|
||||||
"${HEAD_HASH}"
|
|
||||||
PARENT_SCOPE)
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
function(git_describe _var)
|
|
||||||
if(NOT GIT_FOUND)
|
|
||||||
find_package(Git QUIET)
|
|
||||||
endif()
|
|
||||||
get_git_head_revision(refspec hash)
|
|
||||||
if(NOT GIT_FOUND)
|
|
||||||
set(${_var}
|
|
||||||
"GIT-NOTFOUND"
|
|
||||||
PARENT_SCOPE)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
if(NOT hash)
|
|
||||||
set(${_var}
|
|
||||||
"HEAD-HASH-NOTFOUND"
|
|
||||||
PARENT_SCOPE)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# TODO sanitize
|
|
||||||
#if((${ARGN}" MATCHES "&&") OR
|
|
||||||
# (ARGN MATCHES "||") OR
|
|
||||||
# (ARGN MATCHES "\\;"))
|
|
||||||
# message("Please report the following error to the project!")
|
|
||||||
# message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}")
|
|
||||||
#endif()
|
|
||||||
|
|
||||||
#message(STATUS "Arguments to execute_process: ${ARGN}")
|
|
||||||
|
|
||||||
execute_process(
|
|
||||||
COMMAND "${GIT_EXECUTABLE}" describe --tags --always ${hash} ${ARGN}
|
|
||||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
|
||||||
RESULT_VARIABLE res
|
|
||||||
OUTPUT_VARIABLE out
|
|
||||||
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
if(NOT res EQUAL 0)
|
|
||||||
set(out "${out}-${res}-NOTFOUND")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(${_var}
|
|
||||||
"${out}"
|
|
||||||
PARENT_SCOPE)
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
function(git_describe_working_tree _var)
|
|
||||||
if(NOT GIT_FOUND)
|
|
||||||
find_package(Git QUIET)
|
|
||||||
endif()
|
|
||||||
if(NOT GIT_FOUND)
|
|
||||||
set(${_var}
|
|
||||||
"GIT-NOTFOUND"
|
|
||||||
PARENT_SCOPE)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
execute_process(
|
|
||||||
COMMAND "${GIT_EXECUTABLE}" describe --dirty ${ARGN}
|
|
||||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
|
||||||
RESULT_VARIABLE res
|
|
||||||
OUTPUT_VARIABLE out
|
|
||||||
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
if(NOT res EQUAL 0)
|
|
||||||
set(out "${out}-${res}-NOTFOUND")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(${_var}
|
|
||||||
"${out}"
|
|
||||||
PARENT_SCOPE)
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
function(git_get_exact_tag _var)
|
|
||||||
git_describe(out --exact-match ${ARGN})
|
|
||||||
set(${_var}
|
|
||||||
"${out}"
|
|
||||||
PARENT_SCOPE)
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
function(git_local_changes _var)
|
|
||||||
if(NOT GIT_FOUND)
|
|
||||||
find_package(Git QUIET)
|
|
||||||
endif()
|
|
||||||
get_git_head_revision(refspec hash)
|
|
||||||
if(NOT GIT_FOUND)
|
|
||||||
set(${_var}
|
|
||||||
"GIT-NOTFOUND"
|
|
||||||
PARENT_SCOPE)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
if(NOT hash)
|
|
||||||
set(${_var}
|
|
||||||
"HEAD-HASH-NOTFOUND"
|
|
||||||
PARENT_SCOPE)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
execute_process(
|
|
||||||
COMMAND "${GIT_EXECUTABLE}" diff-index --quiet HEAD --
|
|
||||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
|
||||||
RESULT_VARIABLE res
|
|
||||||
OUTPUT_VARIABLE out
|
|
||||||
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
if(res EQUAL 0)
|
|
||||||
set(${_var}
|
|
||||||
"CLEAN"
|
|
||||||
PARENT_SCOPE)
|
|
||||||
else()
|
|
||||||
set(${_var}
|
|
||||||
"DIRTY"
|
|
||||||
PARENT_SCOPE)
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
#
|
|
||||||
# Internal file for GetGitRevisionDescription.cmake
|
|
||||||
#
|
|
||||||
# Requires CMake 2.6 or newer (uses the 'function' command)
|
|
||||||
#
|
|
||||||
# Original Author:
|
|
||||||
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
|
|
||||||
# http://academic.cleardefinition.com
|
|
||||||
# Iowa State University HCI Graduate Program/VRAC
|
|
||||||
#
|
|
||||||
# Copyright 2009-2012, Iowa State University
|
|
||||||
# Copyright 2011-2015, Contributors
|
|
||||||
# Distributed under the Boost Software License, Version 1.0.
|
|
||||||
# (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
# http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
# SPDX-License-Identifier: BSL-1.0
|
|
||||||
|
|
||||||
set(HEAD_HASH)
|
|
||||||
|
|
||||||
file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024)
|
|
||||||
|
|
||||||
string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS)
|
|
||||||
if(HEAD_CONTENTS MATCHES "ref")
|
|
||||||
# named branch
|
|
||||||
string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}")
|
|
||||||
if(EXISTS "@GIT_DIR@/${HEAD_REF}")
|
|
||||||
configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY)
|
|
||||||
else()
|
|
||||||
configure_file("@GIT_DIR@/packed-refs" "@GIT_DATA@/packed-refs" COPYONLY)
|
|
||||||
file(READ "@GIT_DATA@/packed-refs" PACKED_REFS)
|
|
||||||
if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}")
|
|
||||||
set(HEAD_HASH "${CMAKE_MATCH_1}")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
# detached HEAD
|
|
||||||
configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT HEAD_HASH)
|
|
||||||
file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024)
|
|
||||||
string(STRIP "${HEAD_HASH}" HEAD_HASH)
|
|
||||||
endif()
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2017-2023, The PurpleI2P Project
|
# Copyright (c) 2017-2022, The PurpleI2P Project
|
||||||
# This file is part of Purple i2pd project and licensed under BSD3
|
# This file is part of Purple i2pd project and licensed under BSD3
|
||||||
# See full license text in LICENSE file at top of project tree
|
# See full license text in LICENSE file at top of project tree
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@ set(archdetect_c_code "
|
|||||||
|| defined(_M_ARM64) \\
|
|| defined(_M_ARM64) \\
|
||||||
|| (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 8)
|
|| (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 8)
|
||||||
#error cmake_ARCH arm64
|
#error cmake_ARCH arm64
|
||||||
#elif defined(__ARM_ARCH_7__) \\
|
#if defined(__ARM_ARCH_7__) \\
|
||||||
|| defined(__ARM_ARCH_7A__) \\
|
|| defined(__ARM_ARCH_7A__) \\
|
||||||
|| defined(__ARM_ARCH_7R__) \\
|
|| defined(__ARM_ARCH_7R__) \\
|
||||||
|| defined(__ARM_ARCH_7M__) \\
|
|| defined(__ARM_ARCH_7M__) \\
|
||||||
@@ -61,7 +61,7 @@ set(archdetect_c_code "
|
|||||||
#else
|
#else
|
||||||
#error cmake_ARCH mips
|
#error cmake_ARCH mips
|
||||||
#endif
|
#endif
|
||||||
#elif defined(__ppc__) || defined(__ppc) || defined(__powerpc__) || defined(__POWERPC__) \\
|
#elif defined(__ppc__) || defined(__ppc) || defined(__powerpc__) \\
|
||||||
|| defined(_ARCH_COM) || defined(_ARCH_PWR) || defined(_ARCH_PPC) \\
|
|| defined(_ARCH_COM) || defined(_ARCH_PWR) || defined(_ARCH_PPC) \\
|
||||||
|| defined(_M_MPPC) || defined(_M_PPC)
|
|| defined(_M_MPPC) || defined(_M_PPC)
|
||||||
#if defined(__ppc64__) || defined(__powerpc64__) || defined(__64BIT__)
|
#if defined(__ppc64__) || defined(__powerpc64__) || defined(__64BIT__)
|
||||||
@@ -83,13 +83,13 @@ function(target_architecture output_var)
|
|||||||
# First let's normalize the order of the values
|
# First let's normalize the order of the values
|
||||||
|
|
||||||
# Note that it's not possible to compile PowerPC applications if you are using
|
# Note that it's not possible to compile PowerPC applications if you are using
|
||||||
# the OS X SDK version 10.7 or later - you'll need 10.4/10.5/10.6 for that, so we
|
# the OS X SDK version 10.6 or later - you'll need 10.4/10.5 for that, so we
|
||||||
# disable it by default. Also, ppc64 is not supported in 10.6.
|
# disable it by default
|
||||||
# See this page for more information:
|
# See this page for more information:
|
||||||
# http://stackoverflow.com/questions/5333490/how-can-we-restore-ppc-ppc64-as-well-as-full-10-4-10-5-sdk-support-to-xcode-4
|
# http://stackoverflow.com/questions/5333490/how-can-we-restore-ppc-ppc64-as-well-as-full-10-4-10-5-sdk-support-to-xcode-4
|
||||||
|
|
||||||
# Architecture defaults to i386 or ppc on OS X 10.5 and earlier, depending on the CPU type detected at runtime.
|
# Architecture defaults to i386 or ppc on OS X 10.5 and earlier, depending on the CPU type detected at runtime.
|
||||||
# On OS X 10.6+ the default is x86_64 if the CPU supports it, i386 otherwise; 10.6 also supports ppc.
|
# On OS X 10.6+ the default is x86_64 if the CPU supports it, i386 otherwise.
|
||||||
|
|
||||||
foreach(osx_arch ${CMAKE_OSX_ARCHITECTURES})
|
foreach(osx_arch ${CMAKE_OSX_ARCHITECTURES})
|
||||||
if("${osx_arch}" STREQUAL "ppc" AND ppc_support)
|
if("${osx_arch}" STREQUAL "ppc" AND ppc_support)
|
||||||
@@ -133,11 +133,11 @@ function(target_architecture output_var)
|
|||||||
enable_language(C)
|
enable_language(C)
|
||||||
|
|
||||||
# Detect the architecture in a rather creative way...
|
# Detect the architecture in a rather creative way...
|
||||||
# This compiles a small C program which is a series of ifdefs that selects
|
# This compiles a small C program which is a series of ifdefs that selects a
|
||||||
# a particular #error preprocessor directive whose message string contains
|
# particular #error preprocessor directive whose message string contains the
|
||||||
# the target architecture. The program will always fail to compile (both because
|
# target architecture. The program will always fail to compile (both because
|
||||||
# file is not a valid C program, and obviously because of the presence of
|
# file is not a valid C program, and obviously because of the presence of the
|
||||||
# the #error preprocessor directives... but by exploiting the preprocessor in this
|
# #error preprocessor directives... but by exploiting the preprocessor in this
|
||||||
# way, we can detect the correct target architecture even when cross-compiling,
|
# way, we can detect the correct target architecture even when cross-compiling,
|
||||||
# since the program itself never needs to be run (only the compiler/preprocessor)
|
# since the program itself never needs to be run (only the compiler/preprocessor)
|
||||||
try_run(
|
try_run(
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
# read version
|
|
||||||
|
|
||||||
function(set_version version_file output_var)
|
|
||||||
file(READ "${version_file}" version_data)
|
|
||||||
|
|
||||||
string(REGEX MATCH "I2PD_VERSION_MAJOR ([0-9]*)" _ ${version_data})
|
|
||||||
set(version_major ${CMAKE_MATCH_1})
|
|
||||||
|
|
||||||
string(REGEX MATCH "I2PD_VERSION_MINOR ([0-9]*)" _ ${version_data})
|
|
||||||
set(version_minor ${CMAKE_MATCH_1})
|
|
||||||
|
|
||||||
string(REGEX MATCH "I2PD_VERSION_MICRO ([0-9]*)" _ ${version_data})
|
|
||||||
set(version_micro ${CMAKE_MATCH_1})
|
|
||||||
|
|
||||||
set(${output_var} "${version_major}.${version_minor}.${version_micro}" PARENT_SCOPE)
|
|
||||||
endfunction()
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
# _________________________________________
|
|
||||||
# / Copy this file to the right location \
|
|
||||||
# | then load with: |
|
|
||||||
# | |
|
|
||||||
# | apparmor_parser -r -W |
|
|
||||||
# | /etc/apparmor.d/docker-i2pd |
|
|
||||||
# | |
|
|
||||||
# | docker run --security-opt |
|
|
||||||
# | "apparmor=docker-i2pd" ... |
|
|
||||||
# | purplei2p/i2pd |
|
|
||||||
# | |
|
|
||||||
# \ And "aa-status" to verify it's loaded. /
|
|
||||||
# -----------------------------------------
|
|
||||||
# \ ^__^
|
|
||||||
# \ (oo)\_______
|
|
||||||
# (__)\ )\/\
|
|
||||||
# ||----w |
|
|
||||||
# || ||
|
|
||||||
|
|
||||||
#include <tunables/global>
|
|
||||||
|
|
||||||
profile docker-i2pd flags=(attach_disconnected,mediate_deleted) {
|
|
||||||
#include <abstractions/base>
|
|
||||||
#include <abstractions/openssl>
|
|
||||||
#include <abstractions/nameservice>
|
|
||||||
|
|
||||||
/bin/busybox ix,
|
|
||||||
/usr/local/bin/i2pd ix,
|
|
||||||
/entrypoint.sh ixr,
|
|
||||||
|
|
||||||
/i2pd_certificates/** r,
|
|
||||||
|
|
||||||
/home/i2pd/data/** rw,
|
|
||||||
|
|
||||||
/home/i2pd/data/i2pd.pid k,
|
|
||||||
|
|
||||||
deny /home/i2pd/data/i2pd.conf w,
|
|
||||||
deny /home/i2pd/data/tunnels.conf w,
|
|
||||||
deny /home/i2pd/data/tunnels.d/** w,
|
|
||||||
deny /home/i2pd/data/certificates/** w,
|
|
||||||
deny /home/i2pd/data/i2pd.log r,
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIF2TCCA8GgAwIBAgIQIHQPtSoFU+cUpYD8PZaWZjANBgkqhkiG9w0BAQsFADB2
|
|
||||||
MQswCQYDVQQGEwJYWDELMAkGA1UEBxMCWFgxCzAJBgNVBAkTAlhYMR4wHAYDVQQK
|
|
||||||
ExVJMlAgQW5vbnltb3VzIE5ldHdvcmsxDDAKBgNVBAsTA0kyUDEfMB0GA1UEAwwW
|
|
||||||
YXJuYXZiaGF0dDI4OEBtYWlsLmkycDAeFw0yMzAxMjUxODUzNDFaFw0zMzAxMjUx
|
|
||||||
ODUzNDFaMHYxCzAJBgNVBAYTAlhYMQswCQYDVQQHEwJYWDELMAkGA1UECRMCWFgx
|
|
||||||
HjAcBgNVBAoTFUkyUCBBbm9ueW1vdXMgTmV0d29yazEMMAoGA1UECxMDSTJQMR8w
|
|
||||||
HQYDVQQDDBZhcm5hdmJoYXR0Mjg4QG1haWwuaTJwMIICIjANBgkqhkiG9w0BAQEF
|
|
||||||
AAOCAg8AMIICCgKCAgEAtwG73sC0jYd3fgEzZh0SveAdUd5yD35nINJRrdPSrSwY
|
|
||||||
n3i1qGe3fNLj877PvUDU+qiHH0fFZfyFkXTaq3TUp1u4YkmvaoPHy6FZlojB08lK
|
|
||||||
FBm+iJ1hifQ7MFmvIKUGv+cjlN6xSoQ0U6B2QOy6iZnBgFZ/7jbRY4iZOIj7VJtY
|
|
||||||
aodeHfy0bWe447VJovbkUi7NJPFZQS65LMcAIWcWTxrC0Gj8SmdxL3a5+hxpmmg0
|
|
||||||
+KCQvWQDdxAQjsc16sgUCdUc6cWYO4yw9H6fgdq9GJX+LnXR9OB58GsAjjlLlFoI
|
|
||||||
CZxdARDpoqcIj6AoKIanALf8yfbIyrqqJE47cuaqV9bht5MWKnXbwHplEkT4ZNkh
|
|
||||||
PnRDia7B5HY3uwbt39CBm264PEWXvWG2sozTWKQqBjmMN2cj/NFDUEqKv6BggMY1
|
|
||||||
HcqxWFKRcgKCtRvrmTmfp5l0/ou+OtUaFUg0a6Qhtb93Hj10vK6wZzidBqj0ggzB
|
|
||||||
eJDI95b89u8JgzRoOBriuMKTc91WTkOvBLkB3dgUbUpx2p8KHjvf/pppBH9u0oxp
|
|
||||||
qJFFK840DbnJydEvjKezeVe5Ax6YRSRxyEdKzRoWdvKVxb3qBBKMdCKTYEPxHPBu
|
|
||||||
JMEQVUCXJMti++1KEiQGhcfWvLyT7OewbcIZNk9XWNrxlKcGrTp9AOwaaNC5m1kC
|
|
||||||
AwEAAaNjMGEwDgYDVR0PAQH/BAQDAgKEMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggr
|
|
||||||
BgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB8GA1UdDgQYBBZhcm5hdmJoYXR0Mjg4
|
|
||||||
QG1haWwuaTJwMA0GCSqGSIb3DQEBCwUAA4ICAQAHiK0ld/1PF9DIhutD660/bzBg
|
|
||||||
mF2Z76hcBqDZ8tnQai/u/RXYrH9wso9BYyrVsvk3fr6tpGT49Ian0MVpPOxMoTU2
|
|
||||||
oBEmQlYrfclQLFsOLmA0y2r1ggXzIrt69jB710Vhwdnz09oOE8rS4E2T5oDD8Wvy
|
|
||||||
Kony+AarRceqtkOlzyquc42KjzdrbHsosF7G2iGhNI6t+T3BfWJ+Q+d5sj3OIh6e
|
|
||||||
gSfvHL44E4vZt6dtofRN3MAZ60kNLF5YWyaUo3Snv9Lso1IwIz3AVr5ehv+8sFL/
|
|
||||||
KxaXdkZ5Yn2YUX7p1t4VQd+eXVPYjf1befg4PvrwSkylu3Jpee3fllZSKXeSVx9x
|
|
||||||
jpJiq5vIakqk22pnWb1Vn7xzSW1vtEG7QLjobOr1WrcGiwdv+HKiWcXJXDzKoWXs
|
|
||||||
h3VEfr51Kap8cIJv+D6lJIG9IcIhiQ6CXWBmtjWJvbdVwFBy1/3Fhaou9liHi+gK
|
|
||||||
4Yh5a5OGCzc7xjtpGaTmoLEz7NzDNOdd/r840qRDOh70izzmFZd5Gwq4hoVcPJcS
|
|
||||||
EAySwtgqK0/4d0zDd2Wg9ASJV9DnDf8QuSmHZgZ9Efs47XcWz9TvkWUS1E66AJsN
|
|
||||||
mmI1NDQ3mv3dv5+WPq+dqqYFsnx3xWL1g5Z3buk0opeuXMzoHwM7UfN8h7Q1M5+t
|
|
||||||
+XBgkaYA4iEwYKqlCQ==
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
@@ -1,33 +1,33 @@
|
|||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
MIIFvjCCA6agAwIBAgIQBnsUOmOu2oZZIwHBmQc1BDANBgkqhkiG9w0BAQsFADBt
|
MIIFvjCCA6agAwIBAgIQIDtv8tGMh0FyB2w5XjfZxTANBgkqhkiG9w0BAQsFADBt
|
||||||
MQswCQYDVQQGEwJYWDELMAkGA1UEBxMCWFgxCzAJBgNVBAkTAlhYMR4wHAYDVQQK
|
MQswCQYDVQQGEwJYWDELMAkGA1UEBxMCWFgxCzAJBgNVBAkTAlhYMR4wHAYDVQQK
|
||||||
ExVJMlAgQW5vbnltb3VzIE5ldHdvcmsxDDAKBgNVBAsTA0kyUDEWMBQGA1UEAwwN
|
ExVJMlAgQW5vbnltb3VzIE5ldHdvcmsxDDAKBgNVBAsTA0kyUDEWMBQGA1UEAwwN
|
||||||
aWdvckBub3ZnLm5ldDAeFw0yMzAxMjgxNDM4MzFaFw0zMzAxMjgxNDM4MzFaMG0x
|
aWdvckBub3ZnLm5ldDAeFw0xNzA3MjQxODI4NThaFw0yNzA3MjQxODI4NThaMG0x
|
||||||
CzAJBgNVBAYTAlhYMQswCQYDVQQHEwJYWDELMAkGA1UECRMCWFgxHjAcBgNVBAoT
|
CzAJBgNVBAYTAlhYMQswCQYDVQQHEwJYWDELMAkGA1UECRMCWFgxHjAcBgNVBAoT
|
||||||
FUkyUCBBbm9ueW1vdXMgTmV0d29yazEMMAoGA1UECxMDSTJQMRYwFAYDVQQDDA1p
|
FUkyUCBBbm9ueW1vdXMgTmV0d29yazEMMAoGA1UECxMDSTJQMRYwFAYDVQQDDA1p
|
||||||
Z29yQG5vdmcubmV0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvLkf
|
Z29yQG5vdmcubmV0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxst4
|
||||||
bM3uiYfp9m0vgdoftyXtk2/9bHf3u5iaM0WfoJIsw1iizo/mxJl+Iy7SxLC16nV0
|
cam3YibBtQHGPCPX13uRQti56U3XZytSZntaKrUFmJxjt41Q/mOy3KYo+lBvhfDF
|
||||||
v5FpncVv+Z8x9dgoAYVuLq9zKfsAbpj6kuxAqw6vJMlD1TiIL3nSODV9BJLk47X5
|
x3tWKjgP9LJOJ28zvddFhZVNxqZRjcnAoPuSOVCw88g01D9OAasKF11hCfdxZP6h
|
||||||
tmvoOSj9BgvemYThTE3nj+DbuJRW5q90KyBV/LdLrQJX3k5R3FFL5tTad2LKFNZ4
|
vGm8WCnjD8KPcYFxJC4HJUiFeProAwuTzEAESTRk4CAQe3Ie91JspuqoLUc5Qxlm
|
||||||
vEOcYwwx6mvrkJ2lly6bAQUCtfc648Jyq+NO3Rba1fmn7gcP9zXXc5KYsj/ovyY2
|
w5QpjnjfZY4kaVHmZDKGIZDgNIt5v85bu4pWwZ6O+o90xQqjxvjyz/xccIec3sHw
|
||||||
OaocSF5wMhzBuPxO+M2HqbYLMAkc6/GesGds8Rm8wofuhJoI5YtqJuLKZm6nQXSc
|
MHJ8h8ZKMokCKEJTaRWBvdeNXki7nf3gUy/3GjYQlzo0Nxk/Hw4svPcA+eL0AYiy
|
||||||
fx6PKgbKcTIUWNFMsxyfghz9hpbg0rkvC7PtfAjtV0yaDtUum1eZeNEx1HbRWN2n
|
Jn83bIB5VToW2zYUdV4u3qHeAhEg8Y7HI0kKcSUGm9AQXzbzP8YCHxi0sbb0GAJy
|
||||||
TQNCVuv0yaKC41qxqzhEybkdjL9JlgUh7VuskaCelB0lz+kgYjGu8ezOa0ua2iKq
|
f1Xf3XzoPfT64giD8ReUHhwKpyMB6uvG/NfWSZAzeAO/NT7DAwXpKIVQdkVdqy8b
|
||||||
4FC/1MbPulxN8NOt4pmbGqqoxmCdShp38wdnOBM3DsAS9f0JaQZd4CDyY4DCSfVn
|
mvHvjf9/kWKOirA2Nygf3r79Vbg2mqbYC/b63XI9hheU689+O7qyhTEhNz+11X0d
|
||||||
xPdWk31+VXVt3Ixh1EUqZWYTRSsZApkCyYzkiZ/qPGG6FR9Hq2SuhC5o4P44k7eo
|
Zax7UPrLrwOeB9TNfEnztsmrHNdv2n+KcOO2o11Wvz2nHP9g+dgwoZSD1ZEpFzWP
|
||||||
6wwBWD8a5RjsZhvr05E5yBrKXh/PjLwmtG73QC+ouR54/5xtedvdTwNS94FnNctX
|
0sD5knKLwAL/64qLlAQ1feqW7hMr80IADcKjLSODkIDIIGm0ksXqEzTjz1JzbRDq
|
||||||
FT6QGZnRwCkhPaRe1oQMzP+88pGoCfO33GBAuwUCAwEAAaNaMFgwDgYDVR0PAQH/
|
jUjq7EAlkw3G69rv1gHxIntllJRQidAqecyWHOMCAwEAAaNaMFgwDgYDVR0PAQH/
|
||||||
BAQDAgKEMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8E
|
BAQDAgKEMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8E
|
||||||
BTADAQH/MBYGA1UdDgQPBA1pZ29yQG5vdmcubmV0MA0GCSqGSIb3DQEBCwUAA4IC
|
BTADAQH/MBYGA1UdDgQPBA1pZ29yQG5vdmcubmV0MA0GCSqGSIb3DQEBCwUAA4IC
|
||||||
AQCteAb5/bqhHr/i5CJbDzlofprXFC826c19GxQ/9Hw0kA52l0J9Q8Vz8Vy7VQyP
|
AQADyPaec28qc1HQtAV5dscJr47k92RTfvan+GEgIwyQDHZQm38eyTb05xipQCdk
|
||||||
QNa8MCv6FeNy8a/wXp6cafyFsBtvehVQO8lFlpCgMEl2Bma43+GaCwkrM6bFNXeW
|
5ruUDFXLB5qXXFJKUbQM6IpaktmWDJqk4Zn+1nGbtFEbKgrF55pd63+NQer5QW9o
|
||||||
iQ9h4e1KjsUZ8cQDNEcamiJ80+xbMhBrj5bAZwKmZs8MoGEMyXKEZmcmwA+/fy1c
|
3+dGj0eZJa3HX5EBkd2r7j2LFuB6uxv3r/xiTeHaaflCnsmyDLfb7axvYhyEzHQS
|
||||||
cx4izsOsmRXmEHXsvB9ydJHZZeKW8+r0DAtgPslwXuXHG6MuBQo7dKCqn+iMxHXV
|
AUi1bR+ln+dXewdtuojqc1+YmVGDgzWZK2T0oOz2E21CpZUDiP3wv9QfMaotLEal
|
||||||
Jxriq3yvNffdGx4maSLJrjQ1ealt/UMzql7huVSItnVFWoYf7GAELXNJ/PmqVyaK
|
zECnbhS++q889inN3GB4kIoN6WpPpeYtTV+/r7FLv9+KUOV1s2z6mxIqC5wBFhZs
|
||||||
q11LQ8W/Aud6s/bblaJrFJnK8PbPpaw4RvHoWVLYaZYmQnV2msWs5EuESBlEADbv
|
0Sr1kVo8hB/EW/YYhDp99LoAOjIO6nn1h+qttfzBYr6C16j+8lGK2A12REJ4LiUQ
|
||||||
UklQXLMc2f9HKWPA5678nvYPrmu8IL5pMkAxgGRqmd+7vCz4lU9M5z3HObU+WRBt
|
cQI/0zTjt2C8Ns6ueNzMLQN1Mvmlg1Z8wIB7Az7jsIbY2zFJ0M5qR5VJveTj33K4
|
||||||
qEMYyXywV8o3tbmnlDS5S5Xxf+tLZn1cxz3ZrmcHPHDbLBNdvszF3CTJH/R2sQvD
|
4WSbC/zMWOBYHTVBvGmc6JGhu5ZUTZ+mWP7QfimGu+tdhvtrybFjE9ROIE/4yFr6
|
||||||
bizvYJM+p5F+GWM5mt6w0HrOut5MRlpOws/NRrkbijuVA/A45nzTtKplIFYE3qe8
|
GkxEyt0UY87TeKXJ/3KygvkMwdvqGWiZhItb807iy99+cySujtbGfF2ZXYGjBXVW
|
||||||
q5SAbwYLc8cJcZCN3PxtWwbEv81V33abMt5QcjnWGLH5t2+1Z2KLCgKLSCQTxM8s
|
dJOVRbyGQkHh6lrWHQM4ntBv4x+5QA+OAan5PBF3tcDx1vefPx+asYslbOXpzII5
|
||||||
zBPHtUe8qtSQaElnNLILYbtJ1w67dPnGYTphHihC+CXjBg==
|
qhvoQxuRs6j5jsVFG6RdsKNeQAt87Mb2u2zK2ZakMdyD1w==
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIFdTCCA12gAwIBAgIEQ5vCxzANBgkqhkiG9w0BAQ0FADBrMQswCQYDVQQGEwJY
|
|
||||||
WDELMAkGA1UECAwCWFgxCzAJBgNVBAcMAlhYMR4wHAYDVQQKDBVJMlAgQW5vbnlt
|
|
||||||
b3VzIE5ldHdvcmsxDDAKBgNVBAsMA0kyUDEUMBIGA1UEAwwLbHNAbWFpbC5pMnAw
|
|
||||||
HhcNMjMxMDE2MjAwNTA5WhcNMzMxMDEzMjAwNTA5WjBrMQswCQYDVQQGEwJYWDEL
|
|
||||||
MAkGA1UECAwCWFgxCzAJBgNVBAcMAlhYMR4wHAYDVQQKDBVJMlAgQW5vbnltb3Vz
|
|
||||||
IE5ldHdvcmsxDDAKBgNVBAsMA0kyUDEUMBIGA1UEAwwLbHNAbWFpbC5pMnAwggIi
|
|
||||||
MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDPcbKRtf4PzrDa0iRit0XrwnmA
|
|
||||||
2c1fJhkBipdPor7gMOAlkR82H1lkZSizR7kTZnr7vYqjDrOQr7bl5Dy3qo8/YCbZ
|
|
||||||
jsnUCTIIgIJQUxUlR40RjaSXphqzUEiXKHR6b0RahhFisQ3hlbbgzSch5YgSLKws
|
|
||||||
hOLi+eDSXw+HlwHlWFlT1XOKxSTJ/F3Bv40gxqZVC2pbxiPOeRZHQ6Ojw75lxTSF
|
|
||||||
gww2WzgztiWt4X9BO1yepnVqhAVRPmTfGUMfKzq9jkMzZKeQFV4uZSP9nCqzEpYd
|
|
||||||
WNDUfpTWiAQ9F+BwFXGusXXA3tGVwS7s6IEoiJFM5fsoJYfRoWGh3/1eirhBXW7U
|
|
||||||
M6oubMSTADyrvfjLfJBMmMnc2hNblRlKr0ZKUjMfv8cnyT4kQxlXLAHHXY2P89TM
|
|
||||||
TEVODkU48gnv6tC4t1JCb1/Da+3yVMjNX6rCzQfUwnLFrWthrwiI0NivAKFtiZjq
|
|
||||||
w1/ZQcYke2YyeqcfXMn+NTUA22Sm2mJoMo7jUf+rbM9Pi27/DncJgRGj5qwY0D3S
|
|
||||||
gc7829EjuZNPttGBmae1EmO7WQMB32cqdmItnV2FXpMhnn9h0u5H52kYqwn+mdtc
|
|
||||||
dTJRcbfKG1RTr3UjFISaTwL8qigMIkVXIzcpnr/R/sSeEs8xCqfsJ6rb4dCyFx+M
|
|
||||||
hqQcOCL5tumyd4W/LQIDAQABoyEwHzAdBgNVHQ4EFgQUgfaOG5HCnlW82wZ5BahL
|
|
||||||
GRO06igwDQYJKoZIhvcNAQENBQADggIBAKdVpqS9qF7gGotgXaVA1iP5YNsWlTvG
|
|
||||||
daGqeA/87//U21W6gpq82FhzsmsvUtXZfIeVIlDPI7WNDzS+A3K/KKrwM7dLgSie
|
|
||||||
r9eMl3D8WYPU95QF4mAlRyl7PCCsYoVjyvfro0iq3/iudIA5476rjfLdTXRi5hAT
|
|
||||||
qemPj0S+6sRjKEldRtGXrQATFlvLIWVYpgHijdDDx5M2hAz2y0mFxlDZTlA4BhL4
|
|
||||||
DwtGlVKmbc2x5MvIQM4UhbQqkxYS4gXnzf5Qx9QIytHfTr/hmbrkhKR1GCO31BSk
|
|
||||||
x9LhZxdI8LlwKSo6YgwXEB9E0M/tplaK9iZJFv4HPYLZrVJpb4IklMumyLMrgW5P
|
|
||||||
fR0dgKn+R9lk0emJ1Cu+qyyzf1vsLycYBwaEztINn4VK+/HfDFpnVCvJOyNuDmj5
|
|
||||||
KBLIoGdGoVfylmnc+e8zAXe+DY41fgniHMISOO78P8Bx9vTB+rhqnOUr9MzlUxPB
|
|
||||||
sKGjbXy2YynEqiGb+9g344v/+ukTSDenqTPHVzJ5uOi0iedy+3ASzUNN6GJocovP
|
|
||||||
167VOhwaETM0FwiKe0VdZRLLbbZ79CtJC0tmgcgPQPRa9Ldr6KN7u1J3D6lUp6zl
|
|
||||||
byPom10ueKONRb36t7ai79l2SEUZRSMkx6AXIU0JJ1SMtQtav7b5LkpYJfdL7+vO
|
|
||||||
dDx2/Za0VmdD
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIFyDCCA7CgAwIBAgIRAO8lBnTo+hlvglQwug2jHZkwDQYJKoZIhvcNAQELBQAw
|
|
||||||
cDELMAkGA1UEBhMCWFgxCzAJBgNVBAcTAlhYMQswCQYDVQQJEwJYWDEeMBwGA1UE
|
|
||||||
ChMVSTJQIEFub255bW91cyBOZXR3b3JrMQwwCgYDVQQLEwNJMlAxGTAXBgNVBAMM
|
|
||||||
EG51bGxAaTJwbWFpbC5vcmcwHhcNMjMwOTIxMjIzMTM2WhcNMzMwOTIxMjIzMTM2
|
|
||||||
WjBwMQswCQYDVQQGEwJYWDELMAkGA1UEBxMCWFgxCzAJBgNVBAkTAlhYMR4wHAYD
|
|
||||||
VQQKExVJMlAgQW5vbnltb3VzIE5ldHdvcmsxDDAKBgNVBAsTA0kyUDEZMBcGA1UE
|
|
||||||
AwwQbnVsbEBpMnBtYWlsLm9yZzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
|
|
||||||
ggIBAMMpAvaHwzuZZ6qelRU4jcgpuAIZFH++F1Te4b1t02pRfnQ0Eeh04VC1JxO0
|
|
||||||
XjUr1/iszEyvrI4+AdxaobDyRFPylkOLtfec4d2ciDc1cupj6y2vyYhMVN31rrvE
|
|
||||||
ve7sKoTHJ5Dx+UPGOVZZsSsmK9TXIU23W2bo7k2VnjVBXdWZyNE4twfTYCosDnYA
|
|
||||||
1HIEaIUFVv+COqw2pktxkMmfUAlnDLeVSfsAzEr37K+x0Xk5hO8m6GWQx0NRjjYp
|
|
||||||
gyEcFhWAJjAYaF3gUVR9rVVky1OeFhZgxE/KzVrW7uc84ZCMKITEPwT0qqIpsTJp
|
|
||||||
486YXzuPSc+ef78cKSQf5992l7imySJ24I/5H73HkovGAFGZdwvl6V6Ta5YqO7RR
|
|
||||||
gVDOL1EIVUnMCqFBCE6RmyZqXBVrv4Cacdc6lZ4fj42SRtWZfe6rNCpJzTRtbOyW
|
|
||||||
DBmYpK6q/jddfqI1sX0PXIn9U+Rod5Z4uz82PAjhamqyr5fpAnoQxKppBvQ3tNfn
|
|
||||||
KQhmP73Hdpvl24pRyQLBIRUL86i7TPBBn7n3XZlQfXP7lp8+KJYLkL2/zCVDrwLX
|
|
||||||
kC9hRIxCU9bZbXlkRE2R/PrK53LZecjk2KcgINA4ZlguNgze/Qj8BXelUF4izbpV
|
|
||||||
bTSvniTM46AECvjDcICAOky9Ku4RnmUJxQVf3ahDEuso7/N7AgMBAAGjXTBbMA4G
|
|
||||||
A1UdDwEB/wQEAwIChDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwDwYD
|
|
||||||
VR0TAQH/BAUwAwEB/zAZBgNVHQ4EEgQQbnVsbEBpMnBtYWlsLm9yZzANBgkqhkiG
|
|
||||||
9w0BAQsFAAOCAgEAEUfYJTdDH7uCojnpF0Gs2tXxPJ22UhdqEsXfqR7KhhmmApss
|
|
||||||
q5kiiPIYoy5T/4IM7NVyeeJAMYwQsdJjwZ4QyxLBb9EqMS2krREcPZNRfFzBr2Wj
|
|
||||||
EBhJEYTnbIn4docwJWyXsJVG0CqFXPF1qGd0Sc2u87yj2xZNTnloWKAEQAO7DE39
|
|
||||||
gWfDH6slM/3h3WD3Mjuk7JoYSYmBfvvm2hkBbC6lzD7XY7rdSmIUwJ050e9UrJaV
|
|
||||||
La51dd5r4q8d1cHrVUwLiACAaXJ15AEqUDLHQcvKvyfhkabwRy+v0wsodSMgSMEH
|
|
||||||
xA+kGhkIW7yV7o2exYOYypHCca3IA+pimMpEseNNrHSwbHOMfauiN7jiZLEPg6D6
|
|
||||||
a8XwK7qmMYUq7j6QWuIqI81o29WZRf4LZ0GFoVce+e5VxkVKSItKcJoedIAp1ML8
|
|
||||||
NhFwd9s/nqWidu/StscEEbGzz6ZuDXwshERXC0QR8HjHEPi4U8220juf4cxUahxK
|
|
||||||
heEU91l7VksSZYRUN98h28vovGcukLcnVoLj5H/+Z4r/BgxMrOUJKetxf8fU7FjO
|
|
||||||
j1U6XV36tGi+IOwYQb9D5fTVafC3hHkuUIjlOdUGYadse98ILhn9kaNtqkBtk/EU
|
|
||||||
vK+McnrEv7tcKrbvYEop/KaUayhjFiL+wGWnpxt7gLhIiavnIeUyD7acltw=
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIF7zCCA9egAwIBAgIRANVB/+wEuXS0Ttoh5teJt90wDQYJKoZIhvcNAQELBQAw
|
|
||||||
fTELMAkGA1UEBhMCWFgxCzAJBgNVBAcTAlhYMQswCQYDVQQJEwJYWDEeMBwGA1UE
|
|
||||||
ChMVSTJQIEFub255bW91cyBOZXR3b3JrMQwwCgYDVQQLEwNJMlAxJjAkBgNVBAMM
|
|
||||||
HXJlaGVhdGVkYnVyZ2VyQHByb3Rvbm1haWwuY29tMB4XDTIzMDkyMTE4MDAyOVoX
|
|
||||||
DTMzMDkyMTE4MDAyOVowfTELMAkGA1UEBhMCWFgxCzAJBgNVBAcTAlhYMQswCQYD
|
|
||||||
VQQJEwJYWDEeMBwGA1UEChMVSTJQIEFub255bW91cyBOZXR3b3JrMQwwCgYDVQQL
|
|
||||||
EwNJMlAxJjAkBgNVBAMMHXJlaGVhdGVkYnVyZ2VyQHByb3Rvbm1haWwuY29tMIIC
|
|
||||||
IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuNwmiIY3MLSBS5sL5PXRDVK6
|
|
||||||
MoSNw4qx0o8nDHvVBxNtzgc0/qjYvsuUggY0tZbPpxhML6GHd4qo7Z3Ip1x0MxhI
|
|
||||||
Ao5MJaflaEdm4+HeMy0IE3aU73KRUwp+nF3cUHZdlps+9mtYs4oncVEWkFQwGsgt
|
|
||||||
4yrLtXf6PmPWfFH28ffeaev90e+hdhQpTvr54Ewx6NTaMQr8mkhXL2utvPpjnPM5
|
|
||||||
UAhOeJCMgfhLzgS4rahG0O8CQMtH5gKZ+6zjoSRatnjj0j1mBO7+e1TL5O7dVS9k
|
|
||||||
P83tmkIDDl4tXBzXr9aXQMJstbM2CEvinVcCsR74GjPcg4iB0Ift71Dx7oGKI06t
|
|
||||||
3bSvll0GZm2mFhIba/4q6f4oAJ2aeq6ejt1Kcm8g5cxtwrRZnXv5JXHZqba3y8J5
|
|
||||||
zWaRHzhc9tyEqRBRkc6c7xMdZQ31iJ6TlxUT8vAJ1N7OnX87oHrCjwyikpyOen4r
|
|
||||||
Uvv1Ge054XPTeoHz+Jyt34t71ty1W13uPHpuvtPVR9MfgGrxd4Z9+LWvAjmMbFsZ
|
|
||||||
lC3Ll+94nUk+O0puU6KisuCGP4hCtdEtebkIqT8zo8LicLAYUMjX7KwnS7681Cu1
|
|
||||||
sY2mB2oZAytN9Zy42oOoNeY5x39kxfwuut/2E1kxKX75O0bwfIXr611abCKc3bbz
|
|
||||||
euMrIsaB/2VFp9nAah8CAwEAAaNqMGgwDgYDVR0PAQH/BAQDAgKEMB0GA1UdJQQW
|
|
||||||
MBQGCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCYGA1UdDgQf
|
|
||||||
BB1yZWhlYXRlZGJ1cmdlckBwcm90b25tYWlsLmNvbTANBgkqhkiG9w0BAQsFAAOC
|
|
||||||
AgEATuHi2Yz52OK7e+sKVdHu2KrSLCGm98BG1UIMHFi3WRBTOFyp+lZ519bJ1rFj
|
|
||||||
tmP9E1a+k/vlbc7FbV4PcV6HJYfGEv/ImtJsEnrzbhrQphC1zMFv7q6JCTUbAzl6
|
|
||||||
ySlJ++mVxQ6AzPNH3TQgL1wPKuLh76/Y4053fg+NI3PmzzhkTUheVDkg0/a9ENSf
|
|
||||||
xMnCa3fIm869735qHk67QlikFvAfWwc4zT1Ncwodh8G4+oX0GFzIl+OZaM1GTMuD
|
|
||||||
UCcFKoqwtjyLCr22xNk8CfyiExPJXQG1HzEvDcxyoxQtnh9occR9PgqXySz26/NM
|
|
||||||
XDyM+l4utLMGBcVY4x9fksRiaWEfxiygYOxY9zDl6clh6S10b3CLut4UMiS1RTtE
|
|
||||||
Mjx2BZN3p0nxpT2leJdGxtBPGrvxuiCOEmTbOMLc3DQtppXO97B3dVMtJ5Ee8Y6p
|
|
||||||
Tq/8eiHI6eQXat6dgFT5X16vzF7w7XO7fAxuqk4Kx1D1aTVyikdo+Fcdg44dWOjq
|
|
||||||
NZu8VcCzZij/Dfjlce6t6h8D+wvDD8AkiivaDljpvbNDx/QQlQXFgH98TZA8Rnvr
|
|
||||||
QcyNNATfz+1yQUiyO6Lrjaw64OJwXYX/llgnDC+qQpP6kqZabi2TsG0EVPukVvr9
|
|
||||||
0HyAUu4lnXtTIDq2yPNenegCloqDL1ZQdaYd2XIItnfZdTY=
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
@@ -1,5 +1,2 @@
|
|||||||
This forder contain files required for building debian packages.
|
This forder contain systemd unit files.
|
||||||
|
To use systemd daemon control, place files from this directory to debian folder before building package.
|
||||||
The trunk repository is contains the packaging files for the latest stable version of Debian (if we not forgot to update them).
|
|
||||||
|
|
||||||
Files in subdirectories contains fixes to make possible to build package on specific versions of Debian/Ubuntu. They are used when building the release package.
|
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
11
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
Source: i2pd
|
|
||||||
Section: net
|
|
||||||
Priority: optional
|
|
||||||
Maintainer: r4sas <r4sas@i2pmail.org>
|
|
||||||
Build-Depends: debhelper (>= 11~), libboost-system-dev (>= 1.46), libboost-date-time-dev (>= 1.46), libboost-filesystem-dev (>= 1.46), libboost-program-options-dev (>= 1.46), libminiupnpc-dev, libssl-dev, zlib1g-dev
|
|
||||||
Standards-Version: 4.2.0
|
|
||||||
Homepage: http://i2pd.website/
|
|
||||||
Vcs-Git: git://github.com/PurpleI2P/i2pd.git
|
|
||||||
Vcs-Browser: https://github.com/PurpleI2P/i2pd
|
|
||||||
|
|
||||||
Package: i2pd
|
|
||||||
Architecture: any
|
|
||||||
Pre-Depends: ${misc:Pre-Depends}, adduser
|
|
||||||
Depends: ${shlibs:Depends}, ${misc:Depends}, lsb-base,
|
|
||||||
Description: Full-featured C++ implementation of I2P client.
|
|
||||||
I2P (Invisible Internet Protocol) is a universal anonymous network layer. All
|
|
||||||
communications over I2P are anonymous and end-to-end encrypted, participants
|
|
||||||
don't reveal their real IP addresses.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
9
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
Source: i2pd
|
|
||||||
Section: net
|
|
||||||
Priority: optional
|
|
||||||
Maintainer: r4sas <r4sas@i2pmail.org>
|
|
||||||
Build-Depends: debhelper (>= 9), libboost-system-dev (>= 1.46), libboost-date-time-dev (>= 1.46), libboost-filesystem-dev (>= 1.46), libboost-program-options-dev (>= 1.46), libminiupnpc-dev, libssl-dev, zlib1g-dev
|
|
||||||
Standards-Version: 3.9.8
|
|
||||||
Homepage: http://i2pd.website/
|
|
||||||
Vcs-Git: git://github.com/PurpleI2P/i2pd.git
|
|
||||||
Vcs-Browser: https://github.com/PurpleI2P/i2pd
|
|
||||||
|
|
||||||
Package: i2pd
|
|
||||||
Architecture: any
|
|
||||||
Pre-Depends: ${misc:Pre-Depends}, adduser
|
|
||||||
Depends: ${shlibs:Depends}, ${misc:Depends}, lsb-base,
|
|
||||||
Description: Full-featured C++ implementation of I2P client.
|
|
||||||
I2P (Invisible Internet Protocol) is a universal anonymous network layer. All
|
|
||||||
communications over I2P are anonymous and end-to-end encrypted, participants
|
|
||||||
don't reveal their real IP addresses.
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
Description: Disable LogsDirectory and LogsDirectoryMode options in service
|
|
||||||
Author: r4sas <r4sas@i2pmail.org>
|
|
||||||
|
|
||||||
Reviewed-By: r4sas <r4sas@i2pmail.org>
|
|
||||||
Last-Update: 2023-05-17
|
|
||||||
|
|
||||||
--- a/contrib/i2pd.service
|
|
||||||
+++ b/contrib/i2pd.service
|
|
||||||
@@ -8,8 +8,8 @@ User=i2pd
|
|
||||||
Group=i2pd
|
|
||||||
RuntimeDirectory=i2pd
|
|
||||||
RuntimeDirectoryMode=0700
|
|
||||||
-LogsDirectory=i2pd
|
|
||||||
-LogsDirectoryMode=0700
|
|
||||||
+#LogsDirectory=i2pd
|
|
||||||
+#LogsDirectoryMode=0700
|
|
||||||
Type=forking
|
|
||||||
ExecStart=/usr/sbin/i2pd --conf=/etc/i2pd/i2pd.conf --tunconf=/etc/i2pd/tunnels.conf --tunnelsdir=/etc/i2pd/tunnels.conf.d --pidfile=/run/i2pd/i2pd.pid --logfile=/var/log/i2pd/i2pd.log --daemon --service
|
|
||||||
ExecReload=/bin/sh -c "kill -HUP $MAINPID"
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
01-upnp.patch
|
|
||||||
02-service.patch
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/make -f
|
|
||||||
#export DH_VERBOSE=1
|
|
||||||
|
|
||||||
export DEB_BUILD_MAINT_OPTIONS=hardening=+all
|
|
||||||
|
|
||||||
include /usr/share/dpkg/architecture.mk
|
|
||||||
|
|
||||||
ifeq ($(DEB_HOST_ARCH),i386)
|
|
||||||
export DEB_BUILD_OPTIONS=parallel=1
|
|
||||||
endif
|
|
||||||
|
|
||||||
export DEB_CXXFLAGS_MAINT_APPEND=-Wall -pedantic
|
|
||||||
export DEB_LDFLAGS_MAINT_APPEND=
|
|
||||||
|
|
||||||
%:
|
|
||||||
dh $@ --parallel
|
|
||||||
|
|
||||||
override_dh_auto_install:
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
9
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
Source: i2pd
|
|
||||||
Section: net
|
|
||||||
Priority: optional
|
|
||||||
Maintainer: r4sas <r4sas@i2pmail.org>
|
|
||||||
Build-Depends: debhelper (>= 9), libboost-system-dev (>= 1.46), libboost-date-time-dev (>= 1.46), libboost-filesystem-dev (>= 1.46), libboost-program-options-dev (>= 1.46), libminiupnpc-dev, libssl-dev, zlib1g-dev
|
|
||||||
Standards-Version: 3.9.8
|
|
||||||
Homepage: http://i2pd.website/
|
|
||||||
Vcs-Git: git://github.com/PurpleI2P/i2pd.git
|
|
||||||
Vcs-Browser: https://github.com/PurpleI2P/i2pd
|
|
||||||
|
|
||||||
Package: i2pd
|
|
||||||
Architecture: any
|
|
||||||
Pre-Depends: ${misc:Pre-Depends}, adduser
|
|
||||||
Depends: ${shlibs:Depends}, ${misc:Depends}, lsb-base,
|
|
||||||
Description: Full-featured C++ implementation of I2P client.
|
|
||||||
I2P (Invisible Internet Protocol) is a universal anonymous network layer. All
|
|
||||||
communications over I2P are anonymous and end-to-end encrypted, participants
|
|
||||||
don't reveal their real IP addresses.
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
Description: Enable UPnP usage in package
|
|
||||||
Author: r4sas <r4sas@i2pmail.org>
|
|
||||||
|
|
||||||
Reviewed-By: r4sas <r4sas@i2pmail.org>
|
|
||||||
Last-Update: 2022-03-23
|
|
||||||
|
|
||||||
--- i2pd.orig/Makefile
|
|
||||||
+++ i2pd/Makefile
|
|
||||||
@@ -31,7 +31,7 @@ include filelist.mk
|
|
||||||
|
|
||||||
USE_AESNI := $(or $(USE_AESNI),yes)
|
|
||||||
USE_STATIC := $(or $(USE_STATIC),no)
|
|
||||||
-USE_UPNP := $(or $(USE_UPNP),no)
|
|
||||||
+USE_UPNP := $(or $(USE_UPNP),yes)
|
|
||||||
DEBUG := $(or $(DEBUG),yes)
|
|
||||||
|
|
||||||
# for debugging purposes only, when commit hash needed in trunk builds in i2pd version string
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
Description: Disable LogsDirectory and LogsDirectoryMode options in service
|
|
||||||
Author: r4sas <r4sas@i2pmail.org>
|
|
||||||
|
|
||||||
Reviewed-By: r4sas <r4sas@i2pmail.org>
|
|
||||||
Last-Update: 2023-05-17
|
|
||||||
|
|
||||||
--- a/contrib/i2pd.service
|
|
||||||
+++ b/contrib/i2pd.service
|
|
||||||
@@ -8,8 +8,8 @@ User=i2pd
|
|
||||||
Group=i2pd
|
|
||||||
RuntimeDirectory=i2pd
|
|
||||||
RuntimeDirectoryMode=0700
|
|
||||||
-LogsDirectory=i2pd
|
|
||||||
-LogsDirectoryMode=0700
|
|
||||||
+#LogsDirectory=i2pd
|
|
||||||
+#LogsDirectoryMode=0700
|
|
||||||
Type=forking
|
|
||||||
ExecStart=/usr/sbin/i2pd --conf=/etc/i2pd/i2pd.conf --tunconf=/etc/i2pd/tunnels.conf --tunnelsdir=/etc/i2pd/tunnels.conf.d --pidfile=/run/i2pd/i2pd.pid --logfile=/var/log/i2pd/i2pd.log --daemon --service
|
|
||||||
ExecReload=/bin/sh -c "kill -HUP $MAINPID"
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
01-upnp.patch
|
|
||||||
02-service.patch
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
#!/usr/bin/make -f
|
|
||||||
#export DH_VERBOSE=1
|
|
||||||
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
|
|
||||||
|
|
||||||
include /usr/share/dpkg/architecture.mk
|
|
||||||
|
|
||||||
export DEB_CXXFLAGS_MAINT_APPEND = -Wall -pedantic
|
|
||||||
export DEB_LDFLAGS_MAINT_APPEND =
|
|
||||||
|
|
||||||
%:
|
|
||||||
dh $@ --parallel
|
|
||||||
|
|
||||||
override_dh_auto_install:
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
type = bgprocess
|
|
||||||
run-as = i2pd
|
|
||||||
command = /usr/bin/i2pd --conf=/var/lib/i2pd/i2pd.conf --pidfile=/var/lib/i2pd/i2pd.pid --daemon --service
|
|
||||||
smooth-recovery = true
|
|
||||||
depends-on = ntpd
|
|
||||||
# uncomment if you want to use i2pd with yggdrasil
|
|
||||||
# depends-on = yggdrasil
|
|
||||||
pid-file = /var/lib/i2pd/i2pd.pid
|
|
||||||
@@ -1,18 +1,5 @@
|
|||||||
#
|
|
||||||
# Copyright (c) 2017-2022, The PurpleI2P Project
|
|
||||||
#
|
|
||||||
# This file is part of Purple i2pd project and licensed under BSD3
|
|
||||||
#
|
|
||||||
# See full license text in LICENSE file at top of project tree
|
|
||||||
#
|
|
||||||
|
|
||||||
FROM alpine:latest
|
FROM alpine:latest
|
||||||
LABEL authors="Mikal Villa <mikal@sigterm.no>, Darknet Villain <supervillain@riseup.net>"
|
LABEL authors "Mikal Villa <mikal@sigterm.no>, Darknet Villain <supervillain@riseup.net>"
|
||||||
LABEL maintainer="R4SAS <r4sas@i2pmail.org>"
|
|
||||||
|
|
||||||
LABEL org.opencontainers.image.source=https://github.com/PurpleI2P/i2pd
|
|
||||||
LABEL org.opencontainers.image.documentation=https://i2pd.readthedocs.io/en/latest/
|
|
||||||
LABEL org.opencontainers.image.licenses=BSD3
|
|
||||||
|
|
||||||
# Expose git branch, tag and URL variables as arguments
|
# Expose git branch, tag and URL variables as arguments
|
||||||
ARG GIT_BRANCH="openssl"
|
ARG GIT_BRANCH="openssl"
|
||||||
@@ -24,28 +11,27 @@ ENV REPO_URL=${REPO_URL}
|
|||||||
|
|
||||||
ENV I2PD_HOME="/home/i2pd"
|
ENV I2PD_HOME="/home/i2pd"
|
||||||
ENV DATA_DIR="${I2PD_HOME}/data"
|
ENV DATA_DIR="${I2PD_HOME}/data"
|
||||||
ENV DEFAULT_ARGS=" --datadir=$DATA_DIR"
|
ENV DEFAULT_ARGS=" --datadir=$DATA_DIR --reseed.verify=true --upnp.enabled=false --http.enabled=true --http.address=0.0.0.0 --httpproxy.enabled=true --httpproxy.address=0.0.0.0 --socksproxy.enabled=true --socksproxy.address=0.0.0.0 --sam.enabled=true --sam.address=0.0.0.0"
|
||||||
|
|
||||||
RUN mkdir -p "$I2PD_HOME" "$DATA_DIR" \
|
RUN mkdir -p "$I2PD_HOME" "$DATA_DIR" \
|
||||||
&& adduser -S -h "$I2PD_HOME" i2pd \
|
&& adduser -S -h "$I2PD_HOME" i2pd \
|
||||||
&& chown -R i2pd:nobody "$I2PD_HOME"
|
&& chown -R i2pd:nobody "$I2PD_HOME"
|
||||||
|
|
||||||
|
|
||||||
# 1. Building binary
|
|
||||||
# Each RUN is a layer, adding the dependencies and building i2pd in one layer takes around 8-900Mb, so to keep the
|
|
||||||
# image under 20mb we need to remove all the build dependencies in the same "RUN" / layer.
|
|
||||||
#
|
#
|
||||||
# 1. install deps, clone and build.
|
# Each RUN is a layer, adding the dependencies and building i2pd in one layer takes around 8-900Mb, so to keep the
|
||||||
# 2. strip binaries.
|
# image under 20mb we need to remove all the build dependencies in the same "RUN" / layer.
|
||||||
# 3. Purge all dependencies and other unrelated packages, including build directory.
|
#
|
||||||
|
|
||||||
|
# 1. install deps, clone and build.
|
||||||
|
# 2. strip binaries.
|
||||||
|
# 3. Purge all dependencies and other unrelated packages, including build directory.
|
||||||
RUN apk update \
|
RUN apk update \
|
||||||
&& apk --no-cache --virtual build-dependendencies add make gcc g++ libtool zlib-dev boost-dev build-base openssl-dev openssl miniupnpc-dev git \
|
&& apk --no-cache --virtual build-dependendencies add make gcc g++ libtool zlib-dev boost-dev build-base openssl-dev openssl miniupnpc-dev git \
|
||||||
&& mkdir -p /tmp/build \
|
&& mkdir -p /tmp/build \
|
||||||
&& cd /tmp/build && git clone -b ${GIT_BRANCH} ${REPO_URL} \
|
&& cd /tmp/build && git clone -b ${GIT_BRANCH} ${REPO_URL} \
|
||||||
&& cd i2pd \
|
&& cd i2pd \
|
||||||
&& if [ -n "${GIT_TAG}" ]; then git checkout tags/${GIT_TAG}; fi \
|
&& if [ -n "${GIT_TAG}" ]; then git checkout tags/${GIT_TAG}; fi \
|
||||||
&& make -j$(nproc) USE_UPNP=yes \
|
&& make USE_UPNP=yes \
|
||||||
&& cp -R contrib/certificates /i2pd_certificates \
|
&& cp -R contrib/certificates /i2pd_certificates \
|
||||||
&& mkdir -p /usr/local/bin \
|
&& mkdir -p /usr/local/bin \
|
||||||
&& mv i2pd /usr/local/bin \
|
&& mv i2pd /usr/local/bin \
|
||||||
@@ -59,9 +45,6 @@ RUN apk update \
|
|||||||
# 2. Adding required libraries to run i2pd to ensure it will run.
|
# 2. Adding required libraries to run i2pd to ensure it will run.
|
||||||
RUN apk --no-cache add boost-filesystem boost-system boost-program_options boost-date_time boost-thread boost-iostreams openssl miniupnpc musl-utils libstdc++
|
RUN apk --no-cache add boost-filesystem boost-system boost-program_options boost-date_time boost-thread boost-iostreams openssl miniupnpc musl-utils libstdc++
|
||||||
|
|
||||||
# 3. Copy preconfigured config file and entrypoint
|
|
||||||
COPY i2pd-docker.conf "$DATA_DIR/i2pd.conf"
|
|
||||||
RUN chown i2pd:nobody "$DATA_DIR/i2pd.conf"
|
|
||||||
COPY entrypoint.sh /entrypoint.sh
|
COPY entrypoint.sh /entrypoint.sh
|
||||||
RUN chmod a+x /entrypoint.sh
|
RUN chmod a+x /entrypoint.sh
|
||||||
|
|
||||||
|
|||||||
@@ -1,52 +0,0 @@
|
|||||||
## Preconfigured i2pd configuration file for a Docker container
|
|
||||||
## See https://i2pd.readthedocs.io/en/latest/user-guide/configuration/
|
|
||||||
## for more options you can use in this file.
|
|
||||||
|
|
||||||
## Note that for exposing ports outside of container you need to bind all services to 0.0.0.0
|
|
||||||
|
|
||||||
log = file
|
|
||||||
loglevel = none
|
|
||||||
|
|
||||||
ipv4 = true
|
|
||||||
ipv6 = false
|
|
||||||
|
|
||||||
# bandwidth = L
|
|
||||||
# notransit = false
|
|
||||||
# floodfill = false
|
|
||||||
|
|
||||||
[ntcp2]
|
|
||||||
enabled = true
|
|
||||||
published = true
|
|
||||||
|
|
||||||
[ssu2]
|
|
||||||
enabled = true
|
|
||||||
published = true
|
|
||||||
|
|
||||||
[http]
|
|
||||||
enabled = true
|
|
||||||
address = 0.0.0.0
|
|
||||||
port = 7070
|
|
||||||
|
|
||||||
[httpproxy]
|
|
||||||
enabled = true
|
|
||||||
address = 0.0.0.0
|
|
||||||
port = 4444
|
|
||||||
|
|
||||||
[socksproxy]
|
|
||||||
enabled = true
|
|
||||||
address = 0.0.0.0
|
|
||||||
port = 4447
|
|
||||||
|
|
||||||
[sam]
|
|
||||||
enabled = true
|
|
||||||
address = 0.0.0.0
|
|
||||||
port = 7656
|
|
||||||
|
|
||||||
[upnp]
|
|
||||||
enabled = false
|
|
||||||
|
|
||||||
[reseed]
|
|
||||||
verify = true
|
|
||||||
|
|
||||||
[limits]
|
|
||||||
# transittunnels = 2500
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,30 +1,29 @@
|
|||||||
`xgettext` command for extracting translation
|
`xgettext` command for extracting translation
|
||||||
---
|
---
|
||||||
|
|
||||||
```
|
```
|
||||||
xgettext --omit-header -ctr: -ktr -kntr:1,2 daemon/HTTPServer.cpp libi2pd_client/HTTPProxy.cpp
|
xgettext --omit-header -ctr: -ktr -ktr:1,2 daemon/HTTPServer.cpp libi2pd_client/HTTPProxy.cpp
|
||||||
```
|
```
|
||||||
|
|
||||||
Regex for transforming gettext translations to our format:
|
Regex for transforming gettext translations to our format:
|
||||||
---
|
---
|
||||||
|
|
||||||
```
|
```
|
||||||
in: ^(\"|#[:.,]|msgctxt)(.*)$\n
|
in: msgid\ \"(.*)\"\nmsgid_plural\ \"(.*)\"\nmsgstr\[0\]\ \"(.*)\"\nmsgstr\[1\]\ \"(.*)\"\n(msgstr\[2\]\ \"(.*)\"\n)?(msgstr\[3\]\ \"(.*)\"\n)?(msgstr\[4\]\ \"(.*)\"\n)?(msgstr\[5\]\ \"(.*)\"\n)?
|
||||||
out: <to empty line>
|
out: #{"$2", {"$3", "$4", "$6", "$8", "$10"}},\n
|
||||||
```
|
```
|
||||||
|
|
||||||
```
|
```
|
||||||
in: msgid\ \"(.*)\"\nmsgid_plural\ \"(.*)\"\nmsgstr\[0\]\ \"(.*)\"\n(msgstr\[1\]\ \"(.*)\"\n)?(msgstr\[2\]\ \"(.*)\"\n)?(msgstr\[3\]\ \"(.*)\"\n)?(msgstr\[4\]\ \"(.*)\"\n)?(msgstr\[5\]\ \"(.*)\"\n)?
|
in: msgid\ \"(.*)\"\nmsgstr\ \"(.*)\"\n
|
||||||
out: #{"$2", {"$3", "$5", "$7", "$9", "$11"}},\n
|
out: {"$1", "$2"},\n
|
||||||
```
|
```
|
||||||
|
|
||||||
```
|
```
|
||||||
in: msgid\ \"(.*)\"\nmsgstr\ \"(.*)\"\n
|
in: ^#[:.](.*)$\n
|
||||||
out: {"$1", "$2"},\n
|
out: <to empty line>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```
|
||||||
```
|
in: \n\n
|
||||||
in: \n\n
|
out: \n
|
||||||
out: \n
|
```
|
||||||
```
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
## Default: ~/.i2pd/certificates or /var/lib/i2pd/certificates
|
## Default: ~/.i2pd/certificates or /var/lib/i2pd/certificates
|
||||||
# certsdir = /var/lib/i2pd/certificates
|
# certsdir = /var/lib/i2pd/certificates
|
||||||
|
|
||||||
## Where to write pidfile (default: /run/i2pd.pid, not used in Windows)
|
## Where to write pidfile (default: i2pd.pid, not used in Windows)
|
||||||
# pidfile = /run/i2pd.pid
|
# pidfile = /run/i2pd.pid
|
||||||
|
|
||||||
## Logging configuration section
|
## Logging configuration section
|
||||||
@@ -31,16 +31,15 @@
|
|||||||
## * file - log entries to a file
|
## * file - log entries to a file
|
||||||
## * syslog - use syslog, see man 3 syslog
|
## * syslog - use syslog, see man 3 syslog
|
||||||
# log = file
|
# log = file
|
||||||
## Path to logfile (default: autodetect)
|
## Path to logfile (default - autodetect)
|
||||||
# logfile = /var/log/i2pd/i2pd.log
|
# logfile = /var/log/i2pd/i2pd.log
|
||||||
## Log messages above this level (debug, info, *warn, error, critical, none)
|
## Log messages above this level (debug, info, *warn, error, none)
|
||||||
## If you set it to none, logging will be disabled
|
## If you set it to none, logging will be disabled
|
||||||
# loglevel = warn
|
# loglevel = warn
|
||||||
## Write full CLF-formatted date and time to log (default: write only time)
|
## Write full CLF-formatted date and time to log (default: write only time)
|
||||||
# logclftime = true
|
# logclftime = true
|
||||||
|
|
||||||
## Daemon mode. Router will go to background after start. Ignored on Windows
|
## Daemon mode. Router will go to background after start. Ignored on Windows
|
||||||
## (default: true)
|
|
||||||
# daemon = true
|
# daemon = true
|
||||||
|
|
||||||
## Specify a family, router belongs to (default - none)
|
## Specify a family, router belongs to (default - none)
|
||||||
@@ -71,97 +70,74 @@
|
|||||||
## don't just uncomment this
|
## don't just uncomment this
|
||||||
# port = 4567
|
# port = 4567
|
||||||
|
|
||||||
## Enable communication through ipv4 (default: true)
|
## Enable communication through ipv4
|
||||||
ipv4 = true
|
ipv4 = true
|
||||||
## Enable communication through ipv6 (default: false)
|
## Enable communication through ipv6
|
||||||
ipv6 = false
|
ipv6 = false
|
||||||
|
|
||||||
|
## Enable SSU transport (default = true)
|
||||||
|
# ssu = true
|
||||||
|
|
||||||
## Bandwidth configuration
|
## Bandwidth configuration
|
||||||
## L limit bandwidth to 32 KB/sec, O - to 256 KB/sec, P - to 2048 KB/sec,
|
## L limit bandwidth to 32KBs/sec, O - to 256KBs/sec, P - to 2048KBs/sec,
|
||||||
## X - unlimited
|
## X - unlimited
|
||||||
## Default is L (regular node) and X if floodfill mode enabled.
|
## Default is L (regular node) and X if floodfill mode enabled. If you want to
|
||||||
## If you want to share more bandwidth without floodfill mode, uncomment
|
## share more bandwidth without floodfill mode, uncomment that line and adjust
|
||||||
## that line and adjust value to your possibilities. Value can be set to
|
## value to your possibilities
|
||||||
## integer in kilobytes, it will apply that limit and flag will be used
|
|
||||||
## from next upper limit (example: if you set 4096 flag will be X, but real
|
|
||||||
## limit will be 4096 KB/s). Same can be done when floodfill mode is used,
|
|
||||||
## but keep in mind that low values may be negatively evaluated by Java
|
|
||||||
## router algorithms.
|
|
||||||
# bandwidth = L
|
# bandwidth = L
|
||||||
## Max % of bandwidth limit for transit. 0-100 (default: 100)
|
## Max % of bandwidth limit for transit. 0-100. 100 by default
|
||||||
# share = 100
|
# share = 100
|
||||||
|
|
||||||
## Router will not accept transit tunnels, disabling transit traffic completely
|
## Router will not accept transit tunnels, disabling transit traffic completely
|
||||||
## (default: false)
|
## (default = false)
|
||||||
# notransit = true
|
# notransit = true
|
||||||
|
|
||||||
## Router will be floodfill (default: false)
|
## Router will be floodfill
|
||||||
## Note: that mode uses much more network connections and CPU!
|
## Note: that mode uses much more network connections and CPU!
|
||||||
# floodfill = true
|
# floodfill = true
|
||||||
|
|
||||||
[ntcp2]
|
|
||||||
## Enable NTCP2 transport (default: true)
|
|
||||||
# enabled = true
|
|
||||||
## Publish address in RouterInfo (default: true)
|
|
||||||
# published = true
|
|
||||||
## Port for incoming connections (default is global port option value)
|
|
||||||
# port = 4567
|
|
||||||
|
|
||||||
[ssu2]
|
|
||||||
## Enable SSU2 transport (default: true)
|
|
||||||
# enabled = true
|
|
||||||
## Publish address in RouterInfo (default: true)
|
|
||||||
# published = true
|
|
||||||
## Port for incoming connections (default is global port option value)
|
|
||||||
# port = 4567
|
|
||||||
|
|
||||||
[http]
|
[http]
|
||||||
## Web Console settings
|
## Web Console settings
|
||||||
## Enable the Web Console (default: true)
|
## Uncomment and set to 'false' to disable Web Console
|
||||||
# enabled = true
|
# enabled = true
|
||||||
## Address and port service will listen on (default: 127.0.0.1:7070)
|
## Address and port service will listen on
|
||||||
# address = 127.0.0.1
|
address = 127.0.0.1
|
||||||
# port = 7070
|
port = 7070
|
||||||
## Path to web console (default: /)
|
## Path to web console, default "/"
|
||||||
# webroot = /
|
# webroot = /
|
||||||
## Enable Web Console authentication (default: false)
|
## Uncomment following lines to enable Web Console authentication
|
||||||
## You should not use Web Console via public networks without additional encryption.
|
|
||||||
## HTTP authentication is not encryption layer!
|
|
||||||
# auth = true
|
# auth = true
|
||||||
# user = i2pd
|
# user = i2pd
|
||||||
# pass = changeme
|
# pass = changeme
|
||||||
## Select webconsole language
|
## Select webconsole language
|
||||||
## Currently supported english (default), afrikaans, armenian, chinese, czech, french,
|
## Currently supported english (default), afrikaans, armenian, german, russian,
|
||||||
## german, italian, polish, portuguese, russian, spanish, turkish, turkmen, ukrainian
|
## turkmen, ukrainian and uzbek languages
|
||||||
## and uzbek languages
|
|
||||||
# lang = english
|
# lang = english
|
||||||
|
|
||||||
[httpproxy]
|
[httpproxy]
|
||||||
## Enable the HTTP proxy (default: true)
|
## Uncomment and set to 'false' to disable HTTP Proxy
|
||||||
# enabled = true
|
# enabled = true
|
||||||
## Address and port service will listen on (default: 127.0.0.1:4444)
|
## Address and port service will listen on
|
||||||
# address = 127.0.0.1
|
address = 127.0.0.1
|
||||||
# port = 4444
|
port = 4444
|
||||||
## Optional keys file for proxy local destination (default: http-proxy-keys.dat)
|
## Optional keys file for proxy local destination
|
||||||
# keys = http-proxy-keys.dat
|
# keys = http-proxy-keys.dat
|
||||||
## Enable address helper for adding .i2p domains with "jump URLs" (default: true)
|
## Enable address helper for adding .i2p domains with "jump URLs" (default: true)
|
||||||
## You should disable this feature if your i2pd HTTP Proxy is public,
|
|
||||||
## because anyone could spoof the short domain via addresshelper and forward other users to phishing links
|
|
||||||
# addresshelper = true
|
# addresshelper = true
|
||||||
## Address of a proxy server inside I2P, which is used to visit regular Internet
|
## Address of a proxy server inside I2P, which is used to visit regular Internet
|
||||||
# outproxy = http://false.i2p
|
# outproxy = http://false.i2p
|
||||||
## httpproxy section also accepts I2CP parameters, like "inbound.length" etc.
|
## httpproxy section also accepts I2CP parameters, like "inbound.length" etc.
|
||||||
|
|
||||||
[socksproxy]
|
[socksproxy]
|
||||||
## Enable the SOCKS proxy (default: true)
|
## Uncomment and set to 'false' to disable SOCKS Proxy
|
||||||
# enabled = true
|
# enabled = true
|
||||||
## Address and port service will listen on (default: 127.0.0.1:4447)
|
## Address and port service will listen on
|
||||||
# address = 127.0.0.1
|
address = 127.0.0.1
|
||||||
# port = 4447
|
port = 4447
|
||||||
## Optional keys file for proxy local destination (default: socks-proxy-keys.dat)
|
## Optional keys file for proxy local destination
|
||||||
# keys = socks-proxy-keys.dat
|
# keys = socks-proxy-keys.dat
|
||||||
## Socks outproxy. Example below is set to use Tor for all connections except i2p
|
## Socks outproxy. Example below is set to use Tor for all connections except i2p
|
||||||
## Enable using of SOCKS outproxy (works only with SOCKS4, default: false)
|
## Uncomment and set to 'true' to enable using of SOCKS outproxy
|
||||||
# outproxy.enabled = false
|
# outproxy.enabled = false
|
||||||
## Address and port of outproxy
|
## Address and port of outproxy
|
||||||
# outproxy = 127.0.0.1
|
# outproxy = 127.0.0.1
|
||||||
@@ -169,34 +145,33 @@ ipv6 = false
|
|||||||
## socksproxy section also accepts I2CP parameters, like "inbound.length" etc.
|
## socksproxy section also accepts I2CP parameters, like "inbound.length" etc.
|
||||||
|
|
||||||
[sam]
|
[sam]
|
||||||
## Enable the SAM bridge (default: true)
|
## Comment or set to 'false' to disable SAM Bridge
|
||||||
# enabled = false
|
enabled = true
|
||||||
## Address and ports service will listen on (default: 127.0.0.1:7656, udp: 7655)
|
## Address and port service will listen on
|
||||||
# address = 127.0.0.1
|
# address = 127.0.0.1
|
||||||
# port = 7656
|
# port = 7656
|
||||||
# portudp = 7655
|
|
||||||
|
|
||||||
[bob]
|
[bob]
|
||||||
## Enable the BOB command channel (default: false)
|
## Uncomment and set to 'true' to enable BOB command channel
|
||||||
# enabled = false
|
# enabled = false
|
||||||
## Address and port service will listen on (default: 127.0.0.1:2827)
|
## Address and port service will listen on
|
||||||
# address = 127.0.0.1
|
# address = 127.0.0.1
|
||||||
# port = 2827
|
# port = 2827
|
||||||
|
|
||||||
[i2cp]
|
[i2cp]
|
||||||
## Enable the I2CP protocol (default: false)
|
## Uncomment and set to 'true' to enable I2CP protocol
|
||||||
# enabled = false
|
# enabled = false
|
||||||
## Address and port service will listen on (default: 127.0.0.1:7654)
|
## Address and port service will listen on
|
||||||
# address = 127.0.0.1
|
# address = 127.0.0.1
|
||||||
# port = 7654
|
# port = 7654
|
||||||
|
|
||||||
[i2pcontrol]
|
[i2pcontrol]
|
||||||
## Enable the I2PControl protocol (default: false)
|
## Uncomment and set to 'true' to enable I2PControl protocol
|
||||||
# enabled = false
|
# enabled = false
|
||||||
## Address and port service will listen on (default: 127.0.0.1:7650)
|
## Address and port service will listen on
|
||||||
# address = 127.0.0.1
|
# address = 127.0.0.1
|
||||||
# port = 7650
|
# port = 7650
|
||||||
## Authentication password (default: itoopie)
|
## Authentication password. "itoopie" by default
|
||||||
# password = itoopie
|
# password = itoopie
|
||||||
|
|
||||||
[precomputation]
|
[precomputation]
|
||||||
@@ -207,11 +182,11 @@ ipv6 = false
|
|||||||
[upnp]
|
[upnp]
|
||||||
## Enable or disable UPnP: automatic port forwarding (enabled by default in WINDOWS, ANDROID)
|
## Enable or disable UPnP: automatic port forwarding (enabled by default in WINDOWS, ANDROID)
|
||||||
# enabled = false
|
# enabled = false
|
||||||
## Name i2pd appears in UPnP forwardings list (default: I2Pd)
|
## Name i2pd appears in UPnP forwardings list (default = I2Pd)
|
||||||
# name = I2Pd
|
# name = I2Pd
|
||||||
|
|
||||||
[meshnets]
|
[meshnets]
|
||||||
## Enable connectivity over the Yggdrasil network (default: false)
|
## Enable connectivity over the Yggdrasil network
|
||||||
# yggdrasil = false
|
# yggdrasil = false
|
||||||
## You can bind address from your Yggdrasil subnet 300::/64
|
## You can bind address from your Yggdrasil subnet 300::/64
|
||||||
## The address must first be added to the network interface
|
## The address must first be added to the network interface
|
||||||
@@ -219,13 +194,13 @@ ipv6 = false
|
|||||||
|
|
||||||
[reseed]
|
[reseed]
|
||||||
## Options for bootstrapping into I2P network, aka reseeding
|
## Options for bootstrapping into I2P network, aka reseeding
|
||||||
## Enable reseed data verification (default: true)
|
## Enable or disable reseed data verification.
|
||||||
verify = true
|
verify = true
|
||||||
## URLs to request reseed data from, separated by comma
|
## URLs to request reseed data from, separated by comma
|
||||||
## Default: "mainline" I2P Network reseeds
|
## Default: "mainline" I2P Network reseeds
|
||||||
# urls = https://reseed.i2p-projekt.de/,https://i2p.mooo.com/netDb/,https://netdb.i2p2.no/
|
# urls = https://reseed.i2p-projekt.de/,https://i2p.mooo.com/netDb/,https://netdb.i2p2.no/
|
||||||
## Reseed URLs through the Yggdrasil, separated by comma
|
## Reseed URLs through the Yggdrasil, separated by comma
|
||||||
# yggurls = http://[324:71e:281a:9ed3::ace]:7070/
|
# yggurls = http://[324:9de3:fea4:f6ac::ace]:7070/
|
||||||
## Path to local reseed data file (.su3) for manual reseeding
|
## Path to local reseed data file (.su3) for manual reseeding
|
||||||
# file = /path/to/i2pseeds.su3
|
# file = /path/to/i2pseeds.su3
|
||||||
## or HTTPS URL to reseed from
|
## or HTTPS URL to reseed from
|
||||||
@@ -235,7 +210,7 @@ verify = true
|
|||||||
## If you run i2pd behind a proxy server, set proxy server for reseeding here
|
## If you run i2pd behind a proxy server, set proxy server for reseeding here
|
||||||
## Should be http://address:port or socks://address:port
|
## Should be http://address:port or socks://address:port
|
||||||
# proxy = http://127.0.0.1:8118
|
# proxy = http://127.0.0.1:8118
|
||||||
## Minimum number of known routers, below which i2pd triggers reseeding (default: 25)
|
## Minimum number of known routers, below which i2pd triggers reseeding. 25 by default
|
||||||
# threshold = 25
|
# threshold = 25
|
||||||
|
|
||||||
[addressbook]
|
[addressbook]
|
||||||
@@ -246,22 +221,21 @@ verify = true
|
|||||||
# subscriptions = http://reg.i2p/hosts.txt,http://identiguy.i2p/hosts.txt,http://stats.i2p/cgi-bin/newhosts.txt,http://rus.i2p/hosts.txt
|
# subscriptions = http://reg.i2p/hosts.txt,http://identiguy.i2p/hosts.txt,http://stats.i2p/cgi-bin/newhosts.txt,http://rus.i2p/hosts.txt
|
||||||
|
|
||||||
[limits]
|
[limits]
|
||||||
## Maximum active transit sessions (default: 5000)
|
## Maximum active transit sessions (default:2500)
|
||||||
## This value is doubled if floodfill mode is enabled!
|
# transittunnels = 2500
|
||||||
# transittunnels = 5000
|
|
||||||
## Limit number of open file descriptors (0 - use system limit)
|
## Limit number of open file descriptors (0 - use system limit)
|
||||||
# openfiles = 0
|
# openfiles = 0
|
||||||
## Maximum size of corefile in Kb (0 - use system limit)
|
## Maximum size of corefile in Kb (0 - use system limit)
|
||||||
# coresize = 0
|
# coresize = 0
|
||||||
|
|
||||||
[trust]
|
[trust]
|
||||||
## Enable explicit trust options. (default: false)
|
## Enable explicit trust options. false by default
|
||||||
# enabled = true
|
# enabled = true
|
||||||
## Make direct I2P connections only to routers in specified Family.
|
## Make direct I2P connections only to routers in specified Family.
|
||||||
# family = MyFamily
|
# family = MyFamily
|
||||||
## Make direct I2P connections only to routers specified here. Comma separated list of base64 identities.
|
## Make direct I2P connections only to routers specified here. Comma separated list of base64 identities.
|
||||||
# routers =
|
# routers =
|
||||||
## Should we hide our router from other routers? (default: false)
|
## Should we hide our router from other routers? false by default
|
||||||
# hidden = true
|
# hidden = true
|
||||||
|
|
||||||
[exploratory]
|
[exploratory]
|
||||||
@@ -280,6 +254,8 @@ verify = true
|
|||||||
[cpuext]
|
[cpuext]
|
||||||
## Use CPU AES-NI instructions set when work with cryptography when available (default: true)
|
## Use CPU AES-NI instructions set when work with cryptography when available (default: true)
|
||||||
# aesni = true
|
# aesni = true
|
||||||
## Force usage of CPU instructions set, even if they not found (default: false)
|
## Use CPU AVX instructions set when work with cryptography when available (default: true)
|
||||||
|
# avx = true
|
||||||
|
## Force usage of CPU instructions set, even if they not found
|
||||||
## DO NOT TOUCH that option if you really don't know what are you doing!
|
## DO NOT TOUCH that option if you really don't know what are you doing!
|
||||||
# force = false
|
# force = false
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ SendSIGKILL=yes
|
|||||||
#TimeoutStopSec=10m
|
#TimeoutStopSec=10m
|
||||||
|
|
||||||
# If you have problems with hanging i2pd, you can try increase this
|
# If you have problems with hanging i2pd, you can try increase this
|
||||||
LimitNOFILE=8192
|
LimitNOFILE=4096
|
||||||
# To enable write of coredump uncomment this
|
# To enable write of coredump uncomment this
|
||||||
#LimitCORE=infinity
|
#LimitCORE=infinity
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
%define git_hash %(git rev-parse HEAD | cut -c -7)
|
%define git_hash %(git rev-parse HEAD | cut -c -7)
|
||||||
|
|
||||||
Name: i2pd-git
|
Name: i2pd-git
|
||||||
Version: 2.50.2
|
Version: 2.41.0
|
||||||
Release: git%{git_hash}%{?dist}
|
Release: git%{git_hash}%{?dist}
|
||||||
Summary: I2P router written in C++
|
Summary: I2P router written in C++
|
||||||
Conflicts: i2pd
|
Conflicts: i2pd
|
||||||
@@ -28,11 +28,9 @@ Requires: logrotate
|
|||||||
Requires: systemd
|
Requires: systemd
|
||||||
Requires(pre): %{_sbindir}/useradd %{_sbindir}/groupadd
|
Requires(pre): %{_sbindir}/useradd %{_sbindir}/groupadd
|
||||||
|
|
||||||
|
|
||||||
%description
|
%description
|
||||||
C++ implementation of I2P.
|
C++ implementation of I2P.
|
||||||
|
|
||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q -n i2pd-openssl
|
%setup -q -n i2pd-openssl
|
||||||
|
|
||||||
@@ -40,56 +38,78 @@ C++ implementation of I2P.
|
|||||||
%build
|
%build
|
||||||
cd build
|
cd build
|
||||||
%if 0%{?rhel} == 7
|
%if 0%{?rhel} == 7
|
||||||
%cmake3 \
|
%cmake3 \
|
||||||
-DWITH_LIBRARY=OFF \
|
-DWITH_LIBRARY=OFF \
|
||||||
-DWITH_UPNP=ON \
|
-DWITH_UPNP=ON \
|
||||||
-DWITH_HARDENING=ON \
|
-DWITH_HARDENING=ON \
|
||||||
-DBUILD_SHARED_LIBS:BOOL=OFF
|
-DBUILD_SHARED_LIBS:BOOL=OFF
|
||||||
%else
|
%else
|
||||||
%cmake \
|
%cmake \
|
||||||
-DWITH_LIBRARY=OFF \
|
-DWITH_LIBRARY=OFF \
|
||||||
-DWITH_UPNP=ON \
|
-DWITH_UPNP=ON \
|
||||||
-DWITH_HARDENING=ON \
|
-DWITH_HARDENING=ON \
|
||||||
%if 0%{?fedora} > 29
|
%if 0%{?fedora} > 29
|
||||||
-DBUILD_SHARED_LIBS:BOOL=OFF \
|
-DBUILD_SHARED_LIBS:BOOL=OFF \
|
||||||
.
|
.
|
||||||
%else
|
%else
|
||||||
-DBUILD_SHARED_LIBS:BOOL=OFF
|
-DBUILD_SHARED_LIBS:BOOL=OFF
|
||||||
%endif
|
%endif
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%if 0%{?rhel} == 9 || 0%{?fedora} >= 35 || 0%{?eln}
|
|
||||||
pushd redhat-linux-build
|
|
||||||
%else
|
|
||||||
%if 0%{?fedora} >= 33
|
|
||||||
pushd %{_target_platform}
|
|
||||||
%endif
|
|
||||||
|
|
||||||
%if 0%{?mageia} > 7
|
%if 0%{?rhel} == 9
|
||||||
pushd build
|
pushd redhat-linux-build
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
%if 0%{?fedora} >= 35
|
||||||
|
%if 0%{?fedora} < 37
|
||||||
|
pushd redhat-linux-build
|
||||||
|
%endif
|
||||||
|
%else
|
||||||
|
%if 0%{?fedora} >= 33
|
||||||
|
pushd %{_target_platform}
|
||||||
|
%endif
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if 0%{?mageia} > 7
|
||||||
|
pushd build
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
make %{?_smp_mflags}
|
make %{?_smp_mflags}
|
||||||
|
|
||||||
%if 0%{?rhel} == 9 || 0%{?fedora} >= 33 || 0%{?mageia} > 7
|
%if 0%{?rhel} == 9
|
||||||
popd
|
popd
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
%if 0%{?fedora} >= 33
|
||||||
|
%if 0%{?fedora} < 37
|
||||||
|
popd
|
||||||
|
%endif
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if 0%{?mageia} > 7
|
||||||
|
popd
|
||||||
|
%endif
|
||||||
|
|
||||||
%install
|
%install
|
||||||
pushd build
|
pushd build
|
||||||
|
|
||||||
%if 0%{?rhel} == 9 || 0%{?fedora} >= 35 || 0%{?eln}
|
%if 0%{?rhel} == 9
|
||||||
pushd redhat-linux-build
|
pushd redhat-linux-build
|
||||||
%else
|
%endif
|
||||||
%if 0%{?fedora} >= 33
|
|
||||||
pushd %{_target_platform}
|
|
||||||
%endif
|
|
||||||
|
|
||||||
%if 0%{?mageia}
|
%if 0%{?fedora} >= 35
|
||||||
pushd build
|
%if 0%{?fedora} < 37
|
||||||
%endif
|
pushd redhat-linux-build
|
||||||
|
%endif
|
||||||
|
%else
|
||||||
|
%if 0%{?fedora} >= 33
|
||||||
|
pushd %{_target_platform}
|
||||||
|
%endif
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if 0%{?mageia}
|
||||||
|
pushd build
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
chrpath -d i2pd
|
chrpath -d i2pd
|
||||||
@@ -144,48 +164,6 @@ getent passwd i2pd >/dev/null || \
|
|||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
* Sat Jan 06 2024 orignal <orignal@i2pmail.org> - 2.50.2
|
|
||||||
- update to 2.50.2
|
|
||||||
|
|
||||||
* Sat Dec 23 2023 r4sas <r4sas@i2pmail.org> - 2.50.1
|
|
||||||
- update to 2.50.1
|
|
||||||
|
|
||||||
* Mon Dec 18 2023 orignal <orignal@i2pmail.org> - 2.50.0
|
|
||||||
- update to 2.50.0
|
|
||||||
|
|
||||||
* Mon Sep 18 2023 orignal <orignal@i2pmail.org> - 2.49.0
|
|
||||||
- update to 2.49.0
|
|
||||||
|
|
||||||
* Mon Jun 12 2023 orignal <orignal@i2pmail.org> - 2.48.0
|
|
||||||
- update to 2.48.0
|
|
||||||
|
|
||||||
* Sat Mar 11 2023 orignal <orignal@i2pmail.org> - 2.47.0
|
|
||||||
- update to 2.47.0
|
|
||||||
|
|
||||||
* Mon Feb 20 2023 r4sas <r4sas@i2pmail.org> - 2.46.1
|
|
||||||
- update to 2.46.1
|
|
||||||
|
|
||||||
* Wed Feb 15 2023 orignal <orignal@i2pmail.org> - 2.46.0
|
|
||||||
- update to 2.46.0
|
|
||||||
|
|
||||||
* Wed Jan 11 2023 orignal <orignal@i2pmail.org> - 2.45.1
|
|
||||||
- update to 2.45.1
|
|
||||||
|
|
||||||
* Tue Jan 3 2023 orignal <orignal@i2pmail.org> - 2.45.0
|
|
||||||
- update to 2.45.0
|
|
||||||
|
|
||||||
* Sun Nov 20 2022 orignal <orignal@i2pmail.org> - 2.44.0
|
|
||||||
- update to 2.44.0
|
|
||||||
|
|
||||||
* Mon Aug 22 2022 orignal <orignal@i2pmail.org> - 2.43.0
|
|
||||||
- update to 2.43.0
|
|
||||||
|
|
||||||
* Tue May 24 2022 r4sas <r4sas@i2pmail.org> - 2.42.1
|
|
||||||
- update to 2.42.1
|
|
||||||
|
|
||||||
* Sun May 22 2022 orignal <orignal@i2pmail.org> - 2.42.0
|
|
||||||
- update to 2.42.0
|
|
||||||
|
|
||||||
* Sun Feb 20 2022 r4sas <r4sas@i2pmail.org> - 2.41.0
|
* Sun Feb 20 2022 r4sas <r4sas@i2pmail.org> - 2.41.0
|
||||||
- update to 2.41.0
|
- update to 2.41.0
|
||||||
- fixed build on Fedora Copr over openssl trunk code
|
- fixed build on Fedora Copr over openssl trunk code
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
Name: i2pd
|
Name: i2pd
|
||||||
Version: 2.50.2
|
Version: 2.41.0
|
||||||
Release: 1%{?dist}
|
Release: 1%{?dist}
|
||||||
Summary: I2P router written in C++
|
Summary: I2P router written in C++
|
||||||
Conflicts: i2pd-git
|
Conflicts: i2pd-git
|
||||||
@@ -26,11 +26,9 @@ Requires: logrotate
|
|||||||
Requires: systemd
|
Requires: systemd
|
||||||
Requires(pre): %{_sbindir}/useradd %{_sbindir}/groupadd
|
Requires(pre): %{_sbindir}/useradd %{_sbindir}/groupadd
|
||||||
|
|
||||||
|
|
||||||
%description
|
%description
|
||||||
C++ implementation of I2P.
|
C++ implementation of I2P.
|
||||||
|
|
||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q
|
%setup -q
|
||||||
|
|
||||||
@@ -38,56 +36,77 @@ C++ implementation of I2P.
|
|||||||
%build
|
%build
|
||||||
cd build
|
cd build
|
||||||
%if 0%{?rhel} == 7
|
%if 0%{?rhel} == 7
|
||||||
%cmake3 \
|
%cmake3 \
|
||||||
-DWITH_LIBRARY=OFF \
|
-DWITH_LIBRARY=OFF \
|
||||||
-DWITH_UPNP=ON \
|
-DWITH_UPNP=ON \
|
||||||
-DWITH_HARDENING=ON \
|
-DWITH_HARDENING=ON \
|
||||||
-DBUILD_SHARED_LIBS:BOOL=OFF
|
-DBUILD_SHARED_LIBS:BOOL=OFF
|
||||||
%else
|
%else
|
||||||
%cmake \
|
%cmake \
|
||||||
-DWITH_LIBRARY=OFF \
|
-DWITH_LIBRARY=OFF \
|
||||||
-DWITH_UPNP=ON \
|
-DWITH_UPNP=ON \
|
||||||
-DWITH_HARDENING=ON \
|
-DWITH_HARDENING=ON \
|
||||||
%if 0%{?fedora} > 29
|
%if 0%{?fedora} > 29
|
||||||
-DBUILD_SHARED_LIBS:BOOL=OFF \
|
-DBUILD_SHARED_LIBS:BOOL=OFF \
|
||||||
.
|
.
|
||||||
%else
|
%else
|
||||||
-DBUILD_SHARED_LIBS:BOOL=OFF
|
-DBUILD_SHARED_LIBS:BOOL=OFF
|
||||||
%endif
|
%endif
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%if 0%{?rhel} == 9 || 0%{?fedora} >= 35 || 0%{?eln}
|
%if 0%{?rhel} == 9
|
||||||
pushd redhat-linux-build
|
pushd redhat-linux-build
|
||||||
%else
|
%endif
|
||||||
%if 0%{?fedora} >= 33
|
|
||||||
pushd %{_target_platform}
|
|
||||||
%endif
|
|
||||||
|
|
||||||
%if 0%{?mageia} > 7
|
%if 0%{?fedora} >= 35
|
||||||
pushd build
|
%if 0%{?fedora} < 37
|
||||||
%endif
|
pushd redhat-linux-build
|
||||||
|
%endif
|
||||||
|
%else
|
||||||
|
%if 0%{?fedora} >= 33
|
||||||
|
pushd %{_target_platform}
|
||||||
|
%endif
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if 0%{?mageia} > 7
|
||||||
|
pushd build
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
make %{?_smp_mflags}
|
make %{?_smp_mflags}
|
||||||
|
|
||||||
%if 0%{?rhel} == 9 || 0%{?fedora} >= 33 || 0%{?mageia} > 7
|
%if 0%{?rhel} == 9
|
||||||
popd
|
popd
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
%if 0%{?fedora} >= 33
|
||||||
|
%if 0%{?fedora} < 37
|
||||||
|
popd
|
||||||
|
%endif
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if 0%{?mageia} > 7
|
||||||
|
popd
|
||||||
|
%endif
|
||||||
|
|
||||||
%install
|
%install
|
||||||
pushd build
|
pushd build
|
||||||
|
|
||||||
%if 0%{?rhel} == 9 || 0%{?fedora} >= 35 || 0%{?eln}
|
%if 0%{?rhel} == 9
|
||||||
pushd redhat-linux-build
|
pushd redhat-linux-build
|
||||||
%else
|
%endif
|
||||||
%if 0%{?fedora} >= 33
|
|
||||||
pushd %{_target_platform}
|
|
||||||
%endif
|
|
||||||
|
|
||||||
%if 0%{?mageia}
|
%if 0%{?fedora} >= 35
|
||||||
pushd build
|
%if 0%{?fedora} < 37
|
||||||
%endif
|
pushd redhat-linux-build
|
||||||
|
%endif
|
||||||
|
%else
|
||||||
|
%if 0%{?fedora} >= 33
|
||||||
|
pushd %{_target_platform}
|
||||||
|
%endif
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if 0%{?mageia}
|
||||||
|
pushd build
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
chrpath -d i2pd
|
chrpath -d i2pd
|
||||||
@@ -142,48 +161,6 @@ getent passwd i2pd >/dev/null || \
|
|||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
* Sat Jan 06 2024 orignal <orignal@i2pmail.org> - 2.50.2
|
|
||||||
- update to 2.50.2
|
|
||||||
|
|
||||||
* Sat Dec 23 2023 r4sas <r4sas@i2pmail.org> - 2.50.1
|
|
||||||
- update to 2.50.1
|
|
||||||
|
|
||||||
* Mon Dec 18 2023 orignal <orignal@i2pmail.org> - 2.50.0
|
|
||||||
- update to 2.50.0
|
|
||||||
|
|
||||||
* Mon Sep 18 2023 orignal <orignal@i2pmail.org> - 2.49.0
|
|
||||||
- update to 2.49.0
|
|
||||||
|
|
||||||
* Mon Jun 12 2023 orignal <orignal@i2pmail.org> - 2.48.0
|
|
||||||
- update to 2.48.0
|
|
||||||
|
|
||||||
* Sat Mar 11 2023 orignal <orignal@i2pmail.org> - 2.47.0
|
|
||||||
- update to 2.47.0
|
|
||||||
|
|
||||||
* Mon Feb 20 2023 r4sas <r4sas@i2pmail.org> - 2.46.1
|
|
||||||
- update to 2.46.1
|
|
||||||
|
|
||||||
* Wed Feb 15 2023 orignal <orignal@i2pmail.org> - 2.46.0
|
|
||||||
- update to 2.46.0
|
|
||||||
|
|
||||||
* Wed Jan 11 2023 orignal <orignal@i2pmail.org> - 2.45.1
|
|
||||||
- update to 2.45.1
|
|
||||||
|
|
||||||
* Tue Jan 3 2023 orignal <orignal@i2pmail.org> - 2.45.0
|
|
||||||
- update to 2.45.0
|
|
||||||
|
|
||||||
* Sun Nov 20 2022 orignal <orignal@i2pmail.org> - 2.44.0
|
|
||||||
- update to 2.44.0
|
|
||||||
|
|
||||||
* Mon Aug 22 2022 orignal <orignal@i2pmail.org> - 2.43.0
|
|
||||||
- update to 2.43.0
|
|
||||||
|
|
||||||
* Tue May 24 2022 r4sas <r4sas@i2pmail.org> - 2.42.1
|
|
||||||
- update to 2.42.1
|
|
||||||
|
|
||||||
* Sun May 22 2022 orignal <orignal@i2pmail.org> - 2.42.0
|
|
||||||
- update to 2.42.0
|
|
||||||
|
|
||||||
* Sun Feb 20 2022 r4sas <r4sas@i2pmail.org> - 2.41.0
|
* Sun Feb 20 2022 r4sas <r4sas@i2pmail.org> - 2.41.0
|
||||||
- update to 2.41.0
|
- update to 2.41.0
|
||||||
|
|
||||||
|
|||||||
@@ -1,293 +1,293 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2021-2023, The PurpleI2P Project
|
* Copyright (c) 2021-2022, The PurpleI2P Project
|
||||||
*
|
*
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
* This file is part of Purple i2pd project and licensed under BSD3
|
||||||
*
|
*
|
||||||
* See full license text in LICENSE file at top of project tree
|
* See full license text in LICENSE file at top of project tree
|
||||||
*
|
*
|
||||||
******************************************************************
|
******************************************************************
|
||||||
*
|
*
|
||||||
* This is style sheet for webconsole, with @media selectors for adaptive
|
* This is style sheet for webconsole, with @media selectors for adaptive
|
||||||
* view on desktop and mobile devices, respecting preferred user's color
|
* view on desktop and mobile devices, respecting preferred user's color
|
||||||
* scheme used in system/browser.
|
* scheme used in system/browser.
|
||||||
*
|
*
|
||||||
* Minified copy of that style sheet is bundled inside i2pd sources.
|
* Minified copy of that style sheet is bundled inside i2pd sources.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
--main-bg-color: #fafafa;
|
--main-bg-color: #fafafa;
|
||||||
--main-text-color: #103456;
|
--main-text-color: #103456;
|
||||||
--main-link-color: #894c84;
|
--main-link-color: #894c84;
|
||||||
--main-link-hover-color: #fafafa;
|
--main-link-hover-color: #fafafa;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
@media (prefers-color-scheme: dark) {
|
||||||
:root {
|
:root {
|
||||||
--main-bg-color: #242424;
|
--main-bg-color: #242424;
|
||||||
--main-text-color: #17ab5c;
|
--main-text-color: #17ab5c;
|
||||||
--main-link-color: #bf64b7;
|
--main-link-color: #bf64b7;
|
||||||
--main-link-hover-color: #000000;
|
--main-link-hover-color: #000000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
font: 100%/1.5em sans-serif;
|
font: 100%/1.5em sans-serif;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 1.5em;
|
padding: 1.5em;
|
||||||
background: var(--main-bg-color);
|
background: var(--main-bg-color);
|
||||||
color: var(--main-text-color);
|
color: var(--main-text-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
a, .slide label {
|
a, .slide label {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
color: var(--main-link-color);
|
color: var(--main-link-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
a:hover, a.button.selected, .slide label:hover, button[type=submit]:hover {
|
a:hover, .slide label:hover, button[type=submit]:hover {
|
||||||
color: var(--main-link-hover-color);
|
color: var(--main-link-hover-color);
|
||||||
background: var(--main-link-color);
|
background: var(--main-link-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
a.button {
|
a.button {
|
||||||
appearance: button;
|
appearance: button;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
padding: 0 5px;
|
padding: 0 5px;
|
||||||
border: 1px solid var(--main-link-color);
|
border: 1px solid var(--main-link-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.header {
|
.header {
|
||||||
font-size: 2.5em;
|
font-size: 2.5em;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
margin: 1em 0;
|
margin: 1em 0;
|
||||||
color: var(--main-link-color);
|
color: var(--main-link-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.wrapper {
|
.wrapper {
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
padding: 1em;
|
padding: 1em;
|
||||||
max-width: 64em;
|
max-width: 64em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.menu {
|
.menu {
|
||||||
display: block;
|
display: block;
|
||||||
float: left;
|
float: left;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
padding: 4px;
|
padding: 4px;
|
||||||
max-width: 12em;
|
max-width: 12em;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
|
|
||||||
.listitem {
|
.listitem {
|
||||||
display: block;
|
display: block;
|
||||||
font-family: monospace;
|
font-family: monospace;
|
||||||
font-size: 1.2em;
|
font-size: 1.2em;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tableitem {
|
.tableitem {
|
||||||
font-family: monospace;
|
font-family: monospace;
|
||||||
font-size: 1.2em;
|
font-size: 1.2em;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content {
|
.content {
|
||||||
float: left;
|
float: left;
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
margin-left: 2em;
|
margin-left: 2em;
|
||||||
padding: 4px;
|
padding: 4px;
|
||||||
max-width: 50em;
|
max-width: 50em;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tunnel.established {
|
.tunnel.established {
|
||||||
color: #56B734;
|
color: #56B734;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tunnel.expiring {
|
.tunnel.expiring {
|
||||||
color: #D3AE3F;
|
color: #D3AE3F;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tunnel.failed {
|
.tunnel.failed {
|
||||||
color: #D33F3F;
|
color: #D33F3F;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tunnel.building {
|
.tunnel.building {
|
||||||
color: #434343;
|
color: #434343;
|
||||||
}
|
}
|
||||||
|
|
||||||
caption {
|
caption {
|
||||||
font-size: 1.5em;
|
font-size: 1.5em;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: var(--main-link-color);
|
color: var(--main-link-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
table {
|
table {
|
||||||
display: table;
|
display: table;
|
||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
table.extaddr {
|
table.extaddr {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
table.services {
|
table.services {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
textarea {
|
textarea {
|
||||||
background-color: var(--main-bg-color);
|
background-color: var(--main-bg-color);
|
||||||
color: var(--main-text-color);
|
color: var(--main-text-color);
|
||||||
word-break: break-all;
|
word-break: break-all;
|
||||||
}
|
}
|
||||||
|
|
||||||
.streamdest {
|
.streamdest {
|
||||||
width: 120px;
|
width: 120px;
|
||||||
max-width: 240px;
|
max-width: 240px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
|
|
||||||
.slide div.slidecontent, .slide [type="checkbox"] {
|
.slide div.slidecontent, .slide [type="checkbox"] {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.slide [type="checkbox"]:checked ~ div.slidecontent {
|
.slide [type="checkbox"]:checked ~ div.slidecontent {
|
||||||
display: block;
|
display: block;
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.disabled {
|
.disabled {
|
||||||
color: #D33F3F;
|
color: #D33F3F;
|
||||||
}
|
}
|
||||||
|
|
||||||
.enabled {
|
.enabled {
|
||||||
color: #56B734;
|
color: #56B734;
|
||||||
}
|
}
|
||||||
|
|
||||||
button[type=submit] {
|
button[type=submit] {
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
color: var(--main-link-color);
|
color: var(--main-link-color);
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
border: 1px solid var(--main-link-color);
|
border: 1px solid var(--main-link-color);
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
input, select, select option {
|
input, select, select option {
|
||||||
background-color: var(--main-bg-color);
|
background-color: var(--main-bg-color);
|
||||||
color: var(--main-link-color);
|
color: var(--main-link-color);
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
border: 1px solid var(--main-link-color);
|
border: 1px solid var(--main-link-color);
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
input:focus, select:focus, select option:focus {
|
input:focus, select:focus, select option:focus {
|
||||||
outline: none;
|
outline: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type=number]::-webkit-inner-spin-button {
|
input[type=number]::-webkit-inner-spin-button {
|
||||||
-webkit-appearance: none;
|
-webkit-appearance: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (max-width: 1150px) { /* adaptive style */
|
@media screen and (max-width: 1150px) { /* adaptive style */
|
||||||
.wrapper {
|
.wrapper {
|
||||||
max-width: 58em;
|
max-width: 58em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content {
|
.content {
|
||||||
max-width: 40em;
|
max-width: 40em;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (max-width: 980px) {
|
@media screen and (max-width: 980px) {
|
||||||
body {
|
body {
|
||||||
font: 100%/1.2em sans-serif;
|
font: 100%/1.2em sans-serif;
|
||||||
padding: 1.2em 0 0 0;
|
padding: 1.2em 0 0 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.menu {
|
.menu {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: unset;
|
max-width: unset;
|
||||||
display: block;
|
display: block;
|
||||||
float: none;
|
float: none;
|
||||||
position: unset;
|
position: unset;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.menu a, .commands a {
|
.menu a, .commands a {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
padding: 4px;
|
padding: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content {
|
.content {
|
||||||
float: none;
|
float: none;
|
||||||
margin-left: unset;
|
margin-left: unset;
|
||||||
margin-top: 16px;
|
margin-top: 16px;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
a, .slide label {
|
a, .slide label {
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
.header {
|
.header {
|
||||||
margin: unset;
|
margin: unset;
|
||||||
font-size: 1.5em;
|
font-size: 1.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
small {
|
small {
|
||||||
display: block
|
display: block
|
||||||
}
|
}
|
||||||
|
|
||||||
a.button {
|
a.button {
|
||||||
appearance: button;
|
appearance: button;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
margin-top: 10px;
|
margin-top: 10px;
|
||||||
padding: 6px;
|
padding: 6px;
|
||||||
border: 2px solid var(--main-link-color);
|
border: 2px solid var(--main-link-color);
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
width: -webkit-fill-available;
|
width: -webkit-fill-available;
|
||||||
}
|
}
|
||||||
|
|
||||||
input, select {
|
input, select {
|
||||||
width: 35%;
|
width: 35%;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
border: 2px solid var(--main-link-color);
|
border: 2px solid var(--main-link-color);
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
}
|
}
|
||||||
|
|
||||||
table.extaddr {
|
table.extaddr {
|
||||||
margin: auto;
|
margin: auto;
|
||||||
text-align: unset;
|
text-align: unset;
|
||||||
}
|
}
|
||||||
|
|
||||||
textarea {
|
textarea {
|
||||||
width: -webkit-fill-available;
|
width: -webkit-fill-available;
|
||||||
height: auto;
|
height: auto;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
border: 2px solid var(--main-link-color);
|
border: 2px solid var(--main-link-color);
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
button[type=submit] {
|
button[type=submit] {
|
||||||
padding: 5px 15px;
|
padding: 5px 15px;
|
||||||
background: transparent;
|
background: transparent;
|
||||||
border: 2px solid var(--main-link-color);
|
border: 2px solid var(--main-link-color);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
-webkit-border-radius: 5px;
|
-webkit-border-radius: 5px;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
position: relative;
|
position: relative;
|
||||||
height: 36px;
|
height: 36px;
|
||||||
display: -webkit-inline-box;
|
display: -webkit-inline-box;
|
||||||
margin-top: 10px;
|
margin-top: 10px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2023, The PurpleI2P Project
|
* Copyright (c) 2013-2022, The PurpleI2P Project
|
||||||
*
|
*
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
* This file is part of Purple i2pd project and licensed under BSD3
|
||||||
*
|
*
|
||||||
@@ -26,11 +26,14 @@
|
|||||||
#include "Streaming.h"
|
#include "Streaming.h"
|
||||||
#include "Destination.h"
|
#include "Destination.h"
|
||||||
#include "HTTPServer.h"
|
#include "HTTPServer.h"
|
||||||
|
#ifdef WITH_I2PC
|
||||||
#include "I2PControl.h"
|
#include "I2PControl.h"
|
||||||
|
#endif
|
||||||
#include "ClientContext.h"
|
#include "ClientContext.h"
|
||||||
#include "Crypto.h"
|
#include "Crypto.h"
|
||||||
#include "UPnP.h"
|
#include "UPnP.h"
|
||||||
#include "Timestamp.h"
|
#include "Timestamp.h"
|
||||||
|
#include "util.h"
|
||||||
#include "I18N.h"
|
#include "I18N.h"
|
||||||
|
|
||||||
namespace i2p
|
namespace i2p
|
||||||
@@ -44,7 +47,9 @@ namespace util
|
|||||||
~Daemon_Singleton_Private() {};
|
~Daemon_Singleton_Private() {};
|
||||||
|
|
||||||
std::unique_ptr<i2p::http::HTTPServer> httpServer;
|
std::unique_ptr<i2p::http::HTTPServer> httpServer;
|
||||||
|
#ifdef WITH_I2PC
|
||||||
std::unique_ptr<i2p::client::I2PControlService> m_I2PControlService;
|
std::unique_ptr<i2p::client::I2PControlService> m_I2PControlService;
|
||||||
|
#endif
|
||||||
std::unique_ptr<i2p::transport::UPnP> UPnP;
|
std::unique_ptr<i2p::transport::UPnP> UPnP;
|
||||||
std::unique_ptr<i2p::util::NTPTimeSync> m_NTPSync;
|
std::unique_ptr<i2p::util::NTPTimeSync> m_NTPSync;
|
||||||
};
|
};
|
||||||
@@ -57,7 +62,9 @@ namespace util
|
|||||||
bool Daemon_Singleton::IsService () const
|
bool Daemon_Singleton::IsService () const
|
||||||
{
|
{
|
||||||
bool service = false;
|
bool service = false;
|
||||||
|
#ifndef _WIN32
|
||||||
i2p::config::GetOption("service", service);
|
i2p::config::GetOption("service", service);
|
||||||
|
#endif
|
||||||
return service;
|
return service;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,7 +83,7 @@ namespace util
|
|||||||
i2p::config::Init();
|
i2p::config::Init();
|
||||||
i2p::config::ParseCmdline(argc, argv);
|
i2p::config::ParseCmdline(argc, argv);
|
||||||
|
|
||||||
std::string config; i2p::config::GetOption("conf", config);
|
std::string config; i2p::config::GetOption("conf", config);
|
||||||
std::string datadir;
|
std::string datadir;
|
||||||
if(DaemonDataDir != "") {
|
if(DaemonDataDir != "") {
|
||||||
datadir = DaemonDataDir;
|
datadir = DaemonDataDir;
|
||||||
@@ -108,9 +115,9 @@ namespace util
|
|||||||
|
|
||||||
certsdir = i2p::fs::GetCertsDir();
|
certsdir = i2p::fs::GetCertsDir();
|
||||||
|
|
||||||
std::string logs = ""; i2p::config::GetOption("log", logs);
|
std::string logs = ""; i2p::config::GetOption("log", logs);
|
||||||
std::string logfile = ""; i2p::config::GetOption("logfile", logfile);
|
std::string logfile = ""; i2p::config::GetOption("logfile", logfile);
|
||||||
std::string loglevel = ""; i2p::config::GetOption("loglevel", loglevel);
|
std::string loglevel = ""; i2p::config::GetOption("loglevel", loglevel);
|
||||||
bool logclftime; i2p::config::GetOption("logclftime", logclftime);
|
bool logclftime; i2p::config::GetOption("logclftime", logclftime);
|
||||||
|
|
||||||
/* setup logging */
|
/* setup logging */
|
||||||
@@ -150,35 +157,132 @@ namespace util
|
|||||||
|
|
||||||
bool precomputation; i2p::config::GetOption("precomputation.elgamal", precomputation);
|
bool precomputation; i2p::config::GetOption("precomputation.elgamal", precomputation);
|
||||||
bool aesni; i2p::config::GetOption("cpuext.aesni", aesni);
|
bool aesni; i2p::config::GetOption("cpuext.aesni", aesni);
|
||||||
|
bool avx; i2p::config::GetOption("cpuext.avx", avx);
|
||||||
bool forceCpuExt; i2p::config::GetOption("cpuext.force", forceCpuExt);
|
bool forceCpuExt; i2p::config::GetOption("cpuext.force", forceCpuExt);
|
||||||
bool ssu; i2p::config::GetOption("ssu", ssu);
|
i2p::crypto::InitCrypto (precomputation, aesni, avx, forceCpuExt);
|
||||||
if (!ssu && i2p::config::IsDefault ("precomputation.elgamal"))
|
|
||||||
precomputation = false; // we don't elgamal table if no ssu, unless it's specified explicitly
|
|
||||||
i2p::crypto::InitCrypto (precomputation, aesni, forceCpuExt);
|
|
||||||
|
|
||||||
i2p::transport::InitAddressFromIface (); // get address4/6 from interfaces
|
|
||||||
|
|
||||||
int netID; i2p::config::GetOption("netid", netID);
|
int netID; i2p::config::GetOption("netid", netID);
|
||||||
i2p::context.SetNetID (netID);
|
i2p::context.SetNetID (netID);
|
||||||
i2p::context.Init ();
|
i2p::context.Init ();
|
||||||
|
|
||||||
i2p::transport::InitTransports ();
|
bool ipv6; i2p::config::GetOption("ipv6", ipv6);
|
||||||
|
bool ipv4; i2p::config::GetOption("ipv4", ipv4);
|
||||||
|
|
||||||
|
// ifname -> address
|
||||||
|
std::string ifname; i2p::config::GetOption("ifname", ifname);
|
||||||
|
if (ipv4 && i2p::config::IsDefault ("address4"))
|
||||||
|
{
|
||||||
|
std::string ifname4; i2p::config::GetOption("ifname4", ifname4);
|
||||||
|
if (!ifname4.empty ())
|
||||||
|
i2p::config::SetOption ("address4", i2p::util::net::GetInterfaceAddress(ifname4, false).to_string ()); // v4
|
||||||
|
else if (!ifname.empty ())
|
||||||
|
i2p::config::SetOption ("address4", i2p::util::net::GetInterfaceAddress(ifname, false).to_string ()); // v4
|
||||||
|
}
|
||||||
|
if (ipv6 && i2p::config::IsDefault ("address6"))
|
||||||
|
{
|
||||||
|
std::string ifname6; i2p::config::GetOption("ifname6", ifname6);
|
||||||
|
if (!ifname6.empty ())
|
||||||
|
i2p::config::SetOption ("address6", i2p::util::net::GetInterfaceAddress(ifname6, true).to_string ()); // v6
|
||||||
|
else if (!ifname.empty ())
|
||||||
|
i2p::config::SetOption ("address6", i2p::util::net::GetInterfaceAddress(ifname, true).to_string ()); // v6
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ygg; i2p::config::GetOption("meshnets.yggdrasil", ygg);
|
||||||
|
boost::asio::ip::address_v6 yggaddr;
|
||||||
|
if (ygg)
|
||||||
|
{
|
||||||
|
std::string yggaddress; i2p::config::GetOption ("meshnets.yggaddress", yggaddress);
|
||||||
|
if (!yggaddress.empty ())
|
||||||
|
{
|
||||||
|
yggaddr = boost::asio::ip::address_v6::from_string (yggaddress);
|
||||||
|
if (yggaddr.is_unspecified () || !i2p::util::net::IsYggdrasilAddress (yggaddr) ||
|
||||||
|
!i2p::util::net::IsLocalAddress (yggaddr))
|
||||||
|
{
|
||||||
|
LogPrint(eLogWarning, "Daemon: Can't find Yggdrasil address ", yggaddress);
|
||||||
|
ygg = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
yggaddr = i2p::util::net::GetYggdrasilAddress ();
|
||||||
|
if (yggaddr.is_unspecified ())
|
||||||
|
{
|
||||||
|
LogPrint(eLogWarning, "Daemon: Yggdrasil is not running. Disabled");
|
||||||
|
ygg = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t port; i2p::config::GetOption("port", port);
|
||||||
|
if (!i2p::config::IsDefault("port"))
|
||||||
|
{
|
||||||
|
LogPrint(eLogInfo, "Daemon: Accepting incoming connections at port ", port);
|
||||||
|
i2p::context.UpdatePort (port);
|
||||||
|
}
|
||||||
|
i2p::context.SetSupportsV6 (ipv6);
|
||||||
|
i2p::context.SetSupportsV4 (ipv4);
|
||||||
|
i2p::context.SetSupportsMesh (ygg, yggaddr);
|
||||||
|
|
||||||
|
i2p::context.RemoveNTCPAddress (!ipv6); // TODO: remove later
|
||||||
|
bool ntcp2; i2p::config::GetOption("ntcp2.enabled", ntcp2);
|
||||||
|
if (ntcp2)
|
||||||
|
{
|
||||||
|
bool published; i2p::config::GetOption("ntcp2.published", published);
|
||||||
|
if (published)
|
||||||
|
{
|
||||||
|
std::string ntcp2proxy; i2p::config::GetOption("ntcp2.proxy", ntcp2proxy);
|
||||||
|
if (!ntcp2proxy.empty ()) published = false;
|
||||||
|
}
|
||||||
|
if (published)
|
||||||
|
{
|
||||||
|
uint16_t ntcp2port; i2p::config::GetOption("ntcp2.port", ntcp2port);
|
||||||
|
if (!ntcp2port) ntcp2port = port; // use standard port
|
||||||
|
i2p::context.PublishNTCP2Address (ntcp2port, true, ipv4, ipv6, false); // publish
|
||||||
|
if (ipv6)
|
||||||
|
{
|
||||||
|
std::string ipv6Addr; i2p::config::GetOption("ntcp2.addressv6", ipv6Addr);
|
||||||
|
auto addr = boost::asio::ip::address_v6::from_string (ipv6Addr);
|
||||||
|
if (!addr.is_unspecified () && addr != boost::asio::ip::address_v6::any ())
|
||||||
|
i2p::context.UpdateNTCP2V6Address (addr); // set ipv6 address if configured
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
i2p::context.PublishNTCP2Address (port, false, ipv4, ipv6, false); // unpublish
|
||||||
|
}
|
||||||
|
if (ygg)
|
||||||
|
{
|
||||||
|
i2p::context.PublishNTCP2Address (port, true, false, false, true);
|
||||||
|
i2p::context.UpdateNTCP2V6Address (yggaddr);
|
||||||
|
if (!ipv4 && !ipv6)
|
||||||
|
i2p::context.SetStatus (eRouterStatusMesh);
|
||||||
|
}
|
||||||
|
bool ssu2; i2p::config::GetOption("ssu2.enabled", ssu2);
|
||||||
|
if (ssu2)
|
||||||
|
{
|
||||||
|
bool published; i2p::config::GetOption("ssu2.published", published);
|
||||||
|
if (published)
|
||||||
|
{
|
||||||
|
uint16_t ssu2port; i2p::config::GetOption("ssu2.port", ssu2port);
|
||||||
|
i2p::context.PublishSSU2Address (ssu2port, true, ipv4, ipv6); // publish
|
||||||
|
}
|
||||||
|
else
|
||||||
|
i2p::context.PublishSSU2Address (0, false, ipv4, ipv6); // unpublish
|
||||||
|
}
|
||||||
|
|
||||||
|
bool transit; i2p::config::GetOption("notransit", transit);
|
||||||
|
i2p::context.SetAcceptsTunnels (!transit);
|
||||||
|
uint16_t transitTunnels; i2p::config::GetOption("limits.transittunnels", transitTunnels);
|
||||||
|
SetMaxNumTransitTunnels (transitTunnels);
|
||||||
|
|
||||||
bool isFloodfill; i2p::config::GetOption("floodfill", isFloodfill);
|
bool isFloodfill; i2p::config::GetOption("floodfill", isFloodfill);
|
||||||
if (isFloodfill)
|
if (isFloodfill) {
|
||||||
{
|
|
||||||
LogPrint(eLogInfo, "Daemon: Router configured as floodfill");
|
LogPrint(eLogInfo, "Daemon: Router configured as floodfill");
|
||||||
i2p::context.SetFloodfill (true);
|
i2p::context.SetFloodfill (true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
i2p::context.SetFloodfill (false);
|
i2p::context.SetFloodfill (false);
|
||||||
|
}
|
||||||
bool transit; i2p::config::GetOption("notransit", transit);
|
|
||||||
i2p::context.SetAcceptsTunnels (!transit);
|
|
||||||
uint16_t transitTunnels; i2p::config::GetOption("limits.transittunnels", transitTunnels);
|
|
||||||
if (isFloodfill && i2p::config::IsDefault ("limits.transittunnels"))
|
|
||||||
transitTunnels *= 2; // double default number of transit tunnels for floodfill
|
|
||||||
i2p::tunnel::tunnels.SetMaxNumTransitTunnels (transitTunnels);
|
|
||||||
|
|
||||||
/* this section also honors 'floodfill' flag, if set above */
|
/* this section also honors 'floodfill' flag, if set above */
|
||||||
std::string bandwidth; i2p::config::GetOption("bandwidth", bandwidth);
|
std::string bandwidth; i2p::config::GetOption("bandwidth", bandwidth);
|
||||||
@@ -268,7 +372,7 @@ namespace util
|
|||||||
if (hidden)
|
if (hidden)
|
||||||
{
|
{
|
||||||
LogPrint(eLogInfo, "Daemon: Hidden mode enabled");
|
LogPrint(eLogInfo, "Daemon: Hidden mode enabled");
|
||||||
i2p::context.SetHidden(true);
|
i2p::data::netdb.SetHidden(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string httpLang; i2p::config::GetOption("http.lang", httpLang);
|
std::string httpLang; i2p::config::GetOption("http.lang", httpLang);
|
||||||
@@ -298,18 +402,19 @@ namespace util
|
|||||||
|
|
||||||
bool ntcp2; i2p::config::GetOption("ntcp2.enabled", ntcp2);
|
bool ntcp2; i2p::config::GetOption("ntcp2.enabled", ntcp2);
|
||||||
bool ssu2; i2p::config::GetOption("ssu2.enabled", ssu2);
|
bool ssu2; i2p::config::GetOption("ssu2.enabled", ssu2);
|
||||||
|
bool ssu; i2p::config::GetOption("ssu", ssu);
|
||||||
bool checkInReserved; i2p::config::GetOption("reservedrange", checkInReserved);
|
bool checkInReserved; i2p::config::GetOption("reservedrange", checkInReserved);
|
||||||
LogPrint(eLogInfo, "Daemon: Starting Transports");
|
LogPrint(eLogInfo, "Daemon: Starting Transports");
|
||||||
if(!ssu2) LogPrint(eLogInfo, "Daemon: SSU2 disabled");
|
if(!ssu) LogPrint(eLogInfo, "Daemon: SSU disabled");
|
||||||
if(!ntcp2) LogPrint(eLogInfo, "Daemon: NTCP2 disabled");
|
if(!ntcp2) LogPrint(eLogInfo, "Daemon: NTCP2 disabled");
|
||||||
|
|
||||||
i2p::transport::transports.SetCheckReserved(checkInReserved);
|
i2p::transport::transports.SetCheckReserved(checkInReserved);
|
||||||
i2p::transport::transports.Start(ntcp2, ssu2);
|
i2p::transport::transports.Start(ntcp2, ssu, ssu2);
|
||||||
if (i2p::transport::transports.IsBoundSSU2() || i2p::transport::transports.IsBoundNTCP2())
|
if (i2p::transport::transports.IsBoundSSU() || i2p::transport::transports.IsBoundNTCP2())
|
||||||
LogPrint(eLogInfo, "Daemon: Transports started");
|
LogPrint(eLogInfo, "Daemon: Transports started");
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LogPrint(eLogCritical, "Daemon: Failed to start Transports");
|
LogPrint(eLogError, "Daemon: Failed to start Transports");
|
||||||
/** shut down netdb right away */
|
/** shut down netdb right away */
|
||||||
i2p::transport::transports.Stop();
|
i2p::transport::transports.Stop();
|
||||||
i2p::data::netdb.Stop();
|
i2p::data::netdb.Stop();
|
||||||
@@ -328,20 +433,19 @@ namespace util
|
|||||||
}
|
}
|
||||||
catch (std::exception& ex)
|
catch (std::exception& ex)
|
||||||
{
|
{
|
||||||
LogPrint (eLogCritical, "Daemon: Failed to start Webconsole: ", ex.what ());
|
LogPrint (eLogError, "Daemon: Failed to start Webconsole: ", ex.what ());
|
||||||
ThrowFatal ("Unable to start webconsole at ", httpAddr, ":", httpPort, ": ", ex.what ());
|
ThrowFatal ("Unable to start webconsole at ", httpAddr, ":", httpPort, ": ", ex.what ());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
LogPrint(eLogInfo, "Daemon: Starting Tunnels");
|
LogPrint(eLogInfo, "Daemon: Starting Tunnels");
|
||||||
i2p::tunnel::tunnels.Start();
|
i2p::tunnel::tunnels.Start();
|
||||||
|
|
||||||
LogPrint(eLogInfo, "Daemon: Starting Router context");
|
|
||||||
i2p::context.Start();
|
|
||||||
|
|
||||||
LogPrint(eLogInfo, "Daemon: Starting Client");
|
LogPrint(eLogInfo, "Daemon: Starting Client");
|
||||||
i2p::client::context.Start ();
|
i2p::client::context.Start ();
|
||||||
|
|
||||||
|
#ifdef WITH_I2PC
|
||||||
// I2P Control Protocol
|
// I2P Control Protocol
|
||||||
bool i2pcontrol; i2p::config::GetOption("i2pcontrol.enabled", i2pcontrol);
|
bool i2pcontrol; i2p::config::GetOption("i2pcontrol.enabled", i2pcontrol);
|
||||||
if (i2pcontrol) {
|
if (i2pcontrol) {
|
||||||
@@ -355,10 +459,11 @@ namespace util
|
|||||||
}
|
}
|
||||||
catch (std::exception& ex)
|
catch (std::exception& ex)
|
||||||
{
|
{
|
||||||
LogPrint (eLogCritical, "Daemon: Failed to start I2PControl: ", ex.what ());
|
LogPrint (eLogError, "Daemon: Failed to start I2PControl: ", ex.what ());
|
||||||
ThrowFatal ("Unable to start I2PControl service at ", i2pcpAddr, ":", i2pcpPort, ": ", ex.what ());
|
ThrowFatal ("Unable to start I2PControl service at ", i2pcpAddr, ":", i2pcpPort, ": ", ex.what ());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -367,8 +472,6 @@ namespace util
|
|||||||
LogPrint(eLogInfo, "Daemon: Shutting down");
|
LogPrint(eLogInfo, "Daemon: Shutting down");
|
||||||
LogPrint(eLogInfo, "Daemon: Stopping Client");
|
LogPrint(eLogInfo, "Daemon: Stopping Client");
|
||||||
i2p::client::context.Stop();
|
i2p::client::context.Stop();
|
||||||
LogPrint(eLogInfo, "Daemon: Stopping Router context");
|
|
||||||
i2p::context.Stop();
|
|
||||||
LogPrint(eLogInfo, "Daemon: Stopping Tunnels");
|
LogPrint(eLogInfo, "Daemon: Stopping Tunnels");
|
||||||
i2p::tunnel::tunnels.Stop();
|
i2p::tunnel::tunnels.Stop();
|
||||||
|
|
||||||
@@ -393,12 +496,14 @@ namespace util
|
|||||||
d.httpServer->Stop();
|
d.httpServer->Stop();
|
||||||
d.httpServer = nullptr;
|
d.httpServer = nullptr;
|
||||||
}
|
}
|
||||||
|
#ifdef WITH_I2PC
|
||||||
if (d.m_I2PControlService)
|
if (d.m_I2PControlService)
|
||||||
{
|
{
|
||||||
LogPrint(eLogInfo, "Daemon: Stopping I2PControl");
|
LogPrint(eLogInfo, "Daemon: Stopping I2PControl");
|
||||||
d.m_I2PControlService->Stop ();
|
d.m_I2PControlService->Stop ();
|
||||||
d.m_I2PControlService = nullptr;
|
d.m_I2PControlService = nullptr;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
i2p::crypto::TerminateCrypto ();
|
i2p::crypto::TerminateCrypto ();
|
||||||
i2p::log::Logger().Stop();
|
i2p::log::Logger().Stop();
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2023, The PurpleI2P Project
|
* Copyright (c) 2013-2022, The PurpleI2P Project
|
||||||
*
|
*
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
* This file is part of Purple i2pd project and licensed under BSD3
|
||||||
*
|
*
|
||||||
@@ -68,9 +68,13 @@ namespace http {
|
|||||||
const char HTTP_PAGE_TRANSPORTS[] = "transports";
|
const char HTTP_PAGE_TRANSPORTS[] = "transports";
|
||||||
const char HTTP_PAGE_LOCAL_DESTINATIONS[] = "local_destinations";
|
const char HTTP_PAGE_LOCAL_DESTINATIONS[] = "local_destinations";
|
||||||
const char HTTP_PAGE_LOCAL_DESTINATION[] = "local_destination";
|
const char HTTP_PAGE_LOCAL_DESTINATION[] = "local_destination";
|
||||||
|
#ifdef WITH_I2CP
|
||||||
const char HTTP_PAGE_I2CP_LOCAL_DESTINATION[] = "i2cp_local_destination";
|
const char HTTP_PAGE_I2CP_LOCAL_DESTINATION[] = "i2cp_local_destination";
|
||||||
|
#endif
|
||||||
|
#ifdef WITH_SAM
|
||||||
const char HTTP_PAGE_SAM_SESSIONS[] = "sam_sessions";
|
const char HTTP_PAGE_SAM_SESSIONS[] = "sam_sessions";
|
||||||
const char HTTP_PAGE_SAM_SESSION[] = "sam_session";
|
const char HTTP_PAGE_SAM_SESSION[] = "sam_session";
|
||||||
|
#endif
|
||||||
const char HTTP_PAGE_I2P_TUNNELS[] = "i2p_tunnels";
|
const char HTTP_PAGE_I2P_TUNNELS[] = "i2p_tunnels";
|
||||||
const char HTTP_PAGE_COMMANDS[] = "commands";
|
const char HTTP_PAGE_COMMANDS[] = "commands";
|
||||||
const char HTTP_PAGE_LEASESETS[] = "leasesets";
|
const char HTTP_PAGE_LEASESETS[] = "leasesets";
|
||||||
@@ -80,14 +84,17 @@ namespace http {
|
|||||||
const char HTTP_COMMAND_SHUTDOWN_CANCEL[] = "shutdown_cancel";
|
const char HTTP_COMMAND_SHUTDOWN_CANCEL[] = "shutdown_cancel";
|
||||||
const char HTTP_COMMAND_SHUTDOWN_NOW[] = "terminate";
|
const char HTTP_COMMAND_SHUTDOWN_NOW[] = "terminate";
|
||||||
const char HTTP_COMMAND_RUN_PEER_TEST[] = "run_peer_test";
|
const char HTTP_COMMAND_RUN_PEER_TEST[] = "run_peer_test";
|
||||||
const char HTTP_COMMAND_RELOAD_TUNNELS_CONFIG[] = "reload_tunnels_config";
|
const char HTTP_COMMAND_RELOAD_CONFIG[] = "reload_config";
|
||||||
const char HTTP_COMMAND_LOGLEVEL[] = "set_loglevel";
|
const char HTTP_COMMAND_LOGLEVEL[] = "set_loglevel";
|
||||||
const char HTTP_COMMAND_KILLSTREAM[] = "closestream";
|
const char HTTP_COMMAND_KILLSTREAM[] = "closestream";
|
||||||
const char HTTP_COMMAND_LIMITTRANSIT[] = "limittransit";
|
const char HTTP_COMMAND_LIMITTRANSIT[] = "limittransit";
|
||||||
const char HTTP_COMMAND_GET_REG_STRING[] = "get_reg_string";
|
const char HTTP_COMMAND_GET_REG_STRING[] = "get_reg_string";
|
||||||
const char HTTP_COMMAND_SETLANGUAGE[] = "setlanguage";
|
const char HTTP_COMMAND_SETLANGUAGE[] = "setlanguage";
|
||||||
const char HTTP_COMMAND_RELOAD_CSS[] = "reload_css";
|
const char HTTP_COMMAND_RELOAD_CSS[] = "reload_css";
|
||||||
const char HTTP_COMMAND_EXPIRELEASE[] = "expirelease";
|
#ifdef WITH_SAM
|
||||||
|
const char HTTP_PARAM_SAM_SESSION_ID[] = "id";
|
||||||
|
#endif
|
||||||
|
const char HTTP_PARAM_ADDRESS[] = "address";
|
||||||
|
|
||||||
static std::string ConvertTime (uint64_t time)
|
static std::string ConvertTime (uint64_t time)
|
||||||
{
|
{
|
||||||
@@ -104,18 +111,18 @@ namespace http {
|
|||||||
int num;
|
int num;
|
||||||
|
|
||||||
if ((num = seconds / 86400) > 0) {
|
if ((num = seconds / 86400) > 0) {
|
||||||
s << ntr("%d day", "%d days", num, num) << ", ";
|
s << num << " " << tr("day", "days", num) << ", ";
|
||||||
seconds -= num * 86400;
|
seconds -= num * 86400;
|
||||||
}
|
}
|
||||||
if ((num = seconds / 3600) > 0) {
|
if ((num = seconds / 3600) > 0) {
|
||||||
s << ntr("%d hour", "%d hours", num, num) << ", ";
|
s << num << " " << tr("hour", "hours", num) << ", ";
|
||||||
seconds -= num * 3600;
|
seconds -= num * 3600;
|
||||||
}
|
}
|
||||||
if ((num = seconds / 60) > 0) {
|
if ((num = seconds / 60) > 0) {
|
||||||
s << ntr("%d minute", "%d minutes", num, num) << ", ";
|
s << num << " " << tr("minute", "minutes", num) << ", ";
|
||||||
seconds -= num * 60;
|
seconds -= num * 60;
|
||||||
}
|
}
|
||||||
s << ntr("%d second", "%d seconds", seconds, seconds);
|
s << seconds << " " << tr("second", "seconds", seconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ShowTraffic (std::stringstream& s, uint64_t bytes)
|
static void ShowTraffic (std::stringstream& s, uint64_t bytes)
|
||||||
@@ -123,11 +130,11 @@ namespace http {
|
|||||||
s << std::fixed << std::setprecision(2);
|
s << std::fixed << std::setprecision(2);
|
||||||
auto numKBytes = (double) bytes / 1024;
|
auto numKBytes = (double) bytes / 1024;
|
||||||
if (numKBytes < 1024)
|
if (numKBytes < 1024)
|
||||||
s << tr(/* tr: Kibibyte */ "%.2f KiB", numKBytes);
|
s << numKBytes << " " << tr(/* tr: Kibibit */ "KiB");
|
||||||
else if (numKBytes < 1024 * 1024)
|
else if (numKBytes < 1024 * 1024)
|
||||||
s << tr(/* tr: Mebibyte */ "%.2f MiB", numKBytes / 1024);
|
s << numKBytes / 1024 << " " << tr(/* tr: Mebibit */ "MiB");
|
||||||
else
|
else
|
||||||
s << tr(/* tr: Gibibyte */ "%.2f GiB", numKBytes / 1024 / 1024);
|
s << numKBytes / 1024 / 1024 << " " << tr(/* tr: Gibibit */ "GiB");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ShowTunnelDetails (std::stringstream& s, enum i2p::tunnel::TunnelState eState, bool explr, int bytes)
|
static void ShowTunnelDetails (std::stringstream& s, enum i2p::tunnel::TunnelState eState, bool explr, int bytes)
|
||||||
@@ -151,13 +158,12 @@ namespace http {
|
|||||||
else stateText = tr("unknown");
|
else stateText = tr("unknown");
|
||||||
|
|
||||||
s << "<span class=\"tunnel " << state << "\"> " << stateText << ((explr) ? " (" + tr("exploratory") + ")" : "") << "</span>, ";
|
s << "<span class=\"tunnel " << state << "\"> " << stateText << ((explr) ? " (" + tr("exploratory") + ")" : "") << "</span>, ";
|
||||||
ShowTraffic(s, bytes);
|
s << " " << (int) (bytes / 1024) << " " << tr(/* tr: Kibibit */ "KiB") << "\r\n";
|
||||||
s << "\r\n";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SetLogLevel (const std::string& level)
|
static void SetLogLevel (const std::string& level)
|
||||||
{
|
{
|
||||||
if (level == "none" || level == "critical" || level == "error" || level == "warn" || level == "info" || level == "debug")
|
if (level == "none" || level == "error" || level == "warn" || level == "info" || level == "debug")
|
||||||
i2p::log::Logger().SetLogLevel(level);
|
i2p::log::Logger().SetLogLevel(level);
|
||||||
else {
|
else {
|
||||||
LogPrint(eLogError, "HTTPServer: Unknown loglevel set attempted");
|
LogPrint(eLogError, "HTTPServer: Unknown loglevel set attempted");
|
||||||
@@ -182,7 +188,7 @@ namespace http {
|
|||||||
" <meta charset=\"UTF-8\">\r\n"
|
" <meta charset=\"UTF-8\">\r\n"
|
||||||
" <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n"
|
" <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n"
|
||||||
" <link rel=\"shortcut icon\" href=\"" << itoopieFavicon << "\">\r\n"
|
" <link rel=\"shortcut icon\" href=\"" << itoopieFavicon << "\">\r\n"
|
||||||
" <title>" << tr(/* tr: Webconsole page title */ "Purple I2P Webconsole") << "</title>\r\n";
|
" <title>Purple I2P Webconsole</title>\r\n";
|
||||||
GetStyles(s);
|
GetStyles(s);
|
||||||
s <<
|
s <<
|
||||||
"</head>\r\n"
|
"</head>\r\n"
|
||||||
@@ -200,10 +206,12 @@ namespace http {
|
|||||||
if (i2p::context.AcceptsTunnels () || i2p::tunnel::tunnels.CountTransitTunnels())
|
if (i2p::context.AcceptsTunnels () || i2p::tunnel::tunnels.CountTransitTunnels())
|
||||||
s << " <a href=\"" << webroot << "?page=" << HTTP_PAGE_TRANSIT_TUNNELS << "\">" << tr("Transit Tunnels") << "</a><br>\r\n";
|
s << " <a href=\"" << webroot << "?page=" << HTTP_PAGE_TRANSIT_TUNNELS << "\">" << tr("Transit Tunnels") << "</a><br>\r\n";
|
||||||
s <<
|
s <<
|
||||||
" <a href=\"" << webroot << "?page=" << HTTP_PAGE_TRANSPORTS << "\">" << tr("Transports") << "</a><br>\r\n"
|
" <a href=\"" << webroot << "?page=" << HTTP_PAGE_TRANSPORTS << "\">" << tr ("Transports") << "</a><br>\r\n"
|
||||||
" <a href=\"" << webroot << "?page=" << HTTP_PAGE_I2P_TUNNELS << "\">" << tr("I2P tunnels") << "</a><br>\r\n";
|
" <a href=\"" << webroot << "?page=" << HTTP_PAGE_I2P_TUNNELS << "\">" << tr("I2P tunnels") << "</a><br>\r\n";
|
||||||
|
#ifdef WITH_SAM
|
||||||
if (i2p::client::context.GetSAMBridge ())
|
if (i2p::client::context.GetSAMBridge ())
|
||||||
s << " <a href=\"" << webroot << "?page=" << HTTP_PAGE_SAM_SESSIONS << "\">" << tr("SAM sessions") << "</a><br>\r\n";
|
s << " <a href=\"" << webroot << "?page=" << HTTP_PAGE_SAM_SESSIONS << "\">" << tr("SAM sessions") << "</a><br>\r\n";
|
||||||
|
#endif
|
||||||
s <<
|
s <<
|
||||||
"</div>\r\n"
|
"</div>\r\n"
|
||||||
"<div class=\"content\">";
|
"<div class=\"content\">";
|
||||||
@@ -222,40 +230,35 @@ namespace http {
|
|||||||
s << "<b>" << tr("ERROR") << ":</b> " << string << "<br>\r\n";
|
s << "<b>" << tr("ERROR") << ":</b> " << string << "<br>\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ShowNetworkStatus (std::stringstream& s, RouterStatus status, bool testing, RouterError error)
|
static void ShowNetworkStatus (std::stringstream& s, RouterStatus status)
|
||||||
{
|
{
|
||||||
switch (status)
|
switch (status)
|
||||||
{
|
{
|
||||||
case eRouterStatusOK: s << tr("OK"); break;
|
case eRouterStatusOK: s << tr("OK"); break;
|
||||||
|
case eRouterStatusTesting: s << tr("Testing"); break;
|
||||||
case eRouterStatusFirewalled: s << tr("Firewalled"); break;
|
case eRouterStatusFirewalled: s << tr("Firewalled"); break;
|
||||||
case eRouterStatusUnknown: s << tr("Unknown"); break;
|
case eRouterStatusUnknown: s << tr("Unknown"); break;
|
||||||
case eRouterStatusProxy: s << tr("Proxy"); break;
|
case eRouterStatusProxy: s << tr("Proxy"); break;
|
||||||
case eRouterStatusMesh: s << tr("Mesh"); break;
|
case eRouterStatusMesh: s << tr("Mesh"); break;
|
||||||
default: s << tr("Unknown");
|
case eRouterStatusError:
|
||||||
}
|
|
||||||
if (testing)
|
|
||||||
s << " (" << tr("Testing") << ")";
|
|
||||||
if (error != eRouterErrorNone)
|
|
||||||
{
|
|
||||||
switch (error)
|
|
||||||
{
|
{
|
||||||
case eRouterErrorClockSkew:
|
s << tr("Error");
|
||||||
s << " - " << tr("Clock skew");
|
switch (i2p::context.GetError ())
|
||||||
|
{
|
||||||
|
case eRouterErrorClockSkew:
|
||||||
|
s << " - " << tr("Clock skew");
|
||||||
|
break;
|
||||||
|
case eRouterErrorOffline:
|
||||||
|
s << " - " << tr("Offline");
|
||||||
|
break;
|
||||||
|
case eRouterErrorSymmetricNAT:
|
||||||
|
s << " - " << tr("Symmetric NAT");
|
||||||
|
break;
|
||||||
|
default: ;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case eRouterErrorOffline:
|
|
||||||
s << " - " << tr("Offline");
|
|
||||||
break;
|
|
||||||
case eRouterErrorSymmetricNAT:
|
|
||||||
s << " - " << tr("Symmetric NAT");
|
|
||||||
break;
|
|
||||||
case eRouterErrorFullConeNAT:
|
|
||||||
s << " - " << tr("Full cone NAT");
|
|
||||||
break;
|
|
||||||
case eRouterErrorNoDescriptors:
|
|
||||||
s << " - " << tr("No Descriptors");
|
|
||||||
break;
|
|
||||||
default: ;
|
|
||||||
}
|
}
|
||||||
|
default: s << tr("Unknown");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -265,12 +268,12 @@ namespace http {
|
|||||||
ShowUptime(s, i2p::context.GetUptime ());
|
ShowUptime(s, i2p::context.GetUptime ());
|
||||||
s << "<br>\r\n";
|
s << "<br>\r\n";
|
||||||
s << "<b>" << tr("Network status") << ":</b> ";
|
s << "<b>" << tr("Network status") << ":</b> ";
|
||||||
ShowNetworkStatus (s, i2p::context.GetStatus (), i2p::context.GetTesting(), i2p::context.GetError ());
|
ShowNetworkStatus (s, i2p::context.GetStatus ());
|
||||||
s << "<br>\r\n";
|
s << "<br>\r\n";
|
||||||
if (i2p::context.SupportsV6 ())
|
if (i2p::context.SupportsV6 ())
|
||||||
{
|
{
|
||||||
s << "<b>" << tr("Network status v6") << ":</b> ";
|
s << "<b>" << tr("Network status v6") << ":</b> ";
|
||||||
ShowNetworkStatus (s, i2p::context.GetStatusV6 (), i2p::context.GetTestingV6(), i2p::context.GetErrorV6 ());
|
ShowNetworkStatus (s, i2p::context.GetStatusV6 ());
|
||||||
s << "<br>\r\n";
|
s << "<br>\r\n";
|
||||||
}
|
}
|
||||||
#if ((!defined(WIN32) && !defined(QT_GUI_LIB) && !defined(ANDROID)) || defined(ANDROID_BINARY))
|
#if ((!defined(WIN32) && !defined(QT_GUI_LIB) && !defined(ANDROID)) || defined(ANDROID_BINARY))
|
||||||
@@ -291,69 +294,60 @@ namespace http {
|
|||||||
if (family.length () > 0)
|
if (family.length () > 0)
|
||||||
s << "<b>"<< tr("Family") << ":</b> " << family << "<br>\r\n";
|
s << "<b>"<< tr("Family") << ":</b> " << family << "<br>\r\n";
|
||||||
s << "<b>" << tr("Tunnel creation success rate") << ":</b> " << i2p::tunnel::tunnels.GetTunnelCreationSuccessRate () << "%<br>\r\n";
|
s << "<b>" << tr("Tunnel creation success rate") << ":</b> " << i2p::tunnel::tunnels.GetTunnelCreationSuccessRate () << "%<br>\r\n";
|
||||||
bool isTotalTCSR;
|
|
||||||
i2p::config::GetOption("http.showTotalTCSR", isTotalTCSR);
|
|
||||||
if (isTotalTCSR) {
|
|
||||||
s << "<b>" << tr("Total tunnel creation success rate") << ":</b> " << i2p::tunnel::tunnels.GetTotalTunnelCreationSuccessRate() << "%<br/>\r\n";
|
|
||||||
}
|
|
||||||
s << "<b>" << tr("Received") << ":</b> ";
|
s << "<b>" << tr("Received") << ":</b> ";
|
||||||
ShowTraffic (s, i2p::transport::transports.GetTotalReceivedBytes ());
|
ShowTraffic (s, i2p::transport::transports.GetTotalReceivedBytes ());
|
||||||
s << " (" << tr(/* tr: Kibibyte/s */ "%.2f KiB/s", (double) i2p::transport::transports.GetInBandwidth15s () / 1024) << ")<br>\r\n";
|
s << " (" << (double) i2p::transport::transports.GetInBandwidth () / 1024 << " " << tr(/* tr: Kibibit/s */ "KiB/s") << ")<br>\r\n";
|
||||||
s << "<b>" << tr("Sent") << ":</b> ";
|
s << "<b>" << tr("Sent") << ":</b> ";
|
||||||
ShowTraffic (s, i2p::transport::transports.GetTotalSentBytes ());
|
ShowTraffic (s, i2p::transport::transports.GetTotalSentBytes ());
|
||||||
s << " (" << tr(/* tr: Kibibyte/s */ "%.2f KiB/s", (double) i2p::transport::transports.GetOutBandwidth15s () / 1024) << ")<br>\r\n";
|
s << " (" << (double) i2p::transport::transports.GetOutBandwidth () / 1024 << " " << tr(/* tr: Kibibit/s */ "KiB/s") << ")<br>\r\n";
|
||||||
s << "<b>" << tr("Transit") << ":</b> ";
|
s << "<b>" << tr("Transit") << ":</b> ";
|
||||||
ShowTraffic (s, i2p::transport::transports.GetTotalTransitTransmittedBytes ());
|
ShowTraffic (s, i2p::transport::transports.GetTotalTransitTransmittedBytes ());
|
||||||
s << " (" << tr(/* tr: Kibibyte/s */ "%.2f KiB/s", (double) i2p::transport::transports.GetTransitBandwidth15s () / 1024) << ")<br>\r\n";
|
s << " (" << (double) i2p::transport::transports.GetTransitBandwidth () / 1024 << " " << tr(/* tr: Kibibit/s */ "KiB/s") << ")<br>\r\n";
|
||||||
s << "<b>" << tr("Data path") << ":</b> " << i2p::fs::GetUTF8DataDir() << "<br>\r\n";
|
s << "<b>" << tr("Data path") << ":</b> " << i2p::fs::GetUTF8DataDir() << "<br>\r\n";
|
||||||
s << "<div class='slide'>";
|
s << "<div class='slide'>";
|
||||||
if ((outputFormat == OutputFormatEnum::forWebConsole) || !includeHiddenContent) {
|
if ((outputFormat == OutputFormatEnum::forWebConsole) || !includeHiddenContent) {
|
||||||
s << "<label for=\"slide-info\">" << tr("Hidden content. Press on text to see.") << "</label>\r\n<input type=\"checkbox\" id=\"slide-info\" />\r\n<div class=\"slidecontent\">\r\n";
|
s << "<label for=\"slide-info\">" << tr("Hidden content. Press on text to see.") << "</label>\r\n<input type=\"checkbox\" id=\"slide-info\" />\r\n<div class=\"slidecontent\">\r\n";
|
||||||
}
|
}
|
||||||
if (includeHiddenContent)
|
if (includeHiddenContent) {
|
||||||
{
|
|
||||||
s << "<b>" << tr("Router Ident") << ":</b> " << i2p::context.GetRouterInfo().GetIdentHashBase64() << "<br>\r\n";
|
s << "<b>" << tr("Router Ident") << ":</b> " << i2p::context.GetRouterInfo().GetIdentHashBase64() << "<br>\r\n";
|
||||||
if (!i2p::context.GetRouterInfo().GetProperty("family").empty())
|
if (!i2p::context.GetRouterInfo().GetProperty("family").empty())
|
||||||
s << "<b>" << tr("Router Family") << ":</b> " << i2p::context.GetRouterInfo().GetProperty("family") << "<br>\r\n";
|
s << "<b>" << tr("Router Family") << ":</b> " << i2p::context.GetRouterInfo().GetProperty("family") << "<br>\r\n";
|
||||||
s << "<b>" << tr("Router Caps") << ":</b> " << i2p::context.GetRouterInfo().GetProperty("caps") << "<br>\r\n";
|
s << "<b>" << tr("Router Caps") << ":</b> " << i2p::context.GetRouterInfo().GetProperty("caps") << "<br>\r\n";
|
||||||
s << "<b>" << tr("Version") << ":</b> " VERSION "<br>\r\n";
|
s << "<b>" << tr("Version") << ":</b> " VERSION "<br>\r\n";
|
||||||
s << "<b>"<< tr("Our external address") << ":</b>" << "<br>\r\n<table class=\"extaddr\"><tbody>\r\n";
|
s << "<b>"<< tr("Our external address") << ":</b>" << "<br>\r\n<table class=\"extaddr\"><tbody>\r\n";
|
||||||
auto addresses = i2p::context.GetRouterInfo().GetAddresses ();
|
for (const auto& address : i2p::context.GetRouterInfo().GetAddresses())
|
||||||
if (addresses)
|
|
||||||
{
|
{
|
||||||
for (const auto& address : *addresses)
|
s << "<tr>\r\n<td>";
|
||||||
|
switch (address->transportStyle)
|
||||||
{
|
{
|
||||||
if (!address) continue;
|
case i2p::data::RouterInfo::eTransportNTCP:
|
||||||
s << "<tr>\r\n<td>";
|
s << "NTCP2";
|
||||||
switch (address->transportStyle)
|
break;
|
||||||
{
|
case i2p::data::RouterInfo::eTransportSSU:
|
||||||
case i2p::data::RouterInfo::eTransportNTCP2:
|
s << "SSU";
|
||||||
s << "NTCP2";
|
break;
|
||||||
break;
|
case i2p::data::RouterInfo::eTransportSSU2:
|
||||||
case i2p::data::RouterInfo::eTransportSSU2:
|
s << "SSU2";
|
||||||
s << "SSU2";
|
break;
|
||||||
break;
|
default:
|
||||||
default:
|
s << tr("Unknown");
|
||||||
s << tr("Unknown");
|
|
||||||
}
|
|
||||||
bool v6 = address->IsV6 ();
|
|
||||||
if (v6)
|
|
||||||
{
|
|
||||||
if (address->IsV4 ()) s << "v4";
|
|
||||||
s << "v6";
|
|
||||||
}
|
|
||||||
s << "</td>\r\n";
|
|
||||||
if (address->published)
|
|
||||||
s << "<td>" << (v6 ? "[" : "") << address->host.to_string() << (v6 ? "]:" : ":") << address->port << "</td>\r\n";
|
|
||||||
else
|
|
||||||
{
|
|
||||||
s << "<td>" << tr(/* tr: Shown when router doesn't publish itself and have "Firewalled" state */ "supported");
|
|
||||||
if (address->port)
|
|
||||||
s << " :" << address->port;
|
|
||||||
s << "</td>\r\n";
|
|
||||||
}
|
|
||||||
s << "</tr>\r\n";
|
|
||||||
}
|
}
|
||||||
|
if (address->IsV6 ())
|
||||||
|
{
|
||||||
|
if (address->IsV4 ()) s << "v4";
|
||||||
|
s << "v6";
|
||||||
|
}
|
||||||
|
s << "</td>\r\n";
|
||||||
|
if (address->published)
|
||||||
|
s << "<td>" << address->host.to_string() << ":" << address->port << "</td>\r\n";
|
||||||
|
else
|
||||||
|
{
|
||||||
|
s << "<td>" << tr("supported");
|
||||||
|
if (address->port)
|
||||||
|
s << " :" << address->port;
|
||||||
|
s << "</td>\r\n";
|
||||||
|
}
|
||||||
|
s << "</tr>\r\n";
|
||||||
}
|
}
|
||||||
s << "</tbody></table>\r\n";
|
s << "</tbody></table>\r\n";
|
||||||
}
|
}
|
||||||
@@ -375,17 +369,25 @@ namespace http {
|
|||||||
if (outputFormat==OutputFormatEnum::forWebConsole) {
|
if (outputFormat==OutputFormatEnum::forWebConsole) {
|
||||||
bool httpproxy = i2p::client::context.GetHttpProxy () ? true : false;
|
bool httpproxy = i2p::client::context.GetHttpProxy () ? true : false;
|
||||||
bool socksproxy = i2p::client::context.GetSocksProxy () ? true : false;
|
bool socksproxy = i2p::client::context.GetSocksProxy () ? true : false;
|
||||||
bool bob = i2p::client::context.GetBOBCommandChannel () ? true : false;
|
|
||||||
bool sam = i2p::client::context.GetSAMBridge () ? true : false;
|
|
||||||
bool i2cp = i2p::client::context.GetI2CPServer () ? true : false;
|
|
||||||
bool i2pcontrol; i2p::config::GetOption("i2pcontrol.enabled", i2pcontrol);
|
|
||||||
s << "<table class=\"services\"><caption>" << tr("Services") << "</caption><tbody>\r\n";
|
s << "<table class=\"services\"><caption>" << tr("Services") << "</caption><tbody>\r\n";
|
||||||
s << "<tr><td>" << "HTTP " << tr("Proxy") << "</td><td class='" << (httpproxy ? "enabled" : "disabled") << "'>" << (httpproxy ? tr("Enabled") : tr("Disabled")) << "</td></tr>\r\n";
|
s << "<tr><td>" << "HTTP " << tr("Proxy") << "</td><td class='" << (httpproxy ? "enabled" : "disabled") << "'>" << (httpproxy ? tr("Enabled") : tr("Disabled")) << "</td></tr>\r\n";
|
||||||
s << "<tr><td>" << "SOCKS " << tr("Proxy") << "</td><td class='" << (socksproxy ? "enabled" : "disabled") << "'>" << (socksproxy ? tr("Enabled") : tr("Disabled")) << "</td></tr>\r\n";
|
s << "<tr><td>" << "SOCKS " << tr("Proxy") << "</td><td class='" << (socksproxy ? "enabled" : "disabled") << "'>" << (socksproxy ? tr("Enabled") : tr("Disabled")) << "</td></tr>\r\n";
|
||||||
|
#ifdef WITH_BOB
|
||||||
|
bool bob = i2p::client::context.GetBOBCommandChannel () ? true : false;
|
||||||
s << "<tr><td>" << "BOB" << "</td><td class='" << (bob ? "enabled" : "disabled") << "'>" << (bob ? tr("Enabled") : tr("Disabled")) << "</td></tr>\r\n";
|
s << "<tr><td>" << "BOB" << "</td><td class='" << (bob ? "enabled" : "disabled") << "'>" << (bob ? tr("Enabled") : tr("Disabled")) << "</td></tr>\r\n";
|
||||||
|
#endif
|
||||||
|
#ifdef WITH_SAM
|
||||||
|
bool sam = i2p::client::context.GetSAMBridge () ? true : false;
|
||||||
s << "<tr><td>" << "SAM" << "</td><td class='" << (sam ? "enabled" : "disabled") << "'>" << (sam ? tr("Enabled") : tr("Disabled")) << "</td></tr>\r\n";
|
s << "<tr><td>" << "SAM" << "</td><td class='" << (sam ? "enabled" : "disabled") << "'>" << (sam ? tr("Enabled") : tr("Disabled")) << "</td></tr>\r\n";
|
||||||
|
#endif
|
||||||
|
#ifdef WITH_I2CP
|
||||||
|
bool i2cp = i2p::client::context.GetI2CPServer () ? true : false;
|
||||||
s << "<tr><td>" << "I2CP" << "</td><td class='" << (i2cp ? "enabled" : "disabled") << "'>" << (i2cp ? tr("Enabled") : tr("Disabled")) << "</td></tr>\r\n";
|
s << "<tr><td>" << "I2CP" << "</td><td class='" << (i2cp ? "enabled" : "disabled") << "'>" << (i2cp ? tr("Enabled") : tr("Disabled")) << "</td></tr>\r\n";
|
||||||
|
#endif
|
||||||
|
#ifdef WITH_I2PC
|
||||||
|
bool i2pcontrol; i2p::config::GetOption("i2pcontrol.enabled", i2pcontrol);
|
||||||
s << "<tr><td>" << "I2PControl" << "</td><td class='" << (i2pcontrol ? "enabled" : "disabled") << "'>" << (i2pcontrol ? tr("Enabled") : tr("Disabled")) << "</td></tr>\r\n";
|
s << "<tr><td>" << "I2PControl" << "</td><td class='" << (i2pcontrol ? "enabled" : "disabled") << "'>" << (i2pcontrol ? tr("Enabled") : tr("Disabled")) << "</td></tr>\r\n";
|
||||||
|
#endif
|
||||||
s << "</tbody></table>\r\n";
|
s << "</tbody></table>\r\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -402,6 +404,7 @@ namespace http {
|
|||||||
}
|
}
|
||||||
s << "</div>\r\n";
|
s << "</div>\r\n";
|
||||||
|
|
||||||
|
#ifdef WITH_I2CP
|
||||||
auto i2cpServer = i2p::client::context.GetI2CPServer ();
|
auto i2cpServer = i2p::client::context.GetI2CPServer ();
|
||||||
if (i2cpServer && !(i2cpServer->GetSessions ().empty ()))
|
if (i2cpServer && !(i2cpServer->GetSessions ().empty ()))
|
||||||
{
|
{
|
||||||
@@ -419,16 +422,13 @@ namespace http {
|
|||||||
}
|
}
|
||||||
s << "</div>\r\n";
|
s << "</div>\r\n";
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ShowLeaseSetDestination (std::stringstream& s, std::shared_ptr<const i2p::client::LeaseSetDestination> dest, uint32_t token)
|
static void ShowLeaseSetDestination (std::stringstream& s, std::shared_ptr<const i2p::client::LeaseSetDestination> dest, uint32_t token)
|
||||||
{
|
{
|
||||||
s << "<b>Base32:</b><br>\r\n<textarea readonly cols=\"80\" rows=\"1\">";
|
|
||||||
s << dest->GetIdentHash ().ToBase32 () << "</textarea><br>\r\n<br>\r\n";
|
|
||||||
|
|
||||||
s << "<b>Base64:</b><br>\r\n<textarea readonly cols=\"80\" rows=\"8\">";
|
s << "<b>Base64:</b><br>\r\n<textarea readonly cols=\"80\" rows=\"8\">";
|
||||||
s << dest->GetIdentity ()->ToBase64 () << "</textarea><br>\r\n<br>\r\n";
|
s << dest->GetIdentity ()->ToBase64 () << "</textarea><br>\r\n<br>\r\n";
|
||||||
|
|
||||||
if (dest->IsEncryptedLeaseSet ())
|
if (dest->IsEncryptedLeaseSet ())
|
||||||
{
|
{
|
||||||
i2p::data::BlindedPublicKey blinded (dest->GetIdentity (), dest->IsPerClientAuth ());
|
i2p::data::BlindedPublicKey blinded (dest->GetIdentity (), dest->IsPerClientAuth ());
|
||||||
@@ -437,14 +437,15 @@ namespace http {
|
|||||||
s << "</div>\r\n</div>\r\n";
|
s << "</div>\r\n</div>\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dest->IsPublic() && token && !dest->IsEncryptedLeaseSet ())
|
if (dest->IsPublic() && token)
|
||||||
{
|
{
|
||||||
std::string webroot; i2p::config::GetOption("http.webroot", webroot);
|
std::string webroot; i2p::config::GetOption("http.webroot", webroot);
|
||||||
|
auto base32 = dest->GetIdentHash ().ToBase32 ();
|
||||||
s << "<div class='slide'><label for='slide-regaddr'><b>" << tr("Address registration line") << "</b></label>\r\n<input type=\"checkbox\" id=\"slide-regaddr\" />\r\n<div class=\"slidecontent\">\r\n"
|
s << "<div class='slide'><label for='slide-regaddr'><b>" << tr("Address registration line") << "</b></label>\r\n<input type=\"checkbox\" id=\"slide-regaddr\" />\r\n<div class=\"slidecontent\">\r\n"
|
||||||
"<form method=\"get\" action=\"" << webroot << "\">\r\n"
|
"<form method=\"get\" action=\"" << webroot << "\">\r\n"
|
||||||
" <input type=\"hidden\" name=\"cmd\" value=\"" << HTTP_COMMAND_GET_REG_STRING << "\">\r\n"
|
" <input type=\"hidden\" name=\"cmd\" value=\"" << HTTP_COMMAND_GET_REG_STRING << "\">\r\n"
|
||||||
" <input type=\"hidden\" name=\"token\" value=\"" << token << "\">\r\n"
|
" <input type=\"hidden\" name=\"token\" value=\"" << token << "\">\r\n"
|
||||||
" <input type=\"hidden\" name=\"b32\" value=\"" << dest->GetIdentHash ().ToBase32 () << "\">\r\n"
|
" <input type=\"hidden\" name=\"b32\" value=\"" << base32 << "\">\r\n"
|
||||||
" <b>" << tr("Domain") << ":</b>\r\n<input type=\"text\" maxlength=\"67\" name=\"name\" placeholder=\"domain.i2p\" required>\r\n"
|
" <b>" << tr("Domain") << ":</b>\r\n<input type=\"text\" maxlength=\"67\" name=\"name\" placeholder=\"domain.i2p\" required>\r\n"
|
||||||
" <button type=\"submit\">" << tr("Generate") << "</button>\r\n"
|
" <button type=\"submit\">" << tr("Generate") << "</button>\r\n"
|
||||||
"</form>\r\n<small>" << tr("<b>Note:</b> result string can be used only for registering 2LD domains (example.i2p). For registering subdomains please use i2pd-tools.") << "</small>\r\n</div>\r\n</div>\r\n<br>\r\n";
|
"</form>\r\n<small>" << tr("<b>Note:</b> result string can be used only for registering 2LD domains (example.i2p). For registering subdomains please use i2pd-tools.") << "</small>\r\n</div>\r\n</div>\r\n<br>\r\n";
|
||||||
@@ -453,23 +454,9 @@ namespace http {
|
|||||||
if (dest->GetNumRemoteLeaseSets())
|
if (dest->GetNumRemoteLeaseSets())
|
||||||
{
|
{
|
||||||
s << "<div class='slide'><label for='slide-lease'><b>" << tr("LeaseSets") << ":</b> <i>" << dest->GetNumRemoteLeaseSets ()
|
s << "<div class='slide'><label for='slide-lease'><b>" << tr("LeaseSets") << ":</b> <i>" << dest->GetNumRemoteLeaseSets ()
|
||||||
<< "</i></label>\r\n<input type=\"checkbox\" id=\"slide-lease\" />\r\n<div class=\"slidecontent\">\r\n"
|
<< "</i></label>\r\n<input type=\"checkbox\" id=\"slide-lease\" />\r\n<div class=\"slidecontent\">\r\n<table><thead><th>"<< tr("Address") << "</th><th>" << tr("Type") << "</th><th>" << tr("EncType") << "</th></thead><tbody class=\"tableitem\">";
|
||||||
<< "<table><thead>"
|
|
||||||
<< "<th>" << tr("Address") << "</th>"
|
|
||||||
<< "<th style=\"width:5px;\"> </th>" // LeaseSet expiration button column
|
|
||||||
<< "<th>" << tr("Type") << "</th>"
|
|
||||||
<< "<th>" << tr("EncType") << "</th>"
|
|
||||||
<< "</thead><tbody class=\"tableitem\">";
|
|
||||||
for(auto& it: dest->GetLeaseSets ())
|
for(auto& it: dest->GetLeaseSets ())
|
||||||
{
|
s << "<tr><td>" << it.first.ToBase32 () << "</td><td>" << (int)it.second->GetStoreType () << "</td><td>" << (int)it.second->GetEncryptionType () <<"</td></tr>\r\n";
|
||||||
s << "<tr>"
|
|
||||||
<< "<td>" << it.first.ToBase32 () << "</td>"
|
|
||||||
<< "<td><a class=\"button\" href=\"/?cmd=" << HTTP_COMMAND_EXPIRELEASE<< "&b32=" << dest->GetIdentHash ().ToBase32 ()
|
|
||||||
<< "&lease=" << it.first.ToBase32 () << "&token=" << token << "\" title=\"" << tr("Expire LeaseSet") << "\"> ✘ </a></td>"
|
|
||||||
<< "<td>" << (int)it.second->GetStoreType () << "</td>"
|
|
||||||
<< "<td>" << (int)it.second->GetEncryptionType () <<"</td>"
|
|
||||||
<< "</tr>\r\n";
|
|
||||||
}
|
|
||||||
s << "</tbody></table>\r\n</div>\r\n</div>\r\n<br>\r\n";
|
s << "</tbody></table>\r\n</div>\r\n</div>\r\n<br>\r\n";
|
||||||
} else
|
} else
|
||||||
s << "<b>" << tr("LeaseSets") << ":</b> <i>0</i><br>\r\n<br>\r\n";
|
s << "<b>" << tr("LeaseSets") << ":</b> <i>0</i><br>\r\n<br>\r\n";
|
||||||
@@ -492,7 +479,7 @@ namespace http {
|
|||||||
}
|
}
|
||||||
s << "⇒ " << it->GetTunnelID () << ":me";
|
s << "⇒ " << it->GetTunnelID () << ":me";
|
||||||
if (it->LatencyIsKnown())
|
if (it->LatencyIsKnown())
|
||||||
s << " ( " << tr(/* tr: Milliseconds */ "%dms", it->GetMeanLatency()) << " )";
|
s << " ( " << it->GetMeanLatency() << tr(/* tr: Milliseconds */ "ms") << " )";
|
||||||
ShowTunnelDetails(s, it->GetState (), false, it->GetNumReceivedBytes ());
|
ShowTunnelDetails(s, it->GetState (), false, it->GetNumReceivedBytes ());
|
||||||
s << "</div>\r\n";
|
s << "</div>\r\n";
|
||||||
}
|
}
|
||||||
@@ -512,26 +499,22 @@ namespace http {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (it->LatencyIsKnown())
|
if (it->LatencyIsKnown())
|
||||||
s << " ( " << tr("%dms", it->GetMeanLatency()) << " )";
|
s << " ( " << it->GetMeanLatency() << tr("ms") << " )";
|
||||||
ShowTunnelDetails(s, it->GetState (), false, it->GetNumSentBytes ());
|
ShowTunnelDetails(s, it->GetState (), false, it->GetNumSentBytes ());
|
||||||
s << "</div>\r\n";
|
s << "</div>\r\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
s << "<br>\r\n";
|
s << "<br>\r\n";
|
||||||
|
|
||||||
s << "<b>" << tr("Tags") << "</b><br>\r\n"
|
s << "<b>" << tr("Tags") << "</b><br>\r\n" << tr("Incoming") << ": <i>" << dest->GetNumIncomingTags () << "</i><br>\r\n";
|
||||||
<< tr("Incoming") << ": <i>" << dest->GetNumIncomingTags () << "</i><br>\r\n";
|
|
||||||
if (!dest->GetSessions ().empty ()) {
|
if (!dest->GetSessions ().empty ()) {
|
||||||
std::stringstream tmp_s; uint32_t out_tags = 0;
|
std::stringstream tmp_s; uint32_t out_tags = 0;
|
||||||
for (const auto& it: dest->GetSessions ()) {
|
for (const auto& it: dest->GetSessions ()) {
|
||||||
tmp_s << "<tr><td>" << i2p::client::context.GetAddressBook ().ToAddress(it.first) << "</td><td>" << it.second->GetNumOutgoingTags () << "</td></tr>\r\n";
|
tmp_s << "<tr><td>" << i2p::client::context.GetAddressBook ().ToAddress(it.first) << "</td><td>" << it.second->GetNumOutgoingTags () << "</td></tr>\r\n";
|
||||||
out_tags += it.second->GetNumOutgoingTags ();
|
out_tags += it.second->GetNumOutgoingTags ();
|
||||||
}
|
}
|
||||||
s << "<div class='slide'><label for='slide-tags'>" << tr("Outgoing") << ": <i>" << out_tags << "</i></label>\r\n"
|
s << "<div class='slide'><label for='slide-tags'>" << tr("Outgoing") << ": <i>" << out_tags << "</i></label>\r\n<input type=\"checkbox\" id=\"slide-tags\" />\r\n"
|
||||||
<< "<input type=\"checkbox\" id=\"slide-tags\" />\r\n"
|
<< "<div class=\"slidecontent\">\r\n<table>\r\n<thead><th>" << tr("Destination") << "</th><th>" << tr("Amount") << "</th></thead>\r\n<tbody class=\"tableitem\">\r\n" << tmp_s.str () << "</tbody></table>\r\n</div>\r\n</div>\r\n";
|
||||||
<< "<div class=\"slidecontent\">\r\n"
|
|
||||||
<< "<table>\r\n<thead><th>" << tr("Destination") << "</th><th>" << tr("Amount") << "</th></thead>\r\n"
|
|
||||||
<< "<tbody class=\"tableitem\">\r\n" << tmp_s.str () << "</tbody></table>\r\n</div>\r\n</div>\r\n";
|
|
||||||
} else
|
} else
|
||||||
s << tr("Outgoing") << ": <i>0</i><br>\r\n";
|
s << tr("Outgoing") << ": <i>0</i><br>\r\n";
|
||||||
s << "<br>\r\n";
|
s << "<br>\r\n";
|
||||||
@@ -546,11 +529,8 @@ namespace http {
|
|||||||
tmp_s << "<tr><td>" << i2p::client::context.GetAddressBook ().ToAddress(it.second->GetDestination ()) << "</td><td>" << it.second->GetState () << "</td></tr>\r\n";
|
tmp_s << "<tr><td>" << i2p::client::context.GetAddressBook ().ToAddress(it.second->GetDestination ()) << "</td><td>" << it.second->GetState () << "</td></tr>\r\n";
|
||||||
ecies_sessions++;
|
ecies_sessions++;
|
||||||
}
|
}
|
||||||
s << "<div class='slide'><label for='slide-ecies-sessions'>" << tr("Tags sessions") << ": <i>" << ecies_sessions << "</i></label>\r\n"
|
s << "<div class='slide'><label for='slide-ecies-sessions'>" << tr("Tags sessions") << ": <i>" << ecies_sessions << "</i></label>\r\n<input type=\"checkbox\" id=\"slide-ecies-sessions\" />\r\n"
|
||||||
<< "<input type=\"checkbox\" id=\"slide-ecies-sessions\" />\r\n"
|
<< "<div class=\"slidecontent\">\r\n<table>\r\n<thead><th>" << tr("Destination") << "</th><th>" << tr("Status") << "</th></thead>\r\n<tbody class=\"tableitem\">\r\n" << tmp_s.str () << "</tbody></table>\r\n</div>\r\n</div>\r\n";
|
||||||
<< "<div class=\"slidecontent\">\r\n<table>\r\n"
|
|
||||||
<< "<thead><th>" << tr("Destination") << "</th><th>" << tr("Status") << "</th></thead>\r\n"
|
|
||||||
<< "<tbody class=\"tableitem\">\r\n" << tmp_s.str () << "</tbody></table>\r\n</div>\r\n</div>\r\n";
|
|
||||||
} else
|
} else
|
||||||
s << tr("Tags sessions") << ": <i>0</i><br>\r\n";
|
s << tr("Tags sessions") << ": <i>0</i><br>\r\n";
|
||||||
s << "<br>\r\n";
|
s << "<br>\r\n";
|
||||||
@@ -569,21 +549,19 @@ namespace http {
|
|||||||
ShowLeaseSetDestination (s, dest, token);
|
ShowLeaseSetDestination (s, dest, token);
|
||||||
|
|
||||||
// Print table with streams information
|
// Print table with streams information
|
||||||
s << "<table>\r\n<caption>"
|
s << "<table>\r\n<caption>" << tr("Streams") << "</caption>\r\n<thead>\r\n<tr>";
|
||||||
<< tr("Streams")
|
s << "<th style=\"width:25px;\">StreamID</th>";
|
||||||
<< "</caption>\r\n<thead>\r\n<tr>"
|
s << "<th style=\"width:5px;\" \\>"; // Stream closing button column
|
||||||
<< "<th style=\"width:25px;\">StreamID</th>"
|
s << "<th class=\"streamdest\">Destination</th>";
|
||||||
<< "<th style=\"width:5px;\"> </th>" // Stream closing button column
|
s << "<th>Sent</th>";
|
||||||
<< "<th class=\"streamdest\">Destination</th>"
|
s << "<th>Received</th>";
|
||||||
<< "<th>Sent</th>"
|
s << "<th>Out</th>";
|
||||||
<< "<th>Received</th>"
|
s << "<th>In</th>";
|
||||||
<< "<th>Out</th>"
|
s << "<th>Buf</th>";
|
||||||
<< "<th>In</th>"
|
s << "<th>RTT</th>";
|
||||||
<< "<th>Buf</th>"
|
s << "<th>Window</th>";
|
||||||
<< "<th>RTT</th>"
|
s << "<th>Status</th>";
|
||||||
<< "<th>Window</th>"
|
s << "</tr>\r\n</thead>\r\n<tbody class=\"tableitem\">\r\n";
|
||||||
<< "<th>Status</th>"
|
|
||||||
<< "</tr>\r\n</thead>\r\n<tbody class=\"tableitem\">\r\n";
|
|
||||||
|
|
||||||
for (const auto& it: dest->GetAllStreams ())
|
for (const auto& it: dest->GetAllStreams ())
|
||||||
{
|
{
|
||||||
@@ -610,10 +588,9 @@ namespace http {
|
|||||||
}
|
}
|
||||||
s << "</tbody>\r\n</table>";
|
s << "</tbody>\r\n</table>";
|
||||||
}
|
}
|
||||||
else
|
|
||||||
ShowError(s, tr("Such destination is not found"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WITH_I2CP
|
||||||
void ShowI2CPLocalDestination (std::stringstream& s, const std::string& id)
|
void ShowI2CPLocalDestination (std::stringstream& s, const std::string& id)
|
||||||
{
|
{
|
||||||
auto i2cpServer = i2p::client::context.GetI2CPServer ();
|
auto i2cpServer = i2p::client::context.GetI2CPServer ();
|
||||||
@@ -629,6 +606,7 @@ namespace http {
|
|||||||
else
|
else
|
||||||
ShowError(s, tr("I2CP is not enabled"));
|
ShowError(s, tr("I2CP is not enabled"));
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void ShowLeasesSets(std::stringstream& s)
|
void ShowLeasesSets(std::stringstream& s)
|
||||||
{
|
{
|
||||||
@@ -646,10 +624,7 @@ namespace http {
|
|||||||
if (storeType == i2p::data::NETDB_STORE_TYPE_LEASESET)
|
if (storeType == i2p::data::NETDB_STORE_TYPE_LEASESET)
|
||||||
ls.reset (new i2p::data::LeaseSet (leaseSet->GetBuffer(), leaseSet->GetBufferLen()));
|
ls.reset (new i2p::data::LeaseSet (leaseSet->GetBuffer(), leaseSet->GetBufferLen()));
|
||||||
else
|
else
|
||||||
{
|
ls.reset (new i2p::data::LeaseSet2 (storeType, leaseSet->GetBuffer(), leaseSet->GetBufferLen()));
|
||||||
ls.reset (new i2p::data::LeaseSet2 (storeType));
|
|
||||||
ls->Update (leaseSet->GetBuffer(), leaseSet->GetBufferLen(), false);
|
|
||||||
}
|
|
||||||
if (!ls) return;
|
if (!ls) return;
|
||||||
s << "<div class=\"leaseset listitem";
|
s << "<div class=\"leaseset listitem";
|
||||||
if (ls->IsExpired())
|
if (ls->IsExpired())
|
||||||
@@ -680,7 +655,7 @@ namespace http {
|
|||||||
}
|
}
|
||||||
else if (!i2p::context.IsFloodfill ())
|
else if (!i2p::context.IsFloodfill ())
|
||||||
{
|
{
|
||||||
s << "<b>" << tr("LeaseSets") << ":</b> " << tr(/* Message on LeaseSets page */ "floodfill mode is disabled") << ".<br>\r\n";
|
s << "<b>" << tr("LeaseSets") << ":</b> " << tr("not floodfill") << ".<br>\r\n";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -709,7 +684,7 @@ namespace http {
|
|||||||
}
|
}
|
||||||
s << "⇒ " << it->GetTunnelID () << ":me";
|
s << "⇒ " << it->GetTunnelID () << ":me";
|
||||||
if (it->LatencyIsKnown())
|
if (it->LatencyIsKnown())
|
||||||
s << " ( " << tr("%dms", it->GetMeanLatency()) << " )";
|
s << " ( " << it->GetMeanLatency() << tr("ms") << " )";
|
||||||
ShowTunnelDetails(s, it->GetState (), (it->GetTunnelPool () == ExplPool), it->GetNumReceivedBytes ());
|
ShowTunnelDetails(s, it->GetState (), (it->GetTunnelPool () == ExplPool), it->GetNumReceivedBytes ());
|
||||||
s << "</div>\r\n";
|
s << "</div>\r\n";
|
||||||
}
|
}
|
||||||
@@ -729,7 +704,7 @@ namespace http {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (it->LatencyIsKnown())
|
if (it->LatencyIsKnown())
|
||||||
s << " ( " << tr("%dms", it->GetMeanLatency()) << " )";
|
s << " ( " << it->GetMeanLatency() << tr("ms") << " )";
|
||||||
ShowTunnelDetails(s, it->GetState (), (it->GetTunnelPool () == ExplPool), it->GetNumSentBytes ());
|
ShowTunnelDetails(s, it->GetState (), (it->GetTunnelPool () == ExplPool), it->GetNumSentBytes ());
|
||||||
s << "</div>\r\n";
|
s << "</div>\r\n";
|
||||||
}
|
}
|
||||||
@@ -742,7 +717,8 @@ namespace http {
|
|||||||
|
|
||||||
s << "<b>" << tr("Router commands") << "</b><br>\r\n<br>\r\n<div class=\"commands\">\r\n";
|
s << "<b>" << tr("Router commands") << "</b><br>\r\n<br>\r\n<div class=\"commands\">\r\n";
|
||||||
s << " <a href=\"" << webroot << "?cmd=" << HTTP_COMMAND_RUN_PEER_TEST << "&token=" << token << "\">" << tr("Run peer test") << "</a><br>\r\n";
|
s << " <a href=\"" << webroot << "?cmd=" << HTTP_COMMAND_RUN_PEER_TEST << "&token=" << token << "\">" << tr("Run peer test") << "</a><br>\r\n";
|
||||||
s << " <a href=\"" << webroot << "?cmd=" << HTTP_COMMAND_RELOAD_TUNNELS_CONFIG << "&token=" << token << "\">" << tr("Reload tunnels configuration") << "</a><br>\r\n";
|
|
||||||
|
// s << " <a href=\"/?cmd=" << HTTP_COMMAND_RELOAD_CONFIG << "\">Reload config</a><br>\r\n";
|
||||||
|
|
||||||
if (i2p::context.AcceptsTunnels ())
|
if (i2p::context.AcceptsTunnels ())
|
||||||
s << " <a href=\"" << webroot << "?cmd=" << HTTP_COMMAND_DISABLE_TRANSIT << "&token=" << token << "\">" << tr("Decline transit tunnels") << "</a><br>\r\n";
|
s << " <a href=\"" << webroot << "?cmd=" << HTTP_COMMAND_DISABLE_TRANSIT << "&token=" << token << "\">" << tr("Decline transit tunnels") << "</a><br>\r\n";
|
||||||
@@ -767,43 +743,33 @@ namespace http {
|
|||||||
|
|
||||||
s << "<br>\r\n<small>" << tr("<b>Note:</b> any action done here are not persistent and not changes your config files.") << "</small>\r\n<br>\r\n";
|
s << "<br>\r\n<small>" << tr("<b>Note:</b> any action done here are not persistent and not changes your config files.") << "</small>\r\n<br>\r\n";
|
||||||
|
|
||||||
auto loglevel = i2p::log::Logger().GetLogLevel();
|
|
||||||
s << "<b>" << tr("Logging level") << "</b><br>\r\n";
|
s << "<b>" << tr("Logging level") << "</b><br>\r\n";
|
||||||
s << " <a class=\"button" << (loglevel == eLogNone ? " selected" : "") << "\" href=\"" << webroot << "?cmd=" << HTTP_COMMAND_LOGLEVEL << "&level=none&token=" << token << "\"> none </a> \r\n";
|
s << " <a class=\"button\" href=\"" << webroot << "?cmd=" << HTTP_COMMAND_LOGLEVEL << "&level=none&token=" << token << "\"> none </a> \r\n";
|
||||||
s << " <a class=\"button" << (loglevel == eLogCritical ? " selected" : "") << "\" href=\"" << webroot << "?cmd=" << HTTP_COMMAND_LOGLEVEL << "&level=critical&token=" << token << "\"> critical </a> \r\n";
|
s << " <a class=\"button\" href=\"" << webroot << "?cmd=" << HTTP_COMMAND_LOGLEVEL << "&level=error&token=" << token << "\"> error </a> \r\n";
|
||||||
s << " <a class=\"button" << (loglevel == eLogError ? " selected" : "") << "\" href=\"" << webroot << "?cmd=" << HTTP_COMMAND_LOGLEVEL << "&level=error&token=" << token << "\"> error </a> \r\n";
|
s << " <a class=\"button\" href=\"" << webroot << "?cmd=" << HTTP_COMMAND_LOGLEVEL << "&level=warn&token=" << token << "\"> warn </a> \r\n";
|
||||||
s << " <a class=\"button" << (loglevel == eLogWarning ? " selected" : "") << "\" href=\"" << webroot << "?cmd=" << HTTP_COMMAND_LOGLEVEL << "&level=warn&token=" << token << "\"> warn </a> \r\n";
|
s << " <a class=\"button\" href=\"" << webroot << "?cmd=" << HTTP_COMMAND_LOGLEVEL << "&level=info&token=" << token << "\"> info </a> \r\n";
|
||||||
s << " <a class=\"button" << (loglevel == eLogInfo ? " selected" : "") << "\" href=\"" << webroot << "?cmd=" << HTTP_COMMAND_LOGLEVEL << "&level=info&token=" << token << "\"> info </a> \r\n";
|
s << " <a class=\"button\" href=\"" << webroot << "?cmd=" << HTTP_COMMAND_LOGLEVEL << "&level=debug&token=" << token << "\"> debug </a><br>\r\n<br>\r\n";
|
||||||
s << " <a class=\"button" << (loglevel == eLogDebug ? " selected" : "") << "\" href=\"" << webroot << "?cmd=" << HTTP_COMMAND_LOGLEVEL << "&level=debug&token=" << token << "\"> debug </a><br>\r\n<br>\r\n";
|
|
||||||
|
|
||||||
uint16_t maxTunnels = i2p::tunnel::tunnels.GetMaxNumTransitTunnels ();
|
uint16_t maxTunnels = GetMaxNumTransitTunnels ();
|
||||||
s << "<b>" << tr("Transit tunnels limit") << "</b><br>\r\n";
|
s << "<b>" << tr("Transit tunnels limit") << "</b><br>\r\n";
|
||||||
s << "<form method=\"get\" action=\"" << webroot << "\">\r\n";
|
s << "<form method=\"get\" action=\"" << webroot << "\">\r\n";
|
||||||
s << " <input type=\"hidden\" name=\"cmd\" value=\"" << HTTP_COMMAND_LIMITTRANSIT << "\">\r\n";
|
s << " <input type=\"hidden\" name=\"cmd\" value=\"" << HTTP_COMMAND_LIMITTRANSIT << "\">\r\n";
|
||||||
s << " <input type=\"hidden\" name=\"token\" value=\"" << token << "\">\r\n";
|
s << " <input type=\"hidden\" name=\"token\" value=\"" << token << "\">\r\n";
|
||||||
s << " <input type=\"number\" min=\"0\" max=\"" << TRANSIT_TUNNELS_LIMIT <<"\" name=\"limit\" value=\"" << maxTunnels << "\">\r\n";
|
s << " <input type=\"number\" min=\"0\" max=\"65535\" name=\"limit\" value=\"" << maxTunnels << "\">\r\n";
|
||||||
s << " <button type=\"submit\">" << tr("Change") << "</button>\r\n";
|
s << " <button type=\"submit\">" << tr("Change") << "</button>\r\n";
|
||||||
s << "</form>\r\n<br>\r\n";
|
s << "</form>\r\n<br>\r\n";
|
||||||
|
|
||||||
// get current used language
|
std::string currLang = i2p::client::context.GetLanguage ()->GetLanguage(); // get current used language
|
||||||
std::string currLang = i2p::client::context.GetLanguage ()->GetLanguage();
|
s << "<b>" << tr("Change language") << "</b><br>\r\n";
|
||||||
|
s << "<form method=\"get\" action=\"" << webroot << "\">\r\n";
|
||||||
s << "<b>"
|
s << " <input type=\"hidden\" name=\"cmd\" value=\"" << HTTP_COMMAND_SETLANGUAGE << "\">\r\n";
|
||||||
<< tr("Change language")
|
s << " <input type=\"hidden\" name=\"token\" value=\"" << token << "\">\r\n";
|
||||||
<< "</b><br>\r\n"
|
s << " <select name=\"lang\" id=\"lang\">\r\n";
|
||||||
<< "<form method=\"get\" action=\"" << webroot << "\">\r\n"
|
|
||||||
<< " <input type=\"hidden\" name=\"cmd\" value=\"" << HTTP_COMMAND_SETLANGUAGE << "\">\r\n"
|
|
||||||
<< " <input type=\"hidden\" name=\"token\" value=\"" << token << "\">\r\n"
|
|
||||||
<< " <select name=\"lang\" id=\"lang\">\r\n";
|
|
||||||
|
|
||||||
for (const auto& it: i2p::i18n::languages)
|
for (const auto& it: i2p::i18n::languages)
|
||||||
s << " <option value=\"" << it.first << "\"" << ((it.first.compare(currLang) == 0) ? " selected" : "") << ">" << it.second.LocaleName << "</option>\r\n";
|
s << " <option value=\"" << it.first << "\"" << ((it.first.compare(currLang) == 0) ? " selected" : "") << ">" << it.second.LocaleName << "</option>\r\n";
|
||||||
|
s << " </select>\r\n";
|
||||||
s << " </select>\r\n"
|
s << " <button type=\"submit\">" << tr("Change") << "</button>\r\n";
|
||||||
<< " <button type=\"submit\">"
|
s << "</form>\r\n<br>\r\n";
|
||||||
<< tr("Change")
|
|
||||||
<< "</button>\r\n"
|
|
||||||
<< "</form>\r\n<br>\r\n";
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -811,71 +777,51 @@ namespace http {
|
|||||||
{
|
{
|
||||||
if (i2p::tunnel::tunnels.CountTransitTunnels())
|
if (i2p::tunnel::tunnels.CountTransitTunnels())
|
||||||
{
|
{
|
||||||
s << "<b>" << tr("Transit Tunnels") << ":</b><br>\r\n";
|
s << "<b>" << tr("Transit Tunnels") << ":</b><br>\r\n<div class=\"list\">\r\n";
|
||||||
s << "<table><thead><th>⇒</th><th>ID</th><th>⇒</th><th>" << tr("Amount") << "</th></thead><tbody class=\"tableitem\">";
|
|
||||||
for (const auto& it: i2p::tunnel::tunnels.GetTransitTunnels ())
|
for (const auto& it: i2p::tunnel::tunnels.GetTransitTunnels ())
|
||||||
{
|
{
|
||||||
|
s << "<div class=\"listitem\">\r\n";
|
||||||
if (std::dynamic_pointer_cast<i2p::tunnel::TransitTunnelGateway>(it))
|
if (std::dynamic_pointer_cast<i2p::tunnel::TransitTunnelGateway>(it))
|
||||||
s << "<tr><td></td><td>" << it->GetTunnelID () << "</td><td>⇒</td><td>";
|
s << it->GetTunnelID () << " ⇒ ";
|
||||||
else if (std::dynamic_pointer_cast<i2p::tunnel::TransitTunnelEndpoint>(it))
|
else if (std::dynamic_pointer_cast<i2p::tunnel::TransitTunnelEndpoint>(it))
|
||||||
s << "<tr><td>⇒</td><td>" << it->GetTunnelID () << "</td><td></td><td>";
|
s << " ⇒ " << it->GetTunnelID ();
|
||||||
else
|
else
|
||||||
s << "<tr><td>⇒</td><td>" << it->GetTunnelID () << "</td><td>⇒</td><td>";
|
s << " ⇒ " << it->GetTunnelID () << " ⇒ ";
|
||||||
ShowTraffic(s, it->GetNumTransmittedBytes ());
|
s << " " << it->GetNumTransmittedBytes () << "</div>\r\n";
|
||||||
s << "</td></tr>\r\n";
|
|
||||||
}
|
}
|
||||||
s << "</tbody></table>\r\n";
|
s << "</div>\r\n";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
s << "<b>" << tr("Transit Tunnels") << ":</b> " << tr(/* Message on transit tunnels page */ "no transit tunnels currently built") << ".<br>\r\n";
|
s << "<b>" << tr("Transit Tunnels") << ":</b> " << tr("no transit tunnels currently built") << ".<br>\r\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Sessions>
|
template<typename Sessions>
|
||||||
static void ShowTransportSessions (std::stringstream& s, const Sessions& sessions, const std::string name)
|
static void ShowTransportSessions (std::stringstream& s, const Sessions& sessions, const std::string name)
|
||||||
{
|
{
|
||||||
auto comp = [](typename Sessions::mapped_type a, typename Sessions::mapped_type b)
|
|
||||||
{ return a->GetRemoteEndpoint() < b->GetRemoteEndpoint(); };
|
|
||||||
std::set<typename Sessions::mapped_type, decltype(comp)> sortedSessions(comp);
|
|
||||||
for (const auto& it : sessions)
|
|
||||||
{
|
|
||||||
auto ret = sortedSessions.insert(it.second);
|
|
||||||
if (!ret.second)
|
|
||||||
LogPrint(eLogError, "HTTPServer: Duplicate remote endpoint detected: ", (*ret.first)->GetRemoteEndpoint());
|
|
||||||
}
|
|
||||||
std::stringstream tmp_s, tmp_s6; uint16_t cnt = 0, cnt6 = 0;
|
std::stringstream tmp_s, tmp_s6; uint16_t cnt = 0, cnt6 = 0;
|
||||||
for (const auto& it: sortedSessions)
|
for (const auto& it: sessions )
|
||||||
{
|
{
|
||||||
auto endpoint = it->GetRemoteEndpoint ();
|
if (it.second && it.second->IsEstablished () && !it.second->GetRemoteEndpoint ().address ().is_v6 ())
|
||||||
if (it && it->IsEstablished () && endpoint.address ().is_v4 ())
|
|
||||||
{
|
{
|
||||||
tmp_s << "<div class=\"listitem\">\r\n";
|
tmp_s << "<div class=\"listitem\">\r\n";
|
||||||
if (it->IsOutgoing ()) tmp_s << " ⇒ ";
|
if (it.second->IsOutgoing ()) tmp_s << " ⇒ ";
|
||||||
tmp_s << i2p::data::GetIdentHashAbbreviation (it->GetRemoteIdentity ()->GetIdentHash ()) << ": "
|
tmp_s << i2p::data::GetIdentHashAbbreviation (it.second->GetRemoteIdentity ()->GetIdentHash ()) << ": "
|
||||||
<< endpoint.address ().to_string () << ":" << endpoint.port ();
|
<< it.second->GetRemoteEndpoint ().address ().to_string ();
|
||||||
if (!it->IsOutgoing ()) tmp_s << " ⇒ ";
|
if (!it.second->IsOutgoing ()) tmp_s << " ⇒ ";
|
||||||
tmp_s << " [" << it->GetNumSentBytes () << ":" << it->GetNumReceivedBytes () << "]";
|
tmp_s << " [" << it.second->GetNumSentBytes () << ":" << it.second->GetNumReceivedBytes () << "]";
|
||||||
if (it->GetRelayTag ())
|
|
||||||
tmp_s << " [itag:" << it->GetRelayTag () << "]";
|
|
||||||
if (it->GetSendQueueSize () > 0)
|
|
||||||
tmp_s << " [queue:" << it->GetSendQueueSize () << "]";
|
|
||||||
if (it->IsSlow ()) tmp_s << " [slow]";
|
|
||||||
tmp_s << "</div>\r\n" << std::endl;
|
tmp_s << "</div>\r\n" << std::endl;
|
||||||
cnt++;
|
cnt++;
|
||||||
}
|
}
|
||||||
if (it && it->IsEstablished () && endpoint.address ().is_v6 ())
|
if (it.second && it.second->IsEstablished () && it.second->GetRemoteEndpoint ().address ().is_v6 ())
|
||||||
{
|
{
|
||||||
tmp_s6 << "<div class=\"listitem\">\r\n";
|
tmp_s6 << "<div class=\"listitem\">\r\n";
|
||||||
if (it->IsOutgoing ()) tmp_s6 << " ⇒ ";
|
if (it.second->IsOutgoing ()) tmp_s6 << " ⇒ ";
|
||||||
tmp_s6 << i2p::data::GetIdentHashAbbreviation (it->GetRemoteIdentity ()->GetIdentHash ()) << ": "
|
tmp_s6 << i2p::data::GetIdentHashAbbreviation (it.second->GetRemoteIdentity ()->GetIdentHash ()) << ": "
|
||||||
<< "[" << endpoint.address ().to_string () << "]:" << endpoint.port ();
|
<< "[" << it.second->GetRemoteEndpoint ().address ().to_string () << "]";
|
||||||
if (!it->IsOutgoing ()) tmp_s6 << " ⇒ ";
|
if (!it.second->IsOutgoing ()) tmp_s6 << " ⇒ ";
|
||||||
tmp_s6 << " [" << it->GetNumSentBytes () << ":" << it->GetNumReceivedBytes () << "]";
|
tmp_s6 << " [" << it.second->GetNumSentBytes () << ":" << it.second->GetNumReceivedBytes () << "]";
|
||||||
if (it->GetRelayTag ())
|
|
||||||
tmp_s6 << " [itag:" << it->GetRelayTag () << "]";
|
|
||||||
if (it->GetSendQueueSize () > 0)
|
|
||||||
tmp_s6 << " [queue:" << it->GetSendQueueSize () << "]";
|
|
||||||
tmp_s6 << "</div>\r\n" << std::endl;
|
tmp_s6 << "</div>\r\n" << std::endl;
|
||||||
cnt6++;
|
cnt6++;
|
||||||
}
|
}
|
||||||
@@ -904,6 +850,46 @@ namespace http {
|
|||||||
if (!sessions.empty ())
|
if (!sessions.empty ())
|
||||||
ShowTransportSessions (s, sessions, "NTCP2");
|
ShowTransportSessions (s, sessions, "NTCP2");
|
||||||
}
|
}
|
||||||
|
auto ssuServer = i2p::transport::transports.GetSSUServer ();
|
||||||
|
if (ssuServer)
|
||||||
|
{
|
||||||
|
auto sessions = ssuServer->GetSessions ();
|
||||||
|
if (!sessions.empty ())
|
||||||
|
{
|
||||||
|
s << "<div class='slide'><label for='slide_ssu'><b>SSU</b> ( " << (int) sessions.size() << " )</label>\r\n<input type=\"checkbox\" id=\"slide_ssu\" />\r\n<div class=\"slidecontent list\">";
|
||||||
|
for (const auto& it: sessions)
|
||||||
|
{
|
||||||
|
s << "<div class=\"listitem\">\r\n";
|
||||||
|
auto endpoint = it.second->GetRemoteEndpoint ();
|
||||||
|
if (it.second->IsOutgoing ()) s << " ⇒ ";
|
||||||
|
s << endpoint.address ().to_string () << ":" << endpoint.port ();
|
||||||
|
if (!it.second->IsOutgoing ()) s << " ⇒ ";
|
||||||
|
s << " [" << it.second->GetNumSentBytes () << ":" << it.second->GetNumReceivedBytes () << "]";
|
||||||
|
if (it.second->GetRelayTag ())
|
||||||
|
s << " [itag:" << it.second->GetRelayTag () << "]";
|
||||||
|
s << "</div>\r\n" << std::endl;
|
||||||
|
}
|
||||||
|
s << "</div>\r\n</div>\r\n";
|
||||||
|
}
|
||||||
|
auto sessions6 = ssuServer->GetSessionsV6 ();
|
||||||
|
if (!sessions6.empty ())
|
||||||
|
{
|
||||||
|
s << "<div class='slide'><label for='slide_ssuv6'><b>SSUv6</b> ( " << (int) sessions6.size() << " )</label>\r\n<input type=\"checkbox\" id=\"slide_ssuv6\" />\r\n<div class=\"slidecontent list\">";
|
||||||
|
for (const auto& it: sessions6)
|
||||||
|
{
|
||||||
|
s << "<div class=\"listitem\">\r\n";
|
||||||
|
auto endpoint = it.second->GetRemoteEndpoint ();
|
||||||
|
if (it.second->IsOutgoing ()) s << " ⇒ ";
|
||||||
|
s << "[" << endpoint.address ().to_string () << "]:" << endpoint.port ();
|
||||||
|
if (!it.second->IsOutgoing ()) s << " ⇒ ";
|
||||||
|
s << " [" << it.second->GetNumSentBytes () << ":" << it.second->GetNumReceivedBytes () << "]";
|
||||||
|
if (it.second->GetRelayTag ())
|
||||||
|
s << " [itag:" << it.second->GetRelayTag () << "]";
|
||||||
|
s << "</div>\r\n" << std::endl;
|
||||||
|
}
|
||||||
|
s << "</div>\r\n</div>\r\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
auto ssu2Server = i2p::transport::transports.GetSSU2Server ();
|
auto ssu2Server = i2p::transport::transports.GetSSU2Server ();
|
||||||
if (ssu2Server)
|
if (ssu2Server)
|
||||||
{
|
{
|
||||||
@@ -913,6 +899,7 @@ namespace http {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WITH_SAM
|
||||||
void ShowSAMSessions (std::stringstream& s)
|
void ShowSAMSessions (std::stringstream& s)
|
||||||
{
|
{
|
||||||
std::string webroot; i2p::config::GetOption("http.webroot", webroot);
|
std::string webroot; i2p::config::GetOption("http.webroot", webroot);
|
||||||
@@ -935,7 +922,7 @@ namespace http {
|
|||||||
s << "</div>\r\n";
|
s << "</div>\r\n";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
s << "<b>" << tr("SAM sessions") << ":</b> " << tr(/* Message on SAM sessions page */ "no sessions currently running") << ".<br>\r\n";
|
s << "<b>" << tr("SAM sessions") << ":</b> " << tr("no sessions currently running") << ".<br>\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowSAMSession (std::stringstream& s, const std::string& id)
|
void ShowSAMSession (std::stringstream& s, const std::string& id)
|
||||||
@@ -975,46 +962,39 @@ namespace http {
|
|||||||
}
|
}
|
||||||
s << "</div>\r\n";
|
s << "</div>\r\n";
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void ShowI2PTunnels (std::stringstream& s)
|
void ShowI2PTunnels (std::stringstream& s)
|
||||||
{
|
{
|
||||||
std::string webroot; i2p::config::GetOption("http.webroot", webroot);
|
std::string webroot; i2p::config::GetOption("http.webroot", webroot);
|
||||||
|
s << "<b>" << tr("Client Tunnels") << ":</b><br>\r\n<div class=\"list\">\r\n";
|
||||||
auto& clientTunnels = i2p::client::context.GetClientTunnels ();
|
for (auto& it: i2p::client::context.GetClientTunnels ())
|
||||||
auto httpProxy = i2p::client::context.GetHttpProxy ();
|
|
||||||
auto socksProxy = i2p::client::context.GetSocksProxy ();
|
|
||||||
if (!clientTunnels.empty () || httpProxy || socksProxy)
|
|
||||||
{
|
{
|
||||||
s << "<b>" << tr("Client Tunnels") << ":</b><br>\r\n<div class=\"list\">\r\n";
|
auto& ident = it.second->GetLocalDestination ()->GetIdentHash();
|
||||||
if (!clientTunnels.empty ())
|
s << "<div class=\"listitem\"><a href=\"" << webroot << "?page=" << HTTP_PAGE_LOCAL_DESTINATION << "&b32=" << ident.ToBase32 () << "\">";
|
||||||
{
|
s << it.second->GetName () << "</a> ⇐ ";
|
||||||
for (auto& it: clientTunnels)
|
s << i2p::client::context.GetAddressBook ().ToAddress(ident);
|
||||||
{
|
s << "</div>\r\n"<< std::endl;
|
||||||
auto& ident = it.second->GetLocalDestination ()->GetIdentHash();
|
|
||||||
s << "<div class=\"listitem\"><a href=\"" << webroot << "?page=" << HTTP_PAGE_LOCAL_DESTINATION << "&b32=" << ident.ToBase32 () << "\">";
|
|
||||||
s << it.second->GetName () << "</a> ⇐ ";
|
|
||||||
s << i2p::client::context.GetAddressBook ().ToAddress(ident);
|
|
||||||
s << "</div>\r\n"<< std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (httpProxy)
|
|
||||||
{
|
|
||||||
auto& ident = httpProxy->GetLocalDestination ()->GetIdentHash();
|
|
||||||
s << "<div class=\"listitem\"><a href=\"" << webroot << "?page=" << HTTP_PAGE_LOCAL_DESTINATION << "&b32=" << ident.ToBase32 () << "\">";
|
|
||||||
s << "HTTP " << tr("Proxy") << "</a> ⇐ ";
|
|
||||||
s << i2p::client::context.GetAddressBook ().ToAddress(ident);
|
|
||||||
s << "</div>\r\n"<< std::endl;
|
|
||||||
}
|
|
||||||
if (socksProxy)
|
|
||||||
{
|
|
||||||
auto& ident = socksProxy->GetLocalDestination ()->GetIdentHash();
|
|
||||||
s << "<div class=\"listitem\"><a href=\"" << webroot << "?page=" << HTTP_PAGE_LOCAL_DESTINATION << "&b32=" << ident.ToBase32 () << "\">";
|
|
||||||
s << "SOCKS " << tr("Proxy") << "</a> ⇐ ";
|
|
||||||
s << i2p::client::context.GetAddressBook ().ToAddress(ident);
|
|
||||||
s << "</div>\r\n"<< std::endl;
|
|
||||||
}
|
|
||||||
s << "</div>\r\n";
|
|
||||||
}
|
}
|
||||||
|
auto httpProxy = i2p::client::context.GetHttpProxy ();
|
||||||
|
if (httpProxy)
|
||||||
|
{
|
||||||
|
auto& ident = httpProxy->GetLocalDestination ()->GetIdentHash();
|
||||||
|
s << "<div class=\"listitem\"><a href=\"" << webroot << "?page=" << HTTP_PAGE_LOCAL_DESTINATION << "&b32=" << ident.ToBase32 () << "\">";
|
||||||
|
s << "HTTP " << tr("Proxy") << "</a> ⇐ ";
|
||||||
|
s << i2p::client::context.GetAddressBook ().ToAddress(ident);
|
||||||
|
s << "</div>\r\n"<< std::endl;
|
||||||
|
}
|
||||||
|
auto socksProxy = i2p::client::context.GetSocksProxy ();
|
||||||
|
if (socksProxy)
|
||||||
|
{
|
||||||
|
auto& ident = socksProxy->GetLocalDestination ()->GetIdentHash();
|
||||||
|
s << "<div class=\"listitem\"><a href=\"" << webroot << "?page=" << HTTP_PAGE_LOCAL_DESTINATION << "&b32=" << ident.ToBase32 () << "\">";
|
||||||
|
s << "SOCKS " << tr("Proxy") << "</a> ⇐ ";
|
||||||
|
s << i2p::client::context.GetAddressBook ().ToAddress(ident);
|
||||||
|
s << "</div>\r\n"<< std::endl;
|
||||||
|
}
|
||||||
|
s << "</div>\r\n";
|
||||||
|
|
||||||
auto& serverTunnels = i2p::client::context.GetServerTunnels ();
|
auto& serverTunnels = i2p::client::context.GetServerTunnels ();
|
||||||
if (!serverTunnels.empty ()) {
|
if (!serverTunnels.empty ()) {
|
||||||
@@ -1052,7 +1032,7 @@ namespace http {
|
|||||||
for (auto& it: serverForwards)
|
for (auto& it: serverForwards)
|
||||||
{
|
{
|
||||||
auto& ident = it.second->GetLocalDestination ()->GetIdentHash();
|
auto& ident = it.second->GetLocalDestination ()->GetIdentHash();
|
||||||
s << "<div class=\"listitem\"><a href=\"" << webroot << "?page=" << HTTP_PAGE_LOCAL_DESTINATION << "&b32=" << ident.ToBase32 () << "\">";
|
s << "<a href=\"" << webroot << "?page=" << HTTP_PAGE_LOCAL_DESTINATION << "&b32=" << ident.ToBase32 () << "\">";
|
||||||
s << it.second->GetName () << "</a> ⇐ ";
|
s << it.second->GetName () << "</a> ⇐ ";
|
||||||
s << i2p::client::context.GetAddressBook ().ToAddress(ident);
|
s << i2p::client::context.GetAddressBook ().ToAddress(ident);
|
||||||
s << "</div>\r\n"<< std::endl;
|
s << "</div>\r\n"<< std::endl;
|
||||||
@@ -1236,12 +1216,16 @@ namespace http {
|
|||||||
uint32_t token = CreateToken ();
|
uint32_t token = CreateToken ();
|
||||||
ShowLocalDestination (s, params["b32"], token);
|
ShowLocalDestination (s, params["b32"], token);
|
||||||
}
|
}
|
||||||
|
#ifdef WITH_I2CP
|
||||||
else if (page == HTTP_PAGE_I2CP_LOCAL_DESTINATION)
|
else if (page == HTTP_PAGE_I2CP_LOCAL_DESTINATION)
|
||||||
ShowI2CPLocalDestination (s, params["i2cp_id"]);
|
ShowI2CPLocalDestination (s, params["i2cp_id"]);
|
||||||
|
#endif
|
||||||
|
#ifdef WITH_SAM
|
||||||
else if (page == HTTP_PAGE_SAM_SESSIONS)
|
else if (page == HTTP_PAGE_SAM_SESSIONS)
|
||||||
ShowSAMSessions (s);
|
ShowSAMSessions (s);
|
||||||
else if (page == HTTP_PAGE_SAM_SESSION)
|
else if (page == HTTP_PAGE_SAM_SESSION)
|
||||||
ShowSAMSession (s, params["sam_id"]);
|
ShowSAMSession (s, params["sam_id"]);
|
||||||
|
#endif
|
||||||
else if (page == HTTP_PAGE_I2P_TUNNELS)
|
else if (page == HTTP_PAGE_I2P_TUNNELS)
|
||||||
ShowI2PTunnels (s);
|
ShowI2PTunnels (s);
|
||||||
else if (page == HTTP_PAGE_LEASESETS)
|
else if (page == HTTP_PAGE_LEASESETS)
|
||||||
@@ -1262,7 +1246,7 @@ namespace http {
|
|||||||
url.parse_query(params);
|
url.parse_query(params);
|
||||||
|
|
||||||
std::string webroot; i2p::config::GetOption("http.webroot", webroot);
|
std::string webroot; i2p::config::GetOption("http.webroot", webroot);
|
||||||
std::string redirect = std::to_string(COMMAND_REDIRECT_TIMEOUT) + "; url=" + webroot + "?page=commands";
|
std::string redirect = "5; url=" + webroot + "?page=commands";
|
||||||
std::string token = params["token"];
|
std::string token = params["token"];
|
||||||
|
|
||||||
if (token.empty () || m_Tokens.find (std::stoi (token)) == m_Tokens.end ())
|
if (token.empty () || m_Tokens.find (std::stoi (token)) == m_Tokens.end ())
|
||||||
@@ -1274,7 +1258,7 @@ namespace http {
|
|||||||
std::string cmd = params["cmd"];
|
std::string cmd = params["cmd"];
|
||||||
if (cmd == HTTP_COMMAND_RUN_PEER_TEST)
|
if (cmd == HTTP_COMMAND_RUN_PEER_TEST)
|
||||||
i2p::transport::transports.PeerTest ();
|
i2p::transport::transports.PeerTest ();
|
||||||
else if (cmd == HTTP_COMMAND_RELOAD_TUNNELS_CONFIG)
|
else if (cmd == HTTP_COMMAND_RELOAD_CONFIG)
|
||||||
i2p::client::context.ReloadConfig ();
|
i2p::client::context.ReloadConfig ();
|
||||||
else if (cmd == HTTP_COMMAND_ENABLE_TRANSIT)
|
else if (cmd == HTTP_COMMAND_ENABLE_TRANSIT)
|
||||||
i2p::context.SetAcceptsTunnels (true);
|
i2p::context.SetAcceptsTunnels (true);
|
||||||
@@ -1336,50 +1320,20 @@ namespace http {
|
|||||||
s << "<b>" << tr("ERROR") << "</b>: " << tr("StreamID can't be null") << "<br>\r\n<br>\r\n";
|
s << "<b>" << tr("ERROR") << "</b>: " << tr("StreamID can't be null") << "<br>\r\n<br>\r\n";
|
||||||
|
|
||||||
s << "<a href=\"" << webroot << "?page=local_destination&b32=" << b32 << "\">" << tr("Return to destination page") << "</a><br>\r\n";
|
s << "<a href=\"" << webroot << "?page=local_destination&b32=" << b32 << "\">" << tr("Return to destination page") << "</a><br>\r\n";
|
||||||
s << "<p>" << tr("You will be redirected in %d seconds", COMMAND_REDIRECT_TIMEOUT) << "</b>";
|
s << "<p>" << tr("You will be redirected in 5 seconds") << "</b>";
|
||||||
redirect = std::to_string(COMMAND_REDIRECT_TIMEOUT) + "; url=" + webroot + "?page=local_destination&b32=" + b32;
|
redirect = "5; url=" + webroot + "?page=local_destination&b32=" + b32;
|
||||||
res.add_header("Refresh", redirect.c_str());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if (cmd == HTTP_COMMAND_EXPIRELEASE)
|
|
||||||
{
|
|
||||||
std::string b32 = params["b32"];
|
|
||||||
std::string lease = params["lease"];
|
|
||||||
|
|
||||||
i2p::data::IdentHash ident, leaseident;
|
|
||||||
ident.FromBase32 (b32);
|
|
||||||
leaseident.FromBase32 (lease);
|
|
||||||
auto dest = i2p::client::context.FindLocalDestination (ident);
|
|
||||||
|
|
||||||
if (dest)
|
|
||||||
{
|
|
||||||
auto leaseset = dest->FindLeaseSet (leaseident);
|
|
||||||
if (leaseset)
|
|
||||||
{
|
|
||||||
leaseset->ExpireLease ();
|
|
||||||
s << "<b>" << tr("SUCCESS") << "</b>: " << tr("LeaseSet expiration time updated") << "<br>\r\n<br>\r\n";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
s << "<b>" << tr("ERROR") << "</b>: " << tr("LeaseSet is not found or already expired") << "<br>\r\n<br>\r\n";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
s << "<b>" << tr("ERROR") << "</b>: " << tr("Destination not found") << "<br>\r\n<br>\r\n";
|
|
||||||
|
|
||||||
s << "<a href=\"" << webroot << "?page=local_destination&b32=" << b32 << "\">" << tr("Return to destination page") << "</a><br>\r\n";
|
|
||||||
s << "<p>" << tr("You will be redirected in %d seconds", COMMAND_REDIRECT_TIMEOUT) << "</b>";
|
|
||||||
redirect = std::to_string(COMMAND_REDIRECT_TIMEOUT) + "; url=" + webroot + "?page=local_destination&b32=" + b32;
|
|
||||||
res.add_header("Refresh", redirect.c_str());
|
res.add_header("Refresh", redirect.c_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (cmd == HTTP_COMMAND_LIMITTRANSIT)
|
else if (cmd == HTTP_COMMAND_LIMITTRANSIT)
|
||||||
{
|
{
|
||||||
uint32_t limit = std::stoul(params["limit"], nullptr);
|
uint32_t limit = std::stoul(params["limit"], nullptr);
|
||||||
if (limit > 0 && limit <= TRANSIT_TUNNELS_LIMIT)
|
if (limit > 0 && limit <= 65535)
|
||||||
i2p::tunnel::tunnels.SetMaxNumTransitTunnels (limit);
|
SetMaxNumTransitTunnels (limit);
|
||||||
else {
|
else {
|
||||||
s << "<b>" << tr("ERROR") << "</b>: " << tr("Transit tunnels count must not exceed %d", TRANSIT_TUNNELS_LIMIT) << "\r\n<br>\r\n<br>\r\n";
|
s << "<b>" << tr("ERROR") << "</b>: " << tr("Transit tunnels count must not exceed 65535") << "\r\n<br>\r\n<br>\r\n";
|
||||||
s << "<a href=\"" << webroot << "?page=commands\">" << tr("Back to commands list") << "</a>\r\n<br>\r\n";
|
s << "<a href=\"" << webroot << "?page=commands\">" << tr("Back to commands list") << "</a>\r\n<br>\r\n";
|
||||||
s << "<p>" << tr("You will be redirected in %d seconds", COMMAND_REDIRECT_TIMEOUT) << "</b>";
|
s << "<p>" << tr("You will be redirected in 5 seconds") << "</b>";
|
||||||
res.add_header("Refresh", redirect.c_str());
|
res.add_header("Refresh", redirect.c_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1454,7 +1408,7 @@ namespace http {
|
|||||||
|
|
||||||
s << "<b>" << tr("SUCCESS") << "</b>: " << tr("Command accepted") << "<br><br>\r\n";
|
s << "<b>" << tr("SUCCESS") << "</b>: " << tr("Command accepted") << "<br><br>\r\n";
|
||||||
s << "<a href=\"" << webroot << "?page=commands\">" << tr("Back to commands list") << "</a><br>\r\n";
|
s << "<a href=\"" << webroot << "?page=commands\">" << tr("Back to commands list") << "</a><br>\r\n";
|
||||||
s << "<p>" << tr("You will be redirected in %d seconds", COMMAND_REDIRECT_TIMEOUT) << "</b>";
|
s << "<p>" << tr("You will be redirected in 5 seconds") << "</b>";
|
||||||
res.add_header("Refresh", redirect.c_str());
|
res.add_header("Refresh", redirect.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2023, The PurpleI2P Project
|
* Copyright (c) 2013-2020, The PurpleI2P Project
|
||||||
*
|
*
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
* This file is part of Purple i2pd project and licensed under BSD3
|
||||||
*
|
*
|
||||||
@@ -24,8 +24,6 @@ namespace http
|
|||||||
{
|
{
|
||||||
const size_t HTTP_CONNECTION_BUFFER_SIZE = 8192;
|
const size_t HTTP_CONNECTION_BUFFER_SIZE = 8192;
|
||||||
const int TOKEN_EXPIRATION_TIMEOUT = 30; // in seconds
|
const int TOKEN_EXPIRATION_TIMEOUT = 30; // in seconds
|
||||||
const int COMMAND_REDIRECT_TIMEOUT = 5; // in seconds
|
|
||||||
const int TRANSIT_TUNNELS_LIMIT = 65535;
|
|
||||||
|
|
||||||
class HTTPConnection: public std::enable_shared_from_this<HTTPConnection>
|
class HTTPConnection: public std::enable_shared_from_this<HTTPConnection>
|
||||||
{
|
{
|
||||||
@@ -97,11 +95,15 @@ namespace http
|
|||||||
void ShowTunnels (std::stringstream& s);
|
void ShowTunnels (std::stringstream& s);
|
||||||
void ShowTransitTunnels (std::stringstream& s);
|
void ShowTransitTunnels (std::stringstream& s);
|
||||||
void ShowTransports (std::stringstream& s);
|
void ShowTransports (std::stringstream& s);
|
||||||
void ShowSAMSessions (std::stringstream& s);
|
|
||||||
void ShowI2PTunnels (std::stringstream& s);
|
void ShowI2PTunnels (std::stringstream& s);
|
||||||
void ShowLocalDestination (std::stringstream& s, const std::string& b32, uint32_t token);
|
void ShowLocalDestination (std::stringstream& s, const std::string& b32, uint32_t token);
|
||||||
|
#ifdef WITH_SAM
|
||||||
|
void ShowSAMSessions (std::stringstream& s);
|
||||||
void ShowSAMSession (std::stringstream& s, const std::string& id);
|
void ShowSAMSession (std::stringstream& s, const std::string& id);
|
||||||
|
#endif
|
||||||
|
#ifdef WITH_I2CP
|
||||||
void ShowI2CPLocalDestination (std::stringstream& s, const std::string& id);
|
void ShowI2CPLocalDestination (std::stringstream& s, const std::string& id);
|
||||||
|
#endif
|
||||||
} // http
|
} // http
|
||||||
} // i2p
|
} // i2p
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2023, The PurpleI2P Project
|
* Copyright (c) 2013-2022, The PurpleI2P Project
|
||||||
*
|
*
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
* This file is part of Purple i2pd project and licensed under BSD3
|
||||||
*
|
*
|
||||||
@@ -38,7 +38,7 @@ namespace http
|
|||||||
"@media (prefers-color-scheme: dark) { :root { --main-bg-color: #242424; --main-text-color: #17ab5c; --main-link-color: #bf64b7; --main-link-hover-color: #000000; } }\r\n"
|
"@media (prefers-color-scheme: dark) { :root { --main-bg-color: #242424; --main-text-color: #17ab5c; --main-link-color: #bf64b7; --main-link-hover-color: #000000; } }\r\n"
|
||||||
"body { font: 100%/1.5em sans-serif; margin: 0; padding: 1.5em; background: var(--main-bg-color); color: var(--main-text-color); }\r\n"
|
"body { font: 100%/1.5em sans-serif; margin: 0; padding: 1.5em; background: var(--main-bg-color); color: var(--main-text-color); }\r\n"
|
||||||
"a, .slide label { text-decoration: none; color: var(--main-link-color); }\r\n"
|
"a, .slide label { text-decoration: none; color: var(--main-link-color); }\r\n"
|
||||||
"a:hover, a.button.selected, .slide label:hover, button[type=submit]:hover { color: var(--main-link-hover-color); background: var(--main-link-color); }\r\n"
|
"a:hover, .slide label:hover, button[type=submit]:hover { color: var(--main-link-hover-color); background: var(--main-link-color); }\r\n"
|
||||||
"a.button { appearance: button; text-decoration: none; padding: 0 5px; border: 1px solid var(--main-link-color); }\r\n"
|
"a.button { appearance: button; text-decoration: none; padding: 0 5px; border: 1px solid var(--main-link-color); }\r\n"
|
||||||
".header { font-size: 2.5em; text-align: center; margin: 1em 0; color: var(--main-link-color); }\r\n"
|
".header { font-size: 2.5em; text-align: center; margin: 1em 0; color: var(--main-link-color); }\r\n"
|
||||||
".wrapper { margin: 0 auto; padding: 1em; max-width: 64em; }\r\n"
|
".wrapper { margin: 0 auto; padding: 1em; max-width: 64em; }\r\n"
|
||||||
|
|||||||
@@ -6,6 +6,8 @@
|
|||||||
* See full license text in LICENSE file at top of project tree
|
* See full license text in LICENSE file at top of project tree
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifdef WITH_I2PC
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <openssl/x509.h>
|
#include <openssl/x509.h>
|
||||||
@@ -14,17 +16,25 @@
|
|||||||
// Use global placeholders from boost introduced when local_time.hpp is loaded
|
// Use global placeholders from boost introduced when local_time.hpp is loaded
|
||||||
#define BOOST_BIND_GLOBAL_PLACEHOLDERS
|
#define BOOST_BIND_GLOBAL_PLACEHOLDERS
|
||||||
|
|
||||||
|
#include <boost/lexical_cast.hpp>
|
||||||
#include <boost/date_time/local_time/local_time.hpp>
|
#include <boost/date_time/local_time/local_time.hpp>
|
||||||
#include <boost/date_time/posix_time/posix_time.hpp>
|
#include <boost/date_time/posix_time/posix_time.hpp>
|
||||||
|
#include <boost/property_tree/ini_parser.hpp>
|
||||||
#include <boost/property_tree/json_parser.hpp>
|
#include <boost/property_tree/json_parser.hpp>
|
||||||
#include <boost/lexical_cast.hpp>
|
|
||||||
|
|
||||||
|
#include "Crypto.h"
|
||||||
#include "FS.h"
|
#include "FS.h"
|
||||||
#include "Log.h"
|
#include "Log.h"
|
||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
#include "NetDb.hpp"
|
#include "NetDb.hpp"
|
||||||
#include "Tunnel.h"
|
#include "RouterContext.h"
|
||||||
#include "Daemon.h"
|
#include "Daemon.h"
|
||||||
|
#include "Tunnel.h"
|
||||||
|
#include "Timestamp.h"
|
||||||
|
#include "Transports.h"
|
||||||
|
#include "version.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "ClientContext.h"
|
||||||
#include "I2PControl.h"
|
#include "I2PControl.h"
|
||||||
|
|
||||||
namespace i2p
|
namespace i2p
|
||||||
@@ -58,21 +68,53 @@ namespace client
|
|||||||
m_SSLContext.use_private_key_file (i2pcp_key, boost::asio::ssl::context::pem);
|
m_SSLContext.use_private_key_file (i2pcp_key, boost::asio::ssl::context::pem);
|
||||||
|
|
||||||
// handlers
|
// handlers
|
||||||
m_MethodHandlers["Authenticate"] = &I2PControlService::AuthenticateHandler;
|
m_MethodHandlers["Authenticate"] = &I2PControlService::AuthenticateHandler;
|
||||||
m_MethodHandlers["Echo"] = &I2PControlService::EchoHandler;
|
m_MethodHandlers["Echo"] = &I2PControlService::EchoHandler;
|
||||||
m_MethodHandlers["I2PControl"] = &I2PControlService::I2PControlHandler;
|
m_MethodHandlers["I2PControl"] = &I2PControlService::I2PControlHandler;
|
||||||
m_MethodHandlers["RouterInfo"] = &I2PControlHandlers::RouterInfoHandler;
|
m_MethodHandlers["RouterInfo"] = &I2PControlService::RouterInfoHandler;
|
||||||
m_MethodHandlers["RouterManager"] = &I2PControlService::RouterManagerHandler;
|
m_MethodHandlers["RouterManager"] = &I2PControlService::RouterManagerHandler;
|
||||||
m_MethodHandlers["NetworkSetting"] = &I2PControlHandlers::NetworkSettingHandler;
|
m_MethodHandlers["NetworkSetting"] = &I2PControlService::NetworkSettingHandler;
|
||||||
m_MethodHandlers["ClientServicesInfo"] = &I2PControlHandlers::ClientServicesInfoHandler;
|
m_MethodHandlers["ClientServicesInfo"] = &I2PControlService::ClientServicesInfoHandler;
|
||||||
|
|
||||||
// I2PControl
|
// I2PControl
|
||||||
m_I2PControlHandlers["i2pcontrol.password"] = &I2PControlService::PasswordHandler;
|
m_I2PControlHandlers["i2pcontrol.password"] = &I2PControlService::PasswordHandler;
|
||||||
|
|
||||||
|
// RouterInfo
|
||||||
|
m_RouterInfoHandlers["i2p.router.uptime"] = &I2PControlService::UptimeHandler;
|
||||||
|
m_RouterInfoHandlers["i2p.router.version"] = &I2PControlService::VersionHandler;
|
||||||
|
m_RouterInfoHandlers["i2p.router.status"] = &I2PControlService::StatusHandler;
|
||||||
|
m_RouterInfoHandlers["i2p.router.netdb.knownpeers"] = &I2PControlService::NetDbKnownPeersHandler;
|
||||||
|
m_RouterInfoHandlers["i2p.router.netdb.activepeers"] = &I2PControlService::NetDbActivePeersHandler;
|
||||||
|
m_RouterInfoHandlers["i2p.router.net.bw.inbound.1s"] = &I2PControlService::InboundBandwidth1S;
|
||||||
|
m_RouterInfoHandlers["i2p.router.net.bw.outbound.1s"] = &I2PControlService::OutboundBandwidth1S;
|
||||||
|
m_RouterInfoHandlers["i2p.router.net.status"] = &I2PControlService::NetStatusHandler;
|
||||||
|
m_RouterInfoHandlers["i2p.router.net.tunnels.participating"] = &I2PControlService::TunnelsParticipatingHandler;
|
||||||
|
m_RouterInfoHandlers["i2p.router.net.tunnels.successrate"] = &I2PControlService::TunnelsSuccessRateHandler;
|
||||||
|
m_RouterInfoHandlers["i2p.router.net.total.received.bytes"] = &I2PControlService::NetTotalReceivedBytes;
|
||||||
|
m_RouterInfoHandlers["i2p.router.net.total.sent.bytes"] = &I2PControlService::NetTotalSentBytes;
|
||||||
|
|
||||||
// RouterManager
|
// RouterManager
|
||||||
m_RouterManagerHandlers["Reseed"] = &I2PControlService::ReseedHandler;
|
m_RouterManagerHandlers["Reseed"] = &I2PControlService::ReseedHandler;
|
||||||
m_RouterManagerHandlers["Shutdown"] = &I2PControlService::ShutdownHandler;
|
m_RouterManagerHandlers["Shutdown"] = &I2PControlService::ShutdownHandler;
|
||||||
m_RouterManagerHandlers["ShutdownGraceful"] = &I2PControlService::ShutdownGracefulHandler;
|
m_RouterManagerHandlers["ShutdownGraceful"] = &I2PControlService::ShutdownGracefulHandler;
|
||||||
|
|
||||||
|
// NetworkSetting
|
||||||
|
m_NetworkSettingHandlers["i2p.router.net.bw.in"] = &I2PControlService::InboundBandwidthLimit;
|
||||||
|
m_NetworkSettingHandlers["i2p.router.net.bw.out"] = &I2PControlService::OutboundBandwidthLimit;
|
||||||
|
|
||||||
|
// ClientServicesInfo
|
||||||
|
m_ClientServicesInfoHandlers["I2PTunnel"] = &I2PControlService::I2PTunnelInfoHandler;
|
||||||
|
m_ClientServicesInfoHandlers["HTTPProxy"] = &I2PControlService::HTTPProxyInfoHandler;
|
||||||
|
m_ClientServicesInfoHandlers["SOCKS"] = &I2PControlService::SOCKSInfoHandler;
|
||||||
|
#ifdef WITH_SAM
|
||||||
|
m_ClientServicesInfoHandlers["SAM"] = &I2PControlService::SAMInfoHandler;
|
||||||
|
#endif
|
||||||
|
#ifdef WITH_BOB
|
||||||
|
m_ClientServicesInfoHandlers["BOB"] = &I2PControlService::BOBInfoHandler;
|
||||||
|
#endif
|
||||||
|
#ifdef WITH_I2CP
|
||||||
|
m_ClientServicesInfoHandlers["I2CP"] = &I2PControlService::I2CPInfoHandler;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
I2PControlService::~I2PControlService ()
|
I2PControlService::~I2PControlService ()
|
||||||
@@ -133,7 +175,7 @@ namespace client
|
|||||||
Accept ();
|
Accept ();
|
||||||
|
|
||||||
if (ecode) {
|
if (ecode) {
|
||||||
LogPrint (eLogError, "I2PControl: Accept error: ", ecode.message ());
|
LogPrint (eLogError, "I2PControl: Accept error: ", ecode.message ());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
LogPrint (eLogDebug, "I2PControl: New request from ", socket->lowest_layer ().remote_endpoint ());
|
LogPrint (eLogDebug, "I2PControl: New request from ", socket->lowest_layer ().remote_endpoint ());
|
||||||
@@ -246,6 +288,37 @@ namespace client
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void I2PControlService::InsertParam (std::ostringstream& ss, const std::string& name, int value) const
|
||||||
|
{
|
||||||
|
ss << "\"" << name << "\":" << value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2PControlService::InsertParam (std::ostringstream& ss, const std::string& name, const std::string& value, bool quotes) const
|
||||||
|
{
|
||||||
|
ss << "\"" << name << "\":";
|
||||||
|
if (value.length () > 0)
|
||||||
|
{
|
||||||
|
if (quotes)
|
||||||
|
ss << "\"" << value << "\"";
|
||||||
|
else
|
||||||
|
ss << value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ss << "null";
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2PControlService::InsertParam (std::ostringstream& ss, const std::string& name, double value) const
|
||||||
|
{
|
||||||
|
ss << "\"" << name << "\":" << std::fixed << std::setprecision(2) << value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2PControlService::InsertParam (std::ostringstream& ss, const std::string& name, const boost::property_tree::ptree& value) const
|
||||||
|
{
|
||||||
|
std::ostringstream buf;
|
||||||
|
boost::property_tree::write_json (buf, value, false);
|
||||||
|
ss << "\"" << name << "\":" << buf.str();
|
||||||
|
}
|
||||||
|
|
||||||
void I2PControlService::SendResponse (std::shared_ptr<ssl_socket> socket,
|
void I2PControlService::SendResponse (std::shared_ptr<ssl_socket> socket,
|
||||||
std::shared_ptr<I2PControlBuffer> buf, std::ostringstream& response, bool isHtml)
|
std::shared_ptr<I2PControlBuffer> buf, std::ostringstream& response, bool isHtml)
|
||||||
{
|
{
|
||||||
@@ -280,8 +353,7 @@ namespace client
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// handlers
|
// handlers
|
||||||
|
|
||||||
void I2PControlService::AuthenticateHandler (const boost::property_tree::ptree& params, std::ostringstream& results)
|
void I2PControlService::AuthenticateHandler (const boost::property_tree::ptree& params, std::ostringstream& results)
|
||||||
{
|
{
|
||||||
int api = params.get<int> ("API");
|
int api = params.get<int> ("API");
|
||||||
@@ -306,8 +378,7 @@ namespace client
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// I2PControl
|
// I2PControl
|
||||||
|
|
||||||
void I2PControlService::I2PControlHandler (const boost::property_tree::ptree& params, std::ostringstream& results)
|
void I2PControlService::I2PControlHandler (const boost::property_tree::ptree& params, std::ostringstream& results)
|
||||||
{
|
{
|
||||||
for (auto& it: params)
|
for (auto& it: params)
|
||||||
@@ -331,6 +402,91 @@ namespace client
|
|||||||
m_Tokens.clear ();
|
m_Tokens.clear ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RouterInfo
|
||||||
|
|
||||||
|
void I2PControlService::RouterInfoHandler (const boost::property_tree::ptree& params, std::ostringstream& results)
|
||||||
|
{
|
||||||
|
bool first = true;
|
||||||
|
for (auto it = params.begin (); it != params.end (); it++)
|
||||||
|
{
|
||||||
|
LogPrint (eLogDebug, "I2PControl: RouterInfo request: ", it->first);
|
||||||
|
auto it1 = m_RouterInfoHandlers.find (it->first);
|
||||||
|
if (it1 != m_RouterInfoHandlers.end ())
|
||||||
|
{
|
||||||
|
if (!first) results << ",";
|
||||||
|
else first = false;
|
||||||
|
(this->*(it1->second))(results);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
LogPrint (eLogError, "I2PControl: RouterInfo unknown request ", it->first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2PControlService::UptimeHandler (std::ostringstream& results)
|
||||||
|
{
|
||||||
|
InsertParam (results, "i2p.router.uptime", std::to_string (i2p::context.GetUptime ()*1000LL), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2PControlService::VersionHandler (std::ostringstream& results)
|
||||||
|
{
|
||||||
|
InsertParam (results, "i2p.router.version", VERSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2PControlService::StatusHandler (std::ostringstream& results)
|
||||||
|
{
|
||||||
|
auto dest = i2p::client::context.GetSharedLocalDestination ();
|
||||||
|
InsertParam (results, "i2p.router.status", (dest && dest->IsReady ()) ? "1" : "0");
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2PControlService::NetDbKnownPeersHandler (std::ostringstream& results)
|
||||||
|
{
|
||||||
|
InsertParam (results, "i2p.router.netdb.knownpeers", i2p::data::netdb.GetNumRouters ());
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2PControlService::NetDbActivePeersHandler (std::ostringstream& results)
|
||||||
|
{
|
||||||
|
InsertParam (results, "i2p.router.netdb.activepeers", (int)i2p::transport::transports.GetPeers ().size ());
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2PControlService::NetStatusHandler (std::ostringstream& results)
|
||||||
|
{
|
||||||
|
InsertParam (results, "i2p.router.net.status", (int)i2p::context.GetStatus ());
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2PControlService::TunnelsParticipatingHandler (std::ostringstream& results)
|
||||||
|
{
|
||||||
|
int transit = i2p::tunnel::tunnels.GetTransitTunnels ().size ();
|
||||||
|
InsertParam (results, "i2p.router.net.tunnels.participating", transit);
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2PControlService::TunnelsSuccessRateHandler (std::ostringstream& results)
|
||||||
|
{
|
||||||
|
int rate = i2p::tunnel::tunnels.GetTunnelCreationSuccessRate ();
|
||||||
|
InsertParam (results, "i2p.router.net.tunnels.successrate", rate);
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2PControlService::InboundBandwidth1S (std::ostringstream& results)
|
||||||
|
{
|
||||||
|
double bw = i2p::transport::transports.GetInBandwidth ();
|
||||||
|
InsertParam (results, "i2p.router.net.bw.inbound.1s", bw);
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2PControlService::OutboundBandwidth1S (std::ostringstream& results)
|
||||||
|
{
|
||||||
|
double bw = i2p::transport::transports.GetOutBandwidth ();
|
||||||
|
InsertParam (results, "i2p.router.net.bw.outbound.1s", bw);
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2PControlService::NetTotalReceivedBytes (std::ostringstream& results)
|
||||||
|
{
|
||||||
|
InsertParam (results, "i2p.router.net.total.received.bytes", (double)i2p::transport::transports.GetTotalReceivedBytes ());
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2PControlService::NetTotalSentBytes (std::ostringstream& results)
|
||||||
|
{
|
||||||
|
InsertParam (results, "i2p.router.net.total.sent.bytes", (double)i2p::transport::transports.GetTotalSentBytes ());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// RouterManager
|
// RouterManager
|
||||||
|
|
||||||
@@ -382,6 +538,37 @@ namespace client
|
|||||||
i2p::data::netdb.Reseed ();
|
i2p::data::netdb.Reseed ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// network setting
|
||||||
|
void I2PControlService::NetworkSettingHandler (const boost::property_tree::ptree& params, std::ostringstream& results)
|
||||||
|
{
|
||||||
|
for (auto it = params.begin (); it != params.end (); it++)
|
||||||
|
{
|
||||||
|
LogPrint (eLogDebug, "I2PControl: NetworkSetting request: ", it->first);
|
||||||
|
auto it1 = m_NetworkSettingHandlers.find (it->first);
|
||||||
|
if (it1 != m_NetworkSettingHandlers.end ()) {
|
||||||
|
if (it != params.begin ()) results << ",";
|
||||||
|
(this->*(it1->second))(it->second.data (), results);
|
||||||
|
} else
|
||||||
|
LogPrint (eLogError, "I2PControl: NetworkSetting unknown request: ", it->first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2PControlService::InboundBandwidthLimit (const std::string& value, std::ostringstream& results)
|
||||||
|
{
|
||||||
|
if (value != "null")
|
||||||
|
i2p::context.SetBandwidth (std::atoi(value.c_str()));
|
||||||
|
int bw = i2p::context.GetBandwidthLimit();
|
||||||
|
InsertParam (results, "i2p.router.net.bw.in", bw);
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2PControlService::OutboundBandwidthLimit (const std::string& value, std::ostringstream& results)
|
||||||
|
{
|
||||||
|
if (value != "null")
|
||||||
|
i2p::context.SetBandwidth (std::atoi(value.c_str()));
|
||||||
|
int bw = i2p::context.GetBandwidthLimit();
|
||||||
|
InsertParam (results, "i2p.router.net.bw.out", bw);
|
||||||
|
}
|
||||||
|
|
||||||
// certificate
|
// certificate
|
||||||
void I2PControlService::CreateCertificate (const char *crt_path, const char *key_path)
|
void I2PControlService::CreateCertificate (const char *crt_path, const char *key_path)
|
||||||
{
|
{
|
||||||
@@ -430,5 +617,184 @@ namespace client
|
|||||||
}
|
}
|
||||||
EVP_PKEY_free (pkey);
|
EVP_PKEY_free (pkey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ClientServicesInfo
|
||||||
|
void I2PControlService::ClientServicesInfoHandler (const boost::property_tree::ptree& params, std::ostringstream& results)
|
||||||
|
{
|
||||||
|
for (auto it = params.begin (); it != params.end (); it++)
|
||||||
|
{
|
||||||
|
LogPrint (eLogDebug, "I2PControl: ClientServicesInfo request: ", it->first);
|
||||||
|
auto it1 = m_ClientServicesInfoHandlers.find (it->first);
|
||||||
|
if (it1 != m_ClientServicesInfoHandlers.end ())
|
||||||
|
{
|
||||||
|
if (it != params.begin ()) results << ",";
|
||||||
|
(this->*(it1->second))(results);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
LogPrint (eLogError, "I2PControl: ClientServicesInfo unknown request ", it->first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2PControlService::I2PTunnelInfoHandler (std::ostringstream& results)
|
||||||
|
{
|
||||||
|
boost::property_tree::ptree pt;
|
||||||
|
boost::property_tree::ptree client_tunnels, server_tunnels;
|
||||||
|
|
||||||
|
for (auto& it: i2p::client::context.GetClientTunnels ())
|
||||||
|
{
|
||||||
|
auto& ident = it.second->GetLocalDestination ()->GetIdentHash();
|
||||||
|
boost::property_tree::ptree ct;
|
||||||
|
ct.put("address", i2p::client::context.GetAddressBook ().ToAddress(ident));
|
||||||
|
client_tunnels.add_child(it.second->GetName (), ct);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto& serverTunnels = i2p::client::context.GetServerTunnels ();
|
||||||
|
if (!serverTunnels.empty ()) {
|
||||||
|
for (auto& it: serverTunnels)
|
||||||
|
{
|
||||||
|
auto& ident = it.second->GetLocalDestination ()->GetIdentHash();
|
||||||
|
boost::property_tree::ptree st;
|
||||||
|
st.put("address", i2p::client::context.GetAddressBook ().ToAddress(ident));
|
||||||
|
st.put("port", it.second->GetLocalPort ());
|
||||||
|
server_tunnels.add_child(it.second->GetName (), st);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto& clientForwards = i2p::client::context.GetClientForwards ();
|
||||||
|
if (!clientForwards.empty ())
|
||||||
|
{
|
||||||
|
for (auto& it: clientForwards)
|
||||||
|
{
|
||||||
|
auto& ident = it.second->GetLocalDestination ()->GetIdentHash();
|
||||||
|
boost::property_tree::ptree ct;
|
||||||
|
ct.put("address", i2p::client::context.GetAddressBook ().ToAddress(ident));
|
||||||
|
client_tunnels.add_child(it.second->GetName (), ct);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto& serverForwards = i2p::client::context.GetServerForwards ();
|
||||||
|
if (!serverForwards.empty ())
|
||||||
|
{
|
||||||
|
for (auto& it: serverForwards)
|
||||||
|
{
|
||||||
|
auto& ident = it.second->GetLocalDestination ()->GetIdentHash();
|
||||||
|
boost::property_tree::ptree st;
|
||||||
|
st.put("address", i2p::client::context.GetAddressBook ().ToAddress(ident));
|
||||||
|
server_tunnels.add_child(it.second->GetName (), st);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pt.add_child("client", client_tunnels);
|
||||||
|
pt.add_child("server", server_tunnels);
|
||||||
|
|
||||||
|
InsertParam (results, "I2PTunnel", pt);
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2PControlService::HTTPProxyInfoHandler (std::ostringstream& results)
|
||||||
|
{
|
||||||
|
boost::property_tree::ptree pt;
|
||||||
|
|
||||||
|
auto httpProxy = i2p::client::context.GetHttpProxy ();
|
||||||
|
if (httpProxy)
|
||||||
|
{
|
||||||
|
auto& ident = httpProxy->GetLocalDestination ()->GetIdentHash();
|
||||||
|
pt.put("enabled", true);
|
||||||
|
pt.put("address", i2p::client::context.GetAddressBook ().ToAddress(ident));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pt.put("enabled", false);
|
||||||
|
|
||||||
|
InsertParam (results, "HTTPProxy", pt);
|
||||||
|
}
|
||||||
|
|
||||||
|
void I2PControlService::SOCKSInfoHandler (std::ostringstream& results)
|
||||||
|
{
|
||||||
|
boost::property_tree::ptree pt;
|
||||||
|
|
||||||
|
auto socksProxy = i2p::client::context.GetSocksProxy ();
|
||||||
|
if (socksProxy)
|
||||||
|
{
|
||||||
|
auto& ident = socksProxy->GetLocalDestination ()->GetIdentHash();
|
||||||
|
pt.put("enabled", true);
|
||||||
|
pt.put("address", i2p::client::context.GetAddressBook ().ToAddress(ident));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pt.put("enabled", false);
|
||||||
|
|
||||||
|
InsertParam (results, "SOCKS", pt);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WITH_SAM
|
||||||
|
void I2PControlService::SAMInfoHandler (std::ostringstream& results)
|
||||||
|
{
|
||||||
|
boost::property_tree::ptree pt;
|
||||||
|
auto sam = i2p::client::context.GetSAMBridge ();
|
||||||
|
if (sam)
|
||||||
|
{
|
||||||
|
pt.put("enabled", true);
|
||||||
|
boost::property_tree::ptree sam_sessions;
|
||||||
|
for (auto& it: sam->GetSessions ())
|
||||||
|
{
|
||||||
|
boost::property_tree::ptree sam_session, sam_session_sockets;
|
||||||
|
auto& name = it.second->GetLocalDestination ()->GetNickname ();
|
||||||
|
auto& ident = it.second->GetLocalDestination ()->GetIdentHash();
|
||||||
|
sam_session.put("name", name);
|
||||||
|
sam_session.put("address", i2p::client::context.GetAddressBook ().ToAddress(ident));
|
||||||
|
|
||||||
|
for (const auto& socket: sam->ListSockets(it.first))
|
||||||
|
{
|
||||||
|
boost::property_tree::ptree stream;
|
||||||
|
stream.put("type", socket->GetSocketType ());
|
||||||
|
stream.put("peer", socket->GetSocket ().remote_endpoint());
|
||||||
|
|
||||||
|
sam_session_sockets.push_back(std::make_pair("", stream));
|
||||||
|
}
|
||||||
|
sam_session.add_child("sockets", sam_session_sockets);
|
||||||
|
sam_sessions.add_child(it.first, sam_session);
|
||||||
|
}
|
||||||
|
|
||||||
|
pt.add_child("sessions", sam_sessions);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pt.put("enabled", false);
|
||||||
|
|
||||||
|
InsertParam (results, "SAM", pt);
|
||||||
|
}
|
||||||
|
#endif // WITH_SAM
|
||||||
|
|
||||||
|
#ifdef WITH_BOB
|
||||||
|
void I2PControlService::BOBInfoHandler (std::ostringstream& results)
|
||||||
|
{
|
||||||
|
boost::property_tree::ptree pt;
|
||||||
|
auto bob = i2p::client::context.GetBOBCommandChannel ();
|
||||||
|
if (bob)
|
||||||
|
{
|
||||||
|
/* TODO more info */
|
||||||
|
pt.put("enabled", true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pt.put("enabled", false);
|
||||||
|
|
||||||
|
InsertParam (results, "BOB", pt);
|
||||||
|
}
|
||||||
|
#endif // WITH_BOB
|
||||||
|
|
||||||
|
#ifdef WITH_I2CP
|
||||||
|
void I2PControlService::I2CPInfoHandler (std::ostringstream& results)
|
||||||
|
{
|
||||||
|
boost::property_tree::ptree pt;
|
||||||
|
auto i2cp = i2p::client::context.GetI2CPServer ();
|
||||||
|
if (i2cp)
|
||||||
|
{
|
||||||
|
/* TODO more info */
|
||||||
|
pt.put("enabled", true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pt.put("enabled", false);
|
||||||
|
|
||||||
|
InsertParam (results, "I2CP", pt);
|
||||||
|
}
|
||||||
|
#endif // WITH_I2CP
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif // WITH_I2PC
|
||||||
@@ -6,6 +6,8 @@
|
|||||||
* See full license text in LICENSE file at top of project tree
|
* See full license text in LICENSE file at top of project tree
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifdef WITH_I2PC
|
||||||
|
|
||||||
#ifndef I2P_CONTROL_H__
|
#ifndef I2P_CONTROL_H__
|
||||||
#define I2P_CONTROL_H__
|
#define I2P_CONTROL_H__
|
||||||
|
|
||||||
@@ -20,7 +22,6 @@
|
|||||||
#include <boost/asio.hpp>
|
#include <boost/asio.hpp>
|
||||||
#include <boost/asio/ssl.hpp>
|
#include <boost/asio/ssl.hpp>
|
||||||
#include <boost/property_tree/ptree.hpp>
|
#include <boost/property_tree/ptree.hpp>
|
||||||
#include "I2PControlHandlers.h"
|
|
||||||
|
|
||||||
namespace i2p
|
namespace i2p
|
||||||
{
|
{
|
||||||
@@ -33,7 +34,7 @@ namespace client
|
|||||||
const char I2P_CONTROL_CERTIFICATE_COMMON_NAME[] = "i2pd.i2pcontrol";
|
const char I2P_CONTROL_CERTIFICATE_COMMON_NAME[] = "i2pd.i2pcontrol";
|
||||||
const char I2P_CONTROL_CERTIFICATE_ORGANIZATION[] = "Purple I2P";
|
const char I2P_CONTROL_CERTIFICATE_ORGANIZATION[] = "Purple I2P";
|
||||||
|
|
||||||
class I2PControlService: public I2PControlHandlers
|
class I2PControlService
|
||||||
{
|
{
|
||||||
typedef boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssl_socket;
|
typedef boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssl_socket;
|
||||||
|
|
||||||
@@ -64,24 +65,67 @@ namespace client
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void InsertParam (std::ostringstream& ss, const std::string& name, int value) const;
|
||||||
|
void InsertParam (std::ostringstream& ss, const std::string& name, double value) const;
|
||||||
|
void InsertParam (std::ostringstream& ss, const std::string& name, const std::string& value, bool quotes = true) const;
|
||||||
|
void InsertParam (std::ostringstream& ss, const std::string& name, const boost::property_tree::ptree& value) const;
|
||||||
|
|
||||||
// methods
|
// methods
|
||||||
typedef void (I2PControlService::*MethodHandler)(const boost::property_tree::ptree& params, std::ostringstream& results);
|
typedef void (I2PControlService::*MethodHandler)(const boost::property_tree::ptree& params, std::ostringstream& results);
|
||||||
|
|
||||||
void AuthenticateHandler (const boost::property_tree::ptree& params, std::ostringstream& results);
|
void AuthenticateHandler (const boost::property_tree::ptree& params, std::ostringstream& results);
|
||||||
void EchoHandler (const boost::property_tree::ptree& params, std::ostringstream& results);
|
void EchoHandler (const boost::property_tree::ptree& params, std::ostringstream& results);
|
||||||
void I2PControlHandler (const boost::property_tree::ptree& params, std::ostringstream& results);
|
void I2PControlHandler (const boost::property_tree::ptree& params, std::ostringstream& results);
|
||||||
|
void RouterInfoHandler (const boost::property_tree::ptree& params, std::ostringstream& results);
|
||||||
void RouterManagerHandler (const boost::property_tree::ptree& params, std::ostringstream& results);
|
void RouterManagerHandler (const boost::property_tree::ptree& params, std::ostringstream& results);
|
||||||
|
void NetworkSettingHandler (const boost::property_tree::ptree& params, std::ostringstream& results);
|
||||||
|
void ClientServicesInfoHandler (const boost::property_tree::ptree& params, std::ostringstream& results);
|
||||||
|
|
||||||
// I2PControl
|
// I2PControl
|
||||||
typedef void (I2PControlService::*I2PControlRequestHandler)(const std::string& value);
|
typedef void (I2PControlService::*I2PControlRequestHandler)(const std::string& value);
|
||||||
void PasswordHandler (const std::string& value);
|
void PasswordHandler (const std::string& value);
|
||||||
|
|
||||||
|
// RouterInfo
|
||||||
|
typedef void (I2PControlService::*RouterInfoRequestHandler)(std::ostringstream& results);
|
||||||
|
void UptimeHandler (std::ostringstream& results);
|
||||||
|
void VersionHandler (std::ostringstream& results);
|
||||||
|
void StatusHandler (std::ostringstream& results);
|
||||||
|
void NetDbKnownPeersHandler (std::ostringstream& results);
|
||||||
|
void NetDbActivePeersHandler (std::ostringstream& results);
|
||||||
|
void NetStatusHandler (std::ostringstream& results);
|
||||||
|
void TunnelsParticipatingHandler (std::ostringstream& results);
|
||||||
|
void TunnelsSuccessRateHandler (std::ostringstream& results);
|
||||||
|
void InboundBandwidth1S (std::ostringstream& results);
|
||||||
|
void OutboundBandwidth1S (std::ostringstream& results);
|
||||||
|
void NetTotalReceivedBytes (std::ostringstream& results);
|
||||||
|
void NetTotalSentBytes (std::ostringstream& results);
|
||||||
|
|
||||||
// RouterManager
|
// RouterManager
|
||||||
typedef void (I2PControlService::*RouterManagerRequestHandler)(std::ostringstream& results);
|
typedef void (I2PControlService::*RouterManagerRequestHandler)(std::ostringstream& results);
|
||||||
void ShutdownHandler (std::ostringstream& results);
|
void ShutdownHandler (std::ostringstream& results);
|
||||||
void ShutdownGracefulHandler (std::ostringstream& results);
|
void ShutdownGracefulHandler (std::ostringstream& results);
|
||||||
void ReseedHandler (std::ostringstream& results);
|
void ReseedHandler (std::ostringstream& results);
|
||||||
|
|
||||||
|
// NetworkSetting
|
||||||
|
typedef void (I2PControlService::*NetworkSettingRequestHandler)(const std::string& value, std::ostringstream& results);
|
||||||
|
void InboundBandwidthLimit (const std::string& value, std::ostringstream& results);
|
||||||
|
void OutboundBandwidthLimit (const std::string& value, std::ostringstream& results);
|
||||||
|
|
||||||
|
// ClientServicesInfo
|
||||||
|
typedef void (I2PControlService::*ClientServicesInfoRequestHandler)(std::ostringstream& results);
|
||||||
|
void I2PTunnelInfoHandler (std::ostringstream& results);
|
||||||
|
void HTTPProxyInfoHandler (std::ostringstream& results);
|
||||||
|
void SOCKSInfoHandler (std::ostringstream& results);
|
||||||
|
#ifdef WITH_SAM
|
||||||
|
void SAMInfoHandler (std::ostringstream& results);
|
||||||
|
#endif
|
||||||
|
#ifdef WITH_BOB
|
||||||
|
void BOBInfoHandler (std::ostringstream& results);
|
||||||
|
#endif
|
||||||
|
#ifdef WITH_I2CP
|
||||||
|
void I2CPInfoHandler (std::ostringstream& results);
|
||||||
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
std::string m_Password;
|
std::string m_Password;
|
||||||
@@ -96,9 +140,13 @@ namespace client
|
|||||||
|
|
||||||
std::map<std::string, MethodHandler> m_MethodHandlers;
|
std::map<std::string, MethodHandler> m_MethodHandlers;
|
||||||
std::map<std::string, I2PControlRequestHandler> m_I2PControlHandlers;
|
std::map<std::string, I2PControlRequestHandler> m_I2PControlHandlers;
|
||||||
|
std::map<std::string, RouterInfoRequestHandler> m_RouterInfoHandlers;
|
||||||
std::map<std::string, RouterManagerRequestHandler> m_RouterManagerHandlers;
|
std::map<std::string, RouterManagerRequestHandler> m_RouterManagerHandlers;
|
||||||
|
std::map<std::string, NetworkSettingRequestHandler> m_NetworkSettingHandlers;
|
||||||
|
std::map<std::string, ClientServicesInfoRequestHandler> m_ClientServicesInfoHandlers;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
#endif // WITH_I2PC
|
||||||
@@ -1,390 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2013-2022, The PurpleI2P Project
|
|
||||||
*
|
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
|
||||||
*
|
|
||||||
* See full license text in LICENSE file at top of project tree
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <iomanip>
|
|
||||||
#define BOOST_BIND_GLOBAL_PLACEHOLDERS
|
|
||||||
#include <boost/lexical_cast.hpp>
|
|
||||||
#include <boost/property_tree/json_parser.hpp>
|
|
||||||
|
|
||||||
#include "Log.h"
|
|
||||||
#include "RouterContext.h"
|
|
||||||
#include "NetDb.hpp"
|
|
||||||
#include "Tunnel.h"
|
|
||||||
#include "Transports.h"
|
|
||||||
#include "version.h"
|
|
||||||
#include "ClientContext.h"
|
|
||||||
#include "I2PControlHandlers.h"
|
|
||||||
|
|
||||||
namespace i2p
|
|
||||||
{
|
|
||||||
namespace client
|
|
||||||
{
|
|
||||||
I2PControlHandlers::I2PControlHandlers ()
|
|
||||||
{
|
|
||||||
// RouterInfo
|
|
||||||
m_RouterInfoHandlers["i2p.router.uptime"] = &I2PControlHandlers::UptimeHandler;
|
|
||||||
m_RouterInfoHandlers["i2p.router.version"] = &I2PControlHandlers::VersionHandler;
|
|
||||||
m_RouterInfoHandlers["i2p.router.status"] = &I2PControlHandlers::StatusHandler;
|
|
||||||
m_RouterInfoHandlers["i2p.router.netdb.knownpeers"] = &I2PControlHandlers::NetDbKnownPeersHandler;
|
|
||||||
m_RouterInfoHandlers["i2p.router.netdb.activepeers"] = &I2PControlHandlers::NetDbActivePeersHandler;
|
|
||||||
m_RouterInfoHandlers["i2p.router.net.bw.inbound.1s"] = &I2PControlHandlers::InboundBandwidth1S;
|
|
||||||
m_RouterInfoHandlers["i2p.router.net.bw.inbound.15s"] = &I2PControlHandlers::InboundBandwidth15S;
|
|
||||||
m_RouterInfoHandlers["i2p.router.net.bw.outbound.1s"] = &I2PControlHandlers::OutboundBandwidth1S;
|
|
||||||
m_RouterInfoHandlers["i2p.router.net.bw.outbound.15s"] = &I2PControlHandlers::OutboundBandwidth15S;
|
|
||||||
m_RouterInfoHandlers["i2p.router.net.status"] = &I2PControlHandlers::NetStatusHandler;
|
|
||||||
m_RouterInfoHandlers["i2p.router.net.tunnels.participating"] = &I2PControlHandlers::TunnelsParticipatingHandler;
|
|
||||||
m_RouterInfoHandlers["i2p.router.net.tunnels.successrate"] = &I2PControlHandlers::TunnelsSuccessRateHandler;
|
|
||||||
m_RouterInfoHandlers["i2p.router.net.total.received.bytes"] = &I2PControlHandlers::NetTotalReceivedBytes;
|
|
||||||
m_RouterInfoHandlers["i2p.router.net.total.sent.bytes"] = &I2PControlHandlers::NetTotalSentBytes;
|
|
||||||
|
|
||||||
// NetworkSetting
|
|
||||||
m_NetworkSettingHandlers["i2p.router.net.bw.in"] = &I2PControlHandlers::InboundBandwidthLimit;
|
|
||||||
m_NetworkSettingHandlers["i2p.router.net.bw.out"] = &I2PControlHandlers::OutboundBandwidthLimit;
|
|
||||||
|
|
||||||
// ClientServicesInfo
|
|
||||||
m_ClientServicesInfoHandlers["I2PTunnel"] = &I2PControlHandlers::I2PTunnelInfoHandler;
|
|
||||||
m_ClientServicesInfoHandlers["HTTPProxy"] = &I2PControlHandlers::HTTPProxyInfoHandler;
|
|
||||||
m_ClientServicesInfoHandlers["SOCKS"] = &I2PControlHandlers::SOCKSInfoHandler;
|
|
||||||
m_ClientServicesInfoHandlers["SAM"] = &I2PControlHandlers::SAMInfoHandler;
|
|
||||||
m_ClientServicesInfoHandlers["BOB"] = &I2PControlHandlers::BOBInfoHandler;
|
|
||||||
m_ClientServicesInfoHandlers["I2CP"] = &I2PControlHandlers::I2CPInfoHandler;
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::InsertParam (std::ostringstream& ss, const std::string& name, int value) const
|
|
||||||
{
|
|
||||||
ss << "\"" << name << "\":" << value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::InsertParam (std::ostringstream& ss, const std::string& name, const std::string& value, bool quotes) const
|
|
||||||
{
|
|
||||||
ss << "\"" << name << "\":";
|
|
||||||
if (value.length () > 0)
|
|
||||||
{
|
|
||||||
if (quotes)
|
|
||||||
ss << "\"" << value << "\"";
|
|
||||||
else
|
|
||||||
ss << value;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ss << "null";
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::InsertParam (std::ostringstream& ss, const std::string& name, double value) const
|
|
||||||
{
|
|
||||||
ss << "\"" << name << "\":" << std::fixed << std::setprecision(2) << value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::InsertParam (std::ostringstream& ss, const std::string& name, const boost::property_tree::ptree& value) const
|
|
||||||
{
|
|
||||||
std::ostringstream buf;
|
|
||||||
boost::property_tree::write_json (buf, value, false);
|
|
||||||
ss << "\"" << name << "\":" << buf.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
// RouterInfo
|
|
||||||
|
|
||||||
void I2PControlHandlers::RouterInfoHandler (const boost::property_tree::ptree& params, std::ostringstream& results)
|
|
||||||
{
|
|
||||||
bool first = true;
|
|
||||||
for (auto it = params.begin (); it != params.end (); it++)
|
|
||||||
{
|
|
||||||
LogPrint (eLogDebug, "I2PControl: RouterInfo request: ", it->first);
|
|
||||||
auto it1 = m_RouterInfoHandlers.find (it->first);
|
|
||||||
if (it1 != m_RouterInfoHandlers.end ())
|
|
||||||
{
|
|
||||||
if (!first) results << ",";
|
|
||||||
else first = false;
|
|
||||||
(this->*(it1->second))(results);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
LogPrint (eLogError, "I2PControl: RouterInfo unknown request ", it->first);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::UptimeHandler (std::ostringstream& results)
|
|
||||||
{
|
|
||||||
InsertParam (results, "i2p.router.uptime", std::to_string (i2p::context.GetUptime ()*1000LL), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::VersionHandler (std::ostringstream& results)
|
|
||||||
{
|
|
||||||
InsertParam (results, "i2p.router.version", VERSION);
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::StatusHandler (std::ostringstream& results)
|
|
||||||
{
|
|
||||||
auto dest = i2p::client::context.GetSharedLocalDestination ();
|
|
||||||
InsertParam (results, "i2p.router.status", (dest && dest->IsReady ()) ? "1" : "0");
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::NetDbKnownPeersHandler (std::ostringstream& results)
|
|
||||||
{
|
|
||||||
InsertParam (results, "i2p.router.netdb.knownpeers", i2p::data::netdb.GetNumRouters ());
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::NetDbActivePeersHandler (std::ostringstream& results)
|
|
||||||
{
|
|
||||||
InsertParam (results, "i2p.router.netdb.activepeers", (int)i2p::transport::transports.GetPeers ().size ());
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::NetStatusHandler (std::ostringstream& results)
|
|
||||||
{
|
|
||||||
InsertParam (results, "i2p.router.net.status", (int)i2p::context.GetStatus ());
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::TunnelsParticipatingHandler (std::ostringstream& results)
|
|
||||||
{
|
|
||||||
int transit = i2p::tunnel::tunnels.GetTransitTunnels ().size ();
|
|
||||||
InsertParam (results, "i2p.router.net.tunnels.participating", transit);
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::TunnelsSuccessRateHandler (std::ostringstream& results)
|
|
||||||
{
|
|
||||||
int rate = i2p::tunnel::tunnels.GetTunnelCreationSuccessRate ();
|
|
||||||
InsertParam (results, "i2p.router.net.tunnels.successrate", rate);
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::InboundBandwidth1S (std::ostringstream& results)
|
|
||||||
{
|
|
||||||
double bw = i2p::transport::transports.GetInBandwidth ();
|
|
||||||
InsertParam (results, "i2p.router.net.bw.inbound.1s", bw);
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::InboundBandwidth15S (std::ostringstream& results)
|
|
||||||
{
|
|
||||||
double bw = i2p::transport::transports.GetInBandwidth15s ();
|
|
||||||
InsertParam (results, "i2p.router.net.bw.inbound.15s", bw);
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::OutboundBandwidth1S (std::ostringstream& results)
|
|
||||||
{
|
|
||||||
double bw = i2p::transport::transports.GetOutBandwidth ();
|
|
||||||
InsertParam (results, "i2p.router.net.bw.outbound.1s", bw);
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::OutboundBandwidth15S (std::ostringstream& results)
|
|
||||||
{
|
|
||||||
double bw = i2p::transport::transports.GetOutBandwidth15s ();
|
|
||||||
InsertParam (results, "i2p.router.net.bw.outbound.15s", bw);
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::NetTotalReceivedBytes (std::ostringstream& results)
|
|
||||||
{
|
|
||||||
InsertParam (results, "i2p.router.net.total.received.bytes", (double)i2p::transport::transports.GetTotalReceivedBytes ());
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::NetTotalSentBytes (std::ostringstream& results)
|
|
||||||
{
|
|
||||||
InsertParam (results, "i2p.router.net.total.sent.bytes", (double)i2p::transport::transports.GetTotalSentBytes ());
|
|
||||||
}
|
|
||||||
|
|
||||||
// network setting
|
|
||||||
void I2PControlHandlers::NetworkSettingHandler (const boost::property_tree::ptree& params, std::ostringstream& results)
|
|
||||||
{
|
|
||||||
for (auto it = params.begin (); it != params.end (); it++)
|
|
||||||
{
|
|
||||||
LogPrint (eLogDebug, "I2PControl: NetworkSetting request: ", it->first);
|
|
||||||
auto it1 = m_NetworkSettingHandlers.find (it->first);
|
|
||||||
if (it1 != m_NetworkSettingHandlers.end ()) {
|
|
||||||
if (it != params.begin ()) results << ",";
|
|
||||||
(this->*(it1->second))(it->second.data (), results);
|
|
||||||
} else
|
|
||||||
LogPrint (eLogError, "I2PControl: NetworkSetting unknown request: ", it->first);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::InboundBandwidthLimit (const std::string& value, std::ostringstream& results)
|
|
||||||
{
|
|
||||||
if (value != "null")
|
|
||||||
i2p::context.SetBandwidth (std::atoi(value.c_str()));
|
|
||||||
int bw = i2p::context.GetBandwidthLimit();
|
|
||||||
InsertParam (results, "i2p.router.net.bw.in", bw);
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::OutboundBandwidthLimit (const std::string& value, std::ostringstream& results)
|
|
||||||
{
|
|
||||||
if (value != "null")
|
|
||||||
i2p::context.SetBandwidth (std::atoi(value.c_str()));
|
|
||||||
int bw = i2p::context.GetBandwidthLimit();
|
|
||||||
InsertParam (results, "i2p.router.net.bw.out", bw);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ClientServicesInfo
|
|
||||||
|
|
||||||
void I2PControlHandlers::ClientServicesInfoHandler (const boost::property_tree::ptree& params, std::ostringstream& results)
|
|
||||||
{
|
|
||||||
for (auto it = params.begin (); it != params.end (); it++)
|
|
||||||
{
|
|
||||||
LogPrint (eLogDebug, "I2PControl: ClientServicesInfo request: ", it->first);
|
|
||||||
auto it1 = m_ClientServicesInfoHandlers.find (it->first);
|
|
||||||
if (it1 != m_ClientServicesInfoHandlers.end ())
|
|
||||||
{
|
|
||||||
if (it != params.begin ()) results << ",";
|
|
||||||
(this->*(it1->second))(results);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
LogPrint (eLogError, "I2PControl: ClientServicesInfo unknown request ", it->first);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::I2PTunnelInfoHandler (std::ostringstream& results)
|
|
||||||
{
|
|
||||||
boost::property_tree::ptree pt;
|
|
||||||
boost::property_tree::ptree client_tunnels, server_tunnels;
|
|
||||||
|
|
||||||
for (auto& it: i2p::client::context.GetClientTunnels ())
|
|
||||||
{
|
|
||||||
auto& ident = it.second->GetLocalDestination ()->GetIdentHash();
|
|
||||||
boost::property_tree::ptree ct;
|
|
||||||
ct.put("address", i2p::client::context.GetAddressBook ().ToAddress(ident));
|
|
||||||
client_tunnels.add_child(it.second->GetName (), ct);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto& serverTunnels = i2p::client::context.GetServerTunnels ();
|
|
||||||
if (!serverTunnels.empty ()) {
|
|
||||||
for (auto& it: serverTunnels)
|
|
||||||
{
|
|
||||||
auto& ident = it.second->GetLocalDestination ()->GetIdentHash();
|
|
||||||
boost::property_tree::ptree st;
|
|
||||||
st.put("address", i2p::client::context.GetAddressBook ().ToAddress(ident));
|
|
||||||
st.put("port", it.second->GetLocalPort ());
|
|
||||||
server_tunnels.add_child(it.second->GetName (), st);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
auto& clientForwards = i2p::client::context.GetClientForwards ();
|
|
||||||
if (!clientForwards.empty ())
|
|
||||||
{
|
|
||||||
for (auto& it: clientForwards)
|
|
||||||
{
|
|
||||||
auto& ident = it.second->GetLocalDestination ()->GetIdentHash();
|
|
||||||
boost::property_tree::ptree ct;
|
|
||||||
ct.put("address", i2p::client::context.GetAddressBook ().ToAddress(ident));
|
|
||||||
client_tunnels.add_child(it.second->GetName (), ct);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
auto& serverForwards = i2p::client::context.GetServerForwards ();
|
|
||||||
if (!serverForwards.empty ())
|
|
||||||
{
|
|
||||||
for (auto& it: serverForwards)
|
|
||||||
{
|
|
||||||
auto& ident = it.second->GetLocalDestination ()->GetIdentHash();
|
|
||||||
boost::property_tree::ptree st;
|
|
||||||
st.put("address", i2p::client::context.GetAddressBook ().ToAddress(ident));
|
|
||||||
server_tunnels.add_child(it.second->GetName (), st);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pt.add_child("client", client_tunnels);
|
|
||||||
pt.add_child("server", server_tunnels);
|
|
||||||
|
|
||||||
InsertParam (results, "I2PTunnel", pt);
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::HTTPProxyInfoHandler (std::ostringstream& results)
|
|
||||||
{
|
|
||||||
boost::property_tree::ptree pt;
|
|
||||||
|
|
||||||
auto httpProxy = i2p::client::context.GetHttpProxy ();
|
|
||||||
if (httpProxy)
|
|
||||||
{
|
|
||||||
auto& ident = httpProxy->GetLocalDestination ()->GetIdentHash();
|
|
||||||
pt.put("enabled", true);
|
|
||||||
pt.put("address", i2p::client::context.GetAddressBook ().ToAddress(ident));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
pt.put("enabled", false);
|
|
||||||
|
|
||||||
InsertParam (results, "HTTPProxy", pt);
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::SOCKSInfoHandler (std::ostringstream& results)
|
|
||||||
{
|
|
||||||
boost::property_tree::ptree pt;
|
|
||||||
|
|
||||||
auto socksProxy = i2p::client::context.GetSocksProxy ();
|
|
||||||
if (socksProxy)
|
|
||||||
{
|
|
||||||
auto& ident = socksProxy->GetLocalDestination ()->GetIdentHash();
|
|
||||||
pt.put("enabled", true);
|
|
||||||
pt.put("address", i2p::client::context.GetAddressBook ().ToAddress(ident));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
pt.put("enabled", false);
|
|
||||||
|
|
||||||
InsertParam (results, "SOCKS", pt);
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::SAMInfoHandler (std::ostringstream& results)
|
|
||||||
{
|
|
||||||
boost::property_tree::ptree pt;
|
|
||||||
auto sam = i2p::client::context.GetSAMBridge ();
|
|
||||||
if (sam)
|
|
||||||
{
|
|
||||||
pt.put("enabled", true);
|
|
||||||
boost::property_tree::ptree sam_sessions;
|
|
||||||
for (auto& it: sam->GetSessions ())
|
|
||||||
{
|
|
||||||
boost::property_tree::ptree sam_session, sam_session_sockets;
|
|
||||||
auto& name = it.second->GetLocalDestination ()->GetNickname ();
|
|
||||||
auto& ident = it.second->GetLocalDestination ()->GetIdentHash();
|
|
||||||
sam_session.put("name", name);
|
|
||||||
sam_session.put("address", i2p::client::context.GetAddressBook ().ToAddress(ident));
|
|
||||||
|
|
||||||
for (const auto& socket: sam->ListSockets(it.first))
|
|
||||||
{
|
|
||||||
boost::property_tree::ptree stream;
|
|
||||||
stream.put("type", socket->GetSocketType ());
|
|
||||||
stream.put("peer", socket->GetSocket ().remote_endpoint());
|
|
||||||
|
|
||||||
sam_session_sockets.push_back(std::make_pair("", stream));
|
|
||||||
}
|
|
||||||
sam_session.add_child("sockets", sam_session_sockets);
|
|
||||||
sam_sessions.add_child(it.first, sam_session);
|
|
||||||
}
|
|
||||||
|
|
||||||
pt.add_child("sessions", sam_sessions);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
pt.put("enabled", false);
|
|
||||||
|
|
||||||
InsertParam (results, "SAM", pt);
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::BOBInfoHandler (std::ostringstream& results)
|
|
||||||
{
|
|
||||||
boost::property_tree::ptree pt;
|
|
||||||
auto bob = i2p::client::context.GetBOBCommandChannel ();
|
|
||||||
if (bob)
|
|
||||||
{
|
|
||||||
/* TODO more info */
|
|
||||||
pt.put("enabled", true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
pt.put("enabled", false);
|
|
||||||
|
|
||||||
InsertParam (results, "BOB", pt);
|
|
||||||
}
|
|
||||||
|
|
||||||
void I2PControlHandlers::I2CPInfoHandler (std::ostringstream& results)
|
|
||||||
{
|
|
||||||
boost::property_tree::ptree pt;
|
|
||||||
auto i2cp = i2p::client::context.GetI2CPServer ();
|
|
||||||
if (i2cp)
|
|
||||||
{
|
|
||||||
/* TODO more info */
|
|
||||||
pt.put("enabled", true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
pt.put("enabled", false);
|
|
||||||
|
|
||||||
InsertParam (results, "I2CP", pt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2013-2022, The PurpleI2P Project
|
|
||||||
*
|
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
|
||||||
*
|
|
||||||
* See full license text in LICENSE file at top of project tree
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef I2P_CONTROL_HANDLERS_H__
|
|
||||||
#define I2P_CONTROL_HANDLERS_H__
|
|
||||||
|
|
||||||
#include <sstream>
|
|
||||||
#include <map>
|
|
||||||
#include <string>
|
|
||||||
#include <boost/property_tree/ptree.hpp>
|
|
||||||
|
|
||||||
namespace i2p
|
|
||||||
{
|
|
||||||
namespace client
|
|
||||||
{
|
|
||||||
class I2PControlHandlers
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
I2PControlHandlers ();
|
|
||||||
|
|
||||||
// methods
|
|
||||||
// TODO: make protected
|
|
||||||
void RouterInfoHandler (const boost::property_tree::ptree& params, std::ostringstream& results);
|
|
||||||
void NetworkSettingHandler (const boost::property_tree::ptree& params, std::ostringstream& results);
|
|
||||||
void ClientServicesInfoHandler (const boost::property_tree::ptree& params, std::ostringstream& results);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
void InsertParam (std::ostringstream& ss, const std::string& name, int value) const;
|
|
||||||
void InsertParam (std::ostringstream& ss, const std::string& name, double value) const;
|
|
||||||
void InsertParam (std::ostringstream& ss, const std::string& name, const std::string& value, bool quotes = true) const;
|
|
||||||
void InsertParam (std::ostringstream& ss, const std::string& name, const boost::property_tree::ptree& value) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
// RouterInfo
|
|
||||||
typedef void (I2PControlHandlers::*RouterInfoRequestHandler)(std::ostringstream& results);
|
|
||||||
void UptimeHandler (std::ostringstream& results);
|
|
||||||
void VersionHandler (std::ostringstream& results);
|
|
||||||
void StatusHandler (std::ostringstream& results);
|
|
||||||
void NetDbKnownPeersHandler (std::ostringstream& results);
|
|
||||||
void NetDbActivePeersHandler (std::ostringstream& results);
|
|
||||||
void NetStatusHandler (std::ostringstream& results);
|
|
||||||
void TunnelsParticipatingHandler (std::ostringstream& results);
|
|
||||||
void TunnelsSuccessRateHandler (std::ostringstream& results);
|
|
||||||
void InboundBandwidth1S (std::ostringstream& results);
|
|
||||||
void InboundBandwidth15S (std::ostringstream& results);
|
|
||||||
void OutboundBandwidth1S (std::ostringstream& results);
|
|
||||||
void OutboundBandwidth15S (std::ostringstream& results);
|
|
||||||
void NetTotalReceivedBytes (std::ostringstream& results);
|
|
||||||
void NetTotalSentBytes (std::ostringstream& results);
|
|
||||||
|
|
||||||
// NetworkSetting
|
|
||||||
typedef void (I2PControlHandlers::*NetworkSettingRequestHandler)(const std::string& value, std::ostringstream& results);
|
|
||||||
void InboundBandwidthLimit (const std::string& value, std::ostringstream& results);
|
|
||||||
void OutboundBandwidthLimit (const std::string& value, std::ostringstream& results);
|
|
||||||
|
|
||||||
// ClientServicesInfo
|
|
||||||
typedef void (I2PControlHandlers::*ClientServicesInfoRequestHandler)(std::ostringstream& results);
|
|
||||||
void I2PTunnelInfoHandler (std::ostringstream& results);
|
|
||||||
void HTTPProxyInfoHandler (std::ostringstream& results);
|
|
||||||
void SOCKSInfoHandler (std::ostringstream& results);
|
|
||||||
void SAMInfoHandler (std::ostringstream& results);
|
|
||||||
void BOBInfoHandler (std::ostringstream& results);
|
|
||||||
void I2CPInfoHandler (std::ostringstream& results);
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
std::map<std::string, RouterInfoRequestHandler> m_RouterInfoHandlers;
|
|
||||||
std::map<std::string, NetworkSettingRequestHandler> m_NetworkSettingHandlers;
|
|
||||||
std::map<std::string, ClientServicesInfoRequestHandler> m_ClientServicesInfoHandlers;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -93,7 +93,7 @@ namespace transport
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
isError = err != UPNPDISCOVER_SUCCESS;
|
isError = err != UPNPDISCOVER_SUCCESS;
|
||||||
#else // MINIUPNPC_API_VERSION >= 8
|
#else // MINIUPNPC_API_VERSION >= 8
|
||||||
err = 0;
|
err = 0;
|
||||||
m_Devlist = upnpDiscover (UPNP_RESPONSE_TIMEOUT, NULL, NULL, 0);
|
m_Devlist = upnpDiscover (UPNP_RESPONSE_TIMEOUT, NULL, NULL, 0);
|
||||||
isError = m_Devlist == NULL;
|
isError = m_Devlist == NULL;
|
||||||
@@ -159,11 +159,10 @@ namespace transport
|
|||||||
|
|
||||||
void UPnP::PortMapping ()
|
void UPnP::PortMapping ()
|
||||||
{
|
{
|
||||||
auto a = context.GetRouterInfo().GetAddresses();
|
const auto& a = context.GetRouterInfo().GetAddresses();
|
||||||
if (!a) return;
|
for (const auto& address : a)
|
||||||
for (const auto& address : *a)
|
|
||||||
{
|
{
|
||||||
if (address && !address->host.is_v6 () && address->port)
|
if (!address->host.is_v6 () && address->port)
|
||||||
TryPortMapping (address);
|
TryPortMapping (address);
|
||||||
}
|
}
|
||||||
m_Timer.expires_from_now (boost::posix_time::minutes(20)); // every 20 minutes
|
m_Timer.expires_from_now (boost::posix_time::minutes(20)); // every 20 minutes
|
||||||
@@ -211,11 +210,10 @@ namespace transport
|
|||||||
|
|
||||||
void UPnP::CloseMapping ()
|
void UPnP::CloseMapping ()
|
||||||
{
|
{
|
||||||
auto a = context.GetRouterInfo().GetAddresses();
|
const auto& a = context.GetRouterInfo().GetAddresses();
|
||||||
if (!a) return;
|
for (const auto& address : a)
|
||||||
for (const auto& address : *a)
|
|
||||||
{
|
{
|
||||||
if (address && !address->host.is_v6 () && address->port)
|
if (!address->host.is_v6 () && address->port)
|
||||||
CloseMapping (address);
|
CloseMapping (address);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -250,10 +248,10 @@ namespace transport
|
|||||||
{
|
{
|
||||||
switch (address->transportStyle)
|
switch (address->transportStyle)
|
||||||
{
|
{
|
||||||
case i2p::data::RouterInfo::eTransportNTCP2:
|
case i2p::data::RouterInfo::eTransportNTCP:
|
||||||
return "TCP";
|
return "TCP";
|
||||||
break;
|
break;
|
||||||
case i2p::data::RouterInfo::eTransportSSU2:
|
case i2p::data::RouterInfo::eTransportSSU:
|
||||||
default:
|
default:
|
||||||
return "UDP";
|
return "UDP";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ namespace transport
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
void Discover ();
|
void Discover ();
|
||||||
int CheckMapping (const char* port, const char* type);
|
int CheckMapping (const char* port, const char* type);
|
||||||
void PortMapping ();
|
void PortMapping ();
|
||||||
void TryPortMapping (std::shared_ptr<i2p::data::RouterInfo::Address> address);
|
void TryPortMapping (std::shared_ptr<i2p::data::RouterInfo::Address> address);
|
||||||
void CloseMapping ();
|
void CloseMapping ();
|
||||||
@@ -80,7 +80,7 @@ namespace transport
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#else // USE_UPNP
|
#else // USE_UPNP
|
||||||
namespace i2p {
|
namespace i2p {
|
||||||
namespace transport {
|
namespace transport {
|
||||||
/* class stub */
|
/* class stub */
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
#include "Tunnel.h"
|
#include "Tunnel.h"
|
||||||
#include "RouterContext.h"
|
#include "RouterContext.h"
|
||||||
#include "ClientContext.h"
|
#include "ClientContext.h"
|
||||||
#include "Transports.h"
|
|
||||||
|
|
||||||
void handle_signal(int sig)
|
void handle_signal(int sig)
|
||||||
{
|
{
|
||||||
@@ -55,14 +54,6 @@ void handle_signal(int sig)
|
|||||||
case SIGPIPE:
|
case SIGPIPE:
|
||||||
LogPrint(eLogInfo, "SIGPIPE received");
|
LogPrint(eLogInfo, "SIGPIPE received");
|
||||||
break;
|
break;
|
||||||
case SIGTSTP:
|
|
||||||
LogPrint(eLogInfo, "Daemon: Got SIGTSTP, disconnecting from network...");
|
|
||||||
i2p::transport::transports.SetOnline(false);
|
|
||||||
break;
|
|
||||||
case SIGCONT:
|
|
||||||
LogPrint(eLogInfo, "Daemon: Got SIGCONT, restoring connection to network...");
|
|
||||||
i2p::transport::transports.SetOnline(true);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,16 +164,13 @@ namespace i2p
|
|||||||
ftruncate(pidFH, 0);
|
ftruncate(pidFH, 0);
|
||||||
if (write(pidFH, pid, strlen(pid)) < 0)
|
if (write(pidFH, pid, strlen(pid)) < 0)
|
||||||
{
|
{
|
||||||
LogPrint(eLogCritical, "Daemon: Could not write pidfile ", pidfile, ": ", strerror(errno));
|
LogPrint(eLogError, "Daemon: Could not write pidfile ", pidfile, ": ", strerror(errno));
|
||||||
std::cerr << "i2pd: Could not write pidfile " << pidfile << ": " << strerror(errno) << std::endl;
|
std::cerr << "i2pd: Could not write pidfile " << pidfile << ": " << strerror(errno) << std::endl;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
gracefulShutdownInterval = 0; // not specified
|
gracefulShutdownInterval = 0; // not specified
|
||||||
|
|
||||||
// handle signal TSTP
|
|
||||||
bool handleTSTP; i2p::config::GetOption("unix.handle_sigtstp", handleTSTP);
|
|
||||||
|
|
||||||
// Signal handler
|
// Signal handler
|
||||||
struct sigaction sa;
|
struct sigaction sa;
|
||||||
sa.sa_handler = handle_signal;
|
sa.sa_handler = handle_signal;
|
||||||
@@ -194,11 +182,6 @@ namespace i2p
|
|||||||
sigaction(SIGTERM, &sa, 0);
|
sigaction(SIGTERM, &sa, 0);
|
||||||
sigaction(SIGINT, &sa, 0);
|
sigaction(SIGINT, &sa, 0);
|
||||||
sigaction(SIGPIPE, &sa, 0);
|
sigaction(SIGPIPE, &sa, 0);
|
||||||
if (handleTSTP)
|
|
||||||
{
|
|
||||||
sigaction(SIGTSTP, &sa, 0);
|
|
||||||
sigaction(SIGCONT, &sa, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return Daemon_Singleton::start();
|
return Daemon_Singleton::start();
|
||||||
}
|
}
|
||||||
|
|||||||
96
debian/changelog
vendored
96
debian/changelog
vendored
@@ -1,99 +1,3 @@
|
|||||||
i2pd (2.50.2) unstable; urgency=medium
|
|
||||||
|
|
||||||
* updated to version 2.50.2/0.9.61
|
|
||||||
|
|
||||||
-- orignal <orignal@i2pmail.org> Sat, 06 Jan 2024 16:00:00 +0000
|
|
||||||
|
|
||||||
i2pd (2.50.1-1) unstable; urgency=medium
|
|
||||||
|
|
||||||
* updated to version 2.50.1/0.9.61
|
|
||||||
|
|
||||||
-- r4sas <r4sas@i2pmail.org> Sat, 23 Dec 2023 18:30:00 +0000
|
|
||||||
|
|
||||||
i2pd (2.50.0-1) unstable; urgency=medium
|
|
||||||
|
|
||||||
* updated to version 2.50.0/0.9.61
|
|
||||||
|
|
||||||
-- orignal <orignal@i2pmail.org> Mon, 18 Dec 2023 16:00:00 +0000
|
|
||||||
|
|
||||||
i2pd (2.49.0-1) unstable; urgency=medium
|
|
||||||
|
|
||||||
* updated to version 2.49.0/0.9.60
|
|
||||||
|
|
||||||
-- orignal <orignal@i2pmail.org> Mon, 18 Sep 2023 16:00:00 +0000
|
|
||||||
|
|
||||||
i2pd (2.48.0-1) unstable; urgency=high
|
|
||||||
|
|
||||||
* updated to version 2.48.0/0.9.59
|
|
||||||
|
|
||||||
-- orignal <orignal@i2pmail.org> Mon, 12 Jun 2023 16:00:00 +0000
|
|
||||||
|
|
||||||
i2pd (2.47.0-1) unstable; urgency=high
|
|
||||||
|
|
||||||
* updated to version 2.47.0/0.9.58
|
|
||||||
|
|
||||||
-- orignal <orignal@i2pmail.org> Sat, 11 Mar 2023 16:00:00 +0000
|
|
||||||
|
|
||||||
i2pd (2.46.1-2) unstable; urgency=critical
|
|
||||||
|
|
||||||
* re-pushed release due to new critical bug
|
|
||||||
|
|
||||||
-- r4sas <r4sas@i2pmail.org> Mon, 20 Feb 2023 23:40:00 +0000
|
|
||||||
|
|
||||||
i2pd (2.46.1-1) unstable; urgency=high
|
|
||||||
|
|
||||||
* updated to version 2.46.1/0.9.57
|
|
||||||
|
|
||||||
-- r4sas <r4sas@i2pmail.org> Mon, 20 Feb 2023 02:45:00 +0000
|
|
||||||
|
|
||||||
i2pd (2.46.0-1) unstable; urgency=high
|
|
||||||
|
|
||||||
* updated to version 2.46.0/0.9.57
|
|
||||||
|
|
||||||
-- orignal <orignal@i2pmail.org> Wed, 15 Feb 2023 19:00:00 +0000
|
|
||||||
|
|
||||||
i2pd (2.45.1-1) unstable; urgency=medium
|
|
||||||
|
|
||||||
* updated to version 2.45.1/0.9.57
|
|
||||||
|
|
||||||
-- orignal <orignal@i2pmail.org> Wed, 11 Jan 2023 19:00:00 +0000
|
|
||||||
|
|
||||||
i2pd (2.45.0-1) unstable; urgency=high
|
|
||||||
|
|
||||||
* updated to version 2.45.0/0.9.57
|
|
||||||
* compat level 12
|
|
||||||
* standards version 4.3.0
|
|
||||||
* increased nofile limit in service and init.d to 8192
|
|
||||||
* added conffiles
|
|
||||||
* removed #1210 patch
|
|
||||||
|
|
||||||
-- r4sas <r4sas@i2pmail.org> Tue, 3 Jan 2023 18:00:00 +0000
|
|
||||||
|
|
||||||
i2pd (2.44.0-1) unstable; urgency=medium
|
|
||||||
|
|
||||||
* updated to version 2.44.0/0.9.56
|
|
||||||
|
|
||||||
-- orignal <orignal@i2pmail.org> Sun, 20 Nov 2022 19:00:00 +0000
|
|
||||||
|
|
||||||
i2pd (2.43.0-1) unstable; urgency=medium
|
|
||||||
|
|
||||||
* updated to version 2.43.0/0.9.55
|
|
||||||
|
|
||||||
-- orignal <orignal@i2pmail.org> Mon, 22 Aug 2022 16:00:00 +0000
|
|
||||||
|
|
||||||
i2pd (2.42.1-1) unstable; urgency=medium
|
|
||||||
|
|
||||||
* updated to version 2.42.1/0.9.54
|
|
||||||
* remove -O3 optimization flag
|
|
||||||
|
|
||||||
-- r4sas <r4sas@i2pmail.org> Tue, 24 May 2022 12:00:00 +0000
|
|
||||||
|
|
||||||
i2pd (2.42.0-1) unstable; urgency=medium
|
|
||||||
|
|
||||||
* updated to version 2.42.0/0.9.54
|
|
||||||
|
|
||||||
-- orignal <orignal@i2pmail.org> Sun, 22 May 2022 16:00:00 +0000
|
|
||||||
|
|
||||||
i2pd (2.41.0-1) unstable; urgency=medium
|
i2pd (2.41.0-1) unstable; urgency=medium
|
||||||
|
|
||||||
* updated to version 2.41.0/0.9.53
|
* updated to version 2.41.0/0.9.53
|
||||||
|
|||||||
2
debian/compat
vendored
2
debian/compat
vendored
@@ -1 +1 @@
|
|||||||
12
|
9
|
||||||
|
|||||||
4
debian/control
vendored
4
debian/control
vendored
@@ -2,8 +2,8 @@ Source: i2pd
|
|||||||
Section: net
|
Section: net
|
||||||
Priority: optional
|
Priority: optional
|
||||||
Maintainer: r4sas <r4sas@i2pmail.org>
|
Maintainer: r4sas <r4sas@i2pmail.org>
|
||||||
Build-Depends: debhelper (>= 12~), libboost-system-dev (>= 1.46), libboost-date-time-dev (>= 1.46), libboost-filesystem-dev (>= 1.46), libboost-program-options-dev (>= 1.46), libminiupnpc-dev, libssl-dev, zlib1g-dev
|
Build-Depends: debhelper (>= 9), dpkg-dev (>= 1.17.2~), gcc (>= 4.7) | clang (>= 3.3), libboost-system-dev (>= 1.46), libboost-date-time-dev (>= 1.46), libboost-filesystem-dev (>= 1.46), libboost-program-options-dev (>= 1.46), libminiupnpc-dev, libssl-dev, zlib1g-dev
|
||||||
Standards-Version: 4.3.0
|
Standards-Version: 3.9.8
|
||||||
Homepage: http://i2pd.website/
|
Homepage: http://i2pd.website/
|
||||||
Vcs-Git: git://github.com/PurpleI2P/i2pd.git
|
Vcs-Git: git://github.com/PurpleI2P/i2pd.git
|
||||||
Vcs-Browser: https://github.com/PurpleI2P/i2pd
|
Vcs-Browser: https://github.com/PurpleI2P/i2pd
|
||||||
|
|||||||
6
debian/copyright
vendored
6
debian/copyright
vendored
@@ -3,18 +3,18 @@ Upstream-Name: i2pd
|
|||||||
Source: https://github.com/PurpleI2P
|
Source: https://github.com/PurpleI2P
|
||||||
|
|
||||||
Files: *
|
Files: *
|
||||||
Copyright: 2013-2023 PurpleI2P
|
Copyright: 2013-2020 PurpleI2P
|
||||||
License: BSD-3-clause
|
License: BSD-3-clause
|
||||||
|
|
||||||
Files: debian/*
|
Files: debian/*
|
||||||
Copyright: 2013-2015 Kill Your TV <killyourtv@i2pmail.org>
|
Copyright: 2013-2015 Kill Your TV <killyourtv@i2pmail.org>
|
||||||
2014-2016 hagen <hagen@i2pmail.org>
|
2014-2016 hagen <hagen@i2pmail.org>
|
||||||
2016-2023 R4SAS <r4sas@i2pmail.org>
|
2016-2020 R4SAS <r4sas@i2pmail.org>
|
||||||
2017-2020 Yangfl <mmyangfl@gmail.com>
|
2017-2020 Yangfl <mmyangfl@gmail.com>
|
||||||
License: GPL-2+
|
License: GPL-2+
|
||||||
|
|
||||||
License: BSD-3-clause
|
License: BSD-3-clause
|
||||||
Copyright (c) 2013-2023, The PurpleI2P Project
|
Copyright (c) 2013-2017, The PurpleI2P Project
|
||||||
.
|
.
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
.
|
.
|
||||||
|
|||||||
2
debian/i2pd.1
vendored
2
debian/i2pd.1
vendored
@@ -64,7 +64,7 @@ The network interface to bind to for IPv4 connections
|
|||||||
The network interface to bind to for IPv6 connections
|
The network interface to bind to for IPv6 connections
|
||||||
.TP
|
.TP
|
||||||
\fB\-\-ipv4=\fR
|
\fB\-\-ipv4=\fR
|
||||||
Enable communication through ipv4 (\fIenabled\fR by default)
|
Enable communication through ipv6 (\fIenabled\fR by default)
|
||||||
.TP
|
.TP
|
||||||
\fB\-\-ipv6\fR
|
\fB\-\-ipv6\fR
|
||||||
Enable communication through ipv6 (\fIdisabled\fR by default)
|
Enable communication through ipv6 (\fIdisabled\fR by default)
|
||||||
|
|||||||
2
debian/i2pd.default
vendored
2
debian/i2pd.default
vendored
@@ -8,4 +8,4 @@ I2PD_ENABLED="yes"
|
|||||||
DAEMON_OPTS=""
|
DAEMON_OPTS=""
|
||||||
|
|
||||||
# If you have problems with hunging i2pd, you can try enable this
|
# If you have problems with hunging i2pd, you can try enable this
|
||||||
ulimit -n 8192
|
ulimit -n 4096
|
||||||
|
|||||||
1
debian/i2pd.install
vendored
1
debian/i2pd.install
vendored
@@ -1,6 +1,7 @@
|
|||||||
i2pd usr/sbin/
|
i2pd usr/sbin/
|
||||||
contrib/i2pd.conf etc/i2pd/
|
contrib/i2pd.conf etc/i2pd/
|
||||||
contrib/tunnels.conf etc/i2pd/
|
contrib/tunnels.conf etc/i2pd/
|
||||||
|
contrib/subscriptions.txt etc/i2pd/
|
||||||
contrib/certificates/ usr/share/i2pd/
|
contrib/certificates/ usr/share/i2pd/
|
||||||
contrib/tunnels.d/README etc/i2pd/tunnels.conf.d/
|
contrib/tunnels.d/README etc/i2pd/tunnels.conf.d/
|
||||||
contrib/apparmor/usr.sbin.i2pd etc/apparmor.d
|
contrib/apparmor/usr.sbin.i2pd etc/apparmor.d
|
||||||
|
|||||||
3
debian/i2pd.links
vendored
3
debian/i2pd.links
vendored
@@ -1,4 +1,5 @@
|
|||||||
etc/i2pd/i2pd.conf var/lib/i2pd/i2pd.conf
|
etc/i2pd/i2pd.conf var/lib/i2pd/i2pd.conf
|
||||||
etc/i2pd/tunnels.conf var/lib/i2pd/tunnels.conf
|
etc/i2pd/tunnels.conf var/lib/i2pd/tunnels.conf
|
||||||
|
etc/i2pd/subscriptions.txt var/lib/i2pd/subscriptions.txt
|
||||||
etc/i2pd/tunnels.conf.d var/lib/i2pd/tunnels.d
|
etc/i2pd/tunnels.conf.d var/lib/i2pd/tunnels.d
|
||||||
usr/share/i2pd/certificates var/lib/i2pd/certificates
|
usr/share/i2pd/certificates var/lib/i2pd/certificates
|
||||||
|
|||||||
27
debian/patches/01-fix-1210.patch
vendored
Normal file
27
debian/patches/01-fix-1210.patch
vendored
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
Description: fix #1210
|
||||||
|
Disables two options, which not presented in old systemd versions
|
||||||
|
Author: r4sas <r4sas@i2pmail.org>
|
||||||
|
|
||||||
|
Bug: https://github.com/PurpleI2P/i2pd/issues/1210
|
||||||
|
Reviewed-By: r4sas <r4sas@i2pmail.org>
|
||||||
|
Last-Update: 2020-05-25
|
||||||
|
|
||||||
|
Index: i2pd/contrib/i2pd.service
|
||||||
|
===================================================================
|
||||||
|
--- i2pd.orig/contrib/i2pd.service
|
||||||
|
+++ i2pd/contrib/i2pd.service
|
||||||
|
@@ -6,10 +6,10 @@ After=network.target
|
||||||
|
[Service]
|
||||||
|
User=i2pd
|
||||||
|
Group=i2pd
|
||||||
|
-RuntimeDirectory=i2pd
|
||||||
|
-RuntimeDirectoryMode=0700
|
||||||
|
-LogsDirectory=i2pd
|
||||||
|
-LogsDirectoryMode=0700
|
||||||
|
+#RuntimeDirectory=i2pd
|
||||||
|
+#RuntimeDirectoryMode=0700
|
||||||
|
+#LogsDirectory=i2pd
|
||||||
|
+#LogsDirectoryMode=0700
|
||||||
|
Type=forking
|
||||||
|
ExecStart=/usr/sbin/i2pd --conf=/etc/i2pd/i2pd.conf --tunconf=/etc/i2pd/tunnels.conf --tunnelsdir=/etc/i2pd/tunnels.conf.d --pidfile=/run/i2pd/i2pd.pid --logfile=/var/log/i2pd/i2pd.log --daemon --service
|
||||||
|
ExecReload=/bin/sh -c "kill -HUP $MAINPID"
|
||||||
17
debian/patches/01-upnp.patch
vendored
17
debian/patches/01-upnp.patch
vendored
@@ -1,17 +0,0 @@
|
|||||||
Description: Enable UPnP usage in package
|
|
||||||
Author: r4sas <r4sas@i2pmail.org>
|
|
||||||
|
|
||||||
Reviewed-By: r4sas <r4sas@i2pmail.org>
|
|
||||||
Last-Update: 2022-03-23
|
|
||||||
|
|
||||||
--- i2pd.orig/Makefile
|
|
||||||
+++ i2pd/Makefile
|
|
||||||
@@ -31,7 +31,7 @@ include filelist.mk
|
|
||||||
|
|
||||||
USE_AESNI := $(or $(USE_AESNI),yes)
|
|
||||||
USE_STATIC := $(or $(USE_STATIC),no)
|
|
||||||
-USE_UPNP := $(or $(USE_UPNP),no)
|
|
||||||
+USE_UPNP := $(or $(USE_UPNP),yes)
|
|
||||||
DEBUG := $(or $(DEBUG),yes)
|
|
||||||
|
|
||||||
# for debugging purposes only, when commit hash needed in trunk builds in i2pd version string
|
|
||||||
3
debian/patches/series
vendored
3
debian/patches/series
vendored
@@ -1 +1,2 @@
|
|||||||
01-upnp.patch
|
01-fix-1210.patch
|
||||||
|
02-upnp.patch
|
||||||
|
|||||||
9
debian/rules
vendored
9
debian/rules
vendored
@@ -1,13 +1,18 @@
|
|||||||
#!/usr/bin/make -f
|
#!/usr/bin/make -f
|
||||||
#export DH_VERBOSE=1
|
#export DH_VERBOSE=1
|
||||||
|
|
||||||
|
|
||||||
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
|
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
|
||||||
|
|
||||||
|
|
||||||
include /usr/share/dpkg/architecture.mk
|
include /usr/share/dpkg/architecture.mk
|
||||||
|
|
||||||
export DEB_CXXFLAGS_MAINT_APPEND = -Wall -pedantic
|
export DEB_CXXFLAGS_MAINT_APPEND = -Wall -pedantic -O3
|
||||||
|
|
||||||
export DEB_LDFLAGS_MAINT_APPEND =
|
export DEB_LDFLAGS_MAINT_APPEND =
|
||||||
|
|
||||||
|
|
||||||
%:
|
%:
|
||||||
dh $@
|
dh $@ --parallel
|
||||||
|
|
||||||
override_dh_auto_install:
|
override_dh_auto_install:
|
||||||
|
|||||||
3
debian/watch
vendored
3
debian/watch
vendored
@@ -1,4 +1,3 @@
|
|||||||
version=4
|
version=4 opts="filenamemangle=s%(?:.*?)?v?(\d[\d.]*)\.tar\.gz%i2pd-$1.tar.gz%" \
|
||||||
opts="filenamemangle=s%(?:.*?)?v?(\d[\d.]*)\.tar\.gz%i2pd-$1.tar.gz%" \
|
|
||||||
https://github.com/PurpleI2P/i2pd/tags \
|
https://github.com/PurpleI2P/i2pd/tags \
|
||||||
(?:.*?/)?(\d[\d.]*)\.tar\.gz debian uupdate
|
(?:.*?/)?(\d[\d.]*)\.tar\.gz debian uupdate
|
||||||
|
|||||||
@@ -64,10 +64,10 @@ namespace afrikaans // language namespace
|
|||||||
|
|
||||||
static std::map<std::string, std::vector<std::string>> plurals
|
static std::map<std::string, std::vector<std::string>> plurals
|
||||||
{
|
{
|
||||||
{"%d days", {"%d dag", "%d dae"}},
|
{"days", {"dag", "dae"}},
|
||||||
{"%d hours", {"%d uur", "%d ure"}},
|
{"hours", {"uur", "ure"}},
|
||||||
{"%d minutes", {"%d minuut", "%d minute"}},
|
{"minutes", {"minuut", "minute"}},
|
||||||
{"%d seconds", {"%d seconde", "%d sekondes"}},
|
{"seconds", {"seconde", "sekondes"}},
|
||||||
{"", {"", ""}},
|
{"", {"", ""}},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2021-2023, The PurpleI2P Project
|
* Copyright (c) 2021, The PurpleI2P Project
|
||||||
*
|
*
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
* This file is part of Purple i2pd project and licensed under BSD3
|
||||||
*
|
*
|
||||||
@@ -31,16 +31,15 @@ namespace armenian // language namespace
|
|||||||
|
|
||||||
static std::map<std::string, std::string> strings
|
static std::map<std::string, std::string> strings
|
||||||
{
|
{
|
||||||
{"%.2f KiB", "%.2f ԿիԲ"},
|
{"KiB", "ԿիԲ"},
|
||||||
{"%.2f MiB", "%.2f ՄիԲ"},
|
{"MiB", "ՄիԲ"},
|
||||||
{"%.2f GiB", "%.2f ԳիԲ"},
|
{"GiB", "ԳիԲ"},
|
||||||
{"building", "կառուցվում է"},
|
{"building", "կառուցվում է"},
|
||||||
{"failed", "Անհաջող"},
|
{"failed", "Անհաջող"},
|
||||||
{"expiring", "Լրանում է"},
|
{"expiring", "Լրանում է"},
|
||||||
{"established", "կարգավոյված է"},
|
{"established", "կարգավոյված է"},
|
||||||
{"unknown", "անհայտ"},
|
{"unknown", "անհայտ"},
|
||||||
{"exploratory", "հետազոտոկան"},
|
{"exploratory", "հետազոտոկան"},
|
||||||
{"Purple I2P Webconsole", "Վեբ-կոնսոլ Purple I2P"},
|
|
||||||
{"<b>i2pd</b> webconsole", "Վեբ-կոնսոլ <b>i2pd</b>"},
|
{"<b>i2pd</b> webconsole", "Վեբ-կոնսոլ <b>i2pd</b>"},
|
||||||
{"Main page", "Գլխավոր էջ"},
|
{"Main page", "Գլխավոր էջ"},
|
||||||
{"Router commands", "Երթուղիչի հրահանգներ"},
|
{"Router commands", "Երթուղիչի հրահանգներ"},
|
||||||
@@ -58,10 +57,10 @@ namespace armenian // language namespace
|
|||||||
{"Unknown", "Անհայտ"},
|
{"Unknown", "Անհայտ"},
|
||||||
{"Proxy", "Պրոկսի"},
|
{"Proxy", "Պրոկսի"},
|
||||||
{"Mesh", "MESH-ցանց"},
|
{"Mesh", "MESH-ցանց"},
|
||||||
|
{"Error", "Սխալ"},
|
||||||
{"Clock skew", "Ոչ ճշգրիտ ժամանակ"},
|
{"Clock skew", "Ոչ ճշգրիտ ժամանակ"},
|
||||||
{"Offline", "Օֆլայն"},
|
{"Offline", "Օֆլայն"},
|
||||||
{"Symmetric NAT", "Սիմետրիկ NAT"},
|
{"Symmetric NAT", "Սիմետրիկ NAT"},
|
||||||
{"Full cone NAT", "Full cone NAT"},
|
|
||||||
{"Uptime", "Առկայություն"},
|
{"Uptime", "Առկայություն"},
|
||||||
{"Network status", "Ցանցի կարգավիճակ"},
|
{"Network status", "Ցանցի կարգավիճակ"},
|
||||||
{"Network status v6", "Ցանցի կարգավիճակ v6"},
|
{"Network status v6", "Ցանցի կարգավիճակ v6"},
|
||||||
@@ -69,7 +68,7 @@ namespace armenian // language namespace
|
|||||||
{"Family", "Խմբատեսակ"},
|
{"Family", "Խմբատեսակ"},
|
||||||
{"Tunnel creation success rate", "Հաջողությամբ կառուցված թունելներ"},
|
{"Tunnel creation success rate", "Հաջողությամբ կառուցված թունելներ"},
|
||||||
{"Received", "Ստացվել է"},
|
{"Received", "Ստացվել է"},
|
||||||
{"%.2f KiB/s", "%.2f ԿիԲ/վ"},
|
{"KiB/s", "ԿիԲ/վ"},
|
||||||
{"Sent", "Ուղարկվել է"},
|
{"Sent", "Ուղարկվել է"},
|
||||||
{"Transit", "Տարանցում"},
|
{"Transit", "Տարանցում"},
|
||||||
{"Data path", "Տվյալների ուղին"},
|
{"Data path", "Տվյալների ուղին"},
|
||||||
@@ -90,12 +89,12 @@ namespace armenian // language namespace
|
|||||||
{"Address registration line", "Հասցեի գրանցման տող"},
|
{"Address registration line", "Հասցեի գրանցման տող"},
|
||||||
{"Domain", "Տիրույթ"},
|
{"Domain", "Տիրույթ"},
|
||||||
{"Generate", "Գեներացնել"},
|
{"Generate", "Գեներացնել"},
|
||||||
{"<b>Note:</b> result string can be used only for registering 2LD domains (example.i2p). For registering subdomains please use i2pd-tools.", "<b> Նշում. </b> արդյունքի տողը կարող է օգտագործվել միայն 2LD տիրույթներ գրանցելու համար (example.i2p): Ենթատիրույթներ գրանցելու համար խնդրում ենք օգտագործել i2pd-tools գործիքակազմը:"},
|
{"<b>Note:</b> result string can be used only for registering 2LD domains (example.i2p). For registering subdomains please use i2pd-tools.", "<b> Նշում. </b> արդյունքի տողը կարող է օգտագործվել միայն 2LD տիրույթներ գրանցելու համար (example.i2p): Ենթատիրույթներ գրանցելու համար խնդրում ենք օգտագործել i2pd-tools գործիքակազմը"},
|
||||||
{"Address", "Հասցե"},
|
{"Address", "Հասցե"},
|
||||||
{"Type", "Տեսակը"},
|
{"Type", "Տեսակը"},
|
||||||
{"EncType", "Գաղտնագրի տեսակը"},
|
{"EncType", "Գաղտնագրի տեսակը"},
|
||||||
{"Inbound tunnels", "Մուտքային թունելներ"},
|
{"Inbound tunnels", "Մուտքային թունելներ"},
|
||||||
{"%dms", "%dմլվ"},
|
{"ms", "մլվ"},
|
||||||
{"Outbound tunnels", "Ելքային թունելներ"},
|
{"Outbound tunnels", "Ելքային թունելներ"},
|
||||||
{"Tags", "Թեգեր"},
|
{"Tags", "Թեգեր"},
|
||||||
{"Incoming", "Մուտքային"},
|
{"Incoming", "Մուտքային"},
|
||||||
@@ -113,10 +112,11 @@ namespace armenian // language namespace
|
|||||||
{"Invalid", "Անվավեր"},
|
{"Invalid", "Անվավեր"},
|
||||||
{"Store type", "Պահեստավորման տեսակը"},
|
{"Store type", "Պահեստավորման տեսակը"},
|
||||||
{"Expires", "Սպառվում է"},
|
{"Expires", "Սպառվում է"},
|
||||||
{"Non Expired Leases", "Չսպառված Lease-եր"},
|
{"Non Expired Leases", "Չսպառված Lease-եր"},
|
||||||
{"Gateway", "Դարպաս"},
|
{"Gateway", "Դարպաս"},
|
||||||
{"TunnelID", "Թունելի ID"},
|
{"TunnelID", "Թունելի ID"},
|
||||||
{"EndDate", "Ավարտ"},
|
{"EndDate", "Ավարտ"},
|
||||||
|
{"not floodfill", "ոչ floodfill-ներ"},
|
||||||
{"Queue size", "Հերթի չափսը"},
|
{"Queue size", "Հերթի չափսը"},
|
||||||
{"Run peer test", "Գործարկել փորձարկումը"},
|
{"Run peer test", "Գործարկել փորձարկումը"},
|
||||||
{"Decline transit tunnels", "Մերժել տարանցիկ թունելներ"},
|
{"Decline transit tunnels", "Մերժել տարանցիկ թունելներ"},
|
||||||
@@ -146,7 +146,10 @@ namespace armenian // language namespace
|
|||||||
{"Destination not found", "Հասցեի վայրը չի գտնվել"},
|
{"Destination not found", "Հասցեի վայրը չի գտնվել"},
|
||||||
{"StreamID can't be null", "StreamID-ն չի կարող լինել դատարկ"},
|
{"StreamID can't be null", "StreamID-ն չի կարող լինել դատարկ"},
|
||||||
{"Return to destination page", "Վերադառնալ նախորդ էջի հասցե"},
|
{"Return to destination page", "Վերադառնալ նախորդ էջի հասցե"},
|
||||||
|
{"You will be redirected in 5 seconds", "Դուք կտեղափոխվեք 5 վայրկյանից"},
|
||||||
|
{"Transit tunnels count must not exceed 65535", "Տարանցիկ թունելների քանակը չպետք է գերազանցի 65535-ը"},
|
||||||
{"Back to commands list", "Վերադառնալ հրահանգների ցուցակ"},
|
{"Back to commands list", "Վերադառնալ հրահանգների ցուցակ"},
|
||||||
|
{"Register at reg.i2p", "Գրանցել reg.i2p-ում"},
|
||||||
{"Description", "Նկարագրություն"},
|
{"Description", "Նկարագրություն"},
|
||||||
{"A bit information about service on domain", "Մի փոքր տեղեկատվություն տիրոիյթում գտնվող ծառայության մասին"},
|
{"A bit information about service on domain", "Մի փոքր տեղեկատվություն տիրոիյթում գտնվող ծառայության մասին"},
|
||||||
{"Submit", "Ուղարկվել"},
|
{"Submit", "Ուղարկվել"},
|
||||||
@@ -162,35 +165,43 @@ namespace armenian // language namespace
|
|||||||
{"You may try to find this host on jump services below", "Ստորև Դուք կարող եք գտնել այս հոսթը jump ծառայությունների միջոցով"},
|
{"You may try to find this host on jump services below", "Ստորև Դուք կարող եք գտնել այս հոսթը jump ծառայությունների միջոցով"},
|
||||||
{"Invalid request", "Սխալ հարցում"},
|
{"Invalid request", "Սխալ հարցում"},
|
||||||
{"Proxy unable to parse your request", "Պրոկսին չի կարող հասկանալ Ձեր հարցումը"},
|
{"Proxy unable to parse your request", "Պրոկսին չի կարող հասկանալ Ձեր հարցումը"},
|
||||||
{"Invalid request URI", "Սխալ ձևավորված URI հարցում"},
|
{"addresshelper is not supported", "addresshelper-ը համատեղելի չէ"},
|
||||||
|
{"Host", "Հոսթ"},
|
||||||
|
{"added to router's addressbook from helper", "Ավելացված է երթուղիչի հասցեագրքում helper-ի միջոցով"},
|
||||||
|
{"Click here to proceed:", "Շարունակելու համար սեղմեք այստեղ"},
|
||||||
|
{"Continue", "Շարունակել"},
|
||||||
|
{"Addresshelper found", "addresshelper-ը գնտված է"},
|
||||||
|
{"already in router's addressbook", "արդեն առկա է երթուղիչի հասցեագրքում"},
|
||||||
|
{"Click here to update record:", "Սեղմեկ այստեղ որպեսզի թարվացնեք գրառումը"},
|
||||||
|
{"invalid request uri", "Սխալ ձևավորված URI հարցում"},
|
||||||
{"Can't detect destination host from request", "Չհաջողվեց հայնտաբերեկ վայրի հասցեն նշված հարցմամբ"},
|
{"Can't detect destination host from request", "Չհաջողվեց հայնտաբերեկ վայրի հասցեն նշված հարցմամբ"},
|
||||||
{"Outproxy failure", "Սխալ արտաքին պրոքսի"},
|
{"Outproxy failure", "Սխալ արտաքին պրոքսի"},
|
||||||
{"Bad outproxy settings", "Սխալ արտաքին պրոկսի կարգավորումներ"},
|
{"bad outproxy settings", "Սխալ արտաքին պրոկսի կարգավորումներ"},
|
||||||
{"Host %s is not inside I2P network, but outproxy is not enabled", "Հոսթ %s Հարցումը I2P ցանցից դուրս է, բայց արտաքին պրոքսին միացված չէ"},
|
{"not inside I2P network, but outproxy is not enabled", "Հարցումը I2P ցանցից դուրս է, բայց արտաքին պրոքսին միացված չէ"},
|
||||||
{"Unknown outproxy URL", "Արտաքին պրոքսիի անհայտ URL"},
|
{"unknown outproxy url", "արտաքին պրոքսիի անհայտ URL"},
|
||||||
{"Cannot resolve upstream proxy", "Չհաջողվեց որոշել վերադաս պրոկսին"},
|
{"cannot resolve upstream proxy", "Չհաջողվեց որոշել վերադաս պրոկսին"},
|
||||||
{"Hostname is too long", "Հոսթի անունը չափազանց երկար է"},
|
{"hostname too long", "Հոսթի անունը չափազանց երկար է"},
|
||||||
{"Cannot connect to upstream SOCKS proxy", "Չհաջողվեց միանալ վերադաս SOCKS պրոկսի սերվերին"},
|
{"cannot connect to upstream socks proxy", "չհաջողվեց միանալ վերադաս socks պրոկսիին"},
|
||||||
{"Cannot negotiate with SOCKS proxy", "Չհաջողվեց պայմանավորվել վերադաս SOCKS պրոկսիի հետ"},
|
{"Cannot negotiate with socks proxy", "Չհաջողվեց պայմանավորվել վերադաս socks պրոկսիի հետ"},
|
||||||
{"CONNECT error", "Սխալ CONNECT հարցում"},
|
{"CONNECT error", "Սխալ CONNECT հարցում"},
|
||||||
{"Failed to connect", "Միանալ չhաջողվեց"},
|
{"Failed to Connect", "Միանալ չhաջողվեց"},
|
||||||
{"SOCKS proxy error", "Սխալ SOCKS պրոկսի"},
|
{"socks proxy error", "Սխալ SOCKS պրոկսի"},
|
||||||
{"Failed to send request to upstream", "Չհաջողվեց հարցումն ուղարկել վերադաս պրոկսիին"},
|
{"failed to send request to upstream", "Չհաջողվեց հարցումն ուղարկել վերադաս պրոկսիին"},
|
||||||
{"No reply from SOCKS proxy", "Բացակայում է պատասխանը SOCKS պրոկսի սերվերի կողմից"},
|
{"No Reply From socks proxy", "Բացակայում է պատասխանը SOCKS պրոկսի սերվերի կողմից"},
|
||||||
{"Cannot connect", "Հնարավոր չե միանալ"},
|
{"cannot connect", "Հնարավոր չե միանալ"},
|
||||||
{"HTTP out proxy not implemented", "Արտաքին HTTP պրոկսին դեռ իրականացված չէ"},
|
{"http out proxy not implemented", "Արտաքին http պրոկսին դեռ իրականացված չէ"},
|
||||||
{"Cannot connect to upstream HTTP proxy", "Չհաջողվեց միանալ վերադաս HTTP պրոկսի սերվերին"},
|
{"cannot connect to upstream http proxy", "Չհաջողվեց միանալ վերադաս http պրոկսի սերվերին"},
|
||||||
{"Host is down", "Հոսթն անհասանելի է"},
|
{"Host is down", "Հոսթն անհասանելի է"},
|
||||||
{"Can't create connection to requested host, it may be down. Please try again later.", "Հոսթի հետ կապը հաստատել չհաջողվեց, հնարավոր է այն անջատված է, փորձեք միանալ քիչ ուշ:"},
|
{"Can't create connection to requested host, it may be down. Please try again later.", "Հոսթի հետ կապը հաստատել չհաջողվեց, հնարավոր է այն անջատված է, փորձեք միանալ քիչ ուշ"},
|
||||||
{"", ""},
|
{"", ""},
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::map<std::string, std::vector<std::string>> plurals
|
static std::map<std::string, std::vector<std::string>> plurals
|
||||||
{
|
{
|
||||||
{"%d days", {"%d օր", "%d օր"}},
|
{"days", {"օր", "օր"}},
|
||||||
{"%d hours", {"%d ժամ", "%d ժամ"}},
|
{"hours", {"ժամ", "ժամ"}},
|
||||||
{"%d minutes", {"%d րոպե", "%d րոպե"}},
|
{"minutes", {"րոպե", "րոպե"}},
|
||||||
{"%d seconds", {"%d վարկյան", "%d վարկյան"}},
|
{"seconds", {"վարկյան", "վարկյան"}},
|
||||||
{"", {"", ""}},
|
{"", {"", ""}},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
219
i18n/Chinese.cpp
219
i18n/Chinese.cpp
@@ -1,219 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2022-2023, The PurpleI2P Project
|
|
||||||
*
|
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
|
||||||
*
|
|
||||||
* See full license text in LICENSE file at top of project tree
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <map>
|
|
||||||
#include <vector>
|
|
||||||
#include <string>
|
|
||||||
#include <memory>
|
|
||||||
#include "I18N.h"
|
|
||||||
|
|
||||||
// Simplified Chinese localization file
|
|
||||||
|
|
||||||
namespace i2p
|
|
||||||
{
|
|
||||||
namespace i18n
|
|
||||||
{
|
|
||||||
namespace chinese // language namespace
|
|
||||||
{
|
|
||||||
// language name in lowercase
|
|
||||||
static std::string language = "chinese";
|
|
||||||
|
|
||||||
// See for language plural forms here:
|
|
||||||
// https://localization-guide.readthedocs.io/en/latest/l10n/pluralforms.html
|
|
||||||
static int plural (int n) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::map<std::string, std::string> strings
|
|
||||||
{
|
|
||||||
{"%.2f KiB", "%.2f KiB"},
|
|
||||||
{"%.2f MiB", "%.2f MiB"},
|
|
||||||
{"%.2f GiB", "%.2f GiB"},
|
|
||||||
{"building", "正在构建"},
|
|
||||||
{"failed", "连接失败"},
|
|
||||||
{"expiring", "即将过期"},
|
|
||||||
{"established", "连接成功"},
|
|
||||||
{"unknown", "未知"},
|
|
||||||
{"exploratory", "探索"},
|
|
||||||
{"Purple I2P Webconsole", "Purple I2P 网页控制台"},
|
|
||||||
{"<b>i2pd</b> webconsole", "<b>i2pd</b> 网页控制台"},
|
|
||||||
{"Main page", "主页"},
|
|
||||||
{"Router commands", "路由命令"},
|
|
||||||
{"Local Destinations", "本地目标"},
|
|
||||||
{"LeaseSets", "租约集"},
|
|
||||||
{"Tunnels", "隧道"},
|
|
||||||
{"Transit Tunnels", "中转隧道"},
|
|
||||||
{"Transports", "传输"},
|
|
||||||
{"I2P tunnels", "I2P 隧道"},
|
|
||||||
{"SAM sessions", "SAM 会话"},
|
|
||||||
{"ERROR", "错误"},
|
|
||||||
{"OK", "良好"},
|
|
||||||
{"Testing", "测试中"},
|
|
||||||
{"Firewalled", "受到防火墙限制"},
|
|
||||||
{"Unknown", "未知"},
|
|
||||||
{"Proxy", "代理"},
|
|
||||||
{"Mesh", "自组网"},
|
|
||||||
{"Clock skew", "时钟偏移"},
|
|
||||||
{"Offline", "离线"},
|
|
||||||
{"Symmetric NAT", "对称 NAT"},
|
|
||||||
{"Full cone NAT", "全锥型NAT"},
|
|
||||||
{"No Descriptors", "无描述符"},
|
|
||||||
{"Uptime", "运行时间"},
|
|
||||||
{"Network status", "IPv4 网络状态"},
|
|
||||||
{"Network status v6", "IPv6 网络状态"},
|
|
||||||
{"Stopping in", "距停止还有:"},
|
|
||||||
{"Family", "家族"},
|
|
||||||
{"Tunnel creation success rate", "隧道创建成功率"},
|
|
||||||
{"Received", "已接收"},
|
|
||||||
{"%.2f KiB/s", "%.2f KiB/s"},
|
|
||||||
{"Sent", "已发送"},
|
|
||||||
{"Transit", "中转"},
|
|
||||||
{"Data path", "数据文件路径"},
|
|
||||||
{"Hidden content. Press on text to see.", "隐藏内容 请点击此处查看。"},
|
|
||||||
{"Router Ident", "路由身份"},
|
|
||||||
{"Router Family", "路由器家族"},
|
|
||||||
{"Router Caps", "路由器类型"},
|
|
||||||
{"Version", "版本"},
|
|
||||||
{"Our external address", "外部地址"},
|
|
||||||
{"supported", "支持"},
|
|
||||||
{"Routers", "路由节点"},
|
|
||||||
{"Floodfills", "洪泛节点"},
|
|
||||||
{"Client Tunnels", "客户端隧道"},
|
|
||||||
{"Services", "服务"},
|
|
||||||
{"Enabled", "启用"},
|
|
||||||
{"Disabled", "禁用"},
|
|
||||||
{"Encrypted B33 address", "加密的 B33 地址"},
|
|
||||||
{"Address registration line", "地址域名注册"},
|
|
||||||
{"Domain", "域名"},
|
|
||||||
{"Generate", "生成"},
|
|
||||||
{"<b>Note:</b> result string can be used only for registering 2LD domains (example.i2p). For registering subdomains please use i2pd-tools.", "<b>注意:</b> 结果字符串只能用于注册二级域名(例如:example.i2p)。若需注册三级域名,请使用 i2pd-tools。"},
|
|
||||||
{"Address", "地址"},
|
|
||||||
{"Type", "类型"},
|
|
||||||
{"EncType", "加密类型"},
|
|
||||||
{"Inbound tunnels", "入站隧道"},
|
|
||||||
{"%dms", "%dms"},
|
|
||||||
{"Outbound tunnels", "出站隧道"},
|
|
||||||
{"Tags", "标签"},
|
|
||||||
{"Incoming", "传入"},
|
|
||||||
{"Outgoing", "传出"},
|
|
||||||
{"Destination", "目标"},
|
|
||||||
{"Amount", "数量"},
|
|
||||||
{"Incoming Tags", "传入标签"},
|
|
||||||
{"Tags sessions", "标签会话"},
|
|
||||||
{"Status", "状态"},
|
|
||||||
{"Local Destination", "本地目标"},
|
|
||||||
{"Streams", "流"},
|
|
||||||
{"Close stream", "断开流"},
|
|
||||||
{"Such destination is not found", "找不到此目标"},
|
|
||||||
{"I2CP session not found", "未找到 I2CP 会话"},
|
|
||||||
{"I2CP is not enabled", "I2CP 未启用"},
|
|
||||||
{"Invalid", "无效"},
|
|
||||||
{"Store type", "存储类型"},
|
|
||||||
{"Expires", "过期时间"},
|
|
||||||
{"Non Expired Leases", "未到期的租约"},
|
|
||||||
{"Gateway", "网关"},
|
|
||||||
{"TunnelID", "隧道 ID"},
|
|
||||||
{"EndDate", "结束日期"},
|
|
||||||
{"floodfill mode is disabled", "洪泛已禁用"},
|
|
||||||
{"Queue size", "队列大小"},
|
|
||||||
{"Run peer test", "运行节点测试"},
|
|
||||||
{"Reload tunnels configuration", "重新载入隧道配置"},
|
|
||||||
{"Decline transit tunnels", "拒绝中转隧道"},
|
|
||||||
{"Accept transit tunnels", "允许中转隧道"},
|
|
||||||
{"Cancel graceful shutdown", "取消平滑关闭"},
|
|
||||||
{"Start graceful shutdown", "平滑关闭"},
|
|
||||||
{"Force shutdown", "强制停止"},
|
|
||||||
{"Reload external CSS styles", "重载外部 CSS 样式"},
|
|
||||||
{"<b>Note:</b> any action done here are not persistent and not changes your config files.", "<b>注意:</b> 此处完成的任何操作都不是永久的,不会更改您的配置文件。"},
|
|
||||||
{"Logging level", "日志级别"},
|
|
||||||
{"Transit tunnels limit", "中转隧道限制"},
|
|
||||||
{"Change", "修改"},
|
|
||||||
{"Change language", "更改语言"},
|
|
||||||
{"no transit tunnels currently built", "目前未构建中转隧道"},
|
|
||||||
{"SAM disabled", "SAM 已禁用"},
|
|
||||||
{"no sessions currently running", "没有正在运行的会话"},
|
|
||||||
{"SAM session not found", "未找到 SAM 会话"},
|
|
||||||
{"SAM Session", "SAM 会话"},
|
|
||||||
{"Server Tunnels", "服务器隧道"},
|
|
||||||
{"Client Forwards", "客户端转发"},
|
|
||||||
{"Server Forwards", "服务器转发"},
|
|
||||||
{"Unknown page", "未知页面"},
|
|
||||||
{"Invalid token", "无效令牌"},
|
|
||||||
{"SUCCESS", "成功"},
|
|
||||||
{"Stream closed", "流已关闭"},
|
|
||||||
{"Stream not found or already was closed", "流未找到或已关闭"},
|
|
||||||
{"Destination not found", "找不到目标"},
|
|
||||||
{"StreamID can't be null", "StreamID 不能为空"},
|
|
||||||
{"Return to destination page", "返回目标页面"},
|
|
||||||
{"You will be redirected in %d seconds", "您将在%d秒内被重定向"},
|
|
||||||
{"Transit tunnels count must not exceed %d", "中转隧道数量限制为 %d"},
|
|
||||||
{"Back to commands list", "返回命令列表"},
|
|
||||||
{"Register at reg.i2p", "在 reg.i2p 注册域名"},
|
|
||||||
{"Description", "描述"},
|
|
||||||
{"A bit information about service on domain", "在此域名上运行的服务的一些信息"},
|
|
||||||
{"Submit", "提交"},
|
|
||||||
{"Domain can't end with .b32.i2p", "域名不能以 .b32.i2p 结尾"},
|
|
||||||
{"Domain must end with .i2p", "域名必须以 .i2p 结尾"},
|
|
||||||
{"Unknown command", "未知指令"},
|
|
||||||
{"Command accepted", "已接受指令"},
|
|
||||||
{"Proxy error", "代理错误"},
|
|
||||||
{"Proxy info", "代理信息"},
|
|
||||||
{"Proxy error: Host not found", "代理错误:未找到主机"},
|
|
||||||
{"Remote host not found in router's addressbook", "在路由地址簿中未找到远程主机"},
|
|
||||||
{"You may try to find this host on jump services below", "您可以尝试在下方的跳转服务中找到此主机"},
|
|
||||||
{"Invalid request", "无效请求"},
|
|
||||||
{"Proxy unable to parse your request", "代理无法解析您的请求"},
|
|
||||||
{"Addresshelper is not supported", "不支持地址助手"},
|
|
||||||
{"Host %s is <font color=red>already in router's addressbook</font>. <b>Be careful: source of this URL may be harmful!</b> Click here to update record: <a href=\"%s%s%s&update=true\">Continue</a>.", "主机 %s <font color=red>已在路由地址簿中</font>。<b>请注意:此地址的来源可能是有害的!</b>点击此处更新记录:<a href=\"%s%s%s&update=true\">继续</a>"},
|
|
||||||
{"Addresshelper forced update rejected", "地址助手强制更新被拒绝"},
|
|
||||||
{"To add host <b>%s</b> in router's addressbook, click here: <a href=\"%s%s%s\">Continue</a>.", "若要在路由器地址簿中添加主机 <b>%s</b> 请点击这里: <a href=\"%s%s%s\">继续</a>"},
|
|
||||||
{"Addresshelper request", "请求地址助手"},
|
|
||||||
{"Host %s added to router's addressbook from helper. Click here to proceed: <a href=\"%s\">Continue</a>.", "主机 %s 已通过地址助手添加到路由地址簿中。点击此处继续:<a href=\"%s\">继续</a>"},
|
|
||||||
{"Addresshelper adding", "正在添加地址助手"},
|
|
||||||
{"Host %s is <font color=red>already in router's addressbook</font>. Click here to update record: <a href=\"%s%s%s&update=true\">Continue</a>.", "主机 %s <font color=red>已在路由地址簿中</font>。点击此处更新记录:<a href=\"%s%s%s&update=true\">继续</a>"},
|
|
||||||
{"Addresshelper update", "更新地址助手"},
|
|
||||||
{"Invalid request URI", "无效的 URI 请求"},
|
|
||||||
{"Can't detect destination host from request", "无法从请求中检测到目标主机"},
|
|
||||||
{"Outproxy failure", "出口代理故障"},
|
|
||||||
{"Bad outproxy settings", "错误的出口代理设置"},
|
|
||||||
{"Host %s is not inside I2P network, but outproxy is not enabled", "主机 %s 不在 I2P 网络内,但出口代理未启用"},
|
|
||||||
{"Unknown outproxy URL", "未知的出口代理地址"},
|
|
||||||
{"Cannot resolve upstream proxy", "无法解析上游代理"},
|
|
||||||
{"Hostname is too long", "主机名过长"},
|
|
||||||
{"Cannot connect to upstream SOCKS proxy", "无法连接到上游 SOCKS 代理"},
|
|
||||||
{"Cannot negotiate with SOCKS proxy", "无法与 SOCKS 代理协商"},
|
|
||||||
{"CONNECT error", "连接错误"},
|
|
||||||
{"Failed to connect", "连接失败"},
|
|
||||||
{"SOCKS proxy error", "SOCKS 代理错误"},
|
|
||||||
{"Failed to send request to upstream", "向上游发送请求失败"},
|
|
||||||
{"No reply from SOCKS proxy", "没有来自 SOCKS 代理的回复"},
|
|
||||||
{"Cannot connect", "无法连接"},
|
|
||||||
{"HTTP out proxy not implemented", "HTTP 出口代理未实现"},
|
|
||||||
{"Cannot connect to upstream HTTP proxy", "无法连接到上游 HTTP 代理"},
|
|
||||||
{"Host is down", "主机已关闭"},
|
|
||||||
{"Can't create connection to requested host, it may be down. Please try again later.", "无法创建到目标主机的连接。主机可能已下线,请稍后再试。"},
|
|
||||||
{"", ""},
|
|
||||||
};
|
|
||||||
|
|
||||||
static std::map<std::string, std::vector<std::string>> plurals
|
|
||||||
{
|
|
||||||
{"%d days", {"%d 天"}},
|
|
||||||
{"%d hours", {"%d 小时"}},
|
|
||||||
{"%d minutes", {"%d 分钟"}},
|
|
||||||
{"%d seconds", {"%d 秒"}},
|
|
||||||
{"", {""}},
|
|
||||||
};
|
|
||||||
|
|
||||||
std::shared_ptr<const i2p::i18n::Locale> GetLocale()
|
|
||||||
{
|
|
||||||
return std::make_shared<i2p::i18n::Locale>(language, strings, plurals, [] (int n)->int { return plural(n); });
|
|
||||||
}
|
|
||||||
|
|
||||||
} // language
|
|
||||||
} // i18n
|
|
||||||
} // i2p
|
|
||||||
204
i18n/Czech.cpp
204
i18n/Czech.cpp
@@ -1,204 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2022-2023, The PurpleI2P Project
|
|
||||||
*
|
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
|
||||||
*
|
|
||||||
* See full license text in LICENSE file at top of project tree
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <map>
|
|
||||||
#include <vector>
|
|
||||||
#include <string>
|
|
||||||
#include <memory>
|
|
||||||
#include "I18N.h"
|
|
||||||
|
|
||||||
// Czech localization file
|
|
||||||
|
|
||||||
namespace i2p
|
|
||||||
{
|
|
||||||
namespace i18n
|
|
||||||
{
|
|
||||||
namespace czech // language namespace
|
|
||||||
{
|
|
||||||
// language name in lowercase
|
|
||||||
static std::string language = "czech";
|
|
||||||
|
|
||||||
// See for language plural forms here:
|
|
||||||
// https://localization-guide.readthedocs.io/en/latest/l10n/pluralforms.html
|
|
||||||
static int plural (int n) {
|
|
||||||
return (n == 1) ? 0 : (n >= 2 && n <= 4) ? 1 : 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::map<std::string, std::string> strings
|
|
||||||
{
|
|
||||||
{"%.2f KiB", "%.2f KiB"},
|
|
||||||
{"%.2f MiB", "%.2f MiB"},
|
|
||||||
{"%.2f GiB", "%.2f GiB"},
|
|
||||||
{"building", "vytváří se"},
|
|
||||||
{"failed", "selhalo"},
|
|
||||||
{"expiring", "končící"},
|
|
||||||
{"established", "vytvořeno"},
|
|
||||||
{"unknown", "neznámý"},
|
|
||||||
{"exploratory", "průzkumné"},
|
|
||||||
{"Purple I2P Webconsole", "Purple I2P Webkonsole"},
|
|
||||||
{"<b>i2pd</b> webconsole", "<b>i2pd</b> webkonsole"},
|
|
||||||
{"Main page", "Hlavní stránka"},
|
|
||||||
{"Router commands", "Router příkazy"},
|
|
||||||
{"Local Destinations", "Lokální destinace"},
|
|
||||||
{"LeaseSets", "LeaseSety"},
|
|
||||||
{"Tunnels", "Tunely"},
|
|
||||||
{"Transit Tunnels", "Transitní tunely"},
|
|
||||||
{"Transports", "Transporty"},
|
|
||||||
{"I2P tunnels", "I2P tunely"},
|
|
||||||
{"SAM sessions", "SAM relace"},
|
|
||||||
{"ERROR", "CHYBA"},
|
|
||||||
{"OK", "OK"},
|
|
||||||
{"Testing", "Testuji"},
|
|
||||||
{"Firewalled", "Za Firewallem"},
|
|
||||||
{"Unknown", "Neznámý"},
|
|
||||||
{"Proxy", "Proxy"},
|
|
||||||
{"Mesh", "Síť"},
|
|
||||||
{"Clock skew", "Časová nesrovnalost"},
|
|
||||||
{"Offline", "Offline"},
|
|
||||||
{"Symmetric NAT", "Symetrický NAT"},
|
|
||||||
{"Uptime", "Doba provozu"},
|
|
||||||
{"Network status", "Status sítě"},
|
|
||||||
{"Network status v6", "Status sítě v6"},
|
|
||||||
{"Stopping in", "Zastavuji za"},
|
|
||||||
{"Family", "Rodina"},
|
|
||||||
{"Tunnel creation success rate", "Úspěšnost vytváření tunelů"},
|
|
||||||
{"Received", "Přijato"},
|
|
||||||
{"%.2f KiB/s", "%.2f KiB/s"},
|
|
||||||
{"Sent", "Odesláno"},
|
|
||||||
{"Transit", "Tranzit"},
|
|
||||||
{"Data path", "Cesta k data souborům"},
|
|
||||||
{"Hidden content. Press on text to see.", "Skrytý kontent. Pro zobrazení, klikni na text."},
|
|
||||||
{"Router Ident", "Routerová Identita"},
|
|
||||||
{"Router Family", "Rodina routerů"},
|
|
||||||
{"Router Caps", "Omezení Routerů"},
|
|
||||||
{"Version", "Verze"},
|
|
||||||
{"Our external address", "Naše externí adresa"},
|
|
||||||
{"supported", "podporováno"},
|
|
||||||
{"Routers", "Routery"},
|
|
||||||
{"Floodfills", "Floodfilly"},
|
|
||||||
{"Client Tunnels", "Klientské tunely"},
|
|
||||||
{"Services", "Služby"},
|
|
||||||
{"Enabled", "Zapnuto"},
|
|
||||||
{"Disabled", "Vypnuto"},
|
|
||||||
{"Encrypted B33 address", "Šifrovaná adresa B33"},
|
|
||||||
{"Address registration line", "Registrační řádek adresy"},
|
|
||||||
{"Domain", "Doména"},
|
|
||||||
{"Generate", "Vygenerovat"},
|
|
||||||
{"<b>Note:</b> result string can be used only for registering 2LD domains (example.i2p). For registering subdomains please use i2pd-tools.", "<b>Poznámka:</b> výsledný řetězec může být použit pouze pro registraci 2LD domén (example.i2p). Pro registraci subdomén použijte prosím i2pd-tools."},
|
|
||||||
{"Address", "Adresa"},
|
|
||||||
{"Type", "Typ"},
|
|
||||||
{"EncType", "EncType"},
|
|
||||||
{"Inbound tunnels", "Příchozí tunely"},
|
|
||||||
{"%dms", "%dms"},
|
|
||||||
{"Outbound tunnels", "Odchozí tunely"},
|
|
||||||
{"Tags", "Štítky"},
|
|
||||||
{"Incoming", "Příchozí"},
|
|
||||||
{"Outgoing", "Odchozí"},
|
|
||||||
{"Destination", "Destinace"},
|
|
||||||
{"Amount", "Množství"},
|
|
||||||
{"Incoming Tags", "Příchozí štítky"},
|
|
||||||
{"Tags sessions", "Relace štítků"},
|
|
||||||
{"Status", "Status"},
|
|
||||||
{"Local Destination", "Lokální Destinace"},
|
|
||||||
{"Streams", "Toky"},
|
|
||||||
{"Close stream", "Uzavřít tok"},
|
|
||||||
{"I2CP session not found", "I2CP relace nenalezena"},
|
|
||||||
{"I2CP is not enabled", "I2CP není zapnuto"},
|
|
||||||
{"Invalid", "Neplatný"},
|
|
||||||
{"Store type", "Druh uložení"},
|
|
||||||
{"Expires", "Vyprší"},
|
|
||||||
{"Non Expired Leases", "Nevypršené Leasy"},
|
|
||||||
{"Gateway", "Brána"},
|
|
||||||
{"TunnelID", "ID tunelu"},
|
|
||||||
{"EndDate", "Datum ukončení"},
|
|
||||||
{"Queue size", "Velikost fronty"},
|
|
||||||
{"Run peer test", "Spustit peer test"},
|
|
||||||
{"Decline transit tunnels", "Odmítnout tranzitní tunely"},
|
|
||||||
{"Accept transit tunnels", "Přijmout tranzitní tunely"},
|
|
||||||
{"Cancel graceful shutdown", "Zrušit hladké vypnutí"},
|
|
||||||
{"Start graceful shutdown", "Zahájit hladké vypnutí"},
|
|
||||||
{"Force shutdown", "Vynutit vypnutí"},
|
|
||||||
{"Reload external CSS styles", "Znovu načíst externí CSS"},
|
|
||||||
{"<b>Note:</b> any action done here are not persistent and not changes your config files.", "<b>Poznámka:</b> žádná vykonaná akce zde není trvalá a nemění konfigurační soubory."},
|
|
||||||
{"Logging level", "Úroveň logování"},
|
|
||||||
{"Transit tunnels limit", "Limit tranzitních tunelů"},
|
|
||||||
{"Change", "Změnit"},
|
|
||||||
{"Change language", "Změnit jazyk"},
|
|
||||||
{"no transit tunnels currently built", "Žádný tranzitní tunel není momentálně vytvořen"},
|
|
||||||
{"SAM disabled", "SAM vypnutý"},
|
|
||||||
{"no sessions currently running", "Momentálně nejsou spuštěné žádné relace"},
|
|
||||||
{"SAM session not found", "SAM relace nenalezena"},
|
|
||||||
{"SAM Session", "SAM Relace"},
|
|
||||||
{"Server Tunnels", "Server Tunely"},
|
|
||||||
{"Client Forwards", "Přesměrování Klienta"},
|
|
||||||
{"Server Forwards", "Přesměrování Serveru"},
|
|
||||||
{"Unknown page", "Neznámá stránka"},
|
|
||||||
{"Invalid token", "Neplatný token"},
|
|
||||||
{"SUCCESS", "ÚSPĚCH"},
|
|
||||||
{"Stream closed", "Tok uzavřen"},
|
|
||||||
{"Stream not found or already was closed", "Tok nenalezen nebo byl již uzavřen"},
|
|
||||||
{"Destination not found", "Destinace nenalezena"},
|
|
||||||
{"StreamID can't be null", "StreamID nemůže být null"},
|
|
||||||
{"Return to destination page", "Zpět na stránku destinací"},
|
|
||||||
{"Back to commands list", "Zpět na list příkazů"},
|
|
||||||
{"Register at reg.i2p", "Zaregistrovat na reg.i2p"},
|
|
||||||
{"Description", "Popis"},
|
|
||||||
{"A bit information about service on domain", "Trochu informací o službě na doméně"},
|
|
||||||
{"Submit", "Odeslat"},
|
|
||||||
{"Domain can't end with .b32.i2p", "Doména nesmí končit na .b32.i2p"},
|
|
||||||
{"Domain must end with .i2p", "Doména musí končit s .i2p"},
|
|
||||||
{"Such destination is not found", "Takováto destinace nebyla nalezena"},
|
|
||||||
{"Unknown command", "Neznámý příkaz"},
|
|
||||||
{"Command accepted", "Příkaz přijat"},
|
|
||||||
{"Proxy error", "Chyba proxy serveru"},
|
|
||||||
{"Proxy info", "Proxy informace"},
|
|
||||||
{"Proxy error: Host not found", "Chyba proxy serveru: Hostitel nenalezen"},
|
|
||||||
{"Remote host not found in router's addressbook", "Vzdálený hostitel nebyl nalezen v adresáři routeru"},
|
|
||||||
{"You may try to find this host on jump services below", "Můžete se pokusit najít tohoto hostitele na startovacích službách níže"},
|
|
||||||
{"Invalid request", "Neplatný požadavek"},
|
|
||||||
{"Proxy unable to parse your request", "Proxy server nemohl zpracovat váš požadavek"},
|
|
||||||
{"Invalid request URI", "Neplatný URI požadavek"},
|
|
||||||
{"Can't detect destination host from request", "Nelze zjistit cílového hostitele z požadavku"},
|
|
||||||
{"Outproxy failure", "Outproxy selhání"},
|
|
||||||
{"Bad outproxy settings", "Špatné outproxy nastavení"},
|
|
||||||
{"Host %s is not inside I2P network, but outproxy is not enabled", "Hostitel %s není uvnitř I2P sítě a outproxy není nastavena"},
|
|
||||||
{"Unknown outproxy URL", "Neznámá outproxy URL"},
|
|
||||||
{"Cannot resolve upstream proxy", "Nelze rozluštit upstream proxy server"},
|
|
||||||
{"Hostname is too long", "Název hostitele je příliš dlouhý"},
|
|
||||||
{"Cannot connect to upstream SOCKS proxy", "Nelze se připojit k upstream SOCKS proxy serveru"},
|
|
||||||
{"Cannot negotiate with SOCKS proxy", "Nelze vyjednávat se SOCKS proxy serverem"},
|
|
||||||
{"CONNECT error", "Chyba PŘIPOJENÍ"},
|
|
||||||
{"Failed to connect", "Připojení se nezdařilo"},
|
|
||||||
{"SOCKS proxy error", "Chyba SOCKS proxy serveru"},
|
|
||||||
{"Failed to send request to upstream", "Odeslání žádosti upstream serveru se nezdařilo"},
|
|
||||||
{"No reply from SOCKS proxy", "Žádná odpověď od SOCKS proxy serveru"},
|
|
||||||
{"Cannot connect", "Nelze se připojit"},
|
|
||||||
{"HTTP out proxy not implemented", "HTTP out proxy není implementován"},
|
|
||||||
{"Cannot connect to upstream HTTP proxy", "Nelze se připojit k upstream HTTP proxy serveru"},
|
|
||||||
{"Host is down", "Hostitel je nedostupný"},
|
|
||||||
{"Can't create connection to requested host, it may be down. Please try again later.", "Připojení k požadovanému hostiteli nelze vytvořit, může být nedostupný. Zkuste to, prosím, znovu později."},
|
|
||||||
{"", ""},
|
|
||||||
};
|
|
||||||
|
|
||||||
static std::map<std::string, std::vector<std::string>> plurals
|
|
||||||
{
|
|
||||||
{"%d days", {"%d den", "%d dny", "%d dní", "%d dní"}},
|
|
||||||
{"%d hours", {"%d hodina", "%d hodiny", "%d hodin", "%d hodin"}},
|
|
||||||
{"%d minutes", {"%d minuta", "%d minuty", "%d minut", "%d minut"}},
|
|
||||||
{"%d seconds", {"%d vteřina", "%d vteřiny", "%d vteřin", "%d vteřin"}},
|
|
||||||
{"", {"", "", "", ""}},
|
|
||||||
};
|
|
||||||
|
|
||||||
std::shared_ptr<const i2p::i18n::Locale> GetLocale()
|
|
||||||
{
|
|
||||||
return std::make_shared<i2p::i18n::Locale>(language, strings, plurals, [] (int n)->int { return plural(n); });
|
|
||||||
}
|
|
||||||
|
|
||||||
} // language
|
|
||||||
} // i18n
|
|
||||||
} // i2p
|
|
||||||
223
i18n/French.cpp
223
i18n/French.cpp
@@ -1,223 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2022-2023, The PurpleI2P Project
|
|
||||||
*
|
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
|
||||||
*
|
|
||||||
* See full license text in LICENSE file at top of project tree
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <map>
|
|
||||||
#include <vector>
|
|
||||||
#include <string>
|
|
||||||
#include <memory>
|
|
||||||
#include "I18N.h"
|
|
||||||
|
|
||||||
// French localization file
|
|
||||||
|
|
||||||
namespace i2p
|
|
||||||
{
|
|
||||||
namespace i18n
|
|
||||||
{
|
|
||||||
namespace french // language namespace
|
|
||||||
{
|
|
||||||
// language name in lowercase
|
|
||||||
static std::string language = "french";
|
|
||||||
|
|
||||||
// See for language plural forms here:
|
|
||||||
// https://localization-guide.readthedocs.io/en/latest/l10n/pluralforms.html
|
|
||||||
static int plural (int n) {
|
|
||||||
return n != 1 ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::map<std::string, std::string> strings
|
|
||||||
{
|
|
||||||
{"%.2f KiB", "%.2f Kio"},
|
|
||||||
{"%.2f MiB", "%.2f Mio"},
|
|
||||||
{"%.2f GiB", "%.2f Gio"},
|
|
||||||
{"building", "En construction"},
|
|
||||||
{"failed", "échoué"},
|
|
||||||
{"expiring", "expiré"},
|
|
||||||
{"established", "établi"},
|
|
||||||
{"unknown", "inconnu"},
|
|
||||||
{"exploratory", "exploratoire"},
|
|
||||||
{"Purple I2P Webconsole", "Console web Purple I2P"},
|
|
||||||
{"<b>i2pd</b> webconsole", "Console web <b>i2pd</b>"},
|
|
||||||
{"Main page", "Page principale"},
|
|
||||||
{"Router commands", "Commandes du routeur"},
|
|
||||||
{"Local Destinations", "Destinations locales"},
|
|
||||||
{"LeaseSets", "Jeu de baux"},
|
|
||||||
{"Tunnels", "Tunnels"},
|
|
||||||
{"Transit Tunnels", "Tunnels transitoires"},
|
|
||||||
{"Transports", "Transports"},
|
|
||||||
{"I2P tunnels", "Tunnels I2P"},
|
|
||||||
{"SAM sessions", "Sessions SAM"},
|
|
||||||
{"ERROR", "ERREUR"},
|
|
||||||
{"OK", "OK"},
|
|
||||||
{"Testing", "Test en cours"},
|
|
||||||
{"Firewalled", "Derrière un pare-feu"},
|
|
||||||
{"Unknown", "Inconnu"},
|
|
||||||
{"Proxy", "Proxy"},
|
|
||||||
{"Mesh", "Maillé"},
|
|
||||||
{"Clock skew", "Horloge décalée"},
|
|
||||||
{"Offline", "Hors ligne"},
|
|
||||||
{"Symmetric NAT", "NAT symétrique"},
|
|
||||||
{"Full cone NAT", "NAT à cône complet"},
|
|
||||||
{"No Descriptors", "Aucuns Descripteurs"},
|
|
||||||
{"Uptime", "Temps de fonctionnement"},
|
|
||||||
{"Network status", "État du réseau"},
|
|
||||||
{"Network status v6", "État du réseau v6"},
|
|
||||||
{"Stopping in", "Arrêt dans"},
|
|
||||||
{"Family", "Famille"},
|
|
||||||
{"Tunnel creation success rate", "Taux de succès de création de tunnels"},
|
|
||||||
{"Total tunnel creation success rate", "Taux de réussite de création de tunnel"},
|
|
||||||
{"Received", "Reçu"},
|
|
||||||
{"%.2f KiB/s", "%.2f Kio/s"},
|
|
||||||
{"Sent", "Envoyé"},
|
|
||||||
{"Transit", "Transité"},
|
|
||||||
{"Data path", "Emplacement des données"},
|
|
||||||
{"Hidden content. Press on text to see.", "Contenu caché. Cliquez sur le texte pour afficher."},
|
|
||||||
{"Router Ident", "Identifiant du routeur"},
|
|
||||||
{"Router Family", "Famille du routeur"},
|
|
||||||
{"Router Caps", "Limiteurs du routeur"},
|
|
||||||
{"Version", "Version"},
|
|
||||||
{"Our external address", "Notre adresse externe"},
|
|
||||||
{"supported", "supporté"},
|
|
||||||
{"Routers", "Routeurs"},
|
|
||||||
{"Floodfills", "Remplisseurs"},
|
|
||||||
{"Client Tunnels", "Tunnels clients"},
|
|
||||||
{"Services", "Services"},
|
|
||||||
{"Enabled", "Activé"},
|
|
||||||
{"Disabled", "Désactivé"},
|
|
||||||
{"Encrypted B33 address", "Adresse B33 chiffrée"},
|
|
||||||
{"Address registration line", "Ligne d'inscription de l'adresse"},
|
|
||||||
{"Domain", "Domaine"},
|
|
||||||
{"Generate", "Générer"},
|
|
||||||
{"<b>Note:</b> result string can be used only for registering 2LD domains (example.i2p). For registering subdomains please use i2pd-tools.", "<b>Note :</b> La chaîne résultante peut seulement être utilisée pour enregistrer les domaines 2LD (exemple.i2p). Pour enregistrer des sous-domaines, veuillez utiliser i2pd-tools."},
|
|
||||||
{"Address", "Adresse"},
|
|
||||||
{"Type", "Type"},
|
|
||||||
{"EncType", "EncType"},
|
|
||||||
{"Expire LeaseSet", "Expirer le jeu de baux"},
|
|
||||||
{"Inbound tunnels", "Tunnels entrants"},
|
|
||||||
{"%dms", "%dms"},
|
|
||||||
{"Outbound tunnels", "Tunnels sortants"},
|
|
||||||
{"Tags", "Balises"},
|
|
||||||
{"Incoming", "Entrant"},
|
|
||||||
{"Outgoing", "Sortant"},
|
|
||||||
{"Destination", "Destination"},
|
|
||||||
{"Amount", "Quantité"},
|
|
||||||
{"Incoming Tags", "Balises entrantes"},
|
|
||||||
{"Tags sessions", "Sessions des balises"},
|
|
||||||
{"Status", "Statut"},
|
|
||||||
{"Local Destination", "Destination locale"},
|
|
||||||
{"Streams", "Flux"},
|
|
||||||
{"Close stream", "Fermer le flux"},
|
|
||||||
{"Such destination is not found", "Cette destination est introuvable"},
|
|
||||||
{"I2CP session not found", "Session I2CP introuvable"},
|
|
||||||
{"I2CP is not enabled", "I2CP est désactivé"},
|
|
||||||
{"Invalid", "Invalide"},
|
|
||||||
{"Store type", "Type de stockage"},
|
|
||||||
{"Expires", "Expire"},
|
|
||||||
{"Non Expired Leases", "Baux non expirés"},
|
|
||||||
{"Gateway", "Passerelle"},
|
|
||||||
{"TunnelID", "ID du tunnel"},
|
|
||||||
{"EndDate", "Date de fin"},
|
|
||||||
{"floodfill mode is disabled", "le mode de remplissage est désactivé"},
|
|
||||||
{"Queue size", "Longueur de la file"},
|
|
||||||
{"Run peer test", "Lancer test des pairs"},
|
|
||||||
{"Reload tunnels configuration", "Recharger la configuration des tunnels"},
|
|
||||||
{"Decline transit tunnels", "Refuser les tunnels transitoires"},
|
|
||||||
{"Accept transit tunnels", "Accepter les tunnels transitoires"},
|
|
||||||
{"Cancel graceful shutdown", "Annuler l'arrêt gracieux"},
|
|
||||||
{"Start graceful shutdown", "Démarrer l'arrêt gracieux"},
|
|
||||||
{"Force shutdown", "Forcer l'arrêt"},
|
|
||||||
{"Reload external CSS styles", "Rafraîchir les styles CSS externes"},
|
|
||||||
{"<b>Note:</b> any action done here are not persistent and not changes your config files.", "<b>Note :</b> Toute action effectuée ici n'est pas permanente et ne modifie pas vos fichiers de configuration."},
|
|
||||||
{"Logging level", "Niveau de journalisation"},
|
|
||||||
{"Transit tunnels limit", "Limite sur les tunnels transitoires"},
|
|
||||||
{"Change", "Changer"},
|
|
||||||
{"Change language", "Changer la langue"},
|
|
||||||
{"no transit tunnels currently built", "aucun tunnel transitoire présentement établi"},
|
|
||||||
{"SAM disabled", "SAM désactivé"},
|
|
||||||
{"no sessions currently running", "aucune session présentement en cours"},
|
|
||||||
{"SAM session not found", "session SAM introuvable"},
|
|
||||||
{"SAM Session", "Session SAM"},
|
|
||||||
{"Server Tunnels", "Tunnels serveurs"},
|
|
||||||
{"Client Forwards", "Transmission du client"},
|
|
||||||
{"Server Forwards", "Transmission du serveur"},
|
|
||||||
{"Unknown page", "Page inconnue"},
|
|
||||||
{"Invalid token", "Jeton invalide"},
|
|
||||||
{"SUCCESS", "SUCCÈS"},
|
|
||||||
{"Stream closed", "Flux fermé"},
|
|
||||||
{"Stream not found or already was closed", "Flux introuvable ou déjà fermé"},
|
|
||||||
{"Destination not found", "Destination introuvable"},
|
|
||||||
{"StreamID can't be null", "StreamID ne peut pas être vide"},
|
|
||||||
{"Return to destination page", "Retourner à la page de destination"},
|
|
||||||
{"You will be redirected in %d seconds", "Vous serez redirigé dans %d secondes"},
|
|
||||||
{"LeaseSet expiration time updated", "Temps d'expiration du jeu de baux mis à jour"},
|
|
||||||
{"LeaseSet is not found or already expired", "Le jeu de baux est introuvable ou a déjà expiré"},
|
|
||||||
{"Transit tunnels count must not exceed %d", "Le nombre de tunnels de transit ne doit pas excéder %d"},
|
|
||||||
{"Back to commands list", "Retour à la liste des commandes"},
|
|
||||||
{"Register at reg.i2p", "Inscription à reg.i2p"},
|
|
||||||
{"Description", "Description"},
|
|
||||||
{"A bit information about service on domain", "Un peu d'information à propos des services disponibles dans le domaine"},
|
|
||||||
{"Submit", "Soumettre"},
|
|
||||||
{"Domain can't end with .b32.i2p", "Le domaine ne peut pas terminer par .b32.i2p"},
|
|
||||||
{"Domain must end with .i2p", "Le domaine doit terminer par .i2p"},
|
|
||||||
{"Unknown command", "Commande inconnue"},
|
|
||||||
{"Command accepted", "Commande acceptée"},
|
|
||||||
{"Proxy error", "Erreur de proxy"},
|
|
||||||
{"Proxy info", "Information sur le proxy"},
|
|
||||||
{"Proxy error: Host not found", "Erreur de proxy : Hôte introuvable"},
|
|
||||||
{"Remote host not found in router's addressbook", "Hôte distant introuvable dans le carnet d'adresse du routeur"},
|
|
||||||
{"You may try to find this host on jump services below", "Vous pouvez essayer de trouver cet hôte sur des services de redirection ci-dessous"},
|
|
||||||
{"Invalid request", "Requête invalide"},
|
|
||||||
{"Proxy unable to parse your request", "Proxy incapable de comprendre votre requête"},
|
|
||||||
{"Addresshelper is not supported", "Assistant d'adresse non supporté"},
|
|
||||||
{"Host %s is <font color=red>already in router's addressbook</font>. <b>Be careful: source of this URL may be harmful!</b> Click here to update record: <a href=\"%s%s%s&update=true\">Continue</a>.", "L'hôte %s est <font color=red>déjà dans le carnet d'adresses du routeur</font>. <b>Attention : la source de cette URL peut être nuisible !</b> Cliquez ici pour mettre à jour l'enregistrement : <a href=\"%s%s%s&update=true\">Continuer</a>."},
|
|
||||||
{"Addresshelper forced update rejected", "Mise à jour forcée des assistants d'adresses rejetée"},
|
|
||||||
{"To add host <b>%s</b> in router's addressbook, click here: <a href=\"%s%s%s\">Continue</a>.", "Pour ajouter l'hôte <b>%s</b> au carnet d'adresses du routeur, cliquez ici : <a href=\"%s%s%s\">Continuer</a>."},
|
|
||||||
{"Addresshelper request", "Demande à l'assistant d'adresse"},
|
|
||||||
{"Host %s added to router's addressbook from helper. Click here to proceed: <a href=\"%s\">Continue</a>.", "L'hôte %s a été ajouté au carnet d'adresses du routeur depuis l'assistant. Cliquez ici pour continuer : <a href=\"%s\">Continuer</a>."},
|
|
||||||
{"Addresshelper adding", "Ajout de l'assistant d'adresse"},
|
|
||||||
{"Host %s is <font color=red>already in router's addressbook</font>. Click here to update record: <a href=\"%s%s%s&update=true\">Continue</a>.", "L'hôte %s est <font color=red>déjà dans le carnet d'adresses du routeur</font>. Cliquez ici pour mettre à jour le dossier : <a href=\"%s%s%s&update=true\">Continuer</a>."},
|
|
||||||
{"Addresshelper update", "Mise à jour de l'assistant d'adresse"},
|
|
||||||
{"Invalid request URI", "URI de la requête invalide"},
|
|
||||||
{"Can't detect destination host from request", "Impossible de détecter l'hôte de destination à partir de la requête"},
|
|
||||||
{"Outproxy failure", "Échec de proxy de sortie"},
|
|
||||||
{"Bad outproxy settings", "Mauvaise configuration du proxy de sortie"},
|
|
||||||
{"Host %s is not inside I2P network, but outproxy is not enabled", "Hôte %s pas dans le réseau I2P, mais le proxy de sortie n'est pas activé"},
|
|
||||||
{"Unknown outproxy URL", "URL du proxy de sortie inconnu"},
|
|
||||||
{"Cannot resolve upstream proxy", "Impossible de résoudre l'adresse du proxy en amont"},
|
|
||||||
{"Hostname is too long", "Nom d'hôte trop long"},
|
|
||||||
{"Cannot connect to upstream SOCKS proxy", "Impossible de se connecter au proxy SOCKS en amont"},
|
|
||||||
{"Cannot negotiate with SOCKS proxy", "Impossible de négocier avec le proxy SOCKS"},
|
|
||||||
{"CONNECT error", "Erreur de connexion"},
|
|
||||||
{"Failed to connect", "Échec de connexion"},
|
|
||||||
{"SOCKS proxy error", "Erreur de proxy SOCKS"},
|
|
||||||
{"Failed to send request to upstream", "Erreur lors de l'envoie de la requête en amont"},
|
|
||||||
{"No reply from SOCKS proxy", "Pas de réponse du proxy SOCKS"},
|
|
||||||
{"Cannot connect", "Impossible de connecter"},
|
|
||||||
{"HTTP out proxy not implemented", "Proxy de sortie HTTP non implémenté"},
|
|
||||||
{"Cannot connect to upstream HTTP proxy", "Impossible de se connecter au proxy HTTP en amont"},
|
|
||||||
{"Host is down", "Hôte hors service"},
|
|
||||||
{"Can't create connection to requested host, it may be down. Please try again later.", "Impossible d'établir une connexion avec l'hôte, il est peut-être hors service. Veuillez réessayer plus tard."},
|
|
||||||
{"", ""},
|
|
||||||
};
|
|
||||||
|
|
||||||
static std::map<std::string, std::vector<std::string>> plurals
|
|
||||||
{
|
|
||||||
{"%d days", {"%d jour", "%d jours"}},
|
|
||||||
{"%d hours", {"%d heure", "%d heures"}},
|
|
||||||
{"%d minutes", {"%d minute", "%d minutes"}},
|
|
||||||
{"%d seconds", {"%d seconde", "%d secondes"}},
|
|
||||||
{"", {"", ""}},
|
|
||||||
};
|
|
||||||
|
|
||||||
std::shared_ptr<const i2p::i18n::Locale> GetLocale()
|
|
||||||
{
|
|
||||||
return std::make_shared<i2p::i18n::Locale>(language, strings, plurals, [] (int n)->int { return plural(n); });
|
|
||||||
}
|
|
||||||
|
|
||||||
} // language
|
|
||||||
} // i18n
|
|
||||||
} // i2p
|
|
||||||
147
i18n/German.cpp
147
i18n/German.cpp
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2022-2023, The PurpleI2P Project
|
* Copyright (c) 2022, The PurpleI2P Project
|
||||||
*
|
*
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
* This file is part of Purple i2pd project and licensed under BSD3
|
||||||
*
|
*
|
||||||
@@ -31,20 +31,19 @@ namespace german // language namespace
|
|||||||
|
|
||||||
static std::map<std::string, std::string> strings
|
static std::map<std::string, std::string> strings
|
||||||
{
|
{
|
||||||
{"%.2f KiB", "%.2f KiB"},
|
{"KiB", "KiB"},
|
||||||
{"%.2f MiB", "%.2f MiB"},
|
{"MiB", "MiB"},
|
||||||
{"%.2f GiB", "%.2f GiB"},
|
{"GiB", "GiB"},
|
||||||
{"building", "In Bau"},
|
{"building", "In Bau"},
|
||||||
{"failed", "fehlgeschlagen"},
|
{"failed", "fehlgeschlagen"},
|
||||||
{"expiring", "läuft ab"},
|
{"expiring", "läuft ab in"},
|
||||||
{"established", "hergestellt"},
|
{"established", "hergestellt"},
|
||||||
{"unknown", "Unbekannt"},
|
{"unknown", "Unbekannt"},
|
||||||
{"exploratory", "erforschend"},
|
{"exploratory", "erforschende"},
|
||||||
{"Purple I2P Webconsole", "Purple I2P-Webkonsole"},
|
{"<b>i2pd</b> webconsole", "<b>i2pd</b> Webkonsole"},
|
||||||
{"<b>i2pd</b> webconsole", "<b>i2pd</b>-Webkonsole"},
|
|
||||||
{"Main page", "Startseite"},
|
{"Main page", "Startseite"},
|
||||||
{"Router commands", "Routerbefehle"},
|
{"Router commands", "Router Befehle"},
|
||||||
{"Local Destinations", "Lokale Ziele"},
|
{"Local Destinations", "Lokale Destination"},
|
||||||
{"LeaseSets", "LeaseSets"},
|
{"LeaseSets", "LeaseSets"},
|
||||||
{"Tunnels", "Tunnel"},
|
{"Tunnels", "Tunnel"},
|
||||||
{"Transit Tunnels", "Transittunnel"},
|
{"Transit Tunnels", "Transittunnel"},
|
||||||
@@ -54,14 +53,14 @@ namespace german // language namespace
|
|||||||
{"ERROR", "FEHLER"},
|
{"ERROR", "FEHLER"},
|
||||||
{"OK", "OK"},
|
{"OK", "OK"},
|
||||||
{"Testing", "Testen"},
|
{"Testing", "Testen"},
|
||||||
{"Firewalled", "Hinter einer Firewall"},
|
{"Firewalled", "Hinter eine Firewall"},
|
||||||
{"Unknown", "Unbekannt"},
|
{"Unknown", "Unbekannt"},
|
||||||
{"Proxy", "Proxy"},
|
{"Proxy", "Proxy"},
|
||||||
{"Mesh", "Mesh"},
|
{"Mesh", "Mesh"},
|
||||||
|
{"Error", "Fehler"},
|
||||||
{"Clock skew", "Zeitabweichung"},
|
{"Clock skew", "Zeitabweichung"},
|
||||||
{"Offline", "Offline"},
|
{"Offline", "Offline"},
|
||||||
{"Symmetric NAT", "Symmetrisches NAT"},
|
{"Symmetric NAT", "Symmetrisches NAT"},
|
||||||
{"No Descriptors", "Keine Beschreibungen"},
|
|
||||||
{"Uptime", "Laufzeit"},
|
{"Uptime", "Laufzeit"},
|
||||||
{"Network status", "Netzwerkstatus"},
|
{"Network status", "Netzwerkstatus"},
|
||||||
{"Network status v6", "Netzwerkstatus v6"},
|
{"Network status v6", "Netzwerkstatus v6"},
|
||||||
@@ -69,7 +68,7 @@ namespace german // language namespace
|
|||||||
{"Family", "Familie"},
|
{"Family", "Familie"},
|
||||||
{"Tunnel creation success rate", "Erfolgsrate der Tunnelerstellung"},
|
{"Tunnel creation success rate", "Erfolgsrate der Tunnelerstellung"},
|
||||||
{"Received", "Eingegangen"},
|
{"Received", "Eingegangen"},
|
||||||
{"%.2f KiB/s", "%.2f KiB/s"},
|
{"KiB/s", "KiB/s"},
|
||||||
{"Sent", "Gesendet"},
|
{"Sent", "Gesendet"},
|
||||||
{"Transit", "Transit"},
|
{"Transit", "Transit"},
|
||||||
{"Data path", "Datenpfad"},
|
{"Data path", "Datenpfad"},
|
||||||
@@ -82,33 +81,33 @@ namespace german // language namespace
|
|||||||
{"supported", "unterstützt"},
|
{"supported", "unterstützt"},
|
||||||
{"Routers", "Router"},
|
{"Routers", "Router"},
|
||||||
{"Floodfills", "Floodfills"},
|
{"Floodfills", "Floodfills"},
|
||||||
{"Client Tunnels", "Clienttunnel"},
|
{"Client Tunnels", "Klienttunnel"},
|
||||||
{"Services", "Services"},
|
{"Services", "Services"},
|
||||||
{"Enabled", "Aktiviert"},
|
{"Enabled", "Aktiviert"},
|
||||||
{"Disabled", "Deaktiviert"},
|
{"Disabled", "Deaktiviert"},
|
||||||
{"Encrypted B33 address", "Verschlüsselte B33-Adresse"},
|
{"Encrypted B33 address", "Verschlüsselte B33 Adresse"},
|
||||||
{"Address registration line", "Adressregistrierungszeile"},
|
{"Address registration line", "Adresseregistrierungszeile"},
|
||||||
{"Domain", "Domain"},
|
{"Domain", "Domain"},
|
||||||
{"Generate", "Generieren"},
|
{"Generate", "Generieren"},
|
||||||
{"<b>Note:</b> result string can be used only for registering 2LD domains (example.i2p). For registering subdomains please use i2pd-tools.", "<b>Hinweis:</b> Der resultierende String kann nur für die Registrierung einer 2LD-Domain (beispiel.i2p) benutzt werden. Für die Registrierung von Subdomains kann i2pd-tools verwendet werden."},
|
{"<b>Note:</b> result string can be used only for registering 2LD domains (example.i2p). For registering subdomains please use i2pd-tools.", "<b>Hinweis:</b> Der resultierende String kann nur für die Registrierung einer 2LD Domain (beispiel.i2p) benutzt werden. Für die Registrierung von Subdomains kann i2pd-tools verwendet werden."},
|
||||||
{"Address", "Adresse"},
|
{"Address", "Adresse"},
|
||||||
{"Type", "Typ"},
|
{"Type", "Typ"},
|
||||||
{"EncType", "Verschlüsselungstyp"},
|
{"EncType", "Verschlüsselungstyp"},
|
||||||
{"Inbound tunnels", "Eingehende Tunnel"},
|
{"Inbound tunnels", "Eingehende Tunnel"},
|
||||||
{"%dms", "%dms"},
|
{"ms", "ms"},
|
||||||
{"Outbound tunnels", "Ausgehende Tunnel"},
|
{"Outbound tunnels", "Ausgehende Tunnel"},
|
||||||
{"Tags", "Tags"},
|
{"Tags", "Tags"},
|
||||||
{"Incoming", "Eingehend"},
|
{"Incoming", "Eingehend"},
|
||||||
{"Outgoing", "Ausgehend"},
|
{"Outgoing", "Ausgehend"},
|
||||||
{"Destination", "Ziel"},
|
{"Destination", "Destination"},
|
||||||
{"Amount", "Anzahl"},
|
{"Amount", "Anzahl"},
|
||||||
{"Incoming Tags", "Eingehende Tags"},
|
{"Incoming Tags", "Eingehende Tags"},
|
||||||
{"Tags sessions", "Tags-Sitzungen"},
|
{"Tags sessions", "Tags Sitzungen"},
|
||||||
{"Status", "Status"},
|
{"Status", "Status"},
|
||||||
{"Local Destination", "Lokales Ziel"},
|
{"Local Destination", "Lokale Destination"},
|
||||||
{"Streams", "Streams"},
|
{"Streams", "Streams"},
|
||||||
{"Close stream", "Stream schließen"},
|
{"Close stream", "Stream schließen"},
|
||||||
{"I2CP session not found", "I2CP-Sitzung nicht gefunden"},
|
{"I2CP session not found", "I2CP Sitzung nicht gefunden"},
|
||||||
{"I2CP is not enabled", "I2CP ist nicht aktiviert"},
|
{"I2CP is not enabled", "I2CP ist nicht aktiviert"},
|
||||||
{"Invalid", "Ungültig"},
|
{"Invalid", "Ungültig"},
|
||||||
{"Store type", "Speichertyp"},
|
{"Store type", "Speichertyp"},
|
||||||
@@ -117,94 +116,92 @@ namespace german // language namespace
|
|||||||
{"Gateway", "Gateway"},
|
{"Gateway", "Gateway"},
|
||||||
{"TunnelID", "TunnelID"},
|
{"TunnelID", "TunnelID"},
|
||||||
{"EndDate", "Enddatum"},
|
{"EndDate", "Enddatum"},
|
||||||
{"floodfill mode is disabled", "Floodfill Modus ist deaktiviert"},
|
{"not floodfill", "kein Floodfill"},
|
||||||
{"Queue size", "Größe der Warteschlange"},
|
{"Queue size", "Warteschlangengröße"},
|
||||||
{"Run peer test", "Peer-Test durchführen"},
|
{"Run peer test", "Peer-Test ausführen"},
|
||||||
{"Reload tunnels configuration", "Tunnel Konfiguration neu laden"},
|
|
||||||
{"Decline transit tunnels", "Transittunnel ablehnen"},
|
{"Decline transit tunnels", "Transittunnel ablehnen"},
|
||||||
{"Accept transit tunnels", "Transittunnel akzeptieren"},
|
{"Accept transit tunnels", "Transittunnel akzeptieren"},
|
||||||
{"Cancel graceful shutdown", "Beende das kontrollierte Herunterfahren"},
|
{"Cancel graceful shutdown", "Beende das kontrollierte herunterfahren"},
|
||||||
{"Start graceful shutdown", "Starte das kontrollierte Herunterfahren"},
|
{"Start graceful shutdown", "Starte das kontrollierte Herunterfahren"},
|
||||||
{"Force shutdown", "Herunterfahren erzwingen"},
|
{"Force shutdown", "Herunterfahren erzwingen"},
|
||||||
{"Reload external CSS styles", "Lade externe CSS-Stile neu"},
|
{"Reload external CSS styles", "Lade externe CSS-Styles neu"},
|
||||||
{"<b>Note:</b> any action done here are not persistent and not changes your config files.", "<b>Hinweis:</b> Alle hier durchgeführten Aktionen sind nicht dauerhaft und ändern die Konfigurationsdateien nicht."},
|
{"<b>Note:</b> any action done here are not persistent and not changes your config files.", "<b>Hinweis:</b> Alle hier durchgeführten Aktionen sind nicht dauerhaft und ändern die Konfigurationsdateien nicht."},
|
||||||
{"Logging level", "Protokollierungslevel"},
|
{"Logging level", "Protokollierungslevel"},
|
||||||
{"Transit tunnels limit", "Limit für Transittunnel"},
|
{"Transit tunnels limit", "Limit für Transittunnel"},
|
||||||
{"Change", "Ändern"},
|
{"Change", "Verändern"},
|
||||||
{"Change language", "Sprache ändern"},
|
{"Change language", "Sprache ändern"},
|
||||||
{"no transit tunnels currently built", "derzeit keine Transittunnel aufgebaut"},
|
{"no transit tunnels currently built", "derzeit keine Transittunnel aufgebaut"},
|
||||||
{"SAM disabled", "SAM deaktiviert"},
|
{"SAM disabled", "SAM deaktiviert"},
|
||||||
{"no sessions currently running", "Derzeit keine laufenden Sitzungen"},
|
{"no sessions currently running", "Derzeit keine laufenden Sitzungen"},
|
||||||
{"SAM session not found", "SAM-Sitzung nicht gefunden"},
|
{"SAM session not found", "SAM Sitzung nicht gefunden"},
|
||||||
{"SAM Session", "SAM-Sitzung"},
|
{"SAM Session", "SAM Sitzung"},
|
||||||
{"Server Tunnels", "Servertunnel"},
|
{"Server Tunnels", "Servertunnel"},
|
||||||
{"Client Forwards", "Client-Weiterleitungen"},
|
{"Client Forwards", "Klient-Weiterleitungen"},
|
||||||
{"Server Forwards", "Server-Weiterleitungen"},
|
{"Server Forwards", "Server-Weiterleitungen"},
|
||||||
{"Unknown page", "Unbekannte Seite"},
|
{"Unknown page", "Unbekannte Seite"},
|
||||||
{"Invalid token", "Ungültiger Token"},
|
{"Invalid token", "Ungültiger Token"},
|
||||||
{"SUCCESS", "ERFOLGREICH"},
|
{"SUCCESS", "ERFOLGREICH"},
|
||||||
{"Stream closed", "Stream geschlossen"},
|
{"Stream closed", "Stream geschlossen"},
|
||||||
{"Stream not found or already was closed", "Stream nicht gefunden oder bereits geschlossen"},
|
{"Stream not found or already was closed", "Stream nicht gefunden oder bereits geschlossen"},
|
||||||
{"Destination not found", "Ziel nicht gefunden"},
|
{"Destination not found", "Destination nicht gefunden"},
|
||||||
{"StreamID can't be null", "StreamID kann nicht null sein"},
|
{"StreamID can't be null", "StreamID kann nicht null sein"},
|
||||||
{"Return to destination page", "Zurück zur Ziel-Seite"},
|
{"Return to destination page", "Zurück zur Destination-Seite"},
|
||||||
{"You will be redirected in %d seconds", "Du wirst umgeleitet in %d Sekunden"},
|
{"You will be redirected in 5 seconds", "Du wirst in 5 Sekunden weitergeleitet"},
|
||||||
{"Transit tunnels count must not exceed %d", "Die Anzahl der Transittunnel darf nicht über %d gehen"},
|
{"Transit tunnels count must not exceed 65535", "Es darf maximal 65535 Transittunnel geben"},
|
||||||
{"Back to commands list", "Zurück zur Befehlsliste"},
|
{"Back to commands list", "Zurück zur Kommandoliste"},
|
||||||
{"Register at reg.i2p", "Auf reg.i2p registrieren"},
|
{"Register at reg.i2p", "Auf reg.i2p registrieren"},
|
||||||
{"Description", "Beschreibung"},
|
{"Description", "Beschreibung"},
|
||||||
{"A bit information about service on domain", "Ein paar Informationen über den Service auf der Domain"},
|
{"A bit information about service on domain", "Ein bisschen Informationen über den Service auf der Domain"},
|
||||||
{"Submit", "Absenden"},
|
{"Submit", "Einreichen"},
|
||||||
{"Domain can't end with .b32.i2p", "Domain kann nicht auf .b32.i2p enden"},
|
{"Domain can't end with .b32.i2p", "Domain kann nicht mit .b32.i2p enden"},
|
||||||
{"Domain must end with .i2p", "Domain muss auf .i2p enden"},
|
{"Domain must end with .i2p", "Domain muss mit .i2p enden"},
|
||||||
{"Such destination is not found", "Ein solches Ziel konnte nicht gefunden werden"},
|
{"Such destination is not found", "Eine solche Destination konnte nicht gefunden werden"},
|
||||||
{"Unknown command", "Unbekannter Befehl"},
|
{"Unknown command", "Unbekannter Befehl"},
|
||||||
{"Command accepted", "Befehl akzeptiert"},
|
{"Command accepted", "Befehl akzeptiert"},
|
||||||
{"Proxy error", "Proxy-Fehler"},
|
{"Proxy error", "Proxy-Fehler"},
|
||||||
{"Proxy info", "Proxy-Info"},
|
{"Proxy info", "Proxy-Info"},
|
||||||
{"Proxy error: Host not found", "Proxy-Fehler: Host nicht gefunden"},
|
{"Proxy error: Host not found", "Proxy-Fehler: Host nicht gefunden"},
|
||||||
{"Remote host not found in router's addressbook", "Remote-Host nicht im Router-Adressbuch gefunden"},
|
{"Remote host not found in router's addressbook", "Remote-Host nicht im Router Adressbuch gefunden"},
|
||||||
{"You may try to find this host on jump services below", "Vielleicht kannst du diesen Host auf einem der nachfolgenden Jump-Services finden"},
|
{"You may try to find this host on jump services below", "Vielleicht kannst du diesen Host auf einen der Jump-Services unten finden"},
|
||||||
{"Invalid request", "Ungültige Anfrage"},
|
{"Invalid request", "Ungültige Anfrage"},
|
||||||
{"Proxy unable to parse your request", "Proxy konnte die Anfrage nicht verarbeiten"},
|
{"Proxy unable to parse your request", "Proxy konnte die Anfrage nicht interpretieren"},
|
||||||
{"Addresshelper is not supported", "Adresshelfer wird nicht unterstützt"},
|
{"addresshelper is not supported", "addresshelper wird nicht unterstützt"},
|
||||||
{"Host %s is <font color=red>already in router's addressbook</font>. <b>Be careful: source of this URL may be harmful!</b> Click here to update record: <a href=\"%s%s%s&update=true\">Continue</a>.", "Host %s ist <font color=red>bereits im Adressbuch des Routers</font>. <b>Vorsicht: Die Quelle dieser URL kann schädlich sein!</b> Klicken Sie hier, um den Datensatz zu aktualisieren: <a href=\"%s%s%s&update=true\">Weiter</a>."},
|
{"Host", "Host"},
|
||||||
{"Addresshelper forced update rejected", "Adresshelfer gezwungene Aktualisierung abgelehnt"},
|
{"added to router's addressbook from helper", "vom Helfer zum Router Adressbuch hinzugefügt"},
|
||||||
{"To add host <b>%s</b> in router's addressbook, click here: <a href=\"%s%s%s\">Continue</a>.", "Um den Host <b>%s</b> im Adressbuch des Routers hinzuzufügen, klicken Sie hier: <a href=\"%s%s%s\">Weiter</a>."},
|
{"Click here to proceed:", "Klicke hier um fortzufahren:"},
|
||||||
{"Addresshelper request", "Adresshelfer gefunden"},
|
{"Continue", "Fortsetzen"},
|
||||||
{"Host %s added to router's addressbook from helper. Click here to proceed: <a href=\"%s\">Continue</a>.", "Host %s wurde vom Helfer zum Adressbuch des Routers hinzugefügt. Klicken Sie hier, um fortzufahren: <a href=\"%s\">Weiter</a>."},
|
{"Addresshelper found", "Adresshelfer gefunden"},
|
||||||
{"Addresshelper adding", "Adresshelfer hinzufügen"},
|
{"already in router's addressbook", "bereits im Adressbuch des Routers"},
|
||||||
{"Host %s is <font color=red>already in router's addressbook</font>. Click here to update record: <a href=\"%s%s%s&update=true\">Continue</a>.", "Host %s ist <font color=red>bereits im Adressbuch des Routers</font>. Klicken Sie hier, um den Eintrag zu aktualisieren: <a href=\"%s%s%s&update=true\">Weiter</a>."},
|
{"Click here to update record:", "Klicke hier, um den Eintrag zu aktualisieren:"},
|
||||||
{"Addresshelper update", "Adresshelfer aktualisieren"},
|
{"invalid request uri", "ungültige Anfrage-URI"},
|
||||||
{"Invalid request URI", "Ungültige Anfrage-URI"},
|
{"Can't detect destination host from request", "Kann Anhand der Anfrage den Destination-Host nicht erkennen"},
|
||||||
{"Can't detect destination host from request", "Kann den Ziel-Host von der Anfrage nicht erkennen"},
|
|
||||||
{"Outproxy failure", "Outproxy-Fehler"},
|
{"Outproxy failure", "Outproxy-Fehler"},
|
||||||
{"Bad outproxy settings", "Ungültige Outproxy-Einstellungen"},
|
{"bad outproxy settings", "ungültige Outproxy-Einstellungen"},
|
||||||
{"Host %s is not inside I2P network, but outproxy is not enabled", "Host %s außerhalb des I2P-Netzwerks, aber Outproxy ist nicht aktiviert"},
|
{"not inside I2P network, but outproxy is not enabled", "nicht innerhalb des I2P-Netzwerks, aber Outproxy ist nicht aktiviert"},
|
||||||
{"Unknown outproxy URL", "Unbekannte Outproxy-URL"},
|
{"unknown outproxy url", "unbekannte Outproxy-URL"},
|
||||||
{"Cannot resolve upstream proxy", "Kann den Upstream-Proxy nicht auflösen"},
|
{"cannot resolve upstream proxy", "kann den Upstream-Proxy nicht auflösen"},
|
||||||
{"Hostname is too long", "Hostname zu lang"},
|
{"hostname too long", "Hostname zu lang"},
|
||||||
{"Cannot connect to upstream SOCKS proxy", "Kann keine Verbindung zum Upstream-SOCKS-Proxy herstellen"},
|
{"cannot connect to upstream socks proxy", "Kann keine Verbindung zum Upstream-Socks-Proxy herstellen"},
|
||||||
{"Cannot negotiate with SOCKS proxy", "Kann nicht mit SOCKS-Proxy verhandeln"},
|
{"Cannot negotiate with socks proxy", "Kann nicht mit Socks-Proxy verhandeln"},
|
||||||
{"CONNECT error", "CONNECT-Fehler"},
|
{"CONNECT error", "CONNECT-Fehler"},
|
||||||
{"Failed to connect", "Verbindung konnte nicht hergestellt werden"},
|
{"Failed to Connect", "Verbindung konnte nicht hergestellt werden"},
|
||||||
{"SOCKS proxy error", "SOCKS-Proxy-Fehler"},
|
{"socks proxy error", "Socks-Proxy-Fehler"},
|
||||||
{"Failed to send request to upstream", "Anfrage an den Upstream zu senden ist gescheitert"},
|
{"failed to send request to upstream", "Anfrage an den Upstream zu senden ist gescheitert"},
|
||||||
{"No reply from SOCKS proxy", "Keine Antwort vom SOCKS-Proxy"},
|
{"No Reply From socks proxy", "Keine Antwort vom Socks-Proxy"},
|
||||||
{"Cannot connect", "Kann nicht verbinden"},
|
{"cannot connect", "kann nicht verbinden"},
|
||||||
{"HTTP out proxy not implemented", "HTTP-Outproxy nicht implementiert"},
|
{"http out proxy not implemented", "HTTP-Outproxy nicht implementiert"},
|
||||||
{"Cannot connect to upstream HTTP proxy", "Kann nicht zu Upstream-HTTP-Proxy verbinden"},
|
{"cannot connect to upstream http proxy", "Kann nicht zu Upstream-HTTP-Proxy verbinden"},
|
||||||
{"Host is down", "Host ist offline"},
|
{"Host is down", "Host ist offline"},
|
||||||
{"Can't create connection to requested host, it may be down. Please try again later.", "Konnte keine Verbindung zum angefragten Host aufbauen, vielleicht ist er offline. Versuche es später noch mal."},
|
{"Can't create connection to requested host, it may be down. Please try again later.", "Konnte keine Verbindung zum angefragten Host aufbaunen, vielleicht ist es offline. Versuche es später noch einmal."},
|
||||||
{"", ""},
|
{"", ""},
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::map<std::string, std::vector<std::string>> plurals
|
static std::map<std::string, std::vector<std::string>> plurals
|
||||||
{
|
{
|
||||||
{"%d days", {"%d Tag", "%d Tage"}},
|
{"days", {"Tag", "Tage"}},
|
||||||
{"%d hours", {"%d Stunde", "%d Stunden"}},
|
{"hours", {"Stunde", "Stunden"}},
|
||||||
{"%d minutes", {"%d Minute", "%d Minuten"}},
|
{"minutes", {"Minute", "Minuten"}},
|
||||||
{"%d seconds", {"%d Sekunde", "%d Sekunden"}},
|
{"seconds", {"Sekunde", "Sekunden"}},
|
||||||
{"", {"", ""}},
|
{"", {"", ""}},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2021-2023, The PurpleI2P Project
|
|
||||||
*
|
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
|
||||||
*
|
|
||||||
* See full license text in LICENSE file at top of project tree
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <clocale>
|
|
||||||
#include "ClientContext.h"
|
|
||||||
#include "I18N_langs.h"
|
|
||||||
#include "I18N.h"
|
|
||||||
|
|
||||||
namespace i2p
|
|
||||||
{
|
|
||||||
namespace i18n
|
|
||||||
{
|
|
||||||
void SetLanguage(const std::string &lang)
|
|
||||||
{
|
|
||||||
const auto it = i2p::i18n::languages.find(lang);
|
|
||||||
if (it == i2p::i18n::languages.end()) // fallback
|
|
||||||
{
|
|
||||||
i2p::client::context.SetLanguage (i2p::i18n::english::GetLocale());
|
|
||||||
setlocale(LC_NUMERIC, "english");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
i2p::client::context.SetLanguage (it->second.LocaleFunc());
|
|
||||||
setlocale(LC_NUMERIC, lang.c_str()); // set decimal point based on language
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string translate (const std::string& arg)
|
|
||||||
{
|
|
||||||
return i2p::client::context.GetLanguage ()->GetString (arg);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string translate (const std::string& arg, const std::string& arg2, const int& n)
|
|
||||||
{
|
|
||||||
return i2p::client::context.GetLanguage ()->GetPlural (arg, arg2, n);
|
|
||||||
}
|
|
||||||
} // i18n
|
|
||||||
} // i2p
|
|
||||||
130
i18n/I18N.h
130
i18n/I18N.h
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2021-2023, The PurpleI2P Project
|
* Copyright (c) 2021-2022, The PurpleI2P Project
|
||||||
*
|
*
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
* This file is part of Purple i2pd project and licensed under BSD3
|
||||||
*
|
*
|
||||||
@@ -9,127 +9,37 @@
|
|||||||
#ifndef __I18N_H__
|
#ifndef __I18N_H__
|
||||||
#define __I18N_H__
|
#define __I18N_H__
|
||||||
|
|
||||||
#include <string>
|
#include "ClientContext.h"
|
||||||
#include <map>
|
|
||||||
#include <utility>
|
|
||||||
#include <functional>
|
|
||||||
|
|
||||||
namespace i2p
|
namespace i2p
|
||||||
{
|
{
|
||||||
namespace i18n
|
namespace i18n
|
||||||
{
|
{
|
||||||
class Locale
|
inline void SetLanguage(const std::string &lang)
|
||||||
{
|
{
|
||||||
public:
|
const auto it = i2p::i18n::languages.find(lang);
|
||||||
Locale (
|
if (it == i2p::i18n::languages.end()) // fallback
|
||||||
const std::string& language,
|
i2p::client::context.SetLanguage (i2p::i18n::english::GetLocale());
|
||||||
const std::map<std::string, std::string>& strings,
|
else
|
||||||
const std::map<std::string, std::vector<std::string>>& plurals,
|
i2p::client::context.SetLanguage (it->second.LocaleFunc());
|
||||||
std::function<int(int)> formula
|
}
|
||||||
): m_Language (language), m_Strings (strings), m_Plurals (plurals), m_Formula (formula) { };
|
|
||||||
|
|
||||||
// Get activated language name for webconsole
|
inline std::string translate (const std::string& arg)
|
||||||
std::string GetLanguage() const
|
{
|
||||||
{
|
return i2p::client::context.GetLanguage ()->GetString (arg);
|
||||||
return m_Language;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
std::string GetString (const std::string& arg) const
|
inline std::string translate (const std::string& arg, const std::string& arg2, const int& n)
|
||||||
{
|
{
|
||||||
const auto it = m_Strings.find(arg);
|
return i2p::client::context.GetLanguage ()->GetPlural (arg, arg2, n);
|
||||||
if (it == m_Strings.end())
|
}
|
||||||
{
|
|
||||||
return arg;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return it->second;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string GetPlural (const std::string& arg, const std::string& arg2, const int& n) const
|
|
||||||
{
|
|
||||||
const auto it = m_Plurals.find(arg2);
|
|
||||||
if (it == m_Plurals.end()) // not found, fallback to english
|
|
||||||
{
|
|
||||||
return n == 1 ? arg : arg2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int form = m_Formula(n);
|
|
||||||
return it->second[form];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
const std::string m_Language;
|
|
||||||
const std::map<std::string, std::string> m_Strings;
|
|
||||||
const std::map<std::string, std::vector<std::string>> m_Plurals;
|
|
||||||
std::function<int(int)> m_Formula;
|
|
||||||
};
|
|
||||||
|
|
||||||
void SetLanguage(const std::string &lang);
|
|
||||||
std::string translate (const std::string& arg);
|
|
||||||
std::string translate (const std::string& arg, const std::string& arg2, const int& n);
|
|
||||||
} // i18n
|
} // i18n
|
||||||
} // i2p
|
} // i2p
|
||||||
|
|
||||||
/**
|
template<typename... TArgs>
|
||||||
* @brief Get translation of string
|
std::string tr (TArgs&&... args)
|
||||||
* @param arg String with message
|
|
||||||
*/
|
|
||||||
template<typename TValue>
|
|
||||||
std::string tr (TValue&& arg)
|
|
||||||
{
|
{
|
||||||
return i2p::i18n::translate(std::forward<TValue>(arg));
|
return i2p::i18n::translate(std::forward<TArgs>(args)...);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get translation of string and format it
|
|
||||||
* @param arg String with message
|
|
||||||
* @param args Array of arguments for string formatting
|
|
||||||
*/
|
|
||||||
template<typename TValue, typename... TArgs>
|
|
||||||
std::string tr (TValue&& arg, TArgs&&... args)
|
|
||||||
{
|
|
||||||
std::string tr_str = i2p::i18n::translate(std::forward<TValue>(arg));
|
|
||||||
|
|
||||||
size_t size = std::snprintf(NULL, 0, tr_str.c_str(), std::forward<TArgs>(args)...);
|
|
||||||
std::string str(size, 0);
|
|
||||||
std::snprintf(&str.front(), size + 1, tr_str.c_str(), std::forward<TArgs>(args)...);
|
|
||||||
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get translation of string with plural forms
|
|
||||||
* @param arg String with message in singular form
|
|
||||||
* @param arg2 String with message in plural form
|
|
||||||
* @param n Integer, used for selection of form
|
|
||||||
*/
|
|
||||||
template<typename TValue, typename TValue2>
|
|
||||||
std::string ntr (TValue&& arg, TValue2&& arg2, int& n)
|
|
||||||
{
|
|
||||||
return i2p::i18n::translate(std::forward<TValue>(arg), std::forward<TValue2>(arg2), std::forward<int>(n));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get translation of string with plural forms and format it
|
|
||||||
* @param arg String with message in singular form
|
|
||||||
* @param arg2 String with message in plural form
|
|
||||||
* @param n Integer, used for selection of form
|
|
||||||
* @param args Array of arguments for string formatting
|
|
||||||
*/
|
|
||||||
template<typename TValue, typename TValue2, typename... TArgs>
|
|
||||||
std::string ntr (TValue&& arg, TValue2&& arg2, int& n, TArgs&&... args)
|
|
||||||
{
|
|
||||||
std::string tr_str = i2p::i18n::translate(std::forward<TValue>(arg), std::forward<TValue2>(arg2), std::forward<int>(n));
|
|
||||||
|
|
||||||
size_t size = std::snprintf(NULL, 0, tr_str.c_str(), std::forward<TArgs>(args)...);
|
|
||||||
std::string str(size, 0);
|
|
||||||
std::snprintf(&str.front(), size + 1, tr_str.c_str(), std::forward<TArgs>(args)...);
|
|
||||||
|
|
||||||
return str;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __I18N_H__
|
#endif // __I18N_H__
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2021-2023, The PurpleI2P Project
|
* Copyright (c) 2021-2022, The PurpleI2P Project
|
||||||
*
|
*
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
* This file is part of Purple i2pd project and licensed under BSD3
|
||||||
*
|
*
|
||||||
@@ -9,12 +9,60 @@
|
|||||||
#ifndef __I18N_LANGS_H__
|
#ifndef __I18N_LANGS_H__
|
||||||
#define __I18N_LANGS_H__
|
#define __I18N_LANGS_H__
|
||||||
|
|
||||||
#include "I18N.h"
|
|
||||||
|
|
||||||
namespace i2p
|
namespace i2p
|
||||||
{
|
{
|
||||||
namespace i18n
|
namespace i18n
|
||||||
{
|
{
|
||||||
|
class Locale
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Locale (
|
||||||
|
const std::string& language,
|
||||||
|
const std::map<std::string, std::string>& strings,
|
||||||
|
const std::map<std::string, std::vector<std::string>>& plurals,
|
||||||
|
std::function<int(int)> formula
|
||||||
|
): m_Language (language), m_Strings (strings), m_Plurals (plurals), m_Formula (formula) { };
|
||||||
|
|
||||||
|
// Get activated language name for webconsole
|
||||||
|
std::string GetLanguage() const
|
||||||
|
{
|
||||||
|
return m_Language;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string GetString (const std::string& arg) const
|
||||||
|
{
|
||||||
|
const auto it = m_Strings.find(arg);
|
||||||
|
if (it == m_Strings.end())
|
||||||
|
{
|
||||||
|
return arg;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return it->second;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string GetPlural (const std::string& arg, const std::string& arg2, const int& n) const
|
||||||
|
{
|
||||||
|
const auto it = m_Plurals.find(arg2);
|
||||||
|
if (it == m_Plurals.end()) // not found, fallback to english
|
||||||
|
{
|
||||||
|
return n == 1 ? arg : arg2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int form = m_Formula(n);
|
||||||
|
return it->second[form];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
const std::string m_Language;
|
||||||
|
const std::map<std::string, std::string> m_Strings;
|
||||||
|
const std::map<std::string, std::vector<std::string>> m_Plurals;
|
||||||
|
std::function<int(int)> m_Formula;
|
||||||
|
};
|
||||||
|
|
||||||
struct langData
|
struct langData
|
||||||
{
|
{
|
||||||
std::string LocaleName; // localized name
|
std::string LocaleName; // localized name
|
||||||
@@ -23,23 +71,14 @@ namespace i18n
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Add localization here with language name as namespace
|
// Add localization here with language name as namespace
|
||||||
namespace afrikaans { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
namespace afrikaans { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
||||||
namespace armenian { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
namespace armenian { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
||||||
namespace chinese { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
namespace english { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
||||||
namespace czech { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
namespace german { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
||||||
namespace english { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
namespace russian { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
||||||
namespace french { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
namespace turkmen { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
||||||
namespace german { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
namespace ukrainian { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
||||||
namespace italian { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
namespace uzbek { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
||||||
namespace polish { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
|
||||||
namespace portuguese { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
|
||||||
namespace russian { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
|
||||||
namespace spanish { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
|
||||||
namespace swedish { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
|
||||||
namespace turkish { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
|
||||||
namespace turkmen { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
|
||||||
namespace ukrainian { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
|
||||||
namespace uzbek { std::shared_ptr<const i2p::i18n::Locale> GetLocale (); }
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* That map contains international language name lower-case, name in it's language and it's code
|
* That map contains international language name lower-case, name in it's language and it's code
|
||||||
@@ -47,21 +86,12 @@ namespace i18n
|
|||||||
static std::map<std::string, langData> languages
|
static std::map<std::string, langData> languages
|
||||||
{
|
{
|
||||||
{ "afrikaans", {"Afrikaans", "af", i2p::i18n::afrikaans::GetLocale} },
|
{ "afrikaans", {"Afrikaans", "af", i2p::i18n::afrikaans::GetLocale} },
|
||||||
{ "armenian", {"hայերէն", "hy", i2p::i18n::armenian::GetLocale} },
|
{ "armenian", {"հայերէն", "hy", i2p::i18n::armenian::GetLocale} },
|
||||||
{ "chinese", {"简体字", "zh-CN", i2p::i18n::chinese::GetLocale} },
|
|
||||||
{ "czech", {"čeština", "cs", i2p::i18n::czech::GetLocale} },
|
|
||||||
{ "english", {"English", "en", i2p::i18n::english::GetLocale} },
|
{ "english", {"English", "en", i2p::i18n::english::GetLocale} },
|
||||||
{ "french", {"Français", "fr", i2p::i18n::french::GetLocale} },
|
|
||||||
{ "german", {"Deutsch", "de", i2p::i18n::german::GetLocale} },
|
{ "german", {"Deutsch", "de", i2p::i18n::german::GetLocale} },
|
||||||
{ "italian", {"Italiano", "it", i2p::i18n::italian::GetLocale} },
|
{ "russian", {"русский язык", "ru", i2p::i18n::russian::GetLocale} },
|
||||||
{ "polish", {"Polski", "pl", i2p::i18n::polish::GetLocale} },
|
{ "turkmen", {"türkmen dili", "tk", i2p::i18n::turkmen::GetLocale} },
|
||||||
{ "portuguese", {"Português", "pt", i2p::i18n::portuguese::GetLocale} },
|
{ "ukrainian", {"украї́нська мо́ва", "uk", i2p::i18n::ukrainian::GetLocale} },
|
||||||
{ "russian", {"Русский язык", "ru", i2p::i18n::russian::GetLocale} },
|
|
||||||
{ "spanish", {"Español", "es", i2p::i18n::spanish::GetLocale} },
|
|
||||||
{ "swedish", {"Svenska", "sv", i2p::i18n::swedish::GetLocale} },
|
|
||||||
{ "turkish", {"Türk dili", "tr", i2p::i18n::turkish::GetLocale} },
|
|
||||||
{ "turkmen", {"Türkmen dili", "tk", i2p::i18n::turkmen::GetLocale} },
|
|
||||||
{ "ukrainian", {"Украї́нська мо́ва", "uk", i2p::i18n::ukrainian::GetLocale} },
|
|
||||||
{ "uzbek", {"Oʻzbek", "uz", i2p::i18n::uzbek::GetLocale} },
|
{ "uzbek", {"Oʻzbek", "uz", i2p::i18n::uzbek::GetLocale} },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user