notifications: server implementation

This commit is contained in:
Jesse de Wit
2023-06-15 12:48:28 +02:00
parent 205d39d715
commit 4fc7887707
6 changed files with 413 additions and 0 deletions

58
notifications/server.go Normal file
View File

@@ -0,0 +1,58 @@
package notifications
import (
context "context"
"crypto/sha256"
"encoding/hex"
"fmt"
"log"
"github.com/btcsuite/btcd/btcec/v2/ecdsa"
)
var ErrInvalidSignature = fmt.Errorf("invalid signature")
var ErrInternal = fmt.Errorf("internal error")
type server struct {
store Store
NotificationsServer
}
func NewNotificationsServer(store Store) NotificationsServer {
return &server{
store: store,
}
}
func (s *server) SubscribeNotifications(
ctx context.Context,
request *SubscribeNotificationsRequest,
) (*SubscribeNotificationsReply, error) {
first := sha256.Sum256([]byte(request.Url))
second := sha256.Sum256(first[:])
pubkey, wasCompressed, err := ecdsa.RecoverCompact(
request.Signature,
second[:],
)
if err != nil {
return nil, ErrInvalidSignature
}
if !wasCompressed {
return nil, ErrInvalidSignature
}
err = s.store.Register(ctx, hex.EncodeToString(pubkey.SerializeCompressed()), request.Url)
if err != nil {
log.Printf(
"failed to register %x for notifications on url %s: %v",
pubkey.SerializeCompressed(),
request.Url,
err,
)
return nil, ErrInternal
}
return &SubscribeNotificationsReply{}, nil
}