@@ -36,6 +36,10 @@ const (
3636 // didTokenHeader is the HTTP response/request header for a device-id token
3737 // issued by svchost / svchosttest. Format: "a hextoken:expiryepochsec".
3838 didTokenHeader = "x-rethink-app-did-token"
39+
40+ // alwaysInitOnUpdate always runs the /WgConfigs/init + /WgConfigs/connect flow on every config update,
41+ // even if the server list didn't change.
42+ alwaysInitOnUpdate = true
3943)
4044
4145const (
@@ -1418,7 +1422,7 @@ func getServerList(h *http.Client, sess *WsSession, ent *WsEntitlement) (*WsServ
14181422 return wsRes (locres , & wsServerList , "wgconfs" )
14191423}
14201424
1421- func genWgConfs (h * http.Client , existingCreds * WsWgCreds , sess * WsSession , servers []WsServerList , ent * WsEntitlement ) (* WsWgCreds , []* RegionalWgConf , error ) {
1425+ func genWgConfs (h * http.Client , existingCreds * WsWgCreds , sess * WsSession , servers []WsServerList , ent * WsEntitlement , forceInit bool ) (* WsWgCreds , []* RegionalWgConf , error ) {
14221426 if sess == nil || ent == nil {
14231427 return nil , nil , errWsNoSession
14241428 }
@@ -1441,7 +1445,7 @@ func genWgConfs(h *http.Client, existingCreds *WsWgCreds, sess *WsSession, serve
14411445 runkey := 0
14421446 keyed := 0
14431447keyagain:
1444- useExistingCreds := existingCreds != nil && keyed == 0
1448+ useExistingCreds := existingCreds != nil && keyed == 0 && ! forceInit
14451449 runkey += 1
14461450
14471451 var priv x.WgKey
@@ -1618,7 +1622,7 @@ initagain:
16181622 return nil , nil , log .EE ("ws: wgconfs: (test? %t) no regions found %s; %v" , test , details , err )
16191623 }
16201624
1621- log .I ("ws: wgconfs: (test? %t / tok? %s) found %d regions %s" , test , tokst , len (regconfs ), details )
1625+ log .I ("ws: wgconfs: ok (test? %t / tok? %s) found %d regions %s" , test , tokst , len (regconfs ), details )
16221626 return creds , regconfs , nil
16231627}
16241628
@@ -1694,7 +1698,7 @@ func makeWsWg(h *http.Client, ent *WsEntitlement) (*WsClient, error) {
16941698 return nil , err
16951699 }
16961700
1697- creds , wgconfs , err := genWgConfs (h , nil , sess , servers .Data , ent )
1701+ creds , wgconfs , err := genWgConfs (h , nil , sess , servers .Data , ent , false /*force update*/ )
16981702 if err != nil {
16991703 return nil , err
17001704 }
@@ -1763,7 +1767,7 @@ func (w *BaseClient) makeWsWgFrom(existingConf *WsWgConfig) (*WsClient, error) {
17631767 return ws , err
17641768}
17651769
1766- func makeWsWgFrom (h * http.Client , existingConf * WsWgConfig , errOnNoUpdate bool ) (ws * WsClient , refreshedSess bool , err error ) {
1770+ func makeWsWgFrom (h * http.Client , existingConf * WsWgConfig , performingUpdate bool ) (ws * WsClient , refreshedSess bool , err error ) {
17671771 existingEnt := existingConf .Entitlement
17681772 if existingEnt == nil || len (existingEnt .SessionToken ) <= 0 {
17691773 err = errWsNoEntitlement
@@ -1795,7 +1799,7 @@ func makeWsWgFrom(h *http.Client, existingConf *WsWgConfig, errOnNoUpdate bool)
17951799 } else {
17961800 log .W ("ws: make: get session err: %v; using existing; tok? %s" , err , tokst )
17971801 newSess = existingConf .Session // use existing session
1798- if errOnNoUpdate {
1802+ if performingUpdate {
17991803 return nil , refreshedSess , err
18001804 }
18011805 }
@@ -1828,17 +1832,23 @@ func makeWsWgFrom(h *http.Client, existingConf *WsWgConfig, errOnNoUpdate bool)
18281832 }
18291833 }
18301834
1835+ // performingUpdate is set for "Update" calls only; that is, when remote api call fails to
1836+ // either init or init+connect, we can safely errors out on the "Update";
1837+ // if setup to always init+connect, then forceInit to true iff performingUpdate is also set.
1838+ forceInit := alwaysInitOnUpdate && performingUpdate
18311839 // create wg confs from new or existing server list
18321840 // always reconfigure (as /WgConfigs/connect must be done once every wg_ttl, which is 60m)
1833- maybeNewCreds , maybeNewWgConfs , uerr := genWgConfs (h , existingCreds , newSess , maybeNewServers , existingConf .Entitlement )
1841+ maybeNewCreds , maybeNewWgConfs , uerr := genWgConfs (h , existingCreds , newSess , maybeNewServers , existingConf .Entitlement , forceInit )
18341842 loge (uerr )("ws: make: gen wg confs; tok? %s; downloadloc? %t / hasnewloc? %t len (%d/%d); err? %v" ,
18351843 tokst , downloadServerList , hasnew , len (existingServers ), len (maybeNewServers ), uerr )
18361844
18371845 if uerr == nil {
18381846 existingConf .Servers = maybeNewServers
18391847 existingConf .Configs = maybeNewWgConfs
18401848 existingConf .Creds = maybeNewCreds
1841- } else if errOnNoUpdate {
1849+ } else if performingUpdate {
1850+ // error out early as this was meant to create an update config for later use
1851+ // but it itself is not the currently active config aka "existingConf"
18421852 return nil , refreshedSess , uerr
18431853 }
18441854 } else {
0 commit comments