github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/kbfs/libkbfs/keybase_service_util.go (about)

     1  // Copyright 2016 Keybase Inc. All rights reserved.
     2  // Use of this source code is governed by a BSD
     3  // license that can be found in the LICENSE file.
     4  
     5  package libkbfs
     6  
     7  import (
     8  	"sync"
     9  
    10  	"github.com/keybase/client/go/kbconst"
    11  	"github.com/keybase/client/go/kbfs/idutil"
    12  	"github.com/keybase/client/go/kbfs/tlf"
    13  	"github.com/keybase/client/go/libkb"
    14  	"golang.org/x/net/context"
    15  )
    16  
    17  // EnableAdminFeature returns true if admin features should be enabled
    18  // for the currently-logged-in user.
    19  func EnableAdminFeature(ctx context.Context, runMode kbconst.RunMode, config Config) bool {
    20  	if runMode == kbconst.DevelRunMode {
    21  		// All users in devel mode are admins.
    22  		return true
    23  	}
    24  	const sessionID = 0
    25  	session, err := config.KeybaseService().CurrentSession(ctx, sessionID)
    26  	if err != nil {
    27  		return false
    28  	}
    29  	return libkb.IsKeybaseAdmin(session.UID)
    30  }
    31  
    32  // setHomeTlfIdsForDbcAndFavorites sets the user's home TLFs on the disk
    33  // block cache and the favorites cache.
    34  func setHomeTlfIdsForDbcAndFavorites(ctx context.Context, config Config, username string) {
    35  	if config.DiskBlockCache() == nil {
    36  		return
    37  	}
    38  
    39  	log := config.MakeLogger("")
    40  	publicHandle, err := getHandleFromFolderName(ctx,
    41  		config.KBPKI(), config.MDOps(), config, username, true)
    42  	if err != nil {
    43  		log.CWarningf(ctx, "serviceLoggedIn: Failed to fetch TLF ID for "+
    44  			"user's public TLF: %+v", err)
    45  	} else if publicHandle.TlfID() != tlf.NullID {
    46  		err = config.DiskBlockCache().AddHomeTLF(ctx, publicHandle.TlfID())
    47  		if err != nil {
    48  			log.CWarningf(ctx, "serviceLoggedIn: Failed to set home TLF "+
    49  				"for disk block cache: %+v", err)
    50  		}
    51  	}
    52  	privateHandle, err := getHandleFromFolderName(
    53  		ctx, config.KBPKI(), config.MDOps(), config, username, false)
    54  	if err != nil {
    55  		log.CWarningf(ctx, "serviceLoggedIn: Failed to fetch TLF ID for "+
    56  			"user's private TLF: %+v", err)
    57  	} else if privateHandle.TlfID() != tlf.NullID {
    58  		err = config.DiskBlockCache().AddHomeTLF(ctx, privateHandle.TlfID())
    59  		if err != nil {
    60  			log.CWarningf(ctx, "serviceLoggedIn: Failed to set home TLF "+
    61  				"for disk block cache: %+v", err)
    62  		}
    63  	}
    64  
    65  	// Send to Favorites cache
    66  	info := homeTLFInfo{}
    67  	if publicHandle != nil {
    68  		teamID := publicHandle.ToFavToAdd(false).Data.TeamID
    69  		if teamID != nil {
    70  			info.PublicTeamID = *teamID
    71  		}
    72  	}
    73  	if privateHandle != nil {
    74  		teamID := privateHandle.ToFavToAdd(false).Data.TeamID
    75  		if teamID != nil {
    76  			info.PrivateTeamID = *teamID
    77  		}
    78  	}
    79  	config.KBFSOps().SetFavoritesHomeTLFInfo(ctx, info)
    80  }
    81  
    82  // serviceLoggedIn should be called when a new user logs in. It
    83  // shouldn't be called again until after serviceLoggedOut is called.
    84  func serviceLoggedIn(ctx context.Context, config Config, session idutil.SessionInfo,
    85  	bws TLFJournalBackgroundWorkStatus) (wg *sync.WaitGroup) {
    86  	wg = &sync.WaitGroup{} // To avoid returning a nil pointer.
    87  	log := config.MakeLogger("")
    88  	if jManager, err := GetJournalManager(config); err == nil {
    89  		err := jManager.EnableExistingJournals(
    90  			ctx, session.UID, session.VerifyingKey, bws)
    91  		if err != nil {
    92  			log.CWarningf(ctx,
    93  				"Failed to enable existing journals: %v", err)
    94  		} else {
    95  			// Initializing the FBOs uses the mdserver, and this
    96  			// function might be called as part of MDServer.OnConnect,
    97  			// so be safe and initialize them in the background to
    98  			// avoid deadlocks.
    99  			newCtx := CtxWithRandomIDReplayable(context.Background(),
   100  				CtxKeybaseServiceIDKey, CtxKeybaseServiceOpID, log)
   101  			log.CDebugf(ctx, "Making FBOs in background: %s=%v",
   102  				CtxKeybaseServiceOpID, newCtx.Value(CtxKeybaseServiceIDKey))
   103  			wg = jManager.MakeFBOsForExistingJournals(newCtx)
   104  		}
   105  	}
   106  
   107  	err := config.MakeDiskBlockCacheIfNotExists()
   108  	if err != nil {
   109  		log.CWarningf(ctx, "serviceLoggedIn: Failed to enable disk cache: "+
   110  			"%+v", err)
   111  	}
   112  	// Asynchronously set the TLF IDs for the home folders on the disk block
   113  	// cache.
   114  	go setHomeTlfIdsForDbcAndFavorites(context.Background(), config, session.Name.String())
   115  
   116  	// Launch auth refreshes in the background, in case we are
   117  	// currently disconnected from one of these servers.
   118  	mdServer := config.MDServer()
   119  	if mdServer != nil {
   120  		go mdServer.RefreshAuthToken(context.Background())
   121  	}
   122  	bServer := config.BlockServer()
   123  	if bServer != nil {
   124  		go bServer.RefreshAuthToken(context.Background())
   125  	}
   126  
   127  	if config.Mode().DoRefreshFavoritesOnInit() {
   128  		config.KBFSOps().RefreshCachedFavorites(
   129  			ctx, FavoritesRefreshModeInMainFavoritesLoop)
   130  	}
   131  	config.KBFSOps().PushStatusChange()
   132  	return wg
   133  }
   134  
   135  // serviceLoggedOut should be called when the current user logs out.
   136  func serviceLoggedOut(ctx context.Context, config Config) {
   137  	if jManager, err := GetJournalManager(config); err == nil {
   138  		jManager.shutdownExistingJournals(ctx)
   139  	}
   140  	config.ResetCaches()
   141  	config.UserHistory().Clear()
   142  	config.Chat().ClearCache()
   143  	mdServer := config.MDServer()
   144  	if mdServer != nil {
   145  		mdServer.RefreshAuthToken(ctx)
   146  	}
   147  	bServer := config.BlockServer()
   148  	if bServer != nil {
   149  		bServer.RefreshAuthToken(ctx)
   150  	}
   151  	config.KBFSOps().ClearCachedFavorites(ctx)
   152  	config.KBFSOps().PushStatusChange()
   153  
   154  	// Clear any cached MD for all private TLFs, as they shouldn't be
   155  	// readable by a logged out user.  We assume that a logged-out
   156  	// call always comes before a logged-in call.
   157  	config.KBFSOps().ClearPrivateFolderMD(ctx)
   158  }