diff --git a/Classes/BITAuthenticationViewController.m b/Classes/BITAuthenticationViewController.m index 01a062cfb5..d08aa5d9c6 100644 --- a/Classes/BITAuthenticationViewController.m +++ b/Classes/BITAuthenticationViewController.m @@ -30,6 +30,7 @@ #import "BITAuthenticator_Private.h" #import "HockeySDKPrivate.h" #import "HockeySDK.h" +#import "BITHockeyHelper.h" #import "BITHockeyAppClient.h" @interface BITAuthenticationViewController () { @@ -152,7 +153,7 @@ if (self.requirePassword && [self.password length] == 0) return NO; - if (![self.email length] || !BITValidateEmail(self.email)) + if (![self.email length] || !bit_validateEmail(self.email)) return NO; return YES; diff --git a/Classes/BITFeedbackUserDataViewController.m b/Classes/BITFeedbackUserDataViewController.m index 561e3b918d..4fe49baeb3 100644 --- a/Classes/BITFeedbackUserDataViewController.m +++ b/Classes/BITFeedbackUserDataViewController.m @@ -32,6 +32,7 @@ #if HOCKEYSDK_FEATURE_FEEDBACK #import "HockeySDKPrivate.h" +#import "BITHockeyHelper.h" #import "BITFeedbackUserDataViewController.h" #import "BITFeedbackManagerPrivate.h" @@ -120,7 +121,7 @@ if ([self.manager requireUserEmail] == BITFeedbackUserDataElementRequired && [self.email length] == 0) return NO; - if ([self.email length] > 0 && !BITValidateEmail(self.email)) + if ([self.email length] > 0 && !bit_validateEmail(self.email)) return NO; return YES; diff --git a/Classes/BITHockeyHelper.h b/Classes/BITHockeyHelper.h index 985c7040bd..34c9e62ba2 100644 --- a/Classes/BITHockeyHelper.h +++ b/Classes/BITHockeyHelper.h @@ -34,6 +34,7 @@ NSString *bit_URLEncodedString(NSString *inputString); NSString *bit_URLDecodedString(NSString *inputString); NSString *bit_base64String(NSData * data, unsigned long length); +BOOL bit_validateEmail(NSString *email); NSString *bit_keychainHockeySDKServiceName(void); NSComparisonResult bit_versionCompare(NSString *stringA, NSString *stringB); diff --git a/Classes/BITHockeyHelper.m b/Classes/BITHockeyHelper.m index 8ce3287906..f44e7af0ec 100644 --- a/Classes/BITHockeyHelper.m +++ b/Classes/BITHockeyHelper.m @@ -114,6 +114,20 @@ NSString *bit_base64String(NSData * data, unsigned long length) { return result; } +BOOL bit_validateEmail(NSString *email) { + NSString *emailRegex = + @"(?:[a-z0-9!#$%\\&'*+/=?\\^_`{|}~-]+(?:\\.[a-z0-9!#$%\\&'*+/=?\\^_`{|}" + @"~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\" + @"x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-" + @"z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5" + @"]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-" + @"9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21" + @"-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"; + NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES[c] %@", emailRegex]; + + return [emailTest evaluateWithObject:email]; +} + NSString *bit_keychainHockeySDKServiceName(void) { NSString *serviceName = [NSString stringWithFormat:@"%@.HockeySDK", bit_mainBundleIdentifier()]; return serviceName; diff --git a/Classes/HockeySDKPrivate.h b/Classes/HockeySDKPrivate.h index 321641718c..2b694b9c66 100644 --- a/Classes/HockeySDKPrivate.h +++ b/Classes/HockeySDKPrivate.h @@ -66,7 +66,6 @@ NSBundle *BITHockeyBundle(void); NSString *BITHockeyLocalizedString(NSString *stringToken); NSString *BITHockeyMD5(NSString *str); -BOOL BITValidateEmail(NSString *email); #if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0 diff --git a/Classes/HockeySDKPrivate.m b/Classes/HockeySDKPrivate.m index 932daa6717..56ecdfb54a 100644 --- a/Classes/HockeySDKPrivate.m +++ b/Classes/HockeySDKPrivate.m @@ -73,17 +73,3 @@ NSString *BITHockeyMD5(NSString *str) { result[14], result[15] ]; } - -BOOL BITValidateEmail(NSString *email) { - NSString *emailRegex = - @"(?:[a-z0-9!#$%\\&'*+/=?\\^_`{|}~-]+(?:\\.[a-z0-9!#$%\\&'*+/=?\\^_`{|}" - @"~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\" - @"x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-" - @"z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5" - @"]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-" - @"9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21" - @"-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"; - NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES[c] %@", emailRegex]; - - return [emailTest evaluateWithObject:email]; -} diff --git a/Support/HockeySDK.xcodeproj/project.pbxproj b/Support/HockeySDK.xcodeproj/project.pbxproj index 0fe84af06b..10d3567fa9 100644 --- a/Support/HockeySDK.xcodeproj/project.pbxproj +++ b/Support/HockeySDK.xcodeproj/project.pbxproj @@ -102,6 +102,7 @@ 1E70A23217F2F982001BB32D /* live_report_empty.plcrash in Resources */ = {isa = PBXBuildFile; fileRef = 1E70A22F17F2F982001BB32D /* live_report_empty.plcrash */; }; 1E70A23317F2F982001BB32D /* live_report_exception.plcrash in Resources */ = {isa = PBXBuildFile; fileRef = 1E70A23017F2F982001BB32D /* live_report_exception.plcrash */; }; 1E70A23417F2F982001BB32D /* live_report_signal.plcrash in Resources */ = {isa = PBXBuildFile; fileRef = 1E70A23117F2F982001BB32D /* live_report_signal.plcrash */; }; + 1E70A23617F31B82001BB32D /* BITHockeyHelperTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E70A23517F31B82001BB32D /* BITHockeyHelperTests.m */; }; 1E754E5C1621FBB70070AB92 /* BITCrashManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E754E561621FBB70070AB92 /* BITCrashManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1E754E5D1621FBB70070AB92 /* BITCrashManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E754E571621FBB70070AB92 /* BITCrashManager.m */; }; 1E754E5E1621FBB70070AB92 /* BITCrashManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E754E581621FBB70070AB92 /* BITCrashManagerDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -256,6 +257,7 @@ 1E70A22F17F2F982001BB32D /* live_report_empty.plcrash */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = live_report_empty.plcrash; sourceTree = ""; }; 1E70A23017F2F982001BB32D /* live_report_exception.plcrash */ = {isa = PBXFileReference; lastKnownFileType = file; path = live_report_exception.plcrash; sourceTree = ""; }; 1E70A23117F2F982001BB32D /* live_report_signal.plcrash */ = {isa = PBXFileReference; lastKnownFileType = file; path = live_report_signal.plcrash; sourceTree = ""; }; + 1E70A23517F31B82001BB32D /* BITHockeyHelperTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITHockeyHelperTests.m; sourceTree = ""; }; 1E71509A15B5C76F004E88FF /* HockeySDK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HockeySDK.h; sourceTree = ""; }; 1E754DC61621BC170070AB92 /* HockeySDK.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = HockeySDK.xcconfig; sourceTree = ""; }; 1E754E561621FBB70070AB92 /* BITCrashManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITCrashManager.h; sourceTree = ""; }; @@ -378,6 +380,7 @@ 1EFF03E417F2485500A5F13C /* BITCrashManagerTests.m */, E40E0B0817DA19DC005E38C1 /* BITHockeyAppClientTests.m */, E4507E4217F0658F00171A0D /* BITKeychainUtilsTests.m */, + 1E70A23517F31B82001BB32D /* BITHockeyHelperTests.m */, ); path = HockeySDKTests; sourceTree = ""; @@ -911,6 +914,7 @@ 1E5A459E16F0DFC200B55C04 /* BITStoreUpdateManagerTests.m in Sources */, 1EFF03E517F2485500A5F13C /* BITCrashManagerTests.m in Sources */, E40E0B0917DA19DC005E38C1 /* BITHockeyAppClientTests.m in Sources */, + 1E70A23617F31B82001BB32D /* BITHockeyHelperTests.m in Sources */, E48A3DEF17B3EFF100924C3D /* BITAuthenticatorTests.m in Sources */, 1EA1170716F53B91001C015C /* BITTestHelper.m in Sources */, E4507E4317F0658F00171A0D /* BITKeychainUtilsTests.m in Sources */, diff --git a/Support/HockeySDKTests/BITHockeyHelperTests.m b/Support/HockeySDKTests/BITHockeyHelperTests.m new file mode 100644 index 0000000000..6b5feb3975 --- /dev/null +++ b/Support/HockeySDKTests/BITHockeyHelperTests.m @@ -0,0 +1,58 @@ +// +// HockeySDKPrivateTests.m +// HockeySDK +// +// Created by Andreas Linde on 25.09.13. +// +// + +#import + +#define HC_SHORTHAND +#import + +#define MOCKITO_SHORTHAND +#import + +#import "HockeySDK.h" +#import "BITHockeyHelper.h" + + +@interface BITHockeyHelperTests : SenTestCase + +@end + +@implementation BITHockeyHelperTests + + +- (void)setUp { + [super setUp]; + // Put setup code here; it will be run once, before the first test case. +} + +- (void)tearDown { + // Put teardown code here; it will be run once, after the last test case. + [super tearDown]; +} + +- (void)testValidateEmail { + BOOL result = NO; + + // valid email + result = bit_validateEmail(@"mail@test.com"); + assertThatBool(result, equalToBool(YES)); + + // invalid emails + + result = bit_validateEmail(@"mail@test"); + assertThatBool(result, equalToBool(NO)); + + result = bit_validateEmail(@"mail@.com"); + assertThatBool(result, equalToBool(NO)); + + result = bit_validateEmail(@"mail.com"); + assertThatBool(result, equalToBool(NO)); + +} + +@end