mirror of
https://github.com/go-i2p/go-gitlooseleaf.git
synced 2025-08-19 17:45:23 -04:00
Compare commits
95 Commits
v1.23.7
...
v12.0.1-fo
Author | SHA1 | Date | |
---|---|---|---|
![]() |
1276269c8f | ||
![]() |
f9b4b18c8e | ||
![]() |
5bba5f19db | ||
![]() |
b130467749 | ||
![]() |
3358037c8d | ||
![]() |
58dbfb3508 | ||
![]() |
71e284e48e | ||
![]() |
2e0ae88b04 | ||
![]() |
56f11fa5e4 | ||
![]() |
d912d5f90a | ||
![]() |
7a032cfa07 | ||
![]() |
aba0d5f227 | ||
![]() |
8d4fd28ecd | ||
![]() |
aa66a4479d | ||
![]() |
ee938a6537 | ||
![]() |
57af8b01e0 | ||
![]() |
d65e11dac1 | ||
![]() |
040db09e7b | ||
![]() |
e23d6ff6da | ||
![]() |
e2a864668f | ||
![]() |
6704652570 | ||
![]() |
a330adb44d | ||
![]() |
0a9880b906 | ||
![]() |
9715b9aae8 | ||
![]() |
5f84fd9f8c | ||
![]() |
33fdaaef42 | ||
![]() |
a6ea21aa77 | ||
![]() |
3b37a8f893 | ||
![]() |
1718b5eb26 | ||
![]() |
ec0a18584e | ||
![]() |
8d4a10329f | ||
![]() |
da594ce8cd | ||
![]() |
2190589cc6 | ||
![]() |
21da0f09d3 | ||
![]() |
316c71d06c | ||
![]() |
45a461d669 | ||
![]() |
9feb5d2895 | ||
![]() |
c2d7ff16f2 | ||
![]() |
617e3ac8c3 | ||
![]() |
c277a9a437 | ||
![]() |
ae61e33202 | ||
![]() |
547b5cb747 | ||
![]() |
e50b8c82e4 | ||
![]() |
efab5ff9b1 | ||
![]() |
a3579ee83d | ||
![]() |
8fee567d0c | ||
![]() |
7afb74dc29 | ||
![]() |
942e8c2d81 | ||
![]() |
21a817fe01 | ||
![]() |
35d0604a38 | ||
![]() |
a79a3f0290 | ||
![]() |
f118698957 | ||
![]() |
432d9fb280 | ||
![]() |
5a20dc9121 | ||
![]() |
e1985661aa | ||
![]() |
a89fc7a6a5 | ||
![]() |
36c21192f0 | ||
![]() |
cad60aac25 | ||
![]() |
283233c534 | ||
![]() |
fe561e9e99 | ||
![]() |
a25b108fe9 | ||
![]() |
697ee54bef | ||
![]() |
d81b6c906c | ||
![]() |
960383c1c7 | ||
![]() |
7713312fe3 | ||
![]() |
7c354f9b52 | ||
![]() |
4f9dcde18a | ||
![]() |
57ee6746ef | ||
![]() |
3d31be0215 | ||
![]() |
5e71999e5a | ||
![]() |
54691e3cbe | ||
![]() |
19025e2f10 | ||
![]() |
2cc6f51329 | ||
![]() |
a046854c58 | ||
![]() |
199ece6a13 | ||
![]() |
228ab09cf8 | ||
![]() |
fe0c790937 | ||
![]() |
4f9ed824f5 | ||
![]() |
b59cdadcde | ||
![]() |
7c97f29d63 | ||
![]() |
cb0ab3e597 | ||
![]() |
d341180dbe | ||
![]() |
1c5aeb87cd | ||
![]() |
69d267bab5 | ||
![]() |
f89e9dee28 | ||
![]() |
1902034f2c | ||
![]() |
16b5f3b7c9 | ||
![]() |
aae3a5f571 | ||
![]() |
08e6728356 | ||
![]() |
6d90b7e40c | ||
![]() |
b669c9c6c2 | ||
![]() |
3daa81b6b1 | ||
![]() |
4611687449 | ||
![]() |
75d49f8d6f | ||
![]() |
d8c63638ad |
129
.github/workflows/forgejo-build.yml
vendored
Normal file
129
.github/workflows/forgejo-build.yml
vendored
Normal file
@@ -0,0 +1,129 @@
|
||||
name: Forgejo Build Pipeline
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
schedule:
|
||||
- cron: '0 0 * * *' # Runs daily at midnight UTC
|
||||
workflow_dispatch: # Allow manual triggers
|
||||
|
||||
permissions:
|
||||
contents: write # Required for creating releases
|
||||
|
||||
jobs:
|
||||
check-release:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
new_tag: ${{ steps.get_latest_tag.outputs.tag }}
|
||||
should_build: ${{ steps.check_existing.outputs.should_build }}
|
||||
steps:
|
||||
- name: Get Latest Forgejo Tag
|
||||
id: get_latest_tag
|
||||
run: |
|
||||
LATEST_TAG=$(curl -s 'https://codeberg.org/api/v1/repos/forgejo/forgejo/releases?limit=1' | jq -r '.[0].tag_name')
|
||||
echo "tag=$LATEST_TAG" >> $GITHUB_OUTPUT
|
||||
echo "Latest Forgejo tag: $LATEST_TAG"
|
||||
|
||||
- name: Check Existing Release
|
||||
id: check_existing
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
try {
|
||||
const tag = '${{ steps.get_latest_tag.outputs.tag }}';
|
||||
const release = await github.rest.repos.getReleaseByTag({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
tag: tag + '-forgejo'
|
||||
});
|
||||
core.setOutput('should_build', 'false');
|
||||
} catch (error) {
|
||||
core.setOutput('should_build', 'true');
|
||||
}
|
||||
|
||||
build:
|
||||
needs: check-release
|
||||
if: needs.check-release.outputs.should_build == 'true'
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest, macos-latest]
|
||||
runs-on: ${{ matrix.os }}
|
||||
timeout-minutes: 120 # 2-hour timeout
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: '1.24.3'
|
||||
cache: true
|
||||
|
||||
- name: Setup node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '20'
|
||||
cache: 'npm'
|
||||
|
||||
- name: Checkout Forgejo Source
|
||||
run: |
|
||||
git clone https://codeberg.org/forgejo/forgejo.git forgejo-source
|
||||
cd forgejo-source
|
||||
git checkout ${{ needs.check-release.outputs.new_tag }}
|
||||
|
||||
- name: Build Forgejo
|
||||
working-directory: forgejo-source
|
||||
run: |
|
||||
make clean
|
||||
cp -v ../net_mirror.go modules/graceful/net_mirror.go
|
||||
cp -v ../net_mirror_dialer.go modules/graceful/net_mirror_dialer.go
|
||||
cp -v ../net_mirror_unix.go modules/graceful/net_mirror_unix.go
|
||||
cp -v ../net_mirror_windows.go modules/graceful/net_mirror_windows.go
|
||||
grep -v 'github.com/go-i2p/go-gitlooseleaf' ../go.mod | grep -v 'go 1.2' | grep -v '// indirect' >> go.mod
|
||||
go mod tidy
|
||||
make build
|
||||
env:
|
||||
TAGS: bindata sqlite sqlite_unlock_notify netgo osusergo
|
||||
GOFLAGS: -ldflags="-extldflags=-static"
|
||||
CO_ENABLED: 0
|
||||
|
||||
- name: Prepare Artifact
|
||||
shell: bash
|
||||
run: |
|
||||
cd forgejo-source
|
||||
ARTIFACT_NAME="forgejo-${{ runner.os }}"
|
||||
ls -lah
|
||||
if [ "${{ runner.os }}" = "Windows" ]; then
|
||||
mv -v gitea.exe "${ARTIFACT_NAME}.exe"
|
||||
else
|
||||
mv -v gitea "${ARTIFACT_NAME}"
|
||||
fi
|
||||
|
||||
- name: Upload Build Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: forgejo-${{ runner.os }}
|
||||
path: |
|
||||
forgejo-source/forgejo-${{ runner.os }}*
|
||||
retention-days: 1
|
||||
|
||||
release:
|
||||
needs: [check-release, build]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Download All Artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
|
||||
- name: Create Release
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
tag_name: ${{ needs.check-release.outputs.new_tag }}-forgejo
|
||||
name: "Forgejo ${{ needs.check-release.outputs.new_tag }}"
|
||||
body: "Automated build of Forgejo ${{ needs.check-release.outputs.new_tag }}"
|
||||
files: |
|
||||
forgejo-Linux/*
|
||||
forgejo-Windows/*
|
||||
forgejo-macOS/*
|
||||
draft: false
|
||||
prerelease: false
|
100
.github/workflows/forgejo-nightly.yml
vendored
Normal file
100
.github/workflows/forgejo-nightly.yml
vendored
Normal file
@@ -0,0 +1,100 @@
|
||||
name: Modded Forgejo Nightly Build
|
||||
on:
|
||||
push: # Run on any push
|
||||
schedule:
|
||||
- cron: '0 0 * * *' # Runs daily at midnight UTC
|
||||
workflow_dispatch: # Allow manual triggers
|
||||
|
||||
permissions:
|
||||
contents: write # Required for creating releases
|
||||
|
||||
jobs:
|
||||
build:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest, macos-latest]
|
||||
runs-on: ${{ matrix.os }}
|
||||
timeout-minutes: 120 # 2-hour timeout
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: '1.24.3'
|
||||
cache: true
|
||||
|
||||
- name: Setup node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '20'
|
||||
cache: 'npm'
|
||||
|
||||
- name: Checkout Forgejo Source
|
||||
run: |
|
||||
git clone https://codeberg.org/forgejo/forgejo.git forgejo-source
|
||||
cd forgejo-source
|
||||
git checkout forgejo
|
||||
|
||||
- name: Build Forgejo
|
||||
working-directory: forgejo-source
|
||||
run: |
|
||||
make clean
|
||||
cp -v ../net_mirror.go modules/graceful/net_mirror.go
|
||||
cp -v ../net_mirror_dialer.go modules/graceful/net_mirror_dialer.go
|
||||
cp -v ../net_mirror_unix.go modules/graceful/net_mirror_unix.go
|
||||
cp -v ../net_mirror_windows.go modules/graceful/net_mirror_windows.go
|
||||
grep -v 'github.com/go-i2p/go-gitlooseleaf' ../go.mod | grep -v 'go 1.2' | grep -v '// indirect' >> go.mod
|
||||
go mod tidy
|
||||
make build
|
||||
env:
|
||||
TAGS: bindata sqlite sqlite_unlock_notify netgo osusergo
|
||||
GOFLAGS: -ldflags="-extldflags=-static"
|
||||
CO_ENABLED: 0
|
||||
|
||||
- name: Prepare Artifact
|
||||
shell: bash
|
||||
run: |
|
||||
cd forgejo-source
|
||||
ARTIFACT_NAME="forgejo-${{ runner.os }}"
|
||||
ls -lah
|
||||
if [ "${{ runner.os }}" = "Windows" ]; then
|
||||
mv -v gitea.exe "${ARTIFACT_NAME}.exe"
|
||||
else
|
||||
mv -v gitea "${ARTIFACT_NAME}"
|
||||
fi
|
||||
|
||||
- name: Upload Build Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: forgejo-${{ runner.os }}
|
||||
path: |
|
||||
forgejo-source/forgejo-${{ runner.os }}*
|
||||
retention-days: 1
|
||||
|
||||
release:
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Download All Artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
|
||||
- name: Get Current Date
|
||||
id: date
|
||||
run: echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Create or Update Nightly Release
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
tag: forgejo-nightly
|
||||
name: "Modded Forgejo Nightly Build (${{ steps.date.outputs.date }})"
|
||||
body: "Automated nightly build of modded Forgejo from main branch, built on ${{ steps.date.outputs.date }}"
|
||||
artifacts: "forgejo-Linux/*, forgejo-Windows/*, forgejo-macOS/*"
|
||||
draft: false
|
||||
prerelease: true
|
||||
allowUpdates: true
|
||||
removeArtifacts: false
|
||||
replacesArtifacts: true
|
||||
makeLatest: true
|
93
.github/workflows/forgejo-vanilla-nightly.yml
vendored
Normal file
93
.github/workflows/forgejo-vanilla-nightly.yml
vendored
Normal file
@@ -0,0 +1,93 @@
|
||||
name: Forgejo Nightly Build
|
||||
on:
|
||||
push: # Run on any push
|
||||
schedule:
|
||||
- cron: '0 0 * * *' # Runs daily at midnight UTC
|
||||
workflow_dispatch: # Allow manual triggers
|
||||
|
||||
permissions:
|
||||
contents: write # Required for creating releases
|
||||
|
||||
jobs:
|
||||
build:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest, macos-latest]
|
||||
runs-on: ${{ matrix.os }}
|
||||
timeout-minutes: 120 # 2-hour timeout
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: '1.24.3'
|
||||
cache: true
|
||||
|
||||
- name: Setup node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '20'
|
||||
cache: 'npm'
|
||||
|
||||
- name: Checkout Forgejo Source
|
||||
run: |
|
||||
git clone https://codeberg.org/forgejo/forgejo.git forgejo-source
|
||||
cd forgejo-source
|
||||
git checkout forgejo
|
||||
|
||||
- name: Build Forgejo
|
||||
working-directory: forgejo-source
|
||||
run: |
|
||||
make clean
|
||||
make build
|
||||
env:
|
||||
TAGS: bindata sqlite sqlite_unlock_notify netgo osusergo
|
||||
GOFLAGS: -ldflags="-extldflags=-static"
|
||||
CO_ENABLED: 0
|
||||
|
||||
- name: Prepare Artifact
|
||||
shell: bash
|
||||
run: |
|
||||
cd forgejo-source
|
||||
ARTIFACT_NAME="forgejo-${{ runner.os }}"
|
||||
ls -lah
|
||||
if [ "${{ runner.os }}" = "Windows" ]; then
|
||||
mv -v gitea.exe "${ARTIFACT_NAME}.exe"
|
||||
else
|
||||
mv -v gitea "${ARTIFACT_NAME}"
|
||||
fi
|
||||
|
||||
- name: Upload Build Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: forgejo-${{ runner.os }}
|
||||
path: |
|
||||
forgejo-source/forgejo-${{ runner.os }}*
|
||||
retention-days: 1
|
||||
|
||||
release:
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Download All Artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
|
||||
- name: Get Current Date
|
||||
id: date
|
||||
run: echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Create or Update Nightly Release
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
tag: forgejo-nightly-vanilla
|
||||
name: "Standard Forgejo Nightly Build (${{ steps.date.outputs.date }})"
|
||||
body: "Automated nightly build of Forgejo from main branch, built on ${{ steps.date.outputs.date }}"
|
||||
artifacts: "forgejo-Linux/*, forgejo-Windows/*, forgejo-macOS/*"
|
||||
draft: false
|
||||
prerelease: true
|
||||
allowUpdates: true
|
||||
removeArtifacts: false
|
||||
replacesArtifacts: true
|
3
.github/workflows/gitea-build.yml
vendored
3
.github/workflows/gitea-build.yml
vendored
@@ -61,7 +61,7 @@ jobs:
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: '1.21'
|
||||
go-version: '1.24'
|
||||
cache: true
|
||||
|
||||
- name: Checkout Gitea Source
|
||||
@@ -79,6 +79,7 @@ jobs:
|
||||
cp -v ../net_mirror_dialer.go modules/graceful/net_mirror_dialer.go
|
||||
cp -v ../net_mirror_unix.go modules/graceful/net_mirror_unix.go
|
||||
cp -v ../net_mirror_windows.go modules/graceful/net_mirror_windows.go
|
||||
grep -v 'github.com/go-i2p/go-gitlooseleaf' ../go.mod | grep -v 'go 1.2' | grep -v '// indirect' >> go.mod
|
||||
go mod tidy
|
||||
make build
|
||||
env:
|
||||
|
85
.github/workflows/gitea-debian.yml
vendored
Normal file
85
.github/workflows/gitea-debian.yml
vendored
Normal file
@@ -0,0 +1,85 @@
|
||||
# Uses the stable build of Gitea to create a Debian package with pkginstall
|
||||
# Triggered an hour after the Gitea stable build
|
||||
# Runs on Ubuntu 22.04
|
||||
|
||||
name: Gitea Debian Build
|
||||
on:
|
||||
push: # Run on any push
|
||||
schedule:
|
||||
- cron: '0 1 * * *' # Runs daily at 1 UTC
|
||||
workflow_dispatch: # Allow manual triggers
|
||||
|
||||
permissions:
|
||||
contents: write # Required for creating releases
|
||||
|
||||
jobs:
|
||||
build:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-22.04]
|
||||
runs-on: ${{ matrix.os }}
|
||||
timeout-minutes: 120 # 2-hour timeout
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: '1.24.3'
|
||||
cache: true
|
||||
|
||||
- name: Get version
|
||||
id: get_version
|
||||
run: |
|
||||
if [[ $GITHUB_REF == refs/tags/* ]]; then
|
||||
VERSION=${GITHUB_REF#refs/tags/v}
|
||||
else
|
||||
VERSION=0.0.1-$(git rev-parse --short HEAD)
|
||||
fi
|
||||
echo "version=$VERSION" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Sleep for 15 minutes
|
||||
run: sleep 900
|
||||
|
||||
- name: Generate pkg contents in "/build"
|
||||
run: |
|
||||
sudo BASE=build make install
|
||||
./pkginstall build \
|
||||
--name go-gitlooseleaf \
|
||||
--version ${{ steps.get_version.outputs.version }} \
|
||||
--maintainer "idk <idk@i2pmail.org>" \
|
||||
--description "A modded gitea for hidden services" \
|
||||
--source ./build \
|
||||
--verbose
|
||||
|
||||
- name: Upload Build Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
path: "*.deb"
|
||||
name: gitea-debian-${{ steps.get_version.outputs.version }}.deb
|
||||
|
||||
release:
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Download All Artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
|
||||
- name: Get Current Date
|
||||
id: date
|
||||
run: echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
|
||||
|
||||
# - name: Update Release
|
||||
# uses: softprops/action-gh-release@v2
|
||||
# with:
|
||||
# tag_name: ${{ needs.check-release.outputs.new_tag }}
|
||||
# name: "Gitea ${{ needs.check-release.outputs.new_tag }}"
|
||||
# body: "Automated build of Gitea ${{ needs.check-release.outputs.new_tag }}"
|
||||
# files: "*.deb"
|
||||
# draft: false
|
||||
# prerelease: false
|
||||
# allowUpdates: true
|
||||
# removeArtifacts: false
|
||||
# replacesArtifacts: true
|
83
.github/workflows/gitea-nightly-debian.yml
vendored
Normal file
83
.github/workflows/gitea-nightly-debian.yml
vendored
Normal file
@@ -0,0 +1,83 @@
|
||||
# Uses the nightly build of Gitea to create a Debian package with pkginstall
|
||||
# Triggered an hour after the Gitea nightly build
|
||||
# Runs on Ubuntu 22.04
|
||||
|
||||
name: Gitea Nightly Debian Build
|
||||
on:
|
||||
push: # Run on any push
|
||||
schedule:
|
||||
- cron: '0 1 * * *' # Runs daily at 1 UTC
|
||||
workflow_dispatch: # Allow manual triggers
|
||||
|
||||
permissions:
|
||||
contents: write # Required for creating releases
|
||||
|
||||
jobs:
|
||||
build:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-22.04]
|
||||
runs-on: ${{ matrix.os }}
|
||||
timeout-minutes: 120 # 2-hour timeout
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: '1.24.3'
|
||||
cache: true
|
||||
|
||||
- name: Get version
|
||||
id: get_version
|
||||
run: |
|
||||
if [[ $GITHUB_REF == refs/tags/* ]]; then
|
||||
VERSION=${GITHUB_REF#refs/tags/v}
|
||||
else
|
||||
VERSION=0.0.1-$(git rev-parse --short HEAD)
|
||||
fi
|
||||
echo "version=$VERSION" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Sleep for 15 minutes
|
||||
run: sleep 900
|
||||
|
||||
- name: Generate pkg contents in "/build"
|
||||
run: |
|
||||
sudo BASE=build make install
|
||||
./pkginstall build \
|
||||
--name go-gitlooseleaf \
|
||||
--version ${{ steps.get_version.outputs.version }} \
|
||||
--maintainer "idk <idk@i2pmail.org>" \
|
||||
--description "A modded gitea for hidden services" \
|
||||
--source ./build \
|
||||
--verbose
|
||||
|
||||
- name: Upload Build Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
path: "*.deb"
|
||||
name: gitea-nightly-debian-0.0.1-${{ steps.get_version.outputs.version }}.deb
|
||||
|
||||
release:
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Download All Artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
|
||||
- name: Get Current Date
|
||||
id: date
|
||||
run: echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
|
||||
|
||||
# - name: Create or Update Nightly Release
|
||||
# uses: ncipollo/release-action@v1
|
||||
# with:
|
||||
# tag: nightly
|
||||
# artifacts: "*.deb"
|
||||
# draft: false
|
||||
# prerelease: true
|
||||
# allowUpdates: true
|
||||
# removeArtifacts: false
|
||||
# replacesArtifacts: true
|
94
.github/workflows/gitea-nightly.yml
vendored
Normal file
94
.github/workflows/gitea-nightly.yml
vendored
Normal file
@@ -0,0 +1,94 @@
|
||||
name: Modded Gitea Nightly Build
|
||||
on:
|
||||
push: # Run on any push
|
||||
schedule:
|
||||
- cron: '0 0 * * *' # Runs daily at midnight UTC
|
||||
workflow_dispatch: # Allow manual triggers
|
||||
|
||||
permissions:
|
||||
contents: write # Required for creating releases
|
||||
|
||||
jobs:
|
||||
build:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest, windows-latest, macos-latest]
|
||||
runs-on: ${{ matrix.os }}
|
||||
timeout-minutes: 120 # 2-hour timeout
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: '1.24'
|
||||
cache: true
|
||||
|
||||
- name: Checkout Gitea Source
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: go-gitea/gitea
|
||||
ref: main # Always use the latest main branch
|
||||
path: gitea-source
|
||||
|
||||
- name: Build Gitea
|
||||
working-directory: gitea-source
|
||||
run: |
|
||||
make clean
|
||||
cp -v ../net_mirror.go modules/graceful/net_mirror.go
|
||||
cp -v ../net_mirror_dialer.go modules/graceful/net_mirror_dialer.go
|
||||
cp -v ../net_mirror_unix.go modules/graceful/net_mirror_unix.go
|
||||
cp -v ../net_mirror_windows.go modules/graceful/net_mirror_windows.go
|
||||
grep -v 'github.com/go-i2p/go-gitlooseleaf' ../go.mod | grep -v 'go 1.2' | grep -v '// indirect' >> go.mod
|
||||
go mod tidy
|
||||
make build
|
||||
env:
|
||||
TAGS: bindata sqlite sqlite_unlock_notify netgo osusergo
|
||||
GOFLAGS: -ldflags="-extldflags=-static"
|
||||
#CGO_ENABLED: 0
|
||||
|
||||
- name: Prepare Artifact
|
||||
shell: bash
|
||||
run: |
|
||||
cd gitea-source
|
||||
ARTIFACT_NAME="gitea-${{ runner.os }}"
|
||||
if [ "${{ runner.os }}" = "Windows" ]; then
|
||||
mv gitea.exe "${ARTIFACT_NAME}.exe"
|
||||
else
|
||||
mv gitea "${ARTIFACT_NAME}"
|
||||
fi
|
||||
|
||||
- name: Upload Build Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: gitea-${{ runner.os }}
|
||||
path: |
|
||||
gitea-source/gitea-${{ runner.os }}*
|
||||
retention-days: 1
|
||||
|
||||
release:
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Download All Artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
|
||||
- name: Get Current Date
|
||||
id: date
|
||||
run: echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Create or Update Nightly Release
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
tag: nightly
|
||||
name: "Modded Gitea Nightly Build (${{ steps.date.outputs.date }})"
|
||||
body: "Automated nightly build of modded Gitea from main branch, built on ${{ steps.date.outputs.date }}"
|
||||
artifacts: "gitea-Linux/*, gitea-Windows/*, gitea-macOS/*"
|
||||
draft: false
|
||||
prerelease: true
|
||||
allowUpdates: true
|
||||
removeArtifacts: false
|
||||
replacesArtifacts: true
|
||||
makeLatest: true
|
86
.github/workflows/gitea-vanilla-nightly.yml
vendored
Normal file
86
.github/workflows/gitea-vanilla-nightly.yml
vendored
Normal file
@@ -0,0 +1,86 @@
|
||||
name: Gitea Nightly Build
|
||||
on:
|
||||
push: # Run on any push
|
||||
schedule:
|
||||
- cron: '0 0 * * *' # Runs daily at midnight UTC
|
||||
workflow_dispatch: # Allow manual triggers
|
||||
|
||||
permissions:
|
||||
contents: write # Required for creating releases
|
||||
|
||||
jobs:
|
||||
build:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest, windows-latest, macos-latest]
|
||||
runs-on: ${{ matrix.os }}
|
||||
timeout-minutes: 120 # 2-hour timeout
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: '1.24'
|
||||
cache: true
|
||||
|
||||
- name: Checkout Gitea Source
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: go-gitea/gitea
|
||||
ref: main # Always use the latest main branch
|
||||
path: gitea-source
|
||||
|
||||
- name: Build Gitea
|
||||
working-directory: gitea-source
|
||||
run: |
|
||||
make clean
|
||||
make build
|
||||
env:
|
||||
TAGS: bindata sqlite sqlite_unlock_notify netgo osusergo
|
||||
GOFLAGS: -ldflags="-extldflags=-static"
|
||||
|
||||
- name: Prepare Artifact
|
||||
shell: bash
|
||||
run: |
|
||||
cd gitea-source
|
||||
ARTIFACT_NAME="gitea-${{ runner.os }}"
|
||||
if [ "${{ runner.os }}" = "Windows" ]; then
|
||||
mv gitea.exe "${ARTIFACT_NAME}.exe"
|
||||
else
|
||||
mv gitea "${ARTIFACT_NAME}"
|
||||
fi
|
||||
|
||||
- name: Upload Build Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: gitea-${{ runner.os }}
|
||||
path: |
|
||||
gitea-source/gitea-${{ runner.os }}*
|
||||
retention-days: 1
|
||||
|
||||
release:
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Download All Artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
|
||||
- name: Get Current Date
|
||||
id: date
|
||||
run: echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Create or Update Nightly Release
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
tag: nightly-vanilla
|
||||
name: "Standard Gitea Nightly Build (${{ steps.date.outputs.date }})"
|
||||
body: "Automated nightly build of Gitea from main branch, built on ${{ steps.date.outputs.date }}"
|
||||
artifacts: "gitea-Linux/*, gitea-Windows/*, gitea-macOS/*"
|
||||
draft: false
|
||||
prerelease: true
|
||||
allowUpdates: true
|
||||
removeArtifacts: false
|
||||
replacesArtifacts: true
|
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1 +1 @@
|
||||
downloads
|
||||
/downloads
|
17
DOCKER.md
17
DOCKER.md
@@ -1,17 +0,0 @@
|
||||
Docker Instructions:
|
||||
====================
|
||||
|
||||
The Dockerfile in this repo assumes a completely self-contained setup, where I2P resides in the same container as gitea.
|
||||
This is purely for simplicity's sake.
|
||||
In order to build it, use:
|
||||
|
||||
```sh
|
||||
docker build -t go-i2p/go-gittisane .
|
||||
```
|
||||
|
||||
then in order to run it, use:
|
||||
|
||||
```sh
|
||||
docker run --name i2p-gittisane -d go-i2p/go-gittisane
|
||||
docker log i2p-gittinsane
|
||||
```
|
34
Dockerfile
34
Dockerfile
@@ -1,34 +0,0 @@
|
||||
# Stage 1: Download gittisane
|
||||
FROM alpine:latest as downloader
|
||||
RUN apk add --no-cache curl bash grep
|
||||
WORKDIR /download/
|
||||
COPY download.sh .
|
||||
RUN /download/download.sh
|
||||
RUN ls /download/downloads
|
||||
RUN cp /download/downloads/gitea-Linux /download/gittisane-linux-amd64
|
||||
|
||||
# Stage 2: Runtime
|
||||
FROM geti2p/i2p:latest
|
||||
|
||||
# Copy gittisane binary
|
||||
COPY --from=downloader /download/gittisane-linux-amd64 /usr/local/bin/gittisane
|
||||
RUN chmod +x /usr/local/bin/gittisane
|
||||
|
||||
# Create data directories
|
||||
RUN mkdir -p /data/gitea
|
||||
|
||||
# Configure I2P for SAM
|
||||
RUN echo "i2cp.tcp.host=127.0.0.1\n\
|
||||
i2cp.tcp.port=7654\n\
|
||||
sam.enabled=true\n\
|
||||
sam.host=127.0.0.1\n\
|
||||
sam.port=7656" >> /i2p/router.config
|
||||
|
||||
# Setup volumes
|
||||
VOLUME ["/data/gitea", "/i2p/.i2p"]
|
||||
WORKDIR /data/gitea
|
||||
|
||||
# Create startup script
|
||||
COPY start.sh /usr/local/bin/start.sh
|
||||
|
||||
ENTRYPOINT ["start.sh"]
|
99
Makefile
Normal file
99
Makefile
Normal file
@@ -0,0 +1,99 @@
|
||||
.PHONY: all download setup-user install-binary install-systemd enable disable uninstall clean help
|
||||
|
||||
# Installation paths
|
||||
BINARY_PATH = ${BASE}/usr/local/bin/gitea
|
||||
SYSTEMD_PATH = ${BASE}/etc/systemd/system
|
||||
CONFIG_PATH = ${BASE}/etc/gitea
|
||||
DATA_PATH = ${BASE}/var/lib/gitea
|
||||
|
||||
# Default target
|
||||
all: help
|
||||
|
||||
help:
|
||||
@echo "GitLooseLeaf - Modified Gitea with multi-protocol support"
|
||||
@echo ""
|
||||
@echo "Usage:"
|
||||
@echo " make download - Download the latest gitea binary"
|
||||
@echo " make setup-user - Create git user and required directories"
|
||||
@echo " make install-binary - Install Gitea binary"
|
||||
@echo " make install-systemd - Install systemd service files"
|
||||
@echo " make enable - Enable and start Gitea service"
|
||||
@echo " make disable - Disable and stop Gitea service"
|
||||
@echo " make install - Complete installation (all above steps)"
|
||||
@echo " make uninstall - Remove Gitea"
|
||||
@echo " make clean - Clean up downloaded files"
|
||||
@echo ""
|
||||
@echo "Note: Many commands require root privileges (use sudo)"
|
||||
|
||||
# Download latest Gitea binary
|
||||
download:
|
||||
@echo "Downloading latest Gitea binary..."
|
||||
mkdir -p downloads
|
||||
GITEA_URL="https://github.com/go-i2p/go-gitlooseleaf/releases/download/nightly/gitea-Linux"; \
|
||||
wget -O downloads/gitea "$$GITEA_URL" || curl -L -o downloads/gitea "$$GITEA_URL"
|
||||
chmod +x downloads/gitea
|
||||
|
||||
# Setup git user and directories
|
||||
setup-user:
|
||||
@echo "Setting up git user and directories..."
|
||||
./preinst
|
||||
mkdir -p $(BASE)/usr/local/bin
|
||||
mkdir -p $(SYSTEMD_PATH)
|
||||
mkdir -p $(DATA_PATH)/custom
|
||||
mkdir -p $(DATA_PATH)/data
|
||||
mkdir -p $(DATA_PATH)/log
|
||||
mkdir -p $(CONFIG_PATH)
|
||||
./postinst
|
||||
|
||||
# Install Gitea binary
|
||||
install-binary: download
|
||||
@echo "Installing Gitea binary..."
|
||||
cp downloads/gitea $(BINARY_PATH)
|
||||
chmod +x $(BINARY_PATH)
|
||||
setcap CAP_NET_BIND_SERVICE=+eip $(BINARY_PATH)
|
||||
|
||||
# Install systemd service files
|
||||
install-systemd:
|
||||
@echo "Installing systemd service files..."
|
||||
mkdir -p $(SYSTEMD_PATH)/gitea.service.d
|
||||
cp etc/systemd/system/gitea.service $(SYSTEMD_PATH)/
|
||||
cp etc/systemd/system/gitea.service.d/user-config.conf $(SYSTEMD_PATH)/gitea.service.d/
|
||||
systemctl daemon-reload
|
||||
|
||||
# Enable and start Gitea service
|
||||
enable:
|
||||
@echo "Enabling and starting Gitea service..."
|
||||
systemctl enable gitea.service
|
||||
systemctl start gitea.service
|
||||
@echo "Gitea service started successfully!"
|
||||
@echo "Please configure your email in $(SYSTEMD_PATH)/gitea.service.d/user-config.conf"
|
||||
@echo "Then restart with: systemctl restart gitea.service"
|
||||
|
||||
# Disable and stop Gitea service
|
||||
disable:
|
||||
@echo "Disabling and stopping Gitea service..."
|
||||
systemctl disable gitea.service
|
||||
systemctl stop gitea.service
|
||||
|
||||
# Complete installation
|
||||
install: setup-user install-binary install-systemd enable
|
||||
@echo "Installation complete!"
|
||||
@echo "You can now access Gitea at:"
|
||||
@echo "- HTTPS: https://$(shell hostname):3000"
|
||||
@echo "- I2P/Tor: Check logs for actual addresses: journalctl -u gitea"
|
||||
|
||||
# Uninstall Gitea
|
||||
uninstall: disable
|
||||
@echo "Uninstalling Gitea..."
|
||||
rm -f $(BINARY_PATH)
|
||||
rm -f $(SYSTEMD_PATH)/gitea.service
|
||||
rm -rf $(SYSTEMD_PATH)/gitea.service.d
|
||||
systemctl daemon-reload
|
||||
@echo "Gitea has been uninstalled."
|
||||
@echo "Note: User and data directories were not removed."
|
||||
@echo "To completely remove, delete: $(CONFIG_PATH) and $(DATA_PATH)"
|
||||
|
||||
# Clean up
|
||||
clean:
|
||||
@echo "Cleaning up..."
|
||||
rm -rf downloads
|
177
README.md
177
README.md
@@ -1,80 +1,131 @@
|
||||
# go-gitlooseleaf
|
||||
A soft-fork of gitea with support for running as a multi-protocol service. Just the mod and the CI files.
|
||||
|
||||
How it works:
|
||||
=============
|
||||
A soft-fork of Gitea that enables simultaneous multi-protocol access via standard TLS, I2P, and Tor onion services. This project enhances access to Gitea repositories across diverse network environments without compromising core functionality.
|
||||
|
||||
This uses GitHub CI to continuously build a version of Gitea that can simultaneously run as a regular TLS service, an I2P service, and a Tor onion service, based on the latest release of Gitea.
|
||||
We can do this without requiring a patch to the Gitea source code.
|
||||
This is because Gitea encapsulates its "Listening" and "Dialing" into functions, which can easily be substituted for alternative versions.
|
||||
For instance, the network listener is set up by a function, `graceful.GetListener() (net.Listener, error)` in the file `modules/graceful/server.go`.
|
||||
The default implementation of the `GetListener() (net.Listener, error)` function, `DefaultGetListener() (net.Listener, error)` is defined in the `modules/graceful/net_unix.go` for Unix-like systems and `modules/graceful/net_windows.go` for Windows-like systems.
|
||||
A developer who wishes to "Mod" gitea to listen on another kind of connection do so by creating a new file which implements a `GetListener() (net.Listener, error)` function using alternate listener implementations.
|
||||
## Features
|
||||
|
||||
On the client side, the same thing is possible because Go allows you to substitute the underlying transports used for the default HTTP Client.
|
||||
So, in the absence of overriding settings, we can configure it to use TLS, SAMv3 (for I2P), and the Tor SOCKS proxy to build HTTP connections using the appropriate transport for each service.
|
||||
- **Multi-Protocol Access**: Access your Gitea instance simultaneously through:
|
||||
- Standard HTTPS/TLS connections
|
||||
- I2P (Invisible Internet Project) network
|
||||
- Tor onion services
|
||||
- **Complete Protocol Support**: All Git operations work seamlessly across all networks:
|
||||
- Web interface for browsing and management
|
||||
- Git operations over HTTPS
|
||||
- Git operations over SSH (when using Gitea's built-in SSH server)
|
||||
- **Minimal Configuration**: Requires minimal changes to standard Gitea setup
|
||||
- **Censorship Resistance**: Maintains repository availability even when specific networks are blocked
|
||||
|
||||
Finally, if you need to include additional libraries, run `go mod tidy` in the root of the gitea checkout to include them.
|
||||
## How It Works
|
||||
|
||||
Here is a complete working example mod:
|
||||
go-gitlooseleaf leverages Gitea's modular network architecture to enable multi-protocol access without modifying the core codebase. The implementation replaces Gitea's network interfaces with protocol-aware alternatives:
|
||||
|
||||
```Go
|
||||
// copy this file to modules/graceful/net_multi.go before building gitea
|
||||
package graceful
|
||||
1. **Network Listeners**: Gitea uses `graceful.GetListener()` (defined in `modules/graceful/server.go`) for all incoming connections, which we replace with our multi-protocol implementation
|
||||
2. **Automatic Protocol Detection**: The system automatically detects and routes connections through the appropriate protocol
|
||||
3. **Rate Limiting**: Built-in protection against excessive connection attempts
|
||||
|
||||
import (
|
||||
"net"
|
||||
"net/http"
|
||||
## Implementation Details
|
||||
|
||||
"github.com/go-i2p/onramp"
|
||||
"github.com/cretz/bine/tor"
|
||||
)
|
||||
The network listener replacement works by providing a custom implementation of Gitea's `GetListener()` function:
|
||||
|
||||
// Set up the I2P Garlic API
|
||||
var garlic, i2perr = onramp.NewGarlic("gitea-i2p", "127.0.0.1:7656", onramp.OPT_DEFAULTS)
|
||||
|
||||
// Set up the Tor onion service
|
||||
var torInstance, torerr = tor.Start(nil, nil)
|
||||
var onion, onionerr = torInstance.Listen(nil, 80)
|
||||
|
||||
// This implements the GetListener function for I2P. Note the exemption for Unix sockets.
|
||||
```go
|
||||
// MultiGetListener handles connections across TLS, I2P, and Tor
|
||||
func MultiGetListener(network, address string) (net.Listener, error) {
|
||||
// Add a deferral to say that we've tried to grab a listener
|
||||
defer GetManager().InformCleanup()
|
||||
switch network {
|
||||
case "unix", "unixpacket":
|
||||
// I2P isn't really a replacement for the stuff you use Unix sockets for and it's also not an anonymity risk, so treat them normally
|
||||
unixAddr, err := ResolveUnixAddr(network, address)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return GetListenerUnixWrapper(network, unixAddr)
|
||||
default:
|
||||
return mirror.Listen("tcp", address, "./certs", true)
|
||||
}
|
||||
// Support for Unix sockets remains unchanged
|
||||
if network == "unix" || network == "unixpacket" {
|
||||
unixAddr, err := ResolveUnixAddr(network, address)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return GetListenerUnixWrapper(network, unixAddr)
|
||||
}
|
||||
|
||||
// For TCP connections, create a multi-protocol mirror listener
|
||||
ml, err := mirrorListener.Listen(address, os.Getenv("EMAIL"), "./certs", true)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Apply rate limiting for protection
|
||||
return limitedlistener.NewLimitedListener(ml,
|
||||
limitedlistener.WithMaxConnections(500), // concurrent connections
|
||||
limitedlistener.WithRateLimit(24), // connections per second
|
||||
), nil
|
||||
}
|
||||
|
||||
// We use `init() to ensure that the appropriate Listeners and Dialers are correctly placed at runtime
|
||||
func init() {
|
||||
GetListener = MultiGetListener
|
||||
/*Dialer not shown here*/
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
Caveats
|
||||
-------
|
||||
## Configuration
|
||||
|
||||
Gitea makes a few other kinds of connections, besides `HTTP`, if instructed to do so in the config file.
|
||||
For instance, there is an SMTP client.
|
||||
Not all of these connections are automatically routed through the appropriate anonymity networks in this configuration.
|
||||
For I2P, you might need to use `127.0.0.1:7659/7660` for SMTP. For Tor, you would configure SOCKS proxy settings.
|
||||
Similarly, SSH client connections need additional configuration to properly route through these networks.
|
||||
Additional adjustments to the configuration can be made to also route these services across the appropriate networks but aren't fully documented here at this time.
|
||||
### Basic Setup
|
||||
|
||||
License
|
||||
-------
|
||||
1. **Environment Variables**:
|
||||
- `EMAIL`: Used for TLS certificate generation (required for HTTPS)
|
||||
- `HOSTNAME`: Server hostname (defaults to local machine name if not set)
|
||||
|
||||
Both this mod and gitea are licensed under the MIT license.
|
||||
See LICENSE for net_multi*.go in this repository.
|
||||
LICENSE-gitea.md is a copy of the Gitea license from https://github.com/go-gitea/gitea
|
||||
2. **Gitea Configuration** (app.ini):
|
||||
```ini
|
||||
[server]
|
||||
START_SSH_SERVER = true # Enable built-in SSH server for multi-protocol SSH support
|
||||
SSH_PORT = 22 # Must end with "22" for automatic SSH mirroring (e.g., 22, 2222, 10022)
|
||||
```
|
||||
|
||||
### Network Addresses
|
||||
|
||||
Your Gitea instance will be available at:
|
||||
- HTTPS: `https://yourdomain.com`
|
||||
- Tor: `http://youronionaddress.onion` (automatically generated)
|
||||
- I2P: `http://youri2paddress.i2p` (automatically generated)
|
||||
|
||||
Access using Git clients:
|
||||
```bash
|
||||
# Clone via HTTPS
|
||||
git clone https://yourdomain.com/username/repo.git
|
||||
git clone http://youronionaddress.onion/username/repo.git
|
||||
git clone http://youri2paddress.i2p/username/repo.git
|
||||
|
||||
# Clone via SSH (when using built-in SSH server)
|
||||
git clone git@yourdomain.com:username/repo.git
|
||||
git clone git@youronionaddress.onion:username/repo.git
|
||||
git clone git@youri2paddress.i2p:username/repo.git
|
||||
```
|
||||
|
||||
## Installation
|
||||
|
||||
You can:
|
||||
1. Download prebuilt binaries from the [releases page](https://github.com/go-i2p/go-gitlooseleaf/releases)
|
||||
2. Use the included `install.sh` script to set up a system service
|
||||
3. Build from source using the GitHub Actions workflows as a reference
|
||||
|
||||
## Use Cases
|
||||
|
||||
- **Self-hosting enthusiasts**: Offer your personal Git repositories through multiple networks with a single installation
|
||||
- **Code hobbyists**: Share your projects with friends regardless of their network constraints or preferences
|
||||
- **Organizations in regions with network restrictions**: Ensure repository access despite local network limitations
|
||||
- **Open source projects**: Maximize availability of your codebase to contributors worldwide
|
||||
- **Educational institutions**: Provide consistent access to course materials and student repositories
|
||||
- **Privacy-conscious development**: Enable contribution without requiring standard TLS connections
|
||||
|
||||
## FAQ
|
||||
|
||||
**Q: Does this affect Gitea's performance?**
|
||||
A: There is minimal performance impact for standard TLS connections. I2P and Tor connections will have the typical latency associated with these networks.
|
||||
|
||||
**Q: How do I view my .onion and .i2p addresses?**
|
||||
A: After starting the service, addresses are displayed in the logs and stored in `./certs/hostname.onion` and `./certs/hostname.i2p`.
|
||||
|
||||
**Q: Can users have different identities on different protocols?**
|
||||
A: No, user accounts are shared across all protocols. This is an availability enhancement, not an anonymity solution.
|
||||
|
||||
**Q: Is this compatible with Gitea upgrades?**
|
||||
A: Each version is built against a specific Gitea release. Check the releases page for compatibility information.
|
||||
|
||||
**Q: Do I need to run Tor and I2P services separately?**
|
||||
A: Yes, you need to run Tor and I2P routers.
|
||||
|
||||
**Q: Why must the SSH port end with "22"?**
|
||||
A: The automatic protocol detection for SSH connections relies on recognizing the port number pattern. Any port ending in "22" (such as 22, 2222, 10022) will work correctly.
|
||||
|
||||
## License
|
||||
|
||||
Both this modification and Gitea itself are licensed under the MIT license.
|
||||
- See [LICENSE](LICENSE) for this project's license
|
||||
- See [LICENSE-gitea.md](LICENSE-gitea.md) for the Gitea license
|
||||
|
29
etc/systemd/system/gitea.service
Normal file
29
etc/systemd/system/gitea.service
Normal file
@@ -0,0 +1,29 @@
|
||||
[Unit]
|
||||
Description=Gitea (Modified with multi-protocol TLS/I2P/Tor support)
|
||||
Documentation=https://github.com/go-i2p/go-gitlooseleaf
|
||||
After=network.target postgresql.service mysql.service mariadb.service
|
||||
Wants=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=git
|
||||
Group=git
|
||||
WorkingDirectory=/home/git
|
||||
ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea
|
||||
|
||||
# Hardening measures
|
||||
ProtectSystem=full
|
||||
PrivateTmp=true
|
||||
PrivateDevices=true
|
||||
NoNewPrivileges=true
|
||||
ReadWritePaths=/var/lib/gitea /etc/gitea /home/git
|
||||
AmbientCapabilities=CAP_NET_BIND_SERVICE
|
||||
|
||||
# Load user-modifiable configuration from drop-in directory
|
||||
# This will automatically include all .conf files in gitea.service.d/
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
22
etc/systemd/system/gitea.service.d/user-config.conf
Normal file
22
etc/systemd/system/gitea.service.d/user-config.conf
Normal file
@@ -0,0 +1,22 @@
|
||||
[Service]
|
||||
# User-configurable environment variables for multi-protocol support
|
||||
|
||||
# Required for TLS certificate generation - CHANGE THIS!
|
||||
Environment="EMAIL=your-email@example.com"
|
||||
|
||||
# Optional: Set explicit hostname (defaults to system hostname if not set)
|
||||
# Environment="HOSTNAME=your-hostname"
|
||||
|
||||
# Optional: Performance tuning
|
||||
# Environment="MAX_CONNECTIONS=500"
|
||||
# Environment="RATE_LIMIT=24"
|
||||
|
||||
# Optional: Certificate directory
|
||||
# Environment="CERT_DIR=/var/lib/gitea/certs"
|
||||
|
||||
# Optional: Additional environment variables for database, etc.
|
||||
# Environment="GITEA_DATABASE_TYPE=postgres"
|
||||
# Environment="GITEA_DATABASE_HOST=localhost:5432"
|
||||
# Environment="GITEA_DATABASE_NAME=gitea"
|
||||
# Environment="GITEA_DATABASE_USER=gitea"
|
||||
# Environment="GITEA_DATABASE_PASSWD=gitea"
|
722
eval.md
Normal file
722
eval.md
Normal file
@@ -0,0 +1,722 @@
|
||||
Project Path: /home/idk/go/src/github.com/go-i2p/go-gitlooseleaf
|
||||
|
||||
Source Tree:
|
||||
|
||||
```
|
||||
go-gitlooseleaf
|
||||
├── go.sum
|
||||
├── net_mirror.go
|
||||
├── net_mirror_dialer.go
|
||||
├── go.mod
|
||||
├── LICENSE
|
||||
├── postinst
|
||||
├── download.sh
|
||||
├── net_mirror_unix.go
|
||||
├── env.sh
|
||||
├── etc
|
||||
│ └── systemd
|
||||
│ └── system
|
||||
│ ├── gitea.service
|
||||
│ └── gitea.service.d
|
||||
│ └── user-config.conf
|
||||
├── package-lock.json
|
||||
├── preinst
|
||||
├── README.md
|
||||
├── Makefile
|
||||
├── net_mirror_windows.go
|
||||
├── install.sh
|
||||
└── LICENSE-gitea.md
|
||||
|
||||
```
|
||||
|
||||
`/home/idk/go/src/github.com/go-i2p/go-gitlooseleaf/go.sum`:
|
||||
|
||||
```````sum
|
||||
github.com/cretz/bine v0.2.0 h1:8GiDRGlTgz+o8H9DSnsl+5MeBK4HsExxgl6WgzOCuZo=
|
||||
github.com/cretz/bine v0.2.0/go.mod h1:WU4o9QR9wWp8AVKtTM1XD5vUHkEqnf2vVSo6dBqbetI=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/go-i2p/go-limit v0.0.0-20250203203118-210616857c15 h1:ASjMbwlepoDQfrhv+H2B5ICBPJU5ES1JzmOxzPDx3YQ=
|
||||
github.com/go-i2p/go-limit v0.0.0-20250203203118-210616857c15/go.mod h1:4jjmVRhvKj47sQ6B6wdDhN1IrEZunE6KwkYLQx/BeVE=
|
||||
github.com/go-i2p/go-meta-dialer v0.0.0-20250501024057-715e91be3cfe h1:9Rxw2KtMCRKZHI4WavUAaatzKmc64V6kiYvcyTMHjeU=
|
||||
github.com/go-i2p/go-meta-dialer v0.0.0-20250501024057-715e91be3cfe/go.mod h1:++xHSOvnGymRSyFbi9A9hztcfwKfU6/nJAtVxrNo8Zo=
|
||||
github.com/go-i2p/go-meta-listener v0.0.5-0.20250521170131-2058a4309616 h1:EDx3FrzeGSjtYiH6GAF/lKNseNVDDHqR2OY/hQfiOqo=
|
||||
github.com/go-i2p/go-meta-listener v0.0.5-0.20250521170131-2058a4309616/go.mod h1:wF/MCCfB40gZyT9WtuYWQkUOPrnoTzA+NG0zpsy3s4M=
|
||||
github.com/go-i2p/i2pkeys v0.0.0-20241108200332-e4f5ccdff8c4/go.mod h1:m5TlHjPZrU5KbTd7Lr+I2rljyC6aJ88HdkeMQXV0U0E=
|
||||
github.com/go-i2p/i2pkeys v0.33.92 h1:e2vx3vf7tNesaJ8HmAlGPOcfiGM86jzeIGxh27I9J2Y=
|
||||
github.com/go-i2p/i2pkeys v0.33.92/go.mod h1:BRURQ/twxV0WKjZlFSKki93ivBi+MirZPWudfwTzMpE=
|
||||
github.com/go-i2p/onramp v0.33.92 h1:Dk3A0SGpdEw829rSjW2LqN8o16pUvuhiN0vn36z7Gpc=
|
||||
github.com/go-i2p/onramp v0.33.92/go.mod h1:5sfB8H2xk05gAS2K7XAUZ7ekOfwGJu3tWF0fqdXzJG4=
|
||||
github.com/go-i2p/sam3 v0.33.92 h1:TVpi4GH7Yc7nZBiE1QxLjcZfnC4fI/80zxQz1Rk36BA=
|
||||
github.com/go-i2p/sam3 v0.33.92/go.mod h1:oDuV145l5XWKKafeE4igJHTDpPwA0Yloz9nyKKh92eo=
|
||||
github.com/opd-ai/wileedot v0.0.0-20241217172720-521d4175e624 h1:FXCTQV93+31Yj46zpYbd41es+EYgT7qi4RK6KSVrGQM=
|
||||
github.com/opd-ai/wileedot v0.0.0-20241217172720-521d4175e624/go.mod h1:ftKSvvGC9FnxZeuL3B4MB6q/DOzVSV0kET08YUyDwbM=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
||||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
|
||||
golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
|
||||
golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
|
||||
golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
|
||||
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
|
||||
golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
|
||||
golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=
|
||||
golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
|
||||
```````
|
||||
|
||||
`/home/idk/go/src/github.com/go-i2p/go-gitlooseleaf/net_mirror.go`:
|
||||
|
||||
```````go
|
||||
// copy this file to modules/graceful/net_anon.go before building gitea
|
||||
package graceful
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"net"
|
||||
"net/http"
|
||||
"os"
|
||||
|
||||
"github.com/go-i2p/go-meta-listener/mirror"
|
||||
|
||||
limitedlistener "github.com/go-i2p/go-limit"
|
||||
)
|
||||
|
||||
func hostname() string {
|
||||
hostname := os.Getenv("HOSTNAME")
|
||||
if hostname == "" {
|
||||
// get the local hostname
|
||||
// this is a fallback for when the HOSTNAME environment variable is not set
|
||||
hostname, err := os.Hostname()
|
||||
if err != nil {
|
||||
log.Printf("Warning: %s", err)
|
||||
}
|
||||
if hostname == "" {
|
||||
// this is a fallback for when the hostname is not set
|
||||
hostname = "localhost"
|
||||
}
|
||||
}
|
||||
return hostname
|
||||
}
|
||||
|
||||
var mirrorListener, mirrorErr = mirror.NewMirror(hostname())
|
||||
|
||||
// This implements the GetListener function for TLS, I2P, and Onion. Note the exemption for Unix sockets.
|
||||
func MultiGetListener(network, address string) (net.Listener, error) {
|
||||
if mirrorErr != nil {
|
||||
return nil, mirrorErr
|
||||
}
|
||||
EMAIL := os.Getenv("EMAIL")
|
||||
if EMAIL == "" {
|
||||
log.Printf("Warning: %s", fmt.Errorf("EMAIL environment variable not set, TLS not possible"))
|
||||
} else {
|
||||
log.Printf("Using %s as email for TLS", EMAIL)
|
||||
}
|
||||
// Add a deferral to say that we've tried to grab a listener
|
||||
defer GetManager().InformCleanup()
|
||||
switch network {
|
||||
case "unix", "unixpacket":
|
||||
// I2P isn't really a replacement for the stuff you use Unix sockets for and it's also not an anonymity risk, so treat them normally
|
||||
unixAddr, err := ResolveUnixAddr(network, address)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return GetListenerUnixWrapper(network, unixAddr)
|
||||
|
||||
default:
|
||||
ml, err := mirrorListener.Listen(address, EMAIL, "./certs", true)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return limitedlistener.NewLimitedListener(ml,
|
||||
limitedlistener.WithMaxConnections(500), // max concurrent
|
||||
limitedlistener.WithRateLimit(24), // per second
|
||||
), nil
|
||||
}
|
||||
}
|
||||
|
||||
// We use `init() to ensure that the appropriate Listeners and Dialers are correctly placed at runtime
|
||||
func init() {
|
||||
GetListener = MultiGetListener
|
||||
httpClient := &http.Client{
|
||||
Transport: &http.Transport{
|
||||
Dial: Dial,
|
||||
},
|
||||
}
|
||||
|
||||
http.DefaultClient = httpClient
|
||||
http.DefaultTransport = httpClient.Transport
|
||||
}
|
||||
|
||||
```````
|
||||
|
||||
`/home/idk/go/src/github.com/go-i2p/go-gitlooseleaf/net_mirror_dialer.go`:
|
||||
|
||||
```````go
|
||||
package graceful
|
||||
|
||||
import (
|
||||
"net"
|
||||
|
||||
metadialer "github.com/go-i2p/go-meta-dialer"
|
||||
)
|
||||
|
||||
func Dial(network, addr string) (net.Conn, error) {
|
||||
if metadialer.ANON {
|
||||
metadialer.ANON = false
|
||||
}
|
||||
return metadialer.Dial(network, addr)
|
||||
}
|
||||
|
||||
```````
|
||||
|
||||
`/home/idk/go/src/github.com/go-i2p/go-gitlooseleaf/go.mod`:
|
||||
|
||||
```````mod
|
||||
|
||||
require (
|
||||
github.com/go-i2p/go-limit v0.0.0-20250203203118-210616857c15
|
||||
github.com/go-i2p/go-meta-dialer v0.0.0-20250501024057-715e91be3cfe
|
||||
github.com/go-i2p/go-meta-listener v0.0.5
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/cretz/bine v0.2.0 // indirect
|
||||
github.com/go-i2p/i2pkeys v0.33.92 // indirect
|
||||
github.com/go-i2p/onramp v0.33.92 // indirect
|
||||
github.com/go-i2p/sam3 v0.33.92 // indirect
|
||||
github.com/opd-ai/wileedot v0.0.0-20241217172720-521d4175e624 // indirect
|
||||
)
|
||||
|
||||
```````
|
||||
|
||||
`/home/idk/go/src/github.com/go-i2p/go-gitlooseleaf/LICENSE`:
|
||||
|
||||
```````
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2025 I2P For Go
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
```````
|
||||
|
||||
`/home/idk/go/src/github.com/go-i2p/go-gitlooseleaf/postinst`:
|
||||
|
||||
```````
|
||||
# only if we're root
|
||||
|
||||
if [ "$(id -u)" != "0" ]; then
|
||||
echo "This script must be run as root" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
BINARY_PATH=${BASE}/usr/local/bin/gitea
|
||||
SYSTEMD_PATH=${BASE}/etc/systemd/system
|
||||
CONFIG_PATH=${BASE}/etc/gitea
|
||||
DATA_PATH=${BASE}/var/lib/gitea
|
||||
|
||||
echo chown -R git:git "$DATA_PATH/"
|
||||
echo chmod -R 750 "$DATA_PATH/"
|
||||
echo chown root:git "$CONFIG_PATH"
|
||||
echo chmod 770 "$CONFIG_PATH"
|
||||
```````
|
||||
|
||||
`/home/idk/go/src/github.com/go-i2p/go-gitlooseleaf/download.sh`:
|
||||
|
||||
```````sh
|
||||
#!/bin/bash
|
||||
|
||||
# Set GitHub repo info
|
||||
OWNER="go-i2p"
|
||||
REPO="go-gittisane"
|
||||
|
||||
echo "Fetching latest release info from GitHub..."
|
||||
|
||||
# Get latest release data
|
||||
RELEASE_DATA=$(curl -s "https://api.github.com/repos/$OWNER/$REPO/releases/latest")
|
||||
|
||||
# Extract version number
|
||||
VERSION=$(echo "$RELEASE_DATA" | grep -Po '"tag_name": "\K.*?(?=")')
|
||||
echo "Latest version: $VERSION"
|
||||
|
||||
# Create downloads directory
|
||||
mkdir -p downloads
|
||||
cd downloads
|
||||
|
||||
# Download each asset
|
||||
echo "$RELEASE_DATA" | grep -Po '"browser_download_url": "\K.*?(?=")' | while read -r url; do
|
||||
filename=$(basename "$url")
|
||||
echo "Downloading $filename..."
|
||||
curl -L -o "$filename" "$url"
|
||||
|
||||
# Make Linux/macOS binaries executable
|
||||
if [[ "$filename" != *".exe" ]]; then
|
||||
chmod +x "$filename"
|
||||
fi
|
||||
done
|
||||
|
||||
echo "Download complete! Files are in the 'downloads' directory"
|
||||
```````
|
||||
|
||||
`/home/idk/go/src/github.com/go-i2p/go-gitlooseleaf/net_mirror_unix.go`:
|
||||
|
||||
```````go
|
||||
// Copyright 2019 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
// This code is heavily inspired by the archived gofacebook/gracenet/net.go handler
|
||||
|
||||
//go:build !windows
|
||||
|
||||
package graceful
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
)
|
||||
|
||||
func ResolveUnixAddr(network, address string) (net.Addr, error) {
|
||||
switch network {
|
||||
case "unix", "unixpacket":
|
||||
return net.ResolveUnixAddr(network, address)
|
||||
default:
|
||||
return nil, fmt.Errorf("unknown network type %s", network)
|
||||
}
|
||||
}
|
||||
|
||||
func GetListenerUnixWrapper(network string, addr net.Addr) (net.Listener, error) {
|
||||
switch addr.(type) {
|
||||
case *net.UnixAddr:
|
||||
return GetListenerUnix(network, addr.(*net.UnixAddr))
|
||||
default:
|
||||
return nil, fmt.Errorf("unknown address type %T", addr)
|
||||
}
|
||||
}
|
||||
|
||||
```````
|
||||
|
||||
`/home/idk/go/src/github.com/go-i2p/go-gitlooseleaf/env.sh`:
|
||||
|
||||
```````sh
|
||||
#! /usr/bin/env bash
|
||||
cd downloads
|
||||
export HOSTNAME=localhost
|
||||
export GITEA_WORK_DIR=$(pwd)
|
||||
export GITEA_CUSTOM="$GITEA_WORK_DIR/custom"
|
||||
./gitea web --config app.ini
|
||||
```````
|
||||
|
||||
`/home/idk/go/src/github.com/go-i2p/go-gitlooseleaf/etc/systemd/system/gitea.service`:
|
||||
|
||||
```````service
|
||||
[Unit]
|
||||
Description=Gitea (Modified with multi-protocol TLS/I2P/Tor support)
|
||||
Documentation=https://github.com/go-i2p/go-gitlooseleaf
|
||||
After=network.target postgresql.service mysql.service mariadb.service
|
||||
Wants=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=git
|
||||
Group=git
|
||||
WorkingDirectory=/home/git
|
||||
ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea
|
||||
|
||||
# Hardening measures
|
||||
ProtectSystem=full
|
||||
PrivateTmp=true
|
||||
PrivateDevices=true
|
||||
NoNewPrivileges=true
|
||||
ReadWritePaths=/var/lib/gitea /etc/gitea /home/git
|
||||
AmbientCapabilities=CAP_NET_BIND_SERVICE
|
||||
|
||||
# Load user-modifiable configuration from drop-in directory
|
||||
# This will automatically include all .conf files in gitea.service.d/
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```````
|
||||
|
||||
`/home/idk/go/src/github.com/go-i2p/go-gitlooseleaf/etc/systemd/system/gitea.service.d/user-config.conf`:
|
||||
|
||||
```````conf
|
||||
[Service]
|
||||
# User-configurable environment variables for multi-protocol support
|
||||
|
||||
# Required for TLS certificate generation - CHANGE THIS!
|
||||
Environment="EMAIL=your-email@example.com"
|
||||
|
||||
# Optional: Set explicit hostname (defaults to system hostname if not set)
|
||||
# Environment="HOSTNAME=your-hostname"
|
||||
|
||||
# Optional: Performance tuning
|
||||
# Environment="MAX_CONNECTIONS=500"
|
||||
# Environment="RATE_LIMIT=24"
|
||||
|
||||
# Optional: Certificate directory
|
||||
# Environment="CERT_DIR=/var/lib/gitea/certs"
|
||||
|
||||
# Optional: Additional environment variables for database, etc.
|
||||
# Environment="GITEA_DATABASE_TYPE=postgres"
|
||||
# Environment="GITEA_DATABASE_HOST=localhost:5432"
|
||||
# Environment="GITEA_DATABASE_NAME=gitea"
|
||||
# Environment="GITEA_DATABASE_USER=gitea"
|
||||
# Environment="GITEA_DATABASE_PASSWD=gitea"
|
||||
```````
|
||||
|
||||
`/home/idk/go/src/github.com/go-i2p/go-gitlooseleaf/preinst`:
|
||||
|
||||
```````
|
||||
if [ "$(id -u)" != "0" ]; then
|
||||
echo "This script must be run as root" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
BINARY_PATH=${BASE}/usr/local/bin/gitea
|
||||
SYSTEMD_PATH=${BASE}/etc/systemd/system
|
||||
CONFIG_PATH=${BASE}/etc/gitea
|
||||
DATA_PATH=${BASE}/var/lib/gitea
|
||||
|
||||
echo "id -u git &>/dev/null || adduser \
|
||||
--system \
|
||||
--shell /bin/bash \
|
||||
--gecos 'Git Version Control' \
|
||||
--group \
|
||||
--disabled-password \
|
||||
--home /home/git \
|
||||
git"
|
||||
```````
|
||||
|
||||
`/home/idk/go/src/github.com/go-i2p/go-gitlooseleaf/README.md`:
|
||||
|
||||
```````md
|
||||
# go-gitlooseleaf
|
||||
|
||||
A soft-fork of Gitea that enables simultaneous multi-protocol access via standard TLS, I2P, and Tor onion services. This repository contains only the network interface modules and CI configuration needed to build custom Gitea binaries.
|
||||
|
||||
## How It Works
|
||||
|
||||
This project leverages GitHub Actions to automatically build a modified version of Gitea that can simultaneously serve content over multiple protocols:
|
||||
- Standard HTTPS/TLS connections
|
||||
- I2P (Invisible Internet Project) network
|
||||
- Tor onion services
|
||||
|
||||
The beauty of this approach is that it requires no changes to Gitea's core codebase, as Gitea intelligently encapsulates network operations through abstraction:
|
||||
|
||||
1. **Network Listeners**: Gitea uses `graceful.GetListener()` (defined in `modules/graceful/server.go`) for all incoming connections
|
||||
2. **Network Clients**: Gitea's HTTP client connections can be configured with custom transport implementations
|
||||
|
||||
We take advantage of these abstractions by replacing the default implementations with our multi-protocol versions during the build process.
|
||||
|
||||
## Implementation Details
|
||||
|
||||
The network listener replacement works because Gitea's default `GetListener()` implementations (`DefaultGetListener()`) are defined in platform-specific files:
|
||||
- `modules/graceful/net_unix.go` for Unix-like systems
|
||||
- `modules/graceful/net_windows.go` for Windows
|
||||
|
||||
Our implementation introduces a `MultiGetListener()` function that handles TLS, I2P, and Tor connections using the `go-meta-listener` package, while still supporting Unix sockets for internal functions.
|
||||
|
||||
Similarly, we replace the default HTTP client with a version that can route traffic through the appropriate network (TLS, I2P, or Tor) based on the destination.
|
||||
|
||||
## Current Implementation
|
||||
|
||||
The current implementation in `net_mirror.go` uses:
|
||||
- `go-meta-listener/mirror` for listening on multiple protocols
|
||||
- Rate limiting through `go-i2p/go-limit`
|
||||
- Environment variables (`EMAIL`, `HOSTNAME`) for configuration
|
||||
|
||||
```go
|
||||
// This implements the GetListener function for TLS, I2P, and Onion
|
||||
func MultiGetListener(network, address string) (net.Listener, error) {
|
||||
// Support for Unix sockets remains unchanged
|
||||
if network == "unix" || network == "unixpacket" {
|
||||
unixAddr, err := ResolveUnixAddr(network, address)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return GetListenerUnixWrapper(network, unixAddr)
|
||||
}
|
||||
|
||||
// For TCP connections, create a multi-protocol mirror listener
|
||||
ml, err := mirrorListener.Listen(address, os.Getenv("EMAIL"), "./certs", true)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Apply rate limiting
|
||||
return limitedlistener.NewLimitedListener(ml,
|
||||
limitedlistener.WithMaxConnections(500), // concurrent connections
|
||||
limitedlistener.WithRateLimit(24), // connections per second
|
||||
), nil
|
||||
}
|
||||
```
|
||||
|
||||
## Usage Caveats
|
||||
|
||||
While the HTTP interface works seamlessly across all three protocols, other Gitea communication channels require additional configuration:
|
||||
|
||||
1. **SMTP Client**: If configured, email connections from Gitea will need proper routing:
|
||||
- For I2P: Use local ports like `127.0.0.1:7659/7660`
|
||||
- For Tor: Configure appropriate SOCKS proxy settings
|
||||
|
||||
2. **SSH Connections**: Git operations over SSH require additional configuration to properly route through anonymity networks. These settings depend on your specific deployment environment.
|
||||
|
||||
3. **Environment Variables**:
|
||||
- `EMAIL`: Used for TLS certificate generation (required for HTTPS)
|
||||
- `HOSTNAME`: Server hostname (defaults to local machine name if not set)
|
||||
|
||||
## Installation
|
||||
|
||||
You can:
|
||||
1. Download prebuilt binaries from the [releases page](https://github.com/go-i2p/go-gitlooseleaf/releases)
|
||||
2. Use the included `install.sh` script to set up a system service
|
||||
3. Build from source using the GitHub Actions workflows as a reference
|
||||
|
||||
## License
|
||||
|
||||
Both this modification and Gitea itself are licensed under the MIT license.
|
||||
- See [LICENSE](LICENSE) for this project's license
|
||||
- See [LICENSE-gitea.md](LICENSE-gitea.md) for the Gitea license from https://github.com/go-gitea/gitea
|
||||
|
||||
```````
|
||||
|
||||
`/home/idk/go/src/github.com/go-i2p/go-gitlooseleaf/Makefile`:
|
||||
|
||||
```````
|
||||
.PHONY: all download setup-user install-binary install-systemd enable disable uninstall clean help
|
||||
|
||||
# Installation paths
|
||||
BINARY_PATH = ${BASE}/usr/local/bin/gitea
|
||||
SYSTEMD_PATH = ${BASE}/etc/systemd/system
|
||||
CONFIG_PATH = ${BASE}/etc/gitea
|
||||
DATA_PATH = ${BASE}/var/lib/gitea
|
||||
|
||||
# Default target
|
||||
all: help
|
||||
|
||||
help:
|
||||
@echo "GitLooseLeaf - Modified Gitea with multi-protocol support"
|
||||
@echo ""
|
||||
@echo "Usage:"
|
||||
@echo " make download - Download the latest gitea binary"
|
||||
@echo " make setup-user - Create git user and required directories"
|
||||
@echo " make install-binary - Install Gitea binary"
|
||||
@echo " make install-systemd - Install systemd service files"
|
||||
@echo " make enable - Enable and start Gitea service"
|
||||
@echo " make disable - Disable and stop Gitea service"
|
||||
@echo " make install - Complete installation (all above steps)"
|
||||
@echo " make uninstall - Remove Gitea"
|
||||
@echo " make clean - Clean up downloaded files"
|
||||
@echo ""
|
||||
@echo "Note: Many commands require root privileges (use sudo)"
|
||||
|
||||
# Download latest Gitea binary
|
||||
download:
|
||||
@echo "Downloading latest Gitea binary..."
|
||||
mkdir -p downloads
|
||||
GITEA_URL="https://github.com/go-i2p/go-gitlooseleaf/releases/download/nightly/gitea-Linux"; \
|
||||
wget -O downloads/gitea "$$GITEA_URL" || curl -L -o downloads/gitea "$$GITEA_URL"
|
||||
chmod +x downloads/gitea
|
||||
|
||||
# Setup git user and directories
|
||||
setup-user:
|
||||
@echo "Setting up git user and directories..."
|
||||
./preinst
|
||||
mkdir -p $(DATA_PATH)/custom
|
||||
mkdir -p $(DATA_PATH)/data
|
||||
mkdir -p $(DATA_PATH)/log
|
||||
mkdir -p $(CONFIG_PATH)
|
||||
./postinst
|
||||
|
||||
# Install Gitea binary
|
||||
install-binary: download
|
||||
@echo "Installing Gitea binary..."
|
||||
cp downloads/gitea $(BINARY_PATH)
|
||||
chmod +x $(BINARY_PATH)
|
||||
setcap CAP_NET_BIND_SERVICE=+eip $(BINARY_PATH)
|
||||
|
||||
# Install systemd service files
|
||||
install-systemd:
|
||||
@echo "Installing systemd service files..."
|
||||
mkdir -p $(SYSTEMD_PATH)/gitea.service.d
|
||||
cp etc/systemd/system/gitea.service $(SYSTEMD_PATH)/
|
||||
cp etc/systemd/system/gitea.service.d/user-config.conf $(SYSTEMD_PATH)/gitea.service.d/
|
||||
systemctl daemon-reload
|
||||
|
||||
# Enable and start Gitea service
|
||||
enable:
|
||||
@echo "Enabling and starting Gitea service..."
|
||||
systemctl enable gitea.service
|
||||
systemctl start gitea.service
|
||||
@echo "Gitea service started successfully!"
|
||||
@echo "Please configure your email in $(SYSTEMD_PATH)/gitea.service.d/user-config.conf"
|
||||
@echo "Then restart with: systemctl restart gitea.service"
|
||||
|
||||
# Disable and stop Gitea service
|
||||
disable:
|
||||
@echo "Disabling and stopping Gitea service..."
|
||||
systemctl disable gitea.service
|
||||
systemctl stop gitea.service
|
||||
|
||||
# Complete installation
|
||||
install: setup-user install-binary install-systemd enable
|
||||
@echo "Installation complete!"
|
||||
@echo "You can now access Gitea at:"
|
||||
@echo "- HTTPS: https://$(shell hostname):3000"
|
||||
@echo "- I2P/Tor: Check logs for actual addresses: journalctl -u gitea"
|
||||
|
||||
# Uninstall Gitea
|
||||
uninstall: disable
|
||||
@echo "Uninstalling Gitea..."
|
||||
rm -f $(BINARY_PATH)
|
||||
rm -f $(SYSTEMD_PATH)/gitea.service
|
||||
rm -rf $(SYSTEMD_PATH)/gitea.service.d
|
||||
systemctl daemon-reload
|
||||
@echo "Gitea has been uninstalled."
|
||||
@echo "Note: User and data directories were not removed."
|
||||
@echo "To completely remove, delete: $(CONFIG_PATH) and $(DATA_PATH)"
|
||||
|
||||
# Clean up
|
||||
clean:
|
||||
@echo "Cleaning up..."
|
||||
rm -rf downloads
|
||||
```````
|
||||
|
||||
`/home/idk/go/src/github.com/go-i2p/go-gitlooseleaf/net_mirror_windows.go`:
|
||||
|
||||
```````go
|
||||
// Copyright 2019 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
// This code is heavily inspired by the archived gofacebook/gracenet/net.go handler
|
||||
|
||||
//go:build windows
|
||||
|
||||
package graceful
|
||||
|
||||
import "net"
|
||||
|
||||
func ResolveUnixAddr(network, address string) (net.Addr, error) {
|
||||
switch network {
|
||||
case "unix", "unixpacket":
|
||||
return net.ResolveUnixAddr(network, address)
|
||||
case "tcp", "tcp4", "tcp6":
|
||||
return net.ResolveTCPAddr(network, address)
|
||||
case "udp", "udp4", "udp6":
|
||||
return net.ResolveUDPAddr(network, address)
|
||||
default:
|
||||
return nil, net.UnknownNetworkError(network)
|
||||
}
|
||||
}
|
||||
|
||||
func GetListenerUnixWrapper(network string, addr net.Addr) (net.Listener, error) {
|
||||
return net.Listen(network, addr.String())
|
||||
}
|
||||
|
||||
```````
|
||||
|
||||
`/home/idk/go/src/github.com/go-i2p/go-gitlooseleaf/install.sh`:
|
||||
|
||||
```````sh
|
||||
#! /usr/bin/env sh
|
||||
|
||||
# AS ROOT
|
||||
|
||||
adduser \
|
||||
--system \
|
||||
--shell /bin/bash \
|
||||
--gecos 'Git Version Control' \
|
||||
--group \
|
||||
--disabled-password \
|
||||
--home /home/git \
|
||||
git
|
||||
|
||||
mkdir -p /var/lib/gitea/{custom,data,log}
|
||||
chown -R git:git /var/lib/gitea/
|
||||
chmod -R 750 /var/lib/gitea/
|
||||
mkdir /etc/gitea
|
||||
chown root:git /etc/gitea
|
||||
chmod 770 /etc/gitea
|
||||
killall gitea
|
||||
sleep 3s
|
||||
GITEA_URL=https://github.com/go-i2p/go-gitlooseleaf/releases/download/nightly/gitea-Linux
|
||||
wget -O /usr/local/bin/gitea "$GITEA_URL"
|
||||
chmod +x /usr/local/bin/gitea
|
||||
setcap CAP_NET_BIND_SERVICE=+eip /usr/local/bin/gitea
|
||||
su - git
|
||||
|
||||
```````
|
||||
|
||||
`/home/idk/go/src/github.com/go-i2p/go-gitlooseleaf/LICENSE-gitea.md`:
|
||||
|
||||
```````md
|
||||
Copyright (c) 2016 The Gitea Authors
|
||||
Copyright (c) 2015 The Gogs Authors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
```````
|
54
go.mod
54
go.mod
@@ -1,24 +1,52 @@
|
||||
module github.com/go-i2p/go-gittisane
|
||||
module github.com/go-i2p/go-gitlooseleaf
|
||||
|
||||
go 1.23.5
|
||||
go 1.24.2
|
||||
|
||||
require (
|
||||
github.com/go-i2p/go-meta-listener v0.0.0-20250419155249-feebe95fe95a
|
||||
github.com/go-i2p/onramp v0.33.92
|
||||
code.gitea.io/gitea v1.24.3
|
||||
github.com/go-i2p/go-limit v0.0.0-20250718212214-52e5c6fec5d8
|
||||
github.com/go-i2p/go-meta-dialer v0.0.0-20250527012419-b550471a50a5
|
||||
github.com/go-i2p/go-meta-listener v0.0.8-0.20250722005411-61419dc4a141
|
||||
github.com/go-i2p/go-select-cache v0.0.0-20250722003334-fba8c5bb610f
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/42wim/httpsig v1.2.3 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||||
github.com/cretz/bine v0.2.0 // indirect
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||
github.com/go-i2p/i2pkeys v0.33.10-0.20241113193422-e10de5e60708 // indirect
|
||||
github.com/go-i2p/sam3 v0.33.9 // indirect
|
||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
||||
github.com/dustin/go-humanize v1.0.1 // indirect
|
||||
github.com/go-i2p/i2pkeys v0.33.92 // indirect
|
||||
github.com/go-i2p/logger v0.0.0-20241123010126-3050657e5d0c // indirect
|
||||
github.com/go-i2p/onramp v0.33.92 // indirect
|
||||
github.com/go-i2p/sam3 v0.33.92 // indirect
|
||||
github.com/gobwas/glob v0.2.3 // indirect
|
||||
github.com/golang-jwt/jwt/v5 v5.2.3 // indirect
|
||||
github.com/golang/snappy v1.0.0 // indirect
|
||||
github.com/google/pprof v0.0.0-20250630185457-6e76a2b096b5 // indirect
|
||||
github.com/json-iterator/go v1.1.12 // indirect
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
github.com/mattn/go-sqlite3 v1.14.28 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/nxadm/tail v1.4.11 // indirect
|
||||
github.com/oklog/ulid/v2 v2.1.1 // indirect
|
||||
github.com/opd-ai/wileedot v0.0.0-20241217172720-521d4175e624 // indirect
|
||||
github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||
github.com/redis/go-redis/v9 v9.11.0 // indirect
|
||||
github.com/samber/lo v1.51.0 // indirect
|
||||
github.com/samber/oops v1.19.0 // indirect
|
||||
github.com/sirupsen/logrus v1.9.3 // indirect
|
||||
github.com/stretchr/testify v1.10.0 // indirect
|
||||
golang.org/x/crypto v0.32.0 // indirect
|
||||
golang.org/x/net v0.34.0 // indirect
|
||||
golang.org/x/sys v0.29.0 // indirect
|
||||
golang.org/x/text v0.21.0 // indirect
|
||||
github.com/syndtr/goleveldb v1.0.0 // indirect
|
||||
go.opentelemetry.io/otel v1.37.0 // indirect
|
||||
go.opentelemetry.io/otel/trace v1.37.0 // indirect
|
||||
golang.org/x/crypto v0.40.0 // indirect
|
||||
golang.org/x/net v0.42.0 // indirect
|
||||
golang.org/x/sys v0.34.0 // indirect
|
||||
golang.org/x/text v0.27.0 // indirect
|
||||
golang.org/x/time v0.12.0 // indirect
|
||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
||||
|
126
go.sum
126
go.sum
@@ -1,51 +1,149 @@
|
||||
code.gitea.io/gitea v1.24.3 h1:oKRO/ANVKFxKg7JNNTamVOjlu3IYWEhFW3b4Btsy/80=
|
||||
code.gitea.io/gitea v1.24.3/go.mod h1:ZVUHkQWAzYNx30ousZMpr75aRXlt9VHMEtN5uJpj+vY=
|
||||
github.com/42wim/httpsig v1.2.3 h1:xb0YyWhkYj57SPtfSttIobJUPJZB9as1nsfo7KWVcEs=
|
||||
github.com/42wim/httpsig v1.2.3/go.mod h1:nZq9OlYKDrUBhptd77IHx4/sZZD+IxTBADvAPI9G/EM=
|
||||
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
|
||||
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
|
||||
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
|
||||
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
|
||||
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/cretz/bine v0.2.0 h1:8GiDRGlTgz+o8H9DSnsl+5MeBK4HsExxgl6WgzOCuZo=
|
||||
github.com/cretz/bine v0.2.0/go.mod h1:WU4o9QR9wWp8AVKtTM1XD5vUHkEqnf2vVSo6dBqbetI=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/go-i2p/go-meta-listener v0.0.0-20250419155249-feebe95fe95a h1:oKKNMSDp73q31UoAiFQD//xV4EeP70/TqsBzQAVKTAU=
|
||||
github.com/go-i2p/go-meta-listener v0.0.0-20250419155249-feebe95fe95a/go.mod h1:wF/MCCfB40gZyT9WtuYWQkUOPrnoTzA+NG0zpsy3s4M=
|
||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
|
||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
|
||||
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
|
||||
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
|
||||
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
|
||||
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
||||
github.com/go-i2p/go-limit v0.0.0-20250718212214-52e5c6fec5d8 h1:eKJ5X3wWYg/ln8C2G9Ibp3bUn8Qg8sYe28Uthypmb9g=
|
||||
github.com/go-i2p/go-limit v0.0.0-20250718212214-52e5c6fec5d8/go.mod h1:4jjmVRhvKj47sQ6B6wdDhN1IrEZunE6KwkYLQx/BeVE=
|
||||
github.com/go-i2p/go-meta-dialer v0.0.0-20250527012419-b550471a50a5 h1:Y+zm4rSJrweLQcE1/4zoJBZ/7GYumTNm6swcs9ejC/I=
|
||||
github.com/go-i2p/go-meta-dialer v0.0.0-20250527012419-b550471a50a5/go.mod h1:++xHSOvnGymRSyFbi9A9hztcfwKfU6/nJAtVxrNo8Zo=
|
||||
github.com/go-i2p/go-meta-listener v0.0.8-0.20250722005411-61419dc4a141 h1:1+Jr+1l1tko2BpM41mhOCsQ7e+Y/x8Re/Jmrrwz+0LI=
|
||||
github.com/go-i2p/go-meta-listener v0.0.8-0.20250722005411-61419dc4a141/go.mod h1:lWBcqf1Se/3yrc3dtglP7jHKNRKTIiZzEP+aW0qamzg=
|
||||
github.com/go-i2p/go-select-cache v0.0.0-20250722003334-fba8c5bb610f h1:Zh5oyecB8nONOlVlrGHXCqkk3gam7/6I/LR+BYF2Wuc=
|
||||
github.com/go-i2p/go-select-cache v0.0.0-20250722003334-fba8c5bb610f/go.mod h1:ABhJNyNBEHNbLYhRoqOsxHAkOKCFR41SSpwdKNfx8RU=
|
||||
github.com/go-i2p/i2pkeys v0.0.0-20241108200332-e4f5ccdff8c4/go.mod h1:m5TlHjPZrU5KbTd7Lr+I2rljyC6aJ88HdkeMQXV0U0E=
|
||||
github.com/go-i2p/i2pkeys v0.33.10-0.20241113193422-e10de5e60708 h1:Tiy9IBwi21maNpK74yCdHursJJMkyH7w87tX1nXGWzg=
|
||||
github.com/go-i2p/i2pkeys v0.33.10-0.20241113193422-e10de5e60708/go.mod h1:m5TlHjPZrU5KbTd7Lr+I2rljyC6aJ88HdkeMQXV0U0E=
|
||||
github.com/go-i2p/i2pkeys v0.33.92 h1:e2vx3vf7tNesaJ8HmAlGPOcfiGM86jzeIGxh27I9J2Y=
|
||||
github.com/go-i2p/i2pkeys v0.33.92/go.mod h1:BRURQ/twxV0WKjZlFSKki93ivBi+MirZPWudfwTzMpE=
|
||||
github.com/go-i2p/logger v0.0.0-20241123010126-3050657e5d0c h1:VTiECn3dFEmUlZjto+wOwJ7SSJTHPLyNprQMR5HzIMI=
|
||||
github.com/go-i2p/logger v0.0.0-20241123010126-3050657e5d0c/go.mod h1:te7Zj3g3oMeIl8uBXAgO62UKmZ6m6kHRNg1Mm+X8Hzk=
|
||||
github.com/go-i2p/onramp v0.33.92 h1:Dk3A0SGpdEw829rSjW2LqN8o16pUvuhiN0vn36z7Gpc=
|
||||
github.com/go-i2p/onramp v0.33.92/go.mod h1:5sfB8H2xk05gAS2K7XAUZ7ekOfwGJu3tWF0fqdXzJG4=
|
||||
github.com/go-i2p/sam3 v0.33.9 h1:3a+gunx75DFc6jxloUZTAVJbdP6736VU1dy2i7I9fKA=
|
||||
github.com/go-i2p/sam3 v0.33.9/go.mod h1:oDuV145l5XWKKafeE4igJHTDpPwA0Yloz9nyKKh92eo=
|
||||
github.com/go-i2p/sam3 v0.33.92 h1:TVpi4GH7Yc7nZBiE1QxLjcZfnC4fI/80zxQz1Rk36BA=
|
||||
github.com/go-i2p/sam3 v0.33.92/go.mod h1:oDuV145l5XWKKafeE4igJHTDpPwA0Yloz9nyKKh92eo=
|
||||
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
|
||||
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
|
||||
github.com/golang-jwt/jwt/v5 v5.2.3 h1:kkGXqQOBSDDWRhWNXTFpqGSCMyh/PLnqUvMGJPDJDs0=
|
||||
github.com/golang-jwt/jwt/v5 v5.2.3/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs=
|
||||
github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/pprof v0.0.0-20250630185457-6e76a2b096b5 h1:xhMrHhTJ6zxu3gA4enFM9MLn9AY7613teCdFnlUVbSQ=
|
||||
github.com/google/pprof v0.0.0-20250630185457-6e76a2b096b5/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
|
||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
|
||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/mattn/go-sqlite3 v1.14.28 h1:ThEiQrnbtumT+QMknw63Befp/ce/nUPgBPMlRFEum7A=
|
||||
github.com/mattn/go-sqlite3 v1.14.28/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
|
||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
||||
github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY=
|
||||
github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc=
|
||||
github.com/oklog/ulid/v2 v2.1.1 h1:suPZ4ARWLOJLegGFiZZ1dFAkqzhMjL3J1TzI+5wHz8s=
|
||||
github.com/oklog/ulid/v2 v2.1.1/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ=
|
||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
|
||||
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
|
||||
github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU=
|
||||
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
github.com/opd-ai/wileedot v0.0.0-20241217172720-521d4175e624 h1:FXCTQV93+31Yj46zpYbd41es+EYgT7qi4RK6KSVrGQM=
|
||||
github.com/opd-ai/wileedot v0.0.0-20241217172720-521d4175e624/go.mod h1:ftKSvvGC9FnxZeuL3B4MB6q/DOzVSV0kET08YUyDwbM=
|
||||
github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
|
||||
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
|
||||
github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/redis/go-redis/v9 v9.11.0 h1:E3S08Gl/nJNn5vkxd2i78wZxWAPNZgUNTp8WIJUAiIs=
|
||||
github.com/redis/go-redis/v9 v9.11.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw=
|
||||
github.com/samber/lo v1.51.0 h1:kysRYLbHy/MB7kQZf5DSN50JHmMsNEdeY24VzJFu7wI=
|
||||
github.com/samber/lo v1.51.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0=
|
||||
github.com/samber/oops v1.19.0 h1:sfZAwC8MmTXBRRyNc4Z1utuTPBx+hFKF5fJ9DEQRZfw=
|
||||
github.com/samber/oops v1.19.0/go.mod h1:+f+61dbiMxEMQ8gw/zTxW2pk+YGobaDM4glEHQtPOww=
|
||||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
||||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
|
||||
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
|
||||
go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
|
||||
go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
|
||||
go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
|
||||
go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
|
||||
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
|
||||
golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
|
||||
golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
|
||||
golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
|
||||
golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
|
||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
|
||||
golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
|
||||
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
|
||||
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
|
||||
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
|
||||
golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg=
|
||||
golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
|
||||
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
|
||||
golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
|
||||
golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
|
||||
golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
|
||||
golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
|
||||
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
|
26
install.sh
Executable file
26
install.sh
Executable file
@@ -0,0 +1,26 @@
|
||||
#! /usr/bin/env sh
|
||||
|
||||
# AS ROOT
|
||||
|
||||
adduser \
|
||||
--system \
|
||||
--shell /bin/bash \
|
||||
--gecos 'Git Version Control' \
|
||||
--group \
|
||||
--disabled-password \
|
||||
--home /home/git \
|
||||
git
|
||||
|
||||
mkdir -p /var/lib/gitea/{custom,data,log}
|
||||
chown -R git:git /var/lib/gitea/
|
||||
chmod -R 750 /var/lib/gitea/
|
||||
mkdir /etc/gitea
|
||||
chown root:git /etc/gitea
|
||||
chmod 770 /etc/gitea
|
||||
killall gitea
|
||||
sleep 3s
|
||||
GITEA_URL=https://github.com/go-i2p/go-gitlooseleaf/releases/download/nightly/gitea-Linux
|
||||
wget -O /usr/local/bin/gitea "$GITEA_URL"
|
||||
chmod +x /usr/local/bin/gitea
|
||||
setcap CAP_NET_BIND_SERVICE=+eip /usr/local/bin/gitea
|
||||
su - git
|
@@ -7,8 +7,13 @@ import (
|
||||
"net"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/go-i2p/go-meta-listener/mirror"
|
||||
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
limitedlistener "github.com/go-i2p/go-limit"
|
||||
selectcache "github.com/go-i2p/go-select-cache"
|
||||
)
|
||||
|
||||
func hostname() string {
|
||||
@@ -51,8 +56,22 @@ func MultiGetListener(network, address string) (net.Listener, error) {
|
||||
return nil, err
|
||||
}
|
||||
return GetListenerUnixWrapper(network, unixAddr)
|
||||
|
||||
default:
|
||||
return mirrorListener.Listen(address, EMAIL, "./certs", true)
|
||||
ml, err := mirrorListener.Listen(address, EMAIL)
|
||||
mirror.CERT_DIR = filepath.Join(setting.CustomPath, "certs")
|
||||
mirror.HIDDEN_TLS = true
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
config := selectcache.DefaultCacheConfig()
|
||||
config.MaxMemoryMB = 512
|
||||
config.MaxEntries = 10000
|
||||
// Wrap with caching listener
|
||||
return selectcache.NewCachingListener(limitedlistener.NewLimitedListener(ml,
|
||||
limitedlistener.WithMaxConnections(500), // max concurrent
|
||||
limitedlistener.WithRateLimit(24), // per second
|
||||
), config), nil
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -2,43 +2,13 @@ package graceful
|
||||
|
||||
import (
|
||||
"net"
|
||||
"net/url"
|
||||
"strings"
|
||||
|
||||
"github.com/go-i2p/onramp"
|
||||
)
|
||||
|
||||
var (
|
||||
Garlic, GarlicErr = onramp.NewGarlic("git-looseleaf", "127.0.0.1:7656", onramp.OPT_WIDE)
|
||||
Onion, OnionErr = onramp.NewOnion("git-looseleaf")
|
||||
metadialer "github.com/go-i2p/go-meta-dialer"
|
||||
)
|
||||
|
||||
func Dial(network, addr string) (net.Conn, error) {
|
||||
// convert the addr to a URL
|
||||
url, err := url.Parse(addr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// get the domain name
|
||||
domain := url.Hostname()
|
||||
// get the top-level domain
|
||||
fr := strings.Split(domain, ".")
|
||||
tld := fr[len(fr)-1]
|
||||
switch tld {
|
||||
case "i2p":
|
||||
if GarlicErr != nil {
|
||||
return nil, GarlicErr
|
||||
}
|
||||
// I2P is a special case, we need to use the garlic dialer
|
||||
return Garlic.Dial("i2p", addr)
|
||||
case "onion":
|
||||
if OnionErr != nil {
|
||||
return nil, OnionErr
|
||||
}
|
||||
// Onion is a special case, we need to use the onion dialer
|
||||
return Onion.Dial("onion", addr)
|
||||
default:
|
||||
// For everything else, we can use the default dialer
|
||||
return net.Dial(network, addr)
|
||||
if metadialer.ANON {
|
||||
metadialer.ANON = false
|
||||
}
|
||||
return metadialer.Dial(network, addr)
|
||||
}
|
||||
|
6
package-lock.json
generated
Normal file
6
package-lock.json
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"name": "go-gitlooseleaf",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {}
|
||||
}
|
16
postinst
Executable file
16
postinst
Executable file
@@ -0,0 +1,16 @@
|
||||
# only if we're root
|
||||
|
||||
if [ "$(id -u)" != "0" ]; then
|
||||
echo "This script must be run as root" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
BINARY_PATH=${BASE}/usr/local/bin/gitea
|
||||
SYSTEMD_PATH=${BASE}/etc/systemd/system
|
||||
CONFIG_PATH=${BASE}/etc/gitea
|
||||
DATA_PATH=${BASE}/var/lib/gitea
|
||||
|
||||
echo chown -R git:git "$DATA_PATH/"
|
||||
echo chmod -R 750 "$DATA_PATH/"
|
||||
echo chown root:git "$CONFIG_PATH"
|
||||
echo chmod 770 "$CONFIG_PATH"
|
18
preinst
Executable file
18
preinst
Executable file
@@ -0,0 +1,18 @@
|
||||
if [ "$(id -u)" != "0" ]; then
|
||||
echo "This script must be run as root" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
BINARY_PATH=${BASE}/usr/local/bin/gitea
|
||||
SYSTEMD_PATH=${BASE}/etc/systemd/system
|
||||
CONFIG_PATH=${BASE}/etc/gitea
|
||||
DATA_PATH=${BASE}/var/lib/gitea
|
||||
|
||||
echo "id -u git &>/dev/null || adduser \
|
||||
--system \
|
||||
--shell /bin/bash \
|
||||
--gecos 'Git Version Control' \
|
||||
--group \
|
||||
--disabled-password \
|
||||
--home /home/git \
|
||||
git"
|
Reference in New Issue
Block a user