From 09f1a42cb288134c289ae269e6cb9bdb505996d9 Mon Sep 17 00:00:00 2001 From: Marat Al Date: Mon, 25 Mar 2024 00:01:46 +0100 Subject: [PATCH 1/3] Added `deviceSecret` in device registration POST. --- Source/ARTJsonLikeEncoder.m | 12 +++++++++++- Source/ARTPushActivationStateMachine.m | 2 +- Source/include/Ably/ARTEncoder.h | 4 ++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Source/ARTJsonLikeEncoder.m b/Source/ARTJsonLikeEncoder.m index a020dce26..ff5358755 100644 --- a/Source/ARTJsonLikeEncoder.m +++ b/Source/ARTJsonLikeEncoder.m @@ -132,6 +132,10 @@ - (NSData *)encodeDeviceDetails:(ARTDeviceDetails *)deviceDetails error:(NSError return [self encode:[self deviceDetailsToDictionary:deviceDetails] error:error]; } +- (NSData *)encodeLocalDevice:(ARTLocalDevice *)device error:(NSError **)error { + return [self encode:[self localDeviceToDictionary:device] error:error]; +} + - (ARTDeviceDetails *)decodeDeviceDetails:(NSData *)data error:(NSError **)error { return [self deviceDetailsFromDictionary:[self decodeDictionary:data error:nil] error:error]; } @@ -627,7 +631,7 @@ - (NSDictionary *)tokenDetailsToDictionary:(ARTTokenDetails *)tokenDetails { return dictionary; } -- (NSDictionary *)deviceDetailsToDictionary:(ARTDeviceDetails *)deviceDetails { +- (NSMutableDictionary *)deviceDetailsToDictionary:(ARTDeviceDetails *)deviceDetails { NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; dictionary[@"id"] = deviceDetails.id; @@ -643,6 +647,12 @@ - (NSDictionary *)deviceDetailsToDictionary:(ARTDeviceDetails *)deviceDetails { return dictionary; } +- (NSDictionary *)localDeviceToDictionary:(ARTLocalDevice *)device { + NSMutableDictionary *dictionary = [self deviceDetailsToDictionary:device]; + dictionary[@"deviceSecret"] = device.secret; + return dictionary; +} + - (ARTDeviceDetails *)deviceDetailsFromDictionary:(NSDictionary *)input error:(NSError * __autoreleasing *)error { ARTLogVerbose(_logger, @"RS:%p ARTJsonLikeEncoder<%@>: deviceDetailsFromDictionary %@", _rest, [_delegate formatAsString], input); diff --git a/Source/ARTPushActivationStateMachine.m b/Source/ARTPushActivationStateMachine.m index 3701a527a..9b4f06244 100644 --- a/Source/ARTPushActivationStateMachine.m +++ b/Source/ARTPushActivationStateMachine.m @@ -183,7 +183,7 @@ - (void)deviceRegistration:(ARTErrorInfo *)error { // Asynchronous HTTP request NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"/push/deviceRegistrations"]]; request.HTTPMethod = @"POST"; - request.HTTPBody = [[self->_rest defaultEncoder] encodeDeviceDetails:local error:nil]; + request.HTTPBody = [[self->_rest defaultEncoder] encodeLocalDevice:local error:nil]; [request setValue:[[self->_rest defaultEncoder] mimeType] forHTTPHeaderField:@"Content-Type"]; ARTLogDebug(self->_logger, @"%@: device registration with request %@", NSStringFromClass(self.class), request); diff --git a/Source/include/Ably/ARTEncoder.h b/Source/include/Ably/ARTEncoder.h index ac7ecbab9..9d740a78b 100644 --- a/Source/include/Ably/ARTEncoder.h +++ b/Source/include/Ably/ARTEncoder.h @@ -10,6 +10,7 @@ @class ARTDeviceIdentityTokenDetails; @class ARTDevicePushDetails; @class ARTPushChannelSubscription; +@class ARTLocalDevice; @protocol ARTPushRecipient; @@ -67,6 +68,9 @@ NS_ASSUME_NONNULL_BEGIN - (nullable NSData *)encodeDeviceDetails:(ARTDeviceDetails *)deviceDetails error:(NSError *_Nullable *_Nullable)error; - (nullable ARTDeviceDetails *)decodeDeviceDetails:(NSData *)data error:(NSError *_Nullable *_Nullable)error; +// LocalDevice +- (nullable NSData *)encodeLocalDevice:(ARTLocalDevice *)device error:(NSError *_Nullable *_Nullable)error; + // ChannelDetails - (nullable ARTChannelDetails *)decodeChannelDetails:(NSData *)data error:(NSError *_Nullable *_Nullable)error; From fe0b9e6dec5110f504a9fe29c4b68d0e98cefe3e Mon Sep 17 00:00:00 2001 From: Marat Al Date: Mon, 25 Mar 2024 14:08:15 +0100 Subject: [PATCH 2/3] Added forgotten authentication for PUT `/push/deviceRegistrations`. --- Source/ARTPushActivationStateMachine.m | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/ARTPushActivationStateMachine.m b/Source/ARTPushActivationStateMachine.m index 9b4f06244..92288c652 100644 --- a/Source/ARTPushActivationStateMachine.m +++ b/Source/ARTPushActivationStateMachine.m @@ -298,6 +298,7 @@ - (void)syncDevice { request.HTTPMethod = @"PUT"; request.HTTPBody = [[self->_rest defaultEncoder] encodeDeviceDetails:local error:nil]; [request setValue:[[self->_rest defaultEncoder] mimeType] forHTTPHeaderField:@"Content-Type"]; + [request setDeviceAuthentication:local]; ARTLogDebug(self->_logger, @"%@: sync device with request %@", NSStringFromClass(self.class), request); [self->_rest executeRequest:request withAuthOption:ARTAuthenticationOn completion:^(NSHTTPURLResponse *response, NSData *data, NSError *error) { From 2eaa25690189a1e356d83dcc1b495cabe4b7203c Mon Sep 17 00:00:00 2001 From: Marat Al Date: Mon, 25 Mar 2024 15:40:59 +0100 Subject: [PATCH 3/3] Added assertion for `deviceSecret` in `RSH3b3b` test. --- Test/Tests/PushActivationStateMachineTests.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Test/Tests/PushActivationStateMachineTests.swift b/Test/Tests/PushActivationStateMachineTests.swift index b47be792c..ba6130b62 100644 --- a/Test/Tests/PushActivationStateMachineTests.swift +++ b/Test/Tests/PushActivationStateMachineTests.swift @@ -352,6 +352,7 @@ class PushActivationStateMachineTests: XCTestCase { XCTAssertEqual(url.host, rest.internal.options.restUrl().host) XCTAssertEqual(request.httpMethod, "POST") XCTAssertEqual(body.value(forKey: "id") as? String, rest.device.id) + XCTAssertEqual(body.value(forKey: "deviceSecret") as? String, rest.device.secret) XCTAssertEqual(body.value(forKey: "push") as? [String: [String: AnyHashable]], expectedPushRecipient) XCTAssertEqual(body.value(forKey: "formFactor") as? String, expectedFormFactor) XCTAssertEqual(body.value(forKey: "platform") as? String, expectedPlatform)