diff --git a/PUSH-NOTIFICATIONS-TODO.txt b/PUSH-NOTIFICATIONS-TODO.txt index 2e0c858b9..2716e3e99 100644 --- a/PUSH-NOTIFICATIONS-TODO.txt +++ b/PUSH-NOTIFICATIONS-TODO.txt @@ -2,3 +2,4 @@ Specs changes: - Use application metadata wrapper - Encrypt of payload instead of signature + public key of server - Removed preferencs + each device registers individually +- Add grant diff --git a/protocol/protobuf/push_notifications.pb.go b/protocol/protobuf/push_notifications.pb.go index c59a9016a..d3ca7b1d7 100644 --- a/protocol/protobuf/push_notifications.pb.go +++ b/protocol/protobuf/push_notifications.pb.go @@ -123,6 +123,7 @@ type PushNotificationRegistration struct { 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"` + Grant []byte `protobuf:"bytes,10,opt,name=grant,proto3" json:"grant,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -216,6 +217,13 @@ func (m *PushNotificationRegistration) GetUnregister() bool { return false } +func (m *PushNotificationRegistration) GetGrant() []byte { + if m != nil { + return m.Grant + } + return nil +} + type PushNotificationRegistrationResponse struct { Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` Error PushNotificationRegistrationResponse_ErrorType `protobuf:"varint,2,opt,name=error,proto3,enum=protobuf.PushNotificationRegistrationResponse_ErrorType" json:"error,omitempty"` @@ -409,6 +417,7 @@ type PushNotificationQueryInfo struct { InstallationId string `protobuf:"bytes,2,opt,name=installation_id,json=installationId,proto3" json:"installation_id,omitempty"` PublicKey []byte `protobuf:"bytes,3,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` AllowedUserList [][]byte `protobuf:"bytes,4,rep,name=allowed_user_list,json=allowedUserList,proto3" json:"allowed_user_list,omitempty"` + Grant []byte `protobuf:"bytes,5,opt,name=grant,proto3" json:"grant,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -467,6 +476,13 @@ func (m *PushNotificationQueryInfo) GetAllowedUserList() [][]byte { return nil } +func (m *PushNotificationQueryInfo) GetGrant() []byte { + if m != nil { + return m.Grant + } + return nil +} + type PushNotificationQueryResponse struct { Info []*PushNotificationQueryInfo `protobuf:"bytes,1,rep,name=info,proto3" json:"info,omitempty"` MessageId []byte `protobuf:"bytes,2,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"` @@ -770,58 +786,59 @@ func init() { func init() { proto.RegisterFile("push_notifications.proto", fileDescriptor_200acd86044eaa5d) } var fileDescriptor_200acd86044eaa5d = []byte{ - // 836 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x94, 0x51, 0x6f, 0xe3, 0x44, - 0x10, 0xc7, 0xb1, 0x9d, 0x36, 0xf1, 0x34, 0xb4, 0xbe, 0x55, 0xaf, 0x67, 0x4e, 0x1c, 0xe4, 0x0c, - 0x12, 0xd1, 0x21, 0x45, 0xa8, 0x48, 0x70, 0xe2, 0x89, 0xd0, 0xba, 0xc5, 0x6a, 0x63, 0x87, 0x8d, - 0xc3, 0x09, 0x09, 0xc9, 0x72, 0xe2, 0xcd, 0xc5, 0xaa, 0xcf, 0x36, 0xde, 0xf5, 0xa1, 0x3c, 0x20, - 0xf1, 0x09, 0x90, 0x78, 0xe5, 0x53, 0xa0, 0xfb, 0x0e, 0x7c, 0x2f, 0xe4, 0xb5, 0x1d, 0x1c, 0xc7, - 0x4d, 0xf3, 0xc0, 0x93, 0x3d, 0xb3, 0x33, 0xbb, 0x3b, 0xbf, 0xd9, 0xf9, 0x83, 0x1a, 0xa7, 0x74, - 0xe9, 0x84, 0x11, 0xf3, 0x17, 0xfe, 0xdc, 0x65, 0x7e, 0x14, 0xd2, 0x41, 0x9c, 0x44, 0x2c, 0x42, - 0x1d, 0xfe, 0x99, 0xa5, 0x0b, 0xed, 0x1f, 0x09, 0x3e, 0x1c, 0xa7, 0x74, 0x69, 0x56, 0xa2, 0x30, - 0x79, 0xed, 0x53, 0x96, 0xf0, 0x7f, 0x64, 0x01, 0xb0, 0xe8, 0x8e, 0x84, 0x0e, 0x5b, 0xc5, 0x44, - 0x15, 0x7a, 0x42, 0xff, 0xf8, 0xfc, 0x8b, 0x41, 0x99, 0x3f, 0xd8, 0x95, 0x3b, 0xb0, 0xb3, 0x44, - 0x7b, 0x15, 0x13, 0x2c, 0xb3, 0xf2, 0x17, 0x9d, 0xc2, 0x01, 0x37, 0x54, 0xb1, 0x27, 0xf4, 0x65, - 0x9c, 0x1b, 0xe8, 0x33, 0x38, 0xf1, 0x43, 0xca, 0xdc, 0x20, 0xe0, 0xa9, 0x8e, 0xef, 0xa9, 0x12, - 0x5f, 0x3f, 0xae, 0xba, 0x0d, 0x0f, 0x3d, 0x87, 0xae, 0x3b, 0x9f, 0x13, 0x4a, 0x9d, 0x7c, 0x97, - 0x16, 0x8f, 0x3a, 0xca, 0x7d, 0xfc, 0x40, 0xa4, 0x42, 0x9b, 0x84, 0xee, 0x2c, 0x20, 0x9e, 0x7a, - 0xd0, 0x13, 0xfa, 0x1d, 0x5c, 0x9a, 0xd9, 0xca, 0x5b, 0x92, 0x50, 0x3f, 0x0a, 0xd5, 0xc3, 0x9e, - 0xd0, 0x6f, 0xe1, 0xd2, 0x44, 0x2f, 0xe0, 0x91, 0x1b, 0x04, 0xd1, 0xaf, 0xc4, 0x73, 0x52, 0x4a, - 0x12, 0x27, 0xf0, 0x29, 0x53, 0xdb, 0x3d, 0xa9, 0xdf, 0xc5, 0x27, 0xc5, 0xc2, 0x94, 0x92, 0xe4, - 0xd6, 0xa7, 0x2c, 0x8b, 0x9d, 0x05, 0xd1, 0xfc, 0x8e, 0x78, 0xce, 0x7c, 0xe9, 0xb2, 0x3c, 0xb6, - 0x93, 0xc7, 0x16, 0x0b, 0x17, 0x4b, 0x97, 0xf1, 0xd8, 0x8f, 0x00, 0xd2, 0x30, 0xe1, 0x50, 0x48, - 0xa2, 0xca, 0xfc, 0x3a, 0x15, 0x8f, 0x76, 0x05, 0xf2, 0x9a, 0x12, 0x3a, 0x03, 0x34, 0x35, 0x6f, - 0x4c, 0xeb, 0x95, 0xe9, 0xd8, 0xd6, 0x8d, 0x6e, 0x3a, 0xf6, 0x4f, 0x63, 0x5d, 0x79, 0x0f, 0xbd, - 0x0f, 0xf2, 0x70, 0x5c, 0xf8, 0x14, 0x01, 0x21, 0x38, 0xbe, 0x32, 0xb0, 0xfe, 0xdd, 0x70, 0xa2, - 0x17, 0x3e, 0x51, 0x7b, 0x27, 0xc2, 0xa7, 0xbb, 0x7a, 0x81, 0x09, 0x8d, 0xa3, 0x90, 0x92, 0x0c, - 0x01, 0x4d, 0x39, 0x2c, 0xde, 0xcc, 0x0e, 0x2e, 0x4d, 0x64, 0xc2, 0x01, 0x49, 0x92, 0x28, 0xe1, - 0x8d, 0x39, 0x3e, 0x7f, 0xb9, 0x5f, 0x93, 0xcb, 0x8d, 0x07, 0x7a, 0x96, 0xcb, 0x9b, 0x9d, 0x6f, - 0x83, 0x9e, 0x01, 0x24, 0xe4, 0x97, 0x94, 0x50, 0x56, 0x76, 0xb3, 0x8b, 0xe5, 0xc2, 0x63, 0x78, - 0xda, 0xef, 0x02, 0xc8, 0xeb, 0x9c, 0x6a, 0xe9, 0x3a, 0xc6, 0x16, 0x2e, 0x4b, 0x7f, 0x0c, 0x8f, - 0x46, 0xc3, 0xdb, 0x2b, 0x0b, 0x8f, 0xf4, 0x4b, 0x67, 0xa4, 0x4f, 0x26, 0xc3, 0x6b, 0x5d, 0x11, - 0xd0, 0x29, 0x28, 0x3f, 0xea, 0x78, 0x62, 0x58, 0xa6, 0x33, 0x32, 0x26, 0xa3, 0xa1, 0x7d, 0xf1, - 0xbd, 0x22, 0xa2, 0xa7, 0x70, 0x36, 0x35, 0x27, 0xd3, 0xf1, 0xd8, 0xc2, 0xb6, 0x7e, 0x59, 0x65, - 0x28, 0x65, 0xd0, 0x0c, 0xd3, 0xd6, 0xb1, 0x39, 0xbc, 0xcd, 0x4f, 0x50, 0x5a, 0xda, 0x1f, 0x02, - 0x3c, 0xaf, 0xd7, 0x36, 0xf4, 0xde, 0x92, 0x84, 0xf9, 0x94, 0xbc, 0x21, 0x21, 0x33, 0xc2, 0x45, - 0x94, 0xd5, 0x11, 0xa7, 0xb3, 0xc0, 0x9f, 0x3b, 0x77, 0x64, 0xc5, 0xa1, 0x75, 0xb1, 0x9c, 0x7b, - 0x6e, 0xc8, 0x6a, 0xeb, 0x41, 0x8a, 0xdb, 0x0f, 0x72, 0xdf, 0xc7, 0xad, 0xfd, 0x06, 0xea, 0x45, - 0x14, 0x32, 0x77, 0xce, 0x2e, 0x22, 0x8f, 0x6c, 0x5c, 0x05, 0xb9, 0x70, 0xb6, 0x35, 0xcf, 0x8e, - 0x1f, 0x2e, 0x22, 0x55, 0xe8, 0x49, 0xfd, 0xa3, 0xf3, 0xcf, 0xef, 0xef, 0xd7, 0x56, 0x4d, 0xf8, - 0x34, 0xae, 0x85, 0x64, 0x5e, 0xed, 0x25, 0x3c, 0xae, 0xa7, 0xfe, 0x90, 0x92, 0x64, 0x85, 0x3e, - 0x86, 0xa3, 0xff, 0x10, 0x50, 0x7e, 0x60, 0x17, 0xc3, 0x9a, 0x01, 0xd5, 0xde, 0x09, 0xf0, 0x41, - 0x63, 0x2a, 0x27, 0x58, 0x47, 0x24, 0xec, 0x85, 0x48, 0x6c, 0x9c, 0xff, 0xcd, 0x6e, 0x48, 0xf5, - 0x6e, 0x34, 0xce, 0x71, 0xab, 0x71, 0x8e, 0xb5, 0x3f, 0x05, 0x78, 0xd6, 0x78, 0xe9, 0xf5, 0xb0, - 0x7c, 0x0d, 0xad, 0x0a, 0xe1, 0x4f, 0xee, 0x27, 0xbc, 0xae, 0x15, 0xf3, 0x84, 0xec, 0x96, 0x6f, - 0x08, 0xa5, 0xee, 0x6b, 0x52, 0x56, 0xd2, 0xc5, 0x72, 0xe1, 0x31, 0xbc, 0xea, 0x10, 0x4a, 0x1b, - 0x43, 0xa8, 0xfd, 0x2d, 0x80, 0x52, 0xdf, 0x7c, 0x1f, 0x7e, 0x4f, 0xa0, 0xcd, 0xb5, 0x68, 0xcd, - 0xed, 0x30, 0x33, 0x1f, 0xe6, 0xd5, 0xc0, 0xbd, 0xd5, 0xc8, 0x5d, 0x85, 0x76, 0x71, 0x7f, 0x2e, - 0xaa, 0x5d, 0x5c, 0x9a, 0x5a, 0x0c, 0x4f, 0xb6, 0x05, 0x82, 0x4f, 0x39, 0xfa, 0x0a, 0x3a, 0xc5, - 0xc0, 0xd3, 0x82, 0xe1, 0xd3, 0x1d, 0xaa, 0xb2, 0x8e, 0x7d, 0x00, 0x9f, 0xf6, 0x97, 0x08, 0x67, - 0xdb, 0x47, 0xc6, 0x51, 0xc2, 0x76, 0xc8, 0xdb, 0xb7, 0x9b, 0xf2, 0xf6, 0x62, 0x97, 0xbc, 0x65, - 0x5b, 0x35, 0x0a, 0xda, 0xff, 0x81, 0x52, 0xfb, 0x79, 0x1f, 0xe1, 0x3b, 0x81, 0xa3, 0x57, 0xd8, - 0x32, 0xaf, 0xab, 0xaa, 0x5f, 0x13, 0x30, 0x31, 0xf3, 0x99, 0x96, 0xed, 0x60, 0xfd, 0xda, 0x98, - 0xd8, 0x3a, 0xd6, 0x2f, 0x15, 0x49, 0x4b, 0x41, 0xdd, 0x2e, 0xa8, 0x78, 0xcf, 0x9b, 0x5c, 0x85, - 0xfa, 0xb3, 0xfc, 0x06, 0xda, 0x09, 0xaf, 0x9d, 0xaa, 0x22, 0xef, 0x56, 0xef, 0x21, 0x48, 0xb8, - 0x4c, 0x98, 0x1d, 0xf2, 0xc8, 0x2f, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x9e, 0x28, 0xe3, 0xa0, - 0x75, 0x08, 0x00, 0x00, + // 856 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x95, 0xe1, 0x6e, 0xe3, 0x44, + 0x10, 0xc7, 0x59, 0x27, 0x6d, 0xe2, 0x69, 0x68, 0x73, 0xab, 0x5e, 0xcf, 0x9c, 0x38, 0xc8, 0x19, + 0x24, 0xa2, 0x43, 0x8a, 0x50, 0x91, 0xe0, 0xc4, 0x27, 0x42, 0xeb, 0x16, 0xab, 0x8d, 0x1d, 0x36, + 0x2e, 0x27, 0x24, 0x24, 0xcb, 0x89, 0xb7, 0x8d, 0xd5, 0x9c, 0x6d, 0x76, 0xd7, 0x87, 0xf2, 0x01, + 0x89, 0x27, 0x40, 0xe2, 0x2b, 0x4f, 0x81, 0x78, 0x0a, 0xde, 0x81, 0x97, 0x41, 0x5e, 0xdb, 0xc1, + 0x71, 0x7c, 0x69, 0x3e, 0xf0, 0x29, 0x9e, 0xd9, 0x99, 0xdd, 0x9d, 0xdf, 0xec, 0xfc, 0x03, 0x5a, + 0x9c, 0xf0, 0xb9, 0x1b, 0x46, 0x22, 0xb8, 0x0d, 0x66, 0x9e, 0x08, 0xa2, 0x90, 0x0f, 0x62, 0x16, + 0x89, 0x08, 0xb7, 0xe5, 0xcf, 0x34, 0xb9, 0xd5, 0xff, 0x69, 0xc0, 0xfb, 0xe3, 0x84, 0xcf, 0xad, + 0x52, 0x14, 0xa1, 0x77, 0x01, 0x17, 0x4c, 0x7e, 0x63, 0x1b, 0x40, 0x44, 0xf7, 0x34, 0x74, 0xc5, + 0x32, 0xa6, 0x1a, 0xea, 0xa1, 0xfe, 0xe1, 0xe9, 0x67, 0x83, 0x22, 0x7f, 0xb0, 0x2d, 0x77, 0xe0, + 0xa4, 0x89, 0xce, 0x32, 0xa6, 0x44, 0x15, 0xc5, 0x27, 0x3e, 0x86, 0x3d, 0x69, 0x68, 0x4a, 0x0f, + 0xf5, 0x55, 0x92, 0x19, 0xf8, 0x13, 0x38, 0x0a, 0x42, 0x2e, 0xbc, 0xc5, 0x42, 0xa6, 0xba, 0x81, + 0xaf, 0x35, 0xe4, 0xfa, 0x61, 0xd9, 0x6d, 0xfa, 0xf8, 0x39, 0x74, 0xbc, 0xd9, 0x8c, 0x72, 0xee, + 0x66, 0xbb, 0x34, 0x65, 0xd4, 0x41, 0xe6, 0x93, 0x07, 0x62, 0x0d, 0x5a, 0x34, 0xf4, 0xa6, 0x0b, + 0xea, 0x6b, 0x7b, 0x3d, 0xd4, 0x6f, 0x93, 0xc2, 0x4c, 0x57, 0xde, 0x50, 0xc6, 0x83, 0x28, 0xd4, + 0xf6, 0x7b, 0xa8, 0xdf, 0x24, 0x85, 0x89, 0x5f, 0xc0, 0x23, 0x6f, 0xb1, 0x88, 0x7e, 0xa6, 0xbe, + 0x9b, 0x70, 0xca, 0xdc, 0x45, 0xc0, 0x85, 0xd6, 0xea, 0x35, 0xfa, 0x1d, 0x72, 0x94, 0x2f, 0xdc, + 0x70, 0xca, 0xae, 0x03, 0x2e, 0xd2, 0xd8, 0xe9, 0x22, 0x9a, 0xdd, 0x53, 0xdf, 0x9d, 0xcd, 0x3d, + 0x91, 0xc5, 0xb6, 0xb3, 0xd8, 0x7c, 0xe1, 0x6c, 0xee, 0x09, 0x19, 0xfb, 0x01, 0x40, 0x12, 0x32, + 0x09, 0x85, 0x32, 0x4d, 0x95, 0xd7, 0x29, 0x79, 0x52, 0x1a, 0x77, 0xcc, 0x0b, 0x85, 0x06, 0x3d, + 0xd4, 0xef, 0x90, 0xcc, 0xd0, 0x2f, 0x40, 0x5d, 0xb1, 0xc3, 0x27, 0x80, 0x6f, 0xac, 0x2b, 0xcb, + 0x7e, 0x65, 0xb9, 0x8e, 0x7d, 0x65, 0x58, 0xae, 0xf3, 0xc3, 0xd8, 0xe8, 0xbe, 0x83, 0xdf, 0x05, + 0x75, 0x38, 0xce, 0x7d, 0x5d, 0x84, 0x31, 0x1c, 0x5e, 0x98, 0xc4, 0xf8, 0x66, 0x38, 0x31, 0x72, + 0x9f, 0xa2, 0xff, 0xa5, 0xc0, 0xc7, 0xdb, 0x3a, 0x44, 0x28, 0x8f, 0xa3, 0x90, 0xd3, 0x14, 0x0c, + 0x4f, 0x24, 0x42, 0xd9, 0xe2, 0x36, 0x29, 0x4c, 0x6c, 0xc1, 0x1e, 0x65, 0x2c, 0x62, 0xb2, 0x5d, + 0x87, 0xa7, 0x2f, 0x77, 0x6b, 0x7d, 0xb1, 0xf1, 0xc0, 0x48, 0x73, 0xe5, 0x13, 0xc8, 0xb6, 0xc1, + 0xcf, 0x00, 0x18, 0xfd, 0x29, 0xa1, 0x5c, 0x14, 0x3d, 0xee, 0x10, 0x35, 0xf7, 0x98, 0xbe, 0xfe, + 0x2b, 0x02, 0x75, 0x95, 0x53, 0x2e, 0xdd, 0x20, 0xc4, 0x26, 0x45, 0xe9, 0x8f, 0xe1, 0xd1, 0x68, + 0x78, 0x7d, 0x61, 0x93, 0x91, 0x71, 0xee, 0x8e, 0x8c, 0xc9, 0x64, 0x78, 0x69, 0x74, 0x11, 0x3e, + 0x86, 0xee, 0xf7, 0x06, 0x99, 0x98, 0xb6, 0xe5, 0x8e, 0xcc, 0xc9, 0x68, 0xe8, 0x9c, 0x7d, 0xdb, + 0x55, 0xf0, 0x53, 0x38, 0xb9, 0xb1, 0x26, 0x37, 0xe3, 0xb1, 0x4d, 0x1c, 0xe3, 0xbc, 0xcc, 0xb0, + 0x91, 0x42, 0x33, 0x2d, 0xc7, 0x20, 0xd6, 0xf0, 0x3a, 0x3b, 0xa1, 0xdb, 0xd4, 0x7f, 0x43, 0xf0, + 0xbc, 0x5a, 0xdb, 0xd0, 0x7f, 0x43, 0x99, 0x08, 0x38, 0x7d, 0x4d, 0x43, 0x61, 0x86, 0xb7, 0x51, + 0x5a, 0x47, 0x9c, 0x4c, 0x17, 0xc1, 0xcc, 0xbd, 0xa7, 0x4b, 0x09, 0xad, 0x43, 0xd4, 0xcc, 0x73, + 0x45, 0x97, 0x1b, 0xcf, 0x54, 0xd9, 0x7c, 0xa6, 0xbb, 0x3e, 0x79, 0xfd, 0x17, 0xd0, 0xce, 0xa2, + 0x50, 0x78, 0x33, 0x71, 0x16, 0xf9, 0x74, 0xed, 0x2a, 0xd8, 0x83, 0x93, 0x8d, 0x29, 0x77, 0x83, + 0xf0, 0x36, 0xd2, 0x50, 0xaf, 0xd1, 0x3f, 0x38, 0xfd, 0xf4, 0xed, 0xfd, 0xda, 0xa8, 0x89, 0x1c, + 0xc7, 0x95, 0x90, 0xd4, 0xab, 0xbf, 0x84, 0xc7, 0xd5, 0xd4, 0xef, 0x12, 0xca, 0x96, 0xf8, 0x43, + 0x38, 0xf8, 0x0f, 0x01, 0x97, 0x07, 0x76, 0x08, 0xac, 0x18, 0x70, 0xfd, 0x6f, 0x04, 0xef, 0xd5, + 0xa6, 0x4a, 0x82, 0x55, 0x44, 0x68, 0x27, 0x44, 0x4a, 0xad, 0x2a, 0xac, 0x77, 0xa3, 0x51, 0xed, + 0x46, 0xed, 0x74, 0x37, 0xeb, 0xa7, 0x7b, 0x35, 0x91, 0x7b, 0xe5, 0x89, 0xfc, 0x1d, 0xc1, 0xb3, + 0xda, 0x52, 0x56, 0x23, 0xf4, 0x25, 0x34, 0x4b, 0xdc, 0x3f, 0x7a, 0x3b, 0xf7, 0x15, 0x01, 0x22, + 0x13, 0xd2, 0xbb, 0xbf, 0xa6, 0x9c, 0x7b, 0x77, 0xb4, 0xa8, 0xaf, 0x43, 0xd4, 0xdc, 0x63, 0xfa, + 0xe5, 0xd1, 0x6c, 0xac, 0x8d, 0xa6, 0xfe, 0x27, 0x82, 0x6e, 0x75, 0xf3, 0x5d, 0xa8, 0x3e, 0x81, + 0x96, 0xd4, 0xad, 0x15, 0xcd, 0xfd, 0xd4, 0x7c, 0x98, 0x62, 0x4d, 0x37, 0x9a, 0xb5, 0xdd, 0xd0, + 0xa0, 0x95, 0xdf, 0x3f, 0x87, 0x58, 0x98, 0x7a, 0x0c, 0x4f, 0x36, 0x65, 0x43, 0xce, 0x3e, 0xfe, + 0x02, 0xda, 0xb9, 0x0c, 0xf0, 0x9c, 0xe1, 0xd3, 0x2d, 0x5a, 0xb3, 0x8a, 0x7d, 0x00, 0x9f, 0xfe, + 0x87, 0x02, 0x27, 0x9b, 0x47, 0xc6, 0x11, 0x13, 0x5b, 0x44, 0xef, 0xeb, 0x75, 0xd1, 0x7b, 0xb1, + 0x4d, 0xf4, 0xd2, 0xad, 0x6a, 0x65, 0xee, 0xff, 0x40, 0xa9, 0xff, 0xb8, 0x8b, 0x1c, 0x1e, 0xc1, + 0xc1, 0x2b, 0x62, 0x5b, 0x97, 0xe5, 0xff, 0x82, 0x8a, 0xac, 0x29, 0xa9, 0xcf, 0xb2, 0x1d, 0x97, + 0x18, 0x97, 0xe6, 0xc4, 0x31, 0x88, 0x71, 0xde, 0x6d, 0xe8, 0x09, 0x68, 0x9b, 0x05, 0xe5, 0xef, + 0x79, 0x9d, 0x2b, 0xaa, 0x3e, 0xcb, 0xaf, 0xa0, 0xc5, 0x64, 0xed, 0x5c, 0x53, 0x64, 0xb7, 0x7a, + 0x0f, 0x41, 0x22, 0x45, 0xc2, 0x74, 0x5f, 0x46, 0x7e, 0xfe, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xcc, 0x3e, 0xe7, 0x96, 0xa1, 0x08, 0x00, 0x00, } diff --git a/protocol/protobuf/push_notifications.proto b/protocol/protobuf/push_notifications.proto index c8342ebcd..577f06879 100644 --- a/protocol/protobuf/push_notifications.proto +++ b/protocol/protobuf/push_notifications.proto @@ -17,6 +17,7 @@ message PushNotificationRegistration { repeated bytes allowed_user_list = 7; repeated bytes blocked_chat_list = 8; bool unregister = 9; + bytes grant = 10; } message PushNotificationRegistrationResponse { @@ -52,6 +53,7 @@ message PushNotificationQueryInfo { string installation_id = 2; bytes public_key = 3; repeated bytes allowed_user_list = 4; + bytes grant = 5; } message PushNotificationQueryResponse { diff --git a/protocol/push_notification_client/push_notification.go b/protocol/push_notification_client/client.go similarity index 87% rename from protocol/push_notification_client/push_notification.go rename to protocol/push_notification_client/client.go index f5c8c229f..2c2c91513 100644 --- a/protocol/push_notification_client/push_notification.go +++ b/protocol/push_notification_client/client.go @@ -341,11 +341,6 @@ func (c *Client) Register(deviceToken string, contactIDs []*ecdsa.PublicKey, mut return nil, err } - marshaledRegistration, err := proto.Marshal(registration) - if err != nil { - return nil, err - } - var serverPublicKeys []*ecdsa.PublicKey for _, server := range servers { @@ -359,6 +354,20 @@ func (c *Client) Register(deviceToken string, contactIDs []*ecdsa.PublicKey, mut return nil, err } + grant, err := c.buildGrantSignature(server.PublicKey, registration.AccessToken) + if err != nil { + c.config.Logger.Error("failed to build grant", zap.Error(err)) + return nil, err + } + + c.config.Logger.Info("GRANT2", zap.Binary("GRANT", grant)) + registration.Grant = grant + + marshaledRegistration, err := proto.Marshal(registration) + if err != nil { + return nil, err + } + // Dispatch message encryptedRegistration, err := c.encryptRegistration(server.PublicKey, marshaledRegistration) if err != nil { @@ -441,6 +450,40 @@ func (p *Client) HandlePushNotificationAdvertisement(info *protobuf.PushNotifica return nil } +// buildGrantSignatureMaterial builds a grant for a specific server. +// We use 3 components: +// 1) The client public key. Not sure this applies to our signature scheme, but best to be conservative. https://crypto.stackexchange.com/questions/15538/given-a-message-and-signature-find-a-public-key-that-makes-the-signature-valid +// 2) The server public key +// 3) The access token +// By verifying this signature, a client can trust the server was instructed to store this access token. + +func (c *Client) buildGrantSignatureMaterial(clientPublicKey *ecdsa.PublicKey, serverPublicKey *ecdsa.PublicKey, accessToken string) []byte { + var signatureMaterial []byte + signatureMaterial = append(signatureMaterial, crypto.CompressPubkey(clientPublicKey)...) + signatureMaterial = append(signatureMaterial, crypto.CompressPubkey(serverPublicKey)...) + signatureMaterial = append(signatureMaterial, []byte(accessToken)...) + return crypto.Keccak256(signatureMaterial) +} + +func (c *Client) buildGrantSignature(serverPublicKey *ecdsa.PublicKey, accessToken string) ([]byte, error) { + signatureMaterial := c.buildGrantSignatureMaterial(&c.config.Identity.PublicKey, serverPublicKey, accessToken) + return crypto.Sign(signatureMaterial, c.config.Identity) +} + +func (c *Client) handleGrant(clientPublicKey *ecdsa.PublicKey, serverPublicKey *ecdsa.PublicKey, grant []byte, accessToken string) error { + signatureMaterial := c.buildGrantSignatureMaterial(clientPublicKey, serverPublicKey, accessToken) + c.config.Logger.Info("GRANT", zap.Binary("GRANT", grant)) + extractedPublicKey, err := crypto.SigToPub(signatureMaterial, grant) + if err != nil { + return err + } + + if !common.IsPubKeyEqual(clientPublicKey, extractedPublicKey) { + return errors.New("invalid grant") + } + return nil +} + // HandlePushNotificationQueryResponse should update the data in the database for a given user func (c *Client) HandlePushNotificationQueryResponse(serverPublicKey *ecdsa.PublicKey, response protobuf.PushNotificationQueryResponse) error { @@ -463,6 +506,14 @@ func (c *Client) HandlePushNotificationQueryResponse(serverPublicKey *ecdsa.Publ c.config.Logger.Warn("reply for different key, ignoring") continue } + + // We check the user has allowed this server to store this particular + // access token, otherwise anyone could reply with a fake token + // and receive notifications for a user + if err := c.handleGrant(publicKey, serverPublicKey, info.Grant, info.AccessToken); err != nil { + c.config.Logger.Warn("grant verification failed, ignoring", zap.Error(err)) + continue + } pushNotificationInfo = append(pushNotificationInfo, &PushNotificationInfo{ PublicKey: publicKey, ServerPublicKey: serverPublicKey, diff --git a/protocol/push_notification_client/push_notification_test.go b/protocol/push_notification_client/client_test.go similarity index 100% rename from protocol/push_notification_client/push_notification_test.go rename to protocol/push_notification_client/client_test.go diff --git a/protocol/push_notification_server/errors.go b/protocol/push_notification_server/errors.go index 33a78dc9c..2199fa91b 100644 --- a/protocol/push_notification_server/errors.go +++ b/protocol/push_notification_server/errors.go @@ -8,5 +8,6 @@ var ErrMalformedPushNotificationRegistrationInstallationID = errors.New("invalid var ErrEmptyPushNotificationRegistrationPublicKey = errors.New("no public key") var ErrCouldNotUnmarshalPushNotificationRegistration = errors.New("could not unmarshal preferences") var ErrMalformedPushNotificationRegistrationDeviceToken = errors.New("invalid device token") +var ErrMalformedPushNotificationRegistrationGrant = errors.New("invalid grant") var ErrMalformedPushNotificationRegistrationAccessToken = errors.New("invalid access token") var ErrUnknownPushNotificationRegistrationTokenType = errors.New("invalid token type") diff --git a/protocol/push_notification_server/server.go b/protocol/push_notification_server/server.go index 04d1e56ba..bf0c15468 100644 --- a/protocol/push_notification_server/server.go +++ b/protocol/push_notification_server/server.go @@ -9,6 +9,7 @@ import ( "github.com/golang/protobuf/proto" "github.com/google/uuid" + "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/eth-node/crypto/ecies" "github.com/status-im/status-go/protocol/common" "github.com/status-im/status-go/protocol/protobuf" @@ -63,7 +64,7 @@ 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 // and return the decrypted message -func (p *Server) ValidateRegistration(publicKey *ecdsa.PublicKey, payload []byte) (*protobuf.PushNotificationRegistration, error) { +func (s *Server) ValidateRegistration(publicKey *ecdsa.PublicKey, payload []byte) (*protobuf.PushNotificationRegistration, error) { if payload == nil { return nil, ErrEmptyPushNotificationRegistrationPayload } @@ -72,7 +73,7 @@ func (p *Server) ValidateRegistration(publicKey *ecdsa.PublicKey, payload []byte return nil, ErrEmptyPushNotificationRegistrationPublicKey } - decryptedPayload, err := p.decryptRegistration(publicKey, payload) + decryptedPayload, err := s.decryptRegistration(publicKey, payload) if err != nil { return nil, err } @@ -87,11 +88,11 @@ func (p *Server) ValidateRegistration(publicKey *ecdsa.PublicKey, payload []byte return nil, ErrInvalidPushNotificationRegistrationVersion } - if err := p.validateUUID(registration.InstallationId); err != nil { + if err := s.validateUUID(registration.InstallationId); err != nil { return nil, ErrMalformedPushNotificationRegistrationInstallationID } - previousRegistration, err := p.persistence.GetPushNotificationRegistrationByPublicKeyAndInstallationID(common.HashPublicKey(publicKey), registration.InstallationId) + previousRegistration, err := s.persistence.GetPushNotificationRegistrationByPublicKeyAndInstallationID(common.HashPublicKey(publicKey), registration.InstallationId) if err != nil { return nil, err } @@ -105,10 +106,20 @@ func (p *Server) ValidateRegistration(publicKey *ecdsa.PublicKey, payload []byte return registration, nil } - if err := p.validateUUID(registration.AccessToken); err != nil { + if err := s.validateUUID(registration.AccessToken); err != nil { return nil, ErrMalformedPushNotificationRegistrationAccessToken } + if len(registration.Grant) == 0 { + return nil, ErrMalformedPushNotificationRegistrationGrant + } + + if err := s.verifyGrantSignature(publicKey, registration.AccessToken, registration.Grant); err != nil { + + s.config.Logger.Error("failed to verify grant", zap.Error(err)) + return nil, ErrMalformedPushNotificationRegistrationGrant + } + if len(registration.Token) == 0 { return nil, ErrMalformedPushNotificationRegistrationDeviceToken } @@ -139,6 +150,7 @@ func (p *Server) HandlePushNotificationQuery(query *protobuf.PushNotificationQue registration := idAndResponse.Registration info := &protobuf.PushNotificationQueryInfo{ PublicKey: idAndResponse.ID, + Grant: registration.Grant, InstallationId: registration.InstallationId, } @@ -338,3 +350,33 @@ func (p *Server) HandlePushNotificationRequest2(publicKey *ecdsa.PublicKey, _, err = p.messageProcessor.SendPrivate(context.Background(), publicKey, rawMessage) return err } + +// buildGrantSignatureMaterial builds a grant for a specific server. +// We use 3 components: +// 1) The client public key. Not sure this applies to our signature scheme, but best to be conservative. https://crypto.stackexchange.com/questions/15538/given-a-message-and-signature-find-a-public-key-that-makes-the-signature-valid +// 2) The server public key +// 3) The access token +// By verifying this signature, a client can trust the server was instructed to store this access token. + +func (s *Server) buildGrantSignatureMaterial(clientPublicKey *ecdsa.PublicKey, serverPublicKey *ecdsa.PublicKey, accessToken string) []byte { + var signatureMaterial []byte + signatureMaterial = append(signatureMaterial, crypto.CompressPubkey(clientPublicKey)...) + signatureMaterial = append(signatureMaterial, crypto.CompressPubkey(serverPublicKey)...) + signatureMaterial = append(signatureMaterial, []byte(accessToken)...) + a := crypto.Keccak256(signatureMaterial) + return a +} + +func (s *Server) verifyGrantSignature(clientPublicKey *ecdsa.PublicKey, accessToken string, grant []byte) error { + signatureMaterial := s.buildGrantSignatureMaterial(clientPublicKey, &s.config.Identity.PublicKey, accessToken) + recoveredPublicKey, err := crypto.SigToPub(signatureMaterial, grant) + if err != nil { + return err + } + + if !common.IsPubKeyEqual(recoveredPublicKey, clientPublicKey) { + return errors.New("pubkey mismatch") + } + return nil + +} diff --git a/protocol/push_notification_server/server_test.go b/protocol/push_notification_server/server_test.go index 71ec95a10..4f31070e5 100644 --- a/protocol/push_notification_server/server_test.go +++ b/protocol/push_notification_server/server_test.go @@ -34,6 +34,7 @@ type ServerSuite struct { identity *ecdsa.PrivateKey key *ecdsa.PrivateKey sharedKey []byte + grant []byte server *Server } @@ -64,6 +65,11 @@ func (s *ServerSuite) SetupTest() { sharedKey, err := s.server.generateSharedKey(&s.key.PublicKey) s.Require().NoError(err) s.sharedKey = sharedKey + signatureMaterial := s.server.buildGrantSignatureMaterial(&s.key.PublicKey, &identity.PublicKey, s.accessToken) + grant, err := crypto.Sign(signatureMaterial, s.key) + s.Require().NoError(err) + + s.grant = grant } @@ -104,6 +110,7 @@ func (s *ServerSuite) TestPushNotificationServerValidateRegistration() { // Missing installationID payload, err := proto.Marshal(&protobuf.PushNotificationRegistration{ AccessToken: s.accessToken, + Grant: s.grant, TokenType: protobuf.PushNotificationRegistration_APN_TOKEN, Version: 1, }) @@ -118,6 +125,7 @@ func (s *ServerSuite) TestPushNotificationServerValidateRegistration() { payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{ AccessToken: s.accessToken, TokenType: protobuf.PushNotificationRegistration_APN_TOKEN, + Grant: s.grant, InstallationId: "abc", Version: 1, }) @@ -130,6 +138,7 @@ func (s *ServerSuite) TestPushNotificationServerValidateRegistration() { payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{ AccessToken: s.accessToken, TokenType: protobuf.PushNotificationRegistration_APN_TOKEN, + Grant: s.grant, InstallationId: s.installationID, }) s.Require().NoError(err) @@ -142,6 +151,7 @@ func (s *ServerSuite) TestPushNotificationServerValidateRegistration() { // Version lower than previous one payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{ AccessToken: s.accessToken, + Grant: s.grant, TokenType: protobuf.PushNotificationRegistration_APN_TOKEN, InstallationId: s.installationID, Version: 1, @@ -154,6 +164,7 @@ func (s *ServerSuite) TestPushNotificationServerValidateRegistration() { // Setup persistence s.Require().NoError(s.persistence.SavePushNotificationRegistration(common.HashPublicKey(&s.key.PublicKey), &protobuf.PushNotificationRegistration{ AccessToken: s.accessToken, + Grant: s.grant, TokenType: protobuf.PushNotificationRegistration_APN_TOKEN, InstallationId: s.installationID, Version: 2})) @@ -168,6 +179,7 @@ func (s *ServerSuite) TestPushNotificationServerValidateRegistration() { payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{ TokenType: protobuf.PushNotificationRegistration_APN_TOKEN, InstallationId: s.installationID, + Grant: s.grant, Unregister: true, Version: 1, }) @@ -181,6 +193,7 @@ func (s *ServerSuite) TestPushNotificationServerValidateRegistration() { // Missing access token payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{ InstallationId: s.installationID, + Grant: s.grant, TokenType: protobuf.PushNotificationRegistration_APN_TOKEN, Version: 1, }) @@ -195,6 +208,7 @@ func (s *ServerSuite) TestPushNotificationServerValidateRegistration() { payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{ AccessToken: "bc", TokenType: protobuf.PushNotificationRegistration_APN_TOKEN, + Grant: s.grant, InstallationId: s.installationID, Version: 1, }) @@ -209,6 +223,7 @@ func (s *ServerSuite) TestPushNotificationServerValidateRegistration() { payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{ AccessToken: s.accessToken, TokenType: protobuf.PushNotificationRegistration_APN_TOKEN, + Grant: s.grant, InstallationId: s.installationID, Version: 1, }) @@ -219,10 +234,41 @@ func (s *ServerSuite) TestPushNotificationServerValidateRegistration() { _, err = s.server.ValidateRegistration(&s.key.PublicKey, cyphertext) s.Require().Equal(ErrMalformedPushNotificationRegistrationDeviceToken, err) + // Missing grant + payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{ + AccessToken: s.accessToken, + Token: "device-token", + InstallationId: s.installationID, + Version: 1, + }) + s.Require().NoError(err) + + cyphertext, err = common.Encrypt(payload, s.sharedKey, rand.Reader) + s.Require().NoError(err) + _, err = s.server.ValidateRegistration(&s.key.PublicKey, cyphertext) + s.Require().Equal(ErrMalformedPushNotificationRegistrationGrant, err) + + // Invalid grant + payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{ + AccessToken: s.accessToken, + TokenType: protobuf.PushNotificationRegistration_APN_TOKEN, + Token: "device-token", + Grant: crypto.Keccak256([]byte("invalid")), + InstallationId: s.installationID, + Version: 1, + }) + s.Require().NoError(err) + + cyphertext, err = common.Encrypt(payload, s.sharedKey, rand.Reader) + s.Require().NoError(err) + _, err = s.server.ValidateRegistration(&s.key.PublicKey, cyphertext) + s.Require().Equal(ErrMalformedPushNotificationRegistrationGrant, err) + // Missing token type payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{ AccessToken: s.accessToken, Token: "device-token", + Grant: s.grant, InstallationId: s.installationID, Version: 1, }) @@ -237,6 +283,7 @@ func (s *ServerSuite) TestPushNotificationServerValidateRegistration() { payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{ Token: "abc", AccessToken: s.accessToken, + Grant: s.grant, TokenType: protobuf.PushNotificationRegistration_APN_TOKEN, InstallationId: s.installationID, Version: 1, @@ -299,6 +346,7 @@ func (s *ServerSuite) TestPushNotificationHandleRegistration() { // Missing installationID payload, err := proto.Marshal(&protobuf.PushNotificationRegistration{ AccessToken: s.accessToken, + Grant: s.grant, Version: 1, }) s.Require().NoError(err) @@ -314,6 +362,7 @@ func (s *ServerSuite) TestPushNotificationHandleRegistration() { payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{ AccessToken: s.accessToken, InstallationId: "abc", + Grant: s.grant, Version: 1, }) cyphertext, err = common.Encrypt(payload, s.sharedKey, rand.Reader) @@ -326,6 +375,7 @@ func (s *ServerSuite) TestPushNotificationHandleRegistration() { // Version set to 0 payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{ AccessToken: s.accessToken, + Grant: s.grant, InstallationId: s.installationID, }) s.Require().NoError(err) @@ -340,6 +390,7 @@ func (s *ServerSuite) TestPushNotificationHandleRegistration() { // Version lower than previous one payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{ AccessToken: s.accessToken, + Grant: s.grant, InstallationId: s.installationID, Version: 1, }) @@ -351,6 +402,7 @@ func (s *ServerSuite) TestPushNotificationHandleRegistration() { // Setup persistence s.Require().NoError(s.persistence.SavePushNotificationRegistration(common.HashPublicKey(&s.key.PublicKey), &protobuf.PushNotificationRegistration{ AccessToken: s.accessToken, + Grant: s.grant, InstallationId: s.installationID, Version: 2})) @@ -365,6 +417,7 @@ func (s *ServerSuite) TestPushNotificationHandleRegistration() { // Missing access token payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{ InstallationId: s.installationID, + Grant: s.grant, Version: 1, }) s.Require().NoError(err) @@ -379,6 +432,7 @@ func (s *ServerSuite) TestPushNotificationHandleRegistration() { // Invalid access token payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{ AccessToken: "bc", + Grant: s.grant, InstallationId: s.installationID, Version: 1, }) @@ -394,6 +448,7 @@ func (s *ServerSuite) TestPushNotificationHandleRegistration() { // Missing device token payload, err = proto.Marshal(&protobuf.PushNotificationRegistration{ AccessToken: s.accessToken, + Grant: s.grant, InstallationId: s.installationID, Version: 1, }) @@ -410,6 +465,7 @@ func (s *ServerSuite) TestPushNotificationHandleRegistration() { registration := &protobuf.PushNotificationRegistration{ Token: "abc", AccessToken: s.accessToken, + Grant: s.grant, TokenType: protobuf.PushNotificationRegistration_APN_TOKEN, InstallationId: s.installationID, Version: 1, @@ -461,6 +517,7 @@ func (s *ServerSuite) TestHandlePushNotificationQueryNoFiltering() { registration := &protobuf.PushNotificationRegistration{ Token: "abc", AccessToken: s.accessToken, + Grant: s.grant, TokenType: protobuf.PushNotificationRegistration_APN_TOKEN, InstallationId: s.installationID, Version: 1, @@ -496,6 +553,7 @@ func (s *ServerSuite) TestHandlePushNotificationQueryWithFiltering() { registration := &protobuf.PushNotificationRegistration{ Token: "abc", AccessToken: s.accessToken, + Grant: s.grant, TokenType: protobuf.PushNotificationRegistration_APN_TOKEN, InstallationId: s.installationID, AllowedUserList: allowedUserList,