From 0db15e7bc2573803d24f2ae517c6113161114fd4 Mon Sep 17 00:00:00 2001 From: Ruoxi Wang Date: Wed, 20 Mar 2024 16:29:40 +0800 Subject: [PATCH] Add the ability to create multiple peers per user --- internal/app/wireguard/wireguard.go | 5 +-- internal/app/wireguard/wireguard_peers.go | 41 +++++++++++++---------- internal/config/config.go | 17 ++++++---- 3 files changed, 37 insertions(+), 26 deletions(-) diff --git a/internal/app/wireguard/wireguard.go b/internal/app/wireguard/wireguard.go index d720470..d941ed0 100644 --- a/internal/app/wireguard/wireguard.go +++ b/internal/app/wireguard/wireguard.go @@ -2,9 +2,10 @@ package wireguard import ( "context" + "time" + "github.com/h44z/wg-portal/internal/app" "github.com/sirupsen/logrus" - "time" evbus "github.com/vardius/message-bus" @@ -46,7 +47,7 @@ func (m Manager) connectToMessageBus() { func (m Manager) handleUserCreationEvent(user *domain.User) { logrus.Errorf("handling new user event for %s", user.Identifier) - if m.cfg.Core.CreateDefaultPeer { + if m.cfg.Core.CreateDefaultPeer && m.cfg.Core.DefaultPeersPerUser > 0 { ctx := domain.SetUserInfo(context.Background(), domain.SystemAdminContextUserInfo()) err := m.CreateDefaultPeer(ctx, user) if err != nil { diff --git a/internal/app/wireguard/wireguard_peers.go b/internal/app/wireguard/wireguard_peers.go index d8c55ca..324f986 100644 --- a/internal/app/wireguard/wireguard_peers.go +++ b/internal/app/wireguard/wireguard_peers.go @@ -4,11 +4,12 @@ import ( "context" "errors" "fmt" + "time" + "github.com/h44z/wg-portal/internal" "github.com/h44z/wg-portal/internal/app" "github.com/h44z/wg-portal/internal/domain" "github.com/sirupsen/logrus" - "time" ) func (m Manager) CreateDefaultPeer(ctx context.Context, user *domain.User) error { @@ -21,33 +22,37 @@ func (m Manager) CreateDefaultPeer(ctx context.Context, user *domain.User) error return fmt.Errorf("failed to fetch all interfaces: %w", err) } - var newPeers []domain.Peer + numPeers := 0 for _, iface := range existingInterfaces { if iface.Type != domain.InterfaceTypeServer { continue // only create default peers for server interfaces } - peer, err := m.PreparePeer(ctx, iface.Identifier) - if err != nil { - return fmt.Errorf("failed to create default peer for interface %s: %w", iface.Identifier, err) - } + for i := 0; i < m.cfg.Core.DefaultPeersPerUser; i++ { + peer, err := m.PreparePeer(ctx, iface.Identifier) + if err != nil { + return fmt.Errorf("failed to create default peer for interface %s: %w", iface.Identifier, err) + } - peer.UserIdentifier = user.Identifier - peer.DisplayName = fmt.Sprintf("Default Peer %s", internal.TruncateString(string(peer.Identifier), 8)) - peer.Notes = fmt.Sprintf("Default peer created for user %s", user.Identifier) + peer.UserIdentifier = user.Identifier + if i < len(m.cfg.Core.DefaultPeerNames) { + peer.DisplayName = string(user.Identifier) + " " + m.cfg.Core.DefaultPeerNames[i] + } else { + peer.DisplayName = fmt.Sprintf("Default Peer %s", internal.TruncateString(string(peer.Identifier), 8)) + } + peer.Notes = fmt.Sprintf("Default peer created for user %s", user.Identifier) - newPeers = append(newPeers, *peer) - } - - for i, peer := range newPeers { - _, err := m.CreatePeer(ctx, &newPeers[i]) - if err != nil { - return fmt.Errorf("failed to create default peer %s on interface %s: %w", - peer.Identifier, peer.InterfaceIdentifier, err) + _, err = m.CreatePeer(ctx, peer) + if err != nil { + return fmt.Errorf("failed to create default peer %s on interface %s: %w", + peer.Identifier, peer.InterfaceIdentifier, err) + } else { + numPeers++ + } } } - logrus.Infof("created %d default peers for user %s", len(newPeers), user.Identifier) + logrus.Infof("created %d default peers for user %s", numPeers, user.Identifier) return nil } diff --git a/internal/config/config.go b/internal/config/config.go index 1feb690..3209cd8 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -2,10 +2,11 @@ package config import ( "fmt" - "github.com/sirupsen/logrus" "os" "time" + "github.com/sirupsen/logrus" + "gopkg.in/yaml.v2" ) @@ -15,11 +16,13 @@ type Config struct { AdminUser string `yaml:"admin_user"` AdminPassword string `yaml:"admin_password"` - EditableKeys bool `yaml:"editable_keys"` - CreateDefaultPeer bool `yaml:"create_default_peer"` - SelfProvisioningAllowed bool `yaml:"self_provisioning_allowed"` - ImportExisting bool `yaml:"import_existing"` - RestoreState bool `yaml:"restore_state"` + EditableKeys bool `yaml:"editable_keys"` + CreateDefaultPeer bool `yaml:"create_default_peer"` + DefaultPeersPerUser int `yaml:"default_peers_per_user"` + DefaultPeerNames []string `yaml:"default_peer_names"` + SelfProvisioningAllowed bool `yaml:"self_provisioning_allowed"` + ImportExisting bool `yaml:"import_existing"` + RestoreState bool `yaml:"restore_state"` } `yaml:"core"` Advanced struct { @@ -85,6 +88,8 @@ func defaultConfig() *Config { cfg.Core.ImportExisting = true cfg.Core.RestoreState = true + cfg.Core.DefaultPeersPerUser = 1 + cfg.Database = DatabaseConfig{ Type: "sqlite", DSN: "data/sqlite.db",