Skip to content

Commit

Permalink
Merge pull request #465 from /issues/408-implements-forgot-password
Browse files Browse the repository at this point in the history
Implements Forgot Password on iOS
  • Loading branch information
jleandroperez committed Mar 20, 2015
2 parents ca7c8a4 + 0dadef7 commit 730b641
Show file tree
Hide file tree
Showing 12 changed files with 313 additions and 155 deletions.
36 changes: 18 additions & 18 deletions Simperium.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,8 @@
46EE3D41171C975D00E6F0A5 /* SimperiumComplexTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 46EE3D40171C975D00E6F0A5 /* SimperiumComplexTests.m */; };
46EE3D44171C978E00E6F0A5 /* SimperiumAuxiliaryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 46EE3D43171C978D00E6F0A5 /* SimperiumAuxiliaryTests.m */; };
46EE3D57171D0C8E00E6F0A5 /* SimperiumErrorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 46EE3D56171D0C8E00E6F0A5 /* SimperiumErrorTests.m */; };
79343B041A28552B006715C2 /* SPWebViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 79343B021A28552B006715C2 /* SPWebViewController.h */; };
79343B051A28552B006715C2 /* SPWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 79343B031A28552B006715C2 /* SPWebViewController.m */; };
797D26FE19F1B72700DEF569 /* SPKeychain.h in Headers */ = {isa = PBXBuildFile; fileRef = 797D26FA19F1B72700DEF569 /* SPKeychain.h */; };
797D26FF19F1B72700DEF569 /* SPKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 797D26FB19F1B72700DEF569 /* SPKeychain.m */; };
797D270019F1B72700DEF569 /* SPKeychainQuery.h in Headers */ = {isa = PBXBuildFile; fileRef = 797D26FC19F1B72700DEF569 /* SPKeychainQuery.h */; };
Expand Down Expand Up @@ -238,8 +240,6 @@
B5F4C84518FC1B04009F8643 /* NSError+Simperium.h in Headers */ = {isa = PBXBuildFile; fileRef = B5F4C84318FC1B04009F8643 /* NSError+Simperium.h */; };
B5F4C84618FC1B04009F8643 /* NSError+Simperium.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F4C84418FC1B04009F8643 /* NSError+Simperium.m */; };
B5F65F7A1847DE0100CEF48D /* SPManagedObject+Internals.h in Headers */ = {isa = PBXBuildFile; fileRef = B5F65F791847DE0100CEF48D /* SPManagedObject+Internals.h */; };
E265DBD017CD3E0A00070550 /* SPTOSViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = E265DBCE17CD3E0A00070550 /* SPTOSViewController.h */; };
E265DBD117CD3E0A00070550 /* SPTOSViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E265DBCF17CD3E0A00070550 /* SPTOSViewController.m */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand Down Expand Up @@ -408,6 +408,8 @@
46EE3D40171C975D00E6F0A5 /* SimperiumComplexTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimperiumComplexTests.m; sourceTree = "<group>"; };
46EE3D43171C978D00E6F0A5 /* SimperiumAuxiliaryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimperiumAuxiliaryTests.m; sourceTree = "<group>"; };
46EE3D56171D0C8E00E6F0A5 /* SimperiumErrorTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimperiumErrorTests.m; sourceTree = "<group>"; };
79343B021A28552B006715C2 /* SPWebViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPWebViewController.h; sourceTree = "<group>"; };
79343B031A28552B006715C2 /* SPWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPWebViewController.m; sourceTree = "<group>"; };
797D26FA19F1B72700DEF569 /* SPKeychain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = SPKeychain.h; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
797D26FB19F1B72700DEF569 /* SPKeychain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = SPKeychain.m; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
797D26FC19F1B72700DEF569 /* SPKeychainQuery.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = SPKeychainQuery.h; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
Expand Down Expand Up @@ -479,8 +481,6 @@
B5F4C84418FC1B04009F8643 /* NSError+Simperium.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSError+Simperium.m"; sourceTree = "<group>"; };
B5F4FE6818A3D7B8006F50C5 /* Simperium.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; path = Simperium.podspec; sourceTree = SOURCE_ROOT; };
B5F65F791847DE0100CEF48D /* SPManagedObject+Internals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "SPManagedObject+Internals.h"; sourceTree = "<group>"; };
E265DBCE17CD3E0A00070550 /* SPTOSViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPTOSViewController.h; sourceTree = "<group>"; };
E265DBCF17CD3E0A00070550 /* SPTOSViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPTOSViewController.m; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -791,24 +791,24 @@
265D80061475C2CE00002A19 /* Categories */ = {
isa = PBXGroup;
children = (
B56819BC194F793400E0DC65 /* DiffMatchPatch+Simperium.h */,
B56819BD194F793400E0DC65 /* DiffMatchPatch+Simperium.m */,
B5E03D96182C115100412572 /* JSONKit+Simperium.h */,
B5E03D97182C115100412572 /* JSONKit+Simperium.m */,
1854D50D1799F6D2006C4211 /* NSArray+Simperium.h */,
1854D50E1799F6D2006C4211 /* NSArray+Simperium.m */,
46A16A7F17289FE2003AED55 /* NSString+Simperium.h */,
46A16A8017289FE2003AED55 /* NSString+Simperium.m */,
B56091531A717EE700A4E64A /* NSConditionLock+Simperium.h */,
B56091541A717EE700A4E64A /* NSConditionLock+Simperium.m */,
26E83DA81399D05D00195758 /* NSDate+Simperium.h */,
26E83DA91399D05E00195758 /* NSDate+Simperium.m */,
26B16EFD13B1B78C00BEB3E5 /* NSData+Simperium.h */,
26B16EFE13B1B78F00BEB3E5 /* NSData+Simperium.m */,
B56091531A717EE700A4E64A /* NSConditionLock+Simperium.h */,
B56091541A717EE700A4E64A /* NSConditionLock+Simperium.m */,
B5E03D96182C115100412572 /* JSONKit+Simperium.h */,
B5E03D97182C115100412572 /* JSONKit+Simperium.m */,
B5C91A0C1827E9CB0002D306 /* NSURLResponse+Simperium.h */,
B5C91A0D1827E9CB0002D306 /* NSURLResponse+Simperium.m */,
B5F4C84318FC1B04009F8643 /* NSError+Simperium.h */,
B5F4C84418FC1B04009F8643 /* NSError+Simperium.m */,
B56819BC194F793400E0DC65 /* DiffMatchPatch+Simperium.h */,
B56819BD194F793400E0DC65 /* DiffMatchPatch+Simperium.m */,
46A16A7F17289FE2003AED55 /* NSString+Simperium.h */,
46A16A8017289FE2003AED55 /* NSString+Simperium.m */,
B5C91A0C1827E9CB0002D306 /* NSURLResponse+Simperium.h */,
B5C91A0D1827E9CB0002D306 /* NSURLResponse+Simperium.m */,
);
name = Categories;
sourceTree = "<group>";
Expand Down Expand Up @@ -861,8 +861,8 @@
466EB41117BC45F5005F7599 /* SPAuthenticationConfiguration.m */,
466EB41217BC45F5005F7599 /* SPAuthenticationValidator.h */,
466EB41317BC45F5005F7599 /* SPAuthenticationValidator.m */,
E265DBCE17CD3E0A00070550 /* SPTOSViewController.h */,
E265DBCF17CD3E0A00070550 /* SPTOSViewController.m */,
79343B021A28552B006715C2 /* SPWebViewController.h */,
79343B031A28552B006715C2 /* SPWebViewController.m */,
);
name = Authentication;
sourceTree = "<group>";
Expand Down Expand Up @@ -1001,6 +1001,7 @@
264CD942135DFE6D00C51BAD /* SPGhost.h in Headers */,
264CD944135DFE6D00C51BAD /* SPMember.h in Headers */,
264CD996135DFE7E00C51BAD /* DiffMatchPatch.h in Headers */,
79343B041A28552B006715C2 /* SPWebViewController.h in Headers */,
264CD999135DFE7E00C51BAD /* DiffMatchPatchCFUtilities.h in Headers */,
264CD99A135DFE7E00C51BAD /* MinMaxMacros.h in Headers */,
264CD99B135DFE7E00C51BAD /* NSMutableDictionary+DMPExtensions.h in Headers */,
Expand Down Expand Up @@ -1045,7 +1046,6 @@
2618988515D2EC130013CBC9 /* SPWebSocketInterface.h in Headers */,
264AE51A15D45E2A00E5E04E /* SPWebSocketChannel.h in Headers */,
26B733F015E585630081CF4A /* SPRelationshipResolver.h in Headers */,
E265DBD017CD3E0A00070550 /* SPTOSViewController.h in Headers */,
26653CFB15FE5DEA00461A28 /* SPReachability.h in Headers */,
46A16A8117289FE2003AED55 /* NSString+Simperium.h in Headers */,
B5A19D5918806BBC0059AA36 /* SPWebSocket.h in Headers */,
Expand Down Expand Up @@ -1255,7 +1255,6 @@
B5EC2C2618858E3E0067E3B8 /* SPPersistentMutableSet.m in Sources */,
264CD943135DFE6D00C51BAD /* SPGhost.m in Sources */,
264CD945135DFE6D00C51BAD /* SPMember.m in Sources */,
E265DBD117CD3E0A00070550 /* SPTOSViewController.m in Sources */,
264CD997135DFE7E00C51BAD /* DiffMatchPatch.m in Sources */,
264CD998135DFE7E00C51BAD /* DiffMatchPatchCFUtilities.c in Sources */,
264CD99C135DFE7E00C51BAD /* NSMutableDictionary+DMPExtensions.m in Sources */,
Expand Down Expand Up @@ -1292,6 +1291,7 @@
267CE8FF156C0FD20028801C /* SPBucket.m in Sources */,
24A73F5717E250E0000CA275 /* SPPersistentMutableDictionary.m in Sources */,
267CE902156C0FD20028801C /* SPDiffer.m in Sources */,
79343B051A28552B006715C2 /* SPWebViewController.m in Sources */,
267CE904156C0FD20028801C /* SPJSONStorage.m in Sources */,
797D26FF19F1B72700DEF569 /* SPKeychain.m in Sources */,
267CE906156C0FD20028801C /* SPObject.m in Sources */,
Expand Down
3 changes: 3 additions & 0 deletions Simperium/NSString+Simperium.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@
+ (NSString *)sp_makeUUID;
+ (NSString *)sp_md5StringFromData:(NSData *)data;
+ (NSString *)sp_randomStringOfLength:(NSUInteger)length;

- (BOOL)sp_isValidUrl;

- (NSString *)sp_urlEncodeString;
- (NSArray *)sp_componentsSeparatedByString:(NSString *)separator limit:(NSInteger)limit;

Expand Down
12 changes: 10 additions & 2 deletions Simperium/NSString+Simperium.m
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,13 @@
@implementation NSString (Simperium)

// From https://github.com/mikeho/QSUtilities
+ (NSString *)sp_encodeBase64WithString:(NSString *)strData {
+ (NSString *)sp_encodeBase64WithString:(NSString *)strData
{
return [NSString sp_encodeBase64WithData:[strData dataUsingEncoding:NSUTF8StringEncoding]];
}

+ (NSString *)sp_encodeBase64WithData:(NSData *)objData {
+ (NSString *)sp_encodeBase64WithData:(NSData *)objData
{
if ([NSData instancesRespondToSelector:@selector(base64EncodedStringWithOptions:)]) {
return [objData base64EncodedStringWithOptions:0];
}
Expand Down Expand Up @@ -111,6 +113,12 @@ + (NSString *)sp_randomStringOfLength:(NSUInteger)length
return randomString;
}

- (BOOL)sp_isValidUrl
{
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:self]];
return [NSURLConnection canHandleRequest:request];
}

- (NSString *)sp_urlEncodeString
{
return (NSString *) CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)self,
Expand Down
17 changes: 12 additions & 5 deletions Simperium/SPAuthenticationConfiguration.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,21 @@

#import <Foundation/Foundation.h>


#pragma mark ====================================================================================
#pragma mark SPAuthenticationConfiguration
#pragma mark ====================================================================================

@interface SPAuthenticationConfiguration : NSObject

@property (nonatomic, copy) NSString *regularFontName;
@property (nonatomic, copy) NSString *mediumFontName;
@property (nonatomic, copy) NSString *logoImageName;
@property (nonatomic, copy, readwrite) NSString *regularFontName;
@property (nonatomic, copy, readwrite) NSString *mediumFontName;
@property (nonatomic, copy, readwrite) NSString *logoImageName;

@property (nonatomic, assign, readwrite) NSString *forgotPasswordURL;
@property (nonatomic, assign, readwrite) NSString *termsOfServiceURL;

#if TARGET_OS_IPHONE
#else
#if !TARGET_OS_IPHONE
@property (nonatomic, strong) NSColor *controlColor;
#endif

Expand Down
67 changes: 47 additions & 20 deletions Simperium/SPAuthenticationConfiguration.m
Original file line number Diff line number Diff line change
Expand Up @@ -7,50 +7,75 @@
//

#import "SPAuthenticationConfiguration.h"

#define kFontTestString @"Testyj"
#import "SPEnvironment.h"
#import "NSString+Simperium.h"

#if TARGET_OS_IPHONE
#import <UIKit/UIKit.h>
#endif

@implementation SPAuthenticationConfiguration

static SPAuthenticationConfiguration *gInstance = NULL;
#pragma mark ====================================================================================
#pragma mark Constants
#pragma mark ====================================================================================

static NSString *SPAuthenticationDefaultRegularFontName = @"HelveticaNeue";
static NSString *SPAuthenticationDefaultMediumFontName = @"HelveticaNeue-Medium";
static NSString *SPAuthenticationTestString = @"Testyj";


#pragma mark ====================================================================================
#pragma mark SPAuthenticationConfiguration
#pragma mark ====================================================================================

@implementation SPAuthenticationConfiguration

+ (instancetype)sharedInstance
{
static SPAuthenticationConfiguration *_instance = NULL;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
gInstance = [[self alloc] init];
_instance = [[self alloc] init];
});

return(gInstance);
return _instance;
}

- (instancetype)init {
self = [super init];
if (self) {
_regularFontName = @"HelveticaNeue";
_mediumFontName = @"HelveticaNeue-Medium";
_regularFontName = SPAuthenticationDefaultRegularFontName;
_mediumFontName = SPAuthenticationDefaultMediumFontName;
_termsOfServiceURL = SPTermsOfServiceURL;

#if TARGET_OS_IPHONE
#else
self.controlColor = [NSColor colorWithCalibratedRed:65.f/255.f green:137.f/255.f blue:199.f/255.f alpha:1.0];
#if !TARGET_OS_IPHONE
_controlColor = [NSColor colorWithCalibratedRed:65.f/255.f green:137.f/255.f blue:199.f/255.f alpha:1.0];
#endif
}

return self;
}

// Just quick and dirty fonts for now. Could be extended with colors.
// In an app this would likely be done in an external .plist file, but for a framework,
// keeping in code avoids having to include a resource.

#pragma mark - Custom Setters

- (void)setForgotPasswordURL:(NSString *)forgotPasswordURL {
NSAssert(!forgotPasswordURL || forgotPasswordURL.sp_isValidUrl, @"Simperium: Invalid Forgot Password URL");
_forgotPasswordURL = forgotPasswordURL;
}

- (void)setTermsOfServiceURL:(NSString *)termsOfServiceURL {
NSAssert(!termsOfServiceURL || termsOfServiceURL.sp_isValidUrl, @"Simperium: Invalid Terms of Service URL");
_termsOfServiceURL = termsOfServiceURL;
}


#pragma mark - Font Helpers

#if TARGET_OS_IPHONE

- (float)regularFontHeightForSize:(float)size {
// Not cached, but could be
return [kFontTestString sizeWithFont:[UIFont fontWithName:self.regularFontName size:size]].height;
return [SPAuthenticationTestString sizeWithFont:[UIFont fontWithName:self.regularFontName size:size]].height;
}

#else
Expand All @@ -64,10 +89,12 @@ - (NSFont *)mediumFontWithSize:(CGFloat)size {
}

- (float)regularFontHeightForSize:(float)size {
// Not cached, but could be
NSDictionary *attributes = @{NSFontAttributeName : [self regularFontWithSize:size],
NSFontSizeAttribute : [NSString stringWithFormat:@"%f", size]};
return [kFontTestString sizeWithAttributes:attributes].height;
NSDictionary *attributes = @{
NSFontAttributeName : [self regularFontWithSize:size],
NSFontSizeAttribute : [NSString stringWithFormat:@"%f", size]
};

return [SPAuthenticationTestString sizeWithAttributes:attributes].height;
}
#endif

Expand Down
Loading

0 comments on commit 730b641

Please sign in to comment.