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

     1  // Handlers for ephemeral-related gregor messages
     2  
     3  package service
     4  
     5  import (
     6  	"encoding/json"
     7  	"fmt"
     8  	"strings"
     9  
    10  	"golang.org/x/net/context"
    11  
    12  	"github.com/keybase/client/go/ephemeral"
    13  	"github.com/keybase/client/go/gregor"
    14  	"github.com/keybase/client/go/libkb"
    15  	"github.com/keybase/client/go/protocol/gregor1"
    16  	"github.com/keybase/client/go/protocol/keybase1"
    17  )
    18  
    19  const ekHandlerName = "ephemeralHandler"
    20  
    21  type ekHandler struct {
    22  	libkb.Contextified
    23  }
    24  
    25  var _ libkb.GregorInBandMessageHandler = (*ekHandler)(nil)
    26  
    27  func newEKHandler(g *libkb.GlobalContext) *ekHandler {
    28  	return &ekHandler{
    29  		Contextified: libkb.NewContextified(g),
    30  	}
    31  }
    32  
    33  func (r *ekHandler) Create(ctx context.Context, cli gregor1.IncomingInterface, category string, item gregor.Item) (bool, error) {
    34  	switch category {
    35  	case "ephemeral.new_team_ek":
    36  		return true, r.newTeamEK(ctx, cli, item)
    37  	case "ephemeral.new_teambot_key":
    38  		return true, r.newTeambotEK(ctx, cli, item)
    39  	case "ephemeral.teambot_key_needed":
    40  		return true, r.teambotEKNeeded(ctx, cli, item)
    41  	default:
    42  		if strings.HasPrefix(category, "ephemeral.") {
    43  			return false, fmt.Errorf("unknown ekHandler category: %q", category)
    44  		}
    45  		return false, nil
    46  	}
    47  }
    48  
    49  func (r *ekHandler) Dismiss(ctx context.Context, cli gregor1.IncomingInterface, category string, item gregor.Item) (bool, error) {
    50  	return false, nil
    51  }
    52  
    53  func (r *ekHandler) IsAlive() bool {
    54  	return true
    55  }
    56  
    57  func (r *ekHandler) Name() string {
    58  	return ekHandlerName
    59  }
    60  
    61  func (r *ekHandler) newTeamEK(ctx context.Context, cli gregor1.IncomingInterface, item gregor.Item) error {
    62  	r.G().Log.CDebugf(ctx, "ekHandler: ephemeral.new_team_ek received")
    63  	var msg keybase1.NewTeamEkArg
    64  	if err := json.Unmarshal(item.Body().Bytes(), &msg); err != nil {
    65  		r.G().Log.CDebugf(ctx, "error unmarshaling ephemeral.new_team_ek item: %s", err)
    66  		return err
    67  	}
    68  	r.G().Log.CDebugf(ctx, "ephemeral.new_team_ek unmarshaled: %+v", msg)
    69  
    70  	if err := ephemeral.HandleNewTeamEK(r.MetaContext(ctx), msg.Id, msg.Generation); err != nil {
    71  		return err
    72  	}
    73  
    74  	r.G().Log.CDebugf(ctx, "dismissing ephemeral.new_team_ek item since action succeeded")
    75  	return r.G().GregorState.DismissItem(ctx, cli, item.Metadata().MsgID())
    76  }
    77  
    78  func (r *ekHandler) newTeambotEK(ctx context.Context, cli gregor1.IncomingInterface, item gregor.Item) error {
    79  	r.G().Log.CDebugf(ctx, "ekHandler: ephemeral.new_teambot_key received")
    80  	var msg keybase1.NewTeambotEkArg
    81  	if err := json.Unmarshal(item.Body().Bytes(), &msg); err != nil {
    82  		r.G().Log.CDebugf(ctx, "error unmarshaling ephemeral.new_teambot_key item: %s", err)
    83  		return err
    84  	}
    85  	r.G().Log.CDebugf(ctx, "ephemeral.new_teambot_key unmarshaled: %+v", msg)
    86  
    87  	if err := ephemeral.HandleNewTeambotEK(r.MetaContext(ctx), msg.Id, msg.Generation); err != nil {
    88  		return err
    89  	}
    90  
    91  	r.G().Log.CDebugf(ctx, "dismissing ephemeral.new_teambot_key since action succeeded")
    92  	return r.G().GregorState.DismissItem(ctx, cli, item.Metadata().MsgID())
    93  }
    94  
    95  func (r *ekHandler) teambotEKNeeded(ctx context.Context, cli gregor1.IncomingInterface, item gregor.Item) error {
    96  	r.G().Log.CDebugf(ctx, "ekHandler: ephemeral.teambot_key_needed received")
    97  	var msg keybase1.TeambotEkNeededArg
    98  	if err := json.Unmarshal(item.Body().Bytes(), &msg); err != nil {
    99  		r.G().Log.CDebugf(ctx, "error unmarshaling ephemeral.teambot_key_needed item: %s", err)
   100  		return err
   101  	}
   102  	r.G().Log.CDebugf(ctx, "ephemeral.teambot_key_needed unmarshaled: %+v", msg)
   103  
   104  	if err := ephemeral.HandleTeambotEKNeeded(r.MetaContext(ctx), msg.Id, msg.Uid, msg.Generation, msg.ForceCreateGeneration); err != nil {
   105  		return err
   106  	}
   107  
   108  	r.G().Log.CDebugf(ctx, "dismissing ephemeral.teambot_key_needed item since action succeeded")
   109  	return r.G().GregorState.DismissItem(ctx, cli, item.Metadata().MsgID())
   110  }