1
0
mirror of https://github.com/PurpleI2P/i2pd-android.git synced 2025-03-13 05:51:12 +00:00

Compare commits

...

24 Commits

Author SHA1 Message Date
8c533cbbfc
2.56.0
Signed-off-by: r4sas <r4sas@i2pmail.org>
2025-02-12 20:37:43 +00:00
8236649d2e
update boost submodule
Signed-off-by: r4sas <r4sas@i2pmail.org>
2025-01-09 21:08:22 +00:00
d6347329e1
update boost submodule, add exit code check
Signed-off-by: r4sas <r4sas@i2pmail.org>
2025-01-09 20:57:29 +00:00
99ee7d7f57
2.55.0
Signed-off-by: r4sas <r4sas@i2pmail.org>
2024-12-31 15:39:58 +00:00
3711a70495
semicolon
Signed-off-by: r4sas <r4sas@i2pmail.org>
2024-12-19 19:24:08 +00:00
66809c5ae4
add app dir creation on assets processing, update i2pd to trunk
Signed-off-by: r4sas <r4sas@i2pmail.org>
2024-12-19 18:57:50 +00:00
06f337f717
2.54.0
Signed-off-by: r4sas <r4sas@i2pmail.org>
2024-10-06 21:16:58 +00:00
orignal
cb322c6467 update i2pd 2024-08-30 12:41:04 -04:00
orignal
cae2700b20 removed dependency from boost::date_time and boost::filesystem 2024-08-30 12:33:21 -04:00
9203ba68a7
update boost submodule
Signed-off-by: r4sas <r4sas@i2pmail.org>
2024-08-05 20:29:18 +00:00
440b565c4b
2.53.1
Signed-off-by: r4sas <r4sas@i2pmail.org>
2024-08-05 20:10:55 +00:00
ed54b2692b
update README build section
Signed-off-by: r4sas <r4sas@i2pmail.org>
2024-07-29 23:44:15 +00:00
503f8a003e
revert switching from JNI to binary
Signed-off-by: r4sas <r4sas@i2pmail.org>
2024-07-29 23:26:17 +00:00
nonlin-lin-chaos-order-etc-etal
8347c04fb1 Remove copying of subscriptions.txt. Fix #74 2024-07-25 17:20:34 +03:00
c912f81429
2.53.0
Signed-off-by: r4sas <r4sas@i2pmail.org>
2024-07-23 19:12:25 +00:00
27cdad53ba
update README, add libraries rebuild skip flag
Signed-off-by: r4sas <r4sas@i2pmail.org>
2024-07-23 19:02:05 +00:00
734693ba94
move submodules, delete jni, remove ndkBuild from gradle
Signed-off-by: r4sas <r4sas@i2pmail.org>
2024-07-21 20:15:07 +00:00
031c536945
[chore] update i2pd to 2.53.0, change build script
Signed-off-by: r4sas <r4sas@i2pmail.org>
2024-07-21 19:23:54 +00:00
nonlin-lin-chaos-order-etc-etal
988940f50a
Try to fix #50 (#76)
* Fix foreground notification
* Trying to fix app quit
* Remove unsupported UI items
* Remove misleading exceptions
* Set Unix exec bit on build scripts
* Revamp processAssets point to be launched
* Corrected logic of daemon status events
* Fix double I2PActivity.onCreate call hangup
* Fix exception processing @ processAssets
2024-07-21 20:44:19 +03:00
8dba5a00e5
[i18n] pull updates
Signed-off-by: r4sas <r4sas@i2pmail.org>
2024-05-13 21:19:33 +00:00
c74235a279
2.52.0
Signed-off-by: r4sas <r4sas@i2pmail.org>
2024-05-13 21:13:50 +00:00
ca3ef80981
[gha] update workflow
Signed-off-by: r4sas <r4sas@i2pmail.org>
2024-04-07 09:17:05 +00:00
8f56a56927
2.51.0
Signed-off-by: r4sas <r4sas@i2pmail.org>
2024-04-07 08:52:44 +00:00
wipedlifepotato
cf5fe2e948
Perferences (#66) 2024-04-07 11:34:30 +03:00
72 changed files with 1144 additions and 2115 deletions

View File

@ -6,7 +6,7 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
submodules: 'recursive'
- name: Install GNU C++ compiler
@ -20,15 +20,13 @@ jobs:
- name: Build required modules
run: |
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/23.2.8568313
pushd app/jni
./build_boost.sh
./build_openssl.sh
./build_miniupnpc.sh
pushd binary/jni
./build.sh
popd
- name: Build with Gradle
run: ./gradlew --no-daemon assembleDebug
- name: Upload artifacts
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: android-apks
path: app/build/outputs/apk/debug/*.apk
@ -36,7 +34,7 @@ jobs:
build-binary:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
submodules: 'recursive'
- name: Install GNU C++ compiler
@ -47,18 +45,11 @@ jobs:
run: export JAVA_HOME=$JAVA_HOME_11_X64
- name: Install required Android SDK packages
run: $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager "cmake;3.22.1" "ndk;23.2.8568313"
- name: Build required modules
- name: Build binary with NDK
run: |
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/23.2.8568313
pushd binary/jni
./build_boost.sh
./build_openssl.sh
./build_miniupnpc.sh
popd
- name: Build binaries with NDK
run: |
pushd binary/jni
$ANDROID_NDK_HOME/ndk-build -j2 NDK_MODULE_PATH=$PWD
./build.sh -b
popd
- name: Create package with built binaries
run: |
@ -66,12 +57,12 @@ jobs:
./build-archive
popd
- name: Upload binaries archive
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: android-binaries
path: binary/libs/*
- name: Upload binaries package
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: android-binaries-pack
path: contrib/binary_pack/i2pd_*_android_binary.zip

1
.gitignore vendored
View File

@ -10,7 +10,6 @@ obj
.externalNativeBuild
ant.properties
local.properties
build.sh
android.iml
build
*.iml

10
.gitmodules vendored
View File

@ -1,16 +1,16 @@
[submodule "android-ifaddrs"]
path = app/jni/android-ifaddrs
path = binary/jni/android-ifaddrs
url = https://github.com/PurpleI2P/android-ifaddrs.git
[submodule "i2pd"]
path = app/jni/i2pd
path = binary/jni/i2pd
url = https://github.com/PurpleI2P/i2pd.git
branch = openssl
[submodule "miniupnp"]
path = app/jni/miniupnp
path = binary/jni/miniupnp
url = https://github.com/miniupnp/miniupnp.git
[submodule "openssl"]
path = app/jni/openssl
path = binary/jni/openssl
url = https://github.com/openssl/openssl.git
[submodule "boost"]
path = app/jni/boost
path = binary/jni/boost
url = https://github.com/moritz-wundke/Boost-for-Android.git

View File

@ -42,6 +42,7 @@ unzip commandlinetools-linux-8092744_latest.zip
```bash
git clone --recurse-submodules https://github.com/PurpleI2P/i2pd-android.git
cd i2pd-android
```
### Compile application
@ -53,10 +54,8 @@ export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export ANDROID_HOME=/opt/android-sdk
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/23.2.8568313
pushd app/jni
./build_boost.sh
./build_openssl.sh
./build_miniupnpc.sh
pushd binary/jni
./build.sh -d
popd
gradle clean assembleDebug

View File

@ -5,17 +5,32 @@ plugins {
dependencies {
implementation 'androidx.core:core:1.9.0'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
// implementation 'org.ini4j:ini4j:0.5.4'
implementation 'org.apache.commons:commons-configuration2:2.9.0'
}
configurations {
all{
//exclude group: 'commons-logging', module: 'commons-logging'
//exclude group: 'org.apache.httpcomponents'
exclude module: 'httpclient'
}
}
android {
lintOptions {
// Not so a good way
disable 'DuplicatePlatformClasses'
}
compileSdkVersion 33
defaultConfig {
applicationId "org.purplei2p.i2pd"
targetSdkVersion 33
// TODO: 24?
minSdkVersion 16
versionCode 2500200
versionName "2.50.2"
versionCode 2560000
versionName "2.56.0"
archivesBaseName += "-$versionName"
ndkVersion "23.2.8568313"
@ -28,7 +43,7 @@ android {
externalNativeBuild {
ndkBuild {
arguments "NDK_MODULE_PATH:=${rootProject.projectDir}/app/jni"
arguments "NDK_MODULE_PATH:=${rootProject.projectDir}/binary/jni"
arguments "-j${Runtime.getRuntime().availableProcessors()}"
}
}

View File

@ -4,9 +4,6 @@ LOCAL_MODULE := i2pd
LOCAL_CPP_FEATURES := rtti exceptions
LOCAL_C_INCLUDES += $(IFADDRS_PATH) $(LIB_SRC_PATH) $(LIB_CLIENT_SRC_PATH) $(LANG_SRC_PATH) $(DAEMON_SRC_PATH)
LOCAL_STATIC_LIBRARIES := \
boost_system \
boost_date_time \
boost_filesystem \
boost_program_options \
crypto \
ssl \
@ -29,27 +26,6 @@ LOCAL_SRC_FILES := \
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := boost_system
LOCAL_SRC_FILES := $(BOOST_PATH)/build/out/$(TARGET_ARCH_ABI)/lib/libboost_system.a
LOCAL_EXPORT_C_INCLUDES := $(BOOST_PATH)/build/out/$(TARGET_ARCH_ABI)/include
include $(PREBUILT_STATIC_LIBRARY)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := boost_date_time
LOCAL_SRC_FILES := $(BOOST_PATH)/build/out/$(TARGET_ARCH_ABI)/lib/libboost_date_time.a
LOCAL_EXPORT_C_INCLUDES := $(BOOST_PATH)/build/out/$(TARGET_ARCH_ABI)/include
include $(PREBUILT_STATIC_LIBRARY)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := boost_filesystem
LOCAL_SRC_FILES := $(BOOST_PATH)/build/out/$(TARGET_ARCH_ABI)/lib/libboost_filesystem.a
LOCAL_EXPORT_C_INCLUDES := $(BOOST_PATH)/build/out/$(TARGET_ARCH_ABI)/include
include $(PREBUILT_STATIC_LIBRARY)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := boost_program_options

@ -1 +0,0 @@
Subproject commit f302cc7ead971d4068661d34c2f3ba06063d8ea2

@ -1 +0,0 @@
Subproject commit 53e6c16ea80c7dcb2683fd548e0c7a09ddffbfc1

View File

@ -1,80 +0,0 @@
#!/bin/bash
set -e
BOOST_VERSION=1.78.0
BOOST_LIBS=date_time,filesystem,program_options,system
function build_one {
echo "Configuring and building..."
CXXFLAGS="-std=c++14" \
NCPU=$(nproc) \
./build-android.sh \
--boost=$BOOST_VERSION \
--arch=$CPU \
--target-version=$API \
--with-libraries=$BOOST_LIBS \
--layout=system \
$ANDROID_NDK_HOME
}
function checkPreRequisites {
if ! [ -d "boost" ] || ! [ "$(ls -A boost)" ]; then
echo -e "\033[31mFailed! Submodule 'boost' not found!\033[0m"
echo -e "\033[31mTry to run: 'git submodule update --init'\033[0m"
exit
fi
if [ -z "$ANDROID_NDK_HOME" -a "$ANDROID_NDK_HOME" == "" ]; then
echo -e "\033[31mFailed! ANDROID_NDK_HOME is empty. Run 'export ANDROID_NDK_HOME=[PATH_TO_NDK]'\033[0m"
exit
fi
}
function build {
for arg in "$@"; do
case "$arg" in
x86_64)
API=21
TARGET=x86_64
build_one
;;
arm64)
API=21
CPU=arm64-v8a
build_one
;;
x86)
API=16
CPU=x86
build_one
;;
arm)
API=16
CPU=armeabi-v7a
build_one
;;
all)
API=16
build_one
;;
*)
;;
esac
done
}
checkPreRequisites
cd boost
# disable verbose output
sed -i -E -e 's/d\+2/d\+0/' build-android.sh
sed -i -E -e 's/\"23\.1\"\|\"25\.0\"/\"23\.1\"\|\"23\.2\"\|\"25\.0\"/' build-android.sh
if (( $# == 0 )); then
build all
else
build $@
fi

View File

@ -1,92 +0,0 @@
#!/bin/bash
set -e
CMAKE_VERSION=3.22.1
function build_one {
mkdir -p build out/$CPU
cd build
cmake \
-G "Unix Makefiles" \
-DUPNPC_BUILD_SHARED=False \
-DUPNPC_BUILD_TESTS=False \
-DUPNPC_BUILD_SAMPLE=False \
-DANDROID_NATIVE_API_LEVEL=$API \
-DANDROID_ABI=$CPU \
-DCMAKE_BUILD_TYPE=Release \
-DANDROID_NDK=$ANDROID_NDK_HOME \
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake \
-DCMAKE_INSTALL_PREFIX=../out/$CPU \
..
echo "Building..."
cmake --build . -- libminiupnpc-static
make install
cd ..
rm -rf build
}
function checkPreRequisites {
if ! [ -d "miniupnp" ] || ! [ "$(ls -A miniupnp)" ]; then
echo -e "\033[31mFailed! Submodule 'miniupnp' not found!\033[0m"
echo -e "\033[31mTry to run: 'git submodule update --init'\033[0m"
exit
fi
if [ -z "$ANDROID_HOME" -a "$ANDROID_HOME" == "" ]; then
echo -e "\033[31mFailed! ANDROID_HOME is empty. Run 'export ANDROID_HOME=[PATH_TO_NDK]'\033[0m"
exit
fi
if [ -z "$ANDROID_NDK_HOME" -a "$ANDROID_NDK_HOME" == "" ]; then
echo -e "\033[31mFailed! ANDROID_NDK_HOME is empty. Run 'export ANDROID_NDK_HOME=[PATH_TO_NDK]'\033[0m"
exit
fi
}
function build {
for arg in "$@"; do
case "$arg" in
x86_64)
API=21
CPU=x86_64
build_one
;;
arm64)
API=21
CPU=arm64-v8a
build_one
;;
arm)
API=16
CPU=armeabi-v7a
build_one
;;
x86)
API=16
CPU=x86
build_one
;;
*)
;;
esac
done
}
checkPreRequisites
cd miniupnp/miniupnpc
rm -rf build out
# add cmake from Android SDK to PATH
PATH=$ANDROID_HOME/cmake/$CMAKE_VERSION/bin:$PATH
if (( $# == 0 )); then
build x86_64 arm64 arm x86
else
build $@
fi

View File

@ -1,93 +0,0 @@
#!/bin/bash
set -e
HOST_OS=`uname -a`
function build_one {
mkdir -p out/$CPU
echo "Configuring OpenSSL for $CPU..."
./Configure \
--prefix="$PWD/out/$CPU" \
$TARGET \
no-shared \
no-tests \
-D__ANDROID_API__=$API \
-Wno-macro-redefined
echo "Building OpenSSL for $CPU..."
make -j $(nproc) > out/build.log
make install_sw >> out/build.log
make clean
}
function checkPreRequisites {
if ! [ -d "openssl" ] || ! [ "$(ls -A openssl)" ]; then
echo -e "\033[31mFailed! Submodule 'openssl' not found!\033[0m"
echo -e "\033[31mTry to run: 'git submodule update --init'\033[0m"
exit
fi
if [ -z "$ANDROID_NDK_HOME" -a "$ANDROID_NDK_HOME" == "" ]; then
echo -e "\033[31mFailed! ANDROID_NDK_HOME is empty. Run 'export ANDROID_NDK_HOME=[PATH_TO_NDK]'\033[0m"
exit
fi
}
function build {
for arg in "$@"; do
case "$arg" in
x86_64)
API=21
CPU=x86_64
TARGET=android-x86_64
build_one
;;
arm64)
API=21
CPU=arm64-v8a
TARGET=android-arm64
build_one
;;
arm)
API=16
CPU=armeabi-v7a
TARGET=android-arm
build_one
;;
x86)
API=16
CPU=x86
TARGET=android-x86
build_one
;;
*)
;;
esac
done
}
checkPreRequisites
cd openssl
rm -rf out
if [[ "$HOST_OS" == *"_NT-"* ]]; then
PATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/windows-x86_64/bin:$PATH
else
PATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
fi
if [[ -f 'Makefile' ]]; then
make clean
fi
if (( $# == 0 )); then
build x86_64 arm64 arm x86
else
build $@
fi

@ -1 +0,0 @@
Subproject commit 3b97feb89fdc310ab43cc9336e1817f5b17f4b82

@ -1 +0,0 @@
Subproject commit 6576eb611b670c4841cc65095914275d6be008b2

@ -1 +0,0 @@
Subproject commit e04bd3433fd84e1861bf258ea37928d9845e6a86

View File

@ -23,6 +23,17 @@
android:theme="@android:style/Theme.DeviceDefault"
android:usesCleartextTraffic="true">
<service
android:name=".I2PdQSTileService"
android:exported="true"
android:label="I2Pd"
android:icon="@drawable/ic_logo"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>
</service>
<receiver
android:enabled="true"
android:name="org.purplei2p.i2pd.receivers.BootUpReceiver"
@ -64,6 +75,8 @@
<service
android:name=".ForegroundService"
android:exported="false"
android:stopWithTask="false"
android:enabled="true" />
<activity
@ -74,5 +87,11 @@
android:name="android.support.PARENT_ACTIVITY"
android:value="org.purplei2p.i2pd.I2PDPermsAskerActivity" />
</activity>
<activity
android:name=".MainPreferenceActivity"
android:label="Settings"
>
</activity>
</application>
</manifest>

View File

@ -0,0 +1 @@
../../../../binary/jni/i2pd/contrib/certificates

View File

@ -1,13 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIB6jCCAY+gAwIBAgIJAPeWi4iUKLBJMAoGCCqGSM49BAMCMHoxCzAJBgNVBAYT
AlhYMQswCQYDVQQIDAJYWDELMAkGA1UEBwwCWFgxHjAcBgNVBAoMFUkyUCBBbm9u
eW1vdXMgTmV0d29yazEPMA0GA1UECwwGZmFtaWx5MSAwHgYDVQQDDBdnb3N0Y29p
bi5mYW1pbHkuaTJwLm5ldDAeFw0xNzA4MDExMzQ4MzdaFw0yNzA3MzAxMzQ4Mzda
MHoxCzAJBgNVBAYTAlhYMQswCQYDVQQIDAJYWDELMAkGA1UEBwwCWFgxHjAcBgNV
BAoMFUkyUCBBbm9ueW1vdXMgTmV0d29yazEPMA0GA1UECwwGZmFtaWx5MSAwHgYD
VQQDDBdnb3N0Y29pbi5mYW1pbHkuaTJwLm5ldDBZMBMGByqGSM49AgEGCCqGSM49
AwEHA0IABC+9iIYumUNnsqKbnTluHimV8OdGvo7yeGxuqhfNNB2b3jvbFJ81scgH
dsZtMQmUxgKM5nH+NQJMoCxHhSlRy2QwCgYIKoZIzj0EAwIDSQAwRgIhANNh7mOp
nBBPRh2a/ipG1VYS0d+mNjSrpz8xWcG3CXPLAiEAjM5MTfv9sOJ74PeZVhFZ02w4
vhgyZCeLJ57f123Lm1A=
-----END CERTIFICATE-----

View File

@ -1,13 +0,0 @@
-----BEGIN CERTIFICATE-----
MIICCjCCAa2gAwIBAgIEfT9YJTAMBggqhkjOPQQDAgUAMHkxCzAJBgNVBAYTAlhY
MQswCQYDVQQIEwJYWDELMAkGA1UEBxMCWFgxHjAcBgNVBAoTFUkyUCBBbm9ueW1v
dXMgTmV0d29yazEPMA0GA1UECxMGZmFtaWx5MR8wHQYDVQQDExZpMnAtZGV2LmZh
bWlseS5pMnAubmV0MB4XDTE1MTIwOTIxNDIzM1oXDTI1MTIwODIxNDIzM1oweTEL
MAkGA1UEBhMCWFgxCzAJBgNVBAgTAlhYMQswCQYDVQQHEwJYWDEeMBwGA1UEChMV
STJQIEFub255bW91cyBOZXR3b3JrMQ8wDQYDVQQLEwZmYW1pbHkxHzAdBgNVBAMT
FmkycC1kZXYuZmFtaWx5LmkycC5uZXQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNC
AAR7FPSglYrxeSPzv74A1fTwjajZWV0TljqEMBS/56juZQB/7xOwrsHFHA0eEEF9
dTH64wx3lhV/9sh/stwPU2MToyEwHzAdBgNVHQ4EFgQUQh4uRP1aaX8TJX5dljrS
CeFNjcAwDAYIKoZIzj0EAwIFAANJADBGAiEAhXlEKGCjJ4urpi2db3OIMl9pB+9t
M+oVtAqBamWvVBICIQDBaIqfwLzFameO5ULgGRMysKQkL0O5mH6xo910YQV8jQ==
-----END CERTIFICATE-----

View File

@ -1,13 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIB6TCCAY+gAwIBAgIJAI7G9MXxh7OjMAoGCCqGSM49BAMCMHoxCzAJBgNVBAYT
AlhYMQswCQYDVQQIDAJYWDELMAkGA1UEBwwCWFgxHjAcBgNVBAoMFUkyUCBBbm9u
eW1vdXMgTmV0d29yazEPMA0GA1UECwwGZmFtaWx5MSAwHgYDVQQDDBdpMnBkLWRl
di5mYW1pbHkuaTJwLm5ldDAeFw0xNjAyMjAxNDE2MzhaFw0yNjAyMTcxNDE2Mzha
MHoxCzAJBgNVBAYTAlhYMQswCQYDVQQIDAJYWDELMAkGA1UEBwwCWFgxHjAcBgNV
BAoMFUkyUCBBbm9ueW1vdXMgTmV0d29yazEPMA0GA1UECwwGZmFtaWx5MSAwHgYD
VQQDDBdpMnBkLWRldi5mYW1pbHkuaTJwLm5ldDBZMBMGByqGSM49AgEGCCqGSM49
AwEHA0IABMlWL3loKVOfsA8Rm91QR53Il69mQiaB7n3rUhfPkJb9MYc1S4198azE
iSnNZSXicKDPIifaCgvONmbACzElHc8wCgYIKoZIzj0EAwIDSAAwRQIgYWmSFuai
TJvVrlB5RlbiiNFCEootjWP8BFM3t/yFeaQCIQDkg4xcQIRGTHhjrCsxmlz9KcRF
G+eIF+ATfI93nPseLw==
-----END CERTIFICATE-----

View File

@ -1,12 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIBwTCCAWigAwIBAgIJAOZBC10+/38EMAkGByqGSM49BAEwZzELMAkGA1UEBhMC
QVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdp
dHMgUHR5IEx0ZDEgMB4GA1UEAwwXbWNhMi1pMnAuZmFtaWx5LmkycC5uZXQwHhcN
MTYwMzI4MjIwMjMxWhcNMjYwMzI2MjIwMjMxWjBnMQswCQYDVQQGEwJBVTETMBEG
A1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkg
THRkMSAwHgYDVQQDDBdtY2EyLWkycC5mYW1pbHkuaTJwLm5ldDBZMBMGByqGSM49
AgEGCCqGSM49AwEHA0IABNNyfzJr/rMSUeWliVBbJHRF2+qMypOlHEZ9m1nNATVX
64OhuyuVCmbF9R3oDkcZZJQQK1ovXd/EsbAIWDI8K/gwCQYHKoZIzj0EAQNIADBF
AiEApmv2tvMwzlvPjHJG1/5aXOSjYWw2s4ETeGt4abWPQkACIBbF3RuCHuzg+KN8
N0n9hAJztAqhRCdG3hilxF4fbVLp
-----END CERTIFICATE-----

View File

@ -1,14 +0,0 @@
-----BEGIN CERTIFICATE-----
MIICKDCCAc6gAwIBAgIUcPHZXtYSqGNRCD6z8gp79WUFtI0wCgYIKoZIzj0EAwIw
gZMxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEPMA0GA1UEBwwGQXVzdGlu
MRgwFgYDVQQKDA9TdG9ybXlDbG91ZCBJbmMxIzAhBgNVBAMMGnN0b3JteWNsb3Vk
LmZhbWlseS5pMnAubmV0MSQwIgYJKoZIhvcNAQkBFhVhZG1pbkBzdG9ybXljbG91
ZC5vcmcwHhcNMjIwMzE5MTU1MjU2WhcNMzIwMzE2MTU1MjU2WjCBkzELMAkGA1UE
BhMCVVMxDjAMBgNVBAgMBVRleGFzMQ8wDQYDVQQHDAZBdXN0aW4xGDAWBgNVBAoM
D1N0b3JteUNsb3VkIEluYzEjMCEGA1UEAwwac3Rvcm15Y2xvdWQuZmFtaWx5Lmky
cC5uZXQxJDAiBgkqhkiG9w0BCQEWFWFkbWluQHN0b3JteWNsb3VkLm9yZzBZMBMG
ByqGSM49AgEGCCqGSM49AwEHA0IABFUli0hvJEmowNjJVjbKEIWBJhqe973S4VdL
cJuA5yY3dC4Y998abWEox7/Y1BhnBbpJuiodA341bXKkLMXQy/kwCgYIKoZIzj0E
AwIDSAAwRQIgD12F/TfY3iV1/WDF7BSKgbD5g2MfELUIy1dtUlJQuJUCIQD69mZw
V1Z9j2x0ZsuirS3i6AMfVyTDj0RFS3U1jeHzIQ==
-----END CERTIFICATE-----

View File

@ -1,12 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIBxDCCAWmgAwIBAgIJAJnJIdKHYwWcMAoGCCqGSM49BAMCMGcxCzAJBgNVBAYT
AkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRn
aXRzIFB0eSBMdGQxIDAeBgNVBAMMF3ZvbGF0aWxlLmZhbWlseS5pMnAubmV0MB4X
DTE2MDQyNjE1MjAyNloXDTI2MDQyNDE1MjAyNlowZzELMAkGA1UEBhMCQVUxEzAR
BgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5
IEx0ZDEgMB4GA1UEAwwXdm9sYXRpbGUuZmFtaWx5LmkycC5uZXQwWTATBgcqhkjO
PQIBBggqhkjOPQMBBwNCAARf6LBfbbfL6HInvC/4wAGaN3rj0eeLE/OdBpA93R3L
s8EUp0YTEJHWPo9APiKMmAwQSsMJfjhNrbp+UWEnnx2LMAoGCCqGSM49BAMCA0kA
MEYCIQDpQu2KPV5G1JOFLoZvdj+rcvEnjxM/FxkaqikwkVx8FAIhANP7DkUal+GT
SuiCtcqM4QyIBsfsCJBWEMzovft164Bo
-----END CERTIFICATE-----

View File

@ -1,32 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFfzCCA2egAwIBAgIEctG1gDANBgkqhkiG9w0BAQ0FADBwMQswCQYDVQQGEwJY
WDELMAkGA1UECAwCWFgxCzAJBgNVBAcMAlhYMR4wHAYDVQQKDBVJMlAgQW5vbnlt
b3VzIE5ldHdvcmsxDDAKBgNVBAsMA0kyUDEZMBcGA1UEAwwQYWNldG9uZUBtYWls
LmkycDAeFw0yMTAxMjUxMDMyMjBaFw0zMTAxMjMxMDMyMjBaMHAxCzAJBgNVBAYT
AlhYMQswCQYDVQQIDAJYWDELMAkGA1UEBwwCWFgxHjAcBgNVBAoMFUkyUCBBbm9u
eW1vdXMgTmV0d29yazEMMAoGA1UECwwDSTJQMRkwFwYDVQQDDBBhY2V0b25lQG1h
aWwuaTJwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwqF/BRRmvZ54
5XArgxbytDi7m7MDjFE/whUADruHj/9jXGCxE8DDiiKTt3yhfakV0SNo5xk7AMD+
wqiSNC5JCHTm18gd2M4cQLIaOVRqucLLge4XVgk2WPX6OT98wfxh7mqA3wlSdEpj
dY3Txtkf7VfZLicG76/RBtLFW3aBdsn63hZaQqZE4x/5MJyPVZx59+lys5RmMi0o
LpXJy4HOu1/Gl1iKDJoI/ARFG3y7uP/B+ZtZBitJetTs0HcqycnNJq0tVZf2HiGF
JNy67AL4foxNYPXP6QsvXvp6LRpGANaBCkFCBlriSF+x1zO2H3uAkRnuLYXuKIfB
HudejTp4R57VgZGiHYoawHaF17FVAApue9G8O82XYECjhET35B9yFoOBHTvaMxLU
CKrmayH8KMQon95mfe1qpoO3/YDa8DCxkjAfjdtytat7nt2pGZMH6/cLJxcFiofh
RtRVvb+omv/X12j/6iCFrwP4NvBnAZsa736igbjpyee5n+CSyYxd9cJkRX1vQVk7
WFSqL58Pz+g6CKJmdMPvqNOfUQ6mieBeejmx35B4pLzLcoNxw8R3O1+I2l4dg042
dEydKRQNwdzOec4jYwnKR40iwIyZxpchXWGRbBdyF5RQCbIIo60QBJlfXMJ2svan
q5lYIeWeY3mlODXu4KH4K09y10KT8FsCAwEAAaMhMB8wHQYDVR0OBBYEFMh+DoIL
APNiu2o+6I9A49joNYQuMA0GCSqGSIb3DQEBDQUAA4ICAQBFeOJi0rmkqN5/E3IB
nE2x4mUeLI82tUcN2D3Yu8J81vy4DnH+oMRQFDtYEHW5pfirRmgSZ7MQwYQnqWLp
iTE7SyCxlqGrmVsYp7PzfS1pUT2QeWPtsNYUDdraG0Zr9BkIGB60VMhjMSa9WUrj
lbchzr6E/j/EsEOE7IK08JxIDKCDZM2LLwis4tAM6tmiylkMf2RlUBIRBs1TCO+q
x3yByttNE2P4nQyQVQpjc1qsaOMvJvbxun37dwo+oTQy+hwkA86BWTDRYdN3xwOk
OfAOtlX6zM/wCKMN0ZRnjZoh59ZCn4JXokt3IjZ4n8qJOuJFRKeKGmGeKA8uaGW8
ih5tdB99Gu5Z8LOT1FxAJKwQBn5My0JijPoMit4B0WKNC8hy2zc2YvNfflu1ZRj5
wF4E5ktbtT/LWFSoRPas/GFS8wSXk/kbSB0ArDcRRszb3JHqbALmSQxngz3rfwb3
SHwQIIg956gjMDueEX5CrGrMqigiK53b9fqtpghUrHDsqtEXqeImpAY65PX1asqo
metDNuETHF7XrAjP7TGJfnrYQyeK90iS7j1G68ScBGkKY2nsTnFoXkSk5s5D338E
SUzPaOlh91spmkVY6gQTVQ7BakADBHw+zBgDA1gBN/4JPvgN36hquj63+aG1cKy3
3ZUnv2ipo2fpr69NtuBnutK6gw==
-----END CERTIFICATE-----

View File

@ -1,35 +0,0 @@
-----BEGIN CERTIFICATE-----
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
Hz8KWVkHZg==
-----END CERTIFICATE-----

View File

@ -1,33 +0,0 @@
-----BEGIN CERTIFICATE-----
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
-----END CERTIFICATE-----

View File

@ -1,34 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIF3TCCA8WgAwIBAgIRAKye34BRrKyQN6kMVPHddykwDQYJKoZIhvcNAQELBQAw
dzELMAkGA1UEBhMCWFgxCzAJBgNVBAcTAlhYMQswCQYDVQQJEwJYWDEeMBwGA1UE
ChMVSTJQIEFub255bW91cyBOZXR3b3JrMQwwCgYDVQQLEwNJMlAxIDAeBgNVBAMM
F2hhbmtoaWxsMTk1ODBAZ21haWwuY29tMB4XDTIwMDUwNzA1MDkxMFoXDTMwMDUw
NzA1MDkxMFowdzELMAkGA1UEBhMCWFgxCzAJBgNVBAcTAlhYMQswCQYDVQQJEwJY
WDEeMBwGA1UEChMVSTJQIEFub255bW91cyBOZXR3b3JrMQwwCgYDVQQLEwNJMlAx
IDAeBgNVBAMMF2hhbmtoaWxsMTk1ODBAZ21haWwuY29tMIICIjANBgkqhkiG9w0B
AQEFAAOCAg8AMIICCgKCAgEA5Vt7c0SeUdVkcXXEYe3M9LmCTUyiCv/PHF2Puys6
8luLH8lO0U/pQ4j703kFKK7s4rV65jVpGNncjHWbfSCNevvs6VcbAFoo7oJX7Yjt
5+Z4oU1g7JG86feTwU6pzfFjAs0RO2lNq2L8AyLYKWOnPsVrmuGYl2c6N5WDzTxA
Et66IudfGsppTv7oZkgX6VNUMioV8tCjBTLaPCkSfyYKBX7r6ByHY86PflhFgYES
zIB92Ma75YFtCB0ktCM+o6d7wmnt10Iy4I6craZ+z7szCDRF73jhf3Vk7vGzb2cN
aCfr2riwlRJBaKrLJP5m0dGf5RdhviMgxc6JAgkN7Ius5lkxO/p3OSy5co0DrMJ7
lvwdZ2hu0dnO75unTt6ImR4RQ90Sqj7MUdorKR/8FcYEo+twBV8cV3s9kjuO5jxV
g976Q+GD3zDoixiege3W5UT4ff/Anm4mJpE5PKbNuO+KUjk6WA4B1PeudkEcxkO4
tQYy0aBzfjeyENee9otd4TgN1epY4wlHIORCa3HUFmFZd9VZMQcxwv7c47wl2kc9
Cv1L6Nae78wRzRu2CHD8zWhq+tv5q7Md2eRd3mFPI09ljsOgG2TQv6300WvHvI5M
enNdjYjLqOTRCzUJ2Jst4BZsvDxjWYkHsSZc1UORzm2LQmh2bJvbhC3m81qANGw6
ZhcCAwEAAaNkMGIwDgYDVR0PAQH/BAQDAgKEMB0GA1UdJQQWMBQGCCsGAQUFBwMC
BggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCAGA1UdDgQZBBdoYW5raGlsbDE5
NTgwQGdtYWlsLmNvbTANBgkqhkiG9w0BAQsFAAOCAgEAVtMF7lrgkDLTNXlavI7h
HJqFxFHjmxPk3iu2Qrgwk302Gowqg5NjVVamT20cXeuJaUa6maTTHzDyyCai3+3e
roaosGxZQRpRf5/RBz2yhdEPLZBV9IqxGgIxvCWNqNIYB1SNk00rwC4q5heW1me0
EsOK4Mw5IbS2jUjbi9E5th781QDj91elwltghxwtDvpE2vzAJwmxwwBhjySGsKfq
w8SBZOxN+Ih5/IIpDnYGNoN1LSkJnBVGSkjY6OpstuJRIPYWl5zX5tJtYdaxiD+8
qNbFHBIZ5WrktMopJ3QJJxHdERyK6BFYYSzX/a1gO7woOFCkx8qMCsVzfcE/z1pp
JxJvshT32hnrKZ6MbZMd9JpTFclQ62RV5tNs3FPP3sbDsFtKBUtj87SW7XsimHbZ
OrWlPacSnQDbOoV5TfDDCqWi4PW2EqzDsDcg+Lc8EnBRIquWcAox2+4zmcQI29wO
C1TUpMT5o/wGyL/i9pf6GuTbH0D+aYukULropgSrK57EALbuvqnN3vh5l2QlX/rM
+7lCKsGCNLiJFXb0m6l/B9CC1947XVEbpMEAC/80Shwxl/UB+mKFpJxcNLFtPXzv
FYv2ixarBPbJx/FclOO8G91QC4ZhAKbsVZn5HPMSgtZe+xWM1r0/UJVChsMTafpd
CCOJyu3XtyzFf+tAeixOnuQ=
-----END CERTIFICATE-----

View File

@ -1,32 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFgTCCA2mgAwIBAgIETWAY1DANBgkqhkiG9w0BAQ0FADBxMQswCQYDVQQGEwJY
WDELMAkGA1UECAwCWFgxCzAJBgNVBAcMAlhYMR4wHAYDVQQKDBVJMlAgQW5vbnlt
b3VzIE5ldHdvcmsxDDAKBgNVBAsMA0kyUDEaMBgGA1UEAwwRaGlkdXNlcjBAbWFp
bC5pMnAwHhcNMjExMjEzMTU0MDI3WhcNMzExMjExMTU0MDI3WjBxMQswCQYDVQQG
EwJYWDELMAkGA1UECAwCWFgxCzAJBgNVBAcMAlhYMR4wHAYDVQQKDBVJMlAgQW5v
bnltb3VzIE5ldHdvcmsxDDAKBgNVBAsMA0kyUDEaMBgGA1UEAwwRaGlkdXNlcjBA
bWFpbC5pMnAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXnjJ8UQ0f
lHHpfPMiHofBPSuL4sbOJY6fOXwPhSg/h6THh9DS/ZWmJXQ3qRD0glDVtv4/Dr/9
ldGQ5eltF9iCFXCQlMEy2HjQrBKq0nsl7RpYK12cyMaod0kkzCUk9ITLi9CmHM3Z
gQZcmG8TWjFEpDR+idx/QkQt2pcO4vzWlDit3Vh4ivnbX5jGQHbsVjQEMQWxr+pX
dsS+YQpjZ6RBmrooGTPO8QDOOeYLAn0lCjmffc/kzIH9E/p4/O0rOpyhVYbdxUD1
5wkqN9l4yrtxmORG/PudnRQQ0r4TUq8vsxfGY0Euo9IbhgXF2Parel1ZhDxB1WZV
VwWtgLIh9jGA1UMa8SYKnEfp8LWNZ3b3mUUnZb3kMrLk6jGYRWNsHmamhd4mC7AZ
qf/8lOkEIw3bPd3YguCDRVcLui5BwIEZmqXg8uoESxfO/sW3pBrN/8M7MkTex9kN
vjitGDDXvenK27qmNgZxbBlX72yTSfys7XTYTLnxZC8AwdAo2Wz9Z6HhGiPonf2h
vZkc9ZxuE0jFIrsbJra4X7iyjXgi4vV4ARNg/9Ft6F4/OIbECgeDcBQqq4TlT2bZ
EfWVrBbqXoj5vNsLigIkd+AyUNwPYEcB5IFSiiOh98pC7BH3pg0m8U5YBjxe1i+9
EQOOG0Qtx+JigXZHu6bGE0Twy9zy+UzoKQIDAQABoyEwHzAdBgNVHQ4EFgQUGK1b
0DkL6aLalcfBc/Uj/SF08C0wDQYJKoZIhvcNAQENBQADggIBAMpXM82bJDpH1TlH
TvhU3Z7nfZdvEhOQfujaFUYiuNripuEKcFGn948+DvAG0FUN+uNlJoqOVs8D7InD
gWlA9zpqw5Cl5Hij/Wns9QbXuAHJeA23fVUoaM2A6v9ifcIQ1A+rDuRQAo6/64KW
ChTg2e99RBpfGOyqgeh7tLLe0lPPekVpKHFuXabokaKRDuBcVHcUL4tWXe3dcyqa
Ej/PJrrS+nWL0EGZ4q80CEd2LPuDzPxNGCJt/R7ZfadENWajcgcXGceh1QBzozrB
SL/Ya6wF9SrsB7V/r5wX0LM4ZdDaLWbtmUe5Op0h/ZMH25Sa8xAXVz+O9L6sWSoO
FaiYTOvAiyyPz+nsxKa3xYryDHno7eKSt+hGOcaurhxbdZaEFY/CegEc73tCt9xK
e9qF8O/WkDLmixuErw3f5en4IfzGR7p3lJAwW/8WD8C6HS39h/eE7dVZNaWgtQnZ
SgGjgZMTJqTcQ3aZmfuCZefxGFok8w6AIkdbnd1pdMBRjYu8aXgl2hQSB9ZADDE9
R5d3rXi0PkSFLIvsNjVa5KXrZk/tB0Hpfmepq7CufBqjP/LG9TieRoXzLYUKFF74
QRwjP+y7AJ+VDUTpY1NV1P+k+2raubU2bOnLF3zL5DtyoyieGPhyeMMvp0fRIxdg
bSl5VHgPXHNM8mcnndMAuzvl7jEK
-----END CERTIFICATE-----

View File

@ -1,33 +0,0 @@
-----BEGIN CERTIFICATE-----
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
-----END CERTIFICATE-----

View File

@ -1,34 +0,0 @@
-----BEGIN CERTIFICATE-----
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
2Q==
-----END CERTIFICATE-----

View File

@ -1,33 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFvjCCA6agAwIBAgIQIDtv8tGMh0FyB2w5XjfZxTANBgkqhkiG9w0BAQsFADBt
MQswCQYDVQQGEwJYWDELMAkGA1UEBxMCWFgxCzAJBgNVBAkTAlhYMR4wHAYDVQQK
ExVJMlAgQW5vbnltb3VzIE5ldHdvcmsxDDAKBgNVBAsTA0kyUDEWMBQGA1UEAwwN
aWdvckBub3ZnLm5ldDAeFw0xNzA3MjQxODI4NThaFw0yNzA3MjQxODI4NThaMG0x
CzAJBgNVBAYTAlhYMQswCQYDVQQHEwJYWDELMAkGA1UECRMCWFgxHjAcBgNVBAoT
FUkyUCBBbm9ueW1vdXMgTmV0d29yazEMMAoGA1UECxMDSTJQMRYwFAYDVQQDDA1p
Z29yQG5vdmcubmV0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxst4
cam3YibBtQHGPCPX13uRQti56U3XZytSZntaKrUFmJxjt41Q/mOy3KYo+lBvhfDF
x3tWKjgP9LJOJ28zvddFhZVNxqZRjcnAoPuSOVCw88g01D9OAasKF11hCfdxZP6h
vGm8WCnjD8KPcYFxJC4HJUiFeProAwuTzEAESTRk4CAQe3Ie91JspuqoLUc5Qxlm
w5QpjnjfZY4kaVHmZDKGIZDgNIt5v85bu4pWwZ6O+o90xQqjxvjyz/xccIec3sHw
MHJ8h8ZKMokCKEJTaRWBvdeNXki7nf3gUy/3GjYQlzo0Nxk/Hw4svPcA+eL0AYiy
Jn83bIB5VToW2zYUdV4u3qHeAhEg8Y7HI0kKcSUGm9AQXzbzP8YCHxi0sbb0GAJy
f1Xf3XzoPfT64giD8ReUHhwKpyMB6uvG/NfWSZAzeAO/NT7DAwXpKIVQdkVdqy8b
mvHvjf9/kWKOirA2Nygf3r79Vbg2mqbYC/b63XI9hheU689+O7qyhTEhNz+11X0d
Zax7UPrLrwOeB9TNfEnztsmrHNdv2n+KcOO2o11Wvz2nHP9g+dgwoZSD1ZEpFzWP
0sD5knKLwAL/64qLlAQ1feqW7hMr80IADcKjLSODkIDIIGm0ksXqEzTjz1JzbRDq
jUjq7EAlkw3G69rv1gHxIntllJRQidAqecyWHOMCAwEAAaNaMFgwDgYDVR0PAQH/
BAQDAgKEMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8E
BTADAQH/MBYGA1UdDgQPBA1pZ29yQG5vdmcubmV0MA0GCSqGSIb3DQEBCwUAA4IC
AQADyPaec28qc1HQtAV5dscJr47k92RTfvan+GEgIwyQDHZQm38eyTb05xipQCdk
5ruUDFXLB5qXXFJKUbQM6IpaktmWDJqk4Zn+1nGbtFEbKgrF55pd63+NQer5QW9o
3+dGj0eZJa3HX5EBkd2r7j2LFuB6uxv3r/xiTeHaaflCnsmyDLfb7axvYhyEzHQS
AUi1bR+ln+dXewdtuojqc1+YmVGDgzWZK2T0oOz2E21CpZUDiP3wv9QfMaotLEal
zECnbhS++q889inN3GB4kIoN6WpPpeYtTV+/r7FLv9+KUOV1s2z6mxIqC5wBFhZs
0Sr1kVo8hB/EW/YYhDp99LoAOjIO6nn1h+qttfzBYr6C16j+8lGK2A12REJ4LiUQ
cQI/0zTjt2C8Ns6ueNzMLQN1Mvmlg1Z8wIB7Az7jsIbY2zFJ0M5qR5VJveTj33K4
4WSbC/zMWOBYHTVBvGmc6JGhu5ZUTZ+mWP7QfimGu+tdhvtrybFjE9ROIE/4yFr6
GkxEyt0UY87TeKXJ/3KygvkMwdvqGWiZhItb807iy99+cySujtbGfF2ZXYGjBXVW
dJOVRbyGQkHh6lrWHQM4ntBv4x+5QA+OAan5PBF3tcDx1vefPx+asYslbOXpzII5
qhvoQxuRs6j5jsVFG6RdsKNeQAt87Mb2u2zK2ZakMdyD1w==
-----END CERTIFICATE-----

View File

@ -1,34 +0,0 @@
-----BEGIN CERTIFICATE-----
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
+g==
-----END CERTIFICATE-----

View File

@ -1,32 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFfzCCA2egAwIBAgIEbNbRPjANBgkqhkiG9w0BAQ0FADBwMQswCQYDVQQGEwJY
WDELMAkGA1UECAwCWFgxCzAJBgNVBAcMAlhYMR4wHAYDVQQKDBVJMlAgQW5vbnlt
b3VzIE5ldHdvcmsxDDAKBgNVBAsMA0kyUDEZMBcGA1UEAwwQb3JpZ25hbEBtYWls
LmkycDAeFw0yMTA3MDYyMjExMDFaFw0zMTA3MDQyMjExMDFaMHAxCzAJBgNVBAYT
AlhYMQswCQYDVQQIDAJYWDELMAkGA1UEBwwCWFgxHjAcBgNVBAoMFUkyUCBBbm9u
eW1vdXMgTmV0d29yazEMMAoGA1UECwwDSTJQMRkwFwYDVQQDDBBvcmlnbmFsQG1h
aWwuaTJwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvNJz2KGuAkHP
tGFobfLvpybtxB50fkcEsTc9opmiy7wBKK9rSI01VS616IhABkWKZVfK2A9NqpGv
v/CyhTKoaeSNeXY7+zORUWgWK/zA9fA4GRZFqlW8j4tbompDwcLYNqRBCsn1C0OY
YA5JhXPBixMcnXl8N8x4sXhQ4l9R3+QrydhUHRvgDc8dOxRyIX7zuQAyf8tmA2Xo
xZLdvDcCJdLBIbFwxhIceIhgcOwaOx7oRkZDZdYcLJd3zjyPbu8JtOM2ZkwH7r+0
ro5PktuDp2LAS6SII5yYNcwcrvPZGPqhLdifIw1BrdTIb/rIkQZ5iXOOdyPmT7e8
IwAJcPFlfvrS4Vbi9oDqyx3aDUBoubgmFnO1TirL56ck83R/ubcKtdnyzAn5dp+f
ZNYW6/foSBpDDOCViylbFAR5H0HJEbBns7PZx6mGEEI4tUAJdNYl7Ly7Df60a9Rz
cD/gz08U9UwFXYKoT6roEjToADGAzb5MI4cVlAb2AmQaMNXNe04HcDL1bU50mkNU
amqPv8nxf72fBQCEmZz2G57T6QiYTtcCwiWS1QdWsuaOtCo9zO0MKcjzSdUxuxEc
dXhjQdNegsgg/Xk7bJ8lKOsACqMpFftdPmuyeZU2t+3RPuBpV/0j2qUfg/y6kb0z
CxAOYmlcL4kqw4VT+5V/EeZLIG0h9I0CAwEAAaMhMB8wHQYDVR0OBBYEFD/wJObg
CCDuhMJCVWTSTj+B3rsUMA0GCSqGSIb3DQEBDQUAA4ICAQC0PjsTSPWlGbLNeeI8
F0B5xAwXYJzZ7/LRxh8u42HDUqVIDjqkuls1l3v9D7htty2Gr3Ws2dcvcOr2KcOy
mEWg+jdP/N3vt9IkZeVS4YQoPgq6orn7lVkk00bcKb24f7ZnoQnnVV0/m42Y5P4j
LLh+8MBxsez9azXyZbDVEkgsMUAkdVO6KNz6scqz7wb8egV2GAMAp7cwChC6lanK
gv9ZyJhG/HdTv6VyuMZhJy6rX4geM97tm1iHu1VLsQcIzBKAdEvWJv8ofMeiyINe
hqAP9NYaeowKi975NOrmf+XZwxd0niApIohV684RCVUfL8H7HSPbdXhBJ/WslyDP
cTGhA2BLqEXZBn/nLQknlnl0SZTQxG2n4fEgD1E5YS/aoBrig/uXtWm2Zdf8U3mM
+bNXhbi9s7LneN2ye8LlNJBSRklNn/bNo8OmzLII1RQwf1+vaHT96lASbTVepMZ/
Y9VcC8fAmho/zfQEKueLEB03K+gr2dGD+1crmMtUBjWJ9vPjtooZArtkDbh+kVYA
cx4N4NXULRwxVWZe5wTQOqcZ3qSS1ClMwaziwychGaj8xRAirHMZnlPOZO1UK4+5
8F4RMJktyZjNgSLP76XPS4rJK5fobuPqFeA4OpDFn/5+/XeQFF6i6wntx1tzztzH
zc+BrVZOdcYPqu9iLXyRQ9JwwA==
-----END CERTIFICATE-----

View File

@ -1,32 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFiTCCA3GgAwIBAgIEY2XeQjANBgkqhkiG9w0BAQ0FADB1MQswCQYDVQQGEwJY
WDELMAkGA1UECAwCWFgxHjAcBgNVBAcMFUkyUCBBbm9ueW1vdXMgTmV0d29yazEL
MAkGA1UECgwCWFgxDDAKBgNVBAsMA0kyUDEeMBwGA1UEAwwVcjRzYXMtcmVzZWVk
QG1haWwuaTJwMB4XDTE3MDYyMjEwNTQ1NFoXDTI3MDYyMDEwNTQ1NFowdTELMAkG
A1UEBhMCWFgxCzAJBgNVBAgMAlhYMR4wHAYDVQQHDBVJMlAgQW5vbnltb3VzIE5l
dHdvcmsxCzAJBgNVBAoMAlhYMQwwCgYDVQQLDANJMlAxHjAcBgNVBAMMFXI0c2Fz
LXJlc2VlZEBtYWlsLmkycDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
ANgsj5LhF4uGG4RDueShqYQZsG5Rz6XUAtK9sVGFdmdJTDZirUMZcCGCGZP/Harz
QaZU9EYxOCztnpLCQksSCpdRsij56MURS0tW/1x7LHIDUOi911Of57jgIHH+3E5n
6tuRxEk6J/9Ji3PI+89kl0sPKMVFMyKkINprVTA5zr/keyYEG0p6HSEYYiJkQH78
8uoOCAmlk9mxkJFb+zviCk6jsYwdH+ofD6Lw5ueOlYUbeZ9Nd7jfSdf20XM7ofIw
W2COtsbq3J7vNrQJMV7HkHxVx/7OqmjQF02OahZFZREVZqbHpL501iTn9Iqd5qKq
IsxYjk7ZnP4UUCBk8NOU5TuWsy0qNw+TJDI9s55Fi4KPtXWf47HIl6CdpM5y/D5L
eufCojSwPKlrD6x9gTyJdBggBZRIyplXdKffo/95hUhEkv86yfsVVR7Gu1uy0O8T
Gtb8Da/oi5eEZBHWonLVicLPei5jeo+1gbR09PQ6s41uMZlOhMe4RSgiIQj/7UVo
ffKdl1MPNKr1u2fgVj8kxqg8ZivWKQ2taEgimU2EkQcNcE96M9yQlNNpNvqSAQVk
wYXlHt0AN6A1A8u1pItxaTwXnbmx+OBJZoKl4ZQeaC8wtKjTgAgVXp+g5iot2gir
LjxCRx1WLG1c8vRg1W8CDZII8Swc8EWpMhI+0hPv7/4/AgMBAAGjITAfMB0GA1Ud
DgQWBBTN5sKbrNzwE8sgMGDekfOPgX8/JDANBgkqhkiG9w0BAQ0FAAOCAgEAjLaB
bHqvFTs0ikAtesk9r8+8XVIsP5FR57zZCek2vxkHcCQWw8Uqs3ndInRX4FirKSLT
WRb4aSwFCkrmwueecTpXN/RBC+fZj+POCfdILEsA+FGreAM2q5ZXv/Q0jyIXOXEM
+KL0JZXnNS0/dqR3IYbC7f39CL6Sf40gRGTwTWWGg3KnynoS0v1zQcZLTMhHBD2X
tgdIPbroq9t4gXa7Dhm0egYfQOI/7re2wiZT7UWVVwEpYqKf6JApFHa1nNOFMrLF
45JHQIHArkoxpQdfSe9HBoyJiB5vz398rHZeqbJaF3PIg9rxWWY/NvvOVuIk8U5z
0jExhg29a88B32U7ndvQJqIuGiQghzCiLxC/y1+wAdpeDSbD3OAOHqplvMj3BUn9
yhDSLSjtfBJjnXKxtEcWLR0edHCGEk5mAcL7q1WNxDpxaICwGGpNZN53CtFx7amb
egYil448DmiqoQTCTE9pBz8YjwiVfCYLYv17O0NJyYM9Efy/wL3rFlsPJniWHMuH
imZybVU4ukjvfOZ+LY4COTwz6w4sfA7a+i+2mOynC7eKX8Yg6i1nXlcY1Z8ykNgi
7B3kz1T/DV56CIm6QUWtepfuKTYq4C6QrBBIXLk1d5g95aWA21u1LRqNZ9GLH+eA
gfvIm7v+cELj8a53EQY0LafzZqNC5kQAp916coU=
-----END CERTIFICATE-----

View File

@ -1,33 +0,0 @@
-----BEGIN CERTIFICATE-----
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
-----END CERTIFICATE-----

View File

@ -1,34 +0,0 @@
-----BEGIN CERTIFICATE-----
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
LD8d2z2Lgg==
-----END CERTIFICATE-----

View File

@ -203,7 +203,15 @@ public class DaemonWrapper {
}
private void processAssets() {
File holderFile = new File(i2pdpath, "assets.ready");
// Checking if application folder exists, and create it if not
Log.d(TAG, "checking app directory");
File appPath = new File(i2pdpath);
if (!appPath.exists()) {
boolean result = appPath.mkdir();
Log.d(TAG, "appPath.mkdir() returned " + result + " for " + appPath);
}
File holderFile = new File(appPath, "assets.ready");
String versionName = BuildConfig.VERSION_NAME; // here will be app version, like 2.XX.XX
StringBuilder text = new StringBuilder();
Log.d(TAG, "checking assets");
@ -246,7 +254,7 @@ public class DaemonWrapper {
boolean deleteResult = holderFile.delete();
if (!deleteResult)
Log.e(TAG, "holderFile.delete() returned " + deleteResult + ", absolute path='" + holderFile.getAbsolutePath() + "'");
File certPath = new File(i2pdpath, "certificates");
File certPath = new File(appPath, "certificates");
deleteRecursive(certPath);
// copy assets. If processed file exists, it won't be overwritten
@ -254,7 +262,6 @@ public class DaemonWrapper {
copyAsset("certificates");
copyAsset("tunnels.d");
copyAsset("i2pd.conf");
copyAsset("subscriptions.txt");
copyAsset("tunnels.conf");
// update holder file about successful copying

View File

@ -111,7 +111,7 @@ public class I2PDActivity extends Activity {
Log.d(TAG, "onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService(new Intent(this, ForegroundService.class));
textView = (TextView) findViewById(R.id.appStatusText);
HTTPProxyState = (CheckBox) findViewById(R.id.service_httpproxy_box);
SOCKSProxyState = (CheckBox) findViewById(R.id.service_socksproxy_box);

View File

@ -183,6 +183,7 @@ public class I2PDPermsAskerActivity extends Activity {
}
}
} else if (requestCode == APP_STORAGE_ACCESS_REQUEST_CODE && resultCode == RESULT_OK) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (Environment.isExternalStorageManager()) {
startMainActivity();
} else {
@ -195,5 +196,6 @@ public class I2PDPermsAskerActivity extends Activity {
} else {
finish(); // close the app
}
}
}
}

View File

@ -0,0 +1,56 @@
package org.purplei2p.i2pd;
import android.content.Intent;
import android.service.quicksettings.Tile;
import android.service.quicksettings.TileService;
import android.util.Log;
import android.annotation.TargetApi;
import android.os.Build;
@TargetApi(Build.VERSION_CODES.N)
public class I2PdQSTileService extends TileService {
private static final String TAG = "MyQSTileService";
@Override
public void onClick() {
super.onClick();
Log.d(TAG, "Tile clicked.");
try {
// Add the FLAG_ACTIVITY_NEW_TASK flag
Intent intent = new Intent(this, I2PDActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityAndCollapse(intent);
} catch (Exception e) {
Log.e(TAG, "Error starting ForegroundService", e);
}
}
@Override
public void onStartListening() {
super.onStartListening();
Log.d(TAG, "Tile started listening.");
}
@Override
public void onStopListening() {
super.onStopListening();
Log.d(TAG, "Tile stopped listening.");
}
@Override
public void onTileAdded() {
super.onTileAdded();
Log.d(TAG, "Tile added.");
}
@Override
public void onTileRemoved() {
super.onTileRemoved();
Log.d(TAG, "Tile removed.");
}
}

View File

@ -0,0 +1,459 @@
package org.purplei2p.i2pd;
import android.os.Build;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.PreferenceActivity;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import android.util.Log;
import java.io.File;
import org.apache.commons.configuration2.INIConfiguration;
import java.io.StringWriter;
import java.io.Writer;
import java.nio.file.*;
public class MainPreferenceActivity extends PreferenceActivity {
private Boolean isOldConfigExists = false;
public static final String CONFIG_FILE_PATH = "/sdcard/i2pd/i2pd.conf";
private static final String OLD_FILE_PREFIX= "__old";
boolean isOldConfigExists()
{
try {
return new File(CONFIG_FILE_PATH + OLD_FILE_PREFIX).exists();
}catch(Exception e) { return false; }
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences_i2pd);
INIConfiguration properties = readConfiguration();
// backup old configuration.
if (!isOldConfigExists)
{
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (Files.exists(Paths.get(CONFIG_FILE_PATH))) {
Files.copy(Paths.get(CONFIG_FILE_PATH), Paths.get(CONFIG_FILE_PATH + OLD_FILE_PREFIX));
}
} // if build ...
} catch (IOException e) {
e.printStackTrace();
}
}
// delete empty sections
{
writeConfiguration(properties);
}
// Main Categoryре
ListPreference logLevel = (ListPreference) findPreference("logLevelPreference");
logLevel.setValue(properties.getString("log", "info"));
logLevel.setOnPreferenceChangeListener((preference, newValue) -> {
// Modify properties
//properties.setProperty("log", (String) newValue);
// Save modified properties
//writeConfiguration(properties);
writeConfiguration(properties, "log", (String) newValue);
return true;
});
CheckBoxPreference ipv4Enable = (CheckBoxPreference) findPreference("ipv4EnablePreference");
boolean ipv4Enabled = Boolean.parseBoolean(properties.getString("ipv4", "true")); // "true" - значение по умолчанию, если ключ отсутствует
ipv4Enable.setChecked(ipv4Enabled);
ipv4Enable.setOnPreferenceChangeListener((preference, newValue) -> {
// Modify properties
// Convert Object to boolean
boolean newValueBoolean = (boolean) newValue;
//properties.setProperty("ipv4", String.valueOf(newValueBoolean)); // assuming "ipv4" is the key
// Save modified properties
writeConfiguration(properties, "ipv4", String.valueOf(newValueBoolean));
return true;
});
CheckBoxPreference ipv6Enable = (CheckBoxPreference) findPreference("ipv6EnablePreference");
boolean ipv6Enabled = Boolean.parseBoolean(properties.getString("ipv6", "false"));
ipv6Enable.setChecked(ipv6Enabled);
ipv6Enable.setOnPreferenceChangeListener((preference, newValue) -> {
// Modify properties
// Convert Object to boolean
boolean newValueBoolean = (boolean) newValue;
//properties.setProperty("ipv6", String.valueOf(newValueBoolean)); // assuming "ipv4" is the key
// Save modified properties
writeConfiguration(properties, "ipv6", String.valueOf(newValueBoolean));
return true;
});
// Example for portPreference (EditTextPreference)
EditTextPreference portPreference = (EditTextPreference) findPreference("portPreference");
String portValue = properties.getString("port", "auto");
portPreference.setText(portValue);
portPreference.setOnPreferenceChangeListener((preference, newValue) -> {
// Modify properties
/*Properties properties = readProperties();
// Convert Object to String (assuming "port" is the key)
String newValueString = newValue.toString();
properties.setProperty("port", newValueString);
// Save modified properties
writeProperties(properties);*/
Toast.makeText(MainPreferenceActivity.this, "For security reasons, changes are not allowed. If you really want this, open the config.", Toast.LENGTH_SHORT).show();
return true;
});
// Example for bandwidthPreference (ListPreference)
ListPreference bandwidthPreference = (ListPreference) findPreference("bandwidthPreference");
String bandwidthValue = properties.getString("bandwidth", "L");
bandwidthPreference.setValue(bandwidthValue);
bandwidthPreference.setOnPreferenceChangeListener((preference, newValue) -> {
String newValueString = newValue.toString();
//properties.setProperty("bandwidth", newValueString);
writeConfiguration(properties, "bandwidth", newValueString);
return true;
});
// Example for noTransitPreference (CheckBoxPreference)
CheckBoxPreference noTransitPreference = (CheckBoxPreference) findPreference("noTransitPreference");
boolean noTransitPreferenceEnabled = Boolean.parseBoolean(properties.getString("notransit", "false"));
noTransitPreference.setChecked(noTransitPreferenceEnabled);
noTransitPreference.setOnPreferenceChangeListener((preference, newValue) -> {
boolean newValueBoolean = (boolean) newValue;
//properties.setProperty("notransit", String.valueOf(newValueBoolean));
writeConfiguration(properties, "notransit", String.valueOf(newValueBoolean));
return true;
});
CheckBoxPreference floodfillPreference = (CheckBoxPreference) findPreference("floodfillPreference");
boolean floodfillPreferenceEnabled = Boolean.parseBoolean(properties.getString("floodfill", "false"));
floodfillPreference.setChecked(floodfillPreferenceEnabled);
floodfillPreference.setOnPreferenceChangeListener((preference, newValue) -> {
boolean newValueBoolean = (boolean) newValue;
//properties.setProperty("floodfill", String.valueOf(newValueBoolean));
writeConfiguration(properties, "floodfill", String.valueOf(newValueBoolean));
return true;
});
// ^^^ general
// vvv not general (sections name)
CheckBoxPreference ssuPreference = (CheckBoxPreference) findPreference("ssuPreference");
boolean ssuPreferenceEnabled = Boolean.parseBoolean(properties.getString("ssu2.enabled", "true"));
ssuPreference.setChecked(ssuPreferenceEnabled);
ssuPreference.setOnPreferenceChangeListener((preference, newValue) -> {
boolean newValueBoolean = (boolean) newValue;
properties.setProperty("ssu2.enabled", String.valueOf(newValueBoolean));
writeConfiguration(properties);
return true; // Allow the change
});
// NTCP2 Category
CheckBoxPreference ntcp2Enable = (CheckBoxPreference) findPreference("ntcp2EnablePreference");
boolean ntcp2EnabledPreference = Boolean.parseBoolean(properties.getString("ntcp2.enabled", "true"));
ntcp2Enable.setChecked(ntcp2EnabledPreference);
ntcp2Enable.setOnPreferenceChangeListener((preference, newValue) -> {
boolean newValueBoolean = (boolean) newValue;
properties.setProperty("ntcp2.enabled", String.valueOf(newValueBoolean));
writeConfiguration(properties);
return true; // Allow the change
});
CheckBoxPreference ntcp2Publish = (CheckBoxPreference) findPreference("ntcp2PublishPreference");
boolean ntcp2PublishEnabledPreference = Boolean.parseBoolean(properties.getString("ntcp2.published", "true"));
ntcp2Publish.setChecked(ntcp2EnabledPreference);
ntcp2Publish.setOnPreferenceChangeListener((preference, newValue) -> {
boolean newValueBoolean = (boolean) newValue;
properties.setProperty("ntcp2.published", String.valueOf(newValueBoolean));
writeConfiguration(properties);
return true; // Allow the change
});
// Web Console Category
CheckBoxPreference webConsoleEnable = (CheckBoxPreference) findPreference("webConsoleEnablePreference");
boolean webConsoleEnableValue = Boolean.parseBoolean(properties.getString("http.enabled", "false"));
webConsoleEnable.setChecked(webConsoleEnableValue);
webConsoleEnable.setOnPreferenceChangeListener((preference, newValue) -> {
boolean newValueBoolean = (boolean) newValue;
properties.setProperty("http.enabled", String.valueOf(newValueBoolean));
// Save modified properties
writeConfiguration(properties);
return true;
});
EditTextPreference webConsoleAddress = (EditTextPreference) findPreference("webConsoleAddressPreference");
String webConsoleAddressValue = properties.getString("http.address", "127.0.0.1");
webConsoleAddress.setText(webConsoleAddressValue);
webConsoleAddress.setOnPreferenceChangeListener((preference, newValue) -> {
String newValueString = newValue.toString();
properties.setProperty("http.address", newValueString);
writeConfiguration(properties);
return true;
});
EditTextPreference webConsolePort = (EditTextPreference) findPreference("webConsolePortPreference");
String webConsolePortValue = properties.getString("http.port", "7070");
webConsolePort.setText(webConsolePortValue);
webConsolePort.setOnPreferenceChangeListener((preference, newValue) -> {
String newValueString = newValue.toString();
properties.setProperty("http.port", newValueString);
// Save modified properties
writeConfiguration(properties);
return true;
});
CheckBoxPreference webConsoleAuth = (CheckBoxPreference) findPreference("webConsoleAuthPreference");
boolean webConsoleAuthValue = Boolean.parseBoolean(properties.getString("http.auth", "false"));
webConsoleAuth.setChecked(webConsoleAuthValue);
webConsoleAuth.setOnPreferenceChangeListener((preference, newValue) -> {
boolean newValueBoolean = (boolean) newValue;
properties.setProperty("http.auth", String.valueOf(newValueBoolean));
// Save modified properties
writeConfiguration(properties);
return true;
});
EditTextPreference webConsoleUser = (EditTextPreference) findPreference("webConsoleUserPreference");
String webConsoleUserValue = properties.getString("http.user", "user");
webConsoleUser.setText(webConsoleUserValue);
webConsoleUser.setOnPreferenceChangeListener((preference, newValue) -> {
String newValueString = newValue.toString();
properties.setProperty("http.user", newValueString);
// Save modified properties
writeConfiguration(properties);
return true;
});
EditTextPreference webConsolePassword = (EditTextPreference) findPreference("webConsolePasswordPreference");
String webConsolePasswordValue = properties.getString("http.pass", "pass");
webConsolePassword.setText(webConsolePasswordValue);
webConsolePassword.setOnPreferenceChangeListener((preference, newValue) -> {
String newValueString = newValue.toString();
properties.setProperty("http.pass", newValueString);
// Save modified properties
writeConfiguration(properties);
return true;
});
// HTTP Proxy Category
CheckBoxPreference httpProxyEnable = (CheckBoxPreference) findPreference("httpProxyEnablePreference");
boolean httpProxyEnabled = Boolean.parseBoolean(properties.getString("httpproxy.enabled", "true"));
httpProxyEnable.setChecked(httpProxyEnabled);
httpProxyEnable.setOnPreferenceChangeListener((preference, newValue) -> {
boolean newValueBoolean = (boolean) newValue;
properties.setProperty("httpproxy.enabled", String.valueOf(newValueBoolean));
// Save modified properties
writeConfiguration(properties);
return true;
});
EditTextPreference httpProxyAddress = (EditTextPreference) findPreference("httpProxyAddressPreference");
String httpProxyAddressValue = properties.getString("httpproxy.address", "127.0.0.1");
httpProxyAddress.setText(httpProxyAddressValue);
httpProxyAddress.setOnPreferenceChangeListener((preference, newValue) -> {
String newValueString = newValue.toString();
properties.setProperty("httpproxy.address", newValueString);
// Save modified properties
writeConfiguration(properties);
return true;
});
EditTextPreference httpProxyPort = (EditTextPreference) findPreference("httpProxyPortPreference");
String httpProxyPortValue = properties.getString("httpproxy.port", "4444");
httpProxyPort.setOnPreferenceChangeListener((preference, newValue) -> {
String newValueString = newValue.toString();
properties.setProperty("httpproxy.port", newValueString);
// Save modified properties
writeConfiguration(properties);
return true;
});
EditTextPreference httpProxyKeys = (EditTextPreference) findPreference("httpProxyKeysPreference");
String httpProxyKeyValue = properties.getString("httpproxy.keys", "transient");
httpProxyKeys.setText(httpProxyKeyValue);
httpProxyKeys.setOnPreferenceChangeListener((preference, newValue) -> {
String newValueString = newValue.toString();
properties.setProperty("httpproxy.keys", newValueString);
// Save modified properties
writeConfiguration(properties);
return true;
});
// SOCKS Proxy Category
CheckBoxPreference socksProxyEnable = (CheckBoxPreference) findPreference("socksProxyEnablePreference");
boolean socksProxyEnabled = Boolean.parseBoolean(properties.getString("socksproxy.enabled", "true"));
socksProxyEnable.setChecked(socksProxyEnabled);
socksProxyEnable.setOnPreferenceChangeListener((preference, newValue) -> {
boolean newValueBoolean = (boolean) newValue;
properties.setProperty("socksproxy.enabled", String.valueOf(newValueBoolean));
// Save modified properties
writeConfiguration(properties);
return true;
});
EditTextPreference socksProxyAddress = (EditTextPreference) findPreference("socksProxyAddressPreference");
String socksProxyAddressValue = properties.getString("socksproxy.address", "127.0.0.1");
socksProxyAddress.setText(socksProxyAddressValue);
socksProxyAddress.setOnPreferenceChangeListener((preference, newValue) -> {
String newValueString = newValue.toString();
properties.setProperty("socksproxy.address", newValueString);
// Save modified properties
writeConfiguration(properties);
return true;
});
EditTextPreference socksProxyPort = (EditTextPreference) findPreference("socksProxyPortPreference");
String socksProxyPortValue = properties.getString("socksproxy.port", "4447");
socksProxyPort.setText(socksProxyPortValue);
socksProxyPort.setOnPreferenceChangeListener((preference, newValue) -> {
String newValueString = newValue.toString();
properties.setProperty("socksproxy.port", newValueString);
// Save modified properties
writeConfiguration(properties);
return true;
});
EditTextPreference socksProxyKeys = (EditTextPreference) findPreference("socksProxyKeysPreference");
String socksProxyKeysValue = properties.getString("socksproxy.keys", "transient");
socksProxyKeys.setText(socksProxyKeysValue);
socksProxyKeys.setOnPreferenceChangeListener((preference, newValue) -> {
String newValueString = newValue.toString();
properties.setProperty("socksproxy.keys", newValueString);
// Save modified properties
writeConfiguration(properties);
return true;
});
// SAM Category
CheckBoxPreference samEnable = (CheckBoxPreference) findPreference("samEnablePreference");
boolean samEnableValue = Boolean.parseBoolean(properties.getString("sam.enabled", "true"));
samEnable.setChecked(samEnableValue);
samEnable.setOnPreferenceChangeListener((preference, newValue) -> {
boolean newValueBoolean = (boolean) newValue;
properties.setProperty("sam.enabled", String.valueOf(newValueBoolean));
// Save modified properties
writeConfiguration(properties);
return true;
});
EditTextPreference samAddress = (EditTextPreference) findPreference("samAddressPreference");
String samAddressValue = properties.getString("sam.address", "127.0.0.1");
samAddress.setText(samAddressValue);
samAddress.setOnPreferenceChangeListener((preference, newValue) -> {
String newValueString = newValue.toString();
properties.setProperty("sam.address", newValueString);
// Save modified properties
writeConfiguration(properties);
return true;
});
EditTextPreference samPort = (EditTextPreference) findPreference("samPortPreference");
String samPortValue = properties.getString("sam.port", "7656");
samPort.setText(samPortValue);
samPort.setOnPreferenceChangeListener((preference, newValue) -> {
String newValueString = newValue.toString();
properties.setProperty("sam.port", newValueString);
// Save modified properties
writeConfiguration(properties);
return true;
});
// UPnP Category
CheckBoxPreference upnpEnable = (CheckBoxPreference) findPreference("upnpEnablePreference");
boolean upnpEnableValue = Boolean.parseBoolean(properties.getString("upnp.enabled", "true"));
upnpEnable.setChecked(upnpEnableValue);
upnpEnable.setOnPreferenceChangeListener((preference, newValue) -> {
boolean newValueBoolean = (boolean) newValue;
properties.setProperty("upnp.enabled", String.valueOf(newValueBoolean));
// Save modified properties
writeConfiguration(properties);
return true;
});
EditTextPreference upnpForwardName = (EditTextPreference) findPreference("upnpForwardNamePreference");
String upnpForwardNameValue = properties.getString("upnp.name", "I2Pd");
upnpForwardName.setText(upnpForwardNameValue);
upnpForwardName.setOnPreferenceChangeListener((preference, newValue) -> {
String newValueString = newValue.toString();
properties.setProperty("upnp.name", newValueString);
// Save modified properties
writeConfiguration(properties);
return true;
});
// Limits Category
EditTextPreference transitTunnelEdit = (EditTextPreference) findPreference("transitTunnelPreference");
String transitTunnelValue = properties.getString("limits.transittunnels", "3000");
transitTunnelEdit.setText(transitTunnelValue);
transitTunnelEdit.setOnPreferenceChangeListener((preference, newValue) -> {
String newValueString = newValue.toString();
properties.setProperty("limits.transittunnels", newValueString);
// Save modified properties
writeConfiguration(properties);
return true;
});
}
/*
private Properties readProperties() {
if (isOldConfigExists) {
Toast.makeText(this, oldConfigErrMsg, Toast.LENGTH_SHORT).show();
}
Properties properties = new Properties();
try (FileReader reader = new FileReader(CONFIG_FILE_PATH)) {
properties.load(reader);
} catch (IOException e) {
e.printStackTrace();
}
return properties;
}
*/
/*
private void writeProperties(Properties properties) {
if (isOldConfigExists) {
Toast.makeText(this, oldConfigErrMsg, Toast.LENGTH_SHORT).show();
} else {
try (FileWriter writer = new FileWriter(CONFIG_FILE_PATH)) {
properties.store(writer, "Updated properties");
} catch (IOException e) {
e.printStackTrace();
}
}
}*/
private INIConfiguration readConfiguration() {
INIConfiguration iniConfiguration = new INIConfiguration();
try (FileReader reader = new FileReader(CONFIG_FILE_PATH)) {
iniConfiguration.read(reader);
} catch (Exception e) {
e.printStackTrace();
}
return iniConfiguration;
}
private void writeConfiguration(INIConfiguration iniConfiguration)
{
writeConfiguration(iniConfiguration, "", "");
}
private void writeConfiguration(INIConfiguration iniConfiguration, String option, String value) {
try (FileWriter writer = new FileWriter(CONFIG_FILE_PATH)) {
StringWriter stringWriter = new StringWriter();
iniConfiguration.write(stringWriter);
String configFileContent = stringWriter.toString();
// Удаление пустых секций из строки конфигурации
String regexEmptySections = "(\\[\\w+\\]\\n(\\n|$)|\\[\\w+\\](\\z|\\Z))";
configFileContent = configFileContent.replaceAll(regexEmptySections, "");
// Если указана опция для перемещения
if (!option.isEmpty()) {
Log.d("configFileContent","option is not empty");
String optionPattern = option + "\\s+?=\\s+?\\w+"; // Паттерн для поиска опции с присваиванием в начале строки
Log.d("confiFileContent","config File contains option");
if (configFileContent.contains(option)) configFileContent = configFileContent.replaceAll(optionPattern, ""); // Удаляем первое вхождение
Log.d("confiFileContent", option);
Log.d("confiFileContent", value);
Log.d("confiFileContent","Add on start line");
configFileContent = option + "=" + value + "\n" + configFileContent;
}
Log.d("configFileContent", configFileContent);
writer.write(configFileContent);
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@ -11,8 +11,12 @@ import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.Switch;
import java.io.File;
import java.util.List;
import java.util.Objects;
@ -21,7 +25,6 @@ import java.util.Objects;
//import org.purplei2p.i2pd.iniedotr.IniEditor;
public class SettingsActivity extends Activity {
//protected IniEditor iniedit = new IniEditor();
private String TAG = "i2pdSrvcSettings";
private File cacheDir;
public static String onBootFileName = "/onBoot"; // just file, empty, if exist the do autostart, if not then no.
@ -83,9 +86,16 @@ public class SettingsActivity extends Activity {
setContentView(R.layout.activity_settings);
Objects.requireNonNull(getActionBar()).setDisplayHomeAsUpEnabled(true);
Switch autostart_switch = findViewById(R.id.autostart_enable);
Button openPreferences = findViewById(R.id.OpenPreferences);
cacheDir = getApplicationContext().getCacheDir();
File onBoot = new File(cacheDir.getAbsolutePath() + onBootFileName);
openPreferences.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(SettingsActivity.this, MainPreferenceActivity.class);
startActivity(intent);
}
});
autostart_switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// do something, the isChecked will be

File diff suppressed because it is too large Load Diff

View File

@ -52,7 +52,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:textAppearance="@android:style/TextAppearance.Material.Large"
android:textAppearance="@android:style/TextAppearance.Large"
android:textColor="#DFDFDF" />
<Space
@ -65,7 +65,7 @@
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="@string/services"
android:textAppearance="@android:style/TextAppearance.Material.Medium"
android:textAppearance="@android:style/TextAppearance.Medium"
android:textColor="#DFDFDF" />
<TableLayout
@ -84,7 +84,7 @@
android:layout_height="wrap_content"
android:clickable="false"
android:text="@string/services_http_proxy"
android:textAppearance="@android:style/TextAppearance.Material.Small"
android:textAppearance="@android:style/TextAppearance.Small"
android:textColor="#DFDFDF" />
</TableRow>
@ -100,7 +100,7 @@
android:layout_height="wrap_content"
android:clickable="false"
android:text="@string/services_socks_proxy"
android:textAppearance="@android:style/TextAppearance.Material.Small"
android:textAppearance="@android:style/TextAppearance.Small"
android:textColor="#DFDFDF" />
</TableRow>
@ -115,7 +115,7 @@
android:layout_height="wrap_content"
android:clickable="false"
android:text="@string/services_bob"
android:textAppearance="@android:style/TextAppearance.Material.Small"
android:textAppearance="@android:style/TextAppearance.Small"
android:textColor="#DFDFDF" />
</TableRow>
@ -130,7 +130,7 @@
android:layout_height="wrap_content"
android:clickable="false"
android:text="@string/services_sam"
android:textAppearance="@android:style/TextAppearance.Material.Small"
android:textAppearance="@android:style/TextAppearance.Small"
android:textColor="#DFDFDF" />
</TableRow>
@ -145,11 +145,11 @@
android:layout_height="wrap_content"
android:clickable="false"
android:text="@string/services_i2cp"
android:textAppearance="@android:style/TextAppearance.Material.Small"
android:textAppearance="@android:style/TextAppearance.Small"
android:textColor="#DFDFDF" />
</TableRow>
</TableLayout>
</LinearLayout>
</ScrollView>
</ScrollView>

View File

@ -28,6 +28,18 @@
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?android:attr/listDivider" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/OpenPreferences"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/OpenPreferences" />
</LinearLayout>
<!--
<TextView
android:id="@+id/settings_section2"

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<string name="app_description2">Sieć bez granic</string>
<string name="action_start">Rozpocznij</string>
<string name="action_stop">Zatrzymaj</string>
<string name="action_exit">Wyjdź</string>
<string name="action_graceful_stop">Łagodne zatrzymanie</string>
<string name="action_cancel_graceful_stop">Anuluj łagodne zatrzymanie</string>
<string name="action_reload_tunnels_config">Załaduj ponownie tunele</string>
<string name="action_start_webview">Otwórz konsolę Web</string>
<string name="action_settings">Ustawienia</string>
<string name="graceful_stop_is_already_in_progress">Łagodne zatrzymanie jest już w toku</string>
<string name="graceful_stop_is_in_progress">Łagodne zatrzymanie w toku</string>
<string name="gracefulShutdownInProgress">Łagodne wyłączenie w toku</string>
<string name="already_stopped">Już zatrzymano</string>
<string name="uninitialized">Inicjowanie aplikacji...</string>
<string name="starting">Uruchamianie aplikacji...</string>
<string name="jniLibraryLoaded">Wczytano biblioteki JNI</string>
<string name="startedOkay">Aplikacja rozpoczęta</string>
<string name="startFailed">Start nie powiódł się</string>
<string name="stopped">Aplikacja zatrzymana</string>
<string name="stopping">Zatrzymywanie aplikacji...</string>
<string name="remaining">pozostało</string>
<string name="services">Usługi wewnętrzne</string>
<string name="services_http_proxy">Serwer proxy HTTP</string>
<string name="services_socks_proxy">Proxy SOCKS5</string>
<string name="title_activity_i2_pdperms_asker_prompt">Informacja</string>
<string name="permDenied">Odmowa uprawnienia do zapisu karty SD, musisz zezwolić na kontynuowanie</string>
<string name="permRequired">Dostęp do zapisu karty SD jest wymagany do zapisywania kluczy i innych plików w folderze I2PD na karcie SD.</string>
<string name="retryPermRequest">Spróbuj ponownie poprosić o uprawnienia do zapisu karty SD</string>
<string name="menu_item_battery_optimizations_str">Optymalizacja baterii</string>
<string name="battery_optimizations_enabled">Optymalizacje zużycia baterii włączone</string>
<string name="battery_optimizations_enabled_explained">Twój Android wykonuje ciężkie optymalizacje baterii na I2PD, co może doprowadzić do zamknięcia demona bez żadnego innego powodu.\nZaleca się wyłączenie optymalizacji baterii.</string>
<string name="battery_optimizations_enabled_dialog">Twój Android wykonuje ciężkie optymalizacje baterii na I2PD, co może doprowadzić do zamknięcia demona bez żadnego innego powodu.\n\nZostaniesz teraz poproszony o zezwolenie na ich wyłączenie.</string>
<string name="continue_str">Kontynuuj</string>
<string name="device_does_not_support_disabling_battery_optimizations">Twoja wersja Androida nie obsługuje rezygnacji z optymalizacji baterii</string>
<string name="os_version_does_not_support_battery_optimizations_show_os_dialog_api">Twoja wersja Android OS nie obsługuje wyświetlania okna dialogowego optymalizacji baterii dla aplikacji.</string>
<string name="shutdown_canceled">Anulowano planowane wyłączenie</string>
<string name="tunnels_reloading">Przeładowywanie konfiguracji tuneli...</string>
<string name="settings_section0">Ustawienia ogólne</string>
<string name="settings_section_tunnels">Tunele</string>
<string name="autostart_enabled">Uruchom przy starcie systemu</string>
<string name="add_tunnel_button">Dodaj tunel</string>
<string name="add_tunnel">Zarządzanie tunelami</string>
<string name="del_tunnel_button">Usuń tunel</string>
</resources>

View File

@ -11,33 +11,33 @@
<string name="action_settings">Configurações</string>
<string name="graceful_stop_is_already_in_progress">Saída Graciosa já está em progresso</string>
<string name="graceful_stop_is_in_progress">Saída Graciosa em progresso</string>
<string name="gracefulShutdownInProgress">Saída Graciosa em progresso</string>
<string name="gracefulShutdownInProgress">Desligamento gracioso em progresso</string>
<string name="already_stopped">Já parou</string>
<string name="uninitialized">Inicializando aplicação...</string>
<string name="uninitialized">Iniciando aplicação...</string>
<string name="starting">Iniciando aplicação...</string>
<string name="jniLibraryLoaded">Bibliotecas JNI carregadas</string>
<string name="startedOkay">Aplicação iniciada</string>
<string name="startFailed">Inicialização falhou</string>
<string name="stopped">Aplicação parou</string>
<string name="stopping">Parando aplicação...</string>
<string name="remaining">faltando</string>
<string name="remaining">restando</string>
<string name="services">Serviços internos</string>
<string name="services_http_proxy">Proxy HTTP</string>
<string name="services_socks_proxy">Proxy SOCKS5</string>
<string name="title_activity_i2_pdperms_asker_prompt">Permissão</string>
<string name="permDenied">Permissões de escrita no cartão SD negadas, você precisa permitir isso para continuar</string>
<string name="permRequired">Permissões de escrita no cartão SD são necessárias para gravar as chaves e outros arquivos na pasta do I2PD no cartão SD.</string>
<string name="retryPermRequest">Tente novamente solicitar as permissões de escrita ao cartão SD</string>
<string name="permDenied">Permissão de escrita no cartão SD foi negada, você precisa permitir isso para continuar</string>
<string name="permRequired">Permissão de escrita no cartão SD é necessária para gravar as chaves e outros arquivos na pasta do I2PD no cartão SD.</string>
<string name="retryPermRequest">Tente novamente solicitar a permissão de escrita no cartão SD</string>
<string name="menu_item_battery_optimizations_str">Otimizações da Bateria</string>
<string name="battery_optimizations_enabled">Otimizações da bateria ativadas</string>
<string name="battery_optimizations_enabled_explained">O seu sistema está realizando fortes otimizações de uso de bateria pelo I2PD que podem levar a fechamentos inesperados do serviço.\nÉ recomendando desativar estas otimizações de bateria.</string>
<string name="battery_optimizations_enabled_dialog">O seu sistema está realizando fortes otimizações de uso de bateria pelo I2PD que podem levar a fechamentos inesperados do serviço.\n\nVocê será solicitado a permitir desativá-las.</string>
<string name="battery_optimizations_enabled_explained">O seu sistema está realizando fortes otimizações de uso de bateria pelo I2PD que podem levar a fechamentos inesperados do serviço.\nÉ recomendando desativar estas otimizações.</string>
<string name="battery_optimizations_enabled_dialog">O seu sistema está realizando fortes otimizações de uso de bateria pelo I2PD que podem levar a fechamentos inesperados do serviço.\n\nVocê será solicitado a desativá-las.</string>
<string name="continue_str">Continuar</string>
<string name="device_does_not_support_disabling_battery_optimizations">A sua versão do Android não suporta definir otimizações de bateria</string>
<string name="device_does_not_support_disabling_battery_optimizations">A sua versão do Android não suporta a opção de não usar otimizações de bateria</string>
<string name="os_version_does_not_support_battery_optimizations_show_os_dialog_api">A versão do seu sistema Android não suporta mostrar a caixa de diálogo para otimizações de bateria para aplicativos.</string>
<string name="shutdown_canceled">Desligamento planejado cancelado</string>
<string name="tunnels_reloading">Recarregando configurações dos túneis...</string>
<string name="settings_section0">Configurações usuais</string>
<string name="settings_section0">Configurações comuns</string>
<string name="settings_section_tunnels">Túneis</string>
<string name="autostart_enabled">Iniciar no boot</string>
<string name="add_tunnel_button">Adicionar túnel</string>

View File

@ -43,4 +43,5 @@
<string name="add_tunnel_button">Добавить туннель</string>
<string name="add_tunnel">Управление туннелями</string>
<string name="del_tunnel_button">Удалить туннель</string>
<string name="OpenPreferences">Открыть основные настройки</string>
</resources>

View File

@ -60,5 +60,6 @@
<string name="add_tunnel">Tunnels management</string>
<string name="del_tunnel_button">Delete tunnel</string>
<string name="OpenPreferences">Open i2pd settings</string>
</resources>

View File

@ -3,97 +3,108 @@
<PreferenceCategory android:title="Main">
<CheckBoxPreference
android:defaultValue="true"
android:key="check_box_preference_1"
android:title="Log" />
<ListPreference
android:id="@+id/LogLevel"
android:defaultValue="1"
android:entries="@array/pref_loglevel"
android:entryValues="@array/pref_loglevel"
android:key="list_preference_1"
android:key="logLevelPreference"
android:summary="Logging level to file. Use 'none' to reduce memory usage"
android:title="Log level" />
<CheckBoxPreference
android:id="@+id/IPV4Enable"
android:defaultValue="true"
android:key="check_box_preference_1"
android:key="ipv4EnablePreference"
android:title="IPv4" />
<CheckBoxPreference
android:id="@+id/IPV6Enable"
android:defaultValue="false"
android:key="check_box_preference_1"
android:key="ipv6EnablePreference"
android:title="IPv6" />
<EditTextPreference
android:defaultValue="Default value"
android:key="edit_text_preference_1"
android:id="@+id/Port"
android:defaultValue="auto"
android:key="portPreference"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="Port" />
<ListPreference
android:id="@+id/BandWithType"
android:entries="@array/pref_bandwidth_limit_flags"
android:entryValues="@array/pref_bandwidth_limit_flags"
android:key="list_preference_1"
android:key="bandwidthPreference"
android:summary="Bandwidth limit for transit traffic"
android:title="Bandwidth" />
<CheckBoxPreference
android:id="@+id/NoTransitCheckbox"
android:defaultValue="false"
android:key="check_box_preference_1"
android:key="noTransitPreference"
android:summary="Disable transit"
android:title="No transit" />
<CheckBoxPreference
android:id="@+id/FloodfillCheckBox"
android:defaultValue="false"
android:key="check_box_preference_1"
android:key="floodfillPreference"
android:summary="Uses more battery"
android:title="Floodfill" />
<CheckBoxPreference
android:id="@+id/SSUCheckBox"
android:defaultValue="true"
android:key="check_box_preference_1"
android:key="ssuPreference"
android:title="SSU" />
</PreferenceCategory>
<PreferenceCategory android:title="NTCP2">
<CheckBoxPreference
android:id="@+id/NTCP2Checkbox"
android:defaultValue="true"
android:key="check_box_preference_1"
android:key="ntcp2EnablePreference"
android:title="Enable" />
<CheckBoxPreference
android:id="@+id/NTCPPublishCheckbox"
android:defaultValue="true"
android:key="check_box_preference_1"
android:key="ntcp2PublishPreference"
android:summary="Disable to make unable to connect to your device"
android:title="Publish" />
</PreferenceCategory>
<PreferenceCategory android:title="Web Console">
<CheckBoxPreference
android:id="@+id/WebConsoleEnableCheckbox"
android:defaultValue="true"
android:key="check_box_preference_1"
android:key="webConsoleEnablePreference"
android:title="Enable" />
<EditTextPreference
android:id="@+id/WebConsoleIPText"
android:defaultValue="127.0.0.1"
android:key="edit_text_preference_1"
android:key="webConsoleAddressPreference"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="Address" />
<EditTextPreference
android:id="@+id/WebConsolePortText"
android:defaultValue="7070"
android:key="edit_text_preference_1"
android:key="webConsolePortPreference"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="Port" />
<CheckBoxPreference
android:id="@+id/WebConsoleUseAuthCheckbox"
android:defaultValue="false"
android:key="check_box_preference_1"
android:key="webConsoleAuthPreference"
android:summary="Use HTTP authorization to access Web Console"
android:title="Autorization" />
android:title="Authorization" />
<EditTextPreference
android:id="@+id/WebConsoleUser"
android:defaultValue="Default value"
android:key="edit_text_preference_1"
android:key="webConsoleUserPreference"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="User" />
<EditTextPreference
android:id="@+id/WebConsoleUserPassword"
android:defaultValue="Default value"
android:key="edit_text_preference_1"
android:key="webConsolePasswordPreference"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="Password" />
@ -101,24 +112,28 @@
<PreferenceCategory android:title="@string/services_http_proxy">
<CheckBoxPreference
android:id="@+id/EnableHTTPProxy"
android:defaultValue="true"
android:key="check_box_preference_1"
android:key="httpProxyEnablePreference"
android:title="Enable" />
<EditTextPreference
android:id="@+id/HTTPProxyHost"
android:defaultValue="127.0.0.1"
android:key="edit_text_preference_1"
android:key="httpProxyAddressPreference"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="Address" />
<EditTextPreference
android:id="@+id/HTTPProxyPort"
android:defaultValue="4444"
android:key="edit_text_preference_1"
android:key="httpProxyPortPreference"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="Port" />
<EditTextPreference
android:defaultValue="proxy-keys.dat"
android:key="edit_text_preference_1"
android:id="@+id/HTTPProxyKeys"
android:defaultValue="transient"
android:key="httpProxyKeysPreference"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="Keys" />
@ -126,24 +141,28 @@
<PreferenceCategory android:title="SOCKS Proxy">
<CheckBoxPreference
android:id="@+id/SocksProxyEnableCheckbox"
android:defaultValue="false"
android:key="check_box_preference_1"
android:key="socksProxyEnablePreference"
android:title="Enable" />
<EditTextPreference
android:id="@+id/SocksProxyHost"
android:defaultValue="127.0.0.1"
android:key="edit_text_preference_1"
android:key="socksProxyAddressPreference"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="Address" />
<EditTextPreference
android:id="@+id/SocksProxyPort"
android:defaultValue="4447"
android:key="edit_text_preference_1"
android:key="socksProxyPortPreference"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="Port" />
<EditTextPreference
android:defaultValue="proxy-keys.dat"
android:key="edit_text_preference_1"
android:id="@+id/SocksProxyKey"
android:defaultValue="transient"
android:key="socksProxyKeysPreference"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="Keys" />
@ -151,18 +170,21 @@
<PreferenceCategory android:title="SAM">
<CheckBoxPreference
android:id="@+id/SAMEnable"
android:defaultValue="false"
android:key="check_box_preference_1"
android:key="samEnablePreference"
android:title="Enable" />
<EditTextPreference
android:id="@+id/SAMHost"
android:defaultValue="127.0.0.1"
android:key="edit_text_preference_1"
android:key="samAddressPreference"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="Address" />
<EditTextPreference
android:id="@+id/SAMPort"
android:defaultValue="7656"
android:key="edit_text_preference_1"
android:key="samPortPreference"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="Port" />
@ -170,12 +192,14 @@
<PreferenceCategory android:title="UPnP">
<CheckBoxPreference
android:defaultValue="true"
android:key="check_box_preference_1"
android:id="@+id/UPnPEnable"
android:defaultValue="false"
android:key="upnpEnablePreference"
android:title="Enable" />
<EditTextPreference
android:id="@+id/UPnPForwardName"
android:defaultValue="I2Pd"
android:key="edit_text_preference_1"
android:key="upnpForwardNamePreference"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="Forwarding name" />
@ -183,11 +207,12 @@
<PreferenceCategory android:title="Limits">
<EditTextPreference
android:defaultValue="50"
android:key="edit_text_preference_1"
android:id="@+id/TransitTunnelEdit"
android:defaultValue="3000"
android:key="transitTunnelPreference"
android:selectAllOnFocus="true"
android:singleLine="true"
android:summary="Limit possible built transit tunnels"
android:title="Transit tunnels" />
</PreferenceCategory>
</PreferenceScreen>
</PreferenceScreen>

View File

@ -4,9 +4,6 @@ LOCAL_MODULE := i2pd
LOCAL_CPP_FEATURES := rtti exceptions
LOCAL_C_INCLUDES += $(IFADDRS_PATH) $(LIB_SRC_PATH) $(LIB_CLIENT_SRC_PATH) $(LANG_SRC_PATH) $(DAEMON_SRC_PATH)
LOCAL_STATIC_LIBRARIES := \
boost_system \
boost_date_time \
boost_filesystem \
boost_program_options \
crypto \
ssl \
@ -29,27 +26,6 @@ LOCAL_SRC_FILES := \
include $(BUILD_EXECUTABLE)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := boost_system
LOCAL_SRC_FILES := $(BOOST_PATH)/build/out/$(TARGET_ARCH_ABI)/lib/libboost_system.a
LOCAL_EXPORT_C_INCLUDES := $(BOOST_PATH)/build/out/$(TARGET_ARCH_ABI)/include
include $(PREBUILT_STATIC_LIBRARY)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := boost_date_time
LOCAL_SRC_FILES := $(BOOST_PATH)/build/out/$(TARGET_ARCH_ABI)/lib/libboost_date_time.a
LOCAL_EXPORT_C_INCLUDES := $(BOOST_PATH)/build/out/$(TARGET_ARCH_ABI)/include
include $(PREBUILT_STATIC_LIBRARY)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := boost_filesystem
LOCAL_SRC_FILES := $(BOOST_PATH)/build/out/$(TARGET_ARCH_ABI)/lib/libboost_filesystem.a
LOCAL_EXPORT_C_INCLUDES := $(BOOST_PATH)/build/out/$(TARGET_ARCH_ABI)/include
include $(PREBUILT_STATIC_LIBRARY)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := boost_program_options

View File

@ -1 +0,0 @@
../../app/jni/android-ifaddrs

@ -0,0 +1 @@
Subproject commit f302cc7ead971d4068661d34c2f3ba06063d8ea2

View File

@ -1 +0,0 @@
../../app/jni/boost

1
binary/jni/boost Submodule

@ -0,0 +1 @@
Subproject commit 51924ec5533a4fefb5edf99feaeded794c06a4fb

103
binary/jni/build.sh Executable file
View File

@ -0,0 +1,103 @@
#!/bin/bash
# https://stackoverflow.com/a/246128
SOURCE="${0}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
# Checking Android SDK
if [ -z "$ANDROID_HOME" -a "$ANDROID_HOME" == "" ]; then
echo -e "\033[31mFailed! ANDROID_HOME is empty. Run 'export ANDROID_HOME=[PATH_TO_SDK]'\033[0m"
exit
fi
# Checking Android NDK
if [ -z "$ANDROID_NDK_HOME" -a "$ANDROID_NDK_HOME" == "" ]; then
echo -e "\033[31mFailed! ANDROID_NDK_HOME is empty. Run 'export ANDROID_NDK_HOME=[PATH_TO_NDK]'\033[0m"
exit 1
fi
_NDK_OPTS="-j `nproc` NDK_MODULE_PATH=$DIR"
_help()
{
echo "Syntax: $(basename "$SOURCE") [-m|d|s|h|v]"
echo "Options:"
echo "b Build binary."
echo "d Debug build."
echo "s Strip binaries."
echo "x Skip libraries rebuild."
echo "v Verbose NDK output."
echo "h Print this Help."
echo
}
_failed()
{
echo "Compilation failed";
exit 1;
}
while getopts ":dbsvxh" option; do
case $option in
d) # debug build
_NDK_OPTS="$_NDK_OPTS NDK_DEBUG=1"
;;
b) # build binary
_BINARY=1
;;
s) # strip binaries
_STRIP=1
;;
x) # skip libraries rebuild
_SKIP_LIBS=1
;;
v) # verbose output
_NDK_OPTS="$_NDK_OPTS V=1 NDK_LOG=1"
;;
h) # display help
_help
exit;;
\?) # Invalid option
echo "Error: Invalid option. Use $(basename "$SOURCE") -h for help"
exit;;
esac
done
# Building
if [ -z "$_SKIP_LIBS" ]; then
echo "Building boost..."
./build_boost.sh
[ $? -ne 0 ] && _failed
echo "Building openssl..."
./build_openssl.sh
[ $? -ne 0 ] && _failed
echo "Building miniupnpc..."
./build_miniupnpc.sh
[ $? -ne 0 ] && _failed
fi
if [ ! -z "$_BINARY" ]; then
echo "Building i2pd..."
$ANDROID_NDK_HOME/ndk-build $_NDK_OPTS
fi
echo "Processing binaries (if requested)..."
pushd $DIR/../libs > /dev/null
for xarch in $(ls .); do
if [ ! -z "$_STRIP" ]; then
$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip -s $xarch/i2pd
fi
if [ ! -z "$_MODULE" ]; then
mv $xarch/i2pd $xarch/libi2pd.so
fi
done
popd > /dev/null
echo "Compilation finished"

View File

@ -1 +0,0 @@
../../app/jni/build_boost.sh

79
binary/jni/build_boost.sh Executable file
View File

@ -0,0 +1,79 @@
#!/bin/bash
set -e
BOOST_VERSION=1.84.0
BOOST_LIBS=program_options
function build_one {
echo "Configuring and building..."
CXXFLAGS="-std=c++14" \
NCPU=$(nproc) \
./build-android.sh \
--boost=$BOOST_VERSION \
--arch=$CPU \
--target-version=$API \
--with-libraries=$BOOST_LIBS \
--layout=system \
$ANDROID_NDK_HOME
}
function checkPreRequisites {
if ! [ -d "boost" ] || ! [ "$(ls -A boost)" ]; then
echo -e "\033[31mFailed! Submodule 'boost' not found!\033[0m"
echo -e "\033[31mTry to run: 'git submodule update --init'\033[0m"
exit
fi
if [ -z "$ANDROID_NDK_HOME" -a "$ANDROID_NDK_HOME" == "" ]; then
echo -e "\033[31mFailed! ANDROID_NDK_HOME is empty. Run 'export ANDROID_NDK_HOME=[PATH_TO_NDK]'\033[0m"
exit
fi
}
function build {
for arg in "$@"; do
case "$arg" in
x86_64)
API=21
TARGET=x86_64
build_one
;;
arm64)
API=21
CPU=arm64-v8a
build_one
;;
x86)
API=16
CPU=x86
build_one
;;
arm)
API=16
CPU=armeabi-v7a
build_one
;;
all)
API=16
build_one
;;
*)
;;
esac
done
}
checkPreRequisites
cd boost
# disable verbose output
sed -i -E -e 's/d\+2/d\+0/' build-android.sh
if (( $# == 0 )); then
build all
else
build $@
fi

View File

@ -1 +0,0 @@
../../app/jni/build_miniupnpc.sh

92
binary/jni/build_miniupnpc.sh Executable file
View File

@ -0,0 +1,92 @@
#!/bin/bash
set -e
CMAKE_VERSION=3.22.1
function build_one {
mkdir -p build out/$CPU
cd build
cmake \
-G "Unix Makefiles" \
-DUPNPC_BUILD_SHARED=False \
-DUPNPC_BUILD_TESTS=False \
-DUPNPC_BUILD_SAMPLE=False \
-DANDROID_NATIVE_API_LEVEL=$API \
-DANDROID_ABI=$CPU \
-DCMAKE_BUILD_TYPE=Release \
-DANDROID_NDK=$ANDROID_NDK_HOME \
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake \
-DCMAKE_INSTALL_PREFIX=../out/$CPU \
..
echo "Building..."
cmake --build . -- libminiupnpc-static
make install
cd ..
rm -rf build
}
function checkPreRequisites {
if ! [ -d "miniupnp" ] || ! [ "$(ls -A miniupnp)" ]; then
echo -e "\033[31mFailed! Submodule 'miniupnp' not found!\033[0m"
echo -e "\033[31mTry to run: 'git submodule update --init'\033[0m"
exit
fi
if [ -z "$ANDROID_HOME" -a "$ANDROID_HOME" == "" ]; then
echo -e "\033[31mFailed! ANDROID_HOME is empty. Run 'export ANDROID_HOME=[PATH_TO_SDK]'\033[0m"
exit
fi
if [ -z "$ANDROID_NDK_HOME" -a "$ANDROID_NDK_HOME" == "" ]; then
echo -e "\033[31mFailed! ANDROID_NDK_HOME is empty. Run 'export ANDROID_NDK_HOME=[PATH_TO_NDK]'\033[0m"
exit
fi
}
function build {
for arg in "$@"; do
case "$arg" in
x86_64)
API=21
CPU=x86_64
build_one
;;
arm64)
API=21
CPU=arm64-v8a
build_one
;;
arm)
API=16
CPU=armeabi-v7a
build_one
;;
x86)
API=16
CPU=x86
build_one
;;
*)
;;
esac
done
}
checkPreRequisites
cd miniupnp/miniupnpc
rm -rf build out
# add cmake from Android SDK to PATH
PATH=$ANDROID_HOME/cmake/$CMAKE_VERSION/bin:$PATH
if (( $# == 0 )); then
build x86_64 arm64 arm x86
else
build $@
fi

View File

@ -1 +0,0 @@
../../app/jni/build_openssl.sh

93
binary/jni/build_openssl.sh Executable file
View File

@ -0,0 +1,93 @@
#!/bin/bash
set -e
HOST_OS=`uname -a`
function build_one {
mkdir -p out/$CPU
echo "Configuring OpenSSL for $CPU..."
./Configure \
--prefix="$PWD/out/$CPU" \
$TARGET \
no-shared \
no-tests \
-D__ANDROID_API__=$API \
-Wno-macro-redefined
echo "Building OpenSSL for $CPU..."
make -j $(nproc) > out/build.log
make install_sw >> out/build.log
make clean
}
function checkPreRequisites {
if ! [ -d "openssl" ] || ! [ "$(ls -A openssl)" ]; then
echo -e "\033[31mFailed! Submodule 'openssl' not found!\033[0m"
echo -e "\033[31mTry to run: 'git submodule update --init'\033[0m"
exit
fi
if [ -z "$ANDROID_NDK_HOME" -a "$ANDROID_NDK_HOME" == "" ]; then
echo -e "\033[31mFailed! ANDROID_NDK_HOME is empty. Run 'export ANDROID_NDK_HOME=[PATH_TO_NDK]'\033[0m"
exit
fi
}
function build {
for arg in "$@"; do
case "$arg" in
x86_64)
API=21
CPU=x86_64
TARGET=android-x86_64
build_one
;;
arm64)
API=21
CPU=arm64-v8a
TARGET=android-arm64
build_one
;;
arm)
API=16
CPU=armeabi-v7a
TARGET=android-arm
build_one
;;
x86)
API=16
CPU=x86
TARGET=android-x86
build_one
;;
*)
;;
esac
done
}
checkPreRequisites
cd openssl
rm -rf out
if [[ "$HOST_OS" == *"_NT-"* ]]; then
PATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/windows-x86_64/bin:$PATH
else
PATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
fi
if [[ -f 'Makefile' ]]; then
make clean
fi
if (( $# == 0 )); then
build x86_64 arm64 arm x86
else
build $@
fi

View File

@ -1 +0,0 @@
../../app/jni/i2pd

1
binary/jni/i2pd Submodule

@ -0,0 +1 @@
Subproject commit fb90b01f6c2f71831f854b3f43fc79fde246ee33

View File

@ -1 +0,0 @@
../../app/jni/miniupnp

1
binary/jni/miniupnp Submodule

@ -0,0 +1 @@
Subproject commit 6576eb611b670c4841cc65095914275d6be008b2

View File

@ -1 +0,0 @@
../../app/jni/openssl

1
binary/jni/openssl Submodule

@ -0,0 +1 @@
Subproject commit e04bd3433fd84e1861bf258ea37928d9845e6a86

0
binary/libs/.gitkeep Normal file
View File

View File

@ -0,0 +1,2 @@
* Updated codebase to 2.51.0
* Added minimal configuration menu (cudos: @wipedlifepotato)

View File

@ -0,0 +1 @@
* Updated codebase to 2.52.0

View File

@ -0,0 +1,2 @@
* Updated codebase to 2.53.0
* Change application service algorithm to work with binary instead of library. More changes about status in main activity are pending

View File

@ -0,0 +1,2 @@
* Updated codebase to 2.53.1
* Revert to usage of the JNI

View File

@ -0,0 +1 @@
* Updated codebase to 2.54.0

View File

@ -0,0 +1 @@
* Updated codebase to 2.55.0

View File

@ -0,0 +1 @@
* Updated codebase to 2.56.0

View File

@ -0,0 +1,9 @@
<b>I2P</b> (پروتکل اینترنت نامرئی) یک لایه جهانی و بی نام و نشان از شبکه است.
تمام ارتباطات بر روی I2P بی نام و نشان و سرتاسر رمزگذاری شده، مشترکین آدرس IP واقعی خود را آشکار نمیکنند.
<b>I2P client</b> یک نرم افزاری است که برای ساخت و تعامل با شبکه های بی نام و نشان I2P استفاده می شود.
این شبکه ها عموما برای ارتباطات بی نام و نشان همتا به همتا (اشتراک فایل، رمزارز) و ارتباطات بی نام و نشان کاربر و سرور (وبسایت ها، پیامرسان ها، سرور های گفت و گو) استفاده می شود.
<b>I2P</b> به همه مردم دنیا این امکان را میدهد که بدون محدودیت ارتباط برقرار کنند و اطلاعات به اشتراک بگذارند.
برای اطلاعات بیشتر در مورد <b>I2P</b>, میتوانید <a href="https://en.m.wikipedia.org/wiki/I2P">در ویکیپدیا مطالعه کنید</a>.

View File

@ -0,0 +1 @@
پیاده سازی کاملی از I2P به زبان ++C

View File

@ -0,0 +1,9 @@
<b>I2P</b> (Invisible Internet Protocol) jest uniwersalną, anonimową warstwą sieci.
Wszystkie komunikaty przez I2P są anonimowe i zaszyfrowane end-to-end, uczestnicy nie ujawniają swoich rzeczywistych adresów IP.
<b>Klient I2P</b> jest oprogramowaniem używanym do budowania i używania anonimowych sieci I2P.
Sieci takie są powszechnie używane do anonimowych aplikacji peer-to-peer (udostępnianie plików, kryptowaluty) i anonimowych aplikacji klient-serwer (strony internetowe, komunikatory błyskawiczne, serwery czatów).
<b>I2P</b> pozwala ludziom z całego świata komunikować się i dzielić się informacjami bez ograniczeń.
Aby uzyskać więcej informacji na temat <b>I2P</b>możesz przeczytać artykuł <a href="https://en.m.wikipedia.org/wiki/I2P">na Wikipedii</a>.

View File

@ -0,0 +1 @@
Pełna implementacja klienta I2P napisanej w C++

View File

@ -2,8 +2,8 @@
Todas as comunicações pela I2P são anonimas e criptografadas ponto-a-ponto, os participantes não revelam os seus verdadeiros endereços IP.
<b>Um cliente I2P</b> é um software usado para construir e utilizar redes I2P anonimas.
Tais redes são comumente usadas em aplicações P2P anonimas (compartilhamento de arquivos, cripttomoedas) e aplicações cliente-servidor (websites, mensageiros instantâneos, servidores de chat).
Tais redes são comumente usadas em aplicações P2P anonimas (compartilhamento de arquivos, criptomoedas) e aplicações cliente-servidor (websites, mensageiros instantâneos, servidores de chat).
O <b> I2P </b> permite às pessoas de todo o mundo se comunicarem e compartilhar informações sem restrições.
O <b> I2P </b> permite às pessoas de todo o mundo se comunicarem e compartilharem informações sem restrições.
Para mais informações sobre a <b> I2P </b>, você pode ler o <a href="https://pt.wikipedia.org/wiki/I2P"> artigo na Wikipédia </a>.