implement handle push notification registration
This commit is contained in:
parent
91c7869d98
commit
a15919527b
|
@ -20,32 +20,32 @@ var _ = math.Inf
|
||||||
// proto package needs to be updated.
|
// proto package needs to be updated.
|
||||||
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
|
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
|
||||||
|
|
||||||
type PushNotificationOptions_TokenType int32
|
type PushNotificationRegistration_TokenType int32
|
||||||
|
|
||||||
const (
|
const (
|
||||||
PushNotificationOptions_UNKNOWN_TOKEN_TYPE PushNotificationOptions_TokenType = 0
|
PushNotificationRegistration_UNKNOWN_TOKEN_TYPE PushNotificationRegistration_TokenType = 0
|
||||||
PushNotificationOptions_APN_TOKEN PushNotificationOptions_TokenType = 1
|
PushNotificationRegistration_APN_TOKEN PushNotificationRegistration_TokenType = 1
|
||||||
PushNotificationOptions_FIREBASE_TOKEN PushNotificationOptions_TokenType = 2
|
PushNotificationRegistration_FIREBASE_TOKEN PushNotificationRegistration_TokenType = 2
|
||||||
)
|
)
|
||||||
|
|
||||||
var PushNotificationOptions_TokenType_name = map[int32]string{
|
var PushNotificationRegistration_TokenType_name = map[int32]string{
|
||||||
0: "UNKNOWN_TOKEN_TYPE",
|
0: "UNKNOWN_TOKEN_TYPE",
|
||||||
1: "APN_TOKEN",
|
1: "APN_TOKEN",
|
||||||
2: "FIREBASE_TOKEN",
|
2: "FIREBASE_TOKEN",
|
||||||
}
|
}
|
||||||
|
|
||||||
var PushNotificationOptions_TokenType_value = map[string]int32{
|
var PushNotificationRegistration_TokenType_value = map[string]int32{
|
||||||
"UNKNOWN_TOKEN_TYPE": 0,
|
"UNKNOWN_TOKEN_TYPE": 0,
|
||||||
"APN_TOKEN": 1,
|
"APN_TOKEN": 1,
|
||||||
"FIREBASE_TOKEN": 2,
|
"FIREBASE_TOKEN": 2,
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x PushNotificationOptions_TokenType) String() string {
|
func (x PushNotificationRegistration_TokenType) String() string {
|
||||||
return proto.EnumName(PushNotificationOptions_TokenType_name, int32(x))
|
return proto.EnumName(PushNotificationRegistration_TokenType_name, int32(x))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (PushNotificationOptions_TokenType) EnumDescriptor() ([]byte, []int) {
|
func (PushNotificationRegistration_TokenType) EnumDescriptor() ([]byte, []int) {
|
||||||
return fileDescriptor_200acd86044eaa5d, []int{1, 0}
|
return fileDescriptor_200acd86044eaa5d, []int{0, 0}
|
||||||
}
|
}
|
||||||
|
|
||||||
type PushNotificationRegistrationResponse_ErrorType int32
|
type PushNotificationRegistrationResponse_ErrorType int32
|
||||||
|
@ -79,153 +79,106 @@ func (x PushNotificationRegistrationResponse_ErrorType) String() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (PushNotificationRegistrationResponse_ErrorType) EnumDescriptor() ([]byte, []int) {
|
func (PushNotificationRegistrationResponse_ErrorType) EnumDescriptor() ([]byte, []int) {
|
||||||
return fileDescriptor_200acd86044eaa5d, []int{2, 0}
|
return fileDescriptor_200acd86044eaa5d, []int{1, 0}
|
||||||
}
|
}
|
||||||
|
|
||||||
type PushNotificationTokenPair struct {
|
type PushNotificationRegistration struct {
|
||||||
Token []byte `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"`
|
TokenType PushNotificationRegistration_TokenType `protobuf:"varint,1,opt,name=token_type,json=tokenType,proto3,enum=protobuf.PushNotificationRegistration_TokenType" json:"token_type,omitempty"`
|
||||||
PublicKey []byte `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"`
|
Token string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"`
|
||||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
InstallationId string `protobuf:"bytes,3,opt,name=installation_id,json=installationId,proto3" json:"installation_id,omitempty"`
|
||||||
XXX_unrecognized []byte `json:"-"`
|
AccessToken string `protobuf:"bytes,4,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"`
|
||||||
XXX_sizecache int32 `json:"-"`
|
Enabled bool `protobuf:"varint,5,opt,name=enabled,proto3" json:"enabled,omitempty"`
|
||||||
|
Version uint64 `protobuf:"varint,6,opt,name=version,proto3" json:"version,omitempty"`
|
||||||
|
AllowedUserList [][]byte `protobuf:"bytes,7,rep,name=allowed_user_list,json=allowedUserList,proto3" json:"allowed_user_list,omitempty"`
|
||||||
|
BlockedChatList [][]byte `protobuf:"bytes,8,rep,name=blocked_chat_list,json=blockedChatList,proto3" json:"blocked_chat_list,omitempty"`
|
||||||
|
Unregister bool `protobuf:"varint,9,opt,name=unregister,proto3" json:"unregister,omitempty"`
|
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
|
XXX_unrecognized []byte `json:"-"`
|
||||||
|
XXX_sizecache int32 `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *PushNotificationTokenPair) Reset() { *m = PushNotificationTokenPair{} }
|
func (m *PushNotificationRegistration) Reset() { *m = PushNotificationRegistration{} }
|
||||||
func (m *PushNotificationTokenPair) String() string { return proto.CompactTextString(m) }
|
func (m *PushNotificationRegistration) String() string { return proto.CompactTextString(m) }
|
||||||
func (*PushNotificationTokenPair) ProtoMessage() {}
|
func (*PushNotificationRegistration) ProtoMessage() {}
|
||||||
func (*PushNotificationTokenPair) Descriptor() ([]byte, []int) {
|
func (*PushNotificationRegistration) Descriptor() ([]byte, []int) {
|
||||||
return fileDescriptor_200acd86044eaa5d, []int{0}
|
return fileDescriptor_200acd86044eaa5d, []int{0}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *PushNotificationTokenPair) XXX_Unmarshal(b []byte) error {
|
func (m *PushNotificationRegistration) XXX_Unmarshal(b []byte) error {
|
||||||
return xxx_messageInfo_PushNotificationTokenPair.Unmarshal(m, b)
|
return xxx_messageInfo_PushNotificationRegistration.Unmarshal(m, b)
|
||||||
}
|
}
|
||||||
func (m *PushNotificationTokenPair) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
func (m *PushNotificationRegistration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
return xxx_messageInfo_PushNotificationTokenPair.Marshal(b, m, deterministic)
|
return xxx_messageInfo_PushNotificationRegistration.Marshal(b, m, deterministic)
|
||||||
}
|
}
|
||||||
func (m *PushNotificationTokenPair) XXX_Merge(src proto.Message) {
|
func (m *PushNotificationRegistration) XXX_Merge(src proto.Message) {
|
||||||
xxx_messageInfo_PushNotificationTokenPair.Merge(m, src)
|
xxx_messageInfo_PushNotificationRegistration.Merge(m, src)
|
||||||
}
|
}
|
||||||
func (m *PushNotificationTokenPair) XXX_Size() int {
|
func (m *PushNotificationRegistration) XXX_Size() int {
|
||||||
return xxx_messageInfo_PushNotificationTokenPair.Size(m)
|
return xxx_messageInfo_PushNotificationRegistration.Size(m)
|
||||||
}
|
}
|
||||||
func (m *PushNotificationTokenPair) XXX_DiscardUnknown() {
|
func (m *PushNotificationRegistration) XXX_DiscardUnknown() {
|
||||||
xxx_messageInfo_PushNotificationTokenPair.DiscardUnknown(m)
|
xxx_messageInfo_PushNotificationRegistration.DiscardUnknown(m)
|
||||||
}
|
}
|
||||||
|
|
||||||
var xxx_messageInfo_PushNotificationTokenPair proto.InternalMessageInfo
|
var xxx_messageInfo_PushNotificationRegistration proto.InternalMessageInfo
|
||||||
|
|
||||||
func (m *PushNotificationTokenPair) GetToken() []byte {
|
func (m *PushNotificationRegistration) GetTokenType() PushNotificationRegistration_TokenType {
|
||||||
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"`
|
|
||||||
AccessToken string `protobuf:"bytes,4,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"`
|
|
||||||
Enabled bool `protobuf:"varint,5,opt,name=enabled,proto3" json:"enabled,omitempty"`
|
|
||||||
Version uint64 `protobuf:"varint,6,opt,name=version,proto3" json:"version,omitempty"`
|
|
||||||
AllowedUserList [][]byte `protobuf:"bytes,7,rep,name=allowed_user_list,json=allowedUserList,proto3" json:"allowed_user_list,omitempty"`
|
|
||||||
BlockedChatList [][]byte `protobuf:"bytes,8,rep,name=blocked_chat_list,json=blockedChatList,proto3" json:"blocked_chat_list,omitempty"`
|
|
||||||
Unregister bool `protobuf:"varint,9,opt,name=unregister,proto3" json:"unregister,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 {
|
if m != nil {
|
||||||
return m.TokenType
|
return m.TokenType
|
||||||
}
|
}
|
||||||
return PushNotificationOptions_UNKNOWN_TOKEN_TYPE
|
return PushNotificationRegistration_UNKNOWN_TOKEN_TYPE
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *PushNotificationOptions) GetToken() string {
|
func (m *PushNotificationRegistration) GetToken() string {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
return m.Token
|
return m.Token
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *PushNotificationOptions) GetInstallationId() string {
|
func (m *PushNotificationRegistration) GetInstallationId() string {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
return m.InstallationId
|
return m.InstallationId
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *PushNotificationOptions) GetAccessToken() string {
|
func (m *PushNotificationRegistration) GetAccessToken() string {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
return m.AccessToken
|
return m.AccessToken
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *PushNotificationOptions) GetEnabled() bool {
|
func (m *PushNotificationRegistration) GetEnabled() bool {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
return m.Enabled
|
return m.Enabled
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *PushNotificationOptions) GetVersion() uint64 {
|
func (m *PushNotificationRegistration) GetVersion() uint64 {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
return m.Version
|
return m.Version
|
||||||
}
|
}
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *PushNotificationOptions) GetAllowedUserList() [][]byte {
|
func (m *PushNotificationRegistration) GetAllowedUserList() [][]byte {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
return m.AllowedUserList
|
return m.AllowedUserList
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *PushNotificationOptions) GetBlockedChatList() [][]byte {
|
func (m *PushNotificationRegistration) GetBlockedChatList() [][]byte {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
return m.BlockedChatList
|
return m.BlockedChatList
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *PushNotificationOptions) GetUnregister() bool {
|
func (m *PushNotificationRegistration) GetUnregister() bool {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
return m.Unregister
|
return m.Unregister
|
||||||
}
|
}
|
||||||
|
@ -245,7 +198,7 @@ func (m *PushNotificationRegistrationResponse) Reset() { *m = PushNotifi
|
||||||
func (m *PushNotificationRegistrationResponse) String() string { return proto.CompactTextString(m) }
|
func (m *PushNotificationRegistrationResponse) String() string { return proto.CompactTextString(m) }
|
||||||
func (*PushNotificationRegistrationResponse) ProtoMessage() {}
|
func (*PushNotificationRegistrationResponse) ProtoMessage() {}
|
||||||
func (*PushNotificationRegistrationResponse) Descriptor() ([]byte, []int) {
|
func (*PushNotificationRegistrationResponse) Descriptor() ([]byte, []int) {
|
||||||
return fileDescriptor_200acd86044eaa5d, []int{2}
|
return fileDescriptor_200acd86044eaa5d, []int{1}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *PushNotificationRegistrationResponse) XXX_Unmarshal(b []byte) error {
|
func (m *PushNotificationRegistrationResponse) XXX_Unmarshal(b []byte) error {
|
||||||
|
@ -300,7 +253,7 @@ func (m *PushNotificationAdvertisementInfo) Reset() { *m = PushNotificat
|
||||||
func (m *PushNotificationAdvertisementInfo) String() string { return proto.CompactTextString(m) }
|
func (m *PushNotificationAdvertisementInfo) String() string { return proto.CompactTextString(m) }
|
||||||
func (*PushNotificationAdvertisementInfo) ProtoMessage() {}
|
func (*PushNotificationAdvertisementInfo) ProtoMessage() {}
|
||||||
func (*PushNotificationAdvertisementInfo) Descriptor() ([]byte, []int) {
|
func (*PushNotificationAdvertisementInfo) Descriptor() ([]byte, []int) {
|
||||||
return fileDescriptor_200acd86044eaa5d, []int{3}
|
return fileDescriptor_200acd86044eaa5d, []int{2}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *PushNotificationAdvertisementInfo) XXX_Unmarshal(b []byte) error {
|
func (m *PushNotificationAdvertisementInfo) XXX_Unmarshal(b []byte) error {
|
||||||
|
@ -353,7 +306,7 @@ func (m *ContactCodeAdvertisement) Reset() { *m = ContactCodeAdvertiseme
|
||||||
func (m *ContactCodeAdvertisement) String() string { return proto.CompactTextString(m) }
|
func (m *ContactCodeAdvertisement) String() string { return proto.CompactTextString(m) }
|
||||||
func (*ContactCodeAdvertisement) ProtoMessage() {}
|
func (*ContactCodeAdvertisement) ProtoMessage() {}
|
||||||
func (*ContactCodeAdvertisement) Descriptor() ([]byte, []int) {
|
func (*ContactCodeAdvertisement) Descriptor() ([]byte, []int) {
|
||||||
return fileDescriptor_200acd86044eaa5d, []int{4}
|
return fileDescriptor_200acd86044eaa5d, []int{3}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *ContactCodeAdvertisement) XXX_Unmarshal(b []byte) error {
|
func (m *ContactCodeAdvertisement) XXX_Unmarshal(b []byte) error {
|
||||||
|
@ -392,7 +345,7 @@ func (m *PushNotificationQuery) Reset() { *m = PushNotificationQuery{} }
|
||||||
func (m *PushNotificationQuery) String() string { return proto.CompactTextString(m) }
|
func (m *PushNotificationQuery) String() string { return proto.CompactTextString(m) }
|
||||||
func (*PushNotificationQuery) ProtoMessage() {}
|
func (*PushNotificationQuery) ProtoMessage() {}
|
||||||
func (*PushNotificationQuery) Descriptor() ([]byte, []int) {
|
func (*PushNotificationQuery) Descriptor() ([]byte, []int) {
|
||||||
return fileDescriptor_200acd86044eaa5d, []int{5}
|
return fileDescriptor_200acd86044eaa5d, []int{4}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *PushNotificationQuery) XXX_Unmarshal(b []byte) error {
|
func (m *PushNotificationQuery) XXX_Unmarshal(b []byte) error {
|
||||||
|
@ -434,7 +387,7 @@ func (m *PushNotificationQueryInfo) Reset() { *m = PushNotificationQuery
|
||||||
func (m *PushNotificationQueryInfo) String() string { return proto.CompactTextString(m) }
|
func (m *PushNotificationQueryInfo) String() string { return proto.CompactTextString(m) }
|
||||||
func (*PushNotificationQueryInfo) ProtoMessage() {}
|
func (*PushNotificationQueryInfo) ProtoMessage() {}
|
||||||
func (*PushNotificationQueryInfo) Descriptor() ([]byte, []int) {
|
func (*PushNotificationQueryInfo) Descriptor() ([]byte, []int) {
|
||||||
return fileDescriptor_200acd86044eaa5d, []int{6}
|
return fileDescriptor_200acd86044eaa5d, []int{5}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *PushNotificationQueryInfo) XXX_Unmarshal(b []byte) error {
|
func (m *PushNotificationQueryInfo) XXX_Unmarshal(b []byte) error {
|
||||||
|
@ -494,7 +447,7 @@ func (m *PushNotificationQueryResponse) Reset() { *m = PushNotificationQ
|
||||||
func (m *PushNotificationQueryResponse) String() string { return proto.CompactTextString(m) }
|
func (m *PushNotificationQueryResponse) String() string { return proto.CompactTextString(m) }
|
||||||
func (*PushNotificationQueryResponse) ProtoMessage() {}
|
func (*PushNotificationQueryResponse) ProtoMessage() {}
|
||||||
func (*PushNotificationQueryResponse) Descriptor() ([]byte, []int) {
|
func (*PushNotificationQueryResponse) Descriptor() ([]byte, []int) {
|
||||||
return fileDescriptor_200acd86044eaa5d, []int{7}
|
return fileDescriptor_200acd86044eaa5d, []int{6}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *PushNotificationQueryResponse) XXX_Unmarshal(b []byte) error {
|
func (m *PushNotificationQueryResponse) XXX_Unmarshal(b []byte) error {
|
||||||
|
@ -534,7 +487,7 @@ func (m *PushNotification) Reset() { *m = PushNotification{} }
|
||||||
func (m *PushNotification) String() string { return proto.CompactTextString(m) }
|
func (m *PushNotification) String() string { return proto.CompactTextString(m) }
|
||||||
func (*PushNotification) ProtoMessage() {}
|
func (*PushNotification) ProtoMessage() {}
|
||||||
func (*PushNotification) Descriptor() ([]byte, []int) {
|
func (*PushNotification) Descriptor() ([]byte, []int) {
|
||||||
return fileDescriptor_200acd86044eaa5d, []int{8}
|
return fileDescriptor_200acd86044eaa5d, []int{7}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *PushNotification) XXX_Unmarshal(b []byte) error {
|
func (m *PushNotification) XXX_Unmarshal(b []byte) error {
|
||||||
|
@ -583,7 +536,7 @@ func (m *PushNotificationRequest) Reset() { *m = PushNotificationRequest
|
||||||
func (m *PushNotificationRequest) String() string { return proto.CompactTextString(m) }
|
func (m *PushNotificationRequest) String() string { return proto.CompactTextString(m) }
|
||||||
func (*PushNotificationRequest) ProtoMessage() {}
|
func (*PushNotificationRequest) ProtoMessage() {}
|
||||||
func (*PushNotificationRequest) Descriptor() ([]byte, []int) {
|
func (*PushNotificationRequest) Descriptor() ([]byte, []int) {
|
||||||
return fileDescriptor_200acd86044eaa5d, []int{9}
|
return fileDescriptor_200acd86044eaa5d, []int{8}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *PushNotificationRequest) XXX_Unmarshal(b []byte) error {
|
func (m *PushNotificationRequest) XXX_Unmarshal(b []byte) error {
|
||||||
|
@ -643,7 +596,7 @@ func (m *PushNotificationAcknowledgement) Reset() { *m = PushNotificatio
|
||||||
func (m *PushNotificationAcknowledgement) String() string { return proto.CompactTextString(m) }
|
func (m *PushNotificationAcknowledgement) String() string { return proto.CompactTextString(m) }
|
||||||
func (*PushNotificationAcknowledgement) ProtoMessage() {}
|
func (*PushNotificationAcknowledgement) ProtoMessage() {}
|
||||||
func (*PushNotificationAcknowledgement) Descriptor() ([]byte, []int) {
|
func (*PushNotificationAcknowledgement) Descriptor() ([]byte, []int) {
|
||||||
return fileDescriptor_200acd86044eaa5d, []int{10}
|
return fileDescriptor_200acd86044eaa5d, []int{9}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *PushNotificationAcknowledgement) XXX_Unmarshal(b []byte) error {
|
func (m *PushNotificationAcknowledgement) XXX_Unmarshal(b []byte) error {
|
||||||
|
@ -672,10 +625,9 @@ func (m *PushNotificationAcknowledgement) GetId() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
proto.RegisterEnum("protobuf.PushNotificationOptions_TokenType", PushNotificationOptions_TokenType_name, PushNotificationOptions_TokenType_value)
|
proto.RegisterEnum("protobuf.PushNotificationRegistration_TokenType", PushNotificationRegistration_TokenType_name, PushNotificationRegistration_TokenType_value)
|
||||||
proto.RegisterEnum("protobuf.PushNotificationRegistrationResponse_ErrorType", PushNotificationRegistrationResponse_ErrorType_name, PushNotificationRegistrationResponse_ErrorType_value)
|
proto.RegisterEnum("protobuf.PushNotificationRegistrationResponse_ErrorType", PushNotificationRegistrationResponse_ErrorType_name, PushNotificationRegistrationResponse_ErrorType_value)
|
||||||
proto.RegisterType((*PushNotificationTokenPair)(nil), "protobuf.PushNotificationTokenPair")
|
proto.RegisterType((*PushNotificationRegistration)(nil), "protobuf.PushNotificationRegistration")
|
||||||
proto.RegisterType((*PushNotificationOptions)(nil), "protobuf.PushNotificationOptions")
|
|
||||||
proto.RegisterType((*PushNotificationRegistrationResponse)(nil), "protobuf.PushNotificationRegistrationResponse")
|
proto.RegisterType((*PushNotificationRegistrationResponse)(nil), "protobuf.PushNotificationRegistrationResponse")
|
||||||
proto.RegisterType((*PushNotificationAdvertisementInfo)(nil), "protobuf.PushNotificationAdvertisementInfo")
|
proto.RegisterType((*PushNotificationAdvertisementInfo)(nil), "protobuf.PushNotificationAdvertisementInfo")
|
||||||
proto.RegisterType((*ContactCodeAdvertisement)(nil), "protobuf.ContactCodeAdvertisement")
|
proto.RegisterType((*ContactCodeAdvertisement)(nil), "protobuf.ContactCodeAdvertisement")
|
||||||
|
@ -690,54 +642,53 @@ func init() {
|
||||||
func init() { proto.RegisterFile("push_notifications.proto", fileDescriptor_200acd86044eaa5d) }
|
func init() { proto.RegisterFile("push_notifications.proto", fileDescriptor_200acd86044eaa5d) }
|
||||||
|
|
||||||
var fileDescriptor_200acd86044eaa5d = []byte{
|
var fileDescriptor_200acd86044eaa5d = []byte{
|
||||||
// 781 bytes of a gzipped FileDescriptorProto
|
// 763 bytes of a gzipped FileDescriptorProto
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x55, 0xdd, 0x6e, 0xe2, 0x46,
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0xdd, 0x6e, 0xda, 0x48,
|
||||||
0x14, 0xae, 0x0d, 0x49, 0xf0, 0x09, 0x25, 0x64, 0x94, 0x1f, 0x37, 0x52, 0x1a, 0xe2, 0x56, 0x2a,
|
0x14, 0x5e, 0x1b, 0x92, 0xe0, 0x13, 0x96, 0x90, 0x51, 0x7e, 0xbc, 0xd1, 0x66, 0x43, 0xbc, 0x2b,
|
||||||
0x6a, 0x25, 0xa4, 0xa6, 0x52, 0x9b, 0x5b, 0x4a, 0x9c, 0xd6, 0x4d, 0x30, 0x74, 0x80, 0xfe, 0x5c,
|
0x2d, 0x6a, 0x25, 0xd4, 0xa6, 0x52, 0x9b, 0x5b, 0x4a, 0x9c, 0xd6, 0x4a, 0x30, 0x74, 0x80, 0xfe,
|
||||||
0x59, 0xc6, 0x1e, 0xc2, 0x08, 0xc7, 0xf6, 0x7a, 0xc6, 0x89, 0xb8, 0x58, 0x69, 0x9f, 0x60, 0xdf,
|
0x5c, 0x59, 0xc6, 0x1e, 0x82, 0x85, 0xe3, 0xa1, 0x9e, 0x71, 0x22, 0x2e, 0x2a, 0xf5, 0x09, 0xfa,
|
||||||
0x64, 0x6f, 0x72, 0xbb, 0x2f, 0xb7, 0xf2, 0xd8, 0x06, 0x62, 0x48, 0x94, 0x2b, 0x7c, 0xce, 0x9c,
|
0x26, 0xbd, 0xc9, 0x3b, 0xf4, 0xbd, 0x2a, 0x8f, 0x6d, 0x42, 0x80, 0x44, 0x5c, 0xd9, 0xe7, 0x9b,
|
||||||
0xdf, 0xef, 0x9c, 0xef, 0x00, 0x6a, 0x18, 0xb3, 0xa9, 0xe5, 0x07, 0x9c, 0x4e, 0xa8, 0x63, 0x73,
|
0xef, 0xcc, 0xcc, 0xf9, 0xce, 0xf9, 0x06, 0xd4, 0x71, 0xc4, 0x86, 0x56, 0x40, 0xb9, 0x37, 0xf0,
|
||||||
0x1a, 0xf8, 0xac, 0x15, 0x46, 0x01, 0x0f, 0x50, 0x45, 0xfc, 0x8c, 0xe3, 0x89, 0xd6, 0x87, 0x6f,
|
0x1c, 0x9b, 0x7b, 0x34, 0x60, 0xb5, 0x71, 0x48, 0x39, 0x45, 0x05, 0xf1, 0xe9, 0x47, 0x03, 0xed,
|
||||||
0xfa, 0x31, 0x9b, 0x9a, 0x2b, 0x46, 0xc3, 0x60, 0x46, 0xfc, 0xbe, 0x4d, 0x23, 0x74, 0x00, 0x5b,
|
0x57, 0x0e, 0xfe, 0x6e, 0x47, 0x6c, 0x68, 0xce, 0xb0, 0x30, 0xb9, 0xf2, 0x18, 0x0f, 0xc5, 0x3f,
|
||||||
0x3c, 0x11, 0x54, 0xa9, 0x21, 0x35, 0xab, 0x38, 0x15, 0xd0, 0x29, 0x40, 0x18, 0x8f, 0x3d, 0xea,
|
0x6a, 0x01, 0x70, 0x3a, 0x22, 0x81, 0xc5, 0x27, 0x63, 0xa2, 0x4a, 0x15, 0xa9, 0x5a, 0x3a, 0x79,
|
||||||
0x58, 0x33, 0x32, 0x57, 0x65, 0xf1, 0xa4, 0xa4, 0x9a, 0x1b, 0x32, 0xd7, 0x3e, 0x97, 0xe0, 0xb8,
|
0x51, 0xcb, 0xf2, 0x6b, 0x4f, 0xe5, 0xd6, 0xba, 0x71, 0x62, 0x77, 0x32, 0x26, 0x58, 0xe1, 0xd9,
|
||||||
0x18, 0xb2, 0x17, 0x8a, 0xec, 0xe8, 0x2f, 0x00, 0x11, 0xc3, 0xe2, 0xf3, 0x90, 0x88, 0xa8, 0xb5,
|
0x2f, 0xda, 0x81, 0x35, 0x11, 0xa8, 0x72, 0x45, 0xaa, 0x2a, 0x38, 0x09, 0xd0, 0xff, 0xb0, 0xe5,
|
||||||
0x8b, 0x9f, 0x5a, 0x79, 0x31, 0xad, 0x17, 0xdc, 0x5a, 0xa2, 0xa2, 0xe1, 0x3c, 0x24, 0x58, 0xe1,
|
0x05, 0x8c, 0xdb, 0xbe, 0x2f, 0x52, 0x2d, 0xcf, 0x55, 0x73, 0x62, 0xbd, 0x34, 0x0b, 0x1b, 0x2e,
|
||||||
0xf9, 0xe7, 0xb2, 0xb8, 0xa4, 0x02, 0x25, 0x2f, 0xee, 0x07, 0xd8, 0xa3, 0x3e, 0xe3, 0xb6, 0xe7,
|
0x3a, 0x86, 0xa2, 0xed, 0x38, 0x84, 0x31, 0x2b, 0xd9, 0x25, 0x2f, 0x58, 0x9b, 0x09, 0x26, 0x0e,
|
||||||
0x89, 0x08, 0x16, 0x75, 0xd5, 0x92, 0x78, 0xaf, 0xad, 0xaa, 0x0d, 0x17, 0x9d, 0x43, 0xd5, 0x76,
|
0x44, 0x2a, 0x6c, 0x90, 0xc0, 0xee, 0xfb, 0xc4, 0x55, 0xd7, 0x2a, 0x52, 0xb5, 0x80, 0xb3, 0x30,
|
||||||
0x1c, 0xc2, 0x98, 0x95, 0x46, 0x29, 0x0b, 0xab, 0xdd, 0x54, 0x27, 0x12, 0x22, 0x15, 0x76, 0x88,
|
0x5e, 0xb9, 0x21, 0x21, 0xf3, 0x68, 0xa0, 0xae, 0x57, 0xa4, 0x6a, 0x1e, 0x67, 0x21, 0x7a, 0x06,
|
||||||
0x6f, 0x8f, 0x3d, 0xe2, 0xaa, 0x5b, 0x0d, 0xa9, 0x59, 0xc1, 0xb9, 0x98, 0xbc, 0x3c, 0x90, 0x88,
|
0xdb, 0xb6, 0xef, 0xd3, 0x5b, 0xe2, 0x5a, 0x11, 0x23, 0xa1, 0xe5, 0x7b, 0x8c, 0xab, 0x1b, 0x95,
|
||||||
0xd1, 0xc0, 0x57, 0xb7, 0x1b, 0x52, 0xb3, 0x8c, 0x73, 0x11, 0xfd, 0x08, 0xfb, 0xb6, 0xe7, 0x05,
|
0x5c, 0xb5, 0x88, 0xb7, 0xd2, 0x85, 0x1e, 0x23, 0xe1, 0xa5, 0xc7, 0x78, 0xcc, 0xed, 0xfb, 0xd4,
|
||||||
0x8f, 0xc4, 0xb5, 0x62, 0x46, 0x22, 0xcb, 0xa3, 0x8c, 0xab, 0x3b, 0x8d, 0x52, 0xb3, 0x8a, 0xf7,
|
0x19, 0x11, 0xd7, 0x72, 0x86, 0x36, 0x4f, 0xb8, 0x85, 0x84, 0x9b, 0x2e, 0x34, 0x86, 0x36, 0x17,
|
||||||
0xb2, 0x87, 0x11, 0x23, 0xd1, 0x2d, 0x65, 0x3c, 0xb1, 0x1d, 0x7b, 0x81, 0x33, 0x23, 0xae, 0xe5,
|
0xdc, 0x7f, 0x00, 0xa2, 0x20, 0x14, 0xa2, 0x90, 0x50, 0x55, 0xc4, 0x75, 0x66, 0x10, 0xed, 0x1c,
|
||||||
0x4c, 0x6d, 0x9e, 0xda, 0x56, 0x52, 0xdb, 0xec, 0xa1, 0x33, 0xb5, 0xb9, 0xb0, 0xfd, 0x16, 0x20,
|
0x94, 0xa9, 0x4a, 0x68, 0x0f, 0x50, 0xcf, 0xbc, 0x30, 0x5b, 0x9f, 0x4c, 0xab, 0xdb, 0xba, 0xd0,
|
||||||
0xf6, 0x23, 0x72, 0x47, 0x19, 0x27, 0x91, 0xaa, 0x88, 0x72, 0x56, 0x34, 0xda, 0x35, 0x28, 0x0b,
|
0x4d, 0xab, 0xfb, 0xa5, 0xad, 0x97, 0xff, 0x40, 0x7f, 0x82, 0x52, 0x6f, 0xa7, 0x58, 0x59, 0x42,
|
||||||
0x94, 0xd0, 0x11, 0xa0, 0x91, 0x79, 0x63, 0xf6, 0xfe, 0x35, 0xad, 0x61, 0xef, 0x46, 0x37, 0xad,
|
0x08, 0x4a, 0xe7, 0x06, 0xd6, 0xdf, 0xd6, 0x3b, 0x7a, 0x8a, 0xc9, 0xda, 0x9d, 0x0c, 0xff, 0x3d,
|
||||||
0xe1, 0xff, 0x7d, 0xbd, 0xfe, 0x15, 0xfa, 0x1a, 0x94, 0x76, 0x3f, 0xd3, 0xd5, 0x25, 0x84, 0xa0,
|
0xd5, 0x0b, 0x4c, 0xd8, 0x98, 0x06, 0x8c, 0xc4, 0x12, 0xb0, 0x48, 0x88, 0x25, 0x9a, 0x59, 0xc0,
|
||||||
0x76, 0x6d, 0x60, 0xfd, 0xf7, 0xf6, 0x40, 0xcf, 0x74, 0xb2, 0xf6, 0x24, 0xc3, 0xf7, 0xc5, 0x31,
|
0x59, 0x88, 0x4c, 0x58, 0x23, 0x61, 0x48, 0x43, 0xd1, 0x98, 0xd2, 0xc9, 0xe9, 0x6a, 0x4d, 0xce,
|
||||||
0x60, 0x91, 0x24, 0xca, 0xbe, 0x59, 0x18, 0xf8, 0x8c, 0x24, 0x10, 0xb0, 0x58, 0x80, 0x25, 0xe6,
|
0x36, 0xae, 0xe9, 0x71, 0xae, 0x68, 0x76, 0xb2, 0x0d, 0x3a, 0x04, 0x08, 0xc9, 0xd7, 0x88, 0x30,
|
||||||
0x58, 0xc1, 0xb9, 0x88, 0x4c, 0xd8, 0x22, 0x51, 0x14, 0x44, 0x62, 0x30, 0xb5, 0x8b, 0xcb, 0x97,
|
0x9e, 0x75, 0xb3, 0x88, 0x95, 0x14, 0x31, 0x5c, 0xed, 0xbb, 0x04, 0xca, 0x34, 0x67, 0xb6, 0x74,
|
||||||
0xe7, 0xbb, 0x29, 0x70, 0x4b, 0x4f, 0x7c, 0xc5, 0xb0, 0xd3, 0x30, 0xc9, 0xbe, 0x45, 0xe4, 0x5d,
|
0x1d, 0xe3, 0x16, 0xce, 0x4a, 0xdf, 0x85, 0xed, 0x66, 0xfd, 0xf2, 0xbc, 0x85, 0x9b, 0xfa, 0x99,
|
||||||
0x4c, 0x18, 0xcf, 0xa7, 0x59, 0xc5, 0x4a, 0xa6, 0x31, 0x5c, 0xed, 0x83, 0x04, 0xca, 0xc2, 0x67,
|
0xd5, 0xd4, 0x3b, 0x9d, 0xfa, 0x3b, 0xbd, 0x2c, 0xa1, 0x1d, 0x28, 0x7f, 0xd4, 0x71, 0xc7, 0x68,
|
||||||
0xb5, 0x75, 0x1d, 0xe3, 0x1e, 0xce, 0x5b, 0x3f, 0x84, 0xfd, 0x6e, 0xfb, 0xf6, 0xba, 0x87, 0xbb,
|
0x99, 0x56, 0xd3, 0xe8, 0x34, 0xeb, 0xdd, 0xc6, 0xfb, 0xb2, 0x8c, 0x0e, 0x60, 0xaf, 0x67, 0x76,
|
||||||
0xfa, 0x95, 0xd5, 0xd5, 0x07, 0x83, 0xf6, 0x1f, 0x7a, 0x5d, 0x42, 0x07, 0x50, 0xff, 0x47, 0xc7,
|
0x7a, 0xed, 0x76, 0x0b, 0x77, 0xf5, 0xb3, 0x59, 0x0d, 0x73, 0xb1, 0x68, 0x86, 0xd9, 0xd5, 0xb1,
|
||||||
0x03, 0xa3, 0x67, 0x5a, 0x5d, 0x63, 0xd0, 0x6d, 0x0f, 0x3b, 0x7f, 0xd6, 0x65, 0x74, 0x02, 0x47,
|
0x59, 0xbf, 0x4c, 0x4e, 0x28, 0xe7, 0xb5, 0x1f, 0x12, 0x1c, 0xcf, 0xd7, 0x56, 0x77, 0x6f, 0x48,
|
||||||
0x23, 0x73, 0x30, 0xea, 0xf7, 0x7b, 0x78, 0xa8, 0x5f, 0xad, 0x62, 0x58, 0x4a, 0x40, 0x33, 0xcc,
|
0xc8, 0x3d, 0x46, 0xae, 0x49, 0xc0, 0x8d, 0x60, 0x40, 0xe3, 0x3a, 0xc6, 0x51, 0xdf, 0xf7, 0x1c,
|
||||||
0xa1, 0x8e, 0xcd, 0xf6, 0x6d, 0x9a, 0xa1, 0x5e, 0xd6, 0x3e, 0x4a, 0x70, 0x5e, 0xec, 0xad, 0xed,
|
0x6b, 0x44, 0x26, 0x42, 0xb4, 0x22, 0x56, 0x12, 0xe4, 0x82, 0x4c, 0x16, 0x06, 0x52, 0x5e, 0x1c,
|
||||||
0x3e, 0x90, 0x88, 0x53, 0x46, 0xee, 0x89, 0xcf, 0x0d, 0x7f, 0x12, 0x14, 0x78, 0x23, 0x15, 0x78,
|
0xc8, 0x55, 0x87, 0x5b, 0xfb, 0x06, 0x6a, 0x83, 0x06, 0xdc, 0x76, 0x78, 0x83, 0xba, 0xe4, 0xc1,
|
||||||
0xb3, 0xb6, 0x90, 0xf2, 0xfa, 0x42, 0xbe, 0x75, 0xb9, 0xb5, 0xf7, 0xa0, 0x76, 0x02, 0x9f, 0xdb,
|
0x55, 0x90, 0x0d, 0x7b, 0x0b, 0x7e, 0xb6, 0xbc, 0x60, 0x40, 0x55, 0xa9, 0x92, 0xab, 0x6e, 0x9e,
|
||||||
0x0e, 0xef, 0x04, 0x2e, 0x79, 0x56, 0x0a, 0xb2, 0xe1, 0x68, 0xed, 0x2e, 0x58, 0xd4, 0x9f, 0x04,
|
0x3c, 0x7f, 0xbc, 0x5f, 0x0b, 0x35, 0xe1, 0x9d, 0xf1, 0x1c, 0x25, 0x46, 0xb5, 0x53, 0xd8, 0x9d,
|
||||||
0xaa, 0xd4, 0x28, 0x35, 0x77, 0x5f, 0xe3, 0xe3, 0x5a, 0x4f, 0xf8, 0x20, 0x2c, 0x98, 0x24, 0x5a,
|
0x4f, 0xfd, 0x10, 0x91, 0x70, 0x82, 0x8e, 0x60, 0xf3, 0x5e, 0x02, 0x26, 0x0e, 0x2c, 0x62, 0x98,
|
||||||
0xed, 0x12, 0x0e, 0x8b, 0xae, 0x7f, 0xc7, 0x24, 0x9a, 0xa3, 0x33, 0xd8, 0x5d, 0x42, 0xc0, 0x44,
|
0x6a, 0xc0, 0xb4, 0x3b, 0x09, 0xfe, 0x5a, 0x9a, 0x2a, 0x14, 0x9c, 0x97, 0x48, 0x5a, 0x49, 0x22,
|
||||||
0xc2, 0x2a, 0x86, 0x05, 0x06, 0x4c, 0x7b, 0x92, 0xd6, 0xef, 0x91, 0x70, 0x15, 0x08, 0x16, 0x21,
|
0x79, 0xa9, 0xff, 0x1f, 0x76, 0x23, 0x37, 0xdf, 0x8d, 0xa5, 0x3e, 0xce, 0x0b, 0xd6, 0xbc, 0x8f,
|
||||||
0x92, 0xde, 0x04, 0x91, 0xbc, 0x91, 0xff, 0xcf, 0xa7, 0x51, 0x2a, 0x4e, 0x63, 0x23, 0x8f, 0xcb,
|
0xb5, 0xcf, 0x70, 0xb8, 0xf4, 0xce, 0x53, 0xaf, 0xbc, 0x81, 0xfc, 0x8c, 0xc0, 0xff, 0x3e, 0x2e,
|
||||||
0xc2, 0xaa, 0xc8, 0x63, 0xed, 0x3f, 0x38, 0xdd, 0x58, 0xf3, 0x82, 0x2b, 0xbf, 0x41, 0x79, 0x05,
|
0xf0, 0xb4, 0x54, 0x2c, 0x12, 0x34, 0x13, 0xca, 0xf3, 0x94, 0x55, 0x44, 0xd8, 0x87, 0x0d, 0xf1,
|
||||||
0xe0, 0xef, 0x5e, 0x06, 0x78, 0xd1, 0x2a, 0x16, 0x0e, 0x9a, 0x09, 0xf5, 0xa2, 0xc9, 0x5b, 0x40,
|
0xa0, 0x4c, 0x8b, 0x5f, 0x8f, 0x43, 0xc3, 0xd5, 0x7e, 0x4a, 0xb0, 0xbf, 0x68, 0x42, 0xe1, 0x24,
|
||||||
0x38, 0x86, 0x1d, 0x71, 0x50, 0x16, 0xcd, 0x6f, 0x27, 0xa2, 0xe1, 0x6a, 0x9f, 0xa4, 0xf5, 0xdb,
|
0xf4, 0x1a, 0x0a, 0xa9, 0xa9, 0x58, 0x7a, 0xd1, 0x83, 0x27, 0x9c, 0x3b, 0xe5, 0xc6, 0x0f, 0xc1,
|
||||||
0x8c, 0x53, 0x26, 0xa1, 0x5f, 0xa1, 0x92, 0x91, 0x8a, 0x65, 0x85, 0x9e, 0xbc, 0xc2, 0xdc, 0x85,
|
0x35, 0x61, 0xcc, 0xbe, 0x22, 0xe2, 0xb0, 0x22, 0xce, 0xc2, 0x58, 0xe2, 0xf4, 0xf7, 0x7e, 0x52,
|
||||||
0x6d, 0x72, 0x08, 0xee, 0x09, 0x63, 0xf6, 0x1d, 0xc9, 0xfe, 0x0b, 0x72, 0x31, 0x81, 0x38, 0xfb,
|
0x95, 0x14, 0xc9, 0x5e, 0xe0, 0x91, 0x15, 0x6f, 0xe4, 0x85, 0xc4, 0xbd, 0x7f, 0x81, 0x47, 0x38,
|
||||||
0x5c, 0x6e, 0xaa, 0x92, 0x69, 0xf2, 0x0b, 0x3c, 0xb3, 0x92, 0x40, 0x34, 0x22, 0xee, 0xf2, 0x02,
|
0x85, 0xb4, 0x97, 0x70, 0xb4, 0x30, 0x83, 0xce, 0x28, 0xa0, 0xb7, 0x3e, 0x71, 0xaf, 0x92, 0x71,
|
||||||
0xcf, 0x70, 0xa6, 0xd2, 0x7e, 0x86, 0xb3, 0xb5, 0x1d, 0x74, 0x66, 0x7e, 0xf0, 0xe8, 0x11, 0xf7,
|
0x2e, 0x81, 0xec, 0xb9, 0xa9, 0x08, 0xb2, 0xe7, 0xf6, 0xd7, 0xc5, 0x9d, 0x5f, 0xfd, 0x0e, 0x00,
|
||||||
0x2e, 0x5d, 0xe7, 0x1a, 0xc8, 0xd4, 0xcd, 0x40, 0x90, 0xa9, 0x3b, 0xde, 0x16, 0x35, 0xff, 0xf2,
|
0x00, 0xff, 0xff, 0x6a, 0xc9, 0xcf, 0x6e, 0xb5, 0x06, 0x00, 0x00,
|
||||||
0x25, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0b, 0xdd, 0xd4, 0xfd, 0x06, 0x00, 0x00,
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,12 +2,7 @@ syntax = "proto3";
|
||||||
|
|
||||||
package protobuf;
|
package protobuf;
|
||||||
|
|
||||||
message PushNotificationTokenPair {
|
message PushNotificationRegistration {
|
||||||
bytes token = 1;
|
|
||||||
bytes public_key = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
message PushNotificationOptions {
|
|
||||||
enum TokenType {
|
enum TokenType {
|
||||||
UNKNOWN_TOKEN_TYPE = 0;
|
UNKNOWN_TOKEN_TYPE = 0;
|
||||||
APN_TOKEN = 1;
|
APN_TOKEN = 1;
|
||||||
|
|
|
@ -126,14 +126,14 @@ func (p *Client) allowedUserList(token []byte) ([][]byte, error) {
|
||||||
return encryptedTokens, nil
|
return encryptedTokens, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Client) buildPushNotificationOptionsMessage() (*protobuf.PushNotificationOptions, error) {
|
func (p *Client) buildPushNotificationRegistrationMessage() (*protobuf.PushNotificationRegistration, error) {
|
||||||
token := uuid.New().String()
|
token := uuid.New().String()
|
||||||
allowedUserList, err := p.allowedUserList([]byte(token))
|
allowedUserList, err := p.allowedUserList([]byte(token))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
options := &protobuf.PushNotificationOptions{
|
options := &protobuf.PushNotificationRegistration{
|
||||||
AccessToken: token,
|
AccessToken: token,
|
||||||
Version: p.lastPushNotificationVersion + 1,
|
Version: p.lastPushNotificationVersion + 1,
|
||||||
InstallationId: p.config.InstallationID,
|
InstallationId: p.config.InstallationID,
|
||||||
|
|
|
@ -67,7 +67,7 @@ func TestBuildPushNotificationRegisterMessage(t *testing.T) {
|
||||||
// Set reader
|
// Set reader
|
||||||
client.reader = bytes.NewReader([]byte(expectedUUID))
|
client.reader = bytes.NewReader([]byte(expectedUUID))
|
||||||
|
|
||||||
options := &protobuf.PushNotificationOptions{
|
options := &protobuf.PushNotificationRegistration{
|
||||||
Version: 1,
|
Version: 1,
|
||||||
AccessToken: expectedUUID,
|
AccessToken: expectedUUID,
|
||||||
Token: myDeviceToken,
|
Token: myDeviceToken,
|
||||||
|
@ -77,7 +77,7 @@ func TestBuildPushNotificationRegisterMessage(t *testing.T) {
|
||||||
AllowedUserList: [][]byte{encryptedToken},
|
AllowedUserList: [][]byte{encryptedToken},
|
||||||
}
|
}
|
||||||
|
|
||||||
actualMessage, err := client.buildPushNotificationOptionsMessage()
|
actualMessage, err := client.buildPushNotificationRegistrationMessage()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
require.Equal(t, options, actualMessage)
|
require.Equal(t, options, actualMessage)
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
package push_notification_server
|
||||||
|
|
||||||
|
import "errors"
|
||||||
|
|
||||||
|
var ErrInvalidPushNotificationRegistrationVersion = errors.New("invalid version")
|
||||||
|
var ErrEmptyPushNotificationRegistrationPayload = errors.New("empty payload")
|
||||||
|
var ErrMalformedPushNotificationRegistrationInstallationID = errors.New("invalid installationID")
|
||||||
|
var ErrEmptyPushNotificationRegistrationPublicKey = errors.New("no public key")
|
||||||
|
var ErrCouldNotUnmarshalPushNotificationRegistration = errors.New("could not unmarshal preferences")
|
||||||
|
var ErrInvalidCiphertextLength = errors.New("invalid cyphertext length")
|
||||||
|
var ErrMalformedPushNotificationRegistrationAccessToken = errors.New("invalid access token")
|
||||||
|
var ErrMalformedPushNotificationRegistrationDeviceToken = errors.New("invalid device token")
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"crypto/aes"
|
"crypto/aes"
|
||||||
"crypto/cipher"
|
"crypto/cipher"
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
|
"golang.org/x/crypto/sha3"
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
|
@ -18,15 +19,6 @@ import (
|
||||||
const encryptedPayloadKeyLength = 16
|
const encryptedPayloadKeyLength = 16
|
||||||
const nonceLength = 12
|
const nonceLength = 12
|
||||||
|
|
||||||
var ErrInvalidPushNotificationOptionsVersion = errors.New("invalid version")
|
|
||||||
var ErrEmptyPushNotificationOptionsPayload = errors.New("empty payload")
|
|
||||||
var ErrMalformedPushNotificationOptionsInstallationID = errors.New("invalid installationID")
|
|
||||||
var ErrEmptyPushNotificationOptionsPublicKey = errors.New("no public key")
|
|
||||||
var ErrCouldNotUnmarshalPushNotificationOptions = errors.New("could not unmarshal preferences")
|
|
||||||
var ErrInvalidCiphertextLength = errors.New("invalid cyphertext length")
|
|
||||||
var ErrMalformedPushNotificationOptionsAccessToken = errors.New("invalid access token")
|
|
||||||
var ErrMalformedPushNotificationOptionsDeviceToken = errors.New("invalid device token")
|
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
// Identity is our identity key
|
// Identity is our identity key
|
||||||
Identity *ecdsa.PrivateKey
|
Identity *ecdsa.PrivateKey
|
||||||
|
@ -70,13 +62,13 @@ func (p *Server) decryptRegistration(publicKey *ecdsa.PublicKey, payload []byte)
|
||||||
|
|
||||||
// ValidateRegistration validates a new message against the last one received for a given installationID and and public key
|
// ValidateRegistration validates a new message against the last one received for a given installationID and and public key
|
||||||
// and return the decrypted message
|
// and return the decrypted message
|
||||||
func (p *Server) ValidateRegistration(publicKey *ecdsa.PublicKey, payload []byte) (*protobuf.PushNotificationOptions, error) {
|
func (p *Server) ValidateRegistration(publicKey *ecdsa.PublicKey, payload []byte) (*protobuf.PushNotificationRegistration, error) {
|
||||||
if payload == nil {
|
if payload == nil {
|
||||||
return nil, ErrEmptyPushNotificationOptionsPayload
|
return nil, ErrEmptyPushNotificationRegistrationPayload
|
||||||
}
|
}
|
||||||
|
|
||||||
if publicKey == nil {
|
if publicKey == nil {
|
||||||
return nil, ErrEmptyPushNotificationOptionsPublicKey
|
return nil, ErrEmptyPushNotificationRegistrationPublicKey
|
||||||
}
|
}
|
||||||
|
|
||||||
decryptedPayload, err := p.decryptRegistration(publicKey, payload)
|
decryptedPayload, err := p.decryptRegistration(publicKey, payload)
|
||||||
|
@ -84,52 +76,82 @@ func (p *Server) ValidateRegistration(publicKey *ecdsa.PublicKey, payload []byte
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
options := &protobuf.PushNotificationOptions{}
|
registration := &protobuf.PushNotificationRegistration{}
|
||||||
|
|
||||||
if err := proto.Unmarshal(decryptedPayload, options); err != nil {
|
if err := proto.Unmarshal(decryptedPayload, registration); err != nil {
|
||||||
return nil, ErrCouldNotUnmarshalPushNotificationOptions
|
return nil, ErrCouldNotUnmarshalPushNotificationRegistration
|
||||||
}
|
}
|
||||||
|
|
||||||
if options.Version < 1 {
|
if registration.Version < 1 {
|
||||||
return nil, ErrInvalidPushNotificationOptionsVersion
|
return nil, ErrInvalidPushNotificationRegistrationVersion
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := p.validateUUID(options.InstallationId); err != nil {
|
if err := p.validateUUID(registration.InstallationId); err != nil {
|
||||||
return nil, ErrMalformedPushNotificationOptionsInstallationID
|
return nil, ErrMalformedPushNotificationRegistrationInstallationID
|
||||||
}
|
}
|
||||||
|
|
||||||
previousOptions, err := p.persistence.GetPushNotificationOptions(publicKey, options.InstallationId)
|
previousRegistration, err := p.persistence.GetPushNotificationRegistration(publicKey, registration.InstallationId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if previousOptions != nil && options.Version <= previousOptions.Version {
|
if previousRegistration != nil && registration.Version <= previousRegistration.Version {
|
||||||
return nil, ErrInvalidPushNotificationOptionsVersion
|
return nil, ErrInvalidPushNotificationRegistrationVersion
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unregistering message
|
// Unregistering message
|
||||||
if options.Unregister {
|
if registration.Unregister {
|
||||||
return options, nil
|
return registration, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := p.validateUUID(options.AccessToken); err != nil {
|
if err := p.validateUUID(registration.AccessToken); err != nil {
|
||||||
return nil, ErrMalformedPushNotificationOptionsAccessToken
|
return nil, ErrMalformedPushNotificationRegistrationAccessToken
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(options.Token) == 0 {
|
if len(registration.Token) == 0 {
|
||||||
return nil, ErrMalformedPushNotificationOptionsDeviceToken
|
return nil, ErrMalformedPushNotificationRegistrationDeviceToken
|
||||||
}
|
}
|
||||||
|
|
||||||
return options, nil
|
return registration, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Server) HandlePushNotificationOptions(publicKey *ecdsa.PublicKey, payload []byte) error {
|
func (p *Server) HandlePushNotificationRegistration(publicKey *ecdsa.PublicKey, payload []byte) *protobuf.PushNotificationRegistrationResponse {
|
||||||
|
response := &protobuf.PushNotificationRegistrationResponse{
|
||||||
_, err := p.ValidateRegistration(publicKey, payload)
|
RequestId: shake256(payload),
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
return nil
|
|
||||||
|
registration, err := p.ValidateRegistration(publicKey, payload)
|
||||||
|
if registration != nil {
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
if err == ErrInvalidPushNotificationRegistrationVersion {
|
||||||
|
response.Error = protobuf.PushNotificationRegistrationResponse_VERSION_MISMATCH
|
||||||
|
} else {
|
||||||
|
response.Error = protobuf.PushNotificationRegistrationResponse_MALFORMED_MESSAGE
|
||||||
|
}
|
||||||
|
return response
|
||||||
|
}
|
||||||
|
|
||||||
|
if registration.Unregister {
|
||||||
|
// We save an empty registration, only keeping version and installation-id
|
||||||
|
emptyRegistration := &protobuf.PushNotificationRegistration{
|
||||||
|
Version: registration.Version,
|
||||||
|
InstallationId: registration.InstallationId,
|
||||||
|
}
|
||||||
|
if err := p.persistence.SavePushNotificationRegistration(publicKey, emptyRegistration); err != nil {
|
||||||
|
response.Error = protobuf.PushNotificationRegistrationResponse_INTERNAL_ERROR
|
||||||
|
return response
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if err := p.persistence.SavePushNotificationRegistration(publicKey, registration); err != nil {
|
||||||
|
response.Error = protobuf.PushNotificationRegistrationResponse_INTERNAL_ERROR
|
||||||
|
return response
|
||||||
|
}
|
||||||
|
|
||||||
|
response.Success = true
|
||||||
|
|
||||||
|
return response
|
||||||
}
|
}
|
||||||
|
|
||||||
func decrypt(cyphertext []byte, key []byte) ([]byte, error) {
|
func decrypt(cyphertext []byte, key []byte) ([]byte, error) {
|
||||||
|
@ -169,3 +191,9 @@ func encrypt(plaintext []byte, key []byte, reader io.Reader) ([]byte, error) {
|
||||||
|
|
||||||
return gcm.Seal(nonce, nonce, plaintext, nil), nil
|
return gcm.Seal(nonce, nonce, plaintext, nil), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func shake256(buf []byte) []byte {
|
||||||
|
h := make([]byte, 64)
|
||||||
|
sha3.ShakeSum256(h, buf)
|
||||||
|
return h
|
||||||
|
}
|
||||||
|
|
|
@ -11,12 +11,12 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type Persistence interface {
|
type Persistence interface {
|
||||||
// GetPushNotificationOptions retrieve a push notification options from storage given a public key and installation id
|
// GetPushNotificationRegistration retrieve a push notification registration from storage given a public key and installation id
|
||||||
GetPushNotificationOptions(publicKey *ecdsa.PublicKey, installationID string) (*protobuf.PushNotificationOptions, error)
|
GetPushNotificationRegistration(publicKey *ecdsa.PublicKey, installationID string) (*protobuf.PushNotificationRegistration, error)
|
||||||
// DeletePushNotificationOptions deletes a push notification options from storage given a public key and installation id
|
// DeletePushNotificationRegistration deletes a push notification registration from storage given a public key and installation id
|
||||||
DeletePushNotificationOptions(publicKey *ecdsa.PublicKey, installationID string) error
|
DeletePushNotificationRegistration(publicKey *ecdsa.PublicKey, installationID string) error
|
||||||
// SavePushNotificationOptions saves a push notification option to the db
|
// SavePushNotificationRegistration saves a push notification option to the db
|
||||||
SavePushNotificationOptions(publicKey *ecdsa.PublicKey, options *protobuf.PushNotificationOptions) error
|
SavePushNotificationRegistration(publicKey *ecdsa.PublicKey, registration *protobuf.PushNotificationRegistration) error
|
||||||
}
|
}
|
||||||
|
|
||||||
type SQLitePersistence struct {
|
type SQLitePersistence struct {
|
||||||
|
@ -27,9 +27,9 @@ func NewSQLitePersistence(db *sql.DB) Persistence {
|
||||||
return &SQLitePersistence{db: db}
|
return &SQLitePersistence{db: db}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *SQLitePersistence) GetPushNotificationOptions(publicKey *ecdsa.PublicKey, installationID string) (*protobuf.PushNotificationOptions, error) {
|
func (p *SQLitePersistence) GetPushNotificationRegistration(publicKey *ecdsa.PublicKey, installationID string) (*protobuf.PushNotificationRegistration, error) {
|
||||||
var marshaledOptions []byte
|
var marshaledRegistration []byte
|
||||||
err := p.db.QueryRow(`SELECT registration FROM push_notification_server_registrations WHERE public_key = ? AND installation_id = ?`, crypto.CompressPubkey(publicKey), installationID).Scan(&marshaledOptions)
|
err := p.db.QueryRow(`SELECT registration FROM push_notification_server_registrations WHERE public_key = ? AND installation_id = ?`, crypto.CompressPubkey(publicKey), installationID).Scan(&marshaledRegistration)
|
||||||
|
|
||||||
if err == sql.ErrNoRows {
|
if err == sql.ErrNoRows {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
@ -37,26 +37,26 @@ func (p *SQLitePersistence) GetPushNotificationOptions(publicKey *ecdsa.PublicKe
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
options := &protobuf.PushNotificationOptions{}
|
registration := &protobuf.PushNotificationRegistration{}
|
||||||
|
|
||||||
if err := proto.Unmarshal(marshaledOptions, options); err != nil {
|
if err := proto.Unmarshal(marshaledRegistration, registration); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return options, nil
|
return registration, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *SQLitePersistence) SavePushNotificationOptions(publicKey *ecdsa.PublicKey, options *protobuf.PushNotificationOptions) error {
|
func (p *SQLitePersistence) SavePushNotificationRegistration(publicKey *ecdsa.PublicKey, registration *protobuf.PushNotificationRegistration) error {
|
||||||
compressedPublicKey := crypto.CompressPubkey(publicKey)
|
compressedPublicKey := crypto.CompressPubkey(publicKey)
|
||||||
marshaledOptions, err := proto.Marshal(options)
|
marshaledRegistration, err := proto.Marshal(registration)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = p.db.Exec(`INSERT INTO push_notification_server_registrations (public_key, installation_id, version, registration) VALUES (?, ?, ?, ?)`, compressedPublicKey, options.InstallationId, options.Version, marshaledOptions)
|
_, err = p.db.Exec(`INSERT INTO push_notification_server_registrations (public_key, installation_id, version, registration) VALUES (?, ?, ?, ?)`, compressedPublicKey, registration.InstallationId, registration.Version, marshaledRegistration)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *SQLitePersistence) DeletePushNotificationOptions(publicKey *ecdsa.PublicKey, installationID string) error {
|
func (p *SQLitePersistence) DeletePushNotificationRegistration(publicKey *ecdsa.PublicKey, installationID string) error {
|
||||||
_, err := p.db.Exec(`DELETE FROM push_notification_server_registrations WHERE public_key = ? AND installation_id = ?`, crypto.CompressPubkey(publicKey), installationID)
|
_, err := p.db.Exec(`DELETE FROM push_notification_server_registrations WHERE public_key = ? AND installation_id = ?`, crypto.CompressPubkey(publicKey), installationID)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,15 +44,15 @@ func (s *SQLitePersistenceSuite) TestSaveAndRetrieve() {
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
installationID := "54242d02-bb92-11ea-b3de-0242ac130004"
|
installationID := "54242d02-bb92-11ea-b3de-0242ac130004"
|
||||||
|
|
||||||
options := &protobuf.PushNotificationOptions{
|
registration := &protobuf.PushNotificationRegistration{
|
||||||
InstallationId: installationID,
|
InstallationId: installationID,
|
||||||
Version: 5,
|
Version: 5,
|
||||||
}
|
}
|
||||||
|
|
||||||
s.Require().NoError(s.persistence.SavePushNotificationOptions(&key.PublicKey, options))
|
s.Require().NoError(s.persistence.SavePushNotificationRegistration(&key.PublicKey, registration))
|
||||||
|
|
||||||
retrievedOptions, err := s.persistence.GetPushNotificationOptions(&key.PublicKey, installationID)
|
retrievedRegistration, err := s.persistence.GetPushNotificationRegistration(&key.PublicKey, installationID)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
s.Require().True(proto.Equal(options, retrievedOptions))
|
s.Require().True(proto.Equal(registration, retrievedRegistration))
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,11 +54,11 @@ func (s *ServerSuite) TestPushNotificationServerValidateRegistration() {
|
||||||
|
|
||||||
// Empty payload
|
// Empty payload
|
||||||
_, err = server.ValidateRegistration(&key.PublicKey, nil)
|
_, err = server.ValidateRegistration(&key.PublicKey, nil)
|
||||||
s.Require().Equal(ErrEmptyPushNotificationOptionsPayload, err)
|
s.Require().Equal(ErrEmptyPushNotificationRegistrationPayload, err)
|
||||||
|
|
||||||
// Empty key
|
// Empty key
|
||||||
_, err = server.ValidateRegistration(nil, []byte("payload"))
|
_, err = server.ValidateRegistration(nil, []byte("payload"))
|
||||||
s.Require().Equal(ErrEmptyPushNotificationOptionsPublicKey, err)
|
s.Require().Equal(ErrEmptyPushNotificationRegistrationPublicKey, err)
|
||||||
|
|
||||||
// Invalid cyphertext length
|
// Invalid cyphertext length
|
||||||
_, err = server.ValidateRegistration(&key.PublicKey, []byte("too short"))
|
_, err = server.ValidateRegistration(&key.PublicKey, []byte("too short"))
|
||||||
|
@ -82,10 +82,10 @@ func (s *ServerSuite) TestPushNotificationServerValidateRegistration() {
|
||||||
cyphertext, err = encrypt([]byte("plaintext"), sharedKey, rand.Reader)
|
cyphertext, err = encrypt([]byte("plaintext"), sharedKey, rand.Reader)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
_, err = server.ValidateRegistration(&key.PublicKey, cyphertext)
|
_, err = server.ValidateRegistration(&key.PublicKey, cyphertext)
|
||||||
s.Require().Equal(ErrCouldNotUnmarshalPushNotificationOptions, err)
|
s.Require().Equal(ErrCouldNotUnmarshalPushNotificationRegistration, err)
|
||||||
|
|
||||||
// Missing installationID
|
// Missing installationID
|
||||||
payload, err := proto.Marshal(&protobuf.PushNotificationOptions{
|
payload, err := proto.Marshal(&protobuf.PushNotificationRegistration{
|
||||||
AccessToken: accessToken,
|
AccessToken: accessToken,
|
||||||
Version: 1,
|
Version: 1,
|
||||||
})
|
})
|
||||||
|
@ -94,10 +94,10 @@ func (s *ServerSuite) TestPushNotificationServerValidateRegistration() {
|
||||||
cyphertext, err = encrypt(payload, sharedKey, rand.Reader)
|
cyphertext, err = encrypt(payload, sharedKey, rand.Reader)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
_, err = server.ValidateRegistration(&key.PublicKey, cyphertext)
|
_, err = server.ValidateRegistration(&key.PublicKey, cyphertext)
|
||||||
s.Require().Equal(ErrMalformedPushNotificationOptionsInstallationID, err)
|
s.Require().Equal(ErrMalformedPushNotificationRegistrationInstallationID, err)
|
||||||
|
|
||||||
// Malformed installationID
|
// Malformed installationID
|
||||||
payload, err = proto.Marshal(&protobuf.PushNotificationOptions{
|
payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{
|
||||||
AccessToken: accessToken,
|
AccessToken: accessToken,
|
||||||
InstallationId: "abc",
|
InstallationId: "abc",
|
||||||
Version: 1,
|
Version: 1,
|
||||||
|
@ -105,10 +105,10 @@ func (s *ServerSuite) TestPushNotificationServerValidateRegistration() {
|
||||||
cyphertext, err = encrypt(payload, sharedKey, rand.Reader)
|
cyphertext, err = encrypt(payload, sharedKey, rand.Reader)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
_, err = server.ValidateRegistration(&key.PublicKey, cyphertext)
|
_, err = server.ValidateRegistration(&key.PublicKey, cyphertext)
|
||||||
s.Require().Equal(ErrMalformedPushNotificationOptionsInstallationID, err)
|
s.Require().Equal(ErrMalformedPushNotificationRegistrationInstallationID, err)
|
||||||
|
|
||||||
// Version set to 0
|
// Version set to 0
|
||||||
payload, err = proto.Marshal(&protobuf.PushNotificationOptions{
|
payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{
|
||||||
AccessToken: accessToken,
|
AccessToken: accessToken,
|
||||||
InstallationId: installationID,
|
InstallationId: installationID,
|
||||||
})
|
})
|
||||||
|
@ -117,10 +117,10 @@ func (s *ServerSuite) TestPushNotificationServerValidateRegistration() {
|
||||||
cyphertext, err = encrypt(payload, sharedKey, rand.Reader)
|
cyphertext, err = encrypt(payload, sharedKey, rand.Reader)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
_, err = server.ValidateRegistration(&key.PublicKey, cyphertext)
|
_, err = server.ValidateRegistration(&key.PublicKey, cyphertext)
|
||||||
s.Require().Equal(ErrInvalidPushNotificationOptionsVersion, err)
|
s.Require().Equal(ErrInvalidPushNotificationRegistrationVersion, err)
|
||||||
|
|
||||||
// Version lower than previous one
|
// Version lower than previous one
|
||||||
payload, err = proto.Marshal(&protobuf.PushNotificationOptions{
|
payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{
|
||||||
AccessToken: accessToken,
|
AccessToken: accessToken,
|
||||||
InstallationId: installationID,
|
InstallationId: installationID,
|
||||||
Version: 1,
|
Version: 1,
|
||||||
|
@ -130,20 +130,20 @@ func (s *ServerSuite) TestPushNotificationServerValidateRegistration() {
|
||||||
cyphertext, err = encrypt(payload, sharedKey, rand.Reader)
|
cyphertext, err = encrypt(payload, sharedKey, rand.Reader)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
// Setup mock
|
// Setup persistence
|
||||||
s.Require().NoError(s.persistence.SavePushNotificationOptions(&key.PublicKey, &protobuf.PushNotificationOptions{
|
s.Require().NoError(s.persistence.SavePushNotificationRegistration(&key.PublicKey, &protobuf.PushNotificationRegistration{
|
||||||
AccessToken: accessToken,
|
AccessToken: accessToken,
|
||||||
InstallationId: installationID,
|
InstallationId: installationID,
|
||||||
Version: 2}))
|
Version: 2}))
|
||||||
|
|
||||||
_, err = server.ValidateRegistration(&key.PublicKey, cyphertext)
|
_, err = server.ValidateRegistration(&key.PublicKey, cyphertext)
|
||||||
s.Require().Equal(ErrInvalidPushNotificationOptionsVersion, err)
|
s.Require().Equal(ErrInvalidPushNotificationRegistrationVersion, err)
|
||||||
|
|
||||||
// Cleanup mock
|
// Cleanup persistence
|
||||||
s.Require().NoError(s.persistence.DeletePushNotificationOptions(&key.PublicKey, installationID))
|
s.Require().NoError(s.persistence.DeletePushNotificationRegistration(&key.PublicKey, installationID))
|
||||||
|
|
||||||
// Unregistering message
|
// Unregistering message
|
||||||
payload, err = proto.Marshal(&protobuf.PushNotificationOptions{
|
payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{
|
||||||
InstallationId: installationID,
|
InstallationId: installationID,
|
||||||
Unregister: true,
|
Unregister: true,
|
||||||
Version: 1,
|
Version: 1,
|
||||||
|
@ -156,7 +156,7 @@ func (s *ServerSuite) TestPushNotificationServerValidateRegistration() {
|
||||||
s.Require().Nil(err)
|
s.Require().Nil(err)
|
||||||
|
|
||||||
// Missing access token
|
// Missing access token
|
||||||
payload, err = proto.Marshal(&protobuf.PushNotificationOptions{
|
payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{
|
||||||
InstallationId: installationID,
|
InstallationId: installationID,
|
||||||
Version: 1,
|
Version: 1,
|
||||||
})
|
})
|
||||||
|
@ -165,10 +165,10 @@ func (s *ServerSuite) TestPushNotificationServerValidateRegistration() {
|
||||||
cyphertext, err = encrypt(payload, sharedKey, rand.Reader)
|
cyphertext, err = encrypt(payload, sharedKey, rand.Reader)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
_, err = server.ValidateRegistration(&key.PublicKey, cyphertext)
|
_, err = server.ValidateRegistration(&key.PublicKey, cyphertext)
|
||||||
s.Require().Equal(ErrMalformedPushNotificationOptionsAccessToken, err)
|
s.Require().Equal(ErrMalformedPushNotificationRegistrationAccessToken, err)
|
||||||
|
|
||||||
// Invalid access token
|
// Invalid access token
|
||||||
payload, err = proto.Marshal(&protobuf.PushNotificationOptions{
|
payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{
|
||||||
AccessToken: "bc",
|
AccessToken: "bc",
|
||||||
InstallationId: installationID,
|
InstallationId: installationID,
|
||||||
Version: 1,
|
Version: 1,
|
||||||
|
@ -178,10 +178,10 @@ func (s *ServerSuite) TestPushNotificationServerValidateRegistration() {
|
||||||
cyphertext, err = encrypt(payload, sharedKey, rand.Reader)
|
cyphertext, err = encrypt(payload, sharedKey, rand.Reader)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
_, err = server.ValidateRegistration(&key.PublicKey, cyphertext)
|
_, err = server.ValidateRegistration(&key.PublicKey, cyphertext)
|
||||||
s.Require().Equal(ErrMalformedPushNotificationOptionsAccessToken, err)
|
s.Require().Equal(ErrMalformedPushNotificationRegistrationAccessToken, err)
|
||||||
|
|
||||||
// Missing device token
|
// Missing device token
|
||||||
payload, err = proto.Marshal(&protobuf.PushNotificationOptions{
|
payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{
|
||||||
AccessToken: accessToken,
|
AccessToken: accessToken,
|
||||||
InstallationId: installationID,
|
InstallationId: installationID,
|
||||||
Version: 1,
|
Version: 1,
|
||||||
|
@ -191,5 +191,241 @@ func (s *ServerSuite) TestPushNotificationServerValidateRegistration() {
|
||||||
cyphertext, err = encrypt(payload, sharedKey, rand.Reader)
|
cyphertext, err = encrypt(payload, sharedKey, rand.Reader)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
_, err = server.ValidateRegistration(&key.PublicKey, cyphertext)
|
_, err = server.ValidateRegistration(&key.PublicKey, cyphertext)
|
||||||
s.Require().Equal(ErrMalformedPushNotificationOptionsDeviceToken, err)
|
s.Require().Equal(ErrMalformedPushNotificationRegistrationDeviceToken, err)
|
||||||
|
|
||||||
|
// Successful
|
||||||
|
payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{
|
||||||
|
Token: "abc",
|
||||||
|
AccessToken: accessToken,
|
||||||
|
InstallationId: installationID,
|
||||||
|
Version: 1,
|
||||||
|
})
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
cyphertext, err = encrypt(payload, sharedKey, rand.Reader)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
_, err = server.ValidateRegistration(&key.PublicKey, cyphertext)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ServerSuite) TestPushNotificationHandleRegistration() {
|
||||||
|
accessToken := "b6ae4fde-bb65-11ea-b3de-0242ac130004"
|
||||||
|
installationID := "c6ae4fde-bb65-11ea-b3de-0242ac130004"
|
||||||
|
identity, err := crypto.GenerateKey()
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
config := &Config{
|
||||||
|
Identity: identity,
|
||||||
|
}
|
||||||
|
|
||||||
|
server := New(config, s.persistence)
|
||||||
|
|
||||||
|
key, err := crypto.GenerateKey()
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
sharedKey, err := server.generateSharedKey(&key.PublicKey)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
// Empty payload
|
||||||
|
response := server.HandlePushNotificationRegistration(&key.PublicKey, nil)
|
||||||
|
s.Require().NotNil(response)
|
||||||
|
s.Require().False(response.Success)
|
||||||
|
s.Require().Equal(response.Error, protobuf.PushNotificationRegistrationResponse_MALFORMED_MESSAGE)
|
||||||
|
|
||||||
|
// Empty key
|
||||||
|
response = server.HandlePushNotificationRegistration(nil, []byte("payload"))
|
||||||
|
s.Require().NotNil(response)
|
||||||
|
s.Require().False(response.Success)
|
||||||
|
s.Require().Equal(response.Error, protobuf.PushNotificationRegistrationResponse_MALFORMED_MESSAGE)
|
||||||
|
|
||||||
|
// Invalid cyphertext length
|
||||||
|
response = server.HandlePushNotificationRegistration(&key.PublicKey, []byte("too short"))
|
||||||
|
s.Require().NotNil(response)
|
||||||
|
s.Require().False(response.Success)
|
||||||
|
s.Require().Equal(response.Error, protobuf.PushNotificationRegistrationResponse_MALFORMED_MESSAGE)
|
||||||
|
|
||||||
|
// Invalid cyphertext length
|
||||||
|
response = server.HandlePushNotificationRegistration(&key.PublicKey, []byte("too short"))
|
||||||
|
s.Require().NotNil(response)
|
||||||
|
s.Require().False(response.Success)
|
||||||
|
s.Require().Equal(response.Error, protobuf.PushNotificationRegistrationResponse_MALFORMED_MESSAGE)
|
||||||
|
|
||||||
|
// Invalid ciphertext
|
||||||
|
response = server.HandlePushNotificationRegistration(&key.PublicKey, []byte("not too short but invalid"))
|
||||||
|
s.Require().NotNil(response)
|
||||||
|
s.Require().False(response.Success)
|
||||||
|
s.Require().Equal(response.Error, protobuf.PushNotificationRegistrationResponse_MALFORMED_MESSAGE)
|
||||||
|
|
||||||
|
// Different key ciphertext
|
||||||
|
cyphertext, err := encrypt([]byte("plaintext"), make([]byte, 32), rand.Reader)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
response = server.HandlePushNotificationRegistration(&key.PublicKey, cyphertext)
|
||||||
|
s.Require().NotNil(response)
|
||||||
|
s.Require().False(response.Success)
|
||||||
|
s.Require().Equal(response.Error, protobuf.PushNotificationRegistrationResponse_MALFORMED_MESSAGE)
|
||||||
|
|
||||||
|
// Right cyphertext but non unmarshable payload
|
||||||
|
cyphertext, err = encrypt([]byte("plaintext"), sharedKey, rand.Reader)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
response = server.HandlePushNotificationRegistration(&key.PublicKey, cyphertext)
|
||||||
|
s.Require().NotNil(response)
|
||||||
|
s.Require().False(response.Success)
|
||||||
|
s.Require().Equal(response.Error, protobuf.PushNotificationRegistrationResponse_MALFORMED_MESSAGE)
|
||||||
|
|
||||||
|
// Missing installationID
|
||||||
|
payload, err := proto.Marshal(&protobuf.PushNotificationRegistration{
|
||||||
|
AccessToken: accessToken,
|
||||||
|
Version: 1,
|
||||||
|
})
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
cyphertext, err = encrypt(payload, sharedKey, rand.Reader)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
response = server.HandlePushNotificationRegistration(&key.PublicKey, cyphertext)
|
||||||
|
s.Require().NotNil(response)
|
||||||
|
s.Require().False(response.Success)
|
||||||
|
s.Require().Equal(response.Error, protobuf.PushNotificationRegistrationResponse_MALFORMED_MESSAGE)
|
||||||
|
|
||||||
|
// Malformed installationID
|
||||||
|
payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{
|
||||||
|
AccessToken: accessToken,
|
||||||
|
InstallationId: "abc",
|
||||||
|
Version: 1,
|
||||||
|
})
|
||||||
|
cyphertext, err = encrypt(payload, sharedKey, rand.Reader)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
response = server.HandlePushNotificationRegistration(&key.PublicKey, cyphertext)
|
||||||
|
s.Require().NotNil(response)
|
||||||
|
s.Require().False(response.Success)
|
||||||
|
s.Require().Equal(response.Error, protobuf.PushNotificationRegistrationResponse_MALFORMED_MESSAGE)
|
||||||
|
|
||||||
|
// Version set to 0
|
||||||
|
payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{
|
||||||
|
AccessToken: accessToken,
|
||||||
|
InstallationId: installationID,
|
||||||
|
})
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
cyphertext, err = encrypt(payload, sharedKey, rand.Reader)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
response = server.HandlePushNotificationRegistration(&key.PublicKey, cyphertext)
|
||||||
|
s.Require().NotNil(response)
|
||||||
|
s.Require().False(response.Success)
|
||||||
|
s.Require().Equal(response.Error, protobuf.PushNotificationRegistrationResponse_VERSION_MISMATCH)
|
||||||
|
|
||||||
|
// Version lower than previous one
|
||||||
|
payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{
|
||||||
|
AccessToken: accessToken,
|
||||||
|
InstallationId: installationID,
|
||||||
|
Version: 1,
|
||||||
|
})
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
cyphertext, err = encrypt(payload, sharedKey, rand.Reader)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
// Setup persistence
|
||||||
|
s.Require().NoError(s.persistence.SavePushNotificationRegistration(&key.PublicKey, &protobuf.PushNotificationRegistration{
|
||||||
|
AccessToken: accessToken,
|
||||||
|
InstallationId: installationID,
|
||||||
|
Version: 2}))
|
||||||
|
|
||||||
|
response = server.HandlePushNotificationRegistration(&key.PublicKey, cyphertext)
|
||||||
|
s.Require().NotNil(response)
|
||||||
|
s.Require().False(response.Success)
|
||||||
|
s.Require().Equal(response.Error, protobuf.PushNotificationRegistrationResponse_VERSION_MISMATCH)
|
||||||
|
|
||||||
|
// Cleanup persistence
|
||||||
|
s.Require().NoError(s.persistence.DeletePushNotificationRegistration(&key.PublicKey, installationID))
|
||||||
|
|
||||||
|
// Missing access token
|
||||||
|
payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{
|
||||||
|
InstallationId: installationID,
|
||||||
|
Version: 1,
|
||||||
|
})
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
cyphertext, err = encrypt(payload, sharedKey, rand.Reader)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
response = server.HandlePushNotificationRegistration(&key.PublicKey, cyphertext)
|
||||||
|
s.Require().NotNil(response)
|
||||||
|
s.Require().False(response.Success)
|
||||||
|
s.Require().Equal(response.Error, protobuf.PushNotificationRegistrationResponse_MALFORMED_MESSAGE)
|
||||||
|
|
||||||
|
// Invalid access token
|
||||||
|
payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{
|
||||||
|
AccessToken: "bc",
|
||||||
|
InstallationId: installationID,
|
||||||
|
Version: 1,
|
||||||
|
})
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
cyphertext, err = encrypt(payload, sharedKey, rand.Reader)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
response = server.HandlePushNotificationRegistration(&key.PublicKey, cyphertext)
|
||||||
|
s.Require().NotNil(response)
|
||||||
|
s.Require().False(response.Success)
|
||||||
|
s.Require().Equal(response.Error, protobuf.PushNotificationRegistrationResponse_MALFORMED_MESSAGE)
|
||||||
|
|
||||||
|
// Missing device token
|
||||||
|
payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{
|
||||||
|
AccessToken: accessToken,
|
||||||
|
InstallationId: installationID,
|
||||||
|
Version: 1,
|
||||||
|
})
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
cyphertext, err = encrypt(payload, sharedKey, rand.Reader)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
response = server.HandlePushNotificationRegistration(&key.PublicKey, cyphertext)
|
||||||
|
s.Require().NotNil(response)
|
||||||
|
s.Require().False(response.Success)
|
||||||
|
s.Require().Equal(response.Error, protobuf.PushNotificationRegistrationResponse_MALFORMED_MESSAGE)
|
||||||
|
|
||||||
|
// Successful
|
||||||
|
registration := &protobuf.PushNotificationRegistration{
|
||||||
|
Token: "abc",
|
||||||
|
AccessToken: accessToken,
|
||||||
|
InstallationId: installationID,
|
||||||
|
Version: 1,
|
||||||
|
}
|
||||||
|
payload, err = proto.Marshal(registration)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
cyphertext, err = encrypt(payload, sharedKey, rand.Reader)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
response = server.HandlePushNotificationRegistration(&key.PublicKey, cyphertext)
|
||||||
|
s.Require().NotNil(response)
|
||||||
|
s.Require().True(response.Success)
|
||||||
|
|
||||||
|
// Pull from the db
|
||||||
|
retrievedRegistration, err := s.persistence.GetPushNotificationRegistration(&key.PublicKey, installationID)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
s.Require().NotNil(retrievedRegistration)
|
||||||
|
s.Require().True(proto.Equal(retrievedRegistration, registration))
|
||||||
|
|
||||||
|
// Unregistering message
|
||||||
|
payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{
|
||||||
|
Token: "token",
|
||||||
|
InstallationId: installationID,
|
||||||
|
Unregister: true,
|
||||||
|
Version: 2,
|
||||||
|
})
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
cyphertext, err = encrypt(payload, sharedKey, rand.Reader)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
response = server.HandlePushNotificationRegistration(&key.PublicKey, cyphertext)
|
||||||
|
s.Require().NotNil(response)
|
||||||
|
s.Require().True(response.Success)
|
||||||
|
|
||||||
|
// Check is gone from the db
|
||||||
|
retrievedRegistration, err = s.persistence.GetPushNotificationRegistration(&key.PublicKey, installationID)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
s.Require().NotNil(retrievedRegistration)
|
||||||
|
s.Require().Empty(retrievedRegistration.AccessToken)
|
||||||
|
s.Require().Empty(retrievedRegistration.Token)
|
||||||
|
s.Require().Equal(uint64(2), retrievedRegistration.Version)
|
||||||
|
s.Require().Equal(installationID, retrievedRegistration.InstallationId)
|
||||||
|
s.Require().Equal(shake256(cyphertext), response.RequestId)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue