Skip to content

Commit

Permalink
NR-261761-2: Wrap up NSSecureCoding fixes, bump to iOS 11.0 (#266)
Browse files Browse the repository at this point in the history
  • Loading branch information
cdillard-NewRelic authored Jun 24, 2024
1 parent 164fe8d commit bf6a1a4
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 45 deletions.
20 changes: 10 additions & 10 deletions Agent.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -6110,7 +6110,7 @@
"${SRCROOT}/**",
);
INFOPLIST_FILE = "Tests/Unit-Tests/Shared/tests-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
Expand Down Expand Up @@ -6157,7 +6157,7 @@
"${SRCROOT}/**",
);
INFOPLIST_FILE = "Tests/Unit-Tests/Shared/tests-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
Expand Down Expand Up @@ -6242,7 +6242,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MACH_O_TYPE = mh_dylib;
MODULEMAP_FILE = module.modulemap;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
Expand Down Expand Up @@ -6311,7 +6311,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MACH_O_TYPE = mh_dylib;
MODULEMAP_FILE = module.modulemap;
MTL_ENABLE_DEBUG_INFO = NO;
Expand Down Expand Up @@ -6363,7 +6363,7 @@
);
INFOPLIST_FILE = Agent/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
Expand Down Expand Up @@ -6420,7 +6420,7 @@
);
INFOPLIST_FILE = Agent/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
Expand Down Expand Up @@ -6470,7 +6470,7 @@
"${SRCROOT}/**",
);
INFOPLIST_FILE = "Tests/Unit-Tests/Shared/tests-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
Expand Down Expand Up @@ -6521,7 +6521,7 @@
"${SRCROOT}/**",
);
INFOPLIST_FILE = "Tests/Unit-Tests/Shared/tests-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
Expand Down Expand Up @@ -6657,7 +6657,7 @@
);
INFOPLIST_FILE = "Agent/tvos-info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
Expand Down Expand Up @@ -6708,7 +6708,7 @@
);
INFOPLIST_FILE = "Agent/tvos-info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
Expand Down
2 changes: 1 addition & 1 deletion Agent/Analytics/Events/NRMAMobileEvent.m
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ - (nullable instancetype)initWithCoder:(nonnull NSCoder *)coder {
self.timestamp = [coder decodeDoubleForKey:kTimestampKey];
self.sessionElapsedTimeSeconds = [coder decodeDoubleForKey:kSessionElapsedTimeKey];
self.eventType = [coder decodeObjectOfClass:[NSString class] forKey:kEventTypeKey];
self.attributes = [coder decodeObjectOfClass:[NSString class] forKey:kAttributesKey];
self.attributes = [coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSDictionary class],[NSMutableDictionary class],[NSString class]]] forKey:kAttributesKey];
}

return self;
Expand Down
48 changes: 23 additions & 25 deletions Agent/Analytics/PersistentEventStore.m
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
//

#import "PersistentEventStore.h"

#import "NRLogger.h"
#import "NRMAMobileEvent.h"

@interface PersistentEventStore ()
@property (nonatomic, strong) dispatch_queue_t writeQueue;
Expand All @@ -21,7 +21,7 @@ @implementation PersistentEventStore {
NSTimeInterval _minimumDelay;
NSDate *_lastSave;
BOOL _dirty;

dispatch_queue_t _writeQueue;
}

Expand All @@ -34,7 +34,7 @@ - (nonnull instancetype)initWithFilename:(NSString *)filename
_minimumDelay = secondsDelay;
_lastSave = [NSDate new];
_dirty = NO;

_writeQueue = dispatch_queue_create("com.newrelic.persistentce", DISPATCH_QUEUE_SERIAL);
}
return self;
Expand All @@ -45,9 +45,9 @@ - (void)performWrite:(void (^)(void))writeBlock {
if (self.pendingBlock != nil) {
dispatch_block_cancel(self.pendingBlock);
}

self.pendingBlock = dispatch_block_create(0, writeBlock);

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self->_minimumDelay * NSEC_PER_SEC)), self->_writeQueue, self.pendingBlock);
});
}
Expand All @@ -58,8 +58,8 @@ - (void)setObject:(nonnull id)object forKey:(nonnull id)key {
_dirty = YES;
// NRLOG_AUDIT(@"Marked dirty for adding");
}
// NRLOG_AUDIT(@"Scheduling block");

// NRLOG_AUDIT(@"Scheduling block");
[self performWrite: ^ {
// NRLOG_AUDIT(@"Entered block");
@synchronized (self) {
Expand All @@ -79,7 +79,7 @@ - (void)removeObjectForKey:(id)key {
_dirty = YES;
// NRLOG_AGENT_VERBOSE(@"Marked dirty for removing");
}

dispatch_after(DISPATCH_TIME_NOW, self.writeQueue, ^{
// NRLOG_AGENT_VERBOSE(@"Entered Remove Block");
@synchronized (self) {
Expand All @@ -103,7 +103,7 @@ - (void)clearAll {
_dirty = YES;
// NRLOG_AGENT_VERBOSE(@"Marked dirty for clearing");
}

dispatch_after(DISPATCH_TIME_NOW, self.writeQueue, ^{
// NRLOG_AGENT_VERBOSE(@"Entered Clear Block");
@synchronized (self) {
Expand All @@ -120,21 +120,22 @@ - (void)clearAll {
- (BOOL)load:(NSError **)error {
NSData *storedData = [NSData dataWithContentsOfFile:_filename
options:0
error:&error];
error:error];
if(storedData == nil) {
if(error != NULL && *error != nil) {
return NO;
}
}

NSMutableDictionary *storedDictionary = [NSKeyedUnarchiver unarchiveTopLevelObjectWithData:storedData
error:error];

NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:storedData error:error];
NSDictionary* storedDictionary = [unarchiver decodeObjectOfClasses:[[NSSet alloc] initWithArray:@[[NRMAMobileEvent class],[NSMutableDictionary class],[NSDictionary class],[NSString class], [NSNumber class]]] forKey:NSKeyedArchiveRootObjectKey];

if(storedDictionary == nil) {
if(error != NULL && *error != nil) {
return NO;
}
}

@synchronized (store) {
[store addEntriesFromDictionary:storedDictionary];
}
Expand All @@ -145,14 +146,10 @@ - (void)saveToFile {
NSError *error = nil;
NSData *saveData = nil;
@synchronized (store) {
if (@available(iOS 11.0, *)) {
saveData = [NSKeyedArchiver archivedDataWithRootObject:store
requiringSecureCoding:NO
error:&error];
} else {
// Fallback on earlier versions
saveData = [NSKeyedArchiver archivedDataWithRootObject:store];
}
saveData = [NSKeyedArchiver archivedDataWithRootObject:store
requiringSecureCoding:YES
error:&error];

}

if (saveData) {
Expand All @@ -178,9 +175,10 @@ + (NSDictionary *)getLastSessionEventsFromFilename:(NSString *)filename {
return @{};
}
}

NSDictionary *storedDictionary = [NSKeyedUnarchiver unarchiveTopLevelObjectWithData:storedData
error:error];

NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:storedData error:error];
NSDictionary* storedDictionary = [unarchiver decodeObjectOfClasses:[[NSSet alloc] initWithArray:@[[NRMAMobileEvent class],[NSMutableDictionary class],[NSDictionary class],[NSString class], [NSNumber class]]] forKey:NSKeyedArchiveRootObjectKey];

if(storedDictionary == nil) {
if(error != NULL && *error != nil) {
return @{};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ - (nullable instancetype)initWithCoder:(nonnull NSCoder *)coder {
self.timestamp = [coder decodeDoubleForKey:@"Timestamp"];
self.sessionElapsedTimeSeconds = [coder decodeDoubleForKey:@"SessionElapsedTimeInSeconds"];
self.eventType = [coder decodeObjectOfClass:[NSString class] forKey:@"EventType"];
self.attributes = [coder decodeObjectOfClass:[NSString class] forKey:@"Attributes"];
self.attributes = [coder decodeObjectOfClasses:[NSSet setWithArray:@[[NSDictionary class],[NSMutableDictionary class],[NSString class]]] forKey:@"Attributes"];
}

return self;
Expand Down Expand Up @@ -144,8 +144,8 @@ - (void)testWritesObjectToFile {
NSLog(@"File found and has data");
NSData *retrievedData = [NSData dataWithContentsOfFile:testFilename];
NSError *error = nil;
NSMutableDictionary *retrievedDictionary = [NSKeyedUnarchiver unarchiveTopLevelObjectWithData:retrievedData
error:&error];
NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:retrievedData error:&error];
NSDictionary* retrievedDictionary = [unarchiver decodeObjectOfClasses:[[NSSet alloc] initWithArray:@[[NRMAMobileEvent class],[NSDictionary class],[NSMutableDictionary class],[NSString class], [NSNumber class]]] forKey:NSKeyedArchiveRootObjectKey];
if(retrievedDictionary.count == 1) {
NSLog(@"Initial file found and full");
NSDictionary *attributes = ((NRMAMobileEvent *)retrievedDictionary[@"aKey"]).attributes;
Expand Down Expand Up @@ -184,8 +184,9 @@ - (void)testWritesObjectToFile {

NSData *retrievedData = [NSData dataWithContentsOfFile:testFilename];
NSError *error = nil;
NSMutableDictionary *retrievedDictionary = [NSKeyedUnarchiver unarchiveTopLevelObjectWithData:retrievedData
error:&error];
NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:retrievedData error:&error];
NSDictionary* retrievedDictionary = [unarchiver decodeObjectOfClasses:[[NSSet alloc] initWithArray:@[[NRMAMobileEvent class],[NSDictionary class],[NSMutableDictionary class],[NSString class], [NSNumber class]]] forKey:NSKeyedArchiveRootObjectKey];

XCTAssertNil(error, "Error testing file written: %@", [error localizedDescription]);
XCTAssertEqual([retrievedDictionary count], 1);

Expand Down Expand Up @@ -223,8 +224,9 @@ - (void)testStoreHandlesDifferentTypesOfEvents {
NSLog(@"File found and has data");
NSData *retrievedData = [NSData dataWithContentsOfFile:testFilename];
NSError *error = nil;
NSMutableDictionary *retrievedDictionary = [NSKeyedUnarchiver unarchiveTopLevelObjectWithData:retrievedData
error:&error];
NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:retrievedData error:&error];
NSDictionary* retrievedDictionary = [unarchiver decodeObjectOfClasses:[[NSSet alloc] initWithArray:@[[NRMAMobileEvent class],[NSDictionary class],[NSMutableDictionary class],[NSString class], [NSNumber class]]] forKey:NSKeyedArchiveRootObjectKey];

if(retrievedDictionary.count == 3) {
NSLog(@"Initial file found and full");
dispatch_cancel(fileSource);
Expand Down Expand Up @@ -307,8 +309,10 @@ - (void)testEventRemoval {
NSLog(@"File found and has data");
NSData *retrievedData = [NSData dataWithContentsOfFile:testFilename];
NSError *error = nil;
NSMutableDictionary *retrievedDictionary = [NSKeyedUnarchiver unarchiveTopLevelObjectWithData:retrievedData
error:&error];

NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:retrievedData error:&error];
NSDictionary* retrievedDictionary = [unarchiver decodeObjectOfClasses:[[NSSet alloc] initWithArray:@[[NRMAMobileEvent class],[NSDictionary class],[NSMutableDictionary class],[NSString class], [NSNumber class]]] forKey:NSKeyedArchiveRootObjectKey];

if(retrievedDictionary.count == 3) {
NSLog(@"Initial file found and full");
dispatch_cancel(fileSource);
Expand Down

0 comments on commit bf6a1a4

Please sign in to comment.