tdf#124918: Don't crash on invalid URLs in the template list file
diff --git a/ios/Mobile/AppDelegate.mm b/ios/Mobile/AppDelegate.mm
index d017129..d1ec581 100644
--- a/ios/Mobile/AppDelegate.mm
+++ b/ios/Mobile/AppDelegate.mm
@@ -102,51 +102,55 @@
NSString *line = [NSString stringWithUTF8String:buf.data()];
NSURL *url = [NSURL URLWithString:line];
NSString *baseName = [url lastPathComponent];
if (url == nil)
LOG_ERR("Invalid URL in template file: " << [line UTF8String]);
else {
NSString *baseName = [url lastPathComponent];
NSString *hash = [[NSData dataWithBytes:buf.data() length:length] base64EncodedStringWithOptions:0];
[urlHashes addObject:hash];
NSString *hash = [[NSData dataWithBytes:buf.data() length:length] base64EncodedStringWithOptions:0];
[urlHashes addObject:hash];
NSString *directoryForTemplate = [downloadedTemplates stringByAppendingString:hash];
NSString *directoryForTemplate = [downloadedTemplates stringByAppendingString:hash];
NSURL *fileForTemplate = [NSURL fileURLWithPath:[directoryForTemplate stringByAppendingString:[@"/" stringByAppendingString:baseName]]];
NSURL *fileForTemplate = [NSURL fileURLWithPath:[directoryForTemplate stringByAppendingString:[@"/" stringByAppendingString:baseName]]];
// If we have that template, check whether it is up-to-date
BOOL isDirectory;
if ([[NSFileManager defaultManager] fileExistsAtPath:directoryForTemplate isDirectory:&isDirectory] &&
isDirectory) {
NSMutableURLRequest *req = [[NSURLRequest requestWithURL:url] mutableCopy];
[req setHTTPMethod:@"HEAD"];
[[[NSURLSession sharedSession] dataTaskWithRequest:req
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error == nil && [response isKindOfClass:[NSHTTPURLResponse class]] && [(NSHTTPURLResponse*)response statusCode] == 200) {
NSString *lastModified = [[(NSHTTPURLResponse*)response allHeaderFields] objectForKey:@"Last-Modified"];
NSDateFormatter *df = [[NSDateFormatter alloc] init];
df.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss z";
NSDate *templateDate = [df dateFromString:lastModified];
// If we have that template, check whether it is up-to-date
BOOL isDirectory;
if ([[NSFileManager defaultManager] fileExistsAtPath:directoryForTemplate isDirectory:&isDirectory] &&
isDirectory) {
NSMutableURLRequest *req = [[NSURLRequest requestWithURL:url] mutableCopy];
[req setHTTPMethod:@"HEAD"];
[[[NSURLSession sharedSession] dataTaskWithRequest:req
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error == nil && [response isKindOfClass:[NSHTTPURLResponse class]] && [(NSHTTPURLResponse*)response statusCode] == 200) {
NSString *lastModified = [[(NSHTTPURLResponse*)response allHeaderFields] objectForKey:@"Last-Modified"];
NSDateFormatter *df = [[NSDateFormatter alloc] init];
df.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss z";
NSDate *templateDate = [df dateFromString:lastModified];
NSDate *cachedTemplateDate = [[[NSFileManager defaultManager] attributesOfItemAtPath:[fileForTemplate path] error:nil] objectForKey:NSFileModificationDate];
NSDate *cachedTemplateDate = [[[NSFileManager defaultManager] attributesOfItemAtPath:[fileForTemplate path] error:nil] objectForKey:NSFileModificationDate];
if ([templateDate compare:cachedTemplateDate] == NSOrderedDescending) {
downloadTemplate(url, fileForTemplate);
if ([templateDate compare:cachedTemplateDate] == NSOrderedDescending) {
downloadTemplate(url, fileForTemplate);
}
} else if (error == nil && [response isKindOfClass:[NSHTTPURLResponse class]]) {
LOG_ERR("Failed to get HEAD of " <<
[[url absoluteString] UTF8String] <<
": response code " << [(NSHTTPURLResponse*)response statusCode]);
} else if (error != nil) {
LOG_ERR("Failed to get HEAD of " <<
[[url absoluteString] UTF8String] <<
": " << [[error description] UTF8String]);
} else {
LOG_ERR("Failed to get HEAD of " <<
[[url absoluteString] UTF8String]);
}
} else if (error == nil && [response isKindOfClass:[NSHTTPURLResponse class]]) {
LOG_ERR("Failed to get HEAD of " <<
[[url absoluteString] UTF8String] <<
": response code " << [(NSHTTPURLResponse*)response statusCode]);
} else if (error != nil) {
LOG_ERR("Failed to get HEAD of " <<
[[url absoluteString] UTF8String] <<
": " << [[error description] UTF8String]);
} else {
LOG_ERR("Failed to get HEAD of " <<
[[url absoluteString] UTF8String]);
}
}] resume];
} else {
// Else download it.
[[NSFileManager defaultManager] createDirectoryAtPath:directoryForTemplate withIntermediateDirectories:YES attributes:nil error:nil];
downloadTemplate(url, fileForTemplate);
}] resume];
} else {
// Else download it.
[[NSFileManager defaultManager] createDirectoryAtPath:directoryForTemplate withIntermediateDirectories:YES attributes:nil error:nil];
downloadTemplate(url, fileForTemplate);
}
}
}
}