implement handle push notification registration

This commit is contained in:
Andrea Maria Piana 2020-07-02 10:08:19 +02:00
parent 91c7869d98
commit a15919527b
No known key found for this signature in database
GPG Key ID: AA6CCA6DE0E06424
9 changed files with 467 additions and 245 deletions

View File

@ -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,58 +79,11 @@ 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"`
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"` 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"` 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"` AccessToken string `protobuf:"bytes,4,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"`
@ -144,88 +97,88 @@ type PushNotificationOptions struct {
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
} }
func (m *PushNotificationOptions) Reset() { *m = PushNotificationOptions{} } func (m *PushNotificationRegistration) Reset() { *m = PushNotificationRegistration{} }
func (m *PushNotificationOptions) String() string { return proto.CompactTextString(m) } func (m *PushNotificationRegistration) String() string { return proto.CompactTextString(m) }
func (*PushNotificationOptions) ProtoMessage() {} func (*PushNotificationRegistration) ProtoMessage() {}
func (*PushNotificationOptions) Descriptor() ([]byte, []int) { func (*PushNotificationRegistration) Descriptor() ([]byte, []int) {
return fileDescriptor_200acd86044eaa5d, []int{1} return fileDescriptor_200acd86044eaa5d, []int{0}
} }
func (m *PushNotificationOptions) XXX_Unmarshal(b []byte) error { func (m *PushNotificationRegistration) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PushNotificationOptions.Unmarshal(m, b) return xxx_messageInfo_PushNotificationRegistration.Unmarshal(m, b)
} }
func (m *PushNotificationOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { func (m *PushNotificationRegistration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_PushNotificationOptions.Marshal(b, m, deterministic) return xxx_messageInfo_PushNotificationRegistration.Marshal(b, m, deterministic)
} }
func (m *PushNotificationOptions) XXX_Merge(src proto.Message) { func (m *PushNotificationRegistration) XXX_Merge(src proto.Message) {
xxx_messageInfo_PushNotificationOptions.Merge(m, src) xxx_messageInfo_PushNotificationRegistration.Merge(m, src)
} }
func (m *PushNotificationOptions) XXX_Size() int { func (m *PushNotificationRegistration) XXX_Size() int {
return xxx_messageInfo_PushNotificationOptions.Size(m) return xxx_messageInfo_PushNotificationRegistration.Size(m)
} }
func (m *PushNotificationOptions) XXX_DiscardUnknown() { func (m *PushNotificationRegistration) XXX_DiscardUnknown() {
xxx_messageInfo_PushNotificationOptions.DiscardUnknown(m) xxx_messageInfo_PushNotificationRegistration.DiscardUnknown(m)
} }
var xxx_messageInfo_PushNotificationOptions proto.InternalMessageInfo var xxx_messageInfo_PushNotificationRegistration proto.InternalMessageInfo
func (m *PushNotificationOptions) GetTokenType() PushNotificationOptions_TokenType { func (m *PushNotificationRegistration) GetTokenType() PushNotificationRegistration_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,
} }

View File

@ -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;

View File

@ -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,

View File

@ -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)

View File

@ -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")

View File

@ -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{
RequestId: shake256(payload),
}
registration, err := p.ValidateRegistration(publicKey, payload)
if registration != nil {
}
_, err := p.ValidateRegistration(publicKey, payload)
if err != nil { if err != nil {
return err if err == ErrInvalidPushNotificationRegistrationVersion {
response.Error = protobuf.PushNotificationRegistrationResponse_VERSION_MISMATCH
} else {
response.Error = protobuf.PushNotificationRegistrationResponse_MALFORMED_MESSAGE
} }
return nil 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
}

View File

@ -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
} }

View File

@ -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))
} }

View File

@ -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)
} }