// PushHandler adds a new ibm handler to our list. This is usually triggered // when an external entity (like Electron) connects to the service, and we can // safely send Gregor information to it func (g *gregorHandler) PushHandler(handler libkb.GregorInBandMessageHandler) { g.Lock() defer g.Unlock() g.G().Log.Debug("pushing inband handler %s to position %d", handler.Name(), len(g.ibmHandlers)) g.ibmHandlers = append(g.ibmHandlers, handler) // Only try replaying if we are logged in, it's possible that a handler can // attach before that is true (like if we start the service logged out and // Electron connects) if g.IsConnected() { if _, err := g.replayInBandMessages(context.TODO(), gregor1.IncomingClient{Cli: g.cli}, time.Time{}, handler); err != nil { g.Errorf("replayInBandMessages on PushHandler failed: %s", err) } } }
// handleInBandMessageWithHandler runs a message against the specified handler func (g *gregorHandler) handleInBandMessageWithHandler(ctx context.Context, cli gregor1.IncomingInterface, ibm gregor.InBandMessage, handler libkb.GregorInBandMessageHandler) (bool, error) { g.Debug("handleInBand: %+v", ibm) gcli, err := g.getGregorCli() if err != nil { return false, err } state, err := gcli.StateMachineState(nil) if err != nil { return false, err } sync := ibm.ToStateSyncMessage() if sync != nil { g.Debug("state sync message") return false, nil } update := ibm.ToStateUpdateMessage() if update != nil { g.Debug("state update message") item := update.Creation() if item != nil { id := item.Metadata().MsgID().String() g.Debug("msg ID %s created ctime: %s", id, item.Metadata().CTime()) category := "" if item.Category() != nil { category = item.Category().String() g.Debug("item %s has category %s", id, category) } if handled, err := handler.Create(ctx, cli, category, item); err != nil { return handled, err } } dismissal := update.Dismissal() if dismissal != nil { g.Debug("received dismissal") for _, id := range dismissal.MsgIDsToDismiss() { item, present := state.GetItem(id) if !present { g.Debug("tried to dismiss item %s, not present", id.String()) continue } g.Debug("dismissing item %s", id.String()) category := "" if item.Category() != nil { category = item.Category().String() g.Debug("dismissal %s has category %s", id, category) } if handled, err := handler.Dismiss(ctx, cli, category, item); handled && err != nil { return handled, err } } if len(dismissal.RangesToDismiss()) > 0 { g.Debug("message range dismissing not implemented") } } return true, nil } return false, nil }