github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/engine/puk_upkeep_background.go (about) 1 // Copyright 2017 Keybase, Inc. All rights reserved. Use of 2 // this source code is governed by the included BSD license. 3 4 // PerUserKeyUpkeepBackground runs PerUserKeyUpkeep in the background once in a while. 5 // It rolls the per-user-key if the last one was involved in a deprovision. 6 // See PerUserKeyUpkeep for more info. 7 8 package engine 9 10 import ( 11 "sync" 12 "time" 13 14 "github.com/keybase/client/go/libkb" 15 ) 16 17 var PerUserKeyUpkeepBackgroundSettings = BackgroundTaskSettings{ 18 Start: 20 * time.Second, // Wait after starting the app 19 StartStagger: 20 * time.Second, // Wait an additional random amount. 20 WakeUp: 15 * time.Second, // Additional delay after waking from sleep. 21 Interval: 6 * time.Hour, // Wait between checks 22 Limit: 5 * time.Minute, // Time limit on each round 23 } 24 25 // PerUserKeyUpkeepBackground is an engine. 26 type PerUserKeyUpkeepBackground struct { 27 libkb.Contextified 28 sync.Mutex 29 30 args *PerUserKeyUpkeepBackgroundArgs 31 task *BackgroundTask 32 } 33 34 type PerUserKeyUpkeepBackgroundArgs struct { 35 // Channels used for testing. Normally nil. 36 testingMetaCh chan<- string 37 testingRoundResCh chan<- error 38 } 39 40 // NewPerUserKeyUpkeepBackground creates a PerUserKeyUpkeepBackground engine. 41 func NewPerUserKeyUpkeepBackground(g *libkb.GlobalContext, args *PerUserKeyUpkeepBackgroundArgs) *PerUserKeyUpkeepBackground { 42 task := NewBackgroundTask(g, &BackgroundTaskArgs{ 43 Name: "PerUserKeyUpkeepBackground", 44 F: PerUserKeyUpkeepBackgroundRound, 45 Settings: PerUserKeyUpkeepBackgroundSettings, 46 47 testingMetaCh: args.testingMetaCh, 48 testingRoundResCh: args.testingRoundResCh, 49 }) 50 return &PerUserKeyUpkeepBackground{ 51 Contextified: libkb.NewContextified(g), 52 args: args, 53 // Install the task early so that Shutdown can be called before RunEngine. 54 task: task, 55 } 56 } 57 58 // Name is the unique engine name. 59 func (e *PerUserKeyUpkeepBackground) Name() string { 60 return "PerUserKeyUpkeepBackground" 61 } 62 63 // GetPrereqs returns the engine prereqs. 64 func (e *PerUserKeyUpkeepBackground) Prereqs() Prereqs { 65 return Prereqs{} 66 } 67 68 // RequiredUIs returns the required UIs. 69 func (e *PerUserKeyUpkeepBackground) RequiredUIs() []libkb.UIKind { 70 return []libkb.UIKind{} 71 } 72 73 // SubConsumers returns the other UI consumers for this engine. 74 func (e *PerUserKeyUpkeepBackground) SubConsumers() []libkb.UIConsumer { 75 return []libkb.UIConsumer{&PerUserKeyUpkeep{}} 76 } 77 78 // Run starts the engine. 79 // Returns immediately, kicks off a background goroutine. 80 func (e *PerUserKeyUpkeepBackground) Run(m libkb.MetaContext) (err error) { 81 return RunEngine2(m, e.task) 82 } 83 84 func (e *PerUserKeyUpkeepBackground) Shutdown() { 85 e.task.Shutdown() 86 } 87 88 func PerUserKeyUpkeepBackgroundRound(m libkb.MetaContext) error { 89 if m.G().ConnectivityMonitor.IsConnected(m.Ctx()) == libkb.ConnectivityMonitorNo { 90 m.Debug("PerUserKeyUpkeepBackgroundRound giving up offline") 91 return nil 92 } 93 94 if !m.G().ActiveDevice.Valid() { 95 m.Debug("PerUserKeyUpkeepBackgroundRound not logged in") 96 return nil 97 } 98 99 if !m.G().LocalSigchainGuard().IsAvailable(m.Ctx(), "PerUserKeyUpkeepBackgroundRound") { 100 m.Debug("PerUserKeyUpkeepBackgroundRound yielding to guard") 101 return nil 102 } 103 104 arg := &PerUserKeyUpkeepArgs{} 105 eng := NewPerUserKeyUpkeep(m.G(), arg) 106 err := RunEngine2(m, eng) 107 return err 108 }