From b546eec4edad3b7817cc85c68c8d84e07f044bf7 Mon Sep 17 00:00:00 2001 From: Christoph Haas Date: Sat, 9 Aug 2025 15:55:29 +0200 Subject: [PATCH] fix multi-peer generation, fix prefix handling (#491) (cherry picked from commit c20f17cddfa813b1e6e602018e6fdb5f8d787166) --- .../src/components/PeerMultiCreateModal.vue | 4 ++-- .../app/api/core/assets/doc/v0_swagger.json | 2 +- .../app/api/core/assets/doc/v0_swagger.yaml | 2 +- internal/app/api/core/server.go | 3 ++- internal/app/api/v0/model/models_peer.go | 4 ++-- internal/app/wireguard/wireguard_peers.go | 23 ++++++++----------- internal/domain/peer.go | 2 +- 7 files changed, 18 insertions(+), 22 deletions(-) diff --git a/frontend/src/components/PeerMultiCreateModal.vue b/frontend/src/components/PeerMultiCreateModal.vue index 5201f03..f5a2c87 100644 --- a/frontend/src/components/PeerMultiCreateModal.vue +++ b/frontend/src/components/PeerMultiCreateModal.vue @@ -32,7 +32,7 @@ const selectedInterface = computed(() => { function freshForm() { return { Identifiers: [], - Suffix: "", + Prefix: "", } } @@ -102,7 +102,7 @@ async function save() {
- + {{ $t('modals.peer-multi-create.prefix.description') }}
diff --git a/internal/app/api/core/assets/doc/v0_swagger.json b/internal/app/api/core/assets/doc/v0_swagger.json index f780025..09fe7ae 100644 --- a/internal/app/api/core/assets/doc/v0_swagger.json +++ b/internal/app/api/core/assets/doc/v0_swagger.json @@ -1851,7 +1851,7 @@ "type": "string" } }, - "Suffix": { + "Prefix": { "type": "string" } } diff --git a/internal/app/api/core/assets/doc/v0_swagger.yaml b/internal/app/api/core/assets/doc/v0_swagger.yaml index 285fc8d..50359be 100644 --- a/internal/app/api/core/assets/doc/v0_swagger.yaml +++ b/internal/app/api/core/assets/doc/v0_swagger.yaml @@ -206,7 +206,7 @@ definitions: items: type: string type: array - Suffix: + Prefix: type: string type: object model.Peer: diff --git a/internal/app/api/core/server.go b/internal/app/api/core/server.go index fe0d1e6..2fe9a46 100644 --- a/internal/app/api/core/server.go +++ b/internal/app/api/core/server.go @@ -138,7 +138,8 @@ func (s *Server) setupRoutes(endpoints ...ApiEndpointSetupFunc) { s.versions[version].HandleFunc("GET /swagger/index.html", s.rapiDocHandler(version)) // Deprecated: old link s.versions[version].HandleFunc("GET /doc.html", s.rapiDocHandler(version)) - groupSetupFn(s.versions[version]) + versionGroup := s.versions[version].Group() + groupSetupFn(versionGroup) } } } diff --git a/internal/app/api/v0/model/models_peer.go b/internal/app/api/v0/model/models_peer.go index 9612dc6..d266d8d 100644 --- a/internal/app/api/v0/model/models_peer.go +++ b/internal/app/api/v0/model/models_peer.go @@ -172,13 +172,13 @@ func NewDomainPeer(src *Peer) *domain.Peer { type MultiPeerRequest struct { Identifiers []string `json:"Identifiers"` - Suffix string `json:"Suffix"` + Prefix string `json:"Prefix"` } func NewDomainPeerCreationRequest(src *MultiPeerRequest) *domain.PeerCreationRequest { return &domain.PeerCreationRequest{ UserIdentifiers: src.Identifiers, - Suffix: src.Suffix, + Prefix: src.Prefix, } } diff --git a/internal/app/wireguard/wireguard_peers.go b/internal/app/wireguard/wireguard_peers.go index 2131323..0197875 100644 --- a/internal/app/wireguard/wireguard_peers.go +++ b/internal/app/wireguard/wireguard_peers.go @@ -233,7 +233,7 @@ func (m Manager) CreateMultiplePeers( return nil, err } - var newPeers []*domain.Peer + createdPeers := make([]domain.Peer, 0, len(r.UserIdentifiers)) for _, id := range r.UserIdentifiers { freshPeer, err := m.PreparePeer(ctx, interfaceId) @@ -242,27 +242,22 @@ func (m Manager) CreateMultiplePeers( } freshPeer.UserIdentifier = domain.UserIdentifier(id) // use id as user identifier. peers are allowed to have invalid user identifiers - if r.Suffix != "" { - freshPeer.DisplayName += " " + r.Suffix + if r.Prefix != "" { + freshPeer.DisplayName = r.Prefix + " " + freshPeer.DisplayName } if err := m.validatePeerCreation(ctx, nil, freshPeer); err != nil { return nil, fmt.Errorf("creation not allowed: %w", err) } - newPeers = append(newPeers, freshPeer) - } + // Save immediately to reserve the assigned IPs so the next prepared peer gets the next free IPs + if err := m.savePeers(ctx, freshPeer); err != nil { + return nil, fmt.Errorf("failed to create new peer %s: %w", freshPeer.Identifier, err) + } - err := m.savePeers(ctx, newPeers...) - if err != nil { - return nil, fmt.Errorf("failed to create new peers: %w", err) - } + createdPeers = append(createdPeers, *freshPeer) - createdPeers := make([]domain.Peer, len(newPeers)) - for i := range newPeers { - createdPeers[i] = *newPeers[i] - - m.bus.Publish(app.TopicPeerCreated, *newPeers[i]) + m.bus.Publish(app.TopicPeerCreated, *freshPeer) } return createdPeers, nil diff --git a/internal/domain/peer.go b/internal/domain/peer.go index 8de712a..93404eb 100644 --- a/internal/domain/peer.go +++ b/internal/domain/peer.go @@ -269,5 +269,5 @@ func MergeToPhysicalPeer(pp *PhysicalPeer, p *Peer) { type PeerCreationRequest struct { UserIdentifiers []string - Suffix string + Prefix string }