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

     1  // Copyright 2015 Keybase, Inc. All rights reserved. Use of
     2  // this source code is governed by the included BSD license.
     3  
     4  package libkb
     5  
     6  import (
     7  	keybase1 "github.com/keybase/client/go/protocol/keybase1"
     8  	"github.com/keybase/saltpack"
     9  )
    10  
    11  func PGPLookup(mctx MetaContext, id uint64) (username string, uid keybase1.UID, err error) {
    12  	return keyLookup(mctx, keyLookupArg{uintID: id})
    13  }
    14  
    15  func PGPLookupHex(mctx MetaContext, hexID string) (username string, uid keybase1.UID, err error) {
    16  	return keyLookup(mctx, keyLookupArg{hexID: hexID})
    17  }
    18  
    19  func PGPLookupFingerprint(mctx MetaContext, fp *PGPFingerprint) (username string, uid keybase1.UID, err error) {
    20  	return keyLookup(mctx, keyLookupArg{fp: fp})
    21  }
    22  
    23  func KeyLookupKIDIncludingRevoked(mctx MetaContext, k keybase1.KID) (username string, uid keybase1.UID, err error) {
    24  	return keyLookup(mctx, keyLookupArg{kid: k, includeRevoked: true})
    25  }
    26  
    27  func KeyLookupByBoxPublicKey(mctx MetaContext, k saltpack.BoxPublicKey) (username string, uid keybase1.UID, err error) {
    28  	return keyLookup(mctx, keyLookupArg{kid: BoxPublicKeyToKeybaseKID(k)})
    29  }
    30  
    31  type keyLookupArg struct {
    32  	fp             *PGPFingerprint
    33  	hexID          string
    34  	uintID         uint64
    35  	kid            keybase1.KID
    36  	includeRevoked bool
    37  }
    38  
    39  type keyBasicsReply struct {
    40  	Status   AppStatus `json:"status"`
    41  	Username string    `json:"username"`
    42  	UID      string    `json:"uid"`
    43  }
    44  
    45  func (k *keyBasicsReply) GetAppStatus() *AppStatus {
    46  	return &k.Status
    47  }
    48  
    49  func keyLookup(mctx MetaContext, arg keyLookupArg) (username string, uid keybase1.UID, err error) {
    50  	httpArgs := make(HTTPArgs)
    51  	httpArgs["include_revoked"] = B{Val: arg.includeRevoked}
    52  	switch {
    53  	case arg.fp != nil:
    54  		httpArgs["fingerprint"] = S{arg.fp.String()}
    55  	case len(arg.hexID) > 0:
    56  		httpArgs["pgp_key_id"] = S{Val: arg.hexID}
    57  	case arg.uintID > 0:
    58  		httpArgs["pgp_key_id"] = UHex{Val: arg.uintID}
    59  	case !arg.kid.IsNil():
    60  		httpArgs["kid"] = S{Val: arg.kid.String()}
    61  	default:
    62  		return username, uid, InvalidArgumentError{Msg: "invalid pgp lookup arg"}
    63  	}
    64  
    65  	var data keyBasicsReply
    66  
    67  	// lookup key on api server
    68  	args := APIArg{
    69  		Endpoint: "key/basics",
    70  		Args:     httpArgs,
    71  	}
    72  
    73  	if err = mctx.G().API.GetDecode(mctx, args, &data); err != nil {
    74  		if ase, ok := err.(AppStatusError); ok && ase.Code == SCKeyNotFound {
    75  			err = NotFoundError{}
    76  		}
    77  		return username, uid, err
    78  	}
    79  
    80  	uid, err = keybase1.UIDFromString(data.UID)
    81  	if err != nil {
    82  		return username, uid, err
    83  	}
    84  	return data.Username, uid, nil
    85  }