build: harden release and deployment pipeline
(cherry picked from commit 019de0faac3b284fbfd0b005c46531a31c662900)
This commit is contained in:
@@ -0,0 +1,16 @@
|
|||||||
|
.git
|
||||||
|
.github
|
||||||
|
build
|
||||||
|
build-*
|
||||||
|
cmake-build-*
|
||||||
|
*.dat
|
||||||
|
*.log
|
||||||
|
*.pid
|
||||||
|
*.conf
|
||||||
|
*.key
|
||||||
|
*.pem
|
||||||
|
*.sqlite
|
||||||
|
*.sqlite3
|
||||||
|
.triangles
|
||||||
|
wallet.dat
|
||||||
|
wallet.dat.*
|
||||||
@@ -8,6 +8,9 @@ on:
|
|||||||
branches: [master]
|
branches: [master]
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test-linux-unit:
|
test-linux-unit:
|
||||||
# This is the canonical CI gate for unit tests. Failures here MUST block
|
# This is the canonical CI gate for unit tests. Failures here MUST block
|
||||||
@@ -18,7 +21,7 @@ jobs:
|
|||||||
# Unit regression = blocking PR (this job).
|
# Unit regression = blocking PR (this job).
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|
||||||
@@ -85,8 +88,8 @@ jobs:
|
|||||||
if [ -x build/bin/test_chaindb_equivalence ]; then
|
if [ -x build/bin/test_chaindb_equivalence ]; then
|
||||||
./build/bin/test_chaindb_equivalence --log_level=test_suite
|
./build/bin/test_chaindb_equivalence --log_level=test_suite
|
||||||
else
|
else
|
||||||
echo "test_chaindb_equivalence not built — skipping chaindb equivalence"
|
echo "::error::test_chaindb_equivalence was not built"
|
||||||
exit 0
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Run unit tests
|
- name: Run unit tests
|
||||||
@@ -110,7 +113,7 @@ jobs:
|
|||||||
# and BDB until they're fixed file-by-file.
|
# and BDB until they're fixed file-by-file.
|
||||||
SAN_FLAGS: "-fsanitize=address,undefined -fno-omit-frame-pointer -fno-sanitize-recover=undefined -fno-sanitize=alignment,signed-integer-overflow,vptr"
|
SAN_FLAGS: "-fsanitize=address,undefined -fno-omit-frame-pointer -fno-sanitize-recover=undefined -fno-sanitize=alignment,signed-integer-overflow,vptr"
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|
||||||
@@ -168,7 +171,7 @@ jobs:
|
|||||||
UBSAN_OPTIONS: "halt_on_error=1:abort_on_error=1:print_stacktrace=1"
|
UBSAN_OPTIONS: "halt_on_error=1:abort_on_error=1:print_stacktrace=1"
|
||||||
SAN_FLAGS: "-fsanitize=address,undefined,fuzzer-no-link -fno-omit-frame-pointer -fno-sanitize-recover=undefined -fno-sanitize=alignment,signed-integer-overflow,vptr"
|
SAN_FLAGS: "-fsanitize=address,undefined,fuzzer-no-link -fno-omit-frame-pointer -fno-sanitize-recover=undefined -fno-sanitize=alignment,signed-integer-overflow,vptr"
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|
||||||
@@ -263,11 +266,11 @@ jobs:
|
|||||||
echo "::error::Fuzzer produced crash/leak artifacts"
|
echo "::error::Fuzzer produced crash/leak artifacts"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
exit 0
|
exit "$FUZZ_EXIT"
|
||||||
|
|
||||||
- name: Upload fuzzer artifacts on success
|
- name: Upload fuzzer artifacts on success
|
||||||
if: always()
|
if: always()
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
|
||||||
with:
|
with:
|
||||||
name: fuzz-artifacts
|
name: fuzz-artifacts
|
||||||
path: build-fuzz/fuzz_artifacts/
|
path: build-fuzz/fuzz_artifacts/
|
||||||
@@ -278,11 +281,11 @@ jobs:
|
|||||||
run:
|
run:
|
||||||
shell: msys2 {0}
|
shell: msys2 {0}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|
||||||
- uses: msys2/setup-msys2@v2
|
- uses: msys2/setup-msys2@66cd2cce69caa17b53920067426061ca1de3a884 # v2
|
||||||
with:
|
with:
|
||||||
msystem: MINGW64
|
msystem: MINGW64
|
||||||
update: true
|
update: true
|
||||||
@@ -320,7 +323,7 @@ jobs:
|
|||||||
-DBUILD_QT=ON \
|
-DBUILD_QT=ON \
|
||||||
-DBUILD_DAEMON=OFF \
|
-DBUILD_DAEMON=OFF \
|
||||||
-DBUILD_TESTS=OFF \
|
-DBUILD_TESTS=OFF \
|
||||||
-DUSE_UPNP=ON \
|
-DUSE_UPNP=OFF \
|
||||||
-DUSE_QRCODE=OFF \
|
-DUSE_QRCODE=OFF \
|
||||||
-DUSE_I2P_EMBEDDED=ON
|
-DUSE_I2P_EMBEDDED=ON
|
||||||
|
|
||||||
@@ -404,7 +407,7 @@ jobs:
|
|||||||
Get-Item "Cryptographic-Triangles-${env:VERSION}-win-x64.zip"
|
Get-Item "Cryptographic-Triangles-${env:VERSION}-win-x64.zip"
|
||||||
|
|
||||||
- name: Upload artifact (portable zip)
|
- name: Upload artifact (portable zip)
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
|
||||||
with:
|
with:
|
||||||
name: windows-qt-zip
|
name: windows-qt-zip
|
||||||
path: Cryptographic-Triangles-*-win-x64.zip
|
path: Cryptographic-Triangles-*-win-x64.zip
|
||||||
@@ -420,6 +423,7 @@ jobs:
|
|||||||
shell: powershell
|
shell: powershell
|
||||||
run: |
|
run: |
|
||||||
$TOR_VERSION = "15.0.9"
|
$TOR_VERSION = "15.0.9"
|
||||||
|
$TOR_SHA256 = "adebc1b7c65dc1b5e471064ed17585464af6f6198c3fe5c8c9108138b59ccf65"
|
||||||
$TOR_URL = "https://archive.torproject.org/tor-package-archive/torbrowser/${TOR_VERSION}/tor-expert-bundle-windows-x86_64-${TOR_VERSION}.tar.gz"
|
$TOR_URL = "https://archive.torproject.org/tor-package-archive/torbrowser/${TOR_VERSION}/tor-expert-bundle-windows-x86_64-${TOR_VERSION}.tar.gz"
|
||||||
$torPath = "tor-bundle.tar.gz"
|
$torPath = "tor-bundle.tar.gz"
|
||||||
$attempts = 0
|
$attempts = 0
|
||||||
@@ -443,6 +447,10 @@ jobs:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (-not $downloaded) { throw "Tor bundle download failed after $maxAttempts attempts" }
|
if (-not $downloaded) { throw "Tor bundle download failed after $maxAttempts attempts" }
|
||||||
|
$actualSha256 = (Get-FileHash -Algorithm SHA256 $torPath).Hash.ToLowerInvariant()
|
||||||
|
if ($actualSha256 -ne $TOR_SHA256) {
|
||||||
|
throw "Tor bundle SHA256 mismatch: expected $TOR_SHA256, got $actualSha256"
|
||||||
|
}
|
||||||
New-Item -ItemType Directory -Path tor-extract -Force
|
New-Item -ItemType Directory -Path tor-extract -Force
|
||||||
tar -xzf tor-bundle.tar.gz -C tor-extract
|
tar -xzf tor-bundle.tar.gz -C tor-extract
|
||||||
New-Item -ItemType Directory -Path tor-files -Force
|
New-Item -ItemType Directory -Path tor-files -Force
|
||||||
@@ -459,23 +467,11 @@ jobs:
|
|||||||
- name: Install NSIS via MSYS2
|
- name: Install NSIS via MSYS2
|
||||||
run: pacman -S --noconfirm mingw-w64-x86_64-nsis
|
run: pacman -S --noconfirm mingw-w64-x86_64-nsis
|
||||||
|
|
||||||
- name: Install NSIS inetc plugin
|
|
||||||
run: |
|
|
||||||
pacman -S --noconfirm unzip
|
|
||||||
NSIS_DIR="/mingw64/share/nsis"
|
|
||||||
cd /tmp
|
|
||||||
curl -L -o Inetc.zip "https://nsis.sourceforge.io/mediawiki/images/c/c9/Inetc.zip"
|
|
||||||
unzip -o Inetc.zip -d inetc_extract
|
|
||||||
# MSYS2 mingw64 NSIS is 64-bit, needs amd64-unicode plugin in Plugins/unicode/
|
|
||||||
mkdir -p "$NSIS_DIR/Plugins/unicode"
|
|
||||||
cp inetc_extract/Plugins/amd64-unicode/INetC.dll "$NSIS_DIR/Plugins/unicode/"
|
|
||||||
echo "Installed 64-bit INetC.dll to $NSIS_DIR/Plugins/unicode/"
|
|
||||||
|
|
||||||
- name: Build NSIS installer
|
- name: Build NSIS installer
|
||||||
run: makensis //DVERSION=$VERSION contrib/nsis/setup.nsi
|
run: makensis //DVERSION=$VERSION contrib/nsis/setup.nsi
|
||||||
|
|
||||||
- name: Upload installer
|
- name: Upload installer
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
|
||||||
with:
|
with:
|
||||||
name: windows-qt-setup
|
name: windows-qt-setup
|
||||||
path: contrib/nsis/Cryptographic-Triangles-*-setup.exe
|
path: contrib/nsis/Cryptographic-Triangles-*-setup.exe
|
||||||
@@ -486,11 +482,11 @@ jobs:
|
|||||||
run:
|
run:
|
||||||
shell: msys2 {0}
|
shell: msys2 {0}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|
||||||
- uses: msys2/setup-msys2@v2
|
- uses: msys2/setup-msys2@66cd2cce69caa17b53920067426061ca1de3a884 # v2
|
||||||
with:
|
with:
|
||||||
msystem: MINGW64
|
msystem: MINGW64
|
||||||
update: true
|
update: true
|
||||||
@@ -516,7 +512,7 @@ jobs:
|
|||||||
-DBUILD_DAEMON=ON \
|
-DBUILD_DAEMON=ON \
|
||||||
-DBUILD_CLI=ON \
|
-DBUILD_CLI=ON \
|
||||||
-DBUILD_TESTS=OFF \
|
-DBUILD_TESTS=OFF \
|
||||||
-DUSE_UPNP=ON \
|
-DUSE_UPNP=OFF \
|
||||||
-DUSE_I2P_EMBEDDED=ON
|
-DUSE_I2P_EMBEDDED=ON
|
||||||
|
|
||||||
- name: Build libtor (embedded Tor static lib)
|
- name: Build libtor (embedded Tor static lib)
|
||||||
@@ -548,6 +544,7 @@ jobs:
|
|||||||
shell: powershell
|
shell: powershell
|
||||||
run: |
|
run: |
|
||||||
$TOR_VERSION = "15.0.9"
|
$TOR_VERSION = "15.0.9"
|
||||||
|
$TOR_SHA256 = "adebc1b7c65dc1b5e471064ed17585464af6f6198c3fe5c8c9108138b59ccf65"
|
||||||
$TOR_URL = "https://archive.torproject.org/tor-package-archive/torbrowser/${TOR_VERSION}/tor-expert-bundle-windows-x86_64-${TOR_VERSION}.tar.gz"
|
$TOR_URL = "https://archive.torproject.org/tor-package-archive/torbrowser/${TOR_VERSION}/tor-expert-bundle-windows-x86_64-${TOR_VERSION}.tar.gz"
|
||||||
$torPath = "tor-bundle.tar.gz"
|
$torPath = "tor-bundle.tar.gz"
|
||||||
$attempts = 0
|
$attempts = 0
|
||||||
@@ -571,6 +568,10 @@ jobs:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (-not $downloaded) { throw "Tor bundle download failed after $maxAttempts attempts" }
|
if (-not $downloaded) { throw "Tor bundle download failed after $maxAttempts attempts" }
|
||||||
|
$actualSha256 = (Get-FileHash -Algorithm SHA256 $torPath).Hash.ToLowerInvariant()
|
||||||
|
if ($actualSha256 -ne $TOR_SHA256) {
|
||||||
|
throw "Tor bundle SHA256 mismatch: expected $TOR_SHA256, got $actualSha256"
|
||||||
|
}
|
||||||
New-Item -ItemType Directory -Path tor-extract -Force
|
New-Item -ItemType Directory -Path tor-extract -Force
|
||||||
tar -xzf tor-bundle.tar.gz -C tor-extract
|
tar -xzf tor-bundle.tar.gz -C tor-extract
|
||||||
Copy-Item -Recurse tor-extract/tor/* daemon-dist/tor/
|
Copy-Item -Recurse tor-extract/tor/* daemon-dist/tor/
|
||||||
@@ -579,7 +580,7 @@ jobs:
|
|||||||
}
|
}
|
||||||
|
|
||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
|
||||||
with:
|
with:
|
||||||
name: windows-daemon
|
name: windows-daemon
|
||||||
path: daemon-dist/
|
path: daemon-dist/
|
||||||
@@ -587,7 +588,7 @@ jobs:
|
|||||||
build-linux-qt:
|
build-linux-qt:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|
||||||
@@ -621,7 +622,7 @@ jobs:
|
|||||||
-DBUILD_QT=ON \
|
-DBUILD_QT=ON \
|
||||||
-DBUILD_DAEMON=OFF \
|
-DBUILD_DAEMON=OFF \
|
||||||
-DBUILD_TESTS=OFF \
|
-DBUILD_TESTS=OFF \
|
||||||
-DUSE_UPNP=ON \
|
-DUSE_UPNP=OFF \
|
||||||
-DUSE_I2P_EMBEDDED=ON
|
-DUSE_I2P_EMBEDDED=ON
|
||||||
|
|
||||||
- name: Build libtor (embedded Tor static lib)
|
- name: Build libtor (embedded Tor static lib)
|
||||||
@@ -646,6 +647,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
TOR_VERSION="15.0.9"
|
TOR_VERSION="15.0.9"
|
||||||
|
TOR_SHA256="7ea13e14cddafb36c6347a9c4f4e639f6010364c16acfd519157c29e226277f2"
|
||||||
# Resilient download: archive.torproject.org occasionally times out
|
# Resilient download: archive.torproject.org occasionally times out
|
||||||
# from CI egress (observed 2026-07-03: macOS job exit code 6 after
|
# from CI egress (observed 2026-07-03: macOS job exit code 6 after
|
||||||
# exactly 30s of curl hang). Retries + --fail-with-body surface the
|
# exactly 30s of curl hang). Retries + --fail-with-body surface the
|
||||||
@@ -654,6 +656,7 @@ jobs:
|
|||||||
--retry 3 --retry-delay 5 --retry-connrefused --retry-all-errors \
|
--retry 3 --retry-delay 5 --retry-connrefused --retry-all-errors \
|
||||||
"https://archive.torproject.org/tor-package-archive/torbrowser/${TOR_VERSION}/tor-expert-bundle-linux-x86_64-${TOR_VERSION}.tar.gz" \
|
"https://archive.torproject.org/tor-package-archive/torbrowser/${TOR_VERSION}/tor-expert-bundle-linux-x86_64-${TOR_VERSION}.tar.gz" \
|
||||||
-o tor-bundle.tar.gz
|
-o tor-bundle.tar.gz
|
||||||
|
printf '%s %s\n' "$TOR_SHA256" tor-bundle.tar.gz | sha256sum --check --strict -
|
||||||
mkdir -p tor-extract && tar -xzf tor-bundle.tar.gz -C tor-extract
|
mkdir -p tor-extract && tar -xzf tor-bundle.tar.gz -C tor-extract
|
||||||
|
|
||||||
PKG="cryptographic-triangles_${VERSION}_amd64"
|
PKG="cryptographic-triangles_${VERSION}_amd64"
|
||||||
@@ -723,7 +726,7 @@ jobs:
|
|||||||
dpkg-deb --build ${PKG}
|
dpkg-deb --build ${PKG}
|
||||||
|
|
||||||
- name: Upload .deb
|
- name: Upload .deb
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
|
||||||
with:
|
with:
|
||||||
name: linux-qt-deb
|
name: linux-qt-deb
|
||||||
path: cryptographic-triangles_*_amd64.deb
|
path: cryptographic-triangles_*_amd64.deb
|
||||||
@@ -731,7 +734,7 @@ jobs:
|
|||||||
build-linux-daemon:
|
build-linux-daemon:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|
||||||
@@ -765,7 +768,7 @@ jobs:
|
|||||||
-DBUILD_DAEMON=ON \
|
-DBUILD_DAEMON=ON \
|
||||||
-DBUILD_CLI=ON \
|
-DBUILD_CLI=ON \
|
||||||
-DBUILD_TESTS=OFF \
|
-DBUILD_TESTS=OFF \
|
||||||
-DUSE_UPNP=ON \
|
-DUSE_UPNP=OFF \
|
||||||
-DUSE_I2P_EMBEDDED=ON
|
-DUSE_I2P_EMBEDDED=ON
|
||||||
|
|
||||||
- name: Build libtor (embedded Tor static lib)
|
- name: Build libtor (embedded Tor static lib)
|
||||||
@@ -794,7 +797,7 @@ jobs:
|
|||||||
run: bash scripts/ci/package-linux-daemon.sh "${VERSION}"
|
run: bash scripts/ci/package-linux-daemon.sh "${VERSION}"
|
||||||
|
|
||||||
- name: Upload .deb
|
- name: Upload .deb
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
|
||||||
with:
|
with:
|
||||||
name: linux-daemon-deb
|
name: linux-daemon-deb
|
||||||
path: cryptographic-triangles-daemon_*_amd64.deb
|
path: cryptographic-triangles-daemon_*_amd64.deb
|
||||||
@@ -802,7 +805,7 @@ jobs:
|
|||||||
build-macos:
|
build-macos:
|
||||||
runs-on: macos-15
|
runs-on: macos-15
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|
||||||
@@ -834,7 +837,7 @@ jobs:
|
|||||||
-DBUILD_QT=ON \
|
-DBUILD_QT=ON \
|
||||||
-DBUILD_DAEMON=OFF \
|
-DBUILD_DAEMON=OFF \
|
||||||
-DBUILD_TESTS=OFF \
|
-DBUILD_TESTS=OFF \
|
||||||
-DUSE_UPNP=ON \
|
-DUSE_UPNP=OFF \
|
||||||
-DUSE_I2P_EMBEDDED=ON \
|
-DUSE_I2P_EMBEDDED=ON \
|
||||||
-DBOOST_ROOT=/opt/homebrew/opt/boost \
|
-DBOOST_ROOT=/opt/homebrew/opt/boost \
|
||||||
-DBDB_INCLUDE_PATH=/opt/homebrew/opt/berkeley-db@5/include \
|
-DBDB_INCLUDE_PATH=/opt/homebrew/opt/berkeley-db@5/include \
|
||||||
@@ -861,18 +864,6 @@ jobs:
|
|||||||
ZLIB_DIR=/opt/homebrew/opt/zlib \
|
ZLIB_DIR=/opt/homebrew/opt/zlib \
|
||||||
bash src/tor/build-libtor.sh
|
bash src/tor/build-libtor.sh
|
||||||
|
|
||||||
- name: Build libtor (embedded Tor static lib)
|
|
||||||
# macOS Qt GUI also transitively links -ltor via triangles_common.
|
|
||||||
# macOS Qt is built with @rpath embedded, so libtor needs to be
|
|
||||||
# at the configured TOR_SOURCE_ROOT location.
|
|
||||||
run: |
|
|
||||||
brew install libevent openssl@3 autoconf automake libtool zlib
|
|
||||||
export PATH="/opt/homebrew/opt/automake/bin:/opt/homebrew/opt/libtool/bin:$PATH"
|
|
||||||
LIBEVENT_DIR=/opt/homebrew/opt/libevent \
|
|
||||||
OPENSSL_DIR=/opt/homebrew/opt/openssl@3 \
|
|
||||||
ZLIB_DIR=/opt/homebrew/opt/zlib \
|
|
||||||
bash src/tor/build-libtor.sh
|
|
||||||
|
|
||||||
- name: Build libi2pd (embedded I2P static lib)
|
- name: Build libi2pd (embedded I2P static lib)
|
||||||
# HOMEBREW=1 tells the i2pd Makefile to use Homebrew paths.
|
# HOMEBREW=1 tells the i2pd Makefile to use Homebrew paths.
|
||||||
run: HOMEBREW=1 bash src/i2p/build-libi2pd.sh
|
run: HOMEBREW=1 bash src/i2p/build-libi2pd.sh
|
||||||
@@ -929,10 +920,12 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
TOR_VERSION="15.0.9"
|
TOR_VERSION="15.0.9"
|
||||||
|
TOR_SHA256="8ab84587b09b0053e85a137969b501744fa14640aa126af6e36997189950d254"
|
||||||
curl -fSL --connect-timeout 15 --max-time 120 \
|
curl -fSL --connect-timeout 15 --max-time 120 \
|
||||||
--retry 3 --retry-delay 5 --retry-connrefused --retry-all-errors \
|
--retry 3 --retry-delay 5 --retry-connrefused --retry-all-errors \
|
||||||
"https://archive.torproject.org/tor-package-archive/torbrowser/${TOR_VERSION}/tor-expert-bundle-macos-aarch64-${TOR_VERSION}.tar.gz" \
|
"https://archive.torproject.org/tor-package-archive/torbrowser/${TOR_VERSION}/tor-expert-bundle-macos-aarch64-${TOR_VERSION}.tar.gz" \
|
||||||
-o tor-bundle.tar.gz
|
-o tor-bundle.tar.gz
|
||||||
|
printf '%s %s\n' "$TOR_SHA256" tor-bundle.tar.gz | shasum -a 256 --check -
|
||||||
mkdir -p tor-extract && tar -xzf tor-bundle.tar.gz -C tor-extract
|
mkdir -p tor-extract && tar -xzf tor-bundle.tar.gz -C tor-extract
|
||||||
APP=$(find build/bin -name "*.app" -maxdepth 1 | head -1)
|
APP=$(find build/bin -name "*.app" -maxdepth 1 | head -1)
|
||||||
mkdir -p "$APP/Contents/MacOS/tor"
|
mkdir -p "$APP/Contents/MacOS/tor"
|
||||||
@@ -952,7 +945,7 @@ jobs:
|
|||||||
"Cryptographic-Triangles-v${VERSION}-macos-arm64.dmg"
|
"Cryptographic-Triangles-v${VERSION}-macos-arm64.dmg"
|
||||||
|
|
||||||
- name: Upload DMG
|
- name: Upload DMG
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
|
||||||
with:
|
with:
|
||||||
name: macos-arm64-dmg
|
name: macos-arm64-dmg
|
||||||
path: "*.dmg"
|
path: "*.dmg"
|
||||||
@@ -968,7 +961,7 @@ jobs:
|
|||||||
run: echo "VERSION=${GITHUB_REF_NAME#v}" >> $GITHUB_ENV
|
run: echo "VERSION=${GITHUB_REF_NAME#v}" >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: Download all artifacts
|
- name: Download all artifacts
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
|
||||||
with:
|
with:
|
||||||
path: artifacts
|
path: artifacts
|
||||||
|
|
||||||
@@ -990,7 +983,7 @@ jobs:
|
|||||||
ls -la release/
|
ls -la release/
|
||||||
|
|
||||||
- name: Create Release
|
- name: Create Release
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@3bb12739c298aeb8a4eeaf626c5b8d85266b0e65 # v2
|
||||||
with:
|
with:
|
||||||
files: release/*
|
files: release/*
|
||||||
generate_release_notes: true
|
generate_release_notes: true
|
||||||
|
|||||||
+73
-28
@@ -1,38 +1,83 @@
|
|||||||
FROM ubuntu:22.04
|
FROM ubuntu:24.04 AS builder
|
||||||
|
|
||||||
LABEL maintainer="Cryptographic Triangles Team"
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
LABEL description="Cryptographic Triangles (TRI) headless daemon"
|
ARG SOURCE_DATE_EPOCH=1700000000
|
||||||
LABEL version="6.1.7"
|
ENV SOURCE_DATE_EPOCH=${SOURCE_DATE_EPOCH}
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
autoconf \
|
||||||
|
automake \
|
||||||
|
build-essential \
|
||||||
ca-certificates \
|
ca-certificates \
|
||||||
curl \
|
cmake \
|
||||||
libssl3 \
|
libboost-all-dev \
|
||||||
libdb5.3++ \
|
libdb++-dev \
|
||||||
libboost-system1.74.0 \
|
libevent-dev \
|
||||||
libboost-filesystem1.74.0 \
|
libleveldb-dev \
|
||||||
libboost-program-options1.74.0 \
|
liblz4-dev \
|
||||||
libboost-thread1.74.0 \
|
liblzma-dev \
|
||||||
libboost-chrono1.74.0 \
|
libminiupnpc-dev \
|
||||||
libevent-2.1-7 \
|
librocksdb-dev \
|
||||||
libminiupnpc17 \
|
libsnappy-dev \
|
||||||
tor \
|
libsqlite3-dev \
|
||||||
|
libssl-dev \
|
||||||
|
libtool \
|
||||||
|
libzstd-dev \
|
||||||
|
ninja-build \
|
||||||
|
pkg-config \
|
||||||
|
zlib1g-dev \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
ARG VERSION=5.7.6
|
WORKDIR /src
|
||||||
RUN curl -L -o /usr/local/bin/trianglesd \
|
COPY . .
|
||||||
https://github.com/SamiAhmed7777/triangles_v5/releases/download/v${VERSION}/Cryptographic-Triangles-v${VERSION}-linux-x64-daemon \
|
|
||||||
&& chmod +x /usr/local/bin/trianglesd
|
RUN test -s src/secp256k1/CMakeLists.txt \
|
||||||
|
&& test -s src/tor/tor-src/configure.ac
|
||||||
|
|
||||||
|
RUN LIBEVENT_DIR=/usr OPENSSL_DIR=/usr ZLIB_DIR=/usr \
|
||||||
|
bash src/tor/build-libtor.sh
|
||||||
|
|
||||||
|
RUN cmake -S . -B build -G Ninja \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DBUILD_QT=OFF \
|
||||||
|
-DBUILD_DAEMON=ON \
|
||||||
|
-DBUILD_CLI=ON \
|
||||||
|
-DBUILD_TESTS=OFF \
|
||||||
|
-DUSE_UPNP=OFF \
|
||||||
|
-DUSE_I2P_EMBEDDED=OFF \
|
||||||
|
&& cmake --build build --parallel 2
|
||||||
|
|
||||||
|
RUN install -D -m 0755 build/bin/trianglesd /opt/triangles/bin/trianglesd \
|
||||||
|
&& install -D -m 0755 build/bin/triangles-cli /opt/triangles/bin/triangles-cli \
|
||||||
|
&& mkdir -p /opt/triangles/rootfs \
|
||||||
|
&& { ldd /opt/triangles/bin/trianglesd; ldd /opt/triangles/bin/triangles-cli; } \
|
||||||
|
| awk '/=> \// {print $3} /^\// {print $1}' \
|
||||||
|
| sort -u \
|
||||||
|
| while IFS= read -r library; do \
|
||||||
|
cp --parents -L "${library}" /opt/triangles/rootfs; \
|
||||||
|
done
|
||||||
|
|
||||||
|
FROM ubuntu:24.04
|
||||||
|
|
||||||
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates \
|
||||||
|
&& rm -rf /var/lib/apt/lists/* \
|
||||||
|
&& groupadd --gid 10001 triangles \
|
||||||
|
&& useradd --uid 10001 --gid triangles --home-dir /var/lib/triangles \
|
||||||
|
--no-create-home --shell /usr/sbin/nologin triangles \
|
||||||
|
&& install -d -m 0700 -o triangles -g triangles /var/lib/triangles
|
||||||
|
|
||||||
|
COPY --from=builder /opt/triangles/rootfs/ /
|
||||||
|
COPY --from=builder /opt/triangles/bin/ /usr/local/bin/
|
||||||
|
RUN ldconfig
|
||||||
|
|
||||||
RUN useradd -m -s /bin/bash triangles
|
|
||||||
USER triangles
|
USER triangles
|
||||||
WORKDIR /home/triangles
|
WORKDIR /var/lib/triangles
|
||||||
|
|
||||||
RUN mkdir -p .triangles
|
EXPOSE 24112
|
||||||
|
VOLUME ["/var/lib/triangles"]
|
||||||
|
STOPSIGNAL SIGTERM
|
||||||
|
|
||||||
EXPOSE 24112 19112
|
ENTRYPOINT ["/usr/local/bin/trianglesd"]
|
||||||
|
CMD ["-datadir=/var/lib/triangles", "-printtoconsole", "-upnp=0", "-rest=0", "-rpcbind=127.0.0.1"]
|
||||||
VOLUME ["/home/triangles/.triangles"]
|
|
||||||
|
|
||||||
ENTRYPOINT ["trianglesd"]
|
|
||||||
CMD ["-printtoconsole", "-txindex=1"]
|
|
||||||
|
|||||||
+66
@@ -0,0 +1,66 @@
|
|||||||
|
# Security Policy
|
||||||
|
|
||||||
|
Triangles is wallet software and should be treated as security-sensitive. Do
|
||||||
|
not use an experimental build to custody funds that you cannot afford to lose.
|
||||||
|
|
||||||
|
## Reporting a vulnerability
|
||||||
|
|
||||||
|
Please report suspected vulnerabilities through a private GitHub security
|
||||||
|
advisory for this repository. Do not include secrets, wallet files, seed
|
||||||
|
phrases, private keys, or live RPC credentials in an issue, pull request, log,
|
||||||
|
or test fixture.
|
||||||
|
|
||||||
|
Include the affected commit, platform, reproduction steps, impact, and a
|
||||||
|
minimal proof of concept when possible. Public disclosure should wait until a
|
||||||
|
fix is available and users have had a reasonable upgrade window.
|
||||||
|
|
||||||
|
## Deployment boundary
|
||||||
|
|
||||||
|
The JSON-RPC protocol uses HTTP Basic authentication and does not provide TLS.
|
||||||
|
Keep it on loopback or a private Unix host boundary. Never expose the RPC port
|
||||||
|
directly to the internet.
|
||||||
|
|
||||||
|
For application integrations:
|
||||||
|
|
||||||
|
- Run `trianglesd` as a dedicated, unprivileged operating-system user.
|
||||||
|
- Bind RPC explicitly to loopback with `rpcbind=127.0.0.1`.
|
||||||
|
- Use a unique random RPC username and password stored in a mode `0600` file.
|
||||||
|
- Set `rpcallowip=127.0.0.1` and an exact `rpcallowmethod` list.
|
||||||
|
- Keep `rest=0`, `upnp=0`, and wallet RPC methods disabled unless required.
|
||||||
|
- Do not pass RPC passwords on a process command line.
|
||||||
|
- Separate the node wallet and files from the integrating application's user.
|
||||||
|
- Start new integrations with an empty wallet and no production funds.
|
||||||
|
|
||||||
|
The container image runs as UID/GID `10001` and intentionally does not create
|
||||||
|
or print RPC credentials. Mount a private `/var/lib/triangles` volume containing
|
||||||
|
an owner-only `triangles.conf`; startup without valid RPC credentials fails with
|
||||||
|
a nonzero exit status. Do not provide wallet or RPC secrets through Docker
|
||||||
|
command arguments or environment variables.
|
||||||
|
|
||||||
|
Set `listen=0` when inbound P2P is unnecessary. When inbound peers are needed,
|
||||||
|
use `bind=<address>` and publish only the P2P port. The RPC port must remain
|
||||||
|
unpublished and loopback-bound.
|
||||||
|
|
||||||
|
Remote snapshot bootstrap is opt-in. A snapshot is accepted only when its file
|
||||||
|
hash and checkpoint are compiled into the client. Treat changes to snapshot
|
||||||
|
hashes, checkpoints, seed hosts, release keys, submodule revisions, and CI
|
||||||
|
workflows as security-critical review items.
|
||||||
|
|
||||||
|
## Wallet handling
|
||||||
|
|
||||||
|
- Encrypt wallets before funding them.
|
||||||
|
- Record the HD mnemonic offline and test recovery on an isolated machine.
|
||||||
|
- Keep multiple offline backups; filesystem permissions are not a backup.
|
||||||
|
- Encrypting the live wallet does not retroactively encrypt old copies,
|
||||||
|
migration backups, snapshots, or filesystem remnants. Inventory and protect
|
||||||
|
every pre-encryption copy as if it contains plaintext private keys.
|
||||||
|
- Never share a seed phrase with support personnel or paste it into an RPC call.
|
||||||
|
- Stop the node and investigate any wallet database integrity error rather than
|
||||||
|
attempting to continue with a partially loaded wallet.
|
||||||
|
|
||||||
|
## Build trust
|
||||||
|
|
||||||
|
Build from a reviewed commit, initialize submodules at the recorded revisions,
|
||||||
|
and verify release signatures against a key fingerprint obtained through an
|
||||||
|
independent trusted channel. A valid signature proves key possession, not the
|
||||||
|
identity of the key owner.
|
||||||
@@ -31,10 +31,6 @@ RequestExecutionLevel user
|
|||||||
|
|
||||||
!insertmacro MUI_PAGE_WELCOME
|
!insertmacro MUI_PAGE_WELCOME
|
||||||
!insertmacro MUI_PAGE_DIRECTORY
|
!insertmacro MUI_PAGE_DIRECTORY
|
||||||
|
|
||||||
; Bootstrap page
|
|
||||||
Page custom BootstrapPage
|
|
||||||
|
|
||||||
!insertmacro MUI_PAGE_INSTFILES
|
!insertmacro MUI_PAGE_INSTFILES
|
||||||
!insertmacro MUI_PAGE_FINISH
|
!insertmacro MUI_PAGE_FINISH
|
||||||
|
|
||||||
@@ -43,34 +39,6 @@ Page custom BootstrapPage
|
|||||||
|
|
||||||
!insertmacro MUI_LANGUAGE "English"
|
!insertmacro MUI_LANGUAGE "English"
|
||||||
|
|
||||||
; Bootstrap selection variable
|
|
||||||
Var BootstrapChoice
|
|
||||||
|
|
||||||
; Bootstrap page function
|
|
||||||
Function BootstrapPage
|
|
||||||
!insertmacro MUI_HEADER_TEXT "Blockchain Sync" "Choose how to synchronize the blockchain"
|
|
||||||
|
|
||||||
nsDialogs::Create 1018
|
|
||||||
Pop $0
|
|
||||||
|
|
||||||
${NSD_CreateLabel} 0 10u 100% 20u "The Triangles blockchain requires ~1GB of data. Choose sync method:"
|
|
||||||
Pop $0
|
|
||||||
|
|
||||||
${NSD_CreateRadioButton} 10u 40u 100% 12u "Download bootstrap (~1.3GB) — Recommended (fast)"
|
|
||||||
Pop $1
|
|
||||||
${NSD_Check} $1
|
|
||||||
|
|
||||||
${NSD_CreateRadioButton} 10u 60u 100% 12u "Sync from network — Slow (may take days)"
|
|
||||||
Pop $2
|
|
||||||
|
|
||||||
${NSD_CreateLabel} 10u 80u 100% 30u "Bootstrap will download a recent blockchain snapshot, saving hours or days of sync time. Network bandwidth required: ~1.3GB."
|
|
||||||
Pop $0
|
|
||||||
|
|
||||||
nsDialogs::Show
|
|
||||||
|
|
||||||
${NSD_GetState} $1 $BootstrapChoice
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
Section "Install"
|
Section "Install"
|
||||||
SetOutPath "$INSTDIR"
|
SetOutPath "$INSTDIR"
|
||||||
|
|
||||||
@@ -84,25 +52,6 @@ Section "Install"
|
|||||||
; Create data directory
|
; Create data directory
|
||||||
CreateDirectory "$APPDATA\Triangles"
|
CreateDirectory "$APPDATA\Triangles"
|
||||||
|
|
||||||
; Download blockchain bootstrap if selected
|
|
||||||
${If} $BootstrapChoice == ${BST_CHECKED}
|
|
||||||
DetailPrint "Downloading blockchain bootstrap..."
|
|
||||||
inetc::get /CAPTION "Downloading Blockchain" /CANCELTEXT "Skip" \
|
|
||||||
"http://bootstrap.cryptographic-triangles.org/tri-blockchain.tar.gz" \
|
|
||||||
"$TEMP\tri-blockchain.tar.gz" /END
|
|
||||||
Pop $0
|
|
||||||
${If} $0 == "OK"
|
|
||||||
DetailPrint "Extracting blockchain..."
|
|
||||||
nsExec::ExecToLog '"$INSTDIR\7z.exe" x "$TEMP\tri-blockchain.tar.gz" -o"$TEMP" -y'
|
|
||||||
nsExec::ExecToLog '"$INSTDIR\7z.exe" x "$TEMP\tri-blockchain.tar" -o"$APPDATA\Triangles" -y'
|
|
||||||
Delete "$TEMP\tri-blockchain.tar.gz"
|
|
||||||
Delete "$TEMP\tri-blockchain.tar"
|
|
||||||
DetailPrint "Blockchain bootstrap installed!"
|
|
||||||
${Else}
|
|
||||||
DetailPrint "Bootstrap download failed or skipped — will sync from network"
|
|
||||||
${EndIf}
|
|
||||||
${EndIf}
|
|
||||||
|
|
||||||
; Uninstaller
|
; Uninstaller
|
||||||
WriteUninstaller "$INSTDIR\uninstall.exe"
|
WriteUninstaller "$INSTDIR\uninstall.exe"
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ set -euo pipefail
|
|||||||
|
|
||||||
ROCKSDB_VERSION="${ROCKSDB_VERSION:-8.9.1}"
|
ROCKSDB_VERSION="${ROCKSDB_VERSION:-8.9.1}"
|
||||||
ROCKSDB_TAG="v${ROCKSDB_VERSION}"
|
ROCKSDB_TAG="v${ROCKSDB_VERSION}"
|
||||||
|
ROCKSDB_COMMIT="${ROCKSDB_COMMIT:-49ce8a1064dd1ad89117899839bf136365e49e79}"
|
||||||
INSTALL_PREFIX="${INSTALL_PREFIX:-/usr/local}"
|
INSTALL_PREFIX="${INSTALL_PREFIX:-/usr/local}"
|
||||||
JOBS="${JOBS:-$(nproc)}"
|
JOBS="${JOBS:-$(nproc)}"
|
||||||
|
|
||||||
@@ -34,6 +35,12 @@ git clone --depth 1 --branch "${ROCKSDB_TAG}" \
|
|||||||
|
|
||||||
cd "${WORKDIR}/rocksdb"
|
cd "${WORKDIR}/rocksdb"
|
||||||
|
|
||||||
|
ACTUAL_COMMIT="$(git rev-parse HEAD)"
|
||||||
|
if [ "${ACTUAL_COMMIT}" != "${ROCKSDB_COMMIT}" ]; then
|
||||||
|
echo "!!! RocksDB ${ROCKSDB_TAG} resolved to ${ACTUAL_COMMIT}, expected ${ROCKSDB_COMMIT}" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# Shared library only — Triangles links dynamically. Statically linking
|
# Shared library only — Triangles links dynamically. Statically linking
|
||||||
# rocksdb.a would also work but balloons the daemon binary by ~50 MB.
|
# rocksdb.a would also work but balloons the daemon binary by ~50 MB.
|
||||||
make -j"${JOBS}" shared_lib PORTABLE=1 USE_RTTI=1 \
|
make -j"${JOBS}" shared_lib PORTABLE=1 USE_RTTI=1 \
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ set -euo pipefail
|
|||||||
VERSION="${1:-0.0.0}"
|
VERSION="${1:-0.0.0}"
|
||||||
PKG="cryptographic-triangles-daemon_${VERSION}_amd64"
|
PKG="cryptographic-triangles-daemon_${VERSION}_amd64"
|
||||||
TOR_VERSION="${TOR_VERSION:-15.0.9}"
|
TOR_VERSION="${TOR_VERSION:-15.0.9}"
|
||||||
|
TOR_SHA256="${TOR_SHA256:-7ea13e14cddafb36c6347a9c4f4e639f6010364c16acfd519157c29e226277f2}"
|
||||||
|
|
||||||
echo ">>> Building .deb for triangles ${VERSION}"
|
echo ">>> Building .deb for triangles ${VERSION}"
|
||||||
|
|
||||||
@@ -39,6 +40,7 @@ if [ ! -f "${TOR_TARBALL}" ]; then
|
|||||||
"https://archive.torproject.org/tor-package-archive/torbrowser/${TOR_VERSION}/${TOR_TARBALL}" \
|
"https://archive.torproject.org/tor-package-archive/torbrowser/${TOR_VERSION}/${TOR_TARBALL}" \
|
||||||
-o "${TOR_TARBALL}"
|
-o "${TOR_TARBALL}"
|
||||||
fi
|
fi
|
||||||
|
printf '%s %s\n' "${TOR_SHA256}" "${TOR_TARBALL}" | sha256sum --check --strict -
|
||||||
mkdir -p tor-extract
|
mkdir -p tor-extract
|
||||||
tar -xzf "${TOR_TARBALL}" -C tor-extract
|
tar -xzf "${TOR_TARBALL}" -C tor-extract
|
||||||
|
|
||||||
@@ -107,10 +109,35 @@ Wants=network-online.target
|
|||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
|
User=triangles
|
||||||
|
Group=triangles
|
||||||
|
UMask=0077
|
||||||
|
Environment=HOME=/var/lib/triangles
|
||||||
Environment=LD_LIBRARY_PATH=/usr/lib/cryptographic-triangles/lib
|
Environment=LD_LIBRARY_PATH=/usr/lib/cryptographic-triangles/lib
|
||||||
ExecStart=/usr/lib/cryptographic-triangles/trianglesd
|
StateDirectory=triangles
|
||||||
|
StateDirectoryMode=0700
|
||||||
|
WorkingDirectory=/var/lib/triangles
|
||||||
|
ExecStart=/usr/lib/cryptographic-triangles/trianglesd -datadir=/var/lib/triangles -conf=/etc/triangles/triangles.conf -printtoconsole
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
RestartSec=10
|
RestartSec=10
|
||||||
|
NoNewPrivileges=true
|
||||||
|
PrivateDevices=true
|
||||||
|
PrivateTmp=true
|
||||||
|
ProtectClock=true
|
||||||
|
ProtectControlGroups=true
|
||||||
|
ProtectHome=true
|
||||||
|
ProtectHostname=true
|
||||||
|
ProtectKernelModules=true
|
||||||
|
ProtectKernelTunables=true
|
||||||
|
ProtectSystem=strict
|
||||||
|
ReadWritePaths=/var/lib/triangles
|
||||||
|
CapabilityBoundingSet=
|
||||||
|
LockPersonality=true
|
||||||
|
MemoryDenyWriteExecute=true
|
||||||
|
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
|
||||||
|
RestrictRealtime=true
|
||||||
|
RestrictSUIDSGID=true
|
||||||
|
SystemCallArchitectures=native
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
@@ -127,11 +154,41 @@ Description: Cryptographic Triangles daemon + CLI with integrated Tor
|
|||||||
Tor, and systemd service. No external dependencies required.
|
Tor, and systemd service. No external dependencies required.
|
||||||
Section: finance
|
Section: finance
|
||||||
Priority: optional
|
Priority: optional
|
||||||
|
Depends: adduser
|
||||||
CTRL
|
CTRL
|
||||||
|
|
||||||
# DEBIAN/postinst
|
# DEBIAN/postinst
|
||||||
cat > "${PKG}/DEBIAN/postinst" << 'POST'
|
cat > "${PKG}/DEBIAN/postinst" << 'POST'
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if ! getent group triangles >/dev/null; then
|
||||||
|
addgroup --system triangles
|
||||||
|
fi
|
||||||
|
if ! id triangles >/dev/null 2>&1; then
|
||||||
|
adduser --system --ingroup triangles --home /var/lib/triangles \
|
||||||
|
--no-create-home --disabled-login triangles
|
||||||
|
fi
|
||||||
|
|
||||||
|
install -d -m 0700 -o triangles -g triangles /var/lib/triangles
|
||||||
|
install -d -m 0750 -o root -g triangles /etc/triangles
|
||||||
|
|
||||||
|
if [ ! -e /etc/triangles/triangles.conf ]; then
|
||||||
|
RPC_PASSWORD="$(dd if=/dev/urandom bs=32 count=1 2>/dev/null | od -An -tx1 | tr -d ' \n')"
|
||||||
|
CONFIG_TMP="$(mktemp)"
|
||||||
|
trap 'rm -f "${CONFIG_TMP}"' EXIT
|
||||||
|
cat > "${CONFIG_TMP}" << CONF
|
||||||
|
server=1
|
||||||
|
rpcuser=trianglesrpc
|
||||||
|
rpcpassword=${RPC_PASSWORD}
|
||||||
|
rpcbind=127.0.0.1
|
||||||
|
rpcallowip=127.0.0.1
|
||||||
|
rest=0
|
||||||
|
upnp=0
|
||||||
|
CONF
|
||||||
|
install -m 0640 -o root -g triangles "${CONFIG_TMP}" /etc/triangles/triangles.conf
|
||||||
|
fi
|
||||||
|
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
echo ""
|
echo ""
|
||||||
echo "Cryptographic Triangles daemon + CLI installed."
|
echo "Cryptographic Triangles daemon + CLI installed."
|
||||||
|
|||||||
Reference in New Issue
Block a user