From 47b3a5211a4da3bc29d4490293a40f376a774de2 Mon Sep 17 00:00:00 2001 From: dustinrue Date: Mon, 13 Apr 2015 08:19:03 -0500 Subject: [PATCH 1/5] possible fix for time of day crash --- Source/TimeOfDayEvidenceSource.m | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Source/TimeOfDayEvidenceSource.m b/Source/TimeOfDayEvidenceSource.m index 74132b37b..365a52069 100644 --- a/Source/TimeOfDayEvidenceSource.m +++ b/Source/TimeOfDayEvidenceSource.m @@ -172,6 +172,10 @@ - (BOOL)doesRuleMatch:(NSDictionary *)rule return NO; } + if (startT == (id)[NSNull null] || endT == (id)[NSNull null]) { + NSLog(@"can't cope with a null startT or endT, returning false"); + return false; + } NSCalendar *cal = [NSCalendar currentCalendar]; NSDateComponents *startC = [cal components:(NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:startT]; NSDateComponents *endC = [cal components:(NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:endT]; From 20111b99da72f5ab8d83204027ca3d85ea503922 Mon Sep 17 00:00:00 2001 From: dustinrue Date: Mon, 13 Apr 2015 13:41:17 -0500 Subject: [PATCH 2/5] don't encode & --- Source/DefaultBrowserAction.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/DefaultBrowserAction.m b/Source/DefaultBrowserAction.m index 8958707e2..ca49923d8 100644 --- a/Source/DefaultBrowserAction.m +++ b/Source/DefaultBrowserAction.m @@ -155,7 +155,7 @@ - (void)handleURL:(NSString *)url { NULL, (CFStringRef)decodedURL, (CFStringRef)@"#", - (CFStringRef)@" &", + (CFStringRef)@" ", kCFStringEncodingUTF8 ); NSArray *urls = [NSArray arrayWithObject:[NSURL URLWithString:newURL]]; [newURL release]; From fa87a552dfbcc3e619e95203f6aa4bff2fd641ce Mon Sep 17 00:00:00 2001 From: VladimirTechMan Date: Fri, 17 Apr 2015 13:23:53 +0300 Subject: [PATCH 3/5] Parameter checks, to prevent crashing when parameters cannot be parsed. --- Source/TimeOfDayEvidenceSource.m | 60 +++++++++++++++++++------------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/Source/TimeOfDayEvidenceSource.m b/Source/TimeOfDayEvidenceSource.m index 365a52069..043bd25ea 100644 --- a/Source/TimeOfDayEvidenceSource.m +++ b/Source/TimeOfDayEvidenceSource.m @@ -6,7 +6,7 @@ // #import "TimeOfDayEvidenceSource.h" - +#import "DSLogger.h" @interface TimeOfDayEvidenceSource (Private) @@ -22,23 +22,28 @@ @implementation TimeOfDayEvidenceSource - (BOOL)parseParameter:(NSString *)parameter intoDay:(NSString **)day startTime:(NSDate **)startT endTime:(NSDate **)endT { NSArray *arr = [parameter componentsSeparatedByString:@","]; - if ([arr count] != 3) - return NO; - - *day = [arr objectAtIndex:0]; - // TODO: check day is an element in our list? + if ([arr count] != 3) { + return NO; + } - *startT = [formatter dateFromString:[arr objectAtIndex:1]]; - *endT = [formatter dateFromString:[arr objectAtIndex:2]]; - // TODO: check parsing? (maybe by re-encoding string, and comparing) + *day = arr[0]; + *startT = [formatter dateFromString:arr[1]]; + *endT = [formatter dateFromString:arr[2]]; + if ((startT == nil) || (endT == nil)) { + DSLog(@"Error when parsing parameters in \"Time of day\" rule."); + return NO; + } + return YES; } - (id)init { - if (!(self = [super initWithNibNamed:@"TimeOfDayRule"])) - return nil; + self = [super initWithNibNamed:@"TimeOfDayRule"]; + if (self == nil) { + return nil; + } // Create formatter for reading/writing times ("HH:MM" only) formatter = [[NSDateFormatter alloc] init]; @@ -145,16 +150,27 @@ - (NSString *)name - (BOOL)doesRuleMatch:(NSDictionary *)rule { - NSString *day; - NSDate *startT, *endT; - NSCalendarDate *now = [NSCalendarDate calendarDate]; + NSString *day = nil; + NSDate *startT = nil, *endT = nil; - if (![self parseParameter:[rule valueForKey:@"parameter"] intoDay:&day startTime:&startT endTime:&endT]) - return NO; + if (![self parseParameter:rule[@"parameter"] intoDay:&day startTime:&startT endTime:&endT]) { + return NO; + } + + if (startT == (id)[NSNull null] || endT == (id)[NSNull null]) { + NSLog(@"can't cope with a null startT or endT, returning false"); + return NO; + } - if ([startT earlierDate:endT] == endT) //cross-midnight rule - endT = [endT dateByAddingTimeInterval:(24 * 60 * 60)]; // +24 hours - + if ([startT earlierDate:endT] == endT) { //cross-midnight rule + endT = [endT dateByAddingTimeInterval:(24 * 60 * 60)]; // +24 hours + if (endT == nil) { + return NO; + } + } + + NSCalendarDate *now = [NSCalendarDate calendarDate]; + // Check day first NSInteger dow = [now dayOfWeek]; // 0=Sunday, 1=Monday, etc. if ([day isEqualToString:@"Any day"]) { @@ -172,10 +188,6 @@ - (BOOL)doesRuleMatch:(NSDictionary *)rule return NO; } - if (startT == (id)[NSNull null] || endT == (id)[NSNull null]) { - NSLog(@"can't cope with a null startT or endT, returning false"); - return false; - } NSCalendar *cal = [NSCalendar currentCalendar]; NSDateComponents *startC = [cal components:(NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:startT]; NSDateComponents *endC = [cal components:(NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:endT]; @@ -192,7 +204,7 @@ - (BOOL)doesRuleMatch:(NSDictionary *)rule return YES; } -- (NSString *) friendlyName { +- (NSString *)friendlyName { return NSLocalizedString(@"Time Of Day", @""); } From 11f9132ea46e07468fdbac389848290ffd01c076 Mon Sep 17 00:00:00 2001 From: VladimirTechMan Date: Fri, 17 Apr 2015 14:10:00 +0300 Subject: [PATCH 4/5] More improvements in parameter validation and user messages for Time-of-day rule --- Source/TimeOfDayEvidenceSource.m | 50 ++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/Source/TimeOfDayEvidenceSource.m b/Source/TimeOfDayEvidenceSource.m index 043bd25ea..7c5679462 100644 --- a/Source/TimeOfDayEvidenceSource.m +++ b/Source/TimeOfDayEvidenceSource.m @@ -7,8 +7,9 @@ #import "TimeOfDayEvidenceSource.h" #import "DSLogger.h" +#import "RuleType.h" -@interface TimeOfDayEvidenceSource (Private) +@interface TimeOfDayEvidenceSource () // Returns NO on failure - (BOOL)parseParameter:(NSString *)parameter intoDay:(NSString **)day startTime:(NSDate **)startT endTime:(NSDate **)endT; @@ -25,13 +26,18 @@ - (BOOL)parseParameter:(NSString *)parameter intoDay:(NSString **)day startTime: if ([arr count] != 3) { return NO; } - + *day = arr[0]; + *startT = [formatter dateFromString:arr[1]]; + if (startT == nil) { + DSLog(@"Cannot parse value \"%@\" of parameter \"Start time\" in a \"Time of day\" rule.", arr[1]); + return NO; + } + *endT = [formatter dateFromString:arr[2]]; - - if ((startT == nil) || (endT == nil)) { - DSLog(@"Error when parsing parameters in \"Time of day\" rule."); + if (endT == nil) { + DSLog(@"Cannot parse value \"%@\" of parameter \"End time\" in a \"Time of day\" rule.", arr[2]); return NO; } @@ -89,18 +95,42 @@ - (NSString *) description { return NSLocalizedString(@"Create rules based on the time of day and day of week.", @""); } +- (IBAction)closeSheetWithOK:(id)sender +{ + if ([self validatePanelParams]) { + [super closeSheetWithOK:sender]; + } +} + +- (BOOL)validatePanelParams +{ + NSString *startT = [formatter stringFromDate:startTime]; + if (startT == nil) { + [RuleType alertOnInvalidParamValueWith:NSLocalizedString(@"Start time format is not correct", @"")]; + return NO; + } + + NSString *endT = [formatter stringFromDate:endTime]; + if (endT == nil) { + [RuleType alertOnInvalidParamValueWith:NSLocalizedString(@"End time format is not correct", @"")]; + return NO; + } + + return YES; +} + - (NSMutableDictionary *)readFromPanel { NSMutableDictionary *dict = [super readFromPanel]; - + NSString *param = [NSString stringWithFormat:@"%@,%@,%@", selectedDay, + [formatter stringFromDate:startTime], [formatter stringFromDate:endTime]]; + // Make formatter for description of times NSDateFormatter *fmt = [[[NSDateFormatter alloc] init] autorelease]; [fmt setFormatterBehavior:NSDateFormatterBehavior10_4]; [fmt setDateStyle:NSDateFormatterNoStyle]; [fmt setTimeStyle:NSDateFormatterShortStyle]; - NSString *param = [NSString stringWithFormat:@"%@,%@,%@", selectedDay, - [formatter stringFromDate:startTime], [formatter stringFromDate:endTime]]; // TODO: improve description? NSString *desc = [NSString stringWithFormat:@"%@ %@-%@", selectedDay, [fmt stringFromDate:startTime], [fmt stringFromDate:endTime]]; @@ -158,7 +188,9 @@ - (BOOL)doesRuleMatch:(NSDictionary *)rule } if (startT == (id)[NSNull null] || endT == (id)[NSNull null]) { - NSLog(@"can't cope with a null startT or endT, returning false"); +#if DEBUG_MODE + DSLog(@"Cannot cope with a null startT or endT, returning false"); +#endif return NO; } From 923cdc0e2f021124892bc73e7471ba95077f88e3 Mon Sep 17 00:00:00 2001 From: VladimirTechMan Date: Fri, 17 Apr 2015 14:42:22 +0300 Subject: [PATCH 5/5] Replace the deprecated parameters with the current ones --- Source/TimeOfDayEvidenceSource.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/TimeOfDayEvidenceSource.m b/Source/TimeOfDayEvidenceSource.m index 7c5679462..596fc8dfe 100644 --- a/Source/TimeOfDayEvidenceSource.m +++ b/Source/TimeOfDayEvidenceSource.m @@ -219,11 +219,11 @@ - (BOOL)doesRuleMatch:(NSDictionary *)rule if (![day isEqualToString:day_name[dow]]) return NO; } - + NSCalendar *cal = [NSCalendar currentCalendar]; - NSDateComponents *startC = [cal components:(NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:startT]; - NSDateComponents *endC = [cal components:(NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:endT]; - + NSDateComponents *startC = [cal components:(NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:startT]; + NSDateComponents *endC = [cal components:(NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:endT]; + // Test with startT if (([now hourOfDay] < [startC hour]) || (([now hourOfDay] == [startC hour]) && ([now minuteOfHour] < [startC minute])))