github.com/keybase/client/go@v0.0.0-20241007131713-f10651d043c8/engine/bootstrap.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  package engine
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/keybase/client/go/libkb"
    10  	"github.com/keybase/client/go/protocol/keybase1"
    11  )
    12  
    13  // Bootstrap is an engine.
    14  type Bootstrap struct {
    15  	libkb.Contextified
    16  	status keybase1.BootstrapStatus
    17  }
    18  
    19  // NewBootstrap creates a Bootstrap engine.
    20  func NewBootstrap(g *libkb.GlobalContext) *Bootstrap {
    21  	return &Bootstrap{
    22  		Contextified: libkb.NewContextified(g),
    23  	}
    24  }
    25  
    26  // Name is the unique engine name.
    27  func (e *Bootstrap) Name() string {
    28  	return "Bootstrap"
    29  }
    30  
    31  // GetPrereqs returns the engine prereqs.
    32  func (e *Bootstrap) Prereqs() Prereqs {
    33  	return Prereqs{}
    34  }
    35  
    36  // RequiredUIs returns the required UIs.
    37  func (e *Bootstrap) RequiredUIs() []libkb.UIKind {
    38  	return []libkb.UIKind{}
    39  }
    40  
    41  // SubConsumers returns the other UI consumers for this engine.
    42  func (e *Bootstrap) SubConsumers() []libkb.UIConsumer {
    43  	return nil
    44  }
    45  
    46  func (e *Bootstrap) lookupFullname(m libkb.MetaContext, uv keybase1.UserVersion) {
    47  	pkgs, err := m.G().UIDMapper.MapUIDsToUsernamePackagesOffline(m.Ctx(), m.G(), []keybase1.UID{uv.Uid}, time.Duration(0))
    48  	if err != nil {
    49  		m.Warning("UID -> Username failed lookup: %s", err)
    50  		return
    51  	}
    52  	pkg := pkgs[0]
    53  	if pkg.NormalizedUsername.IsNil() || pkg.FullName == nil {
    54  		m.Debug("Empty username for UID=%s", uv.Uid)
    55  		return
    56  	}
    57  	if !uv.EldestSeqno.Eq(pkg.FullName.EldestSeqno) {
    58  		m.Debug("Wrong eldest for username package; got %d but wanted %d", pkg.FullName.EldestSeqno, uv.EldestSeqno)
    59  		return
    60  	}
    61  	e.status.Fullname = pkg.FullName.FullName
    62  }
    63  
    64  // Run starts the engine.
    65  func (e *Bootstrap) Run(m libkb.MetaContext) error {
    66  	e.status.Registered = e.signedUp(m)
    67  
    68  	// if any Login engine worked previously, then ActiveDevice will
    69  	// be valid:
    70  	validActiveDevice := m.G().ActiveDevice.Valid()
    71  
    72  	// the only way for ActiveDevice to be valid is to be logged in
    73  	// (and provisioned)
    74  	e.status.LoggedIn = validActiveDevice
    75  	if !e.status.LoggedIn {
    76  		m.Debug("Bootstrap: not logged in")
    77  		return nil
    78  	}
    79  	m.Debug("Bootstrap: logged in (valid active device)")
    80  
    81  	var uv keybase1.UserVersion
    82  	uv, e.status.DeviceID, e.status.DeviceName, _, _ = e.G().ActiveDevice.AllFields()
    83  	e.status.Uid = uv.Uid
    84  	e.status.Username = e.G().ActiveDevice.Username(m).String()
    85  	m.Debug("Bootstrap status: uid=%s, username=%s, deviceID=%s, deviceName=%s", e.status.Uid, e.status.Username, e.status.DeviceID, e.status.DeviceName)
    86  
    87  	if chatHelper := e.G().ChatHelper; chatHelper != nil {
    88  		e.status.UserReacjis = chatHelper.UserReacjis(m.Ctx(), e.status.Uid.ToBytes())
    89  	}
    90  
    91  	e.lookupFullname(m, uv)
    92  
    93  	return nil
    94  }
    95  
    96  // signedUp is true if there's a uid in config.json.
    97  func (e *Bootstrap) signedUp(m libkb.MetaContext) bool {
    98  	cr := m.G().Env.GetConfig()
    99  	if cr == nil {
   100  		return false
   101  	}
   102  	if uid := cr.GetUID(); uid.Exists() {
   103  		return true
   104  	}
   105  	return false
   106  }
   107  
   108  func (e *Bootstrap) Status() keybase1.BootstrapStatus {
   109  	return e.status
   110  }