diff options
author | lapinskijw <jlapinski.dev@gmail.com> | 2020-07-07 17:33:11 -0400 |
---|---|---|
committer | lapinskijw <jlapinski.dev@gmail.com> | 2020-07-07 17:33:11 -0400 |
commit | f03a52d82eb22fce14a491aa80197baa9e2d4fb7 (patch) | |
tree | 7b86f50201a2fbf36dbe644f2102fdf820ce4eaa | |
parent | 14cf78c5756df27d0d43e5da06728af0b60672f5 (diff) | |
download | sdl_ios-f03a52d82eb22fce14a491aa80197baa9e2d4fb7.tar.gz |
addressed PR comments
-rw-r--r-- | Example Apps/Example ObjC/RPCPermissionsManager.m | 16 | ||||
-rw-r--r-- | SmartDeviceLink/SDLPermissionFilter.h | 3 | ||||
-rw-r--r-- | SmartDeviceLink/SDLPermissionFilter.m | 14 | ||||
-rw-r--r-- | SmartDeviceLink/SDLPermissionManager.h | 6 | ||||
-rw-r--r-- | SmartDeviceLink/SDLPermissionManager.m | 34 | ||||
-rw-r--r-- | SmartDeviceLink/SDLRPCPermissionStatus.m | 6 | ||||
-rw-r--r-- | SmartDeviceLinkTests/DevAPISpecs/SDLPermissionsManagerSpec.m | 12 |
7 files changed, 46 insertions, 45 deletions
diff --git a/Example Apps/Example ObjC/RPCPermissionsManager.m b/Example Apps/Example ObjC/RPCPermissionsManager.m index 52042778f..9fe9d75e8 100644 --- a/Example Apps/Example ObjC/RPCPermissionsManager.m +++ b/Example Apps/Example ObjC/RPCPermissionsManager.m @@ -28,19 +28,19 @@ NS_ASSUME_NONNULL_BEGIN SDLPermissionElement *createInteractionPermissionElement = [[SDLPermissionElement alloc] initWithRPCName:SDLRPCFunctionNameCreateInteractionChoiceSet parameterPermissions:nil]; SDLPermissionElement *performInteractionPermissionElement = [[SDLPermissionElement alloc] initWithRPCName:SDLRPCFunctionNamePerformInteraction parameterPermissions:nil]; NSArray<SDLPermissionElement *> *menuRPCPermissions = @[addCommandPermissionElement, createInteractionPermissionElement, performInteractionPermissionElement]; - [self sdlex_checkCurrentGroupPermissionsWithManager:manager rpcNames:menuRPCPermissions]; + [self sdlex_checkCurrentGroupPermissionsWithManager:manager permissionElements:menuRPCPermissions]; // Set up an observer for permissions changes to media template releated RPCs. Since the `groupType` is set to all allowed, this block is called when the group permissions changes from all allowed. This block is called immediately when created. SDLPermissionElement *setMediaClockPermissionElement = [[SDLPermissionElement alloc] initWithRPCName:SDLRPCFunctionNameSetMediaClockTimer parameterPermissions:nil]; SDLPermissionElement *subscribeButtonPermissionElement = [[SDLPermissionElement alloc] initWithRPCName:SDLRPCFunctionNameSubscribeButton parameterPermissions:nil]; NSArray<SDLPermissionElement *> *mediaTemplateRPCPermissions = @[setMediaClockPermissionElement, subscribeButtonPermissionElement]; - SDLPermissionObserverIdentifier allAllowedObserverId = [self sdlex_subscribeGroupPermissionsWithManager:manager rpcNames:mediaTemplateRPCPermissions groupType:SDLPermissionGroupTypeAllAllowed]; + SDLPermissionObserverIdentifier allAllowedObserverId = [self sdlex_subscribeGroupPermissionsWithManager:manager permissionElements:mediaTemplateRPCPermissions groupType:SDLPermissionGroupTypeAllAllowed]; // Stop observing permissions changes for the media template releated RPCs [self sdlex_unsubscribeGroupPermissionsWithManager:manager observerId:allAllowedObserverId]; // Set up an observer for permissions changes to media template releated RPCs. Since the `groupType` is set to any, this block is called when the permission status changes for any of the RPCs being observed. This block is called immediately when created. - [self sdlex_subscribeGroupPermissionsWithManager:manager rpcNames:mediaTemplateRPCPermissions groupType:SDLPermissionGroupTypeAny]; + [self sdlex_subscribeGroupPermissionsWithManager:manager permissionElements:mediaTemplateRPCPermissions groupType:SDLPermissionGroupTypeAny]; } /** @@ -79,9 +79,9 @@ NS_ASSUME_NONNULL_BEGIN * @return The current permission status for all the RPCs in the group */ + (SDLPermissionGroupStatus)sdlex_checkCurrentGroupPermissionsWithManager:(SDLManager *)manager permissionElements:(NSArray<SDLPermissionElement *> *)permissionElements { - SDLPermissionGroupStatus groupPermissionStatus = [manager.permissionManager groupStatusOfRPCPermissions:rpcNames]; - NSDictionary<NSString *, SDLRPCPermissionStatus *> *individualPermissionStatuses = [manager.permissionManager statusesOfRPCPermissions:rpcNames]; - [self sdlex_logRPCGroupPermissions:rpcNames groupPermissionStatus:groupPermissionStatus individualPermissionStatuses:individualPermissionStatuses]; + SDLPermissionGroupStatus groupPermissionStatus = [manager.permissionManager groupStatusOfRPCPermissions:permissionElements]; + NSDictionary<NSString *, SDLRPCPermissionStatus *> *individualPermissionStatuses = [manager.permissionManager statusesOfRPCPermissions:permissionElements]; + [self sdlex_logRPCGroupPermissions:permissionElements groupPermissionStatus:groupPermissionStatus individualPermissionStatuses:individualPermissionStatuses]; return groupPermissionStatus; } @@ -96,8 +96,8 @@ NS_ASSUME_NONNULL_BEGIN * @return A unique identifier for the subscription. This can be used to later to unsubscribe from the notifications. */ + (SDLPermissionObserverIdentifier)sdlex_subscribeGroupPermissionsWithManager:(SDLManager *)manager permissionElements:(NSArray<SDLPermissionElement *> *)permissionElements groupType:(SDLPermissionGroupType)groupType { - SDLPermissionObserverIdentifier observerId = [manager.permissionManager subscribeToRPCPermissions:rpcNames groupType:groupType withHandler:^(NSDictionary<SDLPermissionRPCName,SDLRPCPermissionStatus *> * _Nonnull change, SDLPermissionGroupStatus status) { - [self sdlex_logRPCGroupPermissions:rpcNames groupPermissionStatus:status individualPermissionStatuses:change]; + SDLPermissionObserverIdentifier observerId = [manager.permissionManager subscribeToRPCPermissions:permissionElements groupType:groupType withHandler:^(NSDictionary<SDLPermissionRPCName,SDLRPCPermissionStatus *> * _Nonnull change, SDLPermissionGroupStatus status) { + [self sdlex_logRPCGroupPermissions:permissionElements groupPermissionStatus:status individualPermissionStatuses:change]; }]; return observerId; } diff --git a/SmartDeviceLink/SDLPermissionFilter.h b/SmartDeviceLink/SDLPermissionFilter.h index 93343af49..93cf4d2fd 100644 --- a/SmartDeviceLink/SDLPermissionFilter.h +++ b/SmartDeviceLink/SDLPermissionFilter.h @@ -41,6 +41,9 @@ NS_ASSUME_NONNULL_BEGIN */ @property (copy, nonatomic, readonly) NSArray<SDLPermissionElement *> *permissionElements; +/// Initializer unavailable +- (instancetype)init NS_UNAVAILABLE; + /** * Create a new permission filter group with a SDLPermissionsChangedHandler. * diff --git a/SmartDeviceLink/SDLPermissionFilter.m b/SmartDeviceLink/SDLPermissionFilter.m index 6dcd9b1f7..c2ed47a3e 100644 --- a/SmartDeviceLink/SDLPermissionFilter.m +++ b/SmartDeviceLink/SDLPermissionFilter.m @@ -11,24 +11,10 @@ NS_ASSUME_NONNULL_BEGIN - @implementation SDLPermissionFilter #pragma mark - Lifecycle -- (instancetype)init { - self = [super init]; - if (!self) { return nil; } - - _identifier = [NSUUID UUID]; - _permissionElements = @[]; - _groupType = SDLPermissionGroupTypeAny; - _handler = nil; - _rpcPermissionStatusHandler = nil; - - return self; -} - - (instancetype)initWithPermissions:(NSArray<SDLPermissionElement *> *)rpcNames groupType:(SDLPermissionGroupType)groupType permissionsHandler:(SDLPermissionsChangedHandler)observer { self = [super init]; if (!self) { diff --git a/SmartDeviceLink/SDLPermissionManager.h b/SmartDeviceLink/SDLPermissionManager.h index 839d5a587..1d5442c65 100644 --- a/SmartDeviceLink/SDLPermissionManager.h +++ b/SmartDeviceLink/SDLPermissionManager.h @@ -148,12 +148,10 @@ NS_ASSUME_NONNULL_BEGIN * * @param rpcName The name of the RPC to be tested, for example, SDLRPCFunctionNameGetVehicleData * @param parameter The name of the parameter to be tested, for example, rpm - * @param permissionItems The current permissions to test against - * @param hmiLevel The current HMI level * - * @return BOOL + * @return True if the parameter is allowed, false if it is not */ -- (BOOL)isPermissionParameterAllowed:(SDLRPCFunctionName)rpcName parameter:(NSString *)parameter permissionItems:(NSMutableDictionary<SDLPermissionRPCName, SDLPermissionItem *> *)permissionItems hmiLevel:(SDLHMILevel)hmiLevel; +- (BOOL)isPermissionParameterAllowed:(SDLRPCFunctionName)rpcName parameter:(NSString *)parameter; @end diff --git a/SmartDeviceLink/SDLPermissionManager.m b/SmartDeviceLink/SDLPermissionManager.m index 145909232..b9df85a18 100644 --- a/SmartDeviceLink/SDLPermissionManager.m +++ b/SmartDeviceLink/SDLPermissionManager.m @@ -71,12 +71,16 @@ NS_ASSUME_NONNULL_BEGIN } - (BOOL)isRPCNameAllowed:(SDLRPCFunctionName)rpcName { - if (self.permissions[rpcName] == nil || self.currentHMILevel == nil) { + return [self.class isRPCNameAllowed:rpcName permissions:self.permissions hmiLevel:self.currentHMILevel]; +} + ++ (BOOL)isRPCNameAllowed:(SDLRPCFunctionName)rpcName permissions:(NSMutableDictionary<SDLPermissionRPCName, SDLPermissionItem *> *)permissions hmiLevel:(SDLHMILevel)hmiLevel { + if (permissions[rpcName] == nil || hmiLevel == nil) { return NO; } - SDLPermissionItem *item = self.permissions[rpcName]; - return [item.hmiPermissions.allowed containsObject:self.currentHMILevel]; + SDLPermissionItem *item = permissions[rpcName]; + return [item.hmiPermissions.allowed containsObject:hmiLevel]; } - (SDLPermissionGroupStatus)groupStatusOfRPCs:(NSArray<SDLPermissionRPCName> *)rpcNames { @@ -88,10 +92,10 @@ NS_ASSUME_NONNULL_BEGIN return SDLPermissionGroupStatusUnknown; } - return [self sdl_groupStatusOfRPCPermissions:rpcNames withPermissions:[self.permissions copy] hmiLevel:self.currentHMILevel]; + return [self.class sdl_groupStatusOfRPCPermissions:rpcNames withPermissions:[self.permissions copy] hmiLevel:self.currentHMILevel]; } -- (SDLPermissionGroupStatus)sdl_groupStatusOfRPCPermissions:(NSArray<SDLPermissionElement *> *)rpcNames withPermissions:(NSDictionary<SDLPermissionRPCName, SDLPermissionItem *> *)permissions hmiLevel:(SDLHMILevel)hmiLevel { ++ (SDLPermissionGroupStatus)sdl_groupStatusOfRPCPermissions:(NSArray<SDLPermissionElement *> *)rpcNames withPermissions:(NSMutableDictionary<SDLPermissionRPCName, SDLPermissionItem *> *)permissions hmiLevel:(SDLHMILevel)hmiLevel { // If we don't have an HMI level, then just say everything is disallowed if (hmiLevel == nil) { return SDLPermissionGroupStatusUnknown; @@ -124,7 +128,7 @@ NS_ASSUME_NONNULL_BEGIN if (permissionElement.parameterPermissions != nil) { for (NSString *parameter in permissionElement.parameterPermissions) { - if ([self isPermissionParameterAllowed:permissionElement.rpcName parameter:parameter permissionItems:self.permissions hmiLevel:self.currentHMILevel]) { + if ([self.class sdl_isPermissionParameterAllowed:permissionElement.rpcName parameter:parameter permissionItems:permissions hmiLevel:hmiLevel]) { hasAllowed = YES; } else { hasDisallowed = YES; @@ -158,7 +162,7 @@ NS_ASSUME_NONNULL_BEGIN NSMutableDictionary<NSString *, NSNumber *> *rpcParameters = [NSMutableDictionary dictionary]; if (permissionElement.parameterPermissions != nil) { for (NSString *permissionParameter in permissionElement.parameterPermissions) { - BOOL isParameterAllowed = [self isPermissionParameterAllowed:permissionElement.rpcName parameter:permissionParameter permissionItems:self.permissions hmiLevel:self.currentHMILevel]; + BOOL isParameterAllowed = [self.class sdl_isPermissionParameterAllowed:permissionElement.rpcName parameter:permissionParameter permissionItems:self.permissions hmiLevel:self.currentHMILevel]; rpcParameters[permissionParameter] = @(isParameterAllowed); } } @@ -203,14 +207,14 @@ NS_ASSUME_NONNULL_BEGIN } - (void)sdl_callFilterObserver:(SDLPermissionFilter *)filter { + SDLPermissionGroupStatus permissionStatus = [self groupStatusOfRPCPermissions:filter.permissionElements]; + if (filter.rpcPermissionStatusHandler != nil) { - SDLPermissionGroupStatus permissionStatus = [self groupStatusOfRPCPermissions:filter.permissionElements]; NSDictionary<SDLRPCFunctionName, SDLRPCPermissionStatus *> *allowedDict = [self statusesOfRPCPermissions:filter.permissionElements]; filter.rpcPermissionStatusHandler(allowedDict, permissionStatus); } if (filter.handler != nil) { - SDLPermissionGroupStatus permissionStatus = [self groupStatusOfRPCPermissions:filter.permissionElements]; NSDictionary<SDLRPCFunctionName, NSNumber *> *allowedDict = [self sdl_convertPermissionsStatusDictionaryToPermissionsBoolDictionary:[self statusesOfRPCPermissions:filter.permissionElements]]; filter.handler(allowedDict, permissionStatus); } @@ -382,8 +386,8 @@ NS_ASSUME_NONNULL_BEGIN // This is only for the All Allowed group type. Unlike with the Any group type, we need to know if the group status has changed if (changed) { - SDLPermissionGroupStatus oldStatus = [self sdl_groupStatusOfRPCPermissions:filter.permissionElements withPermissions:self.permissions hmiLevel:oldHMILevel]; - SDLPermissionGroupStatus newStatus = [self sdl_groupStatusOfRPCPermissions:filter.permissionElements withPermissions:self.permissions hmiLevel:newHMILevel]; + SDLPermissionGroupStatus oldStatus = [self.class sdl_groupStatusOfRPCPermissions:filter.permissionElements withPermissions:self.permissions hmiLevel:oldHMILevel]; + SDLPermissionGroupStatus newStatus = [self.class sdl_groupStatusOfRPCPermissions:filter.permissionElements withPermissions:self.permissions hmiLevel:newHMILevel]; // We've already eliminated the case where the permissions could stay the same, so if the permissions changed *to* allowed or *away* from allowed, we need to call the observer. if (newStatus == SDLPermissionGroupStatusAllowed || oldStatus == SDLPermissionGroupStatusAllowed) { @@ -471,9 +475,13 @@ NS_ASSUME_NONNULL_BEGIN return NO; } -- (BOOL)isPermissionParameterAllowed:(SDLRPCFunctionName)rpcName parameter:(NSString *)parameter permissionItems:(NSMutableDictionary<SDLPermissionRPCName, SDLPermissionItem *> *)permissionItems hmiLevel:(SDLHMILevel)hmiLevel { +- (BOOL)isPermissionParameterAllowed:(SDLRPCFunctionName)rpcName parameter:(NSString *)parameter { + return [self.class sdl_isPermissionParameterAllowed:rpcName parameter:parameter permissionItems:self.permissions hmiLevel:self.currentHMILevel]; +} + ++ (BOOL)sdl_isPermissionParameterAllowed:(SDLRPCFunctionName)rpcName parameter:(NSString *)parameter permissionItems:(NSMutableDictionary<SDLPermissionRPCName, SDLPermissionItem *> *)permissionItems hmiLevel:(SDLHMILevel)hmiLevel { SDLPermissionItem *permissionItem = permissionItems[rpcName]; - if (permissionItem == nil || ![self isRPCNameAllowed:rpcName] || permissionItem.parameterPermissions == nil || permissionItem.parameterPermissions.allowed == nil) { + if (permissionItem == nil || ![self isRPCNameAllowed:rpcName permissions:permissionItems hmiLevel:hmiLevel] || permissionItem.parameterPermissions == nil || permissionItem.parameterPermissions.allowed == nil) { return NO; } else if (permissionItem.parameterPermissions.userDisallowed != nil) { return [permissionItem.parameterPermissions.allowed containsObject:parameter] && ![permissionItem.parameterPermissions.userDisallowed containsObject:parameter]; diff --git a/SmartDeviceLink/SDLRPCPermissionStatus.m b/SmartDeviceLink/SDLRPCPermissionStatus.m index 5115e238e..eb3f3950b 100644 --- a/SmartDeviceLink/SDLRPCPermissionStatus.m +++ b/SmartDeviceLink/SDLRPCPermissionStatus.m @@ -21,4 +21,10 @@ return self; } +#pragma mark - Description + +- (NSString *)description { + return [NSString stringWithFormat:@"RPC name: %@, allowed: %@, RPC parameters %@", self.rpcName, (self.isRPCAllowed ? @"YES" : @"NO"), self.rpcParameters]; +} + @end diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLPermissionsManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLPermissionsManagerSpec.m index 4c27dab72..05020ef37 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/SDLPermissionsManagerSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLPermissionsManagerSpec.m @@ -1170,7 +1170,7 @@ describe(@"SDLPermissionsManager", ^{ beforeEach(^{ someRPCFunctionName = @"SomeRPCFunctionName"; someRPCParameterName = @"SomeRPCParameterName"; - testResultBOOL = [testPermissionsManager isPermissionParameterAllowed:someRPCFunctionName parameter:someRPCParameterName permissionItems:testPermissionsManager.permissions hmiLevel:testPermissionsManager.currentHMILevel]; + testResultBOOL = [testPermissionsManager isPermissionParameterAllowed:someRPCFunctionName parameter:someRPCParameterName]; }); it(@"should not be allowed", ^{ @@ -1181,7 +1181,7 @@ describe(@"SDLPermissionsManager", ^{ context(@"when permissions exist but no HMI level", ^{ beforeEach(^{ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification]; - testResultBOOL = [testPermissionsManager isPermissionParameterAllowed:testRPCNameAllAllowed parameter:testRPCParameterNameAllAllowed permissionItems:testPermissionsManager.permissions hmiLevel:testPermissionsManager.currentHMILevel]; + testResultBOOL = [testPermissionsManager isPermissionParameterAllowed:testRPCNameAllAllowed parameter:testRPCParameterNameAllAllowed]; }); it(@"should not be allowed", ^{ @@ -1195,7 +1195,7 @@ describe(@"SDLPermissionsManager", ^{ [[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification]; [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification]; - testResultBOOL = [testPermissionsManager isPermissionParameterAllowed:testRPCNameAllAllowed parameter:testRPCParameterNameAllAllowed permissionItems:testPermissionsManager.permissions hmiLevel:testPermissionsManager.currentHMILevel]; + testResultBOOL = [testPermissionsManager isPermissionParameterAllowed:testRPCNameAllAllowed parameter:testRPCParameterNameAllAllowed]; }); it(@"should be allowed", ^{ @@ -1208,7 +1208,7 @@ describe(@"SDLPermissionsManager", ^{ [[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification]; [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification]; - testResultBOOL = [testPermissionsManager isPermissionParameterAllowed:testRPCNameAllDisallowed parameter:testRPCParameterNameAllDisallowed permissionItems:testPermissionsManager.permissions hmiLevel:testPermissionsManager.currentHMILevel]; + testResultBOOL = [testPermissionsManager isPermissionParameterAllowed:testRPCNameAllDisallowed parameter:testRPCParameterNameAllDisallowed]; }); it(@"should not be allowed", ^{ @@ -1222,7 +1222,7 @@ describe(@"SDLPermissionsManager", ^{ [[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification]; [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification]; - testResultBOOL = [testPermissionsManager isPermissionParameterAllowed:testRPCNameFullLimitedAllowed parameter:testRPCParameterNameAllDisallowed permissionItems:testPermissionsManager.permissions hmiLevel:testPermissionsManager.currentHMILevel]; + testResultBOOL = [testPermissionsManager isPermissionParameterAllowed:testRPCNameFullLimitedAllowed parameter:testRPCParameterNameAllDisallowed]; }); it(@"should not be allowed", ^{ @@ -1235,7 +1235,7 @@ describe(@"SDLPermissionsManager", ^{ [[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification]; [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification]; - testResultBOOL = [testPermissionsManager isPermissionParameterAllowed:testRPCNameFullLimitedAllowed parameter:testRPCParameterNameAllAllowed permissionItems:testPermissionsManager.permissions hmiLevel:testPermissionsManager.currentHMILevel]; + testResultBOOL = [testPermissionsManager isPermissionParameterAllowed:testRPCNameFullLimitedAllowed parameter:testRPCParameterNameAllAllowed]; }); it(@"should be allowed", ^{ |