Skip to content
This repository has been archived by the owner on Nov 14, 2024. It is now read-only.

Adds support for listening on and connecting to I2P and Onion services securely #3293

Merged
merged 43 commits into from
Sep 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
4e3257b
add a demo of Dendrite-over-I2P
Jul 21, 2023
34cd9f7
update i2p demo
Nov 20, 2023
24b93e4
remove unused flags
Nov 20, 2023
b9c605a
clean up
Nov 20, 2023
05816a2
Allow self-signed certs when using a SAMv3 dialer, disallow non-I2P h…
Nov 21, 2023
d1241d8
Merge branch 'matrix-org:main' into i2p-demo
eyedeekay Nov 26, 2023
e247f04
Add branch updater script
Nov 26, 2023
d7e4b1b
Add branch updater script
Nov 26, 2023
892d088
add instructions
Nov 27, 2023
d43e3cc
fix curlpipe
Nov 28, 2023
8c86ef6
It's less easy, but still possible, to set up a Tor demo service
Dec 27, 2023
aa855c6
Merge branch 'matrix-org:main' into i2p-demo
eyedeekay Dec 27, 2023
8ed0365
remove index.html
Dec 27, 2023
2668607
Merge branch 'i2p-demo' of github.com:eyedeekay/dendrite into i2p-demo
Dec 27, 2023
613f075
remove README_I2P
Dec 27, 2023
5f778d5
Update onramp version to 0.33.7, which sets i2cp.leaseSetEncType=4,0 …
Jan 10, 2024
da7c367
Use shorter tunnels with more redundancy when serving the homeserver
Jan 25, 2024
04de572
Use longer tunnels with more redundancy when serving the homeserver
Jan 25, 2024
4f23dba
Merge branch 'main' of github.com:matrix-org/dendrite into i2p-demo
S7evinK Feb 29, 2024
2aa0abb
Move to contrib
S7evinK Feb 29, 2024
3370e50
go mod tidy
S7evinK Feb 29, 2024
b3c663f
Disable err checks
S7evinK Feb 29, 2024
5d36ec5
Merge branch 'main' of github.com:matrix-org/dendrite into i2p-demo
S7evinK Aug 3, 2024
e030f0b
Merge branch 'main' of github.com:matrix-org/dendrite into i2p-demo
S7evinK Aug 3, 2024
4341cd2
Tor demo: Delete unused --flag samAddr
eyedeekay Aug 3, 2024
5098937
Tor demo: delete unused 'flag' library
eyedeekay Aug 3, 2024
11b284a
Skip tests that require external services(Tor, I2P) when running in CI
eyedeekay Aug 6, 2024
ef53e8b
Look up environment variables and determine if they are set or not in…
eyedeekay Aug 20, 2024
5124858
disable tests completely, something wierd is going on
eyedeekay Aug 21, 2024
dd6095f
Delete the tests, WTF, there are no tests to run so they can't fail r…
eyedeekay Aug 21, 2024
51d8d86
just comment out the whole test file
eyedeekay Aug 21, 2024
32ddf2a
uncomment tests and re-run them but what the hell
eyedeekay Aug 21, 2024
2602355
fix the test by checking the CI variable in the real main, not in the…
eyedeekay Aug 21, 2024
b0d4d7c
bail out of the main sooner when testing
eyedeekay Aug 21, 2024
0832209
Fall back to Tor when it is not an I2P host
eyedeekay Sep 12, 2024
246a9a4
Format everything
eyedeekay Sep 13, 2024
2b580bc
Fix comment
eyedeekay Sep 13, 2024
9aa7222
Merge branch 'main' into i2p-demo
eyedeekay Sep 13, 2024
a9da770
Resolve merge conflicts and remove unused files
eyedeekay Sep 13, 2024
e4785eb
update onramp version
eyedeekay Sep 18, 2024
00d2155
Merge branch 'main' of github.com:matrix-org/dendrite into i2p-demo
S7evinK Sep 22, 2024
5317fbe
Run go mod tidy
S7evinK Sep 22, 2024
1fea81a
Use Context funcs
S7evinK Sep 22, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
185 changes: 185 additions & 0 deletions contrib/dendrite-demo-i2p/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
// Copyright 2017 Vector Creations Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package main

import (
"flag"
"os"
"time"

"github.com/getsentry/sentry-go"
"github.com/matrix-org/dendrite/internal"
"github.com/matrix-org/dendrite/internal/caching"
"github.com/matrix-org/dendrite/internal/httputil"
"github.com/matrix-org/dendrite/internal/sqlutil"
"github.com/matrix-org/dendrite/setup/jetstream"
"github.com/matrix-org/dendrite/setup/process"
"github.com/matrix-org/gomatrixserverlib/fclient"
"github.com/prometheus/client_golang/prometheus"
"github.com/sirupsen/logrus"

"github.com/matrix-org/dendrite/appservice"
"github.com/matrix-org/dendrite/federationapi"
"github.com/matrix-org/dendrite/roomserver"
"github.com/matrix-org/dendrite/setup"
basepkg "github.com/matrix-org/dendrite/setup/base"
"github.com/matrix-org/dendrite/setup/config"
"github.com/matrix-org/dendrite/setup/mscs"
"github.com/matrix-org/dendrite/userapi"
)

var (
samAddr = flag.String("samaddr", "127.0.0.1:7656", "Address to connect to the I2P SAMv3 API")
_, skip = os.LookupEnv("CI")
)

func main() {
cfg := setup.ParseFlags(true)
if skip {
return
}

configErrors := &config.ConfigErrors{}
cfg.Verify(configErrors)
if len(*configErrors) > 0 {
for _, err := range *configErrors {
logrus.Errorf("Configuration error: %s", err)
}
logrus.Fatalf("Failed to start due to configuration errors")
}
processCtx := process.NewProcessContext()

internal.SetupStdLogging()
internal.SetupHookLogging(cfg.Logging)
internal.SetupPprof()

basepkg.PlatformSanityChecks()

logrus.Infof("Dendrite version %s", internal.VersionString())
if !cfg.ClientAPI.RegistrationDisabled && cfg.ClientAPI.OpenRegistrationWithoutVerificationEnabled {
logrus.Warn("Open registration is enabled")
}

// create DNS cache
var dnsCache *fclient.DNSCache
if cfg.Global.DNSCache.Enabled {
dnsCache = fclient.NewDNSCache(
cfg.Global.DNSCache.CacheSize,
cfg.Global.DNSCache.CacheLifetime,
)
logrus.Infof(
"DNS cache enabled (size %d, lifetime %s)",
cfg.Global.DNSCache.CacheSize,
cfg.Global.DNSCache.CacheLifetime,
)
}

// setup tracing
closer, err := cfg.SetupTracing()
if err != nil {
logrus.WithError(err).Panicf("failed to start opentracing")
}
defer closer.Close() // nolint: errcheck

// setup sentry
if cfg.Global.Sentry.Enabled {
logrus.Info("Setting up Sentry for debugging...")
err = sentry.Init(sentry.ClientOptions{
Dsn: cfg.Global.Sentry.DSN,
Environment: cfg.Global.Sentry.Environment,
Debug: true,
ServerName: string(cfg.Global.ServerName),
Release: "dendrite@" + internal.VersionString(),
AttachStacktrace: true,
})
if err != nil {
logrus.WithError(err).Panic("failed to start Sentry")
}
go func() {
processCtx.ComponentStarted()
<-processCtx.WaitForShutdown()
if !sentry.Flush(time.Second * 5) {
logrus.Warnf("failed to flush all Sentry events!")
}
processCtx.ComponentFinished()
}()
}

federationClient := basepkg.CreateFederationClient(cfg, dnsCache)
httpClient := basepkg.CreateClient(cfg, dnsCache)

// prepare required dependencies
cm := sqlutil.NewConnectionManager(processCtx, cfg.Global.DatabaseOptions)
routers := httputil.NewRouters()

caches := caching.NewRistrettoCache(cfg.Global.Cache.EstimatedMaxSize, cfg.Global.Cache.MaxAge, caching.EnableMetrics)
natsInstance := jetstream.NATSInstance{}
rsAPI := roomserver.NewInternalAPI(processCtx, cfg, cm, &natsInstance, caches, caching.EnableMetrics)
fsAPI := federationapi.NewInternalAPI(
processCtx, cfg, cm, &natsInstance, federationClient, rsAPI, caches, nil, false,
)

keyRing := fsAPI.KeyRing()

// The underlying roomserver implementation needs to be able to call the fedsender.
// This is different to rsAPI which can be the http client which doesn't need this
// dependency. Other components also need updating after their dependencies are up.
rsAPI.SetFederationAPI(fsAPI, keyRing)

userAPI := userapi.NewInternalAPI(processCtx, cfg, cm, &natsInstance, rsAPI, federationClient, caching.EnableMetrics, fsAPI.IsBlacklistedOrBackingOff)
asAPI := appservice.NewInternalAPI(processCtx, cfg, &natsInstance, userAPI, rsAPI)

rsAPI.SetAppserviceAPI(asAPI)
rsAPI.SetUserAPI(userAPI)

monolith := setup.Monolith{
Config: cfg,
Client: httpClient,
FedClient: federationClient,
KeyRing: keyRing,

AppserviceAPI: asAPI,
// always use the concrete impl here even in -http mode because adding public routes
// must be done on the concrete impl not an HTTP client else fedapi will call itself
FederationAPI: fsAPI,
RoomserverAPI: rsAPI,
UserAPI: userAPI,
}
monolith.AddAllPublicRoutes(processCtx, cfg, routers, cm, &natsInstance, caches, caching.EnableMetrics)

if len(cfg.MSCs.MSCs) > 0 {
if err := mscs.Enable(cfg, cm, routers, &monolith, caches); err != nil {
logrus.WithError(err).Fatalf("Failed to enable MSCs")
}
}

upCounter := prometheus.NewCounter(prometheus.CounterOpts{
Namespace: "dendrite",
Name: "up",
ConstLabels: map[string]string{
"version": internal.VersionString(),
},
})
upCounter.Add(1)
prometheus.MustRegister(upCounter)

// Expose the matrix APIs directly rather than putting them under a /api path.
go func() {
SetupAndServeHTTPS(processCtx, cfg, routers) //, httpsAddr, nil, nil)
}()

// We want to block forever to let the HTTP and HTTPS handler serve the APIs
basepkg.WaitForShutdown(processCtx)
}
Loading
Loading