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