Skip to content

Commit 8dd1d46

Browse files
authored
Ensure additionalTokenRefreshParametersForAuthSession returns a string dictionary (#564)
1 parent f478a1d commit 8dd1d46

File tree

3 files changed

+115
-10
lines changed

3 files changed

+115
-10
lines changed

GoogleSignIn/Sources/GIDEMMSupport.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,13 @@ NS_ASSUME_NONNULL_BEGIN
3434
completion:(void (^)(NSError *_Nullable))completion;
3535

3636
/// Gets a new set of URL parameters that contains updated EMM-related URL parameters if needed.
37-
+ (NSDictionary *)updatedEMMParametersWithParameters:(NSDictionary *)parameters;
37+
+ (NSDictionary<NSString *,NSString *> *)updatedEMMParametersWithParameters:
38+
(NSDictionary *)parameters;
3839

3940
/// Gets a new set of URL parameters that also contains EMM-related URL parameters if needed.
40-
+ (NSDictionary *)parametersWithParameters:(NSDictionary *)parameters
41-
emmSupport:(nullable NSString *)emmSupport
42-
isPasscodeInfoRequired:(BOOL)isPasscodeInfoRequired;
41+
+ (NSDictionary<NSString *,NSString *> *)parametersWithParameters:(NSDictionary *)parameters
42+
emmSupport:(nullable NSString *)emmSupport
43+
isPasscodeInfoRequired:(BOOL)isPasscodeInfoRequired;
4344

4445
@end
4546

GoogleSignIn/Sources/GIDEMMSupport.m

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,16 +84,16 @@ + (void)handleTokenFetchEMMError:(nullable NSError *)error
8484
}
8585
}
8686

87-
+ (NSDictionary *)updatedEMMParametersWithParameters:(NSDictionary *)parameters {
87+
+ (NSDictionary<NSString *,NSString *> *)updatedEMMParametersWithParameters:
88+
(NSDictionary *)parameters {
8889
return [self parametersWithParameters:parameters
8990
emmSupport:parameters[kEMMSupportParameterName]
9091
isPasscodeInfoRequired:parameters[kEMMPasscodeInfoParameterName] != nil];
9192
}
9293

93-
94-
+ (NSDictionary *)parametersWithParameters:(NSDictionary *)parameters
95-
emmSupport:(nullable NSString *)emmSupport
96-
isPasscodeInfoRequired:(BOOL)isPasscodeInfoRequired {
94+
+ (NSDictionary<NSString *,NSString *> *)parametersWithParameters:(NSDictionary *)parameters
95+
emmSupport:(nullable NSString *)emmSupport
96+
isPasscodeInfoRequired:(BOOL)isPasscodeInfoRequired {
9797
if (!emmSupport) {
9898
return parameters;
9999
}
@@ -109,7 +109,7 @@ + (NSDictionary *)parametersWithParameters:(NSDictionary *)parameters
109109
if (isPasscodeInfoRequired) {
110110
allParameters[kEMMPasscodeInfoParameterName] = [GIDMDMPasscodeState passcodeState].info;
111111
}
112-
return allParameters;
112+
return [GIDEMMSupport dictionaryWithStringValuesFromDictionary:allParameters];
113113
}
114114

115115
#pragma mark - GTMAuthSessionDelegate
@@ -128,6 +128,30 @@ - (void)updateErrorForAuthSession:(GTMAuthSession *)authSession
128128
}];
129129
}
130130

131+
#pragma mark - Private Helpers
132+
133+
+ (NSDictionary<NSString *, NSString *> *)
134+
dictionaryWithStringValuesFromDictionary:(NSDictionary *)originalDictionary {
135+
NSMutableDictionary<NSString *, NSString *> *stringifiedDictionary =
136+
[NSMutableDictionary dictionaryWithCapacity:originalDictionary.count];
137+
138+
[originalDictionary enumerateKeysAndObjectsUsingBlock:^(NSString *key, id value, BOOL *stop) {
139+
if ([value isKindOfClass:[NSString class]]) {
140+
stringifiedDictionary[key] = value;
141+
return;
142+
}
143+
if ([value isKindOfClass:[NSNumber class]]) {
144+
if (CFGetTypeID((__bridge CFTypeRef)value) == CFBooleanGetTypeID()) {
145+
stringifiedDictionary[key] = [value boolValue] ? @"true" : @"false";
146+
} else {
147+
stringifiedDictionary[key] = [value stringValue];
148+
}
149+
return;
150+
}
151+
}];
152+
return stringifiedDictionary;
153+
}
154+
131155
@end
132156

133157
NS_ASSUME_NONNULL_END

GoogleSignIn/Tests/Unit/GIDEMMSupportTest.m

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,86 @@ - (void)testHandleTokenFetchEMMError_errorIsNotEMM {
274274
[self waitForExpectations:@[ called ] timeout:1];
275275
}
276276

277+
# pragma mark - String Conversion Tests
278+
279+
- (void)testParametersWithParameters_withAnyNumber_isConvertedToString {
280+
NSDictionary *inputParameters = @{ @"number_key": @12345 };
281+
282+
NSDictionary *stringifiedParameters = [GIDEMMSupport parametersWithParameters:inputParameters
283+
emmSupport:@"1"
284+
isPasscodeInfoRequired:NO];
285+
286+
XCTAssertEqualObjects(stringifiedParameters[@"number_key"], @"12345",
287+
@"The NSNumber should be converted to a string.");
288+
XCTAssertTrue([stringifiedParameters[@"number_key"] isKindOfClass:[NSString class]],
289+
@"The final value should be of a NSString type.");
290+
}
291+
292+
- (void)testParametersWithParameters_withNumberOne_isConvertedToString {
293+
NSDictionary *inputParameters = @{ @"number_key": @1 };
294+
295+
NSDictionary *stringifiedParameters = [GIDEMMSupport parametersWithParameters:inputParameters
296+
emmSupport:@"1"
297+
isPasscodeInfoRequired:NO];
298+
299+
XCTAssertEqualObjects(stringifiedParameters[@"number_key"], @"1",
300+
@"The NSNumber should be converted to a string.");
301+
XCTAssertTrue([stringifiedParameters[@"number_key"] isKindOfClass:[NSString class]],
302+
@"The final value should be of a NSString type.");
303+
}
304+
305+
- (void)testParametersWithParameters_withNumberZero_isConvertedToString {
306+
NSDictionary *inputParameters = @{ @"number_key": @0};
307+
308+
NSDictionary *stringifiedParameters = [GIDEMMSupport parametersWithParameters:inputParameters
309+
emmSupport:@"1"
310+
isPasscodeInfoRequired:NO];
311+
312+
XCTAssertEqualObjects(stringifiedParameters[@"number_key"], @"0",
313+
@"The NSNumber should be converted to a string.");
314+
XCTAssertTrue([stringifiedParameters[@"number_key"] isKindOfClass:[NSString class]],
315+
@"The final value should be of a NSString type.");
316+
}
317+
318+
- (void)testParametersWithParameters_withBooleanYes_isConvertedToTrueString {
319+
NSDictionary *inputParameters = @{ @"bool_key": @YES };
320+
321+
NSDictionary *stringifiedParameters = [GIDEMMSupport parametersWithParameters:inputParameters
322+
emmSupport:@"1"
323+
isPasscodeInfoRequired:NO];
324+
325+
XCTAssertEqualObjects(stringifiedParameters[@"bool_key"], @"true",
326+
@"The boolean YES should be converted to the string 'true'.");
327+
XCTAssertTrue([stringifiedParameters[@"bool_key"] isKindOfClass:[NSString class]],
328+
@"The final value should be of a NSString type.");
329+
}
330+
331+
- (void)testParametersWithParameters_withBooleanNo_isConvertedToFalseString {
332+
NSDictionary *inputParameters = @{ @"bool_key": @NO };
333+
334+
NSDictionary *stringifiedParameters = [GIDEMMSupport parametersWithParameters:inputParameters
335+
emmSupport:@"1"
336+
isPasscodeInfoRequired:NO];
337+
338+
XCTAssertEqualObjects(stringifiedParameters[@"bool_key"], @"false",
339+
@"The boolean NO should be converted to the string 'false'.");
340+
XCTAssertTrue([stringifiedParameters[@"bool_key"] isKindOfClass:[NSString class]],
341+
@"The final value should be of a NSString type.");
342+
}
343+
344+
- (void)testParametersWithParameters_withString_remainsUnchanged {
345+
NSDictionary *inputParameters = @{ @"string_key": @"hello" };
346+
347+
NSDictionary *stringifiedParameters = [GIDEMMSupport parametersWithParameters:inputParameters
348+
emmSupport:@"1"
349+
isPasscodeInfoRequired:NO];
350+
351+
XCTAssertEqualObjects(stringifiedParameters[@"string_key"], @"hello",
352+
@"The original string value should be preserved.");
353+
XCTAssertTrue([stringifiedParameters[@"string_key"] isKindOfClass:[NSString class]],
354+
@"The final value should be of a NSString type.");
355+
}
356+
277357
# pragma mark - Helpers
278358

279359
- (NSString *)systemVersion {

0 commit comments

Comments
 (0)