handle unregistered clients
This commit is contained in:
parent
4b9d3df5ad
commit
aa78b89b40
|
@ -39,7 +39,8 @@ func NewSQLitePersistence(db *sql.DB) Persistence {
|
||||||
|
|
||||||
func (p *SQLitePersistence) GetPushNotificationRegistrationByPublicKeyAndInstallationID(publicKey []byte, installationID string) (*protobuf.PushNotificationRegistration, error) {
|
func (p *SQLitePersistence) GetPushNotificationRegistrationByPublicKeyAndInstallationID(publicKey []byte, installationID string) (*protobuf.PushNotificationRegistration, error) {
|
||||||
var marshaledRegistration []byte
|
var marshaledRegistration []byte
|
||||||
err := p.db.QueryRow(`SELECT registration FROM push_notification_server_registrations WHERE public_key = ? AND installation_id = ?`, publicKey, installationID).Scan(&marshaledRegistration)
|
var version uint64
|
||||||
|
err := p.db.QueryRow(`SELECT version,registration FROM push_notification_server_registrations WHERE public_key = ? AND installation_id = ?`, publicKey, installationID).Scan(&version, &marshaledRegistration)
|
||||||
|
|
||||||
if err == sql.ErrNoRows {
|
if err == sql.ErrNoRows {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
@ -47,7 +48,14 @@ func (p *SQLitePersistence) GetPushNotificationRegistrationByPublicKeyAndInstall
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
registration := &protobuf.PushNotificationRegistration{}
|
registration := &protobuf.PushNotificationRegistration{
|
||||||
|
InstallationId: installationID,
|
||||||
|
Version: version,
|
||||||
|
}
|
||||||
|
|
||||||
|
if marshaledRegistration == nil {
|
||||||
|
return registration, nil
|
||||||
|
}
|
||||||
|
|
||||||
if err := proto.Unmarshal(marshaledRegistration, registration); err != nil {
|
if err := proto.Unmarshal(marshaledRegistration, registration); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -86,6 +94,10 @@ func (p *SQLitePersistence) GetPushNotificationRegistrationByPublicKeys(publicKe
|
||||||
}
|
}
|
||||||
|
|
||||||
registration := &protobuf.PushNotificationRegistration{}
|
registration := &protobuf.PushNotificationRegistration{}
|
||||||
|
// Skip if there's no registration
|
||||||
|
if marshaledRegistration == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
if err := proto.Unmarshal(marshaledRegistration, registration); err != nil {
|
if err := proto.Unmarshal(marshaledRegistration, registration); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -97,7 +109,7 @@ func (p *SQLitePersistence) GetPushNotificationRegistrationByPublicKeys(publicKe
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *SQLitePersistence) GetPushNotificationRegistrationPublicKeys() ([][]byte, error) {
|
func (p *SQLitePersistence) GetPushNotificationRegistrationPublicKeys() ([][]byte, error) {
|
||||||
rows, err := p.db.Query(`SELECT public_key FROM push_notification_server_registrations`)
|
rows, err := p.db.Query(`SELECT public_key FROM push_notification_server_registrations WHERE registration IS NOT NULL`)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -336,11 +336,10 @@ func (s *Server) buildPushNotificationRequestResponseAndSendNotification(request
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.config.Logger.Error("failed to retrieve registration", zap.Error(err))
|
s.config.Logger.Error("failed to retrieve registration", zap.Error(err))
|
||||||
report.Error = protobuf.PushNotificationReport_UNKNOWN_ERROR_TYPE
|
report.Error = protobuf.PushNotificationReport_UNKNOWN_ERROR_TYPE
|
||||||
} else if registration == nil {
|
} else if registration == nil || registration.AccessToken == "" {
|
||||||
s.config.Logger.Warn("empty registration")
|
s.config.Logger.Warn("empty registration")
|
||||||
report.Error = protobuf.PushNotificationReport_NOT_REGISTERED
|
report.Error = protobuf.PushNotificationReport_NOT_REGISTERED
|
||||||
} else if registration.AccessToken != pn.AccessToken {
|
} else if registration.AccessToken != pn.AccessToken {
|
||||||
s.config.Logger.Warn("invalid access token")
|
|
||||||
report.Error = protobuf.PushNotificationReport_WRONG_TOKEN
|
report.Error = protobuf.PushNotificationReport_WRONG_TOKEN
|
||||||
} else {
|
} else {
|
||||||
// For now we just assume that the notification will be successful
|
// For now we just assume that the notification will be successful
|
||||||
|
@ -403,6 +402,7 @@ func (s *Server) buildPushNotificationRegistrationResponse(publicKey *ecdsa.Publ
|
||||||
}
|
}
|
||||||
|
|
||||||
if registration.Unregister {
|
if registration.Unregister {
|
||||||
|
s.config.Logger.Info("unregistering client")
|
||||||
// We save an empty registration, only keeping version and installation-id
|
// We save an empty registration, only keeping version and installation-id
|
||||||
emptyRegistration := &protobuf.PushNotificationRegistration{
|
emptyRegistration := &protobuf.PushNotificationRegistration{
|
||||||
Version: registration.Version,
|
Version: registration.Version,
|
||||||
|
|
|
@ -444,7 +444,7 @@ func (api *PublicAPI) RegisterForPushNotifications(ctx context.Context, deviceTo
|
||||||
return api.service.messenger.RegisterForPushNotifications(ctx, deviceToken, apnTopic, tokenType)
|
return api.service.messenger.RegisterForPushNotifications(ctx, deviceToken, apnTopic, tokenType)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (api *PublicAPI) UnregisterForPushNotifications(ctx context.Context) error {
|
func (api *PublicAPI) UnregisterFromPushNotifications(ctx context.Context) error {
|
||||||
err := api.service.accountsDB.SaveSetting("remote-push-notifications-enabled?", false)
|
err := api.service.accountsDB.SaveSetting("remote-push-notifications-enabled?", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
Loading…
Reference in New Issue