Add the ability to create multiple peers per user

This commit is contained in:
Ruoxi Wang 2024-03-20 16:29:40 +08:00
parent 38310d6ff2
commit 0db15e7bc2
No known key found for this signature in database
GPG Key ID: BE325758AAD335BF
3 changed files with 37 additions and 26 deletions

View File

@ -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 {

View File

@ -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
}

View File

@ -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",