|
|
|
|
@ -1074,9 +1074,11 @@ func (b *LocalBackend) SetControlClientStatus(c controlclient.Client, st control |
|
|
|
|
b.blockEngineUpdates(false) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if st.LoginFinished() && wasBlocked { |
|
|
|
|
// Auth completed, unblock the engine
|
|
|
|
|
b.blockEngineUpdates(false) |
|
|
|
|
if st.LoginFinished() && (wasBlocked || b.seamlessRenewalEnabled()) { |
|
|
|
|
if wasBlocked { |
|
|
|
|
// Auth completed, unblock the engine
|
|
|
|
|
b.blockEngineUpdates(false) |
|
|
|
|
} |
|
|
|
|
b.authReconfig() |
|
|
|
|
b.send(ipn.Notify{LoginFinished: &empty.Message{}}) |
|
|
|
|
} |
|
|
|
|
@ -1108,7 +1110,7 @@ func (b *LocalBackend) SetControlClientStatus(c controlclient.Client, st control |
|
|
|
|
b.authURL = st.URL |
|
|
|
|
b.authURLSticky = st.URL |
|
|
|
|
} |
|
|
|
|
if wasBlocked && st.LoginFinished() { |
|
|
|
|
if (wasBlocked || b.seamlessRenewalEnabled()) && st.LoginFinished() { |
|
|
|
|
// Interactive login finished successfully (URL visited).
|
|
|
|
|
// After an interactive login, the user always wants
|
|
|
|
|
// WantRunning.
|
|
|
|
|
@ -2456,8 +2458,10 @@ func (b *LocalBackend) popBrowserAuthNow() { |
|
|
|
|
|
|
|
|
|
b.logf("popBrowserAuthNow: url=%v", url != "") |
|
|
|
|
|
|
|
|
|
b.blockEngineUpdates(true) |
|
|
|
|
b.stopEngineAndWait() |
|
|
|
|
if !b.seamlessRenewalEnabled() { |
|
|
|
|
b.blockEngineUpdates(true) |
|
|
|
|
b.stopEngineAndWait() |
|
|
|
|
} |
|
|
|
|
b.tellClientToBrowseToURL(url) |
|
|
|
|
if b.State() == ipn.Running { |
|
|
|
|
b.enterState(ipn.Starting) |
|
|
|
|
@ -4176,6 +4180,9 @@ func (b *LocalBackend) enterStateLockedOnEntry(newState ipn.State) { |
|
|
|
|
switch newState { |
|
|
|
|
case ipn.NeedsLogin: |
|
|
|
|
systemd.Status("Needs login: %s", authURL) |
|
|
|
|
if b.seamlessRenewalEnabled() { |
|
|
|
|
break |
|
|
|
|
} |
|
|
|
|
b.blockEngineUpdates(true) |
|
|
|
|
fallthrough |
|
|
|
|
case ipn.Stopped: |
|
|
|
|
@ -5801,6 +5808,14 @@ func (b *LocalBackend) AdvertiseRoute(ipp netip.Prefix) error { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// seamlessRenewalEnabled reports whether seamless key renewals are enabled
|
|
|
|
|
// (i.e. we saw our self node with the SeamlessKeyRenewal attr in a netmap).
|
|
|
|
|
// This enables beta functionality of renewing node keys without breaking
|
|
|
|
|
// connections.
|
|
|
|
|
func (b *LocalBackend) seamlessRenewalEnabled() bool { |
|
|
|
|
return b.ControlKnobs().SeamlessKeyRenewal.Load() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var ( |
|
|
|
|
disallowedAddrs = []netip.Addr{ |
|
|
|
|
netip.MustParseAddr("::1"), |
|
|
|
|
|