mirror of
https://github.com/go-i2p/go-i2p.git
synced 2025-08-19 09:45:28 -04:00
Compare commits
514 Commits
no-more-by
...
main
Author | SHA1 | Date | |
---|---|---|---|
![]() |
61008ce988 | ||
![]() |
294cd52343 | ||
![]() |
322b431e8f | ||
![]() |
79df514a2f | ||
![]() |
36762c61c5 | ||
![]() |
a8ac47431e | ||
![]() |
bd947ec2ca | ||
![]() |
61700c8a05 | ||
![]() |
d6b8918a14 | ||
![]() |
43aa3a72a6 | ||
![]() |
5d04d24bc5 | ||
![]() |
f168794ca3 | ||
![]() |
9c9f19b904 | ||
![]() |
f176d4a97f | ||
![]() |
e89876903f | ||
![]() |
c6f8bf6447 | ||
![]() |
32075c20c7 | ||
![]() |
4862c0314c | ||
![]() |
7f57cebd3f | ||
![]() |
c418914e95 | ||
![]() |
0e12cbfb70 | ||
![]() |
a8a3d61a75 | ||
![]() |
96f7958543 | ||
![]() |
230646f34d | ||
![]() |
3b06be5eca | ||
![]() |
f4a89c74e0 | ||
![]() |
1529f18fa1 | ||
![]() |
3be24a6a42 | ||
![]() |
e4e8631b0e | ||
![]() |
2a3cfcfac3 | ||
![]() |
e1756bdf39 | ||
![]() |
975970152e | ||
![]() |
bd6ce7b25f | ||
![]() |
7470d80def | ||
![]() |
4997ceebae | ||
![]() |
637293f13e | ||
![]() |
2d083bfe90 | ||
![]() |
29388af798 | ||
![]() |
f9127c0998 | ||
![]() |
b9e73d816d | ||
![]() |
4edc7b392d | ||
![]() |
d7888ac9be | ||
![]() |
68408bb48e | ||
![]() |
4715b76ade | ||
![]() |
ac7e369b6a | ||
![]() |
7d51d83b40 | ||
![]() |
89c82cb2fe | ||
![]() |
808f7d6fdf | ||
![]() |
537ab808f8 | ||
![]() |
b41bb0eef8 | ||
![]() |
8787fea069 | ||
![]() |
fc9734d43d | ||
![]() |
0a262d5780 | ||
![]() |
2f233e931d | ||
![]() |
e9991099b7 | ||
![]() |
761dcb5f98 | ||
![]() |
f68d9b5606 | ||
![]() |
9fd3400585 | ||
![]() |
c85822163b | ||
![]() |
e2fdb7c4e0 | ||
![]() |
1babf06091 | ||
![]() |
62e565b36c | ||
![]() |
c7a17eac86 | ||
![]() |
89e53fdb9f | ||
![]() |
ebdd1ae0aa | ||
![]() |
b65f6c2682 | ||
![]() |
14a0e56f6a | ||
![]() |
4a89c14734 | ||
![]() |
09fe22178d | ||
![]() |
ef156f6944 | ||
![]() |
a4acb01be9 | ||
![]() |
dd116095aa | ||
![]() |
1922f3a0ab | ||
![]() |
2a28c8ee01 | ||
![]() |
9cb4af8f06 | ||
![]() |
56faebd746 | ||
![]() |
8b035711b6 | ||
![]() |
c93b258844 | ||
![]() |
2df5d23528 | ||
![]() |
98ea3d55c4 | ||
![]() |
b5454a4317 | ||
![]() |
83502face7 | ||
![]() |
c99b15ba7f | ||
![]() |
8e73c36922 | ||
![]() |
89b1995593 | ||
![]() |
4577408d6d | ||
![]() |
e7e26ae021 | ||
![]() |
1d1568de71 | ||
![]() |
b21a6cee9e | ||
![]() |
35b47969b0 | ||
![]() |
816df5642c | ||
![]() |
1bd439f989 | ||
![]() |
6158eb68f3 | ||
![]() |
03eeeab781 | ||
![]() |
0099392f6d | ||
![]() |
a09f155835 | ||
![]() |
fa561fc431 | ||
![]() |
c5125c1bfd | ||
![]() |
9e1bac3ff1 | ||
![]() |
b4e1f3cfdf | ||
![]() |
d4ff0e373c | ||
![]() |
0c9c8270a5 | ||
![]() |
f2bacc5018 | ||
![]() |
94691f1e75 | ||
![]() |
8c4f718601 | ||
![]() |
9a0d164276 | ||
![]() |
f3f5d744ed | ||
![]() |
3b9fb603f4 | ||
![]() |
29d5a20216 | ||
![]() |
3c252e22cd | ||
![]() |
dcb11d1fda | ||
![]() |
a721856688 | ||
![]() |
b66c5813cb | ||
![]() |
441549743d | ||
![]() |
30f84713ea | ||
![]() |
6057677956 | ||
![]() |
c026b9a4a5 | ||
![]() |
9c6cfc14e5 | ||
![]() |
4533c2fd92 | ||
![]() |
89e51820f1 | ||
![]() |
17a789bed7 | ||
![]() |
d236f19f81 | ||
![]() |
d0b81d9ce9 | ||
![]() |
06cf6b41b4 | ||
![]() |
ac8349d083 | ||
![]() |
45296be6d3 | ||
![]() |
1f25f0c9b3 | ||
![]() |
d1a708a594 | ||
![]() |
b153bfc050 | ||
![]() |
d401b06c0f | ||
![]() |
9091834074 | ||
![]() |
8561b3ec69 | ||
![]() |
8aac97351d | ||
![]() |
3142a394aa | ||
![]() |
f2b6d4bc01 | ||
![]() |
fa0a42855c | ||
![]() |
3212cae276 | ||
![]() |
ad7bac666b | ||
![]() |
ba0c89d567 | ||
![]() |
6a64b28bb3 | ||
![]() |
9fa714f648 | ||
![]() |
eda403443d | ||
![]() |
84cc45d3e4 | ||
![]() |
598ee1eb70 | ||
![]() |
bd6edf446d | ||
![]() |
94e43f8aa6 | ||
![]() |
7bdaf6d4ea | ||
![]() |
393263294e | ||
![]() |
55f92bdd8a | ||
![]() |
8ea238f3dd | ||
![]() |
91d8b30495 | ||
![]() |
ea4d126358 | ||
![]() |
f46bd95b68 | ||
![]() |
35eb66084b | ||
![]() |
a9289dd4d3 | ||
![]() |
7f78fdf784 | ||
![]() |
ae4970b3a9 | ||
![]() |
3d6a08a76b | ||
![]() |
18b2afe828 | ||
![]() |
c6867e0b16 | ||
![]() |
d0b4db769e | ||
![]() |
26a9a00b34 | ||
![]() |
99df4c7ce8 | ||
![]() |
b95b0c4fa3 | ||
![]() |
036f9116a5 | ||
![]() |
d97624282e | ||
![]() |
46af6d55ef | ||
![]() |
9591f496eb | ||
![]() |
71fff44d4b | ||
![]() |
6b2f231c36 | ||
![]() |
4eeaf915f0 | ||
![]() |
440b9e8118 | ||
![]() |
8bc5ca162a | ||
![]() |
bd92221d56 | ||
![]() |
22111a6cb7 | ||
![]() |
74d2998e10 | ||
![]() |
0b89baf98b | ||
![]() |
daac1a59b5 | ||
![]() |
6f65a7c068 | ||
![]() |
db91315582 | ||
![]() |
5f3a7f2340 | ||
![]() |
8494da07a7 | ||
![]() |
832e0d9114 | ||
![]() |
8d56d033ae | ||
![]() |
ad22d3e249 | ||
![]() |
f55788e8ab | ||
![]() |
2a4f4d6186 | ||
![]() |
ca1180c57f | ||
![]() |
76c3e5f293 | ||
![]() |
91abe52725 | ||
![]() |
a0ad9e0122 | ||
![]() |
b23edc28d1 | ||
![]() |
b547faf286 | ||
![]() |
a145555bb2 | ||
![]() |
280c877d39 | ||
![]() |
ef4d4658c0 | ||
![]() |
15bf28403e | ||
![]() |
b40c0ab6f9 | ||
![]() |
b952be5e08 | ||
![]() |
aafbf74986 | ||
![]() |
3cdc5676eb | ||
![]() |
d41efdba0e | ||
![]() |
edc436ac39 | ||
![]() |
414b489b37 | ||
![]() |
da875738e4 | ||
![]() |
2a027ebb6c | ||
![]() |
d658dee6de | ||
![]() |
8fde3c9400 | ||
![]() |
9421374384 | ||
![]() |
daad2dcacd | ||
![]() |
5f8dc3f9a2 | ||
![]() |
9cc2e8f410 | ||
![]() |
6ac46aa747 | ||
![]() |
5548b865b4 | ||
![]() |
55245b2aa7 | ||
![]() |
208051f92d | ||
![]() |
8a672ca6ca | ||
![]() |
45def9dd0c | ||
![]() |
cb1da321b9 | ||
![]() |
d291624436 | ||
![]() |
a58f64566f | ||
![]() |
891d915bb2 | ||
![]() |
a0a8704c6c | ||
![]() |
c68acf848e | ||
![]() |
7a6927cf53 | ||
![]() |
37e11ffee1 | ||
![]() |
e15e427f60 | ||
![]() |
f0803a095e | ||
![]() |
bf7e88bec1 | ||
![]() |
065ceeb88f | ||
![]() |
ca4a7a13ea | ||
![]() |
0b0753cac1 | ||
![]() |
40c2c4806c | ||
![]() |
9e3c8bcb98 | ||
![]() |
9b4bf2663d | ||
![]() |
4a6f49d14a | ||
![]() |
5d789973b2 | ||
![]() |
08127861f1 | ||
![]() |
0e6ffd856b | ||
![]() |
10daacbc9b | ||
![]() |
eeb1e215a5 | ||
![]() |
08e599e59a | ||
![]() |
30f5565217 | ||
![]() |
fc3ba17af5 | ||
![]() |
631f8d1850 | ||
![]() |
cc43160bb9 | ||
![]() |
09acf3d23d | ||
![]() |
cbe4af8459 | ||
![]() |
b72ed0a37d | ||
![]() |
07268df720 | ||
![]() |
def8789b77 | ||
![]() |
59c53bc5c1 | ||
![]() |
ee56e0f40f | ||
![]() |
4e2b55ccbe | ||
![]() |
64d90a157c | ||
![]() |
3acff32f17 | ||
![]() |
362513bbe5 | ||
![]() |
c9f3227116 | ||
![]() |
f0702ffba9 | ||
![]() |
11b9018630 | ||
![]() |
f6daa5d9b6 | ||
![]() |
58d1f0d815 | ||
![]() |
62ececf102 | ||
![]() |
1d90db3239 | ||
![]() |
f729bda62d | ||
![]() |
4ad0f97bfe | ||
![]() |
e296441f29 | ||
![]() |
62086c7d04 | ||
![]() |
ddba94d6ae | ||
![]() |
767b91df49 | ||
![]() |
1292098cf0 | ||
![]() |
24bc4c3c17 | ||
![]() |
81eb270351 | ||
![]() |
b6f197cf92 | ||
![]() |
c10d98a3b2 | ||
![]() |
6d16ca5f87 | ||
![]() |
003d6c9ab8 | ||
![]() |
015c4b23e2 | ||
![]() |
e29c3c7abb | ||
![]() |
6f6291a9f6 | ||
![]() |
767864d457 | ||
![]() |
0a98236d85 | ||
![]() |
c1fa63f6ec | ||
![]() |
a75c275b4c | ||
![]() |
d40b3e0cd3 | ||
![]() |
2ee2d77d7c | ||
![]() |
df45c19272 | ||
![]() |
f6894e9064 | ||
![]() |
b36ef65a10 | ||
![]() |
271cf56ded | ||
![]() |
a29fa0bc03 | ||
![]() |
63c48dd3b7 | ||
![]() |
8bec47efd2 | ||
![]() |
69a50e2035 | ||
![]() |
8319444890 | ||
![]() |
b378661e0e | ||
![]() |
f4086e5f68 | ||
![]() |
877fc707c4 | ||
![]() |
98d05e27c8 | ||
![]() |
8c2b952616 | ||
![]() |
4020db8a19 | ||
![]() |
67a02f5d69 | ||
![]() |
ca1280231c | ||
![]() |
02b309df43 | ||
![]() |
a5b3c3f194 | ||
![]() |
0aa7a5554b | ||
![]() |
266a1b71d6 | ||
![]() |
d32f2e78ab | ||
![]() |
9e806bc32e | ||
![]() |
c52112a36f | ||
![]() |
db0fd9f7e9 | ||
![]() |
3ab258cde6 | ||
![]() |
20b9bbd8e4 | ||
![]() |
1fa520613c | ||
![]() |
fb99b98a7e | ||
![]() |
d6b8cd9d4d | ||
![]() |
92e4656774 | ||
![]() |
5f2bfb8d9d | ||
![]() |
9494c226a6 | ||
![]() |
344edc6d41 | ||
![]() |
9eea99b489 | ||
![]() |
c984f94b90 | ||
![]() |
a17f0208dd | ||
![]() |
487815f8f1 | ||
![]() |
24e0baa879 | ||
![]() |
a5d2f0de8c | ||
![]() |
423f616d53 | ||
![]() |
c65048f3c4 | ||
![]() |
39b683dac8 | ||
![]() |
46883f6457 | ||
![]() |
4be55062fc | ||
![]() |
12a3fd4623 | ||
![]() |
80e539930e | ||
![]() |
e58d326d89 | ||
![]() |
e6f84c16f6 | ||
![]() |
971a18de8d | ||
![]() |
833836ae67 | ||
![]() |
3f191db37a | ||
![]() |
6865bae386 | ||
![]() |
f0d9f89ed9 | ||
![]() |
c149eef1de | ||
![]() |
748dc8a66f | ||
![]() |
677aac500e | ||
![]() |
4e06d3d5ed | ||
![]() |
5eaa9cf588 | ||
![]() |
4dbf537e94 | ||
![]() |
882c018c0c | ||
![]() |
5432502852 | ||
![]() |
0ea5743365 | ||
![]() |
a9dc482bda | ||
![]() |
c31d20fec0 | ||
![]() |
647546a374 | ||
![]() |
e468520906 | ||
![]() |
ade80e577c | ||
![]() |
f45d301868 | ||
![]() |
0256908395 | ||
![]() |
3c5aa206d1 | ||
![]() |
a4517cafd7 | ||
![]() |
f4f39ca53c | ||
![]() |
220159476a | ||
![]() |
792cd49208 | ||
![]() |
68051630c0 | ||
![]() |
a3340eb40a | ||
![]() |
465a7787a9 | ||
![]() |
af3bc44dba | ||
![]() |
f850f482cf | ||
![]() |
3f23376d22 | ||
![]() |
aa98589f1c | ||
![]() |
c31e990995 | ||
![]() |
8e97eb5f77 | ||
![]() |
be35267079 | ||
![]() |
013d35b447 | ||
![]() |
e8c9dc17a3 | ||
![]() |
a1d574446b | ||
![]() |
8680acc595 | ||
![]() |
84e3c5accc | ||
![]() |
e772fb5ceb | ||
![]() |
a533cd7ce4 | ||
![]() |
df37d49444 | ||
![]() |
4b2600a065 | ||
![]() |
1c4f937002 | ||
![]() |
5c2b408f65 | ||
![]() |
beb533a09b | ||
![]() |
f022522ad5 | ||
![]() |
2191c40ac6 | ||
![]() |
3bca467f28 | ||
![]() |
a2fd65ee32 | ||
![]() |
b894e8fb17 | ||
![]() |
93a71c7398 | ||
![]() |
b6544ad194 | ||
![]() |
a72b61a886 | ||
![]() |
dda4f90b6f | ||
![]() |
1d1d8126c2 | ||
![]() |
73db39ae50 | ||
![]() |
53e902f491 | ||
![]() |
2f2cd2249c | ||
![]() |
4496c11394 | ||
![]() |
69449a20b5 | ||
![]() |
a7689e801a | ||
![]() |
278bdee277 | ||
![]() |
684e89c957 | ||
![]() |
50fa9fc374 | ||
![]() |
491b25022e | ||
![]() |
677a6b354b | ||
![]() |
9469fd83aa | ||
![]() |
8173ae49e6 | ||
![]() |
2f109d5b4d | ||
![]() |
d7378d7b08 | ||
![]() |
3a51a1229e | ||
![]() |
2b18b2941d | ||
![]() |
1eb29ec4ab | ||
![]() |
d900d7faf8 | ||
![]() |
03c9d60ab9 | ||
![]() |
de2caf499e | ||
![]() |
284dd7287e | ||
![]() |
9f4154ff45 | ||
![]() |
08a0d92742 | ||
![]() |
524526d946 | ||
![]() |
09c7d32797 | ||
![]() |
16961abc96 | ||
![]() |
8fa355f067 | ||
![]() |
0c7a3f0f22 | ||
![]() |
3d535f67a1 | ||
![]() |
bba9350506 | ||
![]() |
cbc0de4e7e | ||
![]() |
310ef07d3c | ||
![]() |
14fc6fc3a8 | ||
![]() |
a3ce9d36c6 | ||
![]() |
58a43cdfaf | ||
![]() |
15a5ca5daf | ||
![]() |
08a41686b6 | ||
![]() |
8318fd8f57 | ||
![]() |
9c0552e236 | ||
![]() |
20b018a708 | ||
![]() |
6c62faa49b | ||
![]() |
a7e31b7833 | ||
![]() |
c09161c824 | ||
![]() |
aca62174e6 | ||
![]() |
bd27f00959 | ||
![]() |
05c4d3d973 | ||
![]() |
40d0ea5ff5 | ||
![]() |
58e8f78c56 | ||
![]() |
ac705dee76 | ||
![]() |
ca0443ae6a | ||
![]() |
94d0d8efb7 | ||
![]() |
8176e126cb | ||
![]() |
992c5537db | ||
![]() |
5ff9f5578e | ||
![]() |
889ec939b3 | ||
![]() |
6e3a5923cd | ||
![]() |
ce25a2f0fb | ||
![]() |
ec22860bb5 | ||
![]() |
cefdcd8c14 | ||
![]() |
d519f7678d | ||
![]() |
8dfc5ee5b8 | ||
![]() |
d8317351cf | ||
![]() |
ef127d81c1 | ||
![]() |
8acfba160f | ||
![]() |
d93e78d772 | ||
![]() |
bdc9ca4c2b | ||
![]() |
83f3d11621 | ||
![]() |
784f72403b | ||
![]() |
664a17e42a | ||
![]() |
37718c36f8 | ||
![]() |
b0fcf4bc11 | ||
![]() |
65febb5dcf | ||
![]() |
116e22f8da | ||
![]() |
0419665d7b | ||
![]() |
dab108c270 | ||
![]() |
0fcded4c51 | ||
![]() |
7d16b0b257 | ||
![]() |
a689f26d73 | ||
![]() |
8d631239b7 | ||
![]() |
fdc34b382e | ||
![]() |
a4ed06e530 | ||
![]() |
c6e359f152 | ||
![]() |
70415b34eb | ||
![]() |
dbd4c7d346 | ||
![]() |
6b5ea57cbd | ||
![]() |
43c3498389 | ||
![]() |
f90d1d5f42 | ||
![]() |
c8c4196c6f | ||
![]() |
68a6ed02be | ||
![]() |
53dd3230df | ||
![]() |
c3147c3570 | ||
![]() |
76fba3c8ba | ||
![]() |
0cae80c698 | ||
![]() |
7deba5f725 | ||
![]() |
35983423ed | ||
![]() |
136133e643 | ||
![]() |
8d39f1512a | ||
![]() |
c9b5fa1406 | ||
![]() |
cdc9998f10 | ||
![]() |
4c06fcaff0 | ||
![]() |
403ef30119 | ||
![]() |
feef6e6bbf | ||
![]() |
ad7a828d43 | ||
![]() |
416cf6546a | ||
![]() |
9b81a5c6d8 | ||
![]() |
940347351e | ||
![]() |
726bff974c | ||
![]() |
74591a96cb | ||
![]() |
eb117aa1bd | ||
![]() |
88d8d09527 | ||
![]() |
83e999992f | ||
![]() |
a437bab373 | ||
![]() |
2d310fe91a | ||
![]() |
fefbfc4be6 | ||
![]() |
0ec4f55fa9 | ||
![]() |
8bd30d1e23 | ||
![]() |
b7768d4d99 | ||
![]() |
171f09bba6 | ||
![]() |
13b996d0da | ||
![]() |
82f0e86931 |
19
.github/workflows/auto-assign.yml
vendored
Normal file
19
.github/workflows/auto-assign.yml
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
name: Auto Assign
|
||||
on:
|
||||
issues:
|
||||
types: [opened]
|
||||
pull_request:
|
||||
types: [opened]
|
||||
jobs:
|
||||
run:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: 'Auto-assign issue'
|
||||
uses: pozil/auto-assign-issue@v1
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
assignees: eyedeekay
|
||||
numOfAssignee: 1
|
60
.github/workflows/page.yml
vendored
Normal file
60
.github/workflows/page.yml
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
name: Generate and Deploy GitHub Pages
|
||||
|
||||
on:
|
||||
# Run once hourly
|
||||
schedule:
|
||||
- cron: '0 * * * *'
|
||||
# Allow manual trigger
|
||||
workflow_dispatch:
|
||||
# Run on pushes to main branch
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
build-and-deploy:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0 # Fetch all history for proper repo data
|
||||
|
||||
- name: Set up Go
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: '1.24.x'
|
||||
cache: true
|
||||
|
||||
- name: Build Site Generator
|
||||
run: |
|
||||
go install github.com/go-i2p/go-gh-page/cmd/github-site-gen@latest
|
||||
export GOBIN=$(go env GOPATH)/bin
|
||||
cp -v "$GOBIN/github-site-gen" ./github-site-gen
|
||||
# Ensure the binary is executable
|
||||
chmod +x github-site-gen
|
||||
|
||||
- name: Generate Site
|
||||
run: |
|
||||
# Determine current repository owner and name
|
||||
REPO_OWNER=$(echo $GITHUB_REPOSITORY | cut -d '/' -f 1)
|
||||
REPO_NAME=$(echo $GITHUB_REPOSITORY | cut -d '/' -f 2)
|
||||
|
||||
# Generate the site
|
||||
./github-site-gen -repo "${REPO_OWNER}/${REPO_NAME}" -output ./site
|
||||
|
||||
# Create a .nojekyll file to disable Jekyll processing
|
||||
touch ./site/.nojekyll
|
||||
|
||||
# Add a .gitattributes file to ensure consistent line endings
|
||||
echo "* text=auto" > ./site/.gitattributes
|
||||
|
||||
- name: Deploy to GitHub Pages
|
||||
uses: JamesIves/github-pages-deploy-action@v4
|
||||
with:
|
||||
folder: site # The folder the action should deploy
|
||||
branch: gh-pages # The branch the action should deploy to
|
||||
clean: true # Automatically remove deleted files from the deploy branch
|
||||
commit-message: "Deploy site generated on ${{ github.sha }}"
|
62
.github/workflows/tests.yml
vendored
Normal file
62
.github/workflows/tests.yml
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
name: Go Tests
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main, master ]
|
||||
pull_request:
|
||||
branches: [ main, master ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: '1.21'
|
||||
- run: make build
|
||||
env:
|
||||
GO: go
|
||||
CGO_ENABLED: 0
|
||||
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Go
|
||||
uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: '1.21' # Adjust this version as needed
|
||||
|
||||
- name: Cache Go modules
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
~/go/pkg/mod
|
||||
~/.cache/go-build
|
||||
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-go-
|
||||
|
||||
- name: Install gofumpt
|
||||
run: go install mvdan.cc/gofumpt@latest
|
||||
|
||||
- name: Go mod tidy
|
||||
run: go mod tidy
|
||||
|
||||
- name: Run all tests
|
||||
run: go test -v ./...
|
||||
env:
|
||||
GO: go
|
||||
DEBUG_I2P: debug
|
||||
CGO_ENABLED: 0
|
||||
|
||||
- name: Upload Test Logs
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ matrix.test_target }}-logs
|
||||
path: ./test-logs/${{ matrix.test_target }}.log # Adjust this path as needed
|
6
.gitignore
vendored
6
.gitignore
vendored
@@ -6,3 +6,9 @@
|
||||
*exportable-fuzz.zip
|
||||
go-i2p
|
||||
*.exe
|
||||
.idea/
|
||||
router.info
|
||||
log
|
||||
*.gv
|
||||
diff
|
||||
err
|
@@ -1,20 +1,35 @@
|
||||
# Contributing
|
||||
|
||||
Thanks for taking a look at go-i2p! Please reach out if you have any questions or need help getting started.
|
||||
Thanks for taking a look at go-i2p! Please reach out if you have any questions or need help getting started. We have an IRC channel on IRC2P: #go-i2p-dev and we're reachable here at github.com/go-i2p also.
|
||||
|
||||
## Getting Starting
|
||||
## Getting Started
|
||||
|
||||
Install required dependencies
|
||||
|
||||
This example assumes Ubuntu 16.04
|
||||
This example assumes Ubuntu or Debian based Linux, a reasonably modern version.
|
||||
The instructions will be similar for other Linux distributions with slightly different package managers and package names.
|
||||
|
||||
```sh
|
||||
go get github.com/hkparker/go-i2p
|
||||
go get github.com/Sirupsen/logrus
|
||||
go get github.com/stretchr/testify/assert
|
||||
# For obtaining, modifying, compiling, and tracking changes to go-i2p, install:
|
||||
sudo apt-get install golang-go make git
|
||||
# If you want to generate markdown versions of the godoc locally, also install:
|
||||
go install github.com/robertkrimen/godocdown/godocdown@master
|
||||
# If you want to generate call graphs locally, also install:
|
||||
go install github.com/ofabry/go-callvis@master
|
||||
```
|
||||
|
||||
Fork go-i2p and clone it into your workspace. Make sure you can execute `go test ./...` in the project's root directory. At that point you should have everything you need to start making changes and opening pull requests. If you aren't sure what to work on, take a look at some good [getting started issues](https://github.com/hkparker/go-i2p/issues?q=is%3Aopen+is%3Aissue+label%3A%22start+here%22).
|
||||
On Windows, one must install the latest versions of Go and Git Bash from their respective sources.
|
||||
|
||||
## Set up your workspace:
|
||||
|
||||
```sh
|
||||
github_username=yourusername
|
||||
cd $(go env GOPATH)
|
||||
git clone git@github.com:$github_username/go-i2p github.com/go-i2p/go-i2p
|
||||
github.com/go-i2p/go-i2p
|
||||
```
|
||||
|
||||
Fork go-i2p and clone it into your workspace. Make sure you can execute `go test ./...` in the project's root directory. At that point you should have everything you need to start making changes and opening pull requests.
|
||||
|
||||
## I2P Specifications
|
||||
|
||||
@@ -26,9 +41,17 @@ The I2P community maintains up-to-date [specifications](https://geti2p.net/spec)
|
||||
|
||||
## Conventions
|
||||
|
||||
#### Errors
|
||||
|
||||
We use oops to provide context to the errors we return. Do not use `errors.New` or `fmt.Errorf` when returning errors from functions. Instead, wrap raw errors in oops errors. When an error is recieved, used oops to supplement the log output.
|
||||
|
||||
It is OK to use `fmt.Errorf` for declaring custom error types.
|
||||
|
||||
#### Logging
|
||||
|
||||
Logrus is used for logging across all of go-i2p. All log statements should contain an `at` fields and a `reason` field. Here is a good example from the go-i2p implementation of a LeaseSet:
|
||||
Logrus is used for logging across all of go-i2p. We have a small extension of logrus at https://github.com/go-i2p/logger which we use to add a "Fail Fast mode." We are mostly converted over to using it.
|
||||
|
||||
All log statements should contain an `at` fields and a `reason` field. Here is a good example from the go-i2p implementation of a LeaseSet:
|
||||
|
||||
```go
|
||||
log.WithFields(log.Fields{
|
||||
@@ -56,4 +79,4 @@ func TestRouterAddressCountReturnsCorrectCount(t *testing.T) {
|
||||
|
||||
## Pull Requests
|
||||
|
||||
Pull requests should pass all tests, test all new behavior, and be correctly formatted by `gofmt` before merge. Feel free to open incomplete pull requests if you are struggling, I will enthusiasticlly help you complete the PR in any way needed.
|
||||
Pull requests should pass all tests, test all new behavior, and be correctly formatted by `gofumpt -w -s -extra` before merge. Feel free to open incomplete pull requests and ask for help and advice.
|
29
Makefile
29
Makefile
@@ -1,5 +1,9 @@
|
||||
RELEASE_TAG=0.0.1
|
||||
RELEASE_VERSION=${RELEASE_TAG}
|
||||
RELEASE_DESCRIPTION=`cat PASTA.md`
|
||||
REPO := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
|
||||
|
||||
CGO_ENABLED=0
|
||||
export DEBUG_I2P=debug
|
||||
|
||||
ifdef GOROOT
|
||||
GO = $(GOROOT)/bin/go
|
||||
@@ -13,13 +17,28 @@ else
|
||||
EXE := $(REPO)/go-i2p
|
||||
endif
|
||||
|
||||
#check for gofumpt
|
||||
check_gofumpt:
|
||||
@which gofumpt > /dev/null 2>&1 || (echo "gofumpt is required but not installed. Please install it from https://github.com/mvdan/gofumpt."; exit 1)
|
||||
|
||||
build: clean $(EXE)
|
||||
|
||||
$(EXE):
|
||||
$(GO) build -v -o $(EXE)
|
||||
|
||||
test:
|
||||
$(GO) test -v -failfast ./lib/common
|
||||
$(GO) build --tags netgo,osusergo -v -o $(EXE)
|
||||
|
||||
clean:
|
||||
$(GO) clean -v
|
||||
|
||||
fmt:
|
||||
find . -name '*.go' -exec gofumpt -w {} \;
|
||||
|
||||
info:
|
||||
echo "GOROOT: ${GOROOT}"
|
||||
echo "GO: ${GO}"
|
||||
echo "REPO: ${REPO}"
|
||||
|
||||
release:
|
||||
github-release release -u go-i2p -r go-i2p -n "${RELEASE_VERSION}" -t "${RELEASE_TAG}" -d "${RELEASE_DESCRIPTION}" -p
|
||||
|
||||
godoc:
|
||||
./callgraph.sh
|
||||
|
140
README.md
140
README.md
@@ -4,7 +4,10 @@ A pure Go implementation of the I2P router.
|
||||
|
||||
## Status
|
||||
|
||||
go-i2p is in early development.
|
||||
go-i2p is in early development. The master branch is being refactored and API's are
|
||||
definitely going to change. If you choose to use any part of this code right now,
|
||||
please keep up with these changes, as they will not be backward compatible and require
|
||||
**Fundamentally** changing any code that treats this as a dependency.
|
||||
|
||||
### Implemented Features
|
||||
|
||||
@@ -12,70 +15,121 @@ go-i2p is in early development.
|
||||
- [ ] Datagrams
|
||||
- [ ] I2CP
|
||||
- [ ] Message routing
|
||||
- [ ] SAM
|
||||
- [ ] Streaming
|
||||
- [ ] Tunnel Manager
|
||||
- Cryptographic primitives
|
||||
- [Cryptographic primitives(see also: https://github.com/go-i2p/crypto)](https://github.com/go-i2p/crypto)
|
||||
- Signing
|
||||
- [ ] ECDSA_SHA256_P256
|
||||
- [ ] ECDSA_SHA384_P384
|
||||
- [ ] ECDSA_SHA512_P521
|
||||
- [ ] Ed25519
|
||||
- [X] ECDSA_SHA256_P256
|
||||
- [X] ECDSA_SHA384_P384
|
||||
- [X] ECDSA_SHA512_P521
|
||||
- [X] Ed25519
|
||||
- Verifying
|
||||
- [ ] DSA
|
||||
- [ ] ECDSA_SHA256_P256
|
||||
- [ ] ECDSA_SHA384_P384
|
||||
- [ ] ECDSA_SHA512_P521
|
||||
- [ ] RSA_SHA256_2048
|
||||
- [ ] RSA_SHA384_3072
|
||||
- [ ] RSA_SHA512_4096
|
||||
- [ ] Ed25519
|
||||
- [X] DSA
|
||||
- [X] ECDSA_SHA256_P256
|
||||
- [X] ECDSA_SHA384_P384
|
||||
- [X] ECDSA_SHA512_P521
|
||||
- [X] RSA_SHA256_2048
|
||||
- [X] RSA_SHA384_3072
|
||||
- [X] RSA_SHA512_4096
|
||||
- [X] Ed25519
|
||||
- [ ] Red25519
|
||||
- [ ] ElGamal
|
||||
- [ ] AES256
|
||||
- [ ] X25519
|
||||
- [ ] ChaCha20/Poly1305
|
||||
- [X] ElGamal
|
||||
- [X] AES256
|
||||
- [X] X25519
|
||||
- [X] ChaCha20/Poly1305
|
||||
- [ ] Elligator2
|
||||
- [ ] HKDF
|
||||
- [ ] HMAC
|
||||
- [ ] Noise subsystem
|
||||
- [X] HKDF
|
||||
- [X] HMAC
|
||||
- [X] Noise subsystem
|
||||
- End-to-End Crypto
|
||||
- [ ] Garlic messages
|
||||
- [ ] ElGamal/AES+SessionTag
|
||||
- [ ] Ratchet/X25519
|
||||
- I2NP
|
||||
- [ ] Message parsing
|
||||
- [ ] Message handling
|
||||
- [X] Message parsing and serialization
|
||||
- [X] Message interfaces and factory patterns
|
||||
- [X] Database Store/Lookup message structures
|
||||
- [X] Tunnel Build message structures
|
||||
- [X] Data, DeliveryStatus, TunnelData messages
|
||||
- [X] Build Request/Response Record parsing
|
||||
- [ ] Message routing and handling
|
||||
- NetDB
|
||||
- [ ] Local storage
|
||||
- [ ] Persistence to disk
|
||||
- [ ] Reseeding
|
||||
- [X] Local storage interface
|
||||
- [X] Reseed functionality (basic implementation)
|
||||
- [~] Persistence to disk
|
||||
- [ ] RouterInfo management
|
||||
- [ ] LeaseSet management
|
||||
- [ ] Lookups
|
||||
- [ ] Expiry
|
||||
- [ ] Exploration
|
||||
- [ ] Publishing
|
||||
- [ ] Floodfill
|
||||
- [ ] LS2 and Encrypted Leasesets
|
||||
- Transports
|
||||
- [ ] Transport manager
|
||||
- Transport Layer
|
||||
- [X] Transport manager and interfaces
|
||||
- NTCP2
|
||||
- [ ] Handshake
|
||||
- [ ] Session tracking
|
||||
- [ ] Automatic session creation
|
||||
- SSU
|
||||
- [ ] Handshake
|
||||
- [ ] Session tracking
|
||||
- [ ] Automatic session creation
|
||||
- [X] Session handshake using noise protocol
|
||||
- [X] Connection management
|
||||
- [X] I2NP message framing and unframing
|
||||
- [X] Session lifecycle management
|
||||
- [X] Message queuing and worker threads
|
||||
- SSU2
|
||||
- [ ] Session handshake
|
||||
- [ ] Connection management
|
||||
- [ ] Peer Tests
|
||||
- [ ] Introducers
|
||||
- Tunnels
|
||||
- [ ] Building
|
||||
- [ ] Build Message Crypto (ElGamal)
|
||||
- [ ] Build Message Crypto (ECIES)
|
||||
- [ ] Participating
|
||||
- [ ] Tunnel Message Crypto
|
||||
- [ ] Tunnel Message Fragmentation/Reassembly
|
||||
- [X] Message structure parsing (delivery instructions)
|
||||
- [X] Fragment handling and reassembly
|
||||
- [X] Build Request/Response record interfaces
|
||||
- [ ] Tunnel building and management
|
||||
- [ ] Tunnel cryptography (layered encryption)
|
||||
- [ ] Gateway and endpoint implementation
|
||||
- [ ] Participant functionality
|
||||
- [Common Data Structures(see also: https://github.com/go-i2p/common](https://github.com/go-i2p/common)
|
||||
- [X] Keys and Cert
|
||||
- [X] Key Certificates
|
||||
- [X] Certificate
|
||||
- [X] Lease
|
||||
- [X] Lease Set
|
||||
- [X] Router Info
|
||||
- [X] Router Identity
|
||||
- [X] Router Address
|
||||
- [X] Session Key
|
||||
- [X] Signature Types
|
||||
- [X] Destination
|
||||
- [X] Data Types
|
||||
- [X] Session Tag
|
||||
|
||||
## Verbosity ##
|
||||
Logging can be enabled and configured using the `DEBUG_I2P` environment variable. By default, logging is disabled.
|
||||
|
||||
There are three available log levels:
|
||||
|
||||
- Debug
|
||||
```shell
|
||||
export DEBUG_I2P=debug
|
||||
```
|
||||
- Warn
|
||||
```shell
|
||||
export DEBUG_I2P=warn
|
||||
```
|
||||
- Error
|
||||
```shell
|
||||
export DEBUG_I2P=error
|
||||
```
|
||||
|
||||
If DEBUG_I2P is set to an unrecognized variable, it will fall back to "debug".
|
||||
|
||||
## Fast-Fail mode ##
|
||||
|
||||
Fast-Fail mode can be activated by setting `WARNFAIL_I2P` to any non-empty value. When set, every warning or error is Fatal.
|
||||
It is unsafe for production use, and intended only for debugging and testing purposes.
|
||||
|
||||
```shell
|
||||
export WARNFAIL_I2P=true
|
||||
```
|
||||
|
||||
If `WARNFAIL_I2P` is set and `DEBUG_I2P` is unset, `DEBUG_I2P` will be set to `debug`.
|
||||
|
||||
## Contributing
|
||||
|
||||
|
89
ROADMAP.md
Normal file
89
ROADMAP.md
Normal file
@@ -0,0 +1,89 @@
|
||||
# go-i2p Implementation Roadmap
|
||||
|
||||
## Completed Components ✅
|
||||
|
||||
### Transport Layer (NTCP2)
|
||||
- ✅ **Core NTCP2 Implementation**: Complete functional NTCP2 transport
|
||||
* ✅ Session handshake using noise protocol
|
||||
* ✅ Inbound and outbound connection management
|
||||
* ✅ I2NP message framing and unframing
|
||||
* ✅ Session lifecycle management with proper cleanup
|
||||
* ✅ Message queuing with background workers
|
||||
* ✅ RouterInfo compatibility checking
|
||||
* ✅ Error handling and session recovery
|
||||
|
||||
### I2NP Message System
|
||||
- ✅ **Core Message Infrastructure**: Complete I2NP message framework
|
||||
* ✅ Message parsing and serialization (NTCP format)
|
||||
* ✅ Interface-based message system with factory patterns
|
||||
* ✅ Data, DeliveryStatus, TunnelData message implementations
|
||||
* ✅ Database Store/Lookup message structures
|
||||
* ✅ Tunnel Build/Reply message structures
|
||||
* ✅ Build Request/Response Record parsing and interfaces
|
||||
|
||||
### Tunnel Message Processing
|
||||
- ✅ **Message Structure Handling**: Tunnel message framework
|
||||
* ✅ Delivery Instructions parsing and validation
|
||||
* ✅ Fragment handling and reassembly logic
|
||||
* ✅ Tunnel message structure parsing
|
||||
* ✅ Build record interface implementations
|
||||
|
||||
### Common Data Structures
|
||||
- ✅ **Complete Data Structure Support**: All I2P data types implemented
|
||||
* ✅ Keys and Certificates, Router Info/Address
|
||||
* ✅ Session Keys, Hashes, Signatures
|
||||
* ✅ Lease and LeaseSet structures
|
||||
|
||||
## In Progress Components 🚧
|
||||
|
||||
### NetDb Implementation
|
||||
- **Database Store Integration**:
|
||||
* 📋 Database Store message handling implementation
|
||||
* 📋 RouterInfo storage and retrieval
|
||||
* 📋 LeaseSet management and storage
|
||||
* 📋 Database lookup system
|
||||
* 📋 Peer selection logic (basic implementation)
|
||||
|
||||
## Next Priority Components 🎯
|
||||
|
||||
### Tunnel Building System
|
||||
- **Active Tunnel Management**:
|
||||
* 📋 Tunnel building coordination
|
||||
* 📋 Build request/response handling
|
||||
* 📋 Gateway and endpoint implementations
|
||||
* 📋 Participant tunnel processing
|
||||
|
||||
### Tunnel Cryptography
|
||||
- **Security Layer Implementation**:
|
||||
* 📋 Layered encryption/decryption
|
||||
* 📋 Key generation and management
|
||||
* 📋 Tunnel message forwarding logic
|
||||
|
||||
## Future Components 📅
|
||||
|
||||
### SSU2 Transport (Post-NTCP2)
|
||||
- **Secondary Transport Protocol**:
|
||||
* 📋 SSU2 handshake implementation
|
||||
* 📋 UDP-based session management
|
||||
* 📋 Peer testing mechanisms
|
||||
* 📋 Introducer functionality
|
||||
|
||||
### Advanced NetDb Features
|
||||
- **Enhanced Database Operations**:
|
||||
* 📋 Floodfill router functionality
|
||||
* 📋 Database exploration and publishing
|
||||
* 📋 LS2 and Encrypted LeaseSet support
|
||||
* 📋 Advanced peer selection algorithms
|
||||
|
||||
### Application Layer
|
||||
- **Client Applications**:
|
||||
* 📋 I2CP implementation
|
||||
* 📋 Streaming library
|
||||
* 📋 Datagram support
|
||||
* 📋 End-to-end encryption (Garlic routing)
|
||||
|
||||
## Current Status
|
||||
|
||||
**Primary Goal**: NTCP2 transport is feature-complete and actively sending/receiving I2NP messages. The foundation for tunnel building and NetDb integration is in place. Next major milestone is implementing database operations and tunnel building.
|
||||
|
||||
**Test Coverage**: Core components have basic test coverage including NTCP2 sessions, I2NP message processing, and tunnel message parsing.
|
19
callgraph.sh
Executable file
19
callgraph.sh
Executable file
@@ -0,0 +1,19 @@
|
||||
#! /usr/bin/env sh
|
||||
|
||||
dirs=$(find lib/ -type d)
|
||||
for dir in $dirs; do
|
||||
files=$(find "$dir" -maxdepth 2 -type f -name "*.go" -not -name "fuzz")
|
||||
#echo "Files in $dir: $files"
|
||||
file=$(echo $files | awk '{print $1}')
|
||||
if [ -z "$file" ]; then
|
||||
echo "no go files, skipping"
|
||||
continue
|
||||
fi
|
||||
packageLine=$(grep -E "^package" $file)
|
||||
package=$(echo $packageLine | awk '{print $2}')
|
||||
echo "Generating callgraph for $package"
|
||||
go-callvis -nostd -focus "$package" -group type -format svg -file $dir/$package "github.com/go-i2p/go-i2p/$dir"
|
||||
godocdown -template template.md -o "$dir/README.md" "./$dir"
|
||||
git add -v "$dir/README.md"
|
||||
git add -v "$dir/$package.svg" "$dir/README.md"
|
||||
done
|
52
go.mod
52
go.mod
@@ -1,9 +1,53 @@
|
||||
module github.com/go-i2p/go-i2p
|
||||
|
||||
go 1.16
|
||||
go 1.24.2
|
||||
|
||||
require (
|
||||
github.com/sirupsen/logrus v1.8.1
|
||||
github.com/stretchr/testify v1.7.0
|
||||
golang.org/x/crypto v0.0.0-20210415154028-4f45737414dc
|
||||
github.com/beevik/ntp v1.4.3
|
||||
github.com/eyedeekay/go-unzip v0.0.0-20240201194209-560d8225b50e
|
||||
github.com/go-i2p/common v0.0.0-20250715213359-dfa5527ece83
|
||||
github.com/go-i2p/crypto v0.0.0-20250716230511-565a0995440c
|
||||
github.com/go-i2p/go-noise v0.0.0-20250805210353-74f980a2439d
|
||||
github.com/go-i2p/logger v0.0.0-20241123010126-3050657e5d0c
|
||||
github.com/go-i2p/su3 v0.0.0-20250716183548-497fadf45e84
|
||||
github.com/go-i2p/util v0.0.0-20250806013618-d0b686a4f694
|
||||
github.com/samber/oops v1.19.0
|
||||
github.com/sirupsen/logrus v1.9.3
|
||||
github.com/spf13/cobra v1.9.1
|
||||
github.com/spf13/viper v1.19.0
|
||||
github.com/stretchr/testify v1.10.0
|
||||
gopkg.in/yaml.v3 v3.0.1
|
||||
)
|
||||
|
||||
require (
|
||||
filippo.io/edwards25519 v1.1.0 // indirect
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||
github.com/dchest/siphash v1.2.3 // indirect
|
||||
github.com/fsnotify/fsnotify v1.8.0 // indirect
|
||||
github.com/go-i2p/noise v0.0.0-20250805205922-091c71f48c43 // indirect
|
||||
github.com/hashicorp/hcl v1.0.0 // indirect
|
||||
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||
github.com/magiconair/properties v1.8.9 // indirect
|
||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||
github.com/oklog/ulid/v2 v2.1.1 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||
github.com/sagikazarmark/locafero v0.7.0 // indirect
|
||||
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
|
||||
github.com/samber/lo v1.51.0 // indirect
|
||||
github.com/sourcegraph/conc v0.3.0 // indirect
|
||||
github.com/spf13/afero v1.12.0 // indirect
|
||||
github.com/spf13/cast v1.7.1 // indirect
|
||||
github.com/spf13/pflag v1.0.6 // indirect
|
||||
github.com/subosito/gotenv v1.6.0 // indirect
|
||||
go.opentelemetry.io/otel v1.37.0 // indirect
|
||||
go.opentelemetry.io/otel/trace v1.37.0 // indirect
|
||||
go.step.sm/crypto v0.67.0 // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
golang.org/x/crypto v0.40.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect
|
||||
golang.org/x/net v0.41.0 // indirect
|
||||
golang.org/x/sys v0.34.0 // indirect
|
||||
golang.org/x/text v0.27.0 // indirect
|
||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||
)
|
||||
|
121
go.sum
121
go.sum
@@ -1,24 +1,111 @@
|
||||
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
|
||||
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
|
||||
github.com/beevik/ntp v1.4.3 h1:PlbTvE5NNy4QHmA4Mg57n7mcFTmr1W1j3gcK7L1lqho=
|
||||
github.com/beevik/ntp v1.4.3/go.mod h1:Unr8Zg+2dRn7d8bHFuehIMSvvUYssHMxW3Q5Nx4RW5Q=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
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/dchest/siphash v1.2.3 h1:QXwFc8cFOR2dSa/gE6o/HokBMWtLUaNDVd+22aKHeEA=
|
||||
github.com/dchest/siphash v1.2.3/go.mod h1:0NvQU092bT0ipiFN++/rXm69QG9tVxLAlQHIXMPAkHc=
|
||||
github.com/eyedeekay/go-unzip v0.0.0-20240201194209-560d8225b50e h1:NMjWYVkgcQHGOy0/VxU0TU6smrcoxzj9hwDesx2sB0w=
|
||||
github.com/eyedeekay/go-unzip v0.0.0-20240201194209-560d8225b50e/go.mod h1:fKfFM3BsOOyjtZmEty7FsGzGabXo8Eb/dHjyIhTtxsE=
|
||||
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
|
||||
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
|
||||
github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M=
|
||||
github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
||||
github.com/go-i2p/common v0.0.0-20250715213359-dfa5527ece83 h1:F6xM06QyqR+qMYA4SzWzUzfVmkSE1P41tHK32TmGxP8=
|
||||
github.com/go-i2p/common v0.0.0-20250715213359-dfa5527ece83/go.mod h1:e6X6esQk0zaevdZPZecKY7n8+wOfOLukQfWw558DYfk=
|
||||
github.com/go-i2p/crypto v0.0.0-20250716230511-565a0995440c h1:s+bMNveuZg8rhIolwy7w451Y4qirhhYZbbmvLfBIDw4=
|
||||
github.com/go-i2p/crypto v0.0.0-20250716230511-565a0995440c/go.mod h1:5felGikM6K5D95TLvVxew1UfR0BdtPpfmJLZa8cuY5U=
|
||||
github.com/go-i2p/go-noise v0.0.0-20250805210353-74f980a2439d h1:4DKwGZZ2yalAjrrOTw9Zoz31lOMXysw5PZTqKYazlVw=
|
||||
github.com/go-i2p/go-noise v0.0.0-20250805210353-74f980a2439d/go.mod h1:lNh+uKTp1nBVhY1MqJ7sNQWORRf1SMmYvu10Suv0zT8=
|
||||
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/noise v0.0.0-20250805205922-091c71f48c43 h1:wHDEEr99CEe+2xQ/cqCt8g8QYw1JBqc8Fb/sg2A+K6U=
|
||||
github.com/go-i2p/noise v0.0.0-20250805205922-091c71f48c43/go.mod h1:yxzyP2upqal6mXWPWIPy7kuc1uuLzDrA21PSO5op9nE=
|
||||
github.com/go-i2p/su3 v0.0.0-20250716183548-497fadf45e84 h1:aEDC9JJGnPsUCOzyCuiOoGN8ByZ64xVs7dOKOawfImg=
|
||||
github.com/go-i2p/su3 v0.0.0-20250716183548-497fadf45e84/go.mod h1:khgAcQvD8LNY33zwha+ODxEdnHZRkDjQsdnnwojr7Ek=
|
||||
github.com/go-i2p/util v0.0.0-20250806013618-d0b686a4f694 h1:uRw0dKhNKXJI9yP9XfpkkMlkE2Cz3NBeWFOvAhb4CKA=
|
||||
github.com/go-i2p/util v0.0.0-20250806013618-d0b686a4f694/go.mod h1:y8THMwrKFrIW+GGwhZHJmm7jBO1dHwegh5L1HQVu49o=
|
||||
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/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
||||
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM=
|
||||
github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
|
||||
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
||||
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
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/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o=
|
||||
github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
|
||||
github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
|
||||
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||
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/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
|
||||
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
|
||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo=
|
||||
github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k=
|
||||
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
|
||||
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
|
||||
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/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
|
||||
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
|
||||
github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs=
|
||||
github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4=
|
||||
github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=
|
||||
github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
|
||||
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
|
||||
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
|
||||
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
|
||||
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=
|
||||
github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
golang.org/x/crypto v0.0.0-20210415154028-4f45737414dc h1:+q90ECDSAQirdykUN6sPEiBXBsp8Csjcca8Oy7bgLTA=
|
||||
golang.org/x/crypto v0.0.0-20210415154028-4f45737414dc/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
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/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
|
||||
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
|
||||
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=
|
||||
go.step.sm/crypto v0.67.0 h1:1km9LmxMKG/p+mKa1R4luPN04vlJYnRLlLQrWv7egGU=
|
||||
go.step.sm/crypto v0.67.0/go.mod h1:+AoDpB0mZxbW/PmOXuwkPSpXRgaUaoIK+/Wx/HGgtAU=
|
||||
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
|
||||
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
|
||||
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/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM=
|
||||
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8=
|
||||
golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
|
||||
golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
|
||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
|
||||
golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
|
||||
golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||
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/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=
|
||||
|
57
lib/bootstrap/README.md
Normal file
57
lib/bootstrap/README.md
Normal file
@@ -0,0 +1,57 @@
|
||||
# bootstrap
|
||||
--
|
||||
import "github.com/go-i2p/go-i2p/lib/bootstrap"
|
||||
|
||||

|
||||
|
||||
provides generic interfaces for initial bootstrap into network and network
|
||||
### reseeding
|
||||
|
||||
## Usage
|
||||
|
||||
#### type Bootstrap
|
||||
|
||||
```go
|
||||
type Bootstrap interface {
|
||||
// get more peers for bootstrap
|
||||
// try obtaining at most n router infos
|
||||
// if n is 0 then try obtaining as many router infos as possible
|
||||
// returns nil and error if we cannot fetch ANY router infos
|
||||
// returns a channel that yields 1 slice of router infos containing n or fewer router infos, caller must close channel after use
|
||||
GetPeers(ctx context.Context, n int) ([]router_info.RouterInfo, error)
|
||||
}
|
||||
```
|
||||
|
||||
interface defining a way to bootstrap into the i2p network
|
||||
|
||||
#### type ReseedBootstrap
|
||||
|
||||
```go
|
||||
type ReseedBootstrap struct {
|
||||
}
|
||||
```
|
||||
|
||||
ReseedBootstrap implements the Bootstrap interface using HTTP reseeding
|
||||
|
||||
#### func NewReseedBootstrap
|
||||
|
||||
```go
|
||||
func NewReseedBootstrap(config *config.BootstrapConfig) *ReseedBootstrap
|
||||
```
|
||||
NewReseedBootstrap creates a new reseeder with the provided configuration
|
||||
|
||||
#### func (*ReseedBootstrap) GetPeers
|
||||
|
||||
```go
|
||||
func (rb *ReseedBootstrap) GetPeers(ctx context.Context, n int) ([]router_info.RouterInfo, error)
|
||||
```
|
||||
GetPeers implements the Bootstrap interface by obtaining RouterInfos from
|
||||
configured reseed servers
|
||||
|
||||
|
||||
|
||||
bootstrap
|
||||
|
||||
github.com/go-i2p/go-i2p/lib/bootstrap
|
||||
|
||||
[go-i2p template file](/template.md)
|
@@ -1,6 +1,10 @@
|
||||
package bootstrap
|
||||
|
||||
import "github.com/go-i2p/go-i2p/lib/common"
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/go-i2p/common/router_info"
|
||||
)
|
||||
|
||||
// interface defining a way to bootstrap into the i2p network
|
||||
type Bootstrap interface {
|
||||
@@ -9,5 +13,5 @@ type Bootstrap interface {
|
||||
// if n is 0 then try obtaining as many router infos as possible
|
||||
// returns nil and error if we cannot fetch ANY router infos
|
||||
// returns a channel that yields 1 slice of router infos containing n or fewer router infos, caller must close channel after use
|
||||
GetPeers(n int) (chan []common.RouterInfo, error)
|
||||
GetPeers(ctx context.Context, n int) ([]router_info.RouterInfo, error)
|
||||
}
|
||||
|
258
lib/bootstrap/bootstrap.svg
Normal file
258
lib/bootstrap/bootstrap.svg
Normal file
@@ -0,0 +1,258 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Generated by graphviz version 2.40.1 (20161225.0304)
|
||||
-->
|
||||
<!-- Title: gocallvis Pages: 1 -->
|
||||
<svg width="365pt" height="722pt"
|
||||
viewBox="0.00 0.00 364.72 722.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(0 722)">
|
||||
<title>gocallvis</title>
|
||||
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,-722 364.7182,-722 364.7182,0 0,0"/>
|
||||
<g id="clust1" class="cluster">
|
||||
<title>cluster_focus</title>
|
||||
<polygon fill="#e6ecfa" stroke="#000000" stroke-width=".5" points="0,-8 0,-714 356.7182,-714 356.7182,-8 0,-8"/>
|
||||
<text text-anchor="middle" x="178.3591" y="-693.8" font-family="Arial" font-size="18.00" fill="#000000">bootstrap</text>
|
||||
</g>
|
||||
<g id="clust5" class="cluster">
|
||||
<title>cluster_github.com/go-i2p/go-i2p/lib/netdb/reseed.Reseed</title>
|
||||
<g id="a_clust5"><a xlink:title="type: github.com/go-i2p/go-i2p/lib/netdb/reseed.Reseed">
|
||||
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M242.0218,-598C242.0218,-598 334.2252,-598 334.2252,-598 340.2252,-598 346.2252,-604 346.2252,-610 346.2252,-610 346.2252,-664 346.2252,-664 346.2252,-670 340.2252,-676 334.2252,-676 334.2252,-676 242.0218,-676 242.0218,-676 236.0218,-676 230.0218,-670 230.0218,-664 230.0218,-664 230.0218,-610 230.0218,-610 230.0218,-604 236.0218,-598 242.0218,-598"/>
|
||||
<text text-anchor="middle" x="288.1235" y="-606.5" font-family="Arial" font-size="15.00" fill="#222222">(Reseed)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<g id="clust4" class="cluster">
|
||||
<title>cluster_*github.com/sirupsen/logrus.Logger</title>
|
||||
<g id="a_clust4"><a xlink:title="type: *github.com/sirupsen/logrus.Logger">
|
||||
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M261.4629,-451C261.4629,-451 315.7841,-451 315.7841,-451 321.7841,-451 327.7841,-457 327.7841,-463 327.7841,-463 327.7841,-578 327.7841,-578 327.7841,-584 321.7841,-590 315.7841,-590 315.7841,-590 261.4629,-590 261.4629,-590 255.4629,-590 249.4629,-584 249.4629,-578 249.4629,-578 249.4629,-463 249.4629,-463 249.4629,-457 255.4629,-451 261.4629,-451"/>
|
||||
<text text-anchor="middle" x="288.6235" y="-459.5" font-family="Arial" font-size="15.00" fill="#222222">(*Logger)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<g id="clust3" class="cluster">
|
||||
<title>cluster_*github.com/go-i2p/logger.Logger</title>
|
||||
<g id="a_clust3"><a xlink:title="type: *github.com/go-i2p/logger.Logger">
|
||||
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M249.0141,-182C249.0141,-182 327.2329,-182 327.2329,-182 333.2329,-182 339.2329,-188 339.2329,-194 339.2329,-194 339.2329,-431 339.2329,-431 339.2329,-437 333.2329,-443 327.2329,-443 327.2329,-443 249.0141,-443 249.0141,-443 243.0141,-443 237.0141,-437 237.0141,-431 237.0141,-431 237.0141,-194 237.0141,-194 237.0141,-188 243.0141,-182 249.0141,-182"/>
|
||||
<text text-anchor="middle" x="288.1235" y="-190.5" font-family="Arial" font-size="15.00" fill="#222222">(*Logger)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<g id="clust2" class="cluster">
|
||||
<title>cluster_*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap</title>
|
||||
<g id="a_clust2"><a xlink:title="type: *github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap">
|
||||
<path fill="#b0c4de" stroke="#000000" stroke-width=".5" d="M20,-304C20,-304 143.5288,-304 143.5288,-304 149.5288,-304 155.5288,-310 155.5288,-316 155.5288,-316 155.5288,-370 155.5288,-370 155.5288,-376 149.5288,-382 143.5288,-382 143.5288,-382 20,-382 20,-382 14,-382 8,-376 8,-370 8,-370 8,-316 8,-316 8,-310 14,-304 20,-304"/>
|
||||
<text text-anchor="middle" x="81.7644" y="-312.5" font-family="Arial" font-size="15.00" fill="#222222">(*ReseedBootstrap)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- github.com/go-i2p/go-i2p/lib/bootstrap.init -->
|
||||
<g id="node1" class="node">
|
||||
<title>github.com/go-i2p/go-i2p/lib/bootstrap.init</title>
|
||||
<g id="a_node1"><a xlink:title="github.com/go-i2p/go-i2p/lib/bootstrap.init | defined in .:0 at reseed_bootstrap.go:15: calling [github.com/go-i2p/logger.GetGoI2PLogger]">
|
||||
<path fill="#add8e6" stroke="#000000" stroke-width=".5" d="M96.2644,-52C96.2644,-52 66.2644,-52 66.2644,-52 60.2644,-52 54.2644,-46 54.2644,-40 54.2644,-40 54.2644,-28 54.2644,-28 54.2644,-22 60.2644,-16 66.2644,-16 66.2644,-16 96.2644,-16 96.2644,-16 102.2644,-16 108.2644,-22 108.2644,-28 108.2644,-28 108.2644,-40 108.2644,-40 108.2644,-46 102.2644,-52 96.2644,-52"/>
|
||||
<text text-anchor="middle" x="81.2644" y="-29.8" font-family="Verdana" font-size="14.00" fill="#000000">init</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- github.com/go-i2p/logger.GetGoI2PLogger -->
|
||||
<g id="node2" class="node">
|
||||
<title>github.com/go-i2p/logger.GetGoI2PLogger</title>
|
||||
<g id="a_node2"><a xlink:title="github.com/go-i2p/logger.GetGoI2PLogger | defined in log.go:120">
|
||||
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M336.813,-52C336.813,-52 239.434,-52 239.434,-52 233.434,-52 227.434,-46 227.434,-40 227.434,-40 227.434,-28 227.434,-28 227.434,-22 233.434,-16 239.434,-16 239.434,-16 336.813,-16 336.813,-16 342.813,-16 348.813,-22 348.813,-28 348.813,-28 348.813,-40 348.813,-40 348.813,-46 342.813,-52 336.813,-52"/>
|
||||
<text text-anchor="middle" x="288.1235" y="-38.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
|
||||
<text text-anchor="middle" x="288.1235" y="-21.4" font-family="Verdana" font-size="14.00" fill="#000000">GetGoI2PLogger</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- github.com/go-i2p/go-i2p/lib/bootstrap.init->github.com/go-i2p/logger.GetGoI2PLogger -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>github.com/go-i2p/go-i2p/lib/bootstrap.init->github.com/go-i2p/logger.GetGoI2PLogger</title>
|
||||
<g id="a_edge1"><a xlink:title="at reseed_bootstrap.go:15: calling [github.com/go-i2p/logger.GetGoI2PLogger]">
|
||||
<path fill="none" stroke="#8b4513" d="M108.3076,-34C135.736,-34 179.3573,-34 216.7663,-34"/>
|
||||
<polygon fill="#8b4513" stroke="#8b4513" points="217.1342,-37.5001 227.1342,-34 217.1341,-30.5001 217.1342,-37.5001"/>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- github.com/samber/oops.Errorf -->
|
||||
<g id="node3" class="node">
|
||||
<title>github.com/samber/oops.Errorf</title>
|
||||
<g id="a_node3"><a xlink:title="github.com/samber/oops.Errorf | defined in oops.go:34">
|
||||
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M305.3188,-113C305.3188,-113 270.9282,-113 270.9282,-113 264.9282,-113 258.9282,-107 258.9282,-101 258.9282,-101 258.9282,-89 258.9282,-89 258.9282,-83 264.9282,-77 270.9282,-77 270.9282,-77 305.3188,-77 305.3188,-77 311.3188,-77 317.3188,-83 317.3188,-89 317.3188,-89 317.3188,-101 317.3188,-101 317.3188,-107 311.3188,-113 305.3188,-113"/>
|
||||
<text text-anchor="middle" x="288.1235" y="-99.2" font-family="Verdana" font-size="14.00" fill="#000000">oops</text>
|
||||
<text text-anchor="middle" x="288.1235" y="-82.4" font-family="Verdana" font-size="14.00" fill="#000000">Errorf</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- github.com/go-i2p/go-i2p/lib/netdb/reseed.NewReseed -->
|
||||
<g id="node4" class="node">
|
||||
<title>github.com/go-i2p/go-i2p/lib/netdb/reseed.NewReseed</title>
|
||||
<g id="a_node4"><a xlink:title="github.com/go-i2p/go-i2p/lib/netdb/reseed.NewReseed | defined in new.go:10">
|
||||
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M321.4764,-174C321.4764,-174 254.7706,-174 254.7706,-174 248.7706,-174 242.7706,-168 242.7706,-162 242.7706,-162 242.7706,-150 242.7706,-150 242.7706,-144 248.7706,-138 254.7706,-138 254.7706,-138 321.4764,-138 321.4764,-138 327.4764,-138 333.4764,-144 333.4764,-150 333.4764,-150 333.4764,-162 333.4764,-162 333.4764,-168 327.4764,-174 321.4764,-174"/>
|
||||
<text text-anchor="middle" x="288.1235" y="-160.2" font-family="Verdana" font-size="14.00" fill="#000000">reseed</text>
|
||||
<text text-anchor="middle" x="288.1235" y="-143.4" font-family="Verdana" font-size="14.00" fill="#000000">NewReseed</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers -->
|
||||
<g id="node5" class="node">
|
||||
<title>(*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers</title>
|
||||
<g id="a_node5"><a xlink:title="(*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers | defined in reseed_bootstrap.go:32 at reseed_bootstrap.go:40: calling [github.com/samber/oops.Errorf] at reseed_bootstrap.go:52: calling [github.com/samber/oops.Errorf] at reseed_bootstrap.go:72: calling [github.com/samber/oops.Errorf] at reseed_bootstrap.go:46: calling [github.com/go-i2p/go-i2p/lib/netdb/reseed.NewReseed] at reseed_bootstrap.go:49: calling [(github.com/go-i2p/go-i2p/lib/netdb/reseed.Reseed).SingleReseed] at reseed_bootstrap.go:51: calling [(*github.com/go-i2p/logger.Logger).WithError] at reseed_bootstrap.go:58: calling [(*github.com/go-i2p/logger.Logger).WithFields] at reseed_bootstrap.go:62: calling [(*github.com/sirupsen/logrus.Logger).Info] at reseed_bootstrap.go:43: calling [(*github.com/go-i2p/logger.Logger).WithField] at reseed_bootstrap.go:51: calling [(*github.com/go-i2p/logger.Logger).WithField] at reseed_bootstrap.go:43: calling [(*github.com/sirupsen/logrus.Logger).Debug] at reseed_bootstrap.go:51: calling [(*github.com/go-i2p/logger.Logger).Warn]">
|
||||
<path fill="#add8e6" stroke="#000000" stroke-width="1.5" d="M106.2947,-374C106.2947,-374 56.2341,-374 56.2341,-374 50.2341,-374 44.2341,-368 44.2341,-362 44.2341,-362 44.2341,-350 44.2341,-350 44.2341,-344 50.2341,-338 56.2341,-338 56.2341,-338 106.2947,-338 106.2947,-338 112.2947,-338 118.2947,-344 118.2947,-350 118.2947,-350 118.2947,-362 118.2947,-362 118.2947,-368 112.2947,-374 106.2947,-374"/>
|
||||
<text text-anchor="middle" x="81.2644" y="-351.8" font-family="Verdana" font-size="14.00" fill="#000000">GetPeers</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->github.com/samber/oops.Errorf -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>(*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->github.com/samber/oops.Errorf</title>
|
||||
<g id="a_edge2"><a xlink:title="at reseed_bootstrap.go:40: calling [github.com/samber/oops.Errorf] at reseed_bootstrap.go:52: calling [github.com/samber/oops.Errorf] at reseed_bootstrap.go:72: calling [github.com/samber/oops.Errorf]">
|
||||
<path fill="none" stroke="#8b4513" d="M118.4074,-352.073C131.5385,-349.0001 145.5161,-343.5697 155.5288,-334 190.8891,-300.2044 195.4391,-162.9154 227.5288,-126 233.5557,-119.0668 241.5102,-113.4857 249.6658,-109.0748"/>
|
||||
<polygon fill="#8b4513" stroke="#8b4513" points="251.4166,-112.115 258.8672,-104.5824 248.3454,-105.8247 251.4166,-112.115"/>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->github.com/go-i2p/go-i2p/lib/netdb/reseed.NewReseed -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>(*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->github.com/go-i2p/go-i2p/lib/netdb/reseed.NewReseed</title>
|
||||
<g id="a_edge3"><a xlink:title="at reseed_bootstrap.go:46: calling [github.com/go-i2p/go-i2p/lib/netdb/reseed.NewReseed]">
|
||||
<path fill="none" stroke="#8b4513" d="M118.6751,-351.3434C131.5313,-348.1844 145.2575,-342.8857 155.5288,-334 213.2793,-284.0401 171.3098,-229.6772 227.5288,-178 229.4394,-176.2438 231.5009,-174.6252 233.6705,-173.1338"/>
|
||||
<polygon fill="#8b4513" stroke="#8b4513" points="235.6115,-176.0535 242.4829,-167.9892 232.0823,-170.0083 235.6115,-176.0535"/>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/logger.Logger).WithField -->
|
||||
<g id="node6" class="node">
|
||||
<title>(*github.com/go-i2p/logger.Logger).WithField</title>
|
||||
<g id="a_node6"><a xlink:title="(*github.com/go-i2p/logger.Logger).WithField | defined in log.go:54">
|
||||
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M316.398,-252C316.398,-252 259.849,-252 259.849,-252 253.849,-252 247.849,-246 247.849,-240 247.849,-240 247.849,-228 247.849,-228 247.849,-222 253.849,-216 259.849,-216 259.849,-216 316.398,-216 316.398,-216 322.398,-216 328.398,-222 328.398,-228 328.398,-228 328.398,-240 328.398,-240 328.398,-246 322.398,-252 316.398,-252"/>
|
||||
<text text-anchor="middle" x="288.1235" y="-238.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
|
||||
<text text-anchor="middle" x="288.1235" y="-221.4" font-family="Verdana" font-size="14.00" fill="#000000">WithField</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(*github.com/go-i2p/logger.Logger).WithField -->
|
||||
<g id="edge8" class="edge">
|
||||
<title>(*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(*github.com/go-i2p/logger.Logger).WithField</title>
|
||||
<g id="a_edge8"><a xlink:title="at reseed_bootstrap.go:43: calling [(*github.com/go-i2p/logger.Logger).WithField] at reseed_bootstrap.go:51: calling [(*github.com/go-i2p/logger.Logger).WithField]">
|
||||
<path fill="none" stroke="#8b4513" d="M118.5683,-348.6617C130.8549,-345.2944 144.2489,-340.5496 155.5288,-334 193.8581,-311.7444 191.4175,-290.6986 227.5288,-265 231.4159,-262.2337 235.5842,-259.5689 239.8482,-257.0424"/>
|
||||
<polygon fill="#8b4513" stroke="#8b4513" points="241.6859,-260.0242 248.6757,-252.0623 238.2464,-253.9275 241.6859,-260.0242"/>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/logger.Logger).WithError -->
|
||||
<g id="node7" class="node">
|
||||
<title>(*github.com/go-i2p/logger.Logger).WithError</title>
|
||||
<g id="a_node7"><a xlink:title="(*github.com/go-i2p/logger.Logger).WithError | defined in log.go:66">
|
||||
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M316.655,-313C316.655,-313 259.592,-313 259.592,-313 253.592,-313 247.592,-307 247.592,-301 247.592,-301 247.592,-289 247.592,-289 247.592,-283 253.592,-277 259.592,-277 259.592,-277 316.655,-277 316.655,-277 322.655,-277 328.655,-283 328.655,-289 328.655,-289 328.655,-301 328.655,-301 328.655,-307 322.655,-313 316.655,-313"/>
|
||||
<text text-anchor="middle" x="288.1235" y="-299.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
|
||||
<text text-anchor="middle" x="288.1235" y="-282.4" font-family="Verdana" font-size="14.00" fill="#000000">WithError</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(*github.com/go-i2p/logger.Logger).WithError -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>(*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(*github.com/go-i2p/logger.Logger).WithError</title>
|
||||
<g id="a_edge5"><a xlink:title="at reseed_bootstrap.go:51: calling [(*github.com/go-i2p/logger.Logger).WithError]">
|
||||
<path fill="none" stroke="#8b4513" d="M118.725,-344.9534C151.9288,-335.162 200.7001,-320.78 237.3948,-309.9592"/>
|
||||
<polygon fill="#8b4513" stroke="#8b4513" points="238.7997,-313.194 247.4014,-307.0084 236.8198,-306.4798 238.7997,-313.194"/>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/logger.Logger).Warn -->
|
||||
<g id="node8" class="node">
|
||||
<title>(*github.com/go-i2p/logger.Logger).Warn</title>
|
||||
<g id="a_node8"><a xlink:title="(*github.com/go-i2p/logger.Logger).Warn | defined in log.go:30">
|
||||
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M305.8898,-374C305.8898,-374 270.3572,-374 270.3572,-374 264.3572,-374 258.3572,-368 258.3572,-362 258.3572,-362 258.3572,-350 258.3572,-350 258.3572,-344 264.3572,-338 270.3572,-338 270.3572,-338 305.8898,-338 305.8898,-338 311.8898,-338 317.8898,-344 317.8898,-350 317.8898,-350 317.8898,-362 317.8898,-362 317.8898,-368 311.8898,-374 305.8898,-374"/>
|
||||
<text text-anchor="middle" x="288.1235" y="-360.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
|
||||
<text text-anchor="middle" x="288.1235" y="-343.4" font-family="Verdana" font-size="14.00" fill="#000000">Warn</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(*github.com/go-i2p/logger.Logger).Warn -->
|
||||
<g id="edge10" class="edge">
|
||||
<title>(*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(*github.com/go-i2p/logger.Logger).Warn</title>
|
||||
<g id="a_edge10"><a xlink:title="at reseed_bootstrap.go:51: calling [(*github.com/go-i2p/logger.Logger).Warn]">
|
||||
<path fill="none" stroke="#8b4513" d="M118.725,-356C155.3343,-356 210.8683,-356 248.2746,-356"/>
|
||||
<polygon fill="#8b4513" stroke="#8b4513" points="248.3136,-359.5001 258.3136,-356 248.3135,-352.5001 248.3136,-359.5001"/>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/logger.Logger).WithFields -->
|
||||
<g id="node9" class="node">
|
||||
<title>(*github.com/go-i2p/logger.Logger).WithFields</title>
|
||||
<g id="a_node9"><a xlink:title="(*github.com/go-i2p/logger.Logger).WithFields | defined in log.go:60">
|
||||
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M319.3426,-435C319.3426,-435 256.9044,-435 256.9044,-435 250.9044,-435 244.9044,-429 244.9044,-423 244.9044,-423 244.9044,-411 244.9044,-411 244.9044,-405 250.9044,-399 256.9044,-399 256.9044,-399 319.3426,-399 319.3426,-399 325.3426,-399 331.3426,-405 331.3426,-411 331.3426,-411 331.3426,-423 331.3426,-423 331.3426,-429 325.3426,-435 319.3426,-435"/>
|
||||
<text text-anchor="middle" x="288.1235" y="-421.2" font-family="Verdana" font-size="14.00" fill="#000000">logger</text>
|
||||
<text text-anchor="middle" x="288.1235" y="-404.4" font-family="Verdana" font-size="14.00" fill="#000000">WithFields</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(*github.com/go-i2p/logger.Logger).WithFields -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>(*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(*github.com/go-i2p/logger.Logger).WithFields</title>
|
||||
<g id="a_edge6"><a xlink:title="at reseed_bootstrap.go:58: calling [(*github.com/go-i2p/logger.Logger).WithFields]">
|
||||
<path fill="none" stroke="#8b4513" d="M118.725,-367.0466C151.1839,-376.6183 198.5195,-390.577 234.9071,-401.3072"/>
|
||||
<polygon fill="#8b4513" stroke="#8b4513" points="234.2768,-404.7703 244.8585,-404.2417 236.2568,-398.0561 234.2768,-404.7703"/>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/sirupsen/logrus.Logger).Debug -->
|
||||
<g id="node10" class="node">
|
||||
<title>(*github.com/sirupsen/logrus.Logger).Debug</title>
|
||||
<g id="a_node10"><a xlink:title="(*github.com/sirupsen/logrus.Logger).Debug | defined in logger.go:221">
|
||||
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M306.9455,-521C306.9455,-521 269.3015,-521 269.3015,-521 263.3015,-521 257.3015,-515 257.3015,-509 257.3015,-509 257.3015,-497 257.3015,-497 257.3015,-491 263.3015,-485 269.3015,-485 269.3015,-485 306.9455,-485 306.9455,-485 312.9455,-485 318.9455,-491 318.9455,-497 318.9455,-497 318.9455,-509 318.9455,-509 318.9455,-515 312.9455,-521 306.9455,-521"/>
|
||||
<text text-anchor="middle" x="288.1235" y="-507.2" font-family="Verdana" font-size="14.00" fill="#000000">logrus</text>
|
||||
<text text-anchor="middle" x="288.1235" y="-490.4" font-family="Verdana" font-size="14.00" fill="#000000">Debug</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(*github.com/sirupsen/logrus.Logger).Debug -->
|
||||
<g id="edge9" class="edge">
|
||||
<title>(*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(*github.com/sirupsen/logrus.Logger).Debug</title>
|
||||
<g id="a_edge9"><a xlink:title="at reseed_bootstrap.go:43: calling [(*github.com/sirupsen/logrus.Logger).Debug]">
|
||||
<path fill="none" stroke="#8b4513" d="M106.6294,-374.0251C143.6948,-400.3648 212.738,-449.4289 254.1541,-478.8604"/>
|
||||
<polygon fill="#8b4513" stroke="#8b4513" points="252.3722,-481.8878 262.551,-484.8275 256.427,-476.1818 252.3722,-481.8878"/>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/sirupsen/logrus.Logger).Info -->
|
||||
<g id="node11" class="node">
|
||||
<title>(*github.com/sirupsen/logrus.Logger).Info</title>
|
||||
<g id="a_node11"><a xlink:title="(*github.com/sirupsen/logrus.Logger).Info | defined in logger.go:225">
|
||||
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M305.6193,-582C305.6193,-582 270.6277,-582 270.6277,-582 264.6277,-582 258.6277,-576 258.6277,-570 258.6277,-570 258.6277,-558 258.6277,-558 258.6277,-552 264.6277,-546 270.6277,-546 270.6277,-546 305.6193,-546 305.6193,-546 311.6193,-546 317.6193,-552 317.6193,-558 317.6193,-558 317.6193,-570 317.6193,-570 317.6193,-576 311.6193,-582 305.6193,-582"/>
|
||||
<text text-anchor="middle" x="288.1235" y="-568.2" font-family="Verdana" font-size="14.00" fill="#000000">logrus</text>
|
||||
<text text-anchor="middle" x="288.1235" y="-551.4" font-family="Verdana" font-size="14.00" fill="#000000">Info</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(*github.com/sirupsen/logrus.Logger).Info -->
|
||||
<g id="edge7" class="edge">
|
||||
<title>(*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(*github.com/sirupsen/logrus.Logger).Info</title>
|
||||
<g id="a_edge7"><a xlink:title="at reseed_bootstrap.go:62: calling [(*github.com/sirupsen/logrus.Logger).Info]">
|
||||
<path fill="none" stroke="#8b4513" d="M92.3256,-374.0399C114.3749,-408.7975 166.9292,-485.8578 227.5288,-534 234.1285,-539.243 241.7932,-543.9051 249.4061,-547.8995"/>
|
||||
<polygon fill="#8b4513" stroke="#8b4513" points="248.0753,-551.1458 258.5915,-552.435 251.1745,-544.8692 248.0753,-551.1458"/>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (github.com/go-i2p/go-i2p/lib/netdb/reseed.Reseed).SingleReseed -->
|
||||
<g id="node12" class="node">
|
||||
<title>(github.com/go-i2p/go-i2p/lib/netdb/reseed.Reseed).SingleReseed</title>
|
||||
<g id="a_node12"><a xlink:title="(github.com/go-i2p/go-i2p/lib/netdb/reseed.Reseed).SingleReseed | defined in reseed.go:31">
|
||||
<path fill="#ffe4b5" stroke="#000000" stroke-width="1.5" d="M326.3271,-668C326.3271,-668 249.9199,-668 249.9199,-668 243.9199,-668 237.9199,-662 237.9199,-656 237.9199,-656 237.9199,-644 237.9199,-644 237.9199,-638 243.9199,-632 249.9199,-632 249.9199,-632 326.3271,-632 326.3271,-632 332.3271,-632 338.3271,-638 338.3271,-644 338.3271,-644 338.3271,-656 338.3271,-656 338.3271,-662 332.3271,-668 326.3271,-668"/>
|
||||
<text text-anchor="middle" x="288.1235" y="-654.2" font-family="Verdana" font-size="14.00" fill="#000000">reseed</text>
|
||||
<text text-anchor="middle" x="288.1235" y="-637.4" font-family="Verdana" font-size="14.00" fill="#000000">SingleReseed</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- (*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(github.com/go-i2p/go-i2p/lib/netdb/reseed.Reseed).SingleReseed -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>(*github.com/go-i2p/go-i2p/lib/bootstrap.ReseedBootstrap).GetPeers->(github.com/go-i2p/go-i2p/lib/netdb/reseed.Reseed).SingleReseed</title>
|
||||
<g id="a_edge4"><a xlink:title="at reseed_bootstrap.go:49: calling [(github.com/go-i2p/go-i2p/lib/netdb/reseed.Reseed).SingleReseed]">
|
||||
<path fill="none" stroke="#8b4513" d="M89.919,-374.0435C110.3702,-415.6822 164.7136,-520.678 227.5288,-596 236.2167,-606.4176 246.9389,-616.6363 256.9371,-625.3325"/>
|
||||
<polygon fill="#8b4513" stroke="#8b4513" points="254.8567,-628.1572 264.7475,-631.9549 259.3837,-622.8181 254.8567,-628.1572"/>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 23 KiB |
@@ -1,4 +1,2 @@
|
||||
//
|
||||
// provides generic interfaces for initial bootstrap into network and network reseeding
|
||||
//
|
||||
package bootstrap
|
||||
|
76
lib/bootstrap/reseed_bootstrap.go
Normal file
76
lib/bootstrap/reseed_bootstrap.go
Normal file
@@ -0,0 +1,76 @@
|
||||
package bootstrap
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/go-i2p/common/router_info"
|
||||
"github.com/go-i2p/go-i2p/lib/config"
|
||||
"github.com/go-i2p/go-i2p/lib/netdb/reseed"
|
||||
"github.com/go-i2p/logger"
|
||||
"github.com/sirupsen/logrus"
|
||||
|
||||
"github.com/samber/oops"
|
||||
)
|
||||
|
||||
var log = logger.GetGoI2PLogger()
|
||||
|
||||
// ReseedBootstrap implements the Bootstrap interface using HTTP reseeding
|
||||
type ReseedBootstrap struct {
|
||||
// Configuration containing reseed servers
|
||||
config *config.BootstrapConfig
|
||||
}
|
||||
|
||||
// NewReseedBootstrap creates a new reseeder with the provided configuration
|
||||
func NewReseedBootstrap(config *config.BootstrapConfig) *ReseedBootstrap {
|
||||
return &ReseedBootstrap{
|
||||
config: config,
|
||||
}
|
||||
}
|
||||
|
||||
// GetPeers implements the Bootstrap interface by obtaining RouterInfos
|
||||
// from configured reseed servers
|
||||
func (rb *ReseedBootstrap) GetPeers(ctx context.Context, n int) ([]router_info.RouterInfo, error) {
|
||||
var allRouterInfos []router_info.RouterInfo
|
||||
var lastErr error
|
||||
|
||||
// Try each reseed server until we get enough routerInfos or exhaust all servers
|
||||
for _, server := range rb.config.ReseedServers {
|
||||
// Check if context is canceled before making request
|
||||
if ctx.Err() != nil {
|
||||
return nil, oops.Errorf("reseed canceled: %v", ctx.Err())
|
||||
}
|
||||
|
||||
log.WithField("server", server.Url).Debug("Attempting to reseed from server")
|
||||
|
||||
// Use the existing Reseed implementation with a timeout context
|
||||
reseeder := reseed.NewReseed()
|
||||
|
||||
// Perform the actual reseeding operation synchronously
|
||||
serverRIs, err := reseeder.SingleReseed(server.Url)
|
||||
if err != nil {
|
||||
log.WithError(err).WithField("server", server.Url).Warn("Reseed attempt failed")
|
||||
lastErr = oops.Errorf("reseed from %s failed: %v", server.Url, err)
|
||||
continue
|
||||
}
|
||||
|
||||
// Add the retrieved RouterInfos to our collection
|
||||
allRouterInfos = append(allRouterInfos, serverRIs...)
|
||||
log.WithFields(logrus.Fields{
|
||||
"server": server.Url,
|
||||
"count": len(serverRIs),
|
||||
"total": len(allRouterInfos),
|
||||
}).Info("Successfully obtained router infos from reseed server")
|
||||
|
||||
// Check if we have enough RouterInfos
|
||||
if n > 0 && len(allRouterInfos) >= n {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// If we couldn't get any RouterInfos from any server, return the last error
|
||||
if len(allRouterInfos) == 0 && lastErr != nil {
|
||||
return nil, oops.Errorf("all reseed attempts failed: %w", lastErr)
|
||||
}
|
||||
|
||||
return allRouterInfos, nil
|
||||
}
|
@@ -1,18 +0,0 @@
|
||||
//
|
||||
// base32 encoding using I2P's alphabet
|
||||
//
|
||||
package base32
|
||||
|
||||
import (
|
||||
b32 "encoding/base32"
|
||||
)
|
||||
|
||||
var I2PEncoding *b32.Encoding = b32.NewEncoding("abcdefghijklmnopqrstuvwxyz234567")
|
||||
|
||||
//
|
||||
// Return a go string of the I2P base32
|
||||
// encoding of the provided byte slice
|
||||
//
|
||||
func EncodeToString(data []byte) string {
|
||||
return I2PEncoding.EncodeToString(data)
|
||||
}
|
@@ -1,30 +0,0 @@
|
||||
//
|
||||
// base64 encoding using I2P's alphabet
|
||||
//
|
||||
package base64
|
||||
|
||||
import (
|
||||
b64 "encoding/base64"
|
||||
)
|
||||
|
||||
// i2p base64 alphabet
|
||||
const Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-~"
|
||||
|
||||
// i2p base64 encoding
|
||||
var I2PEncoding *b64.Encoding = b64.NewEncoding(Alphabet)
|
||||
|
||||
//
|
||||
// Return a go string of the I2P base64
|
||||
// encoding of the provided byte slice
|
||||
//
|
||||
func EncodeToString(data []byte) string {
|
||||
return I2PEncoding.EncodeToString(data)
|
||||
}
|
||||
|
||||
//
|
||||
// decode string using i2p base64 encoding
|
||||
// returns error if data is malfromed
|
||||
//
|
||||
func DecodeFromString(str string) (d []byte, err error) {
|
||||
return I2PEncoding.DecodeString(str)
|
||||
}
|
@@ -1,183 +0,0 @@
|
||||
package common
|
||||
|
||||
/*
|
||||
I2P Certificate
|
||||
https://geti2p.net/spec/common-structures#certificate
|
||||
Accurate for version 0.9.24
|
||||
|
||||
+----+----+----+----+----+-//
|
||||
|type| length | payload
|
||||
+----+----+----+----+----+-//
|
||||
|
||||
type :: Integer
|
||||
length -> 1 byte
|
||||
|
||||
case 0 -> NULL
|
||||
case 1 -> HASHCASH
|
||||
case 2 -> HIDDEN
|
||||
case 3 -> SIGNED
|
||||
case 4 -> MULTIPLE
|
||||
case 5 -> KEY
|
||||
|
||||
length :: Integer
|
||||
length -> 2 bytes
|
||||
|
||||
payload :: data
|
||||
length -> $length bytes
|
||||
*/
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
// Certificate Types
|
||||
const (
|
||||
CERT_NULL = iota
|
||||
CERT_HASHCASH
|
||||
CERT_HIDDEN
|
||||
CERT_SIGNED
|
||||
CERT_MULTIPLE
|
||||
CERT_KEY
|
||||
)
|
||||
|
||||
// Minimum size of a valid Certificate
|
||||
const (
|
||||
CERT_MIN_SIZE = 3
|
||||
)
|
||||
|
||||
type Certificate struct {
|
||||
kind Integer
|
||||
leng Integer
|
||||
payl []byte
|
||||
}
|
||||
|
||||
func (c *Certificate) RawBytes() []byte {
|
||||
bytes := c.kind.Bytes()
|
||||
bytes = append(bytes, c.leng.Bytes()...)
|
||||
bytes = append(bytes, c.payl...)
|
||||
return bytes
|
||||
}
|
||||
|
||||
func (c *Certificate) ExcessBytes() []byte {
|
||||
return c.payl[c.leng.Int():]
|
||||
}
|
||||
|
||||
func (c *Certificate) Bytes() []byte {
|
||||
bytes := c.kind.Bytes()
|
||||
bytes = append(bytes, c.leng.Bytes()...)
|
||||
bytes = append(bytes, c.Data()...)
|
||||
return bytes
|
||||
}
|
||||
|
||||
func (c *Certificate) length() (cert_len int) {
|
||||
cert_len = len(c.Bytes())
|
||||
return
|
||||
}
|
||||
|
||||
//
|
||||
// Return the Certificate Type specified in the first byte of the Certificate,
|
||||
// and an error if the certificate is shorter than the minimum certificate size.
|
||||
//
|
||||
func (c *Certificate) Type() (cert_type int) {
|
||||
cert_type = c.kind.Int()
|
||||
return
|
||||
}
|
||||
|
||||
//
|
||||
// Look up the length of the Certificate, reporting errors if the certificate is
|
||||
// shorter than the minimum certificate size or if the reported length doesn't
|
||||
// match the provided data.
|
||||
//
|
||||
func (c *Certificate) Length() (length int) {
|
||||
length = c.leng.Int()
|
||||
return
|
||||
}
|
||||
|
||||
//
|
||||
// Return the Certificate data and any errors encountered parsing the Certificate.
|
||||
//
|
||||
func (c *Certificate) Data() (data []byte) {
|
||||
lastElement := c.Length()
|
||||
if lastElement > len(c.payl) {
|
||||
data = c.payl
|
||||
} else {
|
||||
data = c.payl[0:lastElement]
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func NewCertificate(data []byte) (certificate *Certificate, err error) {
|
||||
certificate = &Certificate{}
|
||||
switch len(data) {
|
||||
case 0:
|
||||
certificate.kind = NewInteger([]byte{0})
|
||||
certificate.leng = NewInteger([]byte{0})
|
||||
log.WithFields(log.Fields{
|
||||
"at": "(Certificate) NewCertificate",
|
||||
"certificate_bytes_length": len(data),
|
||||
"reason": "too short (len < CERT_MIN_SIZE)" + fmt.Sprintf("%d", certificate.kind.Int()),
|
||||
}).Error("invalid certificate")
|
||||
err = fmt.Errorf("error parsing certificate: certificate is too short")
|
||||
return
|
||||
case 1:
|
||||
certificate.kind = NewInteger(data[0:0])
|
||||
certificate.leng = NewInteger([]byte{0})
|
||||
log.WithFields(log.Fields{
|
||||
"at": "(Certificate) NewCertificate",
|
||||
"certificate_bytes_length": len(data),
|
||||
"reason": "too short (len < CERT_MIN_SIZE)" + fmt.Sprintf("%d", certificate.kind.Int()),
|
||||
}).Error("invalid certificate")
|
||||
err = fmt.Errorf("error parsing certificate: certificate is too short")
|
||||
return
|
||||
case 2:
|
||||
certificate.kind = NewInteger(data[0:1])
|
||||
certificate.leng = NewInteger([]byte{0})
|
||||
log.WithFields(log.Fields{
|
||||
"at": "(Certificate) NewCertificate",
|
||||
"certificate_bytes_length": len(data),
|
||||
"reason": "too short (len < CERT_MIN_SIZE)" + fmt.Sprintf("%d", certificate.kind.Int()),
|
||||
}).Error("invalid certificate")
|
||||
err = fmt.Errorf("error parsing certificate length: certificate is too short")
|
||||
return
|
||||
default:
|
||||
certificate.kind = NewInteger(data[0:1])
|
||||
certificate.leng = NewInteger(data[1:3])
|
||||
payleng := len(data) - CERT_MIN_SIZE
|
||||
certificate.payl = data[CERT_MIN_SIZE:]
|
||||
if certificate.leng.Int() > len(data)-CERT_MIN_SIZE {
|
||||
err = fmt.Errorf("certificate parsing warning: certificate data is shorter than specified by length")
|
||||
log.WithFields(log.Fields{
|
||||
"at": "(Certificate) NewCertificate",
|
||||
"certificate_bytes_length": certificate.leng.Int(),
|
||||
"certificate_payload_length": payleng,
|
||||
"reason": err.Error(),
|
||||
}).Error("invalid certificate")
|
||||
return
|
||||
} else if certificate.leng.Int() < len(data)-CERT_MIN_SIZE {
|
||||
err = fmt.Errorf("certificate parsing warning: certificate data is longer than specified by length")
|
||||
log.WithFields(log.Fields{
|
||||
"at": "(Certificate) NewCertificate",
|
||||
"certificate_bytes_length": certificate.leng.Int(),
|
||||
"certificate_payload_length": payleng,
|
||||
"reason": err.Error(),
|
||||
}).Error("invalid certificate")
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Read a Certificate from a slice of bytes, returning any extra data on the end of the slice
|
||||
// and any errors if a valid Certificate could not be read.
|
||||
//
|
||||
func ReadCertificate(data []byte) (certificate *Certificate, remainder []byte, err error) {
|
||||
certificate, err = NewCertificate(data)
|
||||
if err != nil && err.Error() == "certificate parsing warning: certificate data is longer than specified by length" {
|
||||
remainder = certificate.ExcessBytes()
|
||||
err = nil
|
||||
}
|
||||
return
|
||||
}
|
@@ -1,149 +0,0 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestCertificateTypeIsFirstByte(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
bytes := []byte{0x03, 0x00, 0x00}
|
||||
certificate, err := NewCertificate(bytes)
|
||||
cert_type := certificate.Type()
|
||||
|
||||
assert.Equal(cert_type, 3, "certificate.Type() should be the first bytes in a certificate")
|
||||
assert.Nil(err)
|
||||
}
|
||||
|
||||
func TestCertificateLengthCorrect(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
bytes := []byte{0x03, 0x00, 0x02, 0xff, 0xff}
|
||||
certificate, err := NewCertificate(bytes)
|
||||
cert_len := certificate.Length()
|
||||
|
||||
assert.Equal(cert_len, 2, "certificate.Length() should return integer from second two bytes")
|
||||
assert.Nil(err)
|
||||
}
|
||||
|
||||
func TestCertificateLengthErrWhenTooShort(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
bytes := []byte{0x03, 0x01}
|
||||
certificate, err := NewCertificate(bytes)
|
||||
cert_len := certificate.Length()
|
||||
|
||||
assert.Equal(cert_len, 0, "certificate.Length() did not return zero length for missing length data")
|
||||
if assert.NotNil(err) {
|
||||
assert.Equal("error parsing certificate length: certificate is too short", err.Error(), "correct error message should be returned")
|
||||
}
|
||||
}
|
||||
|
||||
func TestCertificateLengthErrWhenDataTooShort(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
bytes := []byte{0x03, 0x00, 0x02, 0xff}
|
||||
certificate, err := NewCertificate(bytes)
|
||||
cert_len := certificate.Length()
|
||||
|
||||
assert.Equal(cert_len, 2, "certificate.Length() did not return indicated length when data was actually missing")
|
||||
if assert.NotNil(err) {
|
||||
assert.Equal("certificate parsing warning: certificate data is shorter than specified by length", err.Error(), "correct error message should be returned")
|
||||
}
|
||||
}
|
||||
|
||||
func TestCertificateDataWhenCorrectSize(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
bytes := []byte{0x03, 0x00, 0x01, 0xaa}
|
||||
certificate, err := NewCertificate(bytes)
|
||||
cert_data := certificate.Data()
|
||||
|
||||
assert.Nil(err, "certificate.Data() returned error with valid data")
|
||||
cert_len := len(cert_data)
|
||||
assert.Equal(cert_len, 1, "certificate.Length() did not return indicated length when data was valid")
|
||||
assert.Equal(170, int(cert_data[0]), "certificate.Data() returned incorrect data")
|
||||
}
|
||||
|
||||
func TestCertificateDataWhenTooLong(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
bytes := []byte{0x03, 0x00, 0x02, 0xff, 0xff, 0xaa, 0xaa}
|
||||
certificate, err := NewCertificate(bytes)
|
||||
cert_data := certificate.Data()
|
||||
|
||||
if assert.NotNil(err) {
|
||||
assert.Equal("certificate parsing warning: certificate data is longer than specified by length", err.Error(), "correct error message should be returned")
|
||||
}
|
||||
cert_len := certificate.Length() //len(cert_data)
|
||||
assert.Equal(cert_len, 2, "certificate.Length() did not return indicated length when data was too long")
|
||||
if cert_data[0] != 0xff || cert_data[1] != 0xff {
|
||||
t.Fatal("certificate.Data() returned incorrect data when data was too long")
|
||||
}
|
||||
}
|
||||
|
||||
func TestCertificateDataWhenTooShort(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
bytes := []byte{0x03, 0x00, 0x02, 0xff}
|
||||
certificate, err := NewCertificate(bytes)
|
||||
cert_data := certificate.Data()
|
||||
|
||||
if assert.NotNil(err) {
|
||||
assert.Equal("certificate parsing warning: certificate data is shorter than specified by length", err.Error(), "correct error message should be returned")
|
||||
}
|
||||
cert_len := len(cert_data)
|
||||
assert.Equal(cert_len, 1, "certificate.Data() did not return correct amount of data when data too short")
|
||||
assert.Equal(255, int(cert_data[0]), "certificate.Data() did not return correct data values when data was too short")
|
||||
}
|
||||
|
||||
func TestReadCertificateWithCorrectData(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
bytes := []byte{0x00, 0x00, 0x02, 0xff, 0xff}
|
||||
cert, remainder, err := ReadCertificate(bytes)
|
||||
|
||||
assert.Equal(cert.length(), 5, "ReadCertificate() did not return correct amount of data for valid certificate")
|
||||
assert.Equal(len(remainder), 0, "ReadCertificate() did not return a zero length remainder on a valid certificate")
|
||||
assert.Nil(err, "ReadCertificate() should not return an error with valid data")
|
||||
}
|
||||
|
||||
func TestReadCertificateWithDataTooShort(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
bytes := []byte{0x00, 0x00, 0x02, 0xff}
|
||||
cert, remainder, err := ReadCertificate(bytes)
|
||||
|
||||
assert.Equal(cert.length(), 4, "ReadCertificate() did not return correct amount of data for certificate with missing data")
|
||||
assert.Equal(len(remainder), 0, "ReadCertificate() did not return a zero length remainder on certificate with missing data")
|
||||
if assert.NotNil(err) {
|
||||
assert.Equal("certificate parsing warning: certificate data is shorter than specified by length", err.Error(), "correct error message should be returned")
|
||||
}
|
||||
}
|
||||
|
||||
func TestReadCertificateWithRemainder(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
bytes := []byte{0x00, 0x00, 0x02, 0xff, 0xff, 0x01}
|
||||
cert, remainder, err := ReadCertificate(bytes)
|
||||
|
||||
assert.Equal(cert.length(), 5, "ReadCertificate() did not return correct amount of data for certificate with extra data")
|
||||
assert.Equal(len(remainder), 1, "ReadCertificate() returned incorrect length remainder on certificate with extra data")
|
||||
// assert.Equal(1, int(remainder[0]), "ReadCertificate() did not return correct remainder value")
|
||||
assert.Nil(err)
|
||||
}
|
||||
|
||||
func TestReadCertificateWithInvalidLength(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
bytes := []byte{0x00, 0x00}
|
||||
cert, remainder, err := ReadCertificate(bytes)
|
||||
|
||||
assert.Equal(cert.length(), 2, "ReadCertificate() should populate the certificate with the provided data even when invalid")
|
||||
assert.Equal(len(remainder), 0, "ReadCertificate() returned non-zero length remainder on invalid certificate")
|
||||
if assert.NotNil(err) {
|
||||
assert.Equal("error parsing certificate length: certificate is too short", err.Error(), "correct error message should be returned")
|
||||
}
|
||||
}
|
@@ -1,24 +0,0 @@
|
||||
package common
|
||||
|
||||
/*
|
||||
I2P Date
|
||||
https://geti2p.net/spec/common-structures#date
|
||||
Accurate for version 0.9.24
|
||||
*/
|
||||
|
||||
import (
|
||||
"time"
|
||||
)
|
||||
|
||||
type Date [8]byte
|
||||
|
||||
//
|
||||
// Time takes the value stored in date as an 8 byte big-endian integer representing the
|
||||
// number of milliseconds since the beginning of unix time and converts it to a Go time.Time
|
||||
// struct.
|
||||
//
|
||||
func (date Date) Time() (date_time time.Time) {
|
||||
seconds := NewInteger(date[:])
|
||||
date_time = time.Unix(0, int64(seconds.Int()*1000000))
|
||||
return
|
||||
}
|
@@ -1,15 +0,0 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"github.com/stretchr/testify/assert"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestTimeFromMiliseconds(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
next_day := Date{0x00, 0x00, 0x00, 0x00, 0x05, 0x26, 0x5c, 0x00}
|
||||
go_time := next_day.Time()
|
||||
|
||||
assert.Equal(int64(86400), go_time.Unix(), "Date.Time() did not parse time in milliseconds")
|
||||
}
|
@@ -1,58 +0,0 @@
|
||||
package common
|
||||
|
||||
/*
|
||||
I2P Destination
|
||||
https://geti2p.net/spec/common-structures#destination
|
||||
Accurate for version 0.9.24
|
||||
|
||||
Identical to KeysAndCert
|
||||
*/
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/go-i2p/go-i2p/lib/common/base32"
|
||||
"github.com/go-i2p/go-i2p/lib/common/base64"
|
||||
"github.com/go-i2p/go-i2p/lib/crypto"
|
||||
)
|
||||
|
||||
//
|
||||
// A Destination is a KeysAndCert with functionallity
|
||||
// for generating base32 and base64 addresses.
|
||||
//
|
||||
type Destination []byte
|
||||
|
||||
func (destination Destination) PublicKey() (crypto.PublicKey, error) {
|
||||
return KeysAndCert(destination).PublicKey()
|
||||
}
|
||||
|
||||
func (destination Destination) SigningPublicKey() (crypto.SigningPublicKey, error) {
|
||||
return KeysAndCert(destination).SigningPublicKey()
|
||||
}
|
||||
|
||||
func (destination Destination) Certificate() (*Certificate, error) {
|
||||
return KeysAndCert(destination).Certificate()
|
||||
}
|
||||
|
||||
func ReadDestination(data []byte) (destination Destination, remainder []byte, err error) {
|
||||
keys_and_cert, remainder, err := ReadKeysAndCert(data)
|
||||
destination = Destination(keys_and_cert)
|
||||
return
|
||||
}
|
||||
|
||||
//
|
||||
// Generate the I2P base32 address for this Destination.
|
||||
//
|
||||
func (destination Destination) Base32Address() (str string) {
|
||||
hash := crypto.SHA256(destination)
|
||||
str = strings.Trim(base32.EncodeToString(hash[:]), "=")
|
||||
str = str + ".b32.i2p"
|
||||
return
|
||||
}
|
||||
|
||||
//
|
||||
// Generate the I2P base64 address for this Destination.
|
||||
//
|
||||
func (destination Destination) Base64() string {
|
||||
return base64.EncodeToString(destination)
|
||||
}
|
@@ -1,13 +0,0 @@
|
||||
FROM golang
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get upgrade -y
|
||||
|
||||
RUN go get github.com/dvyukov/go-fuzz/go-fuzz
|
||||
RUN go get github.com/dvyukov/go-fuzz/go-fuzz-build
|
||||
RUN go get github.com/hkparker/go-i2p
|
||||
RUN go get github.com/ddollar/forego
|
||||
|
||||
WORKDIR /go/src/github.com/hkparker/go-i2p
|
||||
|
||||
ENTRYPOINT ["make", "fuzz"]
|
@@ -1,8 +0,0 @@
|
||||
fuzz:
|
||||
go-fuzz-build -o keys_and_cert/exportable-fuzz.zip github.com/hkparker/go-i2p/lib/common/fuzz/keys_and_cert
|
||||
go-fuzz-build -o certificate/exportable-fuzz.zip github.com/hkparker/go-i2p/lib/common/fuzz/certificate
|
||||
go-fuzz-build -o destination/exportable-fuzz.zip github.com/hkparker/go-i2p/lib/common/fuzz/destination
|
||||
go-fuzz-build -o router_address/exportable-fuzz.zip github.com/hkparker/go-i2p/lib/common/fuzz/router_address
|
||||
go-fuzz-build -o router_identity/exportable-fuzz.zip github.com/hkparker/go-i2p/lib/common/fuzz/router_identity
|
||||
go-fuzz-build -o string/exportable-fuzz.zip github.com/hkparker/go-i2p/lib/common/fuzz/string
|
||||
forego start
|
@@ -1,6 +0,0 @@
|
||||
keys_and_cert: go-fuzz -bin=keys_and_cert/exportable-fuzz.zip -workdir=lib/common/fuzz/keys_and_cert -procs=2
|
||||
certificate: go-fuzz -bin=certificate/exportable-fuzz.zip -workdir=lib/common/fuzz/certificate -procs=2
|
||||
destination: go-fuzz -bin=destination/exportable-fuzz.zip -workdir=lib/common/fuzz/destination -procs=2
|
||||
router_address: go-fuzz -bin=router_address/exportable-fuzz.zip -workdir=lib/common/fuzz/router_address -procs=2
|
||||
router_identity: go-fuzz -bin=router_identity/exportable-fuzz.zip -workdir=lib/common/fuzz/router_identity -procs=2
|
||||
string: go-fuzz -bin=string/exportable-fuzz.zip -workdir=lib/common/fuzz/string -procs=2
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +0,0 @@
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +0,0 @@
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,11 +0,0 @@
|
||||
package exportable
|
||||
|
||||
import "github.com/go-i2p/go-i2p/lib/common"
|
||||
|
||||
func Fuzz(data []byte) int {
|
||||
cert := common.Certificate(data)
|
||||
cert.Data()
|
||||
cert.Length()
|
||||
cert.Type()
|
||||
return 0
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +0,0 @@
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,10 +0,0 @@
|
||||
package exportable
|
||||
|
||||
import "github.com/go-i2p/go-i2p/lib/common"
|
||||
|
||||
func Fuzz(data []byte) int {
|
||||
destination := common.Destination(data)
|
||||
destination.Base32Address()
|
||||
destination.Base64()
|
||||
return 0
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +0,0 @@
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,11 +0,0 @@
|
||||
package exportable
|
||||
|
||||
import "github.com/go-i2p/go-i2p/lib/common"
|
||||
|
||||
func Fuzz(data []byte) int {
|
||||
keys_and_cert, _, _ := common.ReadKeysAndCert(data)
|
||||
keys_and_cert.Certificate()
|
||||
keys_and_cert.PublicKey()
|
||||
keys_and_cert.SigningPublicKey()
|
||||
return 0
|
||||
}
|
Binary file not shown.
@@ -1 +0,0 @@
|
||||
in literal
|
@@ -1 +0,0 @@
|
||||
i
|
@@ -1 +0,0 @@
|
||||
A<EFBFBD><EFBFBD><EFBFBD>q
|
@@ -1 +0,0 @@
|
||||
Bnzero lpngth explicit tag was not an Psn-1060808735Flag
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user