OCNetworking.m 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973
  1. //
  2. // OCnetworking.m
  3. // Crypto Cloud Technology Nextcloud
  4. //
  5. // Created by Marino Faggiana on 10/05/15.
  6. // Copyright (c) 2014 TWS. All rights reserved.
  7. //
  8. // Author Marino Faggiana <m.faggiana@twsweb.it>
  9. //
  10. // This program is free software: you can redistribute it and/or modify
  11. // it under the terms of the GNU General Public License as published by
  12. // the Free Software Foundation, either version 3 of the License, or
  13. // (at your option) any later version.
  14. //
  15. // This program is distributed in the hope that it will be useful,
  16. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. // GNU General Public License for more details.
  19. //
  20. // You should have received a copy of the GNU General Public License
  21. // along with this program. If not, see <http://www.gnu.org/licenses/>.
  22. //
  23. #import "OCNetworking.h"
  24. #import "AppDelegate.h"
  25. #import "CCGraphics.h"
  26. #import "CCCertificate.h"
  27. #ifdef CC
  28. #import "CCSharedDBSession.h"
  29. #endif
  30. #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
  31. @interface OCnetworking ()
  32. {
  33. NSString *_activeUser;
  34. NSString *_activePassword;
  35. NSString *_activeUrl;
  36. NSString *_typeCloud;
  37. NSURLSessionDownloadTask *_downloadTask;
  38. NSURLSessionUploadTask *_uploadTask;
  39. BOOL _oneByOne;
  40. BOOL _activityIndicator;
  41. }
  42. @end
  43. @implementation OCnetworking
  44. - (id)initWithDelegate:(id <OCNetworkingDelegate>)delegate metadataNet:(CCMetadataNet *)metadataNet withUser:(NSString *)withUser withPassword:(NSString *)withPassword withUrl:(NSString *)withUrl withTypeCloud:(NSString *)withTypeCloud oneByOne:(BOOL)oneByOne activityIndicator:(BOOL)activityIndicator
  45. {
  46. self = [super init];
  47. if (self) {
  48. _delegate = delegate;
  49. _metadataNet = [[CCMetadataNet alloc] init];
  50. _metadataNet = [metadataNet copy];
  51. _activeUser = withUser;
  52. _activePassword = withPassword;
  53. _activeUrl = withUrl;
  54. _typeCloud = withTypeCloud;
  55. _oneByOne = oneByOne;
  56. _activityIndicator = activityIndicator;
  57. }
  58. return self;
  59. }
  60. - (void)start
  61. {
  62. if (![NSThread isMainThread]) {
  63. [self performSelectorOnMainThread:@selector(start) withObject:nil waitUntilDone:NO];
  64. return;
  65. }
  66. [self willChangeValueForKey:@"isExecuting"];
  67. _isExecuting = YES;
  68. [self didChangeValueForKey:@"isExecuting"];
  69. if (self.isCancelled) {
  70. [self finish];
  71. } else {
  72. [self poolNetworking];
  73. }
  74. }
  75. - (void)finish
  76. {
  77. [self willChangeValueForKey:@"isExecuting"];
  78. [self willChangeValueForKey:@"isFinished"];
  79. _isExecuting = NO;
  80. _isFinished = YES;
  81. [self didChangeValueForKey:@"isExecuting"];
  82. [self didChangeValueForKey:@"isFinished"];
  83. }
  84. - (void)cancel
  85. {
  86. if (_isExecuting) {
  87. if (_downloadTask)
  88. [_downloadTask cancel];
  89. if (_uploadTask)
  90. [_uploadTask cancel];
  91. [self complete];
  92. }
  93. [super cancel];
  94. }
  95. - (void)poolNetworking
  96. {
  97. #ifndef SHARE_IN
  98. // Animation network
  99. if (_activityIndicator) {
  100. dispatch_async(dispatch_get_main_queue(), ^{
  101. [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
  102. [[NSNotificationCenter defaultCenter] postNotificationName:@"setTitleCCMainYESAnimation" object:nil];
  103. });
  104. }
  105. #endif
  106. if([self respondsToSelector:NSSelectorFromString(_metadataNet.action)])
  107. [self performSelector:NSSelectorFromString(_metadataNet.action)];
  108. }
  109. #pragma --------------------------------------------------------------------------------------------
  110. #pragma mark ===== Delegate =====
  111. #pragma --------------------------------------------------------------------------------------------
  112. - (void)complete
  113. {
  114. #ifndef SHARE_IN
  115. // Animation network
  116. if (_activityIndicator) {
  117. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
  118. [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
  119. [[NSNotificationCenter defaultCenter] postNotificationName:@"setTitleCCMainNOAnimation" object:nil];
  120. });
  121. }
  122. #endif
  123. [self finish];
  124. }
  125. #pragma --------------------------------------------------------------------------------------------
  126. #pragma mark ===== downloadFile =====
  127. #pragma --------------------------------------------------------------------------------------------
  128. - (void)downloadFile
  129. {
  130. [[CCNetworking sharedNetworking] downloadFile:_metadataNet.metadata serverUrl:_metadataNet.serverUrl downloadData:_metadataNet.downloadData downloadPlist:_metadataNet.downloadPlist selector:_metadataNet.selector selectorPost:_metadataNet.selectorPost session:_metadataNet.session taskStatus:_metadataNet.taskStatus delegate:self];
  131. if (!_oneByOne)
  132. [self complete];
  133. }
  134. - (void)downloadTaskSave:(NSURLSessionDownloadTask *)downloadTask
  135. {
  136. _downloadTask= downloadTask;
  137. if ([self.delegate respondsToSelector:@selector(downloadTaskSave:)])
  138. [self.delegate downloadTaskSave:downloadTask];
  139. }
  140. - (void)downloadFileSuccess:(NSString *)fileID serverUrl:(NSString *)serverUrl selector:(NSString *)selector selectorPost:(NSString *)selectorPost
  141. {
  142. [self complete];
  143. if ([self.delegate respondsToSelector:@selector(downloadFileSuccess:serverUrl:selector:selectorPost:)])
  144. [self.delegate downloadFileSuccess:fileID serverUrl:serverUrl selector:selector selectorPost:selectorPost];
  145. }
  146. - (void)downloadFileFailure:(NSString *)fileID serverUrl:(NSString *)serverUrl selector:(NSString *)selector message:(NSString *)message errorCode:(NSInteger)errorCode
  147. {
  148. [self complete];
  149. if ([self.delegate respondsToSelector:@selector(downloadFileFailure:serverUrl:selector:message:errorCode:)])
  150. [self.delegate downloadFileFailure:fileID serverUrl:serverUrl selector:selector message:message errorCode:errorCode];
  151. }
  152. #pragma --------------------------------------------------------------------------------------------
  153. #pragma mark ===== uploadFile =====
  154. #pragma --------------------------------------------------------------------------------------------
  155. - (void)uploadFile
  156. {
  157. [[CCNetworking sharedNetworking] uploadFile:_metadataNet.fileName serverUrl:_metadataNet.serverUrl cryptated:_metadataNet.cryptated onlyPlist:NO session:_metadataNet.session taskStatus:_metadataNet.taskStatus selector:_metadataNet.selector selectorPost:_metadataNet.selectorPost parentRev:nil errorCode:_metadataNet.errorCode delegate:self];
  158. if (!_oneByOne)
  159. [self complete];
  160. }
  161. - (void)uploadOnlyPlist
  162. {
  163. [[CCNetworking sharedNetworking] uploadFile:_metadataNet.fileName serverUrl:_metadataNet.serverUrl cryptated:YES onlyPlist:YES session:_metadataNet.session taskStatus:_metadataNet.taskStatus selector:_metadataNet.selector selectorPost:_metadataNet.selectorPost parentRev:nil errorCode:_metadataNet.errorCode delegate:self];
  164. if (!_oneByOne)
  165. [self complete];
  166. }
  167. - (void)uploadAsset
  168. {
  169. [[CCNetworking sharedNetworking] uploadFileFromAsset:_metadataNet.asset serverUrl:_metadataNet.serverUrl cryptated:_metadataNet.cryptated session:_metadataNet.session taskStatus:_metadataNet.taskStatus selector:_metadataNet.selector selectorPost:_metadataNet.selectorPost parentRev:nil errorCode:_metadataNet.errorCode delegate:self];
  170. if (!_oneByOne)
  171. [self complete];
  172. }
  173. - (void)uploadTemplate
  174. {
  175. [[CCNetworking sharedNetworking] uploadTemplate:_metadataNet.fileNamePrint fileNameCrypto:_metadataNet.fileName serverUrl:_metadataNet.serverUrl session:_metadataNet.session taskStatus:_metadataNet.taskStatus selector:_metadataNet.selector selectorPost:_metadataNet.selectorPost parentRev:nil errorCode:_metadataNet.errorCode delegate:self];
  176. if (!_oneByOne)
  177. [self complete];
  178. }
  179. - (void)uploadTaskSave:(NSURLSessionUploadTask *)uploadTask
  180. {
  181. _uploadTask = uploadTask;
  182. if ([self.delegate respondsToSelector:@selector(uploadTaskSave:)])
  183. [self.delegate uploadTaskSave:uploadTask];
  184. }
  185. - (void)uploadFileSuccess:(NSString *)fileID serverUrl:(NSString *)serverUrl selector:(NSString *)selector selectorPost:(NSString *)selectorPost
  186. {
  187. [self complete];
  188. if ([self.delegate respondsToSelector:@selector(uploadFileSuccess:serverUrl:selector:selectorPost:)])
  189. [self.delegate uploadFileSuccess:fileID serverUrl:serverUrl selector:selector selectorPost:selectorPost];
  190. }
  191. - (void)uploadFileFailure:(NSString *)fileID serverUrl:(NSString *)serverUrl selector:(NSString *)selector message:(NSString *)message errorCode:(NSInteger)errorCode
  192. {
  193. [self complete];
  194. if ([self.delegate respondsToSelector:@selector(uploadFileFailure:serverUrl:selector:message:errorCode:)])
  195. [self.delegate uploadFileFailure:fileID serverUrl:serverUrl selector:selector message:message errorCode:errorCode];
  196. }
  197. #pragma --------------------------------------------------------------------------------------------
  198. #pragma mark ===== downloadThumbnail =====
  199. #pragma --------------------------------------------------------------------------------------------
  200. - (void)downloadThumbnail
  201. {
  202. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  203. __block NSString *ext;
  204. NSInteger width = 0, height = 0;
  205. NSString *directoryUser = [CCUtility getDirectoryActiveUser:_activeUser activeUrl:_activeUrl];
  206. if ([_metadataNet.options.lowercaseString isEqualToString:@"xs"]) { width = 32; height = 32; ext = @"ico"; }
  207. else if ([_metadataNet.options.lowercaseString isEqualToString:@"s"]) { width = 64; height = 64; ext = @"ico"; }
  208. else if ([_metadataNet.options.lowercaseString isEqualToString:@"m"]) { width = 128; height = 128; ext = @"ico"; }
  209. else if ([_metadataNet.options.lowercaseString isEqualToString:@"l"]) { width = 640; height = 640; ext = @"pvw"; }
  210. else if ([_metadataNet.options.lowercaseString isEqualToString:@"xl"]) { width = 1024; height = 1024; ext = @"pvw"; }
  211. if ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithFormat:@"%@/%@.%@", directoryUser, _metadataNet.fileNameLocal, ext]]) {
  212. [self.delegate downloadThumbnailSuccess:_metadataNet];
  213. [self complete];
  214. return;
  215. }
  216. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  217. [communication getRemoteThumbnailByServer:[_activeUrl stringByAppendingString:@"/"] ofFilePath:_metadataNet.fileName withWidth:width andHeight:height onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSData *thumbnail, NSString *redirectedServer) {
  218. TableAccount *recordAccount = [CCCoreData getActiveAccount];
  219. if ([recordAccount.account isEqualToString:_metadataNet.account]) {
  220. UIImage *thumbnailImage = [UIImage imageWithData:thumbnail];
  221. NSString *directoryUser = [CCUtility getDirectoryActiveUser:_activeUser activeUrl:_activeUrl];
  222. [CCGraphics saveIcoWithFileID:_metadataNet.fileNameLocal image:thumbnailImage writeToFile:[NSString stringWithFormat:@"%@/%@.%@", directoryUser, _metadataNet.fileNameLocal, ext] copy:NO move:NO fromPath:nil toPath:nil];
  223. if ([self.delegate respondsToSelector:@selector(downloadThumbnailSuccess:)] && [_metadataNet.action isEqualToString:actionDownloadThumbnail])
  224. [self.delegate downloadThumbnailSuccess:_metadataNet];
  225. }
  226. [self complete];
  227. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  228. NSInteger errorCode = response.statusCode;
  229. if (errorCode == 0)
  230. errorCode = error.code;
  231. if ([self.delegate respondsToSelector:@selector(downloadThumbnailFailure:message:errorCode:)] && [_metadataNet.action isEqualToString:actionDownloadThumbnail])
  232. [self.delegate downloadThumbnailFailure:_metadataNet message:[CCError manageErrorOC:response.statusCode error:error] errorCode:errorCode];
  233. [self complete];
  234. }];
  235. }
  236. #pragma --------------------------------------------------------------------------------------------
  237. #pragma mark ===== Read Folder =====
  238. #pragma --------------------------------------------------------------------------------------------
  239. - (void)readFolder
  240. {
  241. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  242. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  243. [communication readFolder:_metadataNet.serverUrl withUserSessionToken:nil onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSArray *items, NSString *redirectedServer, NSString *token) {
  244. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
  245. NSMutableArray *metadatas = [[NSMutableArray alloc] init];
  246. // directory [0]
  247. OCFileDto *itemDtoDirectory = [items objectAtIndex:0];
  248. NSString *permissions = itemDtoDirectory.permissions;
  249. NSString *rev = itemDtoDirectory.etag;
  250. NSDate *date = [NSDate dateWithTimeIntervalSince1970:itemDtoDirectory.date];
  251. NSString *directoryID = [CCCoreData addDirectory:_metadataNet.serverUrl date:date permissions:permissions activeAccount:_metadataNet.account];
  252. NSString *cameraFolderName = [CCCoreData getCameraUploadFolderNameActiveAccount:_metadataNet.account];
  253. NSString *cameraFolderPath = [CCCoreData getCameraUploadFolderPathActiveAccount:_metadataNet.account activeUrl:_activeUrl typeCloud:_typeCloud];
  254. NSString *directoryUser = [CCUtility getDirectoryActiveUser:_activeUser activeUrl:_activeUrl];
  255. // Update metadataNet.directoryID
  256. _metadataNet.directoryID = directoryID;
  257. NSArray *itemsSortedArray = [items sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
  258. NSString *first = [(OCFileDto*)a fileName];
  259. NSString *second = [(OCFileDto*)b fileName];
  260. return [[first lowercaseString] compare:[second lowercaseString]];
  261. }];
  262. for (NSUInteger i=1; i < [itemsSortedArray count]; i++) {
  263. OCFileDto *itemDto = [itemsSortedArray objectAtIndex:i];
  264. itemDto.fileName = [CCUtility clearFile:itemDto.fileName];
  265. // ----- BUG #942 ---------
  266. if ([itemDto.etag length] == 0) {
  267. #ifndef SHARE_IN
  268. [app messageNotification:@"Server error" description:@"Metadata etag absent, record excluded, please fix" visible:YES delay:dismissAfterSecond type:TWMessageBarMessageTypeError];
  269. #endif
  270. continue;
  271. }
  272. // ------------------------
  273. [metadatas addObject:[CCUtility trasformedOCFileToCCMetadata:itemDto fileNamePrint:itemDto.fileName serverUrl:_metadataNet.serverUrl directoryID:directoryID cameraFolderName:cameraFolderName cameraFolderPath:cameraFolderPath activeAccount:_metadataNet.account directoryUser:directoryUser typeCloud:_typeCloud]];
  274. }
  275. dispatch_async(dispatch_get_main_queue(), ^{
  276. if ([self.delegate respondsToSelector:@selector(readFolderSuccess:permissions:rev:metadatas:)])
  277. [self.delegate readFolderSuccess:_metadataNet permissions:permissions rev:rev metadatas:metadatas];
  278. });
  279. });
  280. [self complete];
  281. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *token, NSString *redirectedServer) {
  282. NSInteger errorCode = response.statusCode;
  283. if (errorCode == 0)
  284. errorCode = error.code;
  285. if ([self.delegate respondsToSelector:@selector(readFolderFailure:message:errorCode:)])
  286. [self.delegate readFolderFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  287. // Request trusted certificated
  288. if ([error code] == NSURLErrorServerCertificateUntrusted)
  289. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  290. [self complete];
  291. }];
  292. }
  293. #pragma --------------------------------------------------------------------------------------------
  294. #pragma mark ===== Create Folder =====
  295. #pragma --------------------------------------------------------------------------------------------
  296. - (void)createFolder
  297. {
  298. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  299. BOOL hasServerForbiddenCharactersSupport;
  300. NSString *nameFolderURL = [NSString stringWithFormat:@"%@/%@", _metadataNet.serverUrl, _metadataNet.fileName];
  301. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  302. [communication createFolder:nameFolderURL onCommunication:communication withForbiddenCharactersSupported:hasServerForbiddenCharactersSupport successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
  303. if ([self.delegate respondsToSelector:@selector(createFolderSuccess:)])
  304. [self.delegate createFolderSuccess:_metadataNet];
  305. [self complete];
  306. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  307. NSString *message;
  308. if (([_metadataNet.fileName isEqualToString:[CCCoreData getCameraUploadFolderNameActiveAccount:_metadataNet.account]] == YES && [_metadataNet.serverUrl isEqualToString:[CCCoreData getCameraUploadFolderPathActiveAccount:_metadataNet.account activeUrl:_activeUrl typeCloud:_typeCloud]] == YES))
  309. message = nil;
  310. else
  311. message = [CCError manageErrorOC:response.statusCode error:error];
  312. NSInteger errorCode = response.statusCode;
  313. if (errorCode == 0)
  314. errorCode = error.code;
  315. if ([self.delegate respondsToSelector:@selector(createFolderFailure:message:errorCode:)])
  316. [self.delegate createFolderFailure:_metadataNet message:message errorCode:errorCode];
  317. // Request trusted certificated
  318. if ([error code] == NSURLErrorServerCertificateUntrusted)
  319. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  320. [self complete];
  321. } errorBeforeRequest:^(NSError *error) {
  322. NSString *message;
  323. if (([_metadataNet.fileName isEqualToString:[CCCoreData getCameraUploadFolderNameActiveAccount:_metadataNet.account]] == YES && [_metadataNet.serverUrl isEqualToString:[CCCoreData getCameraUploadFolderPathActiveAccount:_metadataNet.account activeUrl:_activeUrl typeCloud:_typeCloud]] == YES))
  324. message = nil;
  325. else {
  326. if (error.code == OCErrorForbidenCharacters)
  327. message = NSLocalizedStringFromTable(@"_forbidden_characters_from_server_", @"Error", nil);
  328. else
  329. message = NSLocalizedStringFromTable(@"_unknow_response_server_", @"Error", nil);
  330. }
  331. if ([self.delegate respondsToSelector:@selector(createFolderFailure:message:errorCode:)])
  332. [self.delegate createFolderFailure:_metadataNet message:message errorCode:error.code];
  333. [self complete];
  334. }];
  335. }
  336. - (NSError *)createFolderSync:(NSString *)folderPathName
  337. {
  338. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  339. BOOL hasServerForbiddenCharactersSupport;
  340. __block NSError *returnError;
  341. dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
  342. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  343. [communication createFolder:folderPathName onCommunication:communication withForbiddenCharactersSupported:hasServerForbiddenCharactersSupport successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
  344. dispatch_semaphore_signal(semaphore);
  345. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  346. // Request trusted certificated
  347. if ([error code] == NSURLErrorServerCertificateUntrusted)
  348. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  349. returnError = error;
  350. dispatch_semaphore_signal(semaphore);
  351. } errorBeforeRequest:^(NSError *error) {
  352. returnError = error;
  353. dispatch_semaphore_signal(semaphore);
  354. }];
  355. while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW))
  356. [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:k_timeout_webdav]];
  357. return returnError;
  358. }
  359. #pragma --------------------------------------------------------------------------------------------
  360. #pragma mark ===== Delete =====
  361. #pragma --------------------------------------------------------------------------------------------
  362. - (void)deleteFileOrFolder
  363. {
  364. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  365. NSString *serverFileUrl = [NSString stringWithFormat:@"%@/%@", _metadataNet.serverUrl, _metadataNet.fileName];
  366. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  367. [communication deleteFileOrFolder:serverFileUrl onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
  368. if ([_metadataNet.selector rangeOfString:selectorDelete].location != NSNotFound && [self.delegate respondsToSelector:@selector(deleteFileOrFolderSuccess:)])
  369. [self.delegate deleteFileOrFolderSuccess:_metadataNet];
  370. [self complete];
  371. } failureRquest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  372. NSInteger errorCode = response.statusCode;
  373. if (errorCode == 0)
  374. errorCode = error.code;
  375. if ([self.delegate respondsToSelector:@selector(deleteFileOrFolderFailure:message:errorCode:)])
  376. [self.delegate deleteFileOrFolderFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  377. // Request trusted certificated
  378. if ([error code] == NSURLErrorServerCertificateUntrusted)
  379. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  380. [self complete];
  381. }];
  382. }
  383. #pragma --------------------------------------------------------------------------------------------
  384. #pragma mark ===== Move =====
  385. #pragma --------------------------------------------------------------------------------------------
  386. - (void)moveFileOrFolder
  387. {
  388. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  389. BOOL hasServerForbiddenCharactersSupport;
  390. NSString *origineURL = [NSString stringWithFormat:@"%@/%@", _metadataNet.serverUrl, _metadataNet.fileName];
  391. NSString *destinazioneURL = [NSString stringWithFormat:@"%@/%@", _metadataNet.serverUrlTo, _metadataNet.fileNameTo];
  392. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  393. [communication moveFileOrFolder:origineURL toDestiny:destinazioneURL onCommunication:communication withForbiddenCharactersSupported:hasServerForbiddenCharactersSupport successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
  394. if ([_metadataNet.selector isEqualToString:selectorRename] && [self.delegate respondsToSelector:@selector(renameSuccess:revTo:)])
  395. [self.delegate renameSuccess:_metadataNet revTo:nil];
  396. if ([_metadataNet.selector rangeOfString:selectorMove].location != NSNotFound && [self.delegate respondsToSelector:@selector(moveSuccess:revTo:)])
  397. [self.delegate moveSuccess:_metadataNet revTo:nil];
  398. [self complete];
  399. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  400. NSInteger errorCode = response.statusCode;
  401. if (errorCode == 0)
  402. errorCode = error.code;
  403. if ([self.delegate respondsToSelector:@selector(moveFileOrFolderFailure:message:errorCode:)])
  404. [self.delegate moveFileOrFolderFailure:_metadataNet message:[CCError manageErrorOC:response.statusCode error:error] errorCode:errorCode];
  405. // Request trusted certificated
  406. if ([error code] == NSURLErrorServerCertificateUntrusted)
  407. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  408. [self complete];
  409. } errorBeforeRequest:^(NSError *error) {
  410. NSString *message;
  411. if (error.code == OCErrorMovingTheDestinyAndOriginAreTheSame) {
  412. message = NSLocalizedStringFromTable(@"_error_folder_destiny_is_the_same_", @"Error", nil);
  413. } else if (error.code == OCErrorMovingFolderInsideHimself) {
  414. message = NSLocalizedStringFromTable(@"_error_folder_destiny_is_the_same_", @"Error", nil);
  415. } else if (error.code == OCErrorMovingDestinyNameHaveForbiddenCharacters) {
  416. message = NSLocalizedStringFromTable(@"_forbidden_characters_from_server_", @"Error", nil);
  417. } else {
  418. message = NSLocalizedStringFromTable(@"_unknow_response_server_", @"Error", nil);
  419. }
  420. if ([self.delegate respondsToSelector:@selector(moveFileOrFolderFailure:message:errorCode:)])
  421. [self.delegate moveFileOrFolderFailure:_metadataNet message:message errorCode:error.code];
  422. [self complete];
  423. }];
  424. }
  425. #pragma --------------------------------------------------------------------------------------------
  426. #pragma mark ===== ReadFile =====
  427. #pragma --------------------------------------------------------------------------------------------
  428. - (void)readFile
  429. {
  430. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  431. NSString *fileName;
  432. if (_metadataNet.fileName)
  433. fileName = [NSString stringWithFormat:@"%@/%@", _metadataNet.serverUrl, _metadataNet.fileName];
  434. else
  435. fileName = _metadataNet.serverUrl;
  436. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  437. [communication readFile:fileName onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSArray *items, NSString *redirectedServer) {
  438. TableAccount *recordAccount = [CCCoreData getActiveAccount];
  439. if ([recordAccount.account isEqualToString:_metadataNet.account] && [items count] > 0) {
  440. CCMetadata *metadata = [[CCMetadata alloc] init];
  441. OCFileDto *itemDto = [items objectAtIndex:0];
  442. itemDto.fileName = _metadataNet.fileName;
  443. NSString *directoryID = [CCCoreData getDirectoryIDFromServerUrl:_metadataNet.serverUrl activeAccount:_metadataNet.account];
  444. NSString *cameraFolderName = [CCCoreData getCameraUploadFolderNameActiveAccount:_metadataNet.account];
  445. NSString *cameraFolderPath = [CCCoreData getCameraUploadFolderPathActiveAccount:_metadataNet.account activeUrl:_activeUrl typeCloud:_typeCloud];
  446. NSString *directoryUser = [CCUtility getDirectoryActiveUser:_activeUser activeUrl:_activeUrl];
  447. metadata = [CCUtility trasformedOCFileToCCMetadata:itemDto fileNamePrint:_metadataNet.fileNamePrint serverUrl:_metadataNet.serverUrl directoryID:directoryID cameraFolderName:cameraFolderName cameraFolderPath:cameraFolderPath activeAccount:_metadataNet.account directoryUser:directoryUser typeCloud:_typeCloud];
  448. if([self.delegate respondsToSelector:@selector(readFileSuccess:metadata:)])
  449. [self.delegate readFileSuccess:_metadataNet metadata:metadata];
  450. }
  451. // BUG 1038
  452. if ([items count] == 0) {
  453. #ifndef SHARE_IN
  454. [app messageNotification:@"Server error" description:@"readFile, items NULL, please fix" visible:YES delay:dismissAfterSecond type:TWMessageBarMessageTypeError];
  455. #endif
  456. }
  457. [self complete];
  458. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  459. TableAccount *recordAccount = [CCCoreData getActiveAccount];
  460. _metadataNet.errorRetry++;
  461. NSInteger errorCode = response.statusCode;
  462. if (errorCode == 0)
  463. errorCode = error.code;
  464. if([self.delegate respondsToSelector:@selector(readFileFailure:message:errorCode:)] && [recordAccount.account isEqualToString:_metadataNet.account])
  465. [self.delegate readFileFailure:_metadataNet message:[CCError manageErrorOC:response.statusCode error:error] errorCode:errorCode];
  466. // Request trusted certificated
  467. if ([error code] == NSURLErrorServerCertificateUntrusted)
  468. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  469. [self complete];
  470. }];
  471. }
  472. - (NSError *)readFileSync:(NSString *)filePathName
  473. {
  474. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  475. __block NSError *returnError;
  476. dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
  477. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  478. [communication readFile:filePathName onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSArray *items, NSString *redirectedServer) {
  479. returnError = nil;
  480. dispatch_semaphore_signal(semaphore);
  481. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  482. // Request trusted certificated
  483. if ([error code] == NSURLErrorServerCertificateUntrusted)
  484. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  485. returnError = error;
  486. dispatch_semaphore_signal(semaphore);
  487. }];
  488. while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW))
  489. [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:k_timeout_webdav]];
  490. return returnError;
  491. }
  492. #pragma --------------------------------------------------------------------------------------------
  493. #pragma mark ===== Shared =====
  494. #pragma --------------------------------------------------------------------------------------------
  495. - (NSMutableDictionary *)getShareID
  496. {
  497. #ifndef SHARE_IN
  498. return app.sharesID;
  499. #endif
  500. return [NSMutableDictionary new];
  501. }
  502. - (void)readShareServer
  503. {
  504. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  505. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  506. [communication readSharedByServer:[_activeUrl stringByAppendingString:@"/"] onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSArray *items, NSString *redirectedServer) {
  507. BOOL openWindow = NO;
  508. [[self getShareID] removeAllObjects];
  509. TableAccount *recordAccount = [CCCoreData getActiveAccount];
  510. if ([recordAccount.account isEqualToString:_metadataNet.account]) {
  511. for (OCSharedDto *item in items)
  512. [[self getShareID] setObject:item forKey:[@(item.idRemoteShared) stringValue]];
  513. if ([_metadataNet.selector isEqual:selectorOpenWindowShare]) openWindow = YES;
  514. if ([_metadataNet.action isEqual:actionUpdateShare]) openWindow = YES;
  515. if ([_metadataNet.action isEqual:actionShare]) openWindow = YES;
  516. if ([_metadataNet.action isEqual:actionShareWith]) openWindow = YES;
  517. }
  518. if([self.delegate respondsToSelector:@selector(readSharedSuccess:items:openWindow:)])
  519. [self.delegate readSharedSuccess:_metadataNet items:[self getShareID] openWindow:openWindow];
  520. [self complete];
  521. } failureRequest :^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  522. NSInteger errorCode = response.statusCode;
  523. if (errorCode == 0)
  524. errorCode = error.code;
  525. if([self.delegate respondsToSelector:@selector(shareFailure:message:errorCode:)])
  526. [self.delegate shareFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  527. // Request trusted certificated
  528. if ([error code] == NSURLErrorServerCertificateUntrusted)
  529. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  530. [self complete];
  531. }];
  532. }
  533. - (void)share
  534. {
  535. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  536. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  537. [communication shareFileOrFolderByServer:[_activeUrl stringByAppendingString:@"/"] andFileOrFolderPath:_metadataNet.fileName andPassword:_metadataNet.password onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *token, NSString *redirectedServer) {
  538. [self readShareServer];
  539. } failureRequest :^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  540. NSInteger errorCode = response.statusCode;
  541. if (errorCode == 0)
  542. errorCode = error.code;
  543. if([self.delegate respondsToSelector:@selector(shareFailure:message:errorCode:)])
  544. [self.delegate shareFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  545. // Request trusted certificated
  546. if ([error code] == NSURLErrorServerCertificateUntrusted)
  547. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  548. [self complete];
  549. }];
  550. }
  551. // * @param shareeType -> NSInteger: to set the type of sharee (user/group/federated)
  552. - (void)shareWith
  553. {
  554. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  555. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  556. [communication shareWith:_metadataNet.share shareeType:_metadataNet.shareeType inServer:[_activeUrl stringByAppendingString:@"/"] andFileOrFolderPath:_metadataNet.fileName andPermissions:_metadataNet.sharePermission onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
  557. [self readShareServer];
  558. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  559. NSInteger errorCode = response.statusCode;
  560. if (errorCode == 0)
  561. errorCode = error.code;
  562. if([self.delegate respondsToSelector:@selector(shareFailure:message:errorCode:)])
  563. [self.delegate shareFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  564. // Request trusted certificated
  565. if ([error code] == NSURLErrorServerCertificateUntrusted)
  566. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  567. [self complete];
  568. }];
  569. }
  570. - (void)updateShare
  571. {
  572. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  573. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  574. [communication updateShare:[_metadataNet.share intValue] ofServerPath:[_activeUrl stringByAppendingString:@"/"] withPasswordProtect:_metadataNet.password andExpirationTime:_metadataNet.expirationTime andPermissions:_metadataNet.sharePermission onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
  575. [self readShareServer];
  576. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  577. #ifndef SHARE_IN
  578. [app messageNotification:@"_error_" description:[CCError manageErrorOC:response.statusCode error:error] visible:YES delay:dismissAfterSecond type:TWMessageBarMessageTypeError];
  579. #endif
  580. NSInteger errorCode = response.statusCode;
  581. if (errorCode == 0)
  582. errorCode = error.code;
  583. if([self.delegate respondsToSelector:@selector(shareFailure:message:errorCode:)])
  584. [self.delegate shareFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  585. // Request trusted certificated
  586. if ([error code] == NSURLErrorServerCertificateUntrusted)
  587. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  588. [self complete];
  589. }];
  590. }
  591. - (void)unShare
  592. {
  593. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  594. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  595. [communication unShareFileOrFolderByServer:[_activeUrl stringByAppendingString:@"/"] andIdRemoteShared:[_metadataNet.share intValue] onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
  596. if([self.delegate respondsToSelector:@selector(unShareSuccess:)])
  597. [self.delegate unShareSuccess:_metadataNet];
  598. [self complete];
  599. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  600. #ifndef SHARE_IN
  601. [app messageNotification:@"_error_" description:[CCError manageErrorOC:response.statusCode error:error] visible:YES delay:dismissAfterSecond type:TWMessageBarMessageTypeError];
  602. #endif
  603. NSInteger errorCode = response.statusCode;
  604. if (errorCode == 0)
  605. errorCode = error.code;
  606. if([self.delegate respondsToSelector:@selector(shareFailure:message:errorCode:)])
  607. [self.delegate shareFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  608. // Request trusted certificated
  609. if ([error code] == NSURLErrorServerCertificateUntrusted)
  610. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  611. [self complete];
  612. }];
  613. }
  614. #pragma --------------------------------------------------------------------------------------------
  615. #pragma mark ===== Server =====
  616. #pragma --------------------------------------------------------------------------------------------
  617. - (void)getUserAndGroup
  618. {
  619. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  620. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  621. [communication searchUsersAndGroupsWith:_metadataNet.options forPage:1 with:50 ofServer:[_activeUrl stringByAppendingString:@"/"] onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSArray *itemList, NSString *redirectedServer) {
  622. if([self.delegate respondsToSelector:@selector(getUserAndGroupSuccess:items:)])
  623. [self.delegate getUserAndGroupSuccess:_metadataNet items:itemList];
  624. [self complete];
  625. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  626. NSInteger errorCode = response.statusCode;
  627. if (errorCode == 0)
  628. errorCode = error.code;
  629. if([self.delegate respondsToSelector:@selector(getUserAndGroupFailure:message:errorCode:)])
  630. [self.delegate getUserAndGroupFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  631. // Request trusted certificated
  632. if ([error code] == NSURLErrorServerCertificateUntrusted)
  633. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  634. [self complete];
  635. }];
  636. }
  637. - (void)getFeaturesSupportedByServer
  638. {
  639. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  640. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  641. [communication getFeaturesSupportedByServer:[_activeUrl stringByAppendingString:@"/"] onCommunication:communication successRequest:^(NSHTTPURLResponse *response, BOOL hasShareSupport, BOOL hasShareeSupport, BOOL hasCookiesSupport, BOOL hasForbiddenCharactersSupport, BOOL hasCapabilitiesSupport, BOOL hasFedSharesOptionShareSupport, NSString *redirectedServer) {
  642. TableAccount *recordAccount = [CCCoreData getActiveAccount];
  643. if ([self.delegate respondsToSelector:@selector(getFeaturesSupportedByServerSuccess:hasForbiddenCharactersSupport:hasShareSupport:hasShareeSupport:)] && [recordAccount.account isEqualToString:_metadataNet.account])
  644. [self.delegate getFeaturesSupportedByServerSuccess:hasCapabilitiesSupport hasForbiddenCharactersSupport:hasForbiddenCharactersSupport hasShareSupport:hasShareSupport hasShareeSupport:hasShareeSupport];
  645. [self complete];
  646. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  647. NSInteger errorCode = response.statusCode;
  648. if (errorCode == 0)
  649. errorCode = error.code;
  650. if([self.delegate respondsToSelector:@selector(getInfoServerFailure:message:errorCode:)])
  651. [self.delegate getInfoServerFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  652. // Request trusted certificated
  653. if ([error code] == NSURLErrorServerCertificateUntrusted)
  654. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  655. [self complete];
  656. }];
  657. }
  658. - (void)getCapabilitiesOfServer
  659. {
  660. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  661. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  662. [communication getCapabilitiesOfServer:[_activeUrl stringByAppendingString:@"/"] onCommunication:communication successRequest:^(NSHTTPURLResponse *response, OCCapabilities *capabilities, NSString *redirectedServer) {
  663. TableAccount *recordAccount = [CCCoreData getActiveAccount];
  664. if ([self.delegate respondsToSelector:@selector(getCapabilitiesOfServerSuccess:)] && [recordAccount.account isEqualToString:_metadataNet.account])
  665. [self.delegate getCapabilitiesOfServerSuccess:capabilities];
  666. [self complete];
  667. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  668. NSInteger errorCode = response.statusCode;
  669. if (errorCode == 0)
  670. errorCode = error.code;
  671. if([self.delegate respondsToSelector:@selector(getInfoServerFailure:message:errorCode:)])
  672. [self.delegate getInfoServerFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  673. // Request trusted certificated
  674. if ([error code] == NSURLErrorServerCertificateUntrusted)
  675. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  676. [self complete];
  677. }];
  678. }
  679. @end
  680. #pragma --------------------------------------------------------------------------------------------
  681. #pragma mark ===== OCURLSessionManager =====
  682. #pragma --------------------------------------------------------------------------------------------
  683. @implementation OCURLSessionManager
  684. - (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
  685. {
  686. // The pinnning check
  687. if ([[CCCertificate sharedManager] checkTrustedChallenge:challenge]) {
  688. completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]);
  689. } else {
  690. completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil);
  691. }
  692. }
  693. @end