refactor: move grpc and http APIs to separate packages

This commit is contained in:
braginini 2021-08-07 13:51:17 +02:00
parent 08d44b1d5f
commit 9f0c86c28e
11 changed files with 39 additions and 36 deletions

View File

@ -4,8 +4,9 @@ import (
"context" "context"
"flag" "flag"
"fmt" "fmt"
"github.com/wiretrustee/wiretrustee/management/http_server"
"github.com/wiretrustee/wiretrustee/management/server" "github.com/wiretrustee/wiretrustee/management/server"
grpc2 "github.com/wiretrustee/wiretrustee/management/server/grpc"
"github.com/wiretrustee/wiretrustee/management/server/http"
"github.com/wiretrustee/wiretrustee/util" "github.com/wiretrustee/wiretrustee/util"
"net" "net"
"os" "os"
@ -58,21 +59,21 @@ var (
var opts []grpc.ServerOption var opts []grpc.ServerOption
var httpServer *http_server.Server var httpServer *http.Server
if config.HttpConfig.LetsEncryptDomain != "" { if config.HttpConfig.LetsEncryptDomain != "" {
certManager := encryption.CreateCertManager(config.Datadir, config.HttpConfig.LetsEncryptDomain) certManager := encryption.CreateCertManager(config.Datadir, config.HttpConfig.LetsEncryptDomain)
transportCredentials := credentials.NewTLS(certManager.TLSConfig()) transportCredentials := credentials.NewTLS(certManager.TLSConfig())
opts = append(opts, grpc.Creds(transportCredentials)) opts = append(opts, grpc.Creds(transportCredentials))
httpServer = http_server.NewHttpsServer(config.HttpConfig, certManager) httpServer = http.NewHttpsServer(config.HttpConfig, certManager)
} else { } else {
httpServer = http_server.NewHttpServer(config.HttpConfig) httpServer = http.NewHttpServer(config.HttpConfig)
} }
opts = append(opts, grpc.KeepaliveEnforcementPolicy(kaep), grpc.KeepaliveParams(kasp)) opts = append(opts, grpc.KeepaliveEnforcementPolicy(kaep), grpc.KeepaliveParams(kasp))
grpcServer := grpc.NewServer(opts...) grpcServer := grpc.NewServer(opts...)
server, err := server.NewServer(config) server, err := grpc2.NewServer(config)
if err != nil { if err != nil {
log.Fatalf("failed creating new server: %v", err) log.Fatalf("failed creating new server: %v", err)
} }

View File

@ -1,8 +1,9 @@
package server package grpc
import ( import (
"context" "context"
"fmt" "fmt"
"github.com/wiretrustee/wiretrustee/management/server"
"sync" "sync"
"time" "time"
@ -17,12 +18,12 @@ import (
// Server an instance of a Management server // Server an instance of a Management server
type Server struct { type Server struct {
accountManager *AccountManager accountManager *server.AccountManager
wgKey wgtypes.Key wgKey wgtypes.Key
proto.UnimplementedManagementServiceServer proto.UnimplementedManagementServiceServer
peerChannels map[string]chan *UpdateChannelMessage peerChannels map[string]chan *UpdateChannelMessage
channelsMux *sync.Mutex channelsMux *sync.Mutex
config *Config config *server.Config
} }
// AllowedIPsFormat generates Wireguard AllowedIPs format (e.g. 100.30.30.1/32) // AllowedIPsFormat generates Wireguard AllowedIPs format (e.g. 100.30.30.1/32)
@ -33,12 +34,12 @@ type UpdateChannelMessage struct {
} }
// NewServer creates a new Management server // NewServer creates a new Management server
func NewServer(config *Config) (*Server, error) { func NewServer(config *server.Config) (*Server, error) {
key, err := wgtypes.GeneratePrivateKey() key, err := wgtypes.GeneratePrivateKey()
if err != nil { if err != nil {
return nil, err return nil, err
} }
store, err := NewStore(config.Datadir) store, err := server.NewStore(config.Datadir)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -47,7 +48,7 @@ func NewServer(config *Config) (*Server, error) {
// peerKey -> event channel // peerKey -> event channel
peerChannels: make(map[string]chan *UpdateChannelMessage), peerChannels: make(map[string]chan *UpdateChannelMessage),
channelsMux: &sync.Mutex{}, channelsMux: &sync.Mutex{},
accountManager: NewManager(store), accountManager: server.NewManager(store),
config: config, config: config,
}, nil }, nil
} }
@ -152,7 +153,7 @@ func (s *Server) RegisterPeer(ctx context.Context, req *proto.RegisterPeerReques
for _, remotePeer := range peers { for _, remotePeer := range peers {
if channel, ok := s.peerChannels[remotePeer.Key]; ok { if channel, ok := s.peerChannels[remotePeer.Key]; ok {
// exclude notified peer and add ourselves // exclude notified peer and add ourselves
peersToSend := []*Peer{peer} peersToSend := []*server.Peer{peer}
for _, p := range peers { for _, p := range peers {
if remotePeer.Key != p.Key { if remotePeer.Key != p.Key {
peersToSend = append(peersToSend, p) peersToSend = append(peersToSend, p)
@ -166,17 +167,17 @@ func (s *Server) RegisterPeer(ctx context.Context, req *proto.RegisterPeerReques
return &proto.RegisterPeerResponse{}, nil return &proto.RegisterPeerResponse{}, nil
} }
func toResponseProto(configProto Protocol) proto.HostConfig_Protocol { func toResponseProto(configProto server.Protocol) proto.HostConfig_Protocol {
switch configProto { switch configProto {
case UDP: case server.UDP:
return proto.HostConfig_UDP return proto.HostConfig_UDP
case DTLS: case server.DTLS:
return proto.HostConfig_DTLS return proto.HostConfig_DTLS
case HTTP: case server.HTTP:
return proto.HostConfig_HTTP return proto.HostConfig_HTTP
case HTTPS: case server.HTTPS:
return proto.HostConfig_HTTPS return proto.HostConfig_HTTPS
case TCP: case server.TCP:
return proto.HostConfig_TCP return proto.HostConfig_TCP
default: default:
//mbragin: todo something better? //mbragin: todo something better?
@ -184,7 +185,7 @@ func toResponseProto(configProto Protocol) proto.HostConfig_Protocol {
} }
} }
func toSyncResponse(config *Config, peer *Peer, peers []*Peer) *proto.SyncResponse { func toSyncResponse(config *server.Config, peer *server.Peer, peers []*server.Peer) *proto.SyncResponse {
var stuns []*proto.HostConfig var stuns []*proto.HostConfig
for _, stun := range config.Stuns { for _, stun := range config.Stuns {
@ -267,7 +268,7 @@ func (s *Server) closeUpdatesChannel(peerKey string) {
} }
// sendInitialSync sends initial proto.SyncResponse to the peer requesting synchronization // sendInitialSync sends initial proto.SyncResponse to the peer requesting synchronization
func (s *Server) sendInitialSync(peerKey wgtypes.Key, peer *Peer, srv proto.ManagementService_SyncServer) error { func (s *Server) sendInitialSync(peerKey wgtypes.Key, peer *server.Peer, srv proto.ManagementService_SyncServer) error {
peers, err := s.accountManager.GetPeersForAPeer(peer.Key) peers, err := s.accountManager.GetPeersForAPeer(peer.Key)
if err != nil { if err != nil {

View File

@ -4,18 +4,18 @@ import (
"context" "context"
"github.com/coreos/go-oidc" "github.com/coreos/go-oidc"
"github.com/gorilla/sessions" "github.com/gorilla/sessions"
"github.com/wiretrustee/wiretrustee/management/http_server/middleware" middleware2 "github.com/wiretrustee/wiretrustee/management/server/http/middleware"
"log" "log"
"net/http" "net/http"
) )
// Callback handler used to receive a callback from the identity provider // Callback handler used to receive a callback from the identity provider
type Callback struct { type Callback struct {
authenticator *middleware.Authenticator authenticator *middleware2.Authenticator
sessionStore sessions.Store sessionStore sessions.Store
} }
func NewCallback(authenticator *middleware.Authenticator, sessionStore sessions.Store) *Callback { func NewCallback(authenticator *middleware2.Authenticator, sessionStore sessions.Store) *Callback {
return &Callback{ return &Callback{
authenticator: authenticator, authenticator: authenticator,
sessionStore: sessionStore, sessionStore: sessionStore,

View File

@ -4,18 +4,18 @@ import (
"crypto/rand" "crypto/rand"
"encoding/base64" "encoding/base64"
"github.com/gorilla/sessions" "github.com/gorilla/sessions"
"github.com/wiretrustee/wiretrustee/management/http_server/middleware" middleware2 "github.com/wiretrustee/wiretrustee/management/server/http/middleware"
"io/fs" "io/fs"
"net/http" "net/http"
) )
// Login handler used to login a user // Login handler used to login a user
type Login struct { type Login struct {
authenticator *middleware.Authenticator authenticator *middleware2.Authenticator
sessionStore sessions.Store sessionStore sessions.Store
} }
func NewLogin(authenticator *middleware.Authenticator, sessionStore sessions.Store) *Login { func NewLogin(authenticator *middleware2.Authenticator, sessionStore sessions.Store) *Login {
return &Login{ return &Login{
authenticator: authenticator, authenticator: authenticator,
sessionStore: sessionStore, sessionStore: sessionStore,

View File

@ -1,12 +1,12 @@
package http_server package http
import ( import (
"context" "context"
"encoding/gob" "encoding/gob"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"github.com/wiretrustee/wiretrustee/management/http_server/handler"
"github.com/wiretrustee/wiretrustee/management/http_server/middleware"
s "github.com/wiretrustee/wiretrustee/management/server" s "github.com/wiretrustee/wiretrustee/management/server"
handler2 "github.com/wiretrustee/wiretrustee/management/server/http/handler"
middleware2 "github.com/wiretrustee/wiretrustee/management/server/http/middleware"
"golang.org/x/crypto/acme/autocert" "golang.org/x/crypto/acme/autocert"
"net/http" "net/http"
"time" "time"
@ -51,7 +51,7 @@ func (s *Server) Stop(ctx context.Context) error {
func (s *Server) Start() error { func (s *Server) Start() error {
sessionStore := sessions.NewFilesystemStore("", []byte("something-very-secret")) sessionStore := sessions.NewFilesystemStore("", []byte("something-very-secret"))
authenticator, err := middleware.NewAuthenticator(s.config.AuthDomain, s.config.AuthClientId, s.config.AuthClientSecret, s.config.AuthCallback) authenticator, err := middleware2.NewAuthenticator(s.config.AuthDomain, s.config.AuthClientId, s.config.AuthClientSecret, s.config.AuthCallback)
if err != nil { if err != nil {
log.Errorf("failed cerating authentication middleware %v", err) log.Errorf("failed cerating authentication middleware %v", err)
return err return err
@ -62,12 +62,12 @@ func (s *Server) Start() error {
r := http.NewServeMux() r := http.NewServeMux()
s.server.Handler = r s.server.Handler = r
r.Handle("/login", handler.NewLogin(authenticator, sessionStore)) r.Handle("/login", handler2.NewLogin(authenticator, sessionStore))
r.Handle("/logout", handler.NewLogout(s.config.AuthDomain, s.config.AuthClientId)) r.Handle("/logout", handler2.NewLogout(s.config.AuthDomain, s.config.AuthClientId))
r.Handle("/callback", handler.NewCallback(authenticator, sessionStore)) r.Handle("/callback", handler2.NewCallback(authenticator, sessionStore))
r.Handle("/dashboard", negroni.New( r.Handle("/dashboard", negroni.New(
negroni.HandlerFunc(middleware.NewAuth(sessionStore).IsAuthenticated), negroni.HandlerFunc(middleware2.NewAuth(sessionStore).IsAuthenticated),
negroni.Wrap(handler.NewDashboard(sessionStore))), negroni.Wrap(handler2.NewDashboard(sessionStore))),
) )
http.Handle("/", r) http.Handle("/", r)

View File

@ -3,6 +3,7 @@ package server_test
import ( import (
"context" "context"
server "github.com/wiretrustee/wiretrustee/management/server" server "github.com/wiretrustee/wiretrustee/management/server"
grpc2 "github.com/wiretrustee/wiretrustee/management/server/grpc"
"io/ioutil" "io/ioutil"
"math/rand" "math/rand"
"net" "net"
@ -425,7 +426,7 @@ func startServer(config *server.Config) (*grpc.Server, net.Listener) {
lis, err := net.Listen("tcp", ":0") lis, err := net.Listen("tcp", ":0")
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
s := grpc.NewServer() s := grpc.NewServer()
mgmtServer, err := server.NewServer(config) mgmtServer, err := grpc2.NewServer(config)
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
mgmtProto.RegisterManagementServiceServer(s, mgmtServer) mgmtProto.RegisterManagementServiceServer(s, mgmtServer)
go func() { go func() {