diff --git a/keyer/bunker.go b/keyer/bunker.go index f62c719..683e257 100644 --- a/keyer/bunker.go +++ b/keyer/bunker.go @@ -17,11 +17,14 @@ func NewBunkerSignerFromBunkerClient(bc *nip46.BunkerClient) BunkerSigner { return BunkerSigner{bc} } -func (bs BunkerSigner) GetPublicKey(ctx context.Context) string { +func (bs BunkerSigner) GetPublicKey(ctx context.Context) (string, error) { ctx, cancel := context.WithTimeout(ctx, time.Second*30) defer cancel() - pk, _ := bs.bunker.GetPublicKey(ctx) - return pk + pk, err := bs.bunker.GetPublicKey(ctx) + if err != nil { + return "", err + } + return pk, nil } func (bs BunkerSigner) SignEvent(ctx context.Context, evt *nostr.Event) error { diff --git a/keyer/encrypted.go b/keyer/encrypted.go index 3ce5ec7..1e875d1 100644 --- a/keyer/encrypted.go +++ b/keyer/encrypted.go @@ -16,18 +16,21 @@ type EncryptedKeySigner struct { callback func(context.Context) string } -func (es *EncryptedKeySigner) GetPublicKey(ctx context.Context) string { +func (es *EncryptedKeySigner) GetPublicKey(ctx context.Context) (string, error) { if es.pk != "" { - return es.pk + return es.pk, nil } password := es.callback(ctx) key, err := nip49.Decrypt(es.ncryptsec, password) if err != nil { - return "" + return "", err + } + pk, err := nostr.GetPublicKey(key) + if err != nil { + return "", err } - pk, _ := nostr.GetPublicKey(key) es.pk = pk - return pk + return pk, nil } func (es *EncryptedKeySigner) SignEvent(ctx context.Context, evt *nostr.Event) error { diff --git a/keyer/lib.go b/keyer/lib.go index 1a147ed..46e3bae 100644 --- a/keyer/lib.go +++ b/keyer/lib.go @@ -22,7 +22,7 @@ type Keyer interface { // A Signer provides basic public key signing methods. type Signer interface { - GetPublicKey(context.Context) string + GetPublicKey(context.Context) (string, error) SignEvent(context.Context, *nostr.Event) error } diff --git a/keyer/manual.go b/keyer/manual.go index c518006..e6e1e0d 100644 --- a/keyer/manual.go +++ b/keyer/manual.go @@ -10,7 +10,7 @@ import ( // It can be used when an app for some reason wants to ask the user to manually provide a signed event // by copy-and-paste, for example. type ManualSigner struct { - ManualGetPublicKey func(context.Context) string + ManualGetPublicKey func(context.Context) (string, error) ManualSignEvent func(context.Context, *nostr.Event) error ManualEncrypt func(ctx context.Context, plaintext string, recipientPublicKey string) (base64ciphertext string, err error) ManualDecrypt func(ctx context.Context, base64ciphertext string, senderPublicKey string) (plaintext string, err error) @@ -20,7 +20,7 @@ func (ms ManualSigner) SignEvent(ctx context.Context, evt *nostr.Event) error { return ms.ManualSignEvent(ctx, evt) } -func (ms ManualSigner) GetPublicKey(ctx context.Context) string { +func (ms ManualSigner) GetPublicKey(ctx context.Context) (string, error) { return ms.ManualGetPublicKey(ctx) } diff --git a/keyer/plain.go b/keyer/plain.go index 62d07f0..ffab64d 100644 --- a/keyer/plain.go +++ b/keyer/plain.go @@ -16,13 +16,16 @@ type KeySigner struct { conversationKeys *xsync.MapOf[string, [32]byte] } -func NewPlainKeySigner(sec string) KeySigner { - pk, _ := nostr.GetPublicKey(sec) - return KeySigner{sec, pk, xsync.NewMapOf[string, [32]byte]()} +func NewPlainKeySigner(sec string) (KeySigner, error) { + pk, err := nostr.GetPublicKey(sec) + if err != nil { + return KeySigner{}, err + } + return KeySigner{sec, pk, xsync.NewMapOf[string, [32]byte]()}, nil } func (ks KeySigner) SignEvent(ctx context.Context, evt *nostr.Event) error { return evt.Sign(ks.sk) } -func (ks KeySigner) GetPublicKey(ctx context.Context) string { return ks.pk } +func (ks KeySigner) GetPublicKey(ctx context.Context) (string, error) { return ks.pk, nil } func (ks KeySigner) Encrypt(ctx context.Context, plaintext string, recipient string) (string, error) { ck, ok := ks.conversationKeys.Load(recipient) diff --git a/nip17/nip17.go b/nip17/nip17.go index d7f55ae..de2a938 100644 --- a/nip17/nip17.go +++ b/nip17/nip17.go @@ -38,7 +38,10 @@ func PrepareMessage( recipientPubKey string, modify func(*nostr.Event), ) (toUs nostr.Event, toThem nostr.Event, err error) { - ourPubkey := kr.GetPublicKey(ctx) + ourPubkey, err := kr.GetPublicKey(ctx) + if err != nil { + return nostr.Event{}, nostr.Event{}, err + } rumor := nostr.Event{ Kind: 14, @@ -87,10 +90,16 @@ func ListenForMessages( go func() { defer close(ch) + pk, err := kr.GetPublicKey(ctx) + if err != nil { + nostr.InfoLogger.Printf("[nip17] failed to get public key from Keyer: %s\n", err) + return + } + for ie := range pool.SubMany(ctx, ourRelays, nostr.Filters{ { Kinds: []int{1059}, - Tags: nostr.TagMap{"p": []string{kr.GetPublicKey(ctx)}}, + Tags: nostr.TagMap{"p": []string{pk}}, Since: &since, }, }) {