github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/libkb/deprovision.go (about)

     1  package libkb
     2  
     3  // XXX: THIS DELETES SECRET KEYS. Deleting the wrong secret keys can make you
     4  // lose all your data forever. We only run this in the DeprovisionEngine and if
     5  // we detect that our device was revoked in LogoutAndDeprovisionIfRevoked.
     6  func ClearSecretsOnDeprovision(mctx MetaContext, username NormalizedUsername) error {
     7  	// 1. Delete all the user's secret keys!!!
     8  	// 2. Delete the user's ephemeralKeys
     9  	// 3. Delete the user from the config file.
    10  	// 4. Db nuke.
    11  
    12  	epick := FirstErrorPicker{}
    13  
    14  	var logger func(string, ...interface{})
    15  	if mctx.UIs().LogUI == nil {
    16  		logger = mctx.Info
    17  	} else {
    18  		logger = mctx.UIs().LogUI.Info
    19  	}
    20  
    21  	if clearSecretErr := ClearStoredSecret(mctx, username); clearSecretErr != nil {
    22  		mctx.Warning("ClearStoredSecret error: %s", clearSecretErr)
    23  	}
    24  
    25  	// XXX: Delete the user's secret keyring. It's very important that we never
    26  	// do this to the wrong user. Please do not copy this code :)
    27  	logger("Deleting %s's secret keys file...", username.String())
    28  	filename := mctx.G().SKBFilenameForUser(username)
    29  	epick.Push(ShredFile(filename))
    30  
    31  	logger("Deleting %s's ephemeralKeys...", username.String())
    32  	// NOTE: We only store userEK/teamEK boxes locally and these are removed in
    33  	// the LocalDb.Nuke() below so we just delete any deviceEKs here.
    34  	deviceEKStorage := mctx.G().GetDeviceEKStorage()
    35  	if deviceEKStorage != nil {
    36  		epick.Push(deviceEKStorage.ForceDeleteAll(mctx, username))
    37  	}
    38  
    39  	logger("Deleting %s from config.json...", username.String())
    40  	epick.Push(mctx.SwitchUserDeprovisionNukeConfig(username))
    41  
    42  	logger("Clearing the local cache db...")
    43  	_, err := mctx.G().LocalDb.Nuke()
    44  	epick.Push(err)
    45  
    46  	logger("Clearing the local cache chat db...")
    47  	_, err = mctx.G().LocalChatDb.Nuke()
    48  	epick.Push(err)
    49  
    50  	logger("Deprovision finished.")
    51  	return epick.Error()
    52  }