github.com/keybase/client/go@v0.0.0-20241007131713-f10651d043c8/kbfs/idutil/session.go (about) 1 // Copyright 2019 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 idutil 6 7 import ( 8 "context" 9 10 "github.com/keybase/client/go/kbfs/kbfscrypto" 11 kbname "github.com/keybase/client/go/kbun" 12 "github.com/keybase/client/go/libkb" 13 "github.com/keybase/client/go/protocol/keybase1" 14 ) 15 16 // GetCurrentSessionIfPossible returns the current username and UID 17 // from kbpki.GetCurrentSession. If sessionNotRequired is true 18 // NoCurrentSessionError is ignored and empty username and uid will be 19 // returned. If it is false all errors are returned. 20 func GetCurrentSessionIfPossible( 21 ctx context.Context, kbpki CurrentSessionGetter, sessionNotRequired bool) ( 22 SessionInfo, error) { 23 session, err := kbpki.GetCurrentSession(ctx) 24 if err == nil { 25 return session, nil 26 } 27 // Return all errors if a session is required. 28 if !sessionNotRequired { 29 return SessionInfo{}, err 30 } 31 32 // If not logged in, return empty session. 33 if _, notLoggedIn := err.(NoCurrentSessionError); notLoggedIn { 34 return SessionInfo{}, nil 35 } 36 37 // Otherwise, just return the error. 38 return SessionInfo{}, err 39 } 40 41 // SessionInfoFromProtocol returns SessionInfo from Session 42 func SessionInfoFromProtocol(session keybase1.Session) (SessionInfo, error) { 43 // Import the KIDs to validate them. 44 deviceSubkey, err := libkb.ImportKeypairFromKID(session.DeviceSubkeyKid) 45 if err != nil { 46 return SessionInfo{}, err 47 } 48 deviceSibkey, err := libkb.ImportKeypairFromKID(session.DeviceSibkeyKid) 49 if err != nil { 50 return SessionInfo{}, err 51 } 52 cryptPublicKey := kbfscrypto.MakeCryptPublicKey(deviceSubkey.GetKID()) 53 verifyingKey := kbfscrypto.MakeVerifyingKey(deviceSibkey.GetKID()) 54 return SessionInfo{ 55 Name: kbname.NewNormalizedUsername(session.Username), 56 UID: session.Uid, 57 CryptPublicKey: cryptPublicKey, 58 VerifyingKey: verifyingKey, 59 }, nil 60 }