mirror of
https://github.com/netbirdio/netbird.git
synced 2026-05-31 04:59:54 +00:00
Compare commits
4 Commits
fix-ssh-au
...
fix-dns-fa
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
94a8b7325e | ||
|
|
3f91f49277 | ||
|
|
347c5bf317 | ||
|
|
22e2519d71 |
@@ -260,15 +260,23 @@ WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "Publisher" "${COMP_NAME}"
|
|||||||
|
|
||||||
WriteRegStr ${REG_ROOT} "${UI_REG_APP_PATH}" "" "$INSTDIR\${UI_APP_EXE}"
|
WriteRegStr ${REG_ROOT} "${UI_REG_APP_PATH}" "" "$INSTDIR\${UI_APP_EXE}"
|
||||||
|
|
||||||
; Create autostart registry entry based on checkbox
|
; Drop Run, App Paths and Uninstall entries left in the 32-bit registry view
|
||||||
|
; or HKCU by legacy installers.
|
||||||
|
DetailPrint "Cleaning legacy 32-bit / HKCU entries..."
|
||||||
|
DeleteRegValue HKCU "${AUTOSTART_REG_KEY}" "${APP_NAME}"
|
||||||
|
SetRegView 32
|
||||||
|
DeleteRegValue HKLM "${AUTOSTART_REG_KEY}" "${APP_NAME}"
|
||||||
|
DeleteRegKey HKLM "${REG_APP_PATH}"
|
||||||
|
DeleteRegKey HKLM "${UI_REG_APP_PATH}"
|
||||||
|
DeleteRegKey HKLM "${UNINSTALL_PATH}"
|
||||||
|
SetRegView 64
|
||||||
|
|
||||||
DetailPrint "Autostart enabled: $AutostartEnabled"
|
DetailPrint "Autostart enabled: $AutostartEnabled"
|
||||||
${If} $AutostartEnabled == "1"
|
${If} $AutostartEnabled == "1"
|
||||||
WriteRegStr HKLM "${AUTOSTART_REG_KEY}" "${APP_NAME}" '"$INSTDIR\${UI_APP_EXE}.exe"'
|
WriteRegStr HKLM "${AUTOSTART_REG_KEY}" "${APP_NAME}" '"$INSTDIR\${UI_APP_EXE}.exe"'
|
||||||
DetailPrint "Added autostart registry entry: $INSTDIR\${UI_APP_EXE}.exe"
|
DetailPrint "Added autostart registry entry: $INSTDIR\${UI_APP_EXE}.exe"
|
||||||
${Else}
|
${Else}
|
||||||
DeleteRegValue HKLM "${AUTOSTART_REG_KEY}" "${APP_NAME}"
|
DeleteRegValue HKLM "${AUTOSTART_REG_KEY}" "${APP_NAME}"
|
||||||
; Legacy: pre-HKLM installs wrote to HKCU; clean that up too.
|
|
||||||
DeleteRegValue HKCU "${AUTOSTART_REG_KEY}" "${APP_NAME}"
|
|
||||||
DetailPrint "Autostart not enabled by user"
|
DetailPrint "Autostart not enabled by user"
|
||||||
${EndIf}
|
${EndIf}
|
||||||
|
|
||||||
@@ -299,11 +307,16 @@ ExecWait '"$INSTDIR\${MAIN_APP_EXE}" service uninstall'
|
|||||||
DetailPrint "Terminating Netbird UI process..."
|
DetailPrint "Terminating Netbird UI process..."
|
||||||
ExecWait `taskkill /im ${UI_APP_EXE}.exe /f`
|
ExecWait `taskkill /im ${UI_APP_EXE}.exe /f`
|
||||||
|
|
||||||
; Remove autostart registry entry
|
; Remove autostart entries from every view a previous installer may have used.
|
||||||
DetailPrint "Removing autostart registry entry if exists..."
|
DetailPrint "Removing autostart registry entry if exists..."
|
||||||
DeleteRegValue HKLM "${AUTOSTART_REG_KEY}" "${APP_NAME}"
|
DeleteRegValue HKLM "${AUTOSTART_REG_KEY}" "${APP_NAME}"
|
||||||
; Legacy: pre-HKLM installs wrote to HKCU; clean that up too.
|
|
||||||
DeleteRegValue HKCU "${AUTOSTART_REG_KEY}" "${APP_NAME}"
|
DeleteRegValue HKCU "${AUTOSTART_REG_KEY}" "${APP_NAME}"
|
||||||
|
SetRegView 32
|
||||||
|
DeleteRegValue HKLM "${AUTOSTART_REG_KEY}" "${APP_NAME}"
|
||||||
|
DeleteRegKey HKLM "${REG_APP_PATH}"
|
||||||
|
DeleteRegKey HKLM "${UI_REG_APP_PATH}"
|
||||||
|
DeleteRegKey HKLM "${UNINSTALL_PATH}"
|
||||||
|
SetRegView 64
|
||||||
|
|
||||||
; Handle data deletion based on checkbox
|
; Handle data deletion based on checkbox
|
||||||
DetailPrint "Checking if user requested data deletion..."
|
DetailPrint "Checking if user requested data deletion..."
|
||||||
|
|||||||
@@ -772,13 +772,24 @@ func (s *DefaultServer) applyHostConfig() {
|
|||||||
// context is released rather than leaked until GC.
|
// context is released rather than leaked until GC.
|
||||||
func (s *DefaultServer) registerFallback() {
|
func (s *DefaultServer) registerFallback() {
|
||||||
originalNameservers := s.hostManager.getOriginalNameservers()
|
originalNameservers := s.hostManager.getOriginalNameservers()
|
||||||
if len(originalNameservers) == 0 {
|
|
||||||
|
serverIP := s.service.RuntimeIP()
|
||||||
|
var servers []netip.AddrPort
|
||||||
|
for _, ns := range originalNameservers {
|
||||||
|
if ns == serverIP {
|
||||||
|
log.Debugf("skipping original nameserver %s as it is the same as the server IP %s", ns, serverIP)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
servers = append(servers, netip.AddrPortFrom(ns, DefaultPort))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(servers) == 0 {
|
||||||
log.Debugf("no fallback upstreams to register; clearing PriorityFallback handler")
|
log.Debugf("no fallback upstreams to register; clearing PriorityFallback handler")
|
||||||
s.clearFallback()
|
s.clearFallback()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Infof("registering original nameservers %v as upstream handlers with priority %d", originalNameservers, PriorityFallback)
|
log.Infof("registering original nameservers %v as upstream handlers with priority %d", servers, PriorityFallback)
|
||||||
|
|
||||||
handler, err := newUpstreamResolver(
|
handler, err := newUpstreamResolver(
|
||||||
s.ctx,
|
s.ctx,
|
||||||
@@ -792,11 +803,6 @@ func (s *DefaultServer) registerFallback() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
handler.selectedRoutes = s.selectedRoutes
|
handler.selectedRoutes = s.selectedRoutes
|
||||||
|
|
||||||
var servers []netip.AddrPort
|
|
||||||
for _, ns := range originalNameservers {
|
|
||||||
servers = append(servers, netip.AddrPortFrom(ns, DefaultPort))
|
|
||||||
}
|
|
||||||
handler.addRace(servers)
|
handler.addRace(servers)
|
||||||
|
|
||||||
prev := s.fallbackHandler
|
prev := s.fallbackHandler
|
||||||
|
|||||||
@@ -64,6 +64,13 @@
|
|||||||
<RegistryValue Name="InstalledByMSI" Type="integer" Value="1" KeyPath="yes" />
|
<RegistryValue Name="InstalledByMSI" Type="integer" Value="1" KeyPath="yes" />
|
||||||
</RegistryKey>
|
</RegistryKey>
|
||||||
</Component>
|
</Component>
|
||||||
|
<!-- Drop the HKCU Run\Netbird value written by legacy NSIS installers. -->
|
||||||
|
<Component Id="NetbirdLegacyHKCUCleanup" Guid="*">
|
||||||
|
<RegistryValue Root="HKCU" Key="Software\NetBird GmbH\Installer"
|
||||||
|
Name="LegacyHKCUCleanup" Type="integer" Value="1" KeyPath="yes" />
|
||||||
|
<RemoveRegistryValue Root="HKCU"
|
||||||
|
Key="Software\Microsoft\Windows\CurrentVersion\Run" Name="Netbird" />
|
||||||
|
</Component>
|
||||||
</StandardDirectory>
|
</StandardDirectory>
|
||||||
|
|
||||||
<StandardDirectory Id="CommonAppDataFolder">
|
<StandardDirectory Id="CommonAppDataFolder">
|
||||||
@@ -76,10 +83,28 @@
|
|||||||
</Directory>
|
</Directory>
|
||||||
</StandardDirectory>
|
</StandardDirectory>
|
||||||
|
|
||||||
|
<!-- Drop Run, App Paths and Uninstall entries written by legacy NSIS
|
||||||
|
installers into the 32-bit registry view (HKLM\Software\Wow6432Node). -->
|
||||||
|
<Component Id="NetbirdLegacyWow6432Cleanup" Directory="NetbirdInstallDir"
|
||||||
|
Guid="bda5d628-16bd-4086-b2c1-5099d8d51763" Bitness="always32">
|
||||||
|
<RegistryValue Root="HKLM" Key="Software\NetBird GmbH\Installer"
|
||||||
|
Name="LegacyWow6432Cleanup" Type="integer" Value="1" KeyPath="yes" />
|
||||||
|
<RemoveRegistryValue Root="HKLM"
|
||||||
|
Key="Software\Microsoft\Windows\CurrentVersion\Run" Name="Netbird" />
|
||||||
|
<RemoveRegistryKey Action="removeOnInstall" Root="HKLM"
|
||||||
|
Key="Software\Microsoft\Windows\CurrentVersion\App Paths\Netbird" />
|
||||||
|
<RemoveRegistryKey Action="removeOnInstall" Root="HKLM"
|
||||||
|
Key="Software\Microsoft\Windows\CurrentVersion\App Paths\Netbird-ui" />
|
||||||
|
<RemoveRegistryKey Action="removeOnInstall" Root="HKLM"
|
||||||
|
Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\Netbird" />
|
||||||
|
</Component>
|
||||||
|
|
||||||
<ComponentGroup Id="NetbirdFilesComponent">
|
<ComponentGroup Id="NetbirdFilesComponent">
|
||||||
<ComponentRef Id="NetbirdFiles" />
|
<ComponentRef Id="NetbirdFiles" />
|
||||||
<ComponentRef Id="NetbirdAumidRegistry" />
|
<ComponentRef Id="NetbirdAumidRegistry" />
|
||||||
<ComponentRef Id="NetbirdAutoStart" />
|
<ComponentRef Id="NetbirdAutoStart" />
|
||||||
|
<ComponentRef Id="NetbirdLegacyHKCUCleanup" />
|
||||||
|
<ComponentRef Id="NetbirdLegacyWow6432Cleanup" />
|
||||||
</ComponentGroup>
|
</ComponentGroup>
|
||||||
|
|
||||||
<util:CloseApplication Id="CloseNetBird" CloseMessage="no" Target="netbird.exe" RebootPrompt="no" />
|
<util:CloseApplication Id="CloseNetBird" CloseMessage="no" Target="netbird.exe" RebootPrompt="no" />
|
||||||
|
|||||||
@@ -522,10 +522,11 @@ func (s *Server) sendJob(ctx context.Context, peerKey wgtypes.Key, job *job.Even
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) cancelPeerRoutines(ctx context.Context, accountID string, peer *nbpeer.Peer, streamStartTime time.Time) {
|
func (s *Server) cancelPeerRoutines(ctx context.Context, accountID string, peer *nbpeer.Peer, streamStartTime time.Time) {
|
||||||
unlock := s.acquirePeerLockByUID(ctx, peer.Key)
|
uncanceledCTX := context.WithoutCancel(ctx)
|
||||||
|
unlock := s.acquirePeerLockByUID(uncanceledCTX, peer.Key)
|
||||||
defer unlock()
|
defer unlock()
|
||||||
|
|
||||||
s.cancelPeerRoutinesWithoutLock(ctx, accountID, peer, streamStartTime)
|
s.cancelPeerRoutinesWithoutLock(uncanceledCTX, accountID, peer, streamStartTime)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) cancelPeerRoutinesWithoutLock(ctx context.Context, accountID string, peer *nbpeer.Peer, streamStartTime time.Time) {
|
func (s *Server) cancelPeerRoutinesWithoutLock(ctx context.Context, accountID string, peer *nbpeer.Peer, streamStartTime time.Time) {
|
||||||
|
|||||||
@@ -291,10 +291,15 @@ func (am *DefaultAccountManager) UpdateAccountSettings(ctx context.Context, acco
|
|||||||
return nil, status.NewPermissionDeniedError()
|
return nil, status.NewPermissionDeniedError()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Canonicalize the incoming range so a caller-supplied prefix with host bits
|
||||||
|
// (e.g. 100.64.1.1/16) compares equal to the masked form stored on network.Net.
|
||||||
|
newSettings.NetworkRange = newSettings.NetworkRange.Masked()
|
||||||
|
|
||||||
var oldSettings *types.Settings
|
var oldSettings *types.Settings
|
||||||
var updateAccountPeers bool
|
var updateAccountPeers bool
|
||||||
var groupChangesAffectPeers bool
|
var groupChangesAffectPeers bool
|
||||||
var reloadReverseProxy bool
|
var reloadReverseProxy bool
|
||||||
|
var effectiveOldNetworkRange netip.Prefix
|
||||||
|
|
||||||
err = am.Store.ExecuteInTransaction(ctx, func(transaction store.Store) error {
|
err = am.Store.ExecuteInTransaction(ctx, func(transaction store.Store) error {
|
||||||
var groupsUpdated bool
|
var groupsUpdated bool
|
||||||
@@ -308,6 +313,16 @@ func (am *DefaultAccountManager) UpdateAccountSettings(ctx context.Context, acco
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// No lock: the transaction already holds Settings(Update), and network.Net is
|
||||||
|
// only mutated by reallocateAccountPeerIPs, which is reachable only through
|
||||||
|
// this same code path. A Share lock here would extend an unnecessary row lock
|
||||||
|
// and complicate ordering against updatePeerIPv6InTransaction.
|
||||||
|
network, err := transaction.GetAccountNetwork(ctx, store.LockingStrengthNone, accountID)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("get account network: %w", err)
|
||||||
|
}
|
||||||
|
effectiveOldNetworkRange = prefixFromIPNet(network.Net)
|
||||||
|
|
||||||
if oldSettings.Extra != nil && newSettings.Extra != nil &&
|
if oldSettings.Extra != nil && newSettings.Extra != nil &&
|
||||||
oldSettings.Extra.PeerApprovalEnabled && !newSettings.Extra.PeerApprovalEnabled {
|
oldSettings.Extra.PeerApprovalEnabled && !newSettings.Extra.PeerApprovalEnabled {
|
||||||
approvedCount, err := transaction.ApproveAccountPeers(ctx, accountID)
|
approvedCount, err := transaction.ApproveAccountPeers(ctx, accountID)
|
||||||
@@ -321,7 +336,7 @@ func (am *DefaultAccountManager) UpdateAccountSettings(ctx context.Context, acco
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if oldSettings.NetworkRange != newSettings.NetworkRange {
|
if newSettings.NetworkRange.IsValid() && newSettings.NetworkRange != effectiveOldNetworkRange {
|
||||||
if err = am.reallocateAccountPeerIPs(ctx, transaction, accountID, newSettings.NetworkRange); err != nil {
|
if err = am.reallocateAccountPeerIPs(ctx, transaction, accountID, newSettings.NetworkRange); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -396,9 +411,9 @@ func (am *DefaultAccountManager) UpdateAccountSettings(ctx context.Context, acco
|
|||||||
}
|
}
|
||||||
am.StoreEvent(ctx, userID, accountID, accountID, activity.AccountDNSDomainUpdated, eventMeta)
|
am.StoreEvent(ctx, userID, accountID, accountID, activity.AccountDNSDomainUpdated, eventMeta)
|
||||||
}
|
}
|
||||||
if oldSettings.NetworkRange != newSettings.NetworkRange {
|
if newSettings.NetworkRange.IsValid() && newSettings.NetworkRange != effectiveOldNetworkRange {
|
||||||
eventMeta := map[string]any{
|
eventMeta := map[string]any{
|
||||||
"old_network_range": oldSettings.NetworkRange.String(),
|
"old_network_range": effectiveOldNetworkRange.String(),
|
||||||
"new_network_range": newSettings.NetworkRange.String(),
|
"new_network_range": newSettings.NetworkRange.String(),
|
||||||
}
|
}
|
||||||
am.StoreEvent(ctx, userID, accountID, accountID, activity.AccountNetworkRangeUpdated, eventMeta)
|
am.StoreEvent(ctx, userID, accountID, accountID, activity.AccountNetworkRangeUpdated, eventMeta)
|
||||||
@@ -443,6 +458,22 @@ func ipv6SettingsChanged(old, updated *types.Settings) bool {
|
|||||||
return !slices.Equal(oldGroups, newGroups)
|
return !slices.Equal(oldGroups, newGroups)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// prefixFromIPNet returns the overlay prefix actually allocated on the account
|
||||||
|
// network, or an invalid prefix if none is set. Settings.NetworkRange is a
|
||||||
|
// user-facing override that is empty on legacy accounts, so the effective
|
||||||
|
// range must be read from network.Net to compare against an incoming update.
|
||||||
|
func prefixFromIPNet(ipNet net.IPNet) netip.Prefix {
|
||||||
|
if ipNet.IP == nil {
|
||||||
|
return netip.Prefix{}
|
||||||
|
}
|
||||||
|
addr, ok := netip.AddrFromSlice(ipNet.IP)
|
||||||
|
if !ok {
|
||||||
|
return netip.Prefix{}
|
||||||
|
}
|
||||||
|
ones, _ := ipNet.Mask.Size()
|
||||||
|
return netip.PrefixFrom(addr.Unmap(), ones)
|
||||||
|
}
|
||||||
|
|
||||||
func (am *DefaultAccountManager) validateSettingsUpdate(ctx context.Context, transaction store.Store, newSettings, oldSettings *types.Settings, userID, accountID string) error {
|
func (am *DefaultAccountManager) validateSettingsUpdate(ctx context.Context, transaction store.Store, newSettings, oldSettings *types.Settings, userID, accountID string) error {
|
||||||
halfYearLimit := 180 * 24 * time.Hour
|
halfYearLimit := 180 * 24 * time.Hour
|
||||||
if newSettings.PeerLoginExpiration > halfYearLimit {
|
if newSettings.PeerLoginExpiration > halfYearLimit {
|
||||||
|
|||||||
@@ -3970,6 +3970,96 @@ func TestDefaultAccountManager_UpdateAccountSettings_NetworkRangeChange(t *testi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestDefaultAccountManager_UpdateAccountSettings_NetworkRangePreserved guards against
|
||||||
|
// peer IP reallocation when a settings update carries the network range that is already
|
||||||
|
// in use. Legacy accounts have Settings.NetworkRange unset in the DB while network.Net
|
||||||
|
// holds the actual allocated overlay; the dashboard backfills the GET response from
|
||||||
|
// network.Net and echoes the value back on PUT, so the diff must be against the
|
||||||
|
// effective range to avoid renumbering every peer on an unrelated settings change.
|
||||||
|
func TestDefaultAccountManager_UpdateAccountSettings_NetworkRangePreserved(t *testing.T) {
|
||||||
|
manager, _, account, peer1, peer2, peer3 := setupNetworkMapTest(t)
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
settings, err := manager.Store.GetAccountSettings(ctx, store.LockingStrengthNone, account.Id)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.False(t, settings.NetworkRange.IsValid(), "precondition: new accounts leave Settings.NetworkRange unset")
|
||||||
|
|
||||||
|
network, err := manager.Store.GetAccountNetwork(ctx, store.LockingStrengthNone, account.Id)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotNil(t, network.Net.IP, "precondition: network.Net should be allocated")
|
||||||
|
addr, ok := netip.AddrFromSlice(network.Net.IP)
|
||||||
|
require.True(t, ok)
|
||||||
|
ones, _ := network.Net.Mask.Size()
|
||||||
|
effective := netip.PrefixFrom(addr.Unmap(), ones)
|
||||||
|
require.True(t, effective.IsValid())
|
||||||
|
|
||||||
|
before := map[string]netip.Addr{peer1.ID: peer1.IP, peer2.ID: peer2.IP, peer3.ID: peer3.IP}
|
||||||
|
|
||||||
|
// Round-trip the effective range as if the dashboard echoed back the GET-backfilled value.
|
||||||
|
_, err = manager.UpdateAccountSettings(ctx, account.Id, userID, &types.Settings{
|
||||||
|
PeerLoginExpirationEnabled: true,
|
||||||
|
PeerLoginExpiration: types.DefaultPeerLoginExpiration,
|
||||||
|
NetworkRange: effective,
|
||||||
|
Extra: &types.ExtraSettings{},
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
peers, err := manager.Store.GetAccountPeers(ctx, store.LockingStrengthNone, account.Id, "", "")
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Len(t, peers, len(before))
|
||||||
|
for _, p := range peers {
|
||||||
|
assert.Equal(t, before[p.ID], p.IP, "peer %s IP should not change when range matches effective", p.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Carrying the same range with host bits set must also be a no-op once canonicalized.
|
||||||
|
hostBitsForm := netip.PrefixFrom(peer1.IP, ones)
|
||||||
|
require.NotEqual(t, effective, hostBitsForm, "precondition: host-bit form should differ before masking")
|
||||||
|
_, err = manager.UpdateAccountSettings(ctx, account.Id, userID, &types.Settings{
|
||||||
|
PeerLoginExpirationEnabled: true,
|
||||||
|
PeerLoginExpiration: types.DefaultPeerLoginExpiration,
|
||||||
|
NetworkRange: hostBitsForm,
|
||||||
|
Extra: &types.ExtraSettings{},
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
peers, err = manager.Store.GetAccountPeers(ctx, store.LockingStrengthNone, account.Id, "", "")
|
||||||
|
require.NoError(t, err)
|
||||||
|
for _, p := range peers {
|
||||||
|
assert.Equal(t, before[p.ID], p.IP, "peer %s IP should not change for host-bit-set equivalent range", p.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Omitting NetworkRange (invalid prefix) must also be a no-op.
|
||||||
|
_, err = manager.UpdateAccountSettings(ctx, account.Id, userID, &types.Settings{
|
||||||
|
PeerLoginExpirationEnabled: true,
|
||||||
|
PeerLoginExpiration: types.DefaultPeerLoginExpiration,
|
||||||
|
Extra: &types.ExtraSettings{},
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
peers, err = manager.Store.GetAccountPeers(ctx, store.LockingStrengthNone, account.Id, "", "")
|
||||||
|
require.NoError(t, err)
|
||||||
|
for _, p := range peers {
|
||||||
|
assert.Equal(t, before[p.ID], p.IP, "peer %s IP should not change when NetworkRange omitted", p.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sanity: an actually different range still triggers reallocation.
|
||||||
|
newRange := netip.MustParsePrefix("100.99.0.0/16")
|
||||||
|
_, err = manager.UpdateAccountSettings(ctx, account.Id, userID, &types.Settings{
|
||||||
|
PeerLoginExpirationEnabled: true,
|
||||||
|
PeerLoginExpiration: types.DefaultPeerLoginExpiration,
|
||||||
|
NetworkRange: newRange,
|
||||||
|
Extra: &types.ExtraSettings{},
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
peers, err = manager.Store.GetAccountPeers(ctx, store.LockingStrengthNone, account.Id, "", "")
|
||||||
|
require.NoError(t, err)
|
||||||
|
for _, p := range peers {
|
||||||
|
assert.True(t, newRange.Contains(p.IP), "peer %s should be in new range %s, got %s", p.ID, newRange, p.IP)
|
||||||
|
assert.NotEqual(t, before[p.ID], p.IP, "peer %s IP should change on real range update", p.ID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestDefaultAccountManager_UpdateAccountSettings_IPv6EnabledGroups(t *testing.T) {
|
func TestDefaultAccountManager_UpdateAccountSettings_IPv6EnabledGroups(t *testing.T) {
|
||||||
manager, _, account, peer1, peer2, peer3 := setupNetworkMapTest(t)
|
manager, _, account, peer1, peer2, peer3 := setupNetworkMapTest(t)
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|||||||
Reference in New Issue
Block a user