Make sure request is originating from us before marking it as processed
This commit fixes one source of flakyness in the tests, which was an actual bug. If 1 device is registering with a push notification server, if there's another device with the same public key, both would mark themselves as registered, while maybe only one has been actually registered. To fix this, we keep track of the request ids we send (in memory for now), and only mark it as registered if the request was originating on this device.
This commit is contained in:
parent
902b97be06
commit
5c55ab5264
|
@ -192,16 +192,22 @@ type Client struct {
|
||||||
|
|
||||||
// registrationSubscriptions is a list of chan of client subscribed to the registration event
|
// registrationSubscriptions is a list of chan of client subscribed to the registration event
|
||||||
registrationSubscriptions []chan struct{}
|
registrationSubscriptions []chan struct{}
|
||||||
|
|
||||||
|
// pendingRegistrations is a map of pending registrations.
|
||||||
|
// in theory we should store them in the database, but for now we can keep them in memory at
|
||||||
|
// the cost of having to register multiple times in case the program stops
|
||||||
|
pendingRegistrations map[string]bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(persistence *Persistence, config *Config, sender *common.MessageSender, messagePersistence MessagePersistence) *Client {
|
func New(persistence *Persistence, config *Config, sender *common.MessageSender, messagePersistence MessagePersistence) *Client {
|
||||||
return &Client{
|
return &Client{
|
||||||
quit: make(chan struct{}),
|
quit: make(chan struct{}),
|
||||||
config: config,
|
config: config,
|
||||||
messageSender: sender,
|
messageSender: sender,
|
||||||
messagePersistence: messagePersistence,
|
messagePersistence: messagePersistence,
|
||||||
persistence: persistence,
|
persistence: persistence,
|
||||||
reader: rand.Reader,
|
pendingRegistrations: make(map[string]bool),
|
||||||
|
reader: rand.Reader,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -399,6 +405,14 @@ func (c *Client) Register(deviceToken, apnTopic string, tokenType protobuf.PushN
|
||||||
func (c *Client) HandlePushNotificationRegistrationResponse(publicKey *ecdsa.PublicKey, response protobuf.PushNotificationRegistrationResponse) error {
|
func (c *Client) HandlePushNotificationRegistrationResponse(publicKey *ecdsa.PublicKey, response protobuf.PushNotificationRegistrationResponse) error {
|
||||||
c.config.Logger.Debug("received push notification registration response", zap.Any("response", response))
|
c.config.Logger.Debug("received push notification registration response", zap.Any("response", response))
|
||||||
|
|
||||||
|
if len(response.RequestId) == 0 {
|
||||||
|
return errors.New("empty requestId")
|
||||||
|
}
|
||||||
|
|
||||||
|
if !c.pendingRegistrations[hex.EncodeToString(response.RequestId)] {
|
||||||
|
return errors.New("not for one of our requests")
|
||||||
|
}
|
||||||
|
|
||||||
// Not successful ignore for now
|
// Not successful ignore for now
|
||||||
if !response.Success {
|
if !response.Success {
|
||||||
return errors.New("response was not successful")
|
return errors.New("response was not successful")
|
||||||
|
@ -1278,6 +1292,8 @@ func (c *Client) registerWithServer(registration *protobuf.PushNotificationRegis
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
c.pendingRegistrations[hex.EncodeToString(common.Shake256(encryptedRegistration))] = true
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1318,7 +1334,6 @@ func (c *Client) SendNotification(publicKey *ecdsa.PublicKey, installationIDs []
|
||||||
// one info per installation id, grouped by server
|
// one info per installation id, grouped by server
|
||||||
actionableInfos := make(map[string][]*PushNotificationInfo)
|
actionableInfos := make(map[string][]*PushNotificationInfo)
|
||||||
|
|
||||||
c.config.Logger.Info("INFOS", zap.Any("info", info))
|
|
||||||
for _, i := range info {
|
for _, i := range info {
|
||||||
|
|
||||||
if !installationIDsMap[i.InstallationID] {
|
if !installationIDsMap[i.InstallationID] {
|
||||||
|
|
Loading…
Reference in New Issue