From 92b699b59d5ecc06859b9acf1c12f3eb529bbba8 Mon Sep 17 00:00:00 2001 From: Andrea Maria Piana Date: Tue, 30 Jun 2020 09:50:59 +0200 Subject: [PATCH] Add push notification register message --- protocol/applicationmetadata/message.pb.go | 85 -- protocol/applicationmetadata/message.proto | 8 - protocol/applicationmetadata/pubkey.go | 23 - protocol/applicationmetadata/service.go | 17 - protocol/message_processor.go | 34 +- protocol/message_processor_test.go | 1 + protocol/messenger.go | 14 + protocol/messenger_mute_test.go | 1 - .../application_metadata_message.pb.go | 80 +- .../application_metadata_message.proto | 8 + protocol/protobuf/push_notifications.pb.go | 845 ++++++++++++++++++ protocol/protobuf/push_notifications.proto | 91 ++ protocol/protobuf/service.go | 2 +- protocol/push_notification.go | 282 ++++++ protocol/push_notification_persistence.go | 26 + protocol/push_notification_test.go | 219 +++++ 16 files changed, 1568 insertions(+), 168 deletions(-) delete mode 100644 protocol/applicationmetadata/message.pb.go delete mode 100644 protocol/applicationmetadata/message.proto delete mode 100644 protocol/applicationmetadata/pubkey.go delete mode 100644 protocol/applicationmetadata/service.go create mode 100644 protocol/protobuf/push_notifications.pb.go create mode 100644 protocol/protobuf/push_notifications.proto create mode 100644 protocol/push_notification.go create mode 100644 protocol/push_notification_persistence.go create mode 100644 protocol/push_notification_test.go diff --git a/protocol/applicationmetadata/message.pb.go b/protocol/applicationmetadata/message.pb.go deleted file mode 100644 index 4e71857d8..000000000 --- a/protocol/applicationmetadata/message.pb.go +++ /dev/null @@ -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, -} diff --git a/protocol/applicationmetadata/message.proto b/protocol/applicationmetadata/message.proto deleted file mode 100644 index 009830697..000000000 --- a/protocol/applicationmetadata/message.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -package applicationmetadata; - -message Message { - bytes signature = 4001; - bytes payload = 4002; -} diff --git a/protocol/applicationmetadata/pubkey.go b/protocol/applicationmetadata/pubkey.go deleted file mode 100644 index 29a152598..000000000 --- a/protocol/applicationmetadata/pubkey.go +++ /dev/null @@ -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 -} diff --git a/protocol/applicationmetadata/service.go b/protocol/applicationmetadata/service.go deleted file mode 100644 index b3a23b48a..000000000 --- a/protocol/applicationmetadata/service.go +++ /dev/null @@ -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 -} diff --git a/protocol/message_processor.go b/protocol/message_processor.go index 548534861..d05c38625 100644 --- a/protocol/message_processor.go +++ b/protocol/message_processor.go @@ -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 } diff --git a/protocol/message_processor_test.go b/protocol/message_processor_test.go index 6851e04d4..a2c22bafe 100644 --- a/protocol/message_processor_test.go +++ b/protocol/message_processor_test.go @@ -101,6 +101,7 @@ func (s *MessageProcessorSuite) SetupTest() { whisperTransport, s.logger, featureFlags{}, + nil, ) s.Require().NoError(err) } diff --git a/protocol/messenger.go b/protocol/messenger.go index 82b3763c4..176dabbf8 100644 --- a/protocol/messenger.go +++ b/protocol/messenger.go @@ -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 { diff --git a/protocol/messenger_mute_test.go b/protocol/messenger_mute_test.go index a366088d9..fe3fe8b7b 100644 --- a/protocol/messenger_mute_test.go +++ b/protocol/messenger_mute_test.go @@ -1,7 +1,6 @@ package protocol import ( - "context" "crypto/ecdsa" "io/ioutil" "os" diff --git a/protocol/protobuf/application_metadata_message.pb.go b/protocol/protobuf/application_metadata_message.pb.go index b166e283f..30937f2fe 100644 --- a/protocol/protobuf/application_metadata_message.pb.go +++ b/protocol/protobuf/application_metadata_message.pb.go @@ -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, } diff --git a/protocol/protobuf/application_metadata_message.proto b/protocol/protobuf/application_metadata_message.proto index dae1d78be..a93f5dac5 100644 --- a/protocol/protobuf/application_metadata_message.proto +++ b/protocol/protobuf/application_metadata_message.proto @@ -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; } } diff --git a/protocol/protobuf/push_notifications.pb.go b/protocol/protobuf/push_notifications.pb.go new file mode 100644 index 000000000..a544d35f7 --- /dev/null +++ b/protocol/protobuf/push_notifications.pb.go @@ -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, +} diff --git a/protocol/protobuf/push_notifications.proto b/protocol/protobuf/push_notifications.proto new file mode 100644 index 000000000..db0795bb9 --- /dev/null +++ b/protocol/protobuf/push_notifications.proto @@ -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; +} diff --git a/protocol/protobuf/service.go b/protocol/protobuf/service.go index f6652e485..12d13e972 100644 --- a/protocol/protobuf/service.go +++ b/protocol/protobuf/service.go @@ -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 diff --git a/protocol/push_notification.go b/protocol/push_notification.go new file mode 100644 index 000000000..5d57233cf --- /dev/null +++ b/protocol/push_notification.go @@ -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 +} diff --git a/protocol/push_notification_persistence.go b/protocol/push_notification_persistence.go new file mode 100644 index 000000000..b41057917 --- /dev/null +++ b/protocol/push_notification_persistence.go @@ -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 +} diff --git a/protocol/push_notification_test.go b/protocol/push_notification_test.go new file mode 100644 index 000000000..955af1968 --- /dev/null +++ b/protocol/push_notification_test.go @@ -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) +}