Add push notification register message
This commit is contained in:
parent
c4fa9825a9
commit
92b699b59d
|
@ -1,85 +0,0 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// source: message.proto
|
||||
|
||||
package applicationmetadata
|
||||
|
||||
import (
|
||||
fmt "fmt"
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
math "math"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ = proto.Marshal
|
||||
var _ = fmt.Errorf
|
||||
var _ = math.Inf
|
||||
|
||||
// This is a compile-time assertion to ensure that this generated file
|
||||
// is compatible with the proto package it is being compiled against.
|
||||
// A compilation error at this line likely means your copy of the
|
||||
// proto package needs to be updated.
|
||||
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
|
||||
|
||||
type Message struct {
|
||||
Signature []byte `protobuf:"bytes,4001,opt,name=signature,proto3" json:"signature,omitempty"`
|
||||
Payload []byte `protobuf:"bytes,4002,opt,name=payload,proto3" json:"payload,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *Message) Reset() { *m = Message{} }
|
||||
func (m *Message) String() string { return proto.CompactTextString(m) }
|
||||
func (*Message) ProtoMessage() {}
|
||||
func (*Message) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_33c57e4bae7b9afd, []int{0}
|
||||
}
|
||||
|
||||
func (m *Message) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_Message.Unmarshal(m, b)
|
||||
}
|
||||
func (m *Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_Message.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *Message) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_Message.Merge(m, src)
|
||||
}
|
||||
func (m *Message) XXX_Size() int {
|
||||
return xxx_messageInfo_Message.Size(m)
|
||||
}
|
||||
func (m *Message) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_Message.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_Message proto.InternalMessageInfo
|
||||
|
||||
func (m *Message) GetSignature() []byte {
|
||||
if m != nil {
|
||||
return m.Signature
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Message) GetPayload() []byte {
|
||||
if m != nil {
|
||||
return m.Payload
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func init() {
|
||||
proto.RegisterType((*Message)(nil), "applicationmetadata.Message")
|
||||
}
|
||||
|
||||
func init() { proto.RegisterFile("message.proto", fileDescriptor_33c57e4bae7b9afd) }
|
||||
|
||||
var fileDescriptor_33c57e4bae7b9afd = []byte{
|
||||
// 112 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0xcd, 0x4d, 0x2d, 0x2e,
|
||||
0x4e, 0x4c, 0x4f, 0xd5, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x4e, 0x2c, 0x28, 0xc8, 0xc9,
|
||||
0x4c, 0x4e, 0x2c, 0xc9, 0xcc, 0xcf, 0xcb, 0x4d, 0x2d, 0x49, 0x4c, 0x49, 0x2c, 0x49, 0x54, 0x72,
|
||||
0xe6, 0x62, 0xf7, 0x85, 0xa8, 0x12, 0x92, 0xe5, 0xe2, 0x2c, 0xce, 0x4c, 0xcf, 0x4b, 0x2c, 0x29,
|
||||
0x2d, 0x4a, 0x95, 0x58, 0x28, 0xaf, 0xc0, 0xa8, 0xc1, 0x13, 0x84, 0x10, 0x11, 0x92, 0xe4, 0x62,
|
||||
0x2f, 0x48, 0xac, 0xcc, 0xc9, 0x4f, 0x4c, 0x91, 0x58, 0x04, 0x91, 0x84, 0xf1, 0x93, 0xd8, 0xc0,
|
||||
0x16, 0x18, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0xb0, 0x7f, 0x4a, 0x96, 0x71, 0x00, 0x00, 0x00,
|
||||
}
|
|
@ -1,8 +0,0 @@
|
|||
syntax = "proto3";
|
||||
|
||||
package applicationmetadata;
|
||||
|
||||
message Message {
|
||||
bytes signature = 4001;
|
||||
bytes payload = 4002;
|
||||
}
|
|
@ -1,23 +0,0 @@
|
|||
package applicationmetadata
|
||||
|
||||
import (
|
||||
"crypto/ecdsa"
|
||||
|
||||
"github.com/status-im/status-go/eth-node/crypto"
|
||||
)
|
||||
|
||||
func (m *Message) RecoverKey() (*ecdsa.PublicKey, error) {
|
||||
if m.Signature == nil {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
recoveredKey, err := crypto.SigToPub(
|
||||
crypto.Keccak256(m.Payload),
|
||||
m.Signature,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return recoveredKey, nil
|
||||
}
|
|
@ -1,17 +0,0 @@
|
|||
package applicationmetadata
|
||||
|
||||
import (
|
||||
"github.com/golang/protobuf/proto"
|
||||
)
|
||||
|
||||
//go:generate protoc --go_out=. ./message.proto
|
||||
|
||||
func Unmarshal(payload []byte) (*Message, error) {
|
||||
var message Message
|
||||
err := proto.Unmarshal(payload, &message)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &message, nil
|
||||
}
|
|
@ -42,6 +42,11 @@ type messageProcessor struct {
|
|||
logger *zap.Logger
|
||||
|
||||
featureFlags featureFlags
|
||||
// onMessageSpecSent is a callback that is to be called when
|
||||
// a message spec is sent.
|
||||
// The reason is a callback is that datasync dispatches things asynchronously
|
||||
// through a callback, and therefore return values can't be used
|
||||
onMessageSpecSent func(*ecdsa.PublicKey, *encryption.ProtocolMessageSpec, [][]byte) error
|
||||
}
|
||||
|
||||
func newMessageProcessor(
|
||||
|
@ -51,6 +56,7 @@ func newMessageProcessor(
|
|||
transport transport.Transport,
|
||||
logger *zap.Logger,
|
||||
features featureFlags,
|
||||
onMessageSpecSent func(*ecdsa.PublicKey, *encryption.ProtocolMessageSpec, [][]byte) error,
|
||||
) (*messageProcessor, error) {
|
||||
dataSyncTransport := datasync.NewNodeTransport()
|
||||
dataSyncNode, err := datasyncnode.NewPersistentNode(
|
||||
|
@ -161,12 +167,13 @@ func (p *messageProcessor) sendPrivate(
|
|||
return nil, errors.Wrap(err, "failed to encrypt message")
|
||||
}
|
||||
|
||||
hash, newMessage, err := p.sendMessageSpec(ctx, recipient, messageSpec)
|
||||
messageIDs := [][]byte{messageID}
|
||||
hash, newMessage, err := p.sendMessageSpec(ctx, recipient, messageSpec, messageIDs)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to send a message spec")
|
||||
}
|
||||
|
||||
p.transport.Track([][]byte{messageID}, hash, newMessage)
|
||||
p.transport.Track(messageIDs, hash, newMessage)
|
||||
}
|
||||
|
||||
return messageID, nil
|
||||
|
@ -190,13 +197,15 @@ func (p *messageProcessor) SendPairInstallation(
|
|||
return nil, errors.Wrap(err, "failed to encrypt message")
|
||||
}
|
||||
|
||||
hash, newMessage, err := p.sendMessageSpec(ctx, recipient, messageSpec)
|
||||
messageID := v1protocol.MessageID(&p.identity.PublicKey, wrappedMessage)
|
||||
messageIDs := [][]byte{messageID}
|
||||
|
||||
hash, newMessage, err := p.sendMessageSpec(ctx, recipient, messageSpec, messageIDs)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to send a message spec")
|
||||
}
|
||||
|
||||
messageID := v1protocol.MessageID(&p.identity.PublicKey, wrappedMessage)
|
||||
p.transport.Track([][]byte{messageID}, hash, newMessage)
|
||||
p.transport.Track(messageIDs, hash, newMessage)
|
||||
|
||||
return messageID, nil
|
||||
}
|
||||
|
@ -330,7 +339,9 @@ func (p *messageProcessor) handleErrDeviceNotFound(ctx context.Context, publicKe
|
|||
|
||||
ctx, cancel := context.WithTimeout(ctx, time.Second)
|
||||
defer cancel()
|
||||
_, _, err = p.sendMessageSpec(ctx, publicKey, messageSpec)
|
||||
// We don't pass an array of messageIDs as no action needs to be taken
|
||||
// when sending a bundle
|
||||
_, _, err = p.sendMessageSpec(ctx, publicKey, messageSpec, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -381,7 +392,7 @@ func (p *messageProcessor) sendDataSync(ctx context.Context, publicKey *ecdsa.Pu
|
|||
return errors.Wrap(err, "failed to encrypt message")
|
||||
}
|
||||
|
||||
hash, newMessage, err := p.sendMessageSpec(ctx, publicKey, messageSpec)
|
||||
hash, newMessage, err := p.sendMessageSpec(ctx, publicKey, messageSpec, messageIDs)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -392,7 +403,7 @@ func (p *messageProcessor) sendDataSync(ctx context.Context, publicKey *ecdsa.Pu
|
|||
}
|
||||
|
||||
// sendMessageSpec analyses the spec properties and selects a proper transport method.
|
||||
func (p *messageProcessor) sendMessageSpec(ctx context.Context, publicKey *ecdsa.PublicKey, messageSpec *encryption.ProtocolMessageSpec) ([]byte, *types.NewMessage, error) {
|
||||
func (p *messageProcessor) sendMessageSpec(ctx context.Context, publicKey *ecdsa.PublicKey, messageSpec *encryption.ProtocolMessageSpec, messageIDs [][]byte) ([]byte, *types.NewMessage, error) {
|
||||
newMessage, err := messageSpecToWhisper(messageSpec)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
|
@ -414,6 +425,13 @@ func (p *messageProcessor) sendMessageSpec(ctx context.Context, publicKey *ecdsa
|
|||
return nil, nil, err
|
||||
}
|
||||
|
||||
if p.onMessageSpecSent != nil {
|
||||
|
||||
if err := p.onMessageSpecSent(publicKey, messageSpec, messageIDs); err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
}
|
||||
|
||||
return hash, newMessage, nil
|
||||
}
|
||||
|
||||
|
|
|
@ -101,6 +101,7 @@ func (s *MessageProcessorSuite) SetupTest() {
|
|||
whisperTransport,
|
||||
s.logger,
|
||||
featureFlags{},
|
||||
nil,
|
||||
)
|
||||
s.Require().NoError(err)
|
||||
}
|
||||
|
|
|
@ -57,6 +57,7 @@ type Messenger struct {
|
|||
encryptor *encryption.Protocol
|
||||
processor *messageProcessor
|
||||
handler *MessageHandler
|
||||
pushNotificationService *PushNotificationService
|
||||
logger *zap.Logger
|
||||
verifyTransactionClient EthClient
|
||||
featureFlags featureFlags
|
||||
|
@ -328,6 +329,9 @@ func NewMessenger(
|
|||
logger,
|
||||
)
|
||||
|
||||
pushNotificationPersistence := NewPushNotificationPersistence(database)
|
||||
pushNotificationService := NewPushNotificationService(pushNotificationPersistence)
|
||||
|
||||
processor, err := newMessageProcessor(
|
||||
identity,
|
||||
database,
|
||||
|
@ -335,6 +339,7 @@ func NewMessenger(
|
|||
transp,
|
||||
logger,
|
||||
c.featureFlags,
|
||||
pushNotificationService.HandleMessageSent,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to create messageProcessor")
|
||||
|
@ -350,6 +355,7 @@ func NewMessenger(
|
|||
encryptor: encryptionProtocol,
|
||||
processor: processor,
|
||||
handler: handler,
|
||||
pushNotificationService: pushNotificationService,
|
||||
featureFlags: c.featureFlags,
|
||||
systemMessagesTranslations: c.systemMessagesTranslations,
|
||||
allChats: make(map[string]*Chat),
|
||||
|
@ -1466,6 +1472,14 @@ func (m *Messenger) SendChatMessage(ctx context.Context, message *Message) (*Mes
|
|||
return nil, err
|
||||
}
|
||||
|
||||
// If the chat is not public, we instruct the pushNotificationService to send a notification
|
||||
if !chat.Public() && m.pushNotificationService != nil {
|
||||
if err := m.pushNotificationService.NotifyOnMessageID(id); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
message.ID = types.EncodeHex(id)
|
||||
err = message.PrepareContent()
|
||||
if err != nil {
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package protocol
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/ecdsa"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
|
|
|
@ -38,6 +38,14 @@ const (
|
|||
ApplicationMetadataMessage_SYNC_INSTALLATION_CONTACT ApplicationMetadataMessage_Type = 12
|
||||
ApplicationMetadataMessage_SYNC_INSTALLATION_ACCOUNT ApplicationMetadataMessage_Type = 13
|
||||
ApplicationMetadataMessage_SYNC_INSTALLATION_PUBLIC_CHAT ApplicationMetadataMessage_Type = 14
|
||||
ApplicationMetadataMessage_PUSH_NOTIFICATION_REGISTER ApplicationMetadataMessage_Type = 15
|
||||
ApplicationMetadataMessage_PUSH_NOTIFICATION_REGISTRATION_RESPONSE ApplicationMetadataMessage_Type = 16
|
||||
ApplicationMetadataMessage_CONTACT_CODE_ADVERTISEMENT ApplicationMetadataMessage_Type = 17
|
||||
ApplicationMetadataMessage_PUSH_NOTIFICATION_QUERY ApplicationMetadataMessage_Type = 18
|
||||
ApplicationMetadataMessage_PUSH_NOTIFICATION_QUERY_INFO ApplicationMetadataMessage_Type = 19
|
||||
ApplicationMetadataMessage_PUSH_NOTIFICATION_QUERY_RESPONSE ApplicationMetadataMessage_Type = 20
|
||||
ApplicationMetadataMessage_PUSH_NOTIFICATION_REQUEST ApplicationMetadataMessage_Type = 21
|
||||
ApplicationMetadataMessage_PUSH_NOTIFICATION_ACKNOWLEDGMENT ApplicationMetadataMessage_Type = 22
|
||||
)
|
||||
|
||||
var ApplicationMetadataMessage_Type_name = map[int32]string{
|
||||
|
@ -56,6 +64,14 @@ var ApplicationMetadataMessage_Type_name = map[int32]string{
|
|||
12: "SYNC_INSTALLATION_CONTACT",
|
||||
13: "SYNC_INSTALLATION_ACCOUNT",
|
||||
14: "SYNC_INSTALLATION_PUBLIC_CHAT",
|
||||
15: "PUSH_NOTIFICATION_REGISTER",
|
||||
16: "PUSH_NOTIFICATION_REGISTRATION_RESPONSE",
|
||||
17: "CONTACT_CODE_ADVERTISEMENT",
|
||||
18: "PUSH_NOTIFICATION_QUERY",
|
||||
19: "PUSH_NOTIFICATION_QUERY_INFO",
|
||||
20: "PUSH_NOTIFICATION_QUERY_RESPONSE",
|
||||
21: "PUSH_NOTIFICATION_REQUEST",
|
||||
22: "PUSH_NOTIFICATION_ACKNOWLEDGMENT",
|
||||
}
|
||||
|
||||
var ApplicationMetadataMessage_Type_value = map[string]int32{
|
||||
|
@ -74,6 +90,14 @@ var ApplicationMetadataMessage_Type_value = map[string]int32{
|
|||
"SYNC_INSTALLATION_CONTACT": 12,
|
||||
"SYNC_INSTALLATION_ACCOUNT": 13,
|
||||
"SYNC_INSTALLATION_PUBLIC_CHAT": 14,
|
||||
"PUSH_NOTIFICATION_REGISTER": 15,
|
||||
"PUSH_NOTIFICATION_REGISTRATION_RESPONSE": 16,
|
||||
"CONTACT_CODE_ADVERTISEMENT": 17,
|
||||
"PUSH_NOTIFICATION_QUERY": 18,
|
||||
"PUSH_NOTIFICATION_QUERY_INFO": 19,
|
||||
"PUSH_NOTIFICATION_QUERY_RESPONSE": 20,
|
||||
"PUSH_NOTIFICATION_REQUEST": 21,
|
||||
"PUSH_NOTIFICATION_ACKNOWLEDGMENT": 22,
|
||||
}
|
||||
|
||||
func (x ApplicationMetadataMessage_Type) String() string {
|
||||
|
@ -150,29 +174,35 @@ func init() {
|
|||
func init() { proto.RegisterFile("application_metadata_message.proto", fileDescriptor_ad09a6406fcf24c7) }
|
||||
|
||||
var fileDescriptor_ad09a6406fcf24c7 = []byte{
|
||||
// 377 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xcf, 0x8e, 0xd3, 0x30,
|
||||
0x10, 0xc6, 0xc9, 0x36, 0x6c, 0x77, 0x67, 0x4b, 0x65, 0x06, 0x10, 0xe1, 0xcf, 0x6a, 0x97, 0x22,
|
||||
0xc1, 0x02, 0x52, 0x0e, 0x70, 0xe6, 0xe0, 0x75, 0x0c, 0x1b, 0x91, 0x38, 0xc1, 0x76, 0x84, 0x38,
|
||||
0x59, 0x2e, 0x0d, 0x55, 0xa5, 0xb6, 0x89, 0xda, 0xf4, 0xd0, 0x07, 0xe3, 0x29, 0x78, 0x29, 0x94,
|
||||
0xd0, 0xd2, 0x96, 0x82, 0x7a, 0xb2, 0xe6, 0xfb, 0x7e, 0x9f, 0x47, 0x33, 0x03, 0x3d, 0x5b, 0x96,
|
||||
0xe3, 0xd1, 0x37, 0x5b, 0x8d, 0x8a, 0xa9, 0x99, 0xe4, 0x95, 0x1d, 0xd8, 0xca, 0x9a, 0x49, 0x3e,
|
||||
0x9f, 0xdb, 0x61, 0xee, 0x97, 0xb3, 0xa2, 0x2a, 0xf0, 0xa4, 0x79, 0xfa, 0x8b, 0xef, 0xbd, 0x9f,
|
||||
0x2e, 0x3c, 0xa6, 0x9b, 0x40, 0xbc, 0xe2, 0xe3, 0xdf, 0x38, 0x3e, 0x85, 0xd3, 0xf9, 0x68, 0x38,
|
||||
0xb5, 0xd5, 0x62, 0x96, 0x7b, 0xce, 0xa5, 0x73, 0xd5, 0x91, 0x1b, 0x01, 0x3d, 0x68, 0x97, 0x76,
|
||||
0x39, 0x2e, 0xec, 0xc0, 0x3b, 0x6a, 0xbc, 0x75, 0x89, 0xef, 0xc1, 0xad, 0x96, 0x65, 0xee, 0xb5,
|
||||
0x2e, 0x9d, 0xab, 0xee, 0xdb, 0x57, 0xfe, 0xba, 0x9f, 0xff, 0xff, 0x5e, 0xbe, 0x5e, 0x96, 0xb9,
|
||||
0x6c, 0x62, 0xbd, 0x1f, 0x2d, 0x70, 0xeb, 0x12, 0xcf, 0xa0, 0x9d, 0x89, 0x4f, 0x22, 0xf9, 0x22,
|
||||
0xc8, 0x2d, 0x24, 0xd0, 0x61, 0x37, 0x54, 0x9b, 0x98, 0x2b, 0x45, 0x3f, 0x72, 0xe2, 0x20, 0x42,
|
||||
0x97, 0x25, 0x42, 0x53, 0xa6, 0x4d, 0x96, 0x06, 0x54, 0x73, 0x72, 0x84, 0xe7, 0xf0, 0x28, 0xe6,
|
||||
0xf1, 0x35, 0x97, 0xea, 0x26, 0x4c, 0x57, 0xf2, 0x9f, 0x48, 0x0b, 0x1f, 0xc0, 0xdd, 0x94, 0x86,
|
||||
0xd2, 0x84, 0x42, 0x69, 0x1a, 0x45, 0x54, 0x87, 0x89, 0x20, 0x6e, 0x2d, 0xab, 0xaf, 0x82, 0xed,
|
||||
0xca, 0xb7, 0xf1, 0x39, 0x5c, 0x48, 0xfe, 0x39, 0xe3, 0x4a, 0x1b, 0x1a, 0x04, 0x92, 0x2b, 0x65,
|
||||
0x3e, 0x24, 0xd2, 0x68, 0x49, 0x85, 0xa2, 0xac, 0x81, 0x8e, 0xf1, 0x35, 0xbc, 0xa0, 0x8c, 0xf1,
|
||||
0x54, 0x9b, 0x43, 0x6c, 0x1b, 0xdf, 0xc0, 0xcb, 0x80, 0xb3, 0x28, 0x14, 0xfc, 0x20, 0x7c, 0x82,
|
||||
0x0f, 0xe1, 0xde, 0x1a, 0xda, 0x36, 0x4e, 0xf1, 0x3e, 0x10, 0xc5, 0x45, 0xb0, 0xa3, 0x02, 0x5e,
|
||||
0xc0, 0x93, 0xbf, 0xff, 0xde, 0x06, 0xce, 0xea, 0xd5, 0xec, 0x0d, 0x69, 0x56, 0x0b, 0x24, 0x9d,
|
||||
0x7f, 0xdb, 0x94, 0xb1, 0x24, 0x13, 0x9a, 0xdc, 0xc1, 0x67, 0x70, 0xbe, 0x6f, 0xa7, 0xd9, 0x75,
|
||||
0x14, 0x32, 0x53, 0xdf, 0x85, 0x74, 0xfb, 0xc7, 0xcd, 0x9d, 0xdf, 0xfd, 0x0a, 0x00, 0x00, 0xff,
|
||||
0xff, 0xb7, 0x6c, 0xd6, 0xba, 0x84, 0x02, 0x00, 0x00,
|
||||
// 479 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0xcd, 0x52, 0x13, 0x41,
|
||||
0x10, 0xc7, 0x0d, 0x1f, 0x09, 0x34, 0x31, 0x0e, 0x0d, 0x48, 0xe4, 0x43, 0x62, 0xb4, 0x14, 0xb5,
|
||||
0x2a, 0x07, 0x3d, 0x7b, 0x18, 0x66, 0x3b, 0xc9, 0x94, 0xd9, 0xd9, 0x65, 0x66, 0x56, 0x8b, 0xd3,
|
||||
0xd4, 0x22, 0x2b, 0x95, 0x2a, 0x20, 0x5b, 0x64, 0x39, 0xe4, 0x1d, 0x7d, 0x0a, 0x9f, 0xc4, 0xda,
|
||||
0x25, 0xe1, 0xc3, 0x24, 0xc5, 0x69, 0xaa, 0xff, 0xff, 0x5f, 0xf7, 0xf4, 0xf4, 0x34, 0x34, 0xe3,
|
||||
0x34, 0xbd, 0xe8, 0xff, 0x8a, 0xb3, 0xfe, 0xe0, 0xca, 0x5d, 0x26, 0x59, 0x7c, 0x16, 0x67, 0xb1,
|
||||
0xbb, 0x4c, 0x86, 0xc3, 0xf8, 0x3c, 0x69, 0xa5, 0xd7, 0x83, 0x6c, 0x80, 0x2b, 0xc5, 0x71, 0x7a,
|
||||
0xf3, 0xbb, 0xf9, 0xb7, 0x0c, 0x3b, 0xfc, 0x3e, 0xc1, 0x1f, 0xf3, 0xfe, 0x2d, 0x8e, 0x7b, 0xb0,
|
||||
0x3a, 0xec, 0x9f, 0x5f, 0xc5, 0xd9, 0xcd, 0x75, 0x52, 0x2f, 0x35, 0x4a, 0x87, 0x55, 0x7d, 0x2f,
|
||||
0x60, 0x1d, 0x2a, 0x69, 0x3c, 0xba, 0x18, 0xc4, 0x67, 0xf5, 0x85, 0xc2, 0x9b, 0x84, 0xf8, 0x0d,
|
||||
0x96, 0xb2, 0x51, 0x9a, 0xd4, 0x17, 0x1b, 0xa5, 0xc3, 0xda, 0x97, 0x8f, 0xad, 0xc9, 0x7d, 0xad,
|
||||
0xf9, 0x77, 0xb5, 0xec, 0x28, 0x4d, 0x74, 0x91, 0xd6, 0xfc, 0xb3, 0x0c, 0x4b, 0x79, 0x88, 0x6b,
|
||||
0x50, 0x89, 0xd4, 0x77, 0x15, 0xfc, 0x54, 0xec, 0x19, 0x32, 0xa8, 0x8a, 0x2e, 0xb7, 0xce, 0x27,
|
||||
0x63, 0x78, 0x87, 0x58, 0x09, 0x11, 0x6a, 0x22, 0x50, 0x96, 0x0b, 0xeb, 0xa2, 0xd0, 0xe3, 0x96,
|
||||
0xd8, 0x02, 0xee, 0xc3, 0x2b, 0x9f, 0xfc, 0x23, 0xd2, 0xa6, 0x2b, 0xc3, 0xb1, 0x7c, 0x97, 0xb2,
|
||||
0x88, 0x5b, 0xb0, 0x1e, 0x72, 0xa9, 0x9d, 0x54, 0xc6, 0xf2, 0x5e, 0x8f, 0x5b, 0x19, 0x28, 0xb6,
|
||||
0x94, 0xcb, 0xe6, 0x44, 0x89, 0xc7, 0xf2, 0x32, 0xbe, 0x85, 0x03, 0x4d, 0xc7, 0x11, 0x19, 0xeb,
|
||||
0xb8, 0xe7, 0x69, 0x32, 0xc6, 0xb5, 0x03, 0xed, 0xac, 0xe6, 0xca, 0x70, 0x51, 0x40, 0x65, 0xfc,
|
||||
0x04, 0xef, 0xb9, 0x10, 0x14, 0x5a, 0xf7, 0x14, 0x5b, 0xc1, 0xcf, 0xf0, 0xc1, 0x23, 0xd1, 0x93,
|
||||
0x8a, 0x9e, 0x84, 0x57, 0x70, 0x1b, 0x36, 0x26, 0xd0, 0x43, 0x63, 0x15, 0x37, 0x81, 0x19, 0x52,
|
||||
0xde, 0x23, 0x15, 0xf0, 0x00, 0x76, 0xff, 0xaf, 0xfd, 0x10, 0x58, 0xcb, 0x47, 0x33, 0xf5, 0x48,
|
||||
0x37, 0x1e, 0x20, 0xab, 0xce, 0xb6, 0xb9, 0x10, 0x41, 0xa4, 0x2c, 0x7b, 0x8e, 0x6f, 0x60, 0x7f,
|
||||
0xda, 0x0e, 0xa3, 0xa3, 0x9e, 0x14, 0x2e, 0xff, 0x17, 0x56, 0xc3, 0xd7, 0xb0, 0x13, 0x46, 0xa6,
|
||||
0xeb, 0x54, 0x60, 0x65, 0x5b, 0x8a, 0x5b, 0x44, 0x53, 0x47, 0x1a, 0x4b, 0x9a, 0xbd, 0xc8, 0x5f,
|
||||
0x3f, 0xcf, 0xd7, 0x93, 0xc0, 0x84, 0x81, 0x32, 0xc4, 0x58, 0x5e, 0x6c, 0xf2, 0xb9, 0x22, 0xf0,
|
||||
0xc8, 0x71, 0xef, 0x07, 0x69, 0x2b, 0x0d, 0xf9, 0xa4, 0x2c, 0x5b, 0xc7, 0x5d, 0xd8, 0x9e, 0x2e,
|
||||
0x76, 0x1c, 0x91, 0x3e, 0x61, 0x88, 0x0d, 0xd8, 0x9b, 0x63, 0x3a, 0xa9, 0xda, 0x01, 0xdb, 0xc0,
|
||||
0x77, 0xd0, 0x98, 0x47, 0xdc, 0x35, 0xb1, 0x99, 0xcf, 0x64, 0x56, 0xc7, 0xc5, 0x74, 0xd9, 0xd6,
|
||||
0xec, 0x22, 0x5c, 0xe4, 0x1b, 0xdb, 0x23, 0xaf, 0x53, 0x74, 0xfa, 0xf2, 0xb4, 0x5c, 0xac, 0xff,
|
||||
0xd7, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x68, 0x53, 0x0e, 0x30, 0x9b, 0x03, 0x00, 0x00,
|
||||
}
|
||||
|
|
|
@ -27,5 +27,13 @@ message ApplicationMetadataMessage {
|
|||
SYNC_INSTALLATION_CONTACT = 12;
|
||||
SYNC_INSTALLATION_ACCOUNT = 13;
|
||||
SYNC_INSTALLATION_PUBLIC_CHAT = 14;
|
||||
PUSH_NOTIFICATION_REGISTER = 15;
|
||||
PUSH_NOTIFICATION_REGISTRATION_RESPONSE = 16;
|
||||
CONTACT_CODE_ADVERTISEMENT = 17;
|
||||
PUSH_NOTIFICATION_QUERY = 18;
|
||||
PUSH_NOTIFICATION_QUERY_INFO = 19;
|
||||
PUSH_NOTIFICATION_QUERY_RESPONSE = 20;
|
||||
PUSH_NOTIFICATION_REQUEST = 21;
|
||||
PUSH_NOTIFICATION_ACKNOWLEDGMENT = 22;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,845 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// source: push_notifications.proto
|
||||
|
||||
package protobuf
|
||||
|
||||
import (
|
||||
fmt "fmt"
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
math "math"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ = proto.Marshal
|
||||
var _ = fmt.Errorf
|
||||
var _ = math.Inf
|
||||
|
||||
// This is a compile-time assertion to ensure that this generated file
|
||||
// is compatible with the proto package it is being compiled against.
|
||||
// A compilation error at this line likely means your copy of the
|
||||
// proto package needs to be updated.
|
||||
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
|
||||
|
||||
type PushNotificationOptions_TokenType int32
|
||||
|
||||
const (
|
||||
PushNotificationOptions_UNKNOWN_TOKEN_TYPE PushNotificationOptions_TokenType = 0
|
||||
PushNotificationOptions_APN_TOKEN PushNotificationOptions_TokenType = 1
|
||||
PushNotificationOptions_FIREBASE_TOKEN PushNotificationOptions_TokenType = 2
|
||||
)
|
||||
|
||||
var PushNotificationOptions_TokenType_name = map[int32]string{
|
||||
0: "UNKNOWN_TOKEN_TYPE",
|
||||
1: "APN_TOKEN",
|
||||
2: "FIREBASE_TOKEN",
|
||||
}
|
||||
|
||||
var PushNotificationOptions_TokenType_value = map[string]int32{
|
||||
"UNKNOWN_TOKEN_TYPE": 0,
|
||||
"APN_TOKEN": 1,
|
||||
"FIREBASE_TOKEN": 2,
|
||||
}
|
||||
|
||||
func (x PushNotificationOptions_TokenType) String() string {
|
||||
return proto.EnumName(PushNotificationOptions_TokenType_name, int32(x))
|
||||
}
|
||||
|
||||
func (PushNotificationOptions_TokenType) EnumDescriptor() ([]byte, []int) {
|
||||
return fileDescriptor_200acd86044eaa5d, []int{1, 0}
|
||||
}
|
||||
|
||||
type PushNotificationRegistrationResponse_ErrorType int32
|
||||
|
||||
const (
|
||||
PushNotificationRegistrationResponse_UNKNOWN_ERROR_TYPE PushNotificationRegistrationResponse_ErrorType = 0
|
||||
PushNotificationRegistrationResponse_MALFORMED_MESSAGE PushNotificationRegistrationResponse_ErrorType = 1
|
||||
PushNotificationRegistrationResponse_VERSION_MISMATCH PushNotificationRegistrationResponse_ErrorType = 2
|
||||
PushNotificationRegistrationResponse_UNSUPPORTED_TOKEN_TYPE PushNotificationRegistrationResponse_ErrorType = 3
|
||||
PushNotificationRegistrationResponse_INTERNAL_ERROR PushNotificationRegistrationResponse_ErrorType = 4
|
||||
)
|
||||
|
||||
var PushNotificationRegistrationResponse_ErrorType_name = map[int32]string{
|
||||
0: "UNKNOWN_ERROR_TYPE",
|
||||
1: "MALFORMED_MESSAGE",
|
||||
2: "VERSION_MISMATCH",
|
||||
3: "UNSUPPORTED_TOKEN_TYPE",
|
||||
4: "INTERNAL_ERROR",
|
||||
}
|
||||
|
||||
var PushNotificationRegistrationResponse_ErrorType_value = map[string]int32{
|
||||
"UNKNOWN_ERROR_TYPE": 0,
|
||||
"MALFORMED_MESSAGE": 1,
|
||||
"VERSION_MISMATCH": 2,
|
||||
"UNSUPPORTED_TOKEN_TYPE": 3,
|
||||
"INTERNAL_ERROR": 4,
|
||||
}
|
||||
|
||||
func (x PushNotificationRegistrationResponse_ErrorType) String() string {
|
||||
return proto.EnumName(PushNotificationRegistrationResponse_ErrorType_name, int32(x))
|
||||
}
|
||||
|
||||
func (PushNotificationRegistrationResponse_ErrorType) EnumDescriptor() ([]byte, []int) {
|
||||
return fileDescriptor_200acd86044eaa5d, []int{4, 0}
|
||||
}
|
||||
|
||||
type PushNotificationTokenPair struct {
|
||||
Token []byte `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"`
|
||||
PublicKey []byte `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *PushNotificationTokenPair) Reset() { *m = PushNotificationTokenPair{} }
|
||||
func (m *PushNotificationTokenPair) String() string { return proto.CompactTextString(m) }
|
||||
func (*PushNotificationTokenPair) ProtoMessage() {}
|
||||
func (*PushNotificationTokenPair) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_200acd86044eaa5d, []int{0}
|
||||
}
|
||||
|
||||
func (m *PushNotificationTokenPair) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_PushNotificationTokenPair.Unmarshal(m, b)
|
||||
}
|
||||
func (m *PushNotificationTokenPair) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_PushNotificationTokenPair.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *PushNotificationTokenPair) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_PushNotificationTokenPair.Merge(m, src)
|
||||
}
|
||||
func (m *PushNotificationTokenPair) XXX_Size() int {
|
||||
return xxx_messageInfo_PushNotificationTokenPair.Size(m)
|
||||
}
|
||||
func (m *PushNotificationTokenPair) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_PushNotificationTokenPair.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_PushNotificationTokenPair proto.InternalMessageInfo
|
||||
|
||||
func (m *PushNotificationTokenPair) GetToken() []byte {
|
||||
if m != nil {
|
||||
return m.Token
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *PushNotificationTokenPair) GetPublicKey() []byte {
|
||||
if m != nil {
|
||||
return m.PublicKey
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type PushNotificationOptions struct {
|
||||
TokenType PushNotificationOptions_TokenType `protobuf:"varint,1,opt,name=token_type,json=tokenType,proto3,enum=protobuf.PushNotificationOptions_TokenType" json:"token_type,omitempty"`
|
||||
Token string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"`
|
||||
InstallationId string `protobuf:"bytes,3,opt,name=installation_id,json=installationId,proto3" json:"installation_id,omitempty"`
|
||||
Enabled bool `protobuf:"varint,4,opt,name=enabled,proto3" json:"enabled,omitempty"`
|
||||
AllowedUserList []*PushNotificationTokenPair `protobuf:"bytes,5,rep,name=allowed_user_list,json=allowedUserList,proto3" json:"allowed_user_list,omitempty"`
|
||||
BlockedChatList [][]byte `protobuf:"bytes,6,rep,name=blocked_chat_list,json=blockedChatList,proto3" json:"blocked_chat_list,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *PushNotificationOptions) Reset() { *m = PushNotificationOptions{} }
|
||||
func (m *PushNotificationOptions) String() string { return proto.CompactTextString(m) }
|
||||
func (*PushNotificationOptions) ProtoMessage() {}
|
||||
func (*PushNotificationOptions) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_200acd86044eaa5d, []int{1}
|
||||
}
|
||||
|
||||
func (m *PushNotificationOptions) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_PushNotificationOptions.Unmarshal(m, b)
|
||||
}
|
||||
func (m *PushNotificationOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_PushNotificationOptions.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *PushNotificationOptions) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_PushNotificationOptions.Merge(m, src)
|
||||
}
|
||||
func (m *PushNotificationOptions) XXX_Size() int {
|
||||
return xxx_messageInfo_PushNotificationOptions.Size(m)
|
||||
}
|
||||
func (m *PushNotificationOptions) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_PushNotificationOptions.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_PushNotificationOptions proto.InternalMessageInfo
|
||||
|
||||
func (m *PushNotificationOptions) GetTokenType() PushNotificationOptions_TokenType {
|
||||
if m != nil {
|
||||
return m.TokenType
|
||||
}
|
||||
return PushNotificationOptions_UNKNOWN_TOKEN_TYPE
|
||||
}
|
||||
|
||||
func (m *PushNotificationOptions) GetToken() string {
|
||||
if m != nil {
|
||||
return m.Token
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *PushNotificationOptions) GetInstallationId() string {
|
||||
if m != nil {
|
||||
return m.InstallationId
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *PushNotificationOptions) GetEnabled() bool {
|
||||
if m != nil {
|
||||
return m.Enabled
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *PushNotificationOptions) GetAllowedUserList() []*PushNotificationTokenPair {
|
||||
if m != nil {
|
||||
return m.AllowedUserList
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *PushNotificationOptions) GetBlockedChatList() [][]byte {
|
||||
if m != nil {
|
||||
return m.BlockedChatList
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type PushNotificationPreferences struct {
|
||||
Options []*PushNotificationOptions `protobuf:"bytes,1,rep,name=options,proto3" json:"options,omitempty"`
|
||||
Version uint64 `protobuf:"varint,2,opt,name=version,proto3" json:"version,omitempty"`
|
||||
Unregister bool `protobuf:"varint,3,opt,name=unregister,proto3" json:"unregister,omitempty"`
|
||||
AccessToken string `protobuf:"bytes,4,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *PushNotificationPreferences) Reset() { *m = PushNotificationPreferences{} }
|
||||
func (m *PushNotificationPreferences) String() string { return proto.CompactTextString(m) }
|
||||
func (*PushNotificationPreferences) ProtoMessage() {}
|
||||
func (*PushNotificationPreferences) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_200acd86044eaa5d, []int{2}
|
||||
}
|
||||
|
||||
func (m *PushNotificationPreferences) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_PushNotificationPreferences.Unmarshal(m, b)
|
||||
}
|
||||
func (m *PushNotificationPreferences) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_PushNotificationPreferences.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *PushNotificationPreferences) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_PushNotificationPreferences.Merge(m, src)
|
||||
}
|
||||
func (m *PushNotificationPreferences) XXX_Size() int {
|
||||
return xxx_messageInfo_PushNotificationPreferences.Size(m)
|
||||
}
|
||||
func (m *PushNotificationPreferences) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_PushNotificationPreferences.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_PushNotificationPreferences proto.InternalMessageInfo
|
||||
|
||||
func (m *PushNotificationPreferences) GetOptions() []*PushNotificationOptions {
|
||||
if m != nil {
|
||||
return m.Options
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *PushNotificationPreferences) GetVersion() uint64 {
|
||||
if m != nil {
|
||||
return m.Version
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (m *PushNotificationPreferences) GetUnregister() bool {
|
||||
if m != nil {
|
||||
return m.Unregister
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *PushNotificationPreferences) GetAccessToken() string {
|
||||
if m != nil {
|
||||
return m.AccessToken
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type PushNotificationRegister struct {
|
||||
Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"`
|
||||
Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *PushNotificationRegister) Reset() { *m = PushNotificationRegister{} }
|
||||
func (m *PushNotificationRegister) String() string { return proto.CompactTextString(m) }
|
||||
func (*PushNotificationRegister) ProtoMessage() {}
|
||||
func (*PushNotificationRegister) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_200acd86044eaa5d, []int{3}
|
||||
}
|
||||
|
||||
func (m *PushNotificationRegister) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_PushNotificationRegister.Unmarshal(m, b)
|
||||
}
|
||||
func (m *PushNotificationRegister) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_PushNotificationRegister.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *PushNotificationRegister) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_PushNotificationRegister.Merge(m, src)
|
||||
}
|
||||
func (m *PushNotificationRegister) XXX_Size() int {
|
||||
return xxx_messageInfo_PushNotificationRegister.Size(m)
|
||||
}
|
||||
func (m *PushNotificationRegister) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_PushNotificationRegister.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_PushNotificationRegister proto.InternalMessageInfo
|
||||
|
||||
func (m *PushNotificationRegister) GetPayload() []byte {
|
||||
if m != nil {
|
||||
return m.Payload
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *PushNotificationRegister) GetSignature() []byte {
|
||||
if m != nil {
|
||||
return m.Signature
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type PushNotificationRegistrationResponse struct {
|
||||
Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"`
|
||||
Error PushNotificationRegistrationResponse_ErrorType `protobuf:"varint,2,opt,name=error,proto3,enum=protobuf.PushNotificationRegistrationResponse_ErrorType" json:"error,omitempty"`
|
||||
RequestId []byte `protobuf:"bytes,3,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"`
|
||||
Preferences *PushNotificationPreferences `protobuf:"bytes,4,opt,name=preferences,proto3" json:"preferences,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *PushNotificationRegistrationResponse) Reset() { *m = PushNotificationRegistrationResponse{} }
|
||||
func (m *PushNotificationRegistrationResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*PushNotificationRegistrationResponse) ProtoMessage() {}
|
||||
func (*PushNotificationRegistrationResponse) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_200acd86044eaa5d, []int{4}
|
||||
}
|
||||
|
||||
func (m *PushNotificationRegistrationResponse) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_PushNotificationRegistrationResponse.Unmarshal(m, b)
|
||||
}
|
||||
func (m *PushNotificationRegistrationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_PushNotificationRegistrationResponse.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *PushNotificationRegistrationResponse) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_PushNotificationRegistrationResponse.Merge(m, src)
|
||||
}
|
||||
func (m *PushNotificationRegistrationResponse) XXX_Size() int {
|
||||
return xxx_messageInfo_PushNotificationRegistrationResponse.Size(m)
|
||||
}
|
||||
func (m *PushNotificationRegistrationResponse) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_PushNotificationRegistrationResponse.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_PushNotificationRegistrationResponse proto.InternalMessageInfo
|
||||
|
||||
func (m *PushNotificationRegistrationResponse) GetSuccess() bool {
|
||||
if m != nil {
|
||||
return m.Success
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *PushNotificationRegistrationResponse) GetError() PushNotificationRegistrationResponse_ErrorType {
|
||||
if m != nil {
|
||||
return m.Error
|
||||
}
|
||||
return PushNotificationRegistrationResponse_UNKNOWN_ERROR_TYPE
|
||||
}
|
||||
|
||||
func (m *PushNotificationRegistrationResponse) GetRequestId() []byte {
|
||||
if m != nil {
|
||||
return m.RequestId
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *PushNotificationRegistrationResponse) GetPreferences() *PushNotificationPreferences {
|
||||
if m != nil {
|
||||
return m.Preferences
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type PushNotificationAdvertisementInfo struct {
|
||||
PublicKey []byte `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"`
|
||||
AccessToken string `protobuf:"bytes,2,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"`
|
||||
InstallationId string `protobuf:"bytes,3,opt,name=installation_id,json=installationId,proto3" json:"installation_id,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *PushNotificationAdvertisementInfo) Reset() { *m = PushNotificationAdvertisementInfo{} }
|
||||
func (m *PushNotificationAdvertisementInfo) String() string { return proto.CompactTextString(m) }
|
||||
func (*PushNotificationAdvertisementInfo) ProtoMessage() {}
|
||||
func (*PushNotificationAdvertisementInfo) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_200acd86044eaa5d, []int{5}
|
||||
}
|
||||
|
||||
func (m *PushNotificationAdvertisementInfo) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_PushNotificationAdvertisementInfo.Unmarshal(m, b)
|
||||
}
|
||||
func (m *PushNotificationAdvertisementInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_PushNotificationAdvertisementInfo.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *PushNotificationAdvertisementInfo) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_PushNotificationAdvertisementInfo.Merge(m, src)
|
||||
}
|
||||
func (m *PushNotificationAdvertisementInfo) XXX_Size() int {
|
||||
return xxx_messageInfo_PushNotificationAdvertisementInfo.Size(m)
|
||||
}
|
||||
func (m *PushNotificationAdvertisementInfo) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_PushNotificationAdvertisementInfo.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_PushNotificationAdvertisementInfo proto.InternalMessageInfo
|
||||
|
||||
func (m *PushNotificationAdvertisementInfo) GetPublicKey() []byte {
|
||||
if m != nil {
|
||||
return m.PublicKey
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *PushNotificationAdvertisementInfo) GetAccessToken() string {
|
||||
if m != nil {
|
||||
return m.AccessToken
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *PushNotificationAdvertisementInfo) GetInstallationId() string {
|
||||
if m != nil {
|
||||
return m.InstallationId
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type ContactCodeAdvertisement struct {
|
||||
PushNotificationInfo []*PushNotificationAdvertisementInfo `protobuf:"bytes,1,rep,name=push_notification_info,json=pushNotificationInfo,proto3" json:"push_notification_info,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *ContactCodeAdvertisement) Reset() { *m = ContactCodeAdvertisement{} }
|
||||
func (m *ContactCodeAdvertisement) String() string { return proto.CompactTextString(m) }
|
||||
func (*ContactCodeAdvertisement) ProtoMessage() {}
|
||||
func (*ContactCodeAdvertisement) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_200acd86044eaa5d, []int{6}
|
||||
}
|
||||
|
||||
func (m *ContactCodeAdvertisement) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_ContactCodeAdvertisement.Unmarshal(m, b)
|
||||
}
|
||||
func (m *ContactCodeAdvertisement) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_ContactCodeAdvertisement.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *ContactCodeAdvertisement) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_ContactCodeAdvertisement.Merge(m, src)
|
||||
}
|
||||
func (m *ContactCodeAdvertisement) XXX_Size() int {
|
||||
return xxx_messageInfo_ContactCodeAdvertisement.Size(m)
|
||||
}
|
||||
func (m *ContactCodeAdvertisement) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_ContactCodeAdvertisement.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_ContactCodeAdvertisement proto.InternalMessageInfo
|
||||
|
||||
func (m *ContactCodeAdvertisement) GetPushNotificationInfo() []*PushNotificationAdvertisementInfo {
|
||||
if m != nil {
|
||||
return m.PushNotificationInfo
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type PushNotificationQuery struct {
|
||||
PublicKeys [][]byte `protobuf:"bytes,1,rep,name=public_keys,json=publicKeys,proto3" json:"public_keys,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *PushNotificationQuery) Reset() { *m = PushNotificationQuery{} }
|
||||
func (m *PushNotificationQuery) String() string { return proto.CompactTextString(m) }
|
||||
func (*PushNotificationQuery) ProtoMessage() {}
|
||||
func (*PushNotificationQuery) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_200acd86044eaa5d, []int{7}
|
||||
}
|
||||
|
||||
func (m *PushNotificationQuery) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_PushNotificationQuery.Unmarshal(m, b)
|
||||
}
|
||||
func (m *PushNotificationQuery) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_PushNotificationQuery.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *PushNotificationQuery) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_PushNotificationQuery.Merge(m, src)
|
||||
}
|
||||
func (m *PushNotificationQuery) XXX_Size() int {
|
||||
return xxx_messageInfo_PushNotificationQuery.Size(m)
|
||||
}
|
||||
func (m *PushNotificationQuery) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_PushNotificationQuery.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_PushNotificationQuery proto.InternalMessageInfo
|
||||
|
||||
func (m *PushNotificationQuery) GetPublicKeys() [][]byte {
|
||||
if m != nil {
|
||||
return m.PublicKeys
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type PushNotificationQueryInfo struct {
|
||||
AccessToken string `protobuf:"bytes,1,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"`
|
||||
InstallationId string `protobuf:"bytes,2,opt,name=installation_id,json=installationId,proto3" json:"installation_id,omitempty"`
|
||||
PublicKey []byte `protobuf:"bytes,3,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"`
|
||||
AllowedUserList []byte `protobuf:"bytes,4,opt,name=allowed_user_list,json=allowedUserList,proto3" json:"allowed_user_list,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *PushNotificationQueryInfo) Reset() { *m = PushNotificationQueryInfo{} }
|
||||
func (m *PushNotificationQueryInfo) String() string { return proto.CompactTextString(m) }
|
||||
func (*PushNotificationQueryInfo) ProtoMessage() {}
|
||||
func (*PushNotificationQueryInfo) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_200acd86044eaa5d, []int{8}
|
||||
}
|
||||
|
||||
func (m *PushNotificationQueryInfo) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_PushNotificationQueryInfo.Unmarshal(m, b)
|
||||
}
|
||||
func (m *PushNotificationQueryInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_PushNotificationQueryInfo.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *PushNotificationQueryInfo) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_PushNotificationQueryInfo.Merge(m, src)
|
||||
}
|
||||
func (m *PushNotificationQueryInfo) XXX_Size() int {
|
||||
return xxx_messageInfo_PushNotificationQueryInfo.Size(m)
|
||||
}
|
||||
func (m *PushNotificationQueryInfo) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_PushNotificationQueryInfo.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_PushNotificationQueryInfo proto.InternalMessageInfo
|
||||
|
||||
func (m *PushNotificationQueryInfo) GetAccessToken() string {
|
||||
if m != nil {
|
||||
return m.AccessToken
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *PushNotificationQueryInfo) GetInstallationId() string {
|
||||
if m != nil {
|
||||
return m.InstallationId
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *PushNotificationQueryInfo) GetPublicKey() []byte {
|
||||
if m != nil {
|
||||
return m.PublicKey
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *PushNotificationQueryInfo) GetAllowedUserList() []byte {
|
||||
if m != nil {
|
||||
return m.AllowedUserList
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type PushNotificationQueryResponse struct {
|
||||
Info []*PushNotificationQueryInfo `protobuf:"bytes,1,rep,name=info,proto3" json:"info,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *PushNotificationQueryResponse) Reset() { *m = PushNotificationQueryResponse{} }
|
||||
func (m *PushNotificationQueryResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*PushNotificationQueryResponse) ProtoMessage() {}
|
||||
func (*PushNotificationQueryResponse) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_200acd86044eaa5d, []int{9}
|
||||
}
|
||||
|
||||
func (m *PushNotificationQueryResponse) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_PushNotificationQueryResponse.Unmarshal(m, b)
|
||||
}
|
||||
func (m *PushNotificationQueryResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_PushNotificationQueryResponse.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *PushNotificationQueryResponse) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_PushNotificationQueryResponse.Merge(m, src)
|
||||
}
|
||||
func (m *PushNotificationQueryResponse) XXX_Size() int {
|
||||
return xxx_messageInfo_PushNotificationQueryResponse.Size(m)
|
||||
}
|
||||
func (m *PushNotificationQueryResponse) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_PushNotificationQueryResponse.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_PushNotificationQueryResponse proto.InternalMessageInfo
|
||||
|
||||
func (m *PushNotificationQueryResponse) GetInfo() []*PushNotificationQueryInfo {
|
||||
if m != nil {
|
||||
return m.Info
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type PushNotification struct {
|
||||
AccessToken string `protobuf:"bytes,1,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"`
|
||||
ChatId string `protobuf:"bytes,2,opt,name=chat_id,json=chatId,proto3" json:"chat_id,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *PushNotification) Reset() { *m = PushNotification{} }
|
||||
func (m *PushNotification) String() string { return proto.CompactTextString(m) }
|
||||
func (*PushNotification) ProtoMessage() {}
|
||||
func (*PushNotification) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_200acd86044eaa5d, []int{10}
|
||||
}
|
||||
|
||||
func (m *PushNotification) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_PushNotification.Unmarshal(m, b)
|
||||
}
|
||||
func (m *PushNotification) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_PushNotification.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *PushNotification) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_PushNotification.Merge(m, src)
|
||||
}
|
||||
func (m *PushNotification) XXX_Size() int {
|
||||
return xxx_messageInfo_PushNotification.Size(m)
|
||||
}
|
||||
func (m *PushNotification) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_PushNotification.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_PushNotification proto.InternalMessageInfo
|
||||
|
||||
func (m *PushNotification) GetAccessToken() string {
|
||||
if m != nil {
|
||||
return m.AccessToken
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *PushNotification) GetChatId() string {
|
||||
if m != nil {
|
||||
return m.ChatId
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type PushNotificationRequest struct {
|
||||
Requests []*PushNotification `protobuf:"bytes,1,rep,name=requests,proto3" json:"requests,omitempty"`
|
||||
Message []byte `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"`
|
||||
MessageId string `protobuf:"bytes,3,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"`
|
||||
AckRequired string `protobuf:"bytes,4,opt,name=ack_required,json=ackRequired,proto3" json:"ack_required,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *PushNotificationRequest) Reset() { *m = PushNotificationRequest{} }
|
||||
func (m *PushNotificationRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*PushNotificationRequest) ProtoMessage() {}
|
||||
func (*PushNotificationRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_200acd86044eaa5d, []int{11}
|
||||
}
|
||||
|
||||
func (m *PushNotificationRequest) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_PushNotificationRequest.Unmarshal(m, b)
|
||||
}
|
||||
func (m *PushNotificationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_PushNotificationRequest.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *PushNotificationRequest) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_PushNotificationRequest.Merge(m, src)
|
||||
}
|
||||
func (m *PushNotificationRequest) XXX_Size() int {
|
||||
return xxx_messageInfo_PushNotificationRequest.Size(m)
|
||||
}
|
||||
func (m *PushNotificationRequest) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_PushNotificationRequest.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_PushNotificationRequest proto.InternalMessageInfo
|
||||
|
||||
func (m *PushNotificationRequest) GetRequests() []*PushNotification {
|
||||
if m != nil {
|
||||
return m.Requests
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *PushNotificationRequest) GetMessage() []byte {
|
||||
if m != nil {
|
||||
return m.Message
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *PushNotificationRequest) GetMessageId() string {
|
||||
if m != nil {
|
||||
return m.MessageId
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *PushNotificationRequest) GetAckRequired() string {
|
||||
if m != nil {
|
||||
return m.AckRequired
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type PushNotificationAcknowledgement struct {
|
||||
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *PushNotificationAcknowledgement) Reset() { *m = PushNotificationAcknowledgement{} }
|
||||
func (m *PushNotificationAcknowledgement) String() string { return proto.CompactTextString(m) }
|
||||
func (*PushNotificationAcknowledgement) ProtoMessage() {}
|
||||
func (*PushNotificationAcknowledgement) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_200acd86044eaa5d, []int{12}
|
||||
}
|
||||
|
||||
func (m *PushNotificationAcknowledgement) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_PushNotificationAcknowledgement.Unmarshal(m, b)
|
||||
}
|
||||
func (m *PushNotificationAcknowledgement) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_PushNotificationAcknowledgement.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *PushNotificationAcknowledgement) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_PushNotificationAcknowledgement.Merge(m, src)
|
||||
}
|
||||
func (m *PushNotificationAcknowledgement) XXX_Size() int {
|
||||
return xxx_messageInfo_PushNotificationAcknowledgement.Size(m)
|
||||
}
|
||||
func (m *PushNotificationAcknowledgement) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_PushNotificationAcknowledgement.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_PushNotificationAcknowledgement proto.InternalMessageInfo
|
||||
|
||||
func (m *PushNotificationAcknowledgement) GetId() string {
|
||||
if m != nil {
|
||||
return m.Id
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func init() {
|
||||
proto.RegisterEnum("protobuf.PushNotificationOptions_TokenType", PushNotificationOptions_TokenType_name, PushNotificationOptions_TokenType_value)
|
||||
proto.RegisterEnum("protobuf.PushNotificationRegistrationResponse_ErrorType", PushNotificationRegistrationResponse_ErrorType_name, PushNotificationRegistrationResponse_ErrorType_value)
|
||||
proto.RegisterType((*PushNotificationTokenPair)(nil), "protobuf.PushNotificationTokenPair")
|
||||
proto.RegisterType((*PushNotificationOptions)(nil), "protobuf.PushNotificationOptions")
|
||||
proto.RegisterType((*PushNotificationPreferences)(nil), "protobuf.PushNotificationPreferences")
|
||||
proto.RegisterType((*PushNotificationRegister)(nil), "protobuf.PushNotificationRegister")
|
||||
proto.RegisterType((*PushNotificationRegistrationResponse)(nil), "protobuf.PushNotificationRegistrationResponse")
|
||||
proto.RegisterType((*PushNotificationAdvertisementInfo)(nil), "protobuf.PushNotificationAdvertisementInfo")
|
||||
proto.RegisterType((*ContactCodeAdvertisement)(nil), "protobuf.ContactCodeAdvertisement")
|
||||
proto.RegisterType((*PushNotificationQuery)(nil), "protobuf.PushNotificationQuery")
|
||||
proto.RegisterType((*PushNotificationQueryInfo)(nil), "protobuf.PushNotificationQueryInfo")
|
||||
proto.RegisterType((*PushNotificationQueryResponse)(nil), "protobuf.PushNotificationQueryResponse")
|
||||
proto.RegisterType((*PushNotification)(nil), "protobuf.PushNotification")
|
||||
proto.RegisterType((*PushNotificationRequest)(nil), "protobuf.PushNotificationRequest")
|
||||
proto.RegisterType((*PushNotificationAcknowledgement)(nil), "protobuf.PushNotificationAcknowledgement")
|
||||
}
|
||||
|
||||
func init() { proto.RegisterFile("push_notifications.proto", fileDescriptor_200acd86044eaa5d) }
|
||||
|
||||
var fileDescriptor_200acd86044eaa5d = []byte{
|
||||
// 876 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x55, 0xdf, 0x6f, 0xe3, 0x44,
|
||||
0x10, 0xc6, 0x49, 0xda, 0xc6, 0x93, 0x90, 0xa6, 0xab, 0x5e, 0xcf, 0x1c, 0x1c, 0xd7, 0x1a, 0x10,
|
||||
0xd5, 0x21, 0x45, 0xa2, 0x48, 0x70, 0x12, 0x4f, 0xa1, 0xe7, 0x1e, 0xa6, 0x8d, 0x13, 0x36, 0x29,
|
||||
0x3f, 0x9e, 0x2c, 0xc7, 0xde, 0xb4, 0xab, 0xf8, 0xbc, 0x66, 0x77, 0x7d, 0xa7, 0x3c, 0x20, 0x21,
|
||||
0xf1, 0xce, 0x7f, 0xc2, 0x0b, 0x2f, 0xfc, 0x71, 0xbc, 0x20, 0xaf, 0x7f, 0xd4, 0x75, 0xd2, 0x5e,
|
||||
0x9f, 0xe2, 0x99, 0xdd, 0x99, 0x9d, 0xf9, 0xe6, 0x9b, 0x2f, 0x60, 0xc4, 0x89, 0xb8, 0x76, 0x23,
|
||||
0x26, 0xe9, 0x82, 0xfa, 0x9e, 0xa4, 0x2c, 0x12, 0x83, 0x98, 0x33, 0xc9, 0x50, 0x5b, 0xfd, 0xcc,
|
||||
0x93, 0x85, 0x39, 0x81, 0x0f, 0x26, 0x89, 0xb8, 0x76, 0x2a, 0x97, 0x66, 0x6c, 0x49, 0xa2, 0x89,
|
||||
0x47, 0x39, 0xda, 0x87, 0x2d, 0x99, 0x1a, 0x86, 0x76, 0xa8, 0x1d, 0x77, 0x71, 0x66, 0xa0, 0xa7,
|
||||
0x00, 0x71, 0x32, 0x0f, 0xa9, 0xef, 0x2e, 0xc9, 0xca, 0x68, 0xa8, 0x23, 0x3d, 0xf3, 0x9c, 0x93,
|
||||
0x95, 0xf9, 0x67, 0x13, 0x1e, 0xd7, 0x53, 0x8e, 0x63, 0xf5, 0x3a, 0xfa, 0x01, 0x40, 0xe5, 0x70,
|
||||
0xe5, 0x2a, 0x26, 0x2a, 0x6b, 0xef, 0xe4, 0x8b, 0x41, 0x51, 0xcc, 0xe0, 0x8e, 0xb0, 0x81, 0xaa,
|
||||
0x68, 0xb6, 0x8a, 0x09, 0xd6, 0x65, 0xf1, 0x79, 0x53, 0x5c, 0x5a, 0x81, 0x5e, 0x14, 0xf7, 0x39,
|
||||
0xec, 0xd2, 0x48, 0x48, 0x2f, 0x0c, 0x55, 0x06, 0x97, 0x06, 0x46, 0x53, 0x9d, 0xf7, 0xaa, 0x6e,
|
||||
0x3b, 0x40, 0x06, 0xec, 0x90, 0xc8, 0x9b, 0x87, 0x24, 0x30, 0x5a, 0x87, 0xda, 0x71, 0x1b, 0x17,
|
||||
0x26, 0x1a, 0xc3, 0x9e, 0x17, 0x86, 0xec, 0x2d, 0x09, 0xdc, 0x44, 0x10, 0xee, 0x86, 0x54, 0x48,
|
||||
0x63, 0xeb, 0xb0, 0x79, 0xdc, 0x39, 0xf9, 0xe4, 0xee, 0x5a, 0x4b, 0xd4, 0xf0, 0x6e, 0x1e, 0x7d,
|
||||
0x29, 0x08, 0xbf, 0xa0, 0x42, 0xa2, 0xe7, 0xb0, 0x37, 0x0f, 0x99, 0xbf, 0x24, 0x81, 0xeb, 0x5f,
|
||||
0x7b, 0x32, 0x4b, 0xb8, 0x7d, 0xd8, 0x3c, 0xee, 0xe2, 0xdd, 0xfc, 0xe0, 0xf4, 0xda, 0x93, 0xe9,
|
||||
0x5d, 0xf3, 0x0c, 0xf4, 0xb2, 0x5b, 0x74, 0x00, 0xe8, 0xd2, 0x39, 0x77, 0xc6, 0x3f, 0x3b, 0xee,
|
||||
0x6c, 0x7c, 0x6e, 0x39, 0xee, 0xec, 0xd7, 0x89, 0xd5, 0x7f, 0x0f, 0xbd, 0x0f, 0xfa, 0x70, 0x92,
|
||||
0xfb, 0xfa, 0x1a, 0x42, 0xd0, 0x3b, 0xb3, 0xb1, 0xf5, 0xdd, 0x70, 0x6a, 0xe5, 0xbe, 0x86, 0xf9,
|
||||
0xaf, 0x06, 0x1f, 0xd6, 0x4b, 0x9c, 0x70, 0xb2, 0x20, 0x9c, 0x44, 0x3e, 0x11, 0xe8, 0x5b, 0xd8,
|
||||
0x61, 0x19, 0xba, 0x86, 0xa6, 0x5a, 0x3b, 0x7a, 0xe7, 0x18, 0x70, 0x11, 0x91, 0x62, 0xf7, 0x86,
|
||||
0x70, 0x41, 0x59, 0x06, 0x7e, 0x0b, 0x17, 0x26, 0xfa, 0x18, 0x20, 0x89, 0x38, 0xb9, 0xa2, 0x42,
|
||||
0x12, 0xae, 0x90, 0x6f, 0xe3, 0x8a, 0x07, 0x1d, 0x41, 0xd7, 0xf3, 0x7d, 0x22, 0x84, 0x9b, 0xcd,
|
||||
0xae, 0xa5, 0x66, 0xd3, 0xc9, 0x7c, 0xaa, 0x71, 0x13, 0x83, 0x51, 0x2f, 0x00, 0x17, 0xe1, 0x06,
|
||||
0xec, 0xc4, 0xde, 0x2a, 0x64, 0x5e, 0x90, 0x53, 0xb2, 0x30, 0xd1, 0x47, 0xa0, 0x0b, 0x7a, 0x15,
|
||||
0x79, 0x32, 0xe1, 0xa4, 0xe0, 0x64, 0xe9, 0x30, 0xff, 0x6b, 0xc0, 0xa7, 0x9b, 0x93, 0xf2, 0xfc,
|
||||
0x5b, 0xc4, 0x2c, 0x12, 0x24, 0x7d, 0x40, 0x24, 0xaa, 0x18, 0xf5, 0x40, 0x1b, 0x17, 0x26, 0x72,
|
||||
0x60, 0x8b, 0x70, 0xce, 0xb8, 0x4a, 0xde, 0x3b, 0x79, 0x71, 0x37, 0x5c, 0x9b, 0x12, 0x0f, 0xac,
|
||||
0x34, 0x56, 0x51, 0x38, 0x4b, 0x93, 0x6e, 0x11, 0x27, 0xbf, 0x25, 0x44, 0xc8, 0x82, 0xa3, 0x5d,
|
||||
0xac, 0xe7, 0x1e, 0x3b, 0x40, 0xaf, 0xa0, 0x13, 0xdf, 0x8c, 0x4b, 0xe1, 0xd4, 0x39, 0xf9, 0xec,
|
||||
0xee, 0x47, 0x2b, 0xb3, 0xc5, 0xd5, 0x48, 0xf3, 0x0f, 0x0d, 0xf4, 0xf2, 0xf1, 0x2a, 0xa3, 0x2c,
|
||||
0x8c, 0xc7, 0xb8, 0x60, 0xd4, 0x23, 0xd8, 0x1b, 0x0d, 0x2f, 0xce, 0xc6, 0x78, 0x64, 0xbd, 0x74,
|
||||
0x47, 0xd6, 0x74, 0x3a, 0x7c, 0x65, 0xf5, 0x35, 0xb4, 0x0f, 0xfd, 0x9f, 0x2c, 0x3c, 0xb5, 0xc7,
|
||||
0x8e, 0x3b, 0xb2, 0xa7, 0xa3, 0xe1, 0xec, 0xf4, 0xfb, 0x7e, 0x03, 0x3d, 0x81, 0x83, 0x4b, 0x67,
|
||||
0x7a, 0x39, 0x99, 0x8c, 0xf1, 0xcc, 0x7a, 0x59, 0xa5, 0x66, 0x33, 0xe5, 0xa2, 0xed, 0xcc, 0x2c,
|
||||
0xec, 0x0c, 0x2f, 0xb2, 0x17, 0xfa, 0x2d, 0xf3, 0x2f, 0x0d, 0x8e, 0xea, 0xf5, 0x0e, 0x83, 0x37,
|
||||
0x84, 0x4b, 0x2a, 0xc8, 0x6b, 0x12, 0x49, 0x3b, 0x5a, 0xb0, 0x9a, 0xac, 0x68, 0x35, 0x59, 0x59,
|
||||
0x63, 0x4e, 0x63, 0x8d, 0x39, 0x0f, 0xde, 0x7d, 0xf3, 0x77, 0x30, 0x4e, 0x59, 0x24, 0x3d, 0x5f,
|
||||
0x9e, 0xb2, 0x80, 0xdc, 0x2a, 0x05, 0x79, 0x70, 0xb0, 0x26, 0x9b, 0x2e, 0x8d, 0x16, 0x2c, 0xdf,
|
||||
0x93, 0x7b, 0xe4, 0x6a, 0xad, 0x27, 0xbc, 0x1f, 0xd7, 0xae, 0xa4, 0x5e, 0xf3, 0x05, 0x3c, 0xaa,
|
||||
0x87, 0xfe, 0x98, 0x10, 0xbe, 0x42, 0xcf, 0xa0, 0x73, 0x03, 0x41, 0xb6, 0x98, 0x5d, 0x0c, 0x25,
|
||||
0x06, 0xc2, 0xfc, 0x47, 0x5b, 0x97, 0x6b, 0x15, 0xaa, 0x10, 0xac, 0x43, 0xa4, 0x3d, 0x08, 0xa2,
|
||||
0xc6, 0x46, 0x79, 0xbc, 0x3d, 0x8d, 0x66, 0x7d, 0x1a, 0xcf, 0x37, 0x69, 0x64, 0x4b, 0xdd, 0xaa,
|
||||
0xcb, 0x9f, 0xf9, 0x0b, 0x3c, 0xdd, 0x58, 0x73, 0xb9, 0x74, 0xdf, 0x40, 0xab, 0x02, 0xf0, 0x3d,
|
||||
0x1a, 0x5b, 0xb6, 0x8a, 0x55, 0x80, 0xe9, 0x40, 0xbf, 0x7e, 0xe5, 0x21, 0x20, 0x3c, 0x86, 0x1d,
|
||||
0xa5, 0xc3, 0x65, 0xf3, 0xdb, 0xa9, 0x69, 0x07, 0xe6, 0xdf, 0xda, 0xfa, 0x5f, 0x17, 0xce, 0x56,
|
||||
0x12, 0x7d, 0x0d, 0xed, 0x7c, 0x3b, 0x0b, 0xc5, 0x7c, 0x72, 0x8f, 0x04, 0x94, 0x77, 0x53, 0x45,
|
||||
0x79, 0x4d, 0x84, 0xf0, 0xae, 0x0a, 0x59, 0x2a, 0xcc, 0x14, 0xe2, 0xfc, 0xf3, 0x86, 0xa9, 0x7a,
|
||||
0xee, 0xb1, 0x83, 0xac, 0x91, 0xa5, 0x9b, 0x26, 0xa2, 0x3c, 0xff, 0x97, 0x52, 0x8d, 0x2c, 0x71,
|
||||
0xee, 0x32, 0xbf, 0x84, 0x67, 0x6b, 0x1c, 0xf4, 0x97, 0x11, 0x7b, 0x1b, 0x92, 0xe0, 0x2a, 0xa3,
|
||||
0x73, 0x0f, 0x1a, 0x34, 0xc8, 0x41, 0x68, 0xd0, 0x60, 0xbe, 0xad, 0x6a, 0xfe, 0xea, 0xff, 0x00,
|
||||
0x00, 0x00, 0xff, 0xff, 0xc3, 0x71, 0xe1, 0x4f, 0x1c, 0x08, 0x00, 0x00,
|
||||
}
|
|
@ -0,0 +1,91 @@
|
|||
syntax = "proto3";
|
||||
|
||||
package protobuf;
|
||||
|
||||
message PushNotificationTokenPair {
|
||||
bytes token = 1;
|
||||
bytes public_key = 2;
|
||||
}
|
||||
|
||||
message PushNotificationOptions {
|
||||
enum TokenType {
|
||||
UNKNOWN_TOKEN_TYPE = 0;
|
||||
APN_TOKEN = 1;
|
||||
FIREBASE_TOKEN = 2;
|
||||
}
|
||||
TokenType token_type = 1;
|
||||
string token = 2;
|
||||
string installation_id = 3;
|
||||
bool enabled = 4;
|
||||
repeated PushNotificationTokenPair allowed_user_list = 5;
|
||||
repeated bytes blocked_chat_list = 6;
|
||||
}
|
||||
|
||||
message PushNotificationPreferences {
|
||||
repeated PushNotificationOptions options = 1;
|
||||
uint64 version = 2;
|
||||
bool unregister = 3;
|
||||
string access_token = 4;
|
||||
}
|
||||
|
||||
message PushNotificationRegister {
|
||||
bytes payload = 1;
|
||||
bytes signature = 2;
|
||||
}
|
||||
|
||||
|
||||
message PushNotificationRegistrationResponse {
|
||||
bool success = 1;
|
||||
ErrorType error = 2;
|
||||
bytes request_id = 3;
|
||||
PushNotificationPreferences preferences = 4;
|
||||
|
||||
enum ErrorType {
|
||||
UNKNOWN_ERROR_TYPE = 0;
|
||||
MALFORMED_MESSAGE = 1;
|
||||
VERSION_MISMATCH = 2;
|
||||
UNSUPPORTED_TOKEN_TYPE = 3;
|
||||
INTERNAL_ERROR = 4;
|
||||
}
|
||||
}
|
||||
|
||||
message PushNotificationAdvertisementInfo {
|
||||
bytes public_key = 1;
|
||||
string access_token = 2;
|
||||
string installation_id = 3;
|
||||
}
|
||||
|
||||
message ContactCodeAdvertisement {
|
||||
repeated PushNotificationAdvertisementInfo push_notification_info = 1;
|
||||
}
|
||||
|
||||
message PushNotificationQuery {
|
||||
repeated bytes public_keys = 1;
|
||||
}
|
||||
|
||||
message PushNotificationQueryInfo {
|
||||
string access_token = 1;
|
||||
string installation_id = 2;
|
||||
bytes public_key = 3;
|
||||
bytes allowed_user_list = 4;
|
||||
}
|
||||
|
||||
message PushNotificationQueryResponse {
|
||||
repeated PushNotificationQueryInfo info = 1;
|
||||
}
|
||||
|
||||
message PushNotification {
|
||||
string access_token = 1;
|
||||
string chat_id = 2;
|
||||
}
|
||||
|
||||
message PushNotificationRequest {
|
||||
repeated PushNotification requests = 1;
|
||||
bytes message = 2;
|
||||
string message_id = 3;
|
||||
string ack_required = 4;
|
||||
}
|
||||
|
||||
message PushNotificationAcknowledgement {
|
||||
string id = 1;
|
||||
}
|
|
@ -4,7 +4,7 @@ import (
|
|||
"github.com/golang/protobuf/proto"
|
||||
)
|
||||
|
||||
//go:generate protoc --go_out=. ./chat_message.proto ./application_metadata_message.proto ./membership_update_message.proto ./command.proto ./contact.proto ./pairing.proto
|
||||
//go:generate protoc --go_out=. ./chat_message.proto ./application_metadata_message.proto ./membership_update_message.proto ./command.proto ./contact.proto ./pairing.proto ./push_notifications.proto
|
||||
|
||||
func Unmarshal(payload []byte) (*ApplicationMetadataMessage, error) {
|
||||
var message ApplicationMetadataMessage
|
||||
|
|
|
@ -0,0 +1,282 @@
|
|||
package protocol
|
||||
|
||||
import (
|
||||
"crypto/aes"
|
||||
"crypto/cipher"
|
||||
"crypto/ecdsa"
|
||||
"crypto/rand"
|
||||
"io"
|
||||
|
||||
"golang.org/x/crypto/sha3"
|
||||
|
||||
"github.com/golang/protobuf/proto"
|
||||
|
||||
"github.com/google/uuid"
|
||||
|
||||
"github.com/status-im/status-go/eth-node/crypto"
|
||||
"github.com/status-im/status-go/eth-node/crypto/ecies"
|
||||
"github.com/status-im/status-go/protocol/encryption"
|
||||
"github.com/status-im/status-go/protocol/protobuf"
|
||||
)
|
||||
|
||||
const accessTokenKeyLength = 16
|
||||
|
||||
type PushNotificationServer struct {
|
||||
key *ecdsa.PublicKey
|
||||
registered bool
|
||||
}
|
||||
|
||||
type PushNotificationConfig struct {
|
||||
// Identity is our identity key
|
||||
Identity *ecdsa.PrivateKey
|
||||
// SendEnabled indicates whether we should be sending push notifications
|
||||
SendEnabled bool
|
||||
// RemoteNotificationsEnabled is whether we should register with a remote server for push notifications
|
||||
RemoteNotificationsEnabled bool
|
||||
|
||||
// AllowOnlyFromContacts indicates whether we should be receiving push notifications
|
||||
// only from contacts
|
||||
AllowOnlyFromContacts bool
|
||||
// ContactIDs is the public keys for each contact that we allow notifications from
|
||||
ContactIDs []*ecdsa.PublicKey
|
||||
// MutedChatIDs is the IDs of the chats we don't want to receive notifications from
|
||||
MutedChatIDs []string
|
||||
// PushNotificationServers is an array of push notification servers we want to register with
|
||||
PushNotificationServers []*PushNotificationServer
|
||||
// InstallationID is the installation-id for this device
|
||||
InstallationID string
|
||||
}
|
||||
|
||||
type PushNotificationService struct {
|
||||
persistence *PushNotificationPersistence
|
||||
config *PushNotificationConfig
|
||||
|
||||
// lastPushNotificationRegister is the latest known push notification register message
|
||||
lastPushNotificationRegister *protobuf.PushNotificationRegister
|
||||
|
||||
// AccessToken is the access token that is currently being used
|
||||
AccessToken string
|
||||
// DeviceToken is the device token for this device
|
||||
DeviceToken string
|
||||
|
||||
// randomReader only used for testing so we have deterministic encryption
|
||||
reader io.Reader
|
||||
}
|
||||
|
||||
func NewPushNotificationService(persistence *PushNotificationPersistence) *PushNotificationService {
|
||||
return &PushNotificationService{persistence: persistence, reader: rand.Reader}
|
||||
}
|
||||
|
||||
// This likely will return a channel as it's an asynchrous operation
|
||||
func fetchNotificationInfoFor(publicKey *ecdsa.PublicKey) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Sends an actual push notification, where do we get the chatID?
|
||||
func sendPushNotificationTo(publicKey *ecdsa.PublicKey, chatID string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// This should schedule:
|
||||
// 1) Check we have reasonably fresh push notifications info
|
||||
// 2) Otherwise it should fetch them
|
||||
// 3) Send a push notification to the devices in question
|
||||
func (p *PushNotificationService) HandleMessageSent(publicKey *ecdsa.PublicKey, spec *encryption.ProtocolMessageSpec, messageIDs [][]byte) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *PushNotificationService) NotifyOnMessageID(messageID []byte) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *PushNotificationService) mutedChatIDsHashes() [][]byte {
|
||||
var mutedChatListHashes [][]byte
|
||||
|
||||
for _, chatID := range p.config.MutedChatIDs {
|
||||
mutedChatListHashes = append(mutedChatListHashes, shake256(chatID))
|
||||
}
|
||||
|
||||
return mutedChatListHashes
|
||||
}
|
||||
|
||||
func (p *PushNotificationService) reEncryptTokenPair(token []byte, pair *protobuf.PushNotificationTokenPair) (*protobuf.PushNotificationTokenPair, error) {
|
||||
publicKey, err := crypto.DecompressPubkey(pair.PublicKey)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return p.encryptTokenPair(publicKey, token)
|
||||
}
|
||||
|
||||
func (p *PushNotificationService) encryptTokenPair(publicKey *ecdsa.PublicKey, token []byte) (*protobuf.PushNotificationTokenPair, error) {
|
||||
sharedKey, err := ecies.ImportECDSA(p.config.Identity).GenerateShared(
|
||||
ecies.ImportECDSAPublic(publicKey),
|
||||
accessTokenKeyLength,
|
||||
accessTokenKeyLength,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
encryptedToken, err := encryptAccessToken(token, sharedKey, p.reader)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &protobuf.PushNotificationTokenPair{
|
||||
Token: encryptedToken,
|
||||
PublicKey: crypto.CompressPubkey(publicKey),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (p *PushNotificationService) allowedUserList(token []byte) ([]*protobuf.PushNotificationTokenPair, error) {
|
||||
var tokenPairs []*protobuf.PushNotificationTokenPair
|
||||
for _, publicKey := range p.config.ContactIDs {
|
||||
tokenPair, err := p.encryptTokenPair(publicKey, token)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
tokenPairs = append(tokenPairs, tokenPair)
|
||||
|
||||
}
|
||||
return tokenPairs, nil
|
||||
}
|
||||
|
||||
func (p *PushNotificationService) reEncryptAllowedUserList(token []byte, oldTokenPairs []*protobuf.PushNotificationTokenPair) ([]*protobuf.PushNotificationTokenPair, error) {
|
||||
var tokenPairs []*protobuf.PushNotificationTokenPair
|
||||
for _, tokenPair := range oldTokenPairs {
|
||||
tokenPair, err := p.reEncryptTokenPair(token, tokenPair)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
tokenPairs = append(tokenPairs, tokenPair)
|
||||
|
||||
}
|
||||
return tokenPairs, nil
|
||||
}
|
||||
|
||||
func (p *PushNotificationService) buildPushNotificationOptionsMessage(token string) (*protobuf.PushNotificationOptions, error) {
|
||||
allowedUserList, err := p.allowedUserList([]byte(token))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
options := &protobuf.PushNotificationOptions{
|
||||
InstallationId: p.config.InstallationID,
|
||||
Token: p.DeviceToken,
|
||||
Enabled: p.config.RemoteNotificationsEnabled,
|
||||
BlockedChatList: p.mutedChatIDsHashes(),
|
||||
AllowedUserList: allowedUserList,
|
||||
}
|
||||
return options, nil
|
||||
}
|
||||
|
||||
func (p *PushNotificationService) buildPushNotificationRegisterMessage() (*protobuf.PushNotificationRegister, error) {
|
||||
pushNotificationPreferences := &protobuf.PushNotificationPreferences{}
|
||||
|
||||
if p.lastPushNotificationRegister != nil {
|
||||
if err := proto.Unmarshal(p.lastPushNotificationRegister.Payload, pushNotificationPreferences); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
// Increment version
|
||||
pushNotificationPreferences.Version += 1
|
||||
|
||||
// Generate new token
|
||||
token := uuid.New().String()
|
||||
pushNotificationPreferences.AccessToken = token
|
||||
|
||||
// build options for this device
|
||||
ourOptions, err := p.buildPushNotificationOptionsMessage(token)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
options := []*protobuf.PushNotificationOptions{ourOptions}
|
||||
// Re-encrypt token for previous options that don't belong to this
|
||||
// device
|
||||
for _, option := range pushNotificationPreferences.Options {
|
||||
if option.InstallationId != p.config.InstallationID {
|
||||
newAllowedUserList, err := p.reEncryptAllowedUserList([]byte(token), option.AllowedUserList)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
option.AllowedUserList = newAllowedUserList
|
||||
options = append(options, option)
|
||||
}
|
||||
}
|
||||
|
||||
pushNotificationPreferences.Options = options
|
||||
|
||||
// Marshal
|
||||
payload, err := proto.Marshal(pushNotificationPreferences)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
message := &protobuf.PushNotificationRegister{Payload: payload}
|
||||
return message, nil
|
||||
}
|
||||
|
||||
func (p *PushNotificationService) Register(deviceToken string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// HandlePushNotificationRegistrationResponse should check whether the response was successful or not, retry if necessary otherwise store the result in the database
|
||||
func (p *PushNotificationService) HandlePushNotificationRegistrationResponse(response *protobuf.PushNotificationRegistrationResponse) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// HandlePushNotificationAdvertisement should store any info related to push notifications
|
||||
func (p *PushNotificationService) HandlePushNotificationAdvertisement(info *protobuf.PushNotificationAdvertisementInfo) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// HandlePushNotificationQueryResponse should update the data in the database for a given user
|
||||
func (p *PushNotificationService) HandlePushNotificationQueryResponse(response *protobuf.PushNotificationQueryResponse) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// HandlePushNotificationAcknowledgement should set the request as processed
|
||||
func (p *PushNotificationService) HandlePushNotificationAcknowledgement(ack *protobuf.PushNotificationAcknowledgement) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *PushNotificationService) SetContactIDs(contactIDs []*ecdsa.PublicKey) error {
|
||||
p.config.ContactIDs = contactIDs
|
||||
// Update or schedule update
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *PushNotificationService) SetMutedChatIDs(chatIDs []string) error {
|
||||
p.config.MutedChatIDs = chatIDs
|
||||
// Update or schedule update
|
||||
return nil
|
||||
}
|
||||
|
||||
func encryptAccessToken(plaintext []byte, key []byte, reader io.Reader) ([]byte, error) {
|
||||
c, err := aes.NewCipher(key)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
gcm, err := cipher.NewGCM(c)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
nonce := make([]byte, gcm.NonceSize())
|
||||
if _, err = io.ReadFull(reader, nonce); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return gcm.Seal(nonce, nonce, plaintext, nil), nil
|
||||
}
|
||||
|
||||
func shake256(input string) []byte {
|
||||
buf := []byte(input)
|
||||
h := make([]byte, 64)
|
||||
sha3.ShakeSum256(h, buf)
|
||||
return h
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
package protocol
|
||||
|
||||
import (
|
||||
"crypto/ecdsa"
|
||||
"database/sql"
|
||||
)
|
||||
|
||||
type PushNotificationPersistence struct {
|
||||
db *sql.DB
|
||||
}
|
||||
|
||||
func NewPushNotificationPersistence(db *sql.DB) *PushNotificationPersistence {
|
||||
return &PushNotificationPersistence{db: db}
|
||||
}
|
||||
|
||||
func (p *PushNotificationPersistence) TrackPushNotification(messageID []byte) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *PushNotificationPersistence) ShouldSentNotificationFor(publicKey *ecdsa.PublicKey, messageID []byte) (bool, error) {
|
||||
return false, nil
|
||||
}
|
||||
func (p *PushNotificationPersistence) PushNotificationSentFor(publicKey *ecdsa.PublicKey, messageID []byte) error {
|
||||
|
||||
return nil
|
||||
}
|
|
@ -0,0 +1,219 @@
|
|||
package protocol
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/ecdsa"
|
||||
"math/rand"
|
||||
|
||||
"testing"
|
||||
|
||||
"github.com/golang/protobuf/proto"
|
||||
"github.com/google/uuid"
|
||||
"github.com/status-im/status-go/eth-node/crypto"
|
||||
"github.com/status-im/status-go/eth-node/crypto/ecies"
|
||||
"github.com/status-im/status-go/protocol/protobuf"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestBuildPushNotificationRegisterMessage(t *testing.T) {
|
||||
myDeviceToken := "device-token"
|
||||
myInstallationID := "installationID"
|
||||
mutedChatList := []string{"a", "b"}
|
||||
|
||||
// build chat lish hashes
|
||||
var mutedChatListHashes [][]byte
|
||||
for _, chatID := range mutedChatList {
|
||||
mutedChatListHashes = append(mutedChatListHashes, shake256(chatID))
|
||||
}
|
||||
|
||||
identity, err := crypto.GenerateKey()
|
||||
contactKey, err := crypto.GenerateKey()
|
||||
require.NoError(t, err)
|
||||
contactIDs := []*ecdsa.PublicKey{&contactKey.PublicKey}
|
||||
|
||||
// Set random generator for uuid
|
||||
var seed int64 = 1
|
||||
uuid.SetRand(rand.New(rand.NewSource(seed)))
|
||||
|
||||
// Get token
|
||||
expectedUUID := uuid.New().String()
|
||||
|
||||
// set up reader
|
||||
reader := bytes.NewReader([]byte(expectedUUID))
|
||||
|
||||
sharedKey, err := ecies.ImportECDSA(identity).GenerateShared(
|
||||
ecies.ImportECDSAPublic(&contactKey.PublicKey),
|
||||
accessTokenKeyLength,
|
||||
accessTokenKeyLength,
|
||||
)
|
||||
require.NoError(t, err)
|
||||
// build encrypted token
|
||||
encryptedToken, err := encryptAccessToken([]byte(expectedUUID), sharedKey, reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
tokenPair := &protobuf.PushNotificationTokenPair{
|
||||
Token: encryptedToken,
|
||||
PublicKey: crypto.CompressPubkey(&contactKey.PublicKey),
|
||||
}
|
||||
|
||||
// Reset random generator
|
||||
uuid.SetRand(rand.New(rand.NewSource(seed)))
|
||||
|
||||
config := &PushNotificationConfig{
|
||||
Identity: identity,
|
||||
RemoteNotificationsEnabled: true,
|
||||
MutedChatIDs: mutedChatList,
|
||||
ContactIDs: contactIDs,
|
||||
InstallationID: myInstallationID,
|
||||
}
|
||||
|
||||
service := &PushNotificationService{}
|
||||
service.config = config
|
||||
service.DeviceToken = myDeviceToken
|
||||
// Set reader
|
||||
service.reader = bytes.NewReader([]byte(expectedUUID))
|
||||
|
||||
options := &protobuf.PushNotificationOptions{
|
||||
Token: myDeviceToken,
|
||||
InstallationId: myInstallationID,
|
||||
Enabled: true,
|
||||
BlockedChatList: mutedChatListHashes,
|
||||
AllowedUserList: []*protobuf.PushNotificationTokenPair{tokenPair},
|
||||
}
|
||||
|
||||
preferences := &protobuf.PushNotificationPreferences{
|
||||
Options: []*protobuf.PushNotificationOptions{options},
|
||||
Version: 1,
|
||||
AccessToken: expectedUUID,
|
||||
}
|
||||
|
||||
// Marshal message
|
||||
marshaledPreferences, err := proto.Marshal(preferences)
|
||||
require.NoError(t, err)
|
||||
|
||||
expectedMessage := &protobuf.PushNotificationRegister{Payload: marshaledPreferences}
|
||||
actualMessage, err := service.buildPushNotificationRegisterMessage()
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, expectedMessage, actualMessage)
|
||||
}
|
||||
|
||||
func TestBuildPushNotificationRegisterMessageWithPrevious(t *testing.T) {
|
||||
deviceToken1 := "device-token-1"
|
||||
deviceToken2 := "device-token-2"
|
||||
installationID1 := "installationID-1"
|
||||
installationID2 := "installationID-2"
|
||||
|
||||
contactKey, err := crypto.GenerateKey()
|
||||
require.NoError(t, err)
|
||||
|
||||
// build previous push notification options
|
||||
options2 := &protobuf.PushNotificationOptions{
|
||||
Token: deviceToken2,
|
||||
InstallationId: installationID2,
|
||||
Enabled: true,
|
||||
AllowedUserList: []*protobuf.PushNotificationTokenPair{{
|
||||
Token: []byte{0x01},
|
||||
PublicKey: crypto.CompressPubkey(&contactKey.PublicKey),
|
||||
}},
|
||||
}
|
||||
|
||||
preferences2 := &protobuf.PushNotificationPreferences{
|
||||
Options: []*protobuf.PushNotificationOptions{options2},
|
||||
Version: 1,
|
||||
AccessToken: "some-token",
|
||||
}
|
||||
|
||||
// Marshal message
|
||||
marshaledPreferences2, err := proto.Marshal(preferences2)
|
||||
require.NoError(t, err)
|
||||
|
||||
lastPushNotificationRegister := &protobuf.PushNotificationRegister{Payload: marshaledPreferences2}
|
||||
|
||||
mutedChatList := []string{"a", "b"}
|
||||
|
||||
// build chat lish hashes
|
||||
var mutedChatListHashes [][]byte
|
||||
for _, chatID := range mutedChatList {
|
||||
mutedChatListHashes = append(mutedChatListHashes, shake256(chatID))
|
||||
}
|
||||
|
||||
identity, err := crypto.GenerateKey()
|
||||
contactIDs := []*ecdsa.PublicKey{&contactKey.PublicKey}
|
||||
|
||||
// Set random generator for uuid
|
||||
var seed int64 = 1
|
||||
uuid.SetRand(rand.New(rand.NewSource(seed)))
|
||||
|
||||
// Get token
|
||||
expectedUUID := uuid.New().String()
|
||||
|
||||
// set up reader
|
||||
reader := bytes.NewReader([]byte(expectedUUID))
|
||||
|
||||
sharedKey, err := ecies.ImportECDSA(identity).GenerateShared(
|
||||
ecies.ImportECDSAPublic(&contactKey.PublicKey),
|
||||
accessTokenKeyLength,
|
||||
accessTokenKeyLength,
|
||||
)
|
||||
require.NoError(t, err)
|
||||
// build encrypted token
|
||||
encryptedToken1, err := encryptAccessToken([]byte(expectedUUID), sharedKey, reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
encryptedToken2, err := encryptAccessToken([]byte(expectedUUID), sharedKey, reader)
|
||||
require.NoError(t, err)
|
||||
|
||||
tokenPair1 := &protobuf.PushNotificationTokenPair{
|
||||
Token: encryptedToken1,
|
||||
PublicKey: crypto.CompressPubkey(&contactKey.PublicKey),
|
||||
}
|
||||
|
||||
tokenPair2 := &protobuf.PushNotificationTokenPair{
|
||||
Token: encryptedToken2,
|
||||
PublicKey: crypto.CompressPubkey(&contactKey.PublicKey),
|
||||
}
|
||||
|
||||
// Reset random generator
|
||||
uuid.SetRand(rand.New(rand.NewSource(seed)))
|
||||
|
||||
config := &PushNotificationConfig{
|
||||
Identity: identity,
|
||||
RemoteNotificationsEnabled: true,
|
||||
MutedChatIDs: mutedChatList,
|
||||
ContactIDs: contactIDs,
|
||||
InstallationID: installationID1,
|
||||
}
|
||||
|
||||
service := &PushNotificationService{}
|
||||
service.config = config
|
||||
service.DeviceToken = deviceToken1
|
||||
service.lastPushNotificationRegister = lastPushNotificationRegister
|
||||
// Set reader
|
||||
service.reader = bytes.NewReader([]byte(expectedUUID))
|
||||
|
||||
options1 := &protobuf.PushNotificationOptions{
|
||||
Token: deviceToken1,
|
||||
InstallationId: installationID1,
|
||||
Enabled: true,
|
||||
BlockedChatList: mutedChatListHashes,
|
||||
AllowedUserList: []*protobuf.PushNotificationTokenPair{tokenPair1},
|
||||
}
|
||||
options2.AllowedUserList = []*protobuf.PushNotificationTokenPair{tokenPair2}
|
||||
|
||||
preferences := &protobuf.PushNotificationPreferences{
|
||||
Options: []*protobuf.PushNotificationOptions{options1, options2},
|
||||
Version: 2,
|
||||
AccessToken: expectedUUID,
|
||||
}
|
||||
|
||||
// Marshal message
|
||||
marshaledPreferences, err := proto.Marshal(preferences)
|
||||
require.NoError(t, err)
|
||||
|
||||
expectedMessage := &protobuf.PushNotificationRegister{Payload: marshaledPreferences}
|
||||
actualMessage, err := service.buildPushNotificationRegisterMessage()
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, expectedMessage, actualMessage)
|
||||
}
|
Loading…
Reference in New Issue