OCNetworking.m 69 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456
  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. #import "NSString+Encode.h"
  28. #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
  29. @interface OCnetworking ()
  30. {
  31. NSString *_activeUser;
  32. NSString *_activePassword;
  33. NSString *_activeUrl;
  34. NSURLSessionDownloadTask *_downloadTask;
  35. NSURLSessionUploadTask *_uploadTask;
  36. BOOL _isCryptoCloudMode;
  37. BOOL _hasServerForbiddenCharactersSupport;
  38. NSString *_fileActivityLog;
  39. NSString *_messageActivityLog;
  40. NSString *_subjectActivityLog;
  41. }
  42. @end
  43. @implementation OCnetworking
  44. - (id)initWithDelegate:(id <OCNetworkingDelegate>)delegate metadataNet:(CCMetadataNet *)metadataNet withUser:(NSString *)withUser withPassword:(NSString *)withPassword withUrl:(NSString *)withUrl isCryptoCloudMode:(BOOL)isCryptoCloudMode
  45. {
  46. self = [super init];
  47. if (self) {
  48. _delegate = delegate;
  49. _metadataNet = [CCMetadataNet new];
  50. _metadataNet = [metadataNet copy];
  51. _activeUser = withUser;
  52. _activePassword = withPassword;
  53. _activeUrl = withUrl;
  54. _isCryptoCloudMode = isCryptoCloudMode;
  55. }
  56. return self;
  57. }
  58. - (void)start
  59. {
  60. if (![NSThread isMainThread]) {
  61. [self performSelectorOnMainThread:@selector(start) withObject:nil waitUntilDone:NO];
  62. return;
  63. }
  64. [self willChangeValueForKey:@"isExecuting"];
  65. _isExecuting = YES;
  66. [self didChangeValueForKey:@"isExecuting"];
  67. if (self.isCancelled) {
  68. [self finish];
  69. } else {
  70. [self poolNetworking];
  71. }
  72. }
  73. - (void)finish
  74. {
  75. [self willChangeValueForKey:@"isExecuting"];
  76. [self willChangeValueForKey:@"isFinished"];
  77. _isExecuting = NO;
  78. _isFinished = YES;
  79. [self didChangeValueForKey:@"isExecuting"];
  80. [self didChangeValueForKey:@"isFinished"];
  81. }
  82. - (void)cancel
  83. {
  84. if (_isExecuting) {
  85. if (_downloadTask)
  86. [_downloadTask cancel];
  87. if (_uploadTask)
  88. [_uploadTask cancel];
  89. [self complete];
  90. }
  91. [super cancel];
  92. }
  93. - (void)poolNetworking
  94. {
  95. #ifndef EXTENSION
  96. _hasServerForbiddenCharactersSupport = app.hasServerForbiddenCharactersSupport;
  97. [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
  98. #else
  99. _hasServerForbiddenCharactersSupport = YES;
  100. #endif
  101. if([self respondsToSelector:NSSelectorFromString(_metadataNet.action)])
  102. [self performSelector:NSSelectorFromString(_metadataNet.action)];
  103. // Activity LOG
  104. if ([_metadataNet.selector length] > 0) {
  105. if ([_metadataNet.fileName length] > 0) {
  106. _fileActivityLog = [NSString stringWithFormat:@"%@/%@", _metadataNet.serverUrl, _metadataNet.fileName];
  107. _messageActivityLog = [CCUtility returnFileNamePathFromFileName:_metadataNet.fileName serverUrl:_metadataNet.serverUrl activeUrl:_activeUrl];
  108. _subjectActivityLog = _metadataNet.action;
  109. } else {
  110. _fileActivityLog = _metadataNet.serverUrl;
  111. _messageActivityLog = [CCUtility returnFileNamePathFromFileName:@"" serverUrl:_metadataNet.serverUrl activeUrl:_activeUrl];
  112. _subjectActivityLog = _metadataNet.action;
  113. }
  114. }
  115. }
  116. #pragma --------------------------------------------------------------------------------------------
  117. #pragma mark ===== Delegate =====
  118. #pragma --------------------------------------------------------------------------------------------
  119. - (void)complete
  120. {
  121. [self finish];
  122. #ifndef EXTENSION
  123. [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
  124. #endif
  125. }
  126. #pragma --------------------------------------------------------------------------------------------
  127. #pragma mark ===== Activity LOG =====
  128. #pragma --------------------------------------------------------------------------------------------
  129. - (void)createActivityType:(NSString *)type Verbose:(NSInteger)verbose note:(NSString *)note
  130. {
  131. [CCCoreData addActivityFile:_fileActivityLog action:_metadataNet.action note:note session:[CCUtility createRandomString:16] type:type verbose:verbose account:_metadataNet.account];
  132. }
  133. #pragma --------------------------------------------------------------------------------------------
  134. #pragma mark ===== downloadFile =====
  135. #pragma --------------------------------------------------------------------------------------------
  136. - (void)downloadFile
  137. {
  138. [[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];
  139. }
  140. - (void)downloadTaskSave:(NSURLSessionDownloadTask *)downloadTask
  141. {
  142. _downloadTask= downloadTask;
  143. if ([self.delegate respondsToSelector:@selector(downloadTaskSave:)])
  144. [self.delegate downloadTaskSave:downloadTask];
  145. }
  146. - (void)downloadFileSuccess:(NSString *)fileID serverUrl:(NSString *)serverUrl selector:(NSString *)selector selectorPost:(NSString *)selectorPost
  147. {
  148. [self complete];
  149. if ([self.delegate respondsToSelector:@selector(downloadFileSuccess:serverUrl:selector:selectorPost:)])
  150. [self.delegate downloadFileSuccess:fileID serverUrl:serverUrl selector:selector selectorPost:selectorPost];
  151. }
  152. - (void)downloadFileFailure:(NSString *)fileID serverUrl:(NSString *)serverUrl selector:(NSString *)selector message:(NSString *)message errorCode:(NSInteger)errorCode
  153. {
  154. [self complete];
  155. if ([self.delegate respondsToSelector:@selector(downloadFileFailure:serverUrl:selector:message:errorCode:)])
  156. [self.delegate downloadFileFailure:fileID serverUrl:serverUrl selector:selector message:message errorCode:errorCode];
  157. }
  158. #pragma --------------------------------------------------------------------------------------------
  159. #pragma mark ===== uploadFile =====
  160. #pragma --------------------------------------------------------------------------------------------
  161. - (void)uploadFile
  162. {
  163. [[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 errorCode:_metadataNet.errorCode delegate:self];
  164. }
  165. - (void)uploadOnlyPlist
  166. {
  167. [[CCNetworking sharedNetworking] uploadFile:_metadataNet.fileName serverUrl:_metadataNet.serverUrl cryptated:YES onlyPlist:YES session:_metadataNet.session taskStatus:_metadataNet.taskStatus selector:_metadataNet.selector selectorPost:_metadataNet.selectorPost errorCode:_metadataNet.errorCode delegate:self];
  168. }
  169. - (void)uploadAsset
  170. {
  171. [[CCNetworking sharedNetworking] uploadFileFromAssetLocalIdentifier:_metadataNet.identifier fileName:_metadataNet.fileName serverUrl:_metadataNet.serverUrl cryptated:_metadataNet.cryptated session:_metadataNet.session taskStatus:_metadataNet.taskStatus selector:_metadataNet.selector selectorPost:_metadataNet.selectorPost errorCode:_metadataNet.errorCode delegate:self];
  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 errorCode:_metadataNet.errorCode delegate:self];
  176. }
  177. - (void)uploadTaskSave:(NSURLSessionUploadTask *)uploadTask
  178. {
  179. _uploadTask = uploadTask;
  180. if ([self.delegate respondsToSelector:@selector(uploadTaskSave:)])
  181. [self.delegate uploadTaskSave:uploadTask];
  182. }
  183. - (void)uploadFileSuccess:(CCMetadataNet *)metadataNet fileID:(NSString *)fileID serverUrl:(NSString *)serverUrl selector:(NSString *)selector selectorPost:(NSString *)selectorPost
  184. {
  185. [self complete];
  186. if ([self.delegate respondsToSelector:@selector(uploadFileSuccess:fileID:serverUrl:selector:selectorPost:)])
  187. [self.delegate uploadFileSuccess:_metadataNet fileID:fileID serverUrl:serverUrl selector:selector selectorPost:selectorPost];
  188. }
  189. - (void)uploadFileFailure:(CCMetadataNet *)metadataNet fileID:(NSString *)fileID serverUrl:(NSString *)serverUrl selector:(NSString *)selector message:(NSString *)message errorCode:(NSInteger)errorCode
  190. {
  191. [self complete];
  192. if ([self.delegate respondsToSelector:@selector(uploadFileFailure:fileID:serverUrl:selector:message:errorCode:)])
  193. [self.delegate uploadFileFailure:_metadataNet fileID:fileID serverUrl:serverUrl selector:selector message:message errorCode:errorCode];
  194. }
  195. #pragma --------------------------------------------------------------------------------------------
  196. #pragma mark ===== downloadThumbnail =====
  197. #pragma --------------------------------------------------------------------------------------------
  198. - (void)downloadThumbnail
  199. {
  200. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  201. __block NSString *ext;
  202. NSInteger width = 0, height = 0;
  203. NSString *directoryUser = [CCUtility getDirectoryActiveUser:_activeUser activeUrl:_activeUrl];
  204. NSString *dimOfThumbnail = (NSString *)_metadataNet.options;
  205. if ([dimOfThumbnail.lowercaseString isEqualToString:@"xs"]) { width = 32; height = 32; ext = @"ico"; }
  206. else if ([dimOfThumbnail.lowercaseString isEqualToString:@"s"]) { width = 64; height = 64; ext = @"ico"; }
  207. else if ([dimOfThumbnail.lowercaseString isEqualToString:@"m"]) { width = 128; height = 128; ext = @"ico"; }
  208. else if ([dimOfThumbnail.lowercaseString isEqualToString:@"l"]) { width = 640; height = 640; ext = @"pvw"; }
  209. else if ([dimOfThumbnail.lowercaseString isEqualToString:@"xl"]) { width = 1024; height = 1024; ext = @"pvw"; }
  210. if ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithFormat:@"%@/%@.%@", directoryUser, _metadataNet.fileNameLocal, ext]]) {
  211. [self.delegate downloadThumbnailSuccess:_metadataNet];
  212. [self complete];
  213. return;
  214. }
  215. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  216. [communication setUserAgent:[CCUtility getUserAgent]];
  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] && [thumbnail length] > 0) {
  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. } else {
  226. if ([self.delegate respondsToSelector:@selector(downloadThumbnailFailure:message:errorCode:)] && [_metadataNet.action isEqualToString:actionDownloadThumbnail])
  227. [self.delegate downloadThumbnailFailure:_metadataNet message:@"No data" errorCode:0];
  228. }
  229. [self complete];
  230. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  231. NSInteger errorCode = response.statusCode;
  232. if (errorCode == 0)
  233. errorCode = error.code;
  234. if ([self.delegate respondsToSelector:@selector(downloadThumbnailFailure:message:errorCode:)] && [_metadataNet.action isEqualToString:actionDownloadThumbnail])
  235. [self.delegate downloadThumbnailFailure:_metadataNet message:[CCError manageErrorOC:response.statusCode error:error] errorCode:errorCode];
  236. [self complete];
  237. }];
  238. }
  239. #pragma --------------------------------------------------------------------------------------------
  240. #pragma mark ===== Read Folder =====
  241. #pragma --------------------------------------------------------------------------------------------
  242. - (void)readFolder
  243. {
  244. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  245. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  246. [communication setUserAgent:[CCUtility getUserAgent]];
  247. [communication readFolder:_metadataNet.serverUrl withUserSessionToken:nil onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSArray *items, NSString *redirectedServer, NSString *token) {
  248. NSMutableArray *metadatas = [NSMutableArray new];
  249. // Check items > 0
  250. if ([items count] == 0) {
  251. #ifndef EXTENSION
  252. [app messageNotification:@"Server error" description:@"Read Folder WebDAV : [items NULL] please fix" visible:YES delay:k_dismissAfterSecond type:TWMessageBarMessageTypeError];
  253. #endif
  254. dispatch_async(dispatch_get_main_queue(), ^{
  255. if ([self.delegate respondsToSelector:@selector(readFolderSuccess:permissions:etag:metadatas:)])
  256. [self.delegate readFolderSuccess:_metadataNet permissions:@"" etag:@"" metadatas:metadatas];
  257. });
  258. [self complete];
  259. return;
  260. }
  261. // directory [0]
  262. OCFileDto *itemDtoDirectory = [items objectAtIndex:0];
  263. NSString *permissions = itemDtoDirectory.permissions;
  264. NSString *etagDirectory = itemDtoDirectory.etag;
  265. //NSDate *date = [NSDate dateWithTimeIntervalSince1970:itemDtoDirectory.date];
  266. NSString *directoryID = [CCCoreData addDirectory:_metadataNet.serverUrl permissions:permissions activeAccount:_metadataNet.account];
  267. NSString *cameraFolderName = [CCCoreData getCameraUploadFolderNameActiveAccount:_metadataNet.account];
  268. NSString *cameraFolderPath = [CCCoreData getCameraUploadFolderPathActiveAccount:_metadataNet.account activeUrl:_activeUrl];
  269. NSString *directoryUser = [CCUtility getDirectoryActiveUser:_activeUser activeUrl:_activeUrl];
  270. // Update metadataNet.directoryID
  271. _metadataNet.directoryID = directoryID;
  272. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
  273. NSArray *itemsSortedArray = [items sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
  274. NSString *first = [(OCFileDto*)a fileName];
  275. NSString *second = [(OCFileDto*)b fileName];
  276. return [[first lowercaseString] compare:[second lowercaseString]];
  277. }];
  278. for (NSUInteger i=1; i < [itemsSortedArray count]; i++) {
  279. OCFileDto *itemDto = [itemsSortedArray objectAtIndex:i];
  280. itemDto.fileName = [itemDto.fileName stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  281. // Not in Crypto Cloud Mode skip File Crypto
  282. if (_isCryptoCloudMode == NO) {
  283. NSString *fileName = itemDto.fileName;
  284. if (itemDto.isDirectory) {
  285. fileName = [fileName substringToIndex:[fileName length] - 1];
  286. NSString *serverUrl = [CCUtility stringAppendServerUrl:_metadataNet.serverUrl addFileName:fileName];
  287. [CCCoreData addDirectory:serverUrl permissions:nil activeAccount:_metadataNet.account];
  288. }
  289. if ([CCUtility isFileCryptated:fileName])
  290. continue;
  291. }
  292. // ----- BUG #942 ---------
  293. if ([itemDto.etag length] == 0) {
  294. #ifndef EXTENSION
  295. [app messageNotification:@"Server error" description:@"Metadata etag absent, record excluded, please fix" visible:YES delay:k_dismissAfterSecond type:TWMessageBarMessageTypeError];
  296. #endif
  297. continue;
  298. }
  299. // ------------------------
  300. [metadatas addObject:[CCUtility trasformedOCFileToCCMetadata:itemDto fileNamePrint:itemDto.fileName serverUrl:_metadataNet.serverUrl directoryID:directoryID cameraFolderName:cameraFolderName cameraFolderPath:cameraFolderPath activeAccount:_metadataNet.account directoryUser:directoryUser]];
  301. }
  302. dispatch_async(dispatch_get_main_queue(), ^{
  303. if ([self.delegate respondsToSelector:@selector(readFolderSuccess:permissions:etag:metadatas:)])
  304. [self.delegate readFolderSuccess:_metadataNet permissions:permissions etag:etagDirectory metadatas:metadatas];
  305. });
  306. });
  307. [self complete];
  308. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *token, NSString *redirectedServer) {
  309. NSInteger errorCode = response.statusCode;
  310. if (errorCode == 0)
  311. errorCode = error.code;
  312. if ([self.delegate respondsToSelector:@selector(readFolderFailure:message:errorCode:)])
  313. [self.delegate readFolderFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  314. // Request trusted certificated
  315. if ([error code] == NSURLErrorServerCertificateUntrusted)
  316. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  317. [self createActivityType:k_activityTypeFailure Verbose:k_activityVerboseClientDebug note:[error.userInfo valueForKey:@"NSLocalizedDescription"]];
  318. [self complete];
  319. }];
  320. }
  321. #pragma --------------------------------------------------------------------------------------------
  322. #pragma mark ===== Search =====
  323. #pragma --------------------------------------------------------------------------------------------
  324. - (void)search
  325. {
  326. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  327. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  328. [communication setUserAgent:[CCUtility getUserAgent]];
  329. NSString *path = [_activeUrl stringByAppendingString:dav];
  330. NSString *folder = [_metadataNet.serverUrl stringByReplacingOccurrencesOfString:[CCUtility getHomeServerUrlActiveUrl:_activeUrl] withString:@""];
  331. [communication search:path folder:folder fileName:_metadataNet.fileName depth:_metadataNet.options withUserSessionToken:nil onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSArray *items, NSString *redirectedServer, NSString *token) {
  332. NSMutableArray *metadatas = [NSMutableArray new];
  333. NSString *cameraFolderName = [CCCoreData getCameraUploadFolderNameActiveAccount:_metadataNet.account];
  334. NSString *cameraFolderPath = [CCCoreData getCameraUploadFolderPathActiveAccount:_metadataNet.account activeUrl:_activeUrl];
  335. NSString *directoryUser = [CCUtility getDirectoryActiveUser:_activeUser activeUrl:_activeUrl];
  336. for(OCFileDto *itemDto in items) {
  337. itemDto.fileName = [itemDto.fileName stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  338. // Not in Crypto Cloud file
  339. NSString *fileName = itemDto.fileName;
  340. if (itemDto.isDirectory)
  341. fileName = [fileName substringToIndex:[fileName length] - 1];
  342. if ([CCUtility isFileCryptated:fileName])
  343. continue;
  344. // ----- BUG #942 ---------
  345. if ([itemDto.etag length] == 0) {
  346. #ifndef EXTENSION
  347. [app messageNotification:@"Server error" description:@"Metadata etag absent, record excluded, please fix" visible:YES delay:k_dismissAfterSecond type:TWMessageBarMessageTypeError];
  348. #endif
  349. continue;
  350. }
  351. // ------------------------
  352. NSString *serverUrl = [NSString stringWithFormat:@"%@/files/%@", dav, _activeUser];
  353. serverUrl = [itemDto.filePath stringByReplacingOccurrencesOfString:serverUrl withString:@""];
  354. /* TRIM */
  355. if ([serverUrl hasPrefix:@"/"])
  356. serverUrl = [serverUrl substringFromIndex:1];
  357. if ([serverUrl hasSuffix:@"/"])
  358. serverUrl = [serverUrl substringToIndex:[serverUrl length] - 1];
  359. /* */
  360. serverUrl = [CCUtility stringAppendServerUrl:[_activeUrl stringByAppendingString:webDAV] addFileName:serverUrl];
  361. NSString *directoryID = [CCCoreData addDirectory:serverUrl permissions:itemDto.permissions activeAccount:_metadataNet.account];
  362. [metadatas addObject:[CCUtility trasformedOCFileToCCMetadata:itemDto fileNamePrint:itemDto.fileName serverUrl:serverUrl directoryID:directoryID cameraFolderName:cameraFolderName cameraFolderPath:cameraFolderPath activeAccount:_metadataNet.account directoryUser:directoryUser]];
  363. }
  364. if ([self.delegate respondsToSelector:@selector(searchSuccess:metadatas:)])
  365. [self.delegate searchSuccess:_metadataNet metadatas:metadatas];
  366. [self complete];
  367. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *token, NSString *redirectedServer) {
  368. NSInteger errorCode = response.statusCode;
  369. if (errorCode == 0)
  370. errorCode = error.code;
  371. if ([self.delegate respondsToSelector:@selector(searchFailure:message:errorCode:)])
  372. [self.delegate searchFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  373. // Request trusted certificated
  374. if ([error code] == NSURLErrorServerCertificateUntrusted)
  375. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  376. [self complete];
  377. }];
  378. }
  379. #pragma --------------------------------------------------------------------------------------------
  380. #pragma mark ===== Setting Favorite =====
  381. #pragma --------------------------------------------------------------------------------------------
  382. - (void)settingFavorite
  383. {
  384. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  385. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  386. [communication setUserAgent:[CCUtility getUserAgent]];
  387. NSString *path = [_activeUrl stringByAppendingString:dav];
  388. [communication settingFavoriteServer:path andFileOrFolderPath:_metadataNet.fileName favorite:[_metadataNet.options boolValue] withUserSessionToken:nil onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer, NSString *token) {
  389. if ([self.delegate respondsToSelector:@selector(settingFavoriteSuccess:)])
  390. [self.delegate settingFavoriteSuccess:_metadataNet];
  391. [self complete];
  392. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *token, NSString *redirectedServer) {
  393. NSInteger errorCode = response.statusCode;
  394. if (errorCode == 0)
  395. errorCode = error.code;
  396. if ([self.delegate respondsToSelector:@selector(settingFavoriteFailure:message:errorCode:)])
  397. [self.delegate settingFavoriteFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  398. // Request trusted certificated
  399. if ([error code] == NSURLErrorServerCertificateUntrusted)
  400. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  401. [self complete];
  402. }];
  403. }
  404. #pragma --------------------------------------------------------------------------------------------
  405. #pragma mark ===== Listing Favorites =====
  406. #pragma --------------------------------------------------------------------------------------------
  407. - (void)listingFavorites
  408. {
  409. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  410. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  411. [communication setUserAgent:[CCUtility getUserAgent]];
  412. NSString *path = [_activeUrl stringByAppendingString:dav];
  413. NSString *folder = [_metadataNet.serverUrl stringByReplacingOccurrencesOfString:[CCUtility getHomeServerUrlActiveUrl:_activeUrl] withString:@""];
  414. [communication listingFavorites:path folder:folder withUserSessionToken:nil onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSArray *items, NSString *redirectedServer, NSString *token) {
  415. NSMutableArray *metadatas = [NSMutableArray new];
  416. NSString *cameraFolderName = [CCCoreData getCameraUploadFolderNameActiveAccount:_metadataNet.account];
  417. NSString *cameraFolderPath = [CCCoreData getCameraUploadFolderPathActiveAccount:_metadataNet.account activeUrl:_activeUrl];
  418. NSString *directoryUser = [CCUtility getDirectoryActiveUser:_activeUser activeUrl:_activeUrl];
  419. // Order by fileNamePath
  420. items = [items sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
  421. OCFileDto *record1 = obj1, *record2 = obj2;
  422. NSString *path1 = [[record1.filePath stringByAppendingString:record1.fileName] lowercaseString];
  423. NSString *path2 = [[record2.filePath stringByAppendingString:record2.fileName] lowercaseString];
  424. return [path1 compare:path2];
  425. }];
  426. for(OCFileDto *itemDto in items) {
  427. itemDto.fileName = [itemDto.fileName stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  428. itemDto.filePath = [itemDto.filePath stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  429. // Not in Crypto Cloud file
  430. NSString *fileName = itemDto.fileName;
  431. if (itemDto.isDirectory)
  432. fileName = [fileName substringToIndex:[fileName length] - 1];
  433. if ([CCUtility isFileCryptated:fileName])
  434. continue;
  435. // ----- BUG #942 ---------
  436. if ([itemDto.etag length] == 0) {
  437. #ifndef EXTENSION
  438. [app messageNotification:@"Server error" description:@"Metadata etag absent, record excluded, please fix" visible:YES delay:k_dismissAfterSecond type:TWMessageBarMessageTypeError];
  439. #endif
  440. continue;
  441. }
  442. // ------------------------
  443. NSString *serverUrl = [NSString stringWithFormat:@"%@/files/%@", dav, _activeUser];
  444. serverUrl = [itemDto.filePath stringByReplacingOccurrencesOfString:serverUrl withString:@""];
  445. /* TRIM */
  446. if ([serverUrl hasPrefix:@"/"])
  447. serverUrl = [serverUrl substringFromIndex:1];
  448. if ([serverUrl hasSuffix:@"/"])
  449. serverUrl = [serverUrl substringToIndex:[serverUrl length] - 1];
  450. /* */
  451. serverUrl = [CCUtility stringAppendServerUrl:[_activeUrl stringByAppendingString:webDAV] addFileName:serverUrl];
  452. NSString *directoryID = [CCCoreData addDirectory:serverUrl permissions:itemDto.permissions activeAccount:_metadataNet.account];
  453. [metadatas addObject:[CCUtility trasformedOCFileToCCMetadata:itemDto fileNamePrint:itemDto.fileName serverUrl:serverUrl directoryID:directoryID cameraFolderName:cameraFolderName cameraFolderPath:cameraFolderPath activeAccount:_metadataNet.account directoryUser:directoryUser]];
  454. }
  455. if ([self.delegate respondsToSelector:@selector(listingFavoritesSuccess:metadatas:)])
  456. [self.delegate listingFavoritesSuccess:_metadataNet metadatas:metadatas];
  457. [self complete];
  458. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *token, NSString *redirectedServer) {
  459. NSInteger errorCode = response.statusCode;
  460. if (errorCode == 0)
  461. errorCode = error.code;
  462. if ([self.delegate respondsToSelector:@selector(listingFavoritesFailure:message:errorCode:)])
  463. [self.delegate listingFavoritesFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  464. // Request trusted certificated
  465. if ([error code] == NSURLErrorServerCertificateUntrusted)
  466. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  467. [self complete];
  468. }];
  469. }
  470. #pragma --------------------------------------------------------------------------------------------
  471. #pragma mark ===== Create Folder =====
  472. #pragma --------------------------------------------------------------------------------------------
  473. - (void)createFolder
  474. {
  475. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  476. NSString *nameFolderURL = [NSString stringWithFormat:@"%@/%@", _metadataNet.serverUrl, _metadataNet.fileName];
  477. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  478. [communication setUserAgent:[CCUtility getUserAgent]];
  479. [communication createFolder:nameFolderURL onCommunication:communication withForbiddenCharactersSupported:_hasServerForbiddenCharactersSupport successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
  480. if ([self.delegate respondsToSelector:@selector(createFolderSuccess:)])
  481. [self.delegate createFolderSuccess:_metadataNet];
  482. [self complete];
  483. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  484. NSString *message;
  485. if (([_metadataNet.fileName isEqualToString:[CCCoreData getCameraUploadFolderNameActiveAccount:_metadataNet.account]] == YES && [_metadataNet.serverUrl isEqualToString:[CCCoreData getCameraUploadFolderPathActiveAccount:_metadataNet.account activeUrl:_activeUrl]] == YES))
  486. message = nil;
  487. else
  488. message = [CCError manageErrorOC:response.statusCode error:error];
  489. NSInteger errorCode = response.statusCode;
  490. if (errorCode == 0)
  491. errorCode = error.code;
  492. if ([self.delegate respondsToSelector:@selector(createFolderFailure:message:errorCode:)])
  493. [self.delegate createFolderFailure:_metadataNet message:message errorCode:errorCode];
  494. // Request trusted certificated
  495. if ([error code] == NSURLErrorServerCertificateUntrusted)
  496. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  497. [self complete];
  498. } errorBeforeRequest:^(NSError *error) {
  499. NSString *message;
  500. if (([_metadataNet.fileName isEqualToString:[CCCoreData getCameraUploadFolderNameActiveAccount:_metadataNet.account]] == YES && [_metadataNet.serverUrl isEqualToString:[CCCoreData getCameraUploadFolderPathActiveAccount:_metadataNet.account activeUrl:_activeUrl]] == YES))
  501. message = nil;
  502. else {
  503. if (error.code == OCErrorForbidenCharacters)
  504. message = NSLocalizedStringFromTable(@"_forbidden_characters_from_server_", @"Error", nil);
  505. else
  506. message = NSLocalizedStringFromTable(@"_unknow_response_server_", @"Error", nil);
  507. }
  508. if ([self.delegate respondsToSelector:@selector(createFolderFailure:message:errorCode:)])
  509. [self.delegate createFolderFailure:_metadataNet message:message errorCode:error.code];
  510. [self complete];
  511. }];
  512. }
  513. #pragma --------------------------------------------------------------------------------------------
  514. #pragma mark ===== Delete =====
  515. #pragma --------------------------------------------------------------------------------------------
  516. - (void)deleteFileOrFolder
  517. {
  518. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  519. NSString *serverFileUrl = [NSString stringWithFormat:@"%@/%@", _metadataNet.serverUrl, _metadataNet.fileName];
  520. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  521. [communication setUserAgent:[CCUtility getUserAgent]];
  522. [communication deleteFileOrFolder:serverFileUrl onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
  523. if ([_metadataNet.selector rangeOfString:selectorDelete].location != NSNotFound && [self.delegate respondsToSelector:@selector(deleteFileOrFolderSuccess:)])
  524. [self.delegate deleteFileOrFolderSuccess:_metadataNet];
  525. [self complete];
  526. } failureRquest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  527. NSInteger errorCode = response.statusCode;
  528. if (errorCode == 0)
  529. errorCode = error.code;
  530. if ([self.delegate respondsToSelector:@selector(deleteFileOrFolderFailure:message:errorCode:)])
  531. [self.delegate deleteFileOrFolderFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  532. // Request trusted certificated
  533. if ([error code] == NSURLErrorServerCertificateUntrusted)
  534. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  535. [self complete];
  536. }];
  537. }
  538. #pragma --------------------------------------------------------------------------------------------
  539. #pragma mark ===== Move =====
  540. #pragma --------------------------------------------------------------------------------------------
  541. - (void)moveFileOrFolder
  542. {
  543. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  544. NSString *origineURL = [NSString stringWithFormat:@"%@/%@", _metadataNet.serverUrl, _metadataNet.fileName];
  545. NSString *destinazioneURL = [NSString stringWithFormat:@"%@/%@", _metadataNet.serverUrlTo, _metadataNet.fileNameTo];
  546. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  547. [communication setUserAgent:[CCUtility getUserAgent]];
  548. [communication moveFileOrFolder:origineURL toDestiny:destinazioneURL onCommunication:communication withForbiddenCharactersSupported:_hasServerForbiddenCharactersSupport successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
  549. if ([_metadataNet.selector isEqualToString:selectorRename] && [self.delegate respondsToSelector:@selector(renameSuccess:)])
  550. [self.delegate renameSuccess:_metadataNet];
  551. if ([_metadataNet.selector rangeOfString:selectorMove].location != NSNotFound && [self.delegate respondsToSelector:@selector(moveSuccess:revTo:)])
  552. [self.delegate moveSuccess:_metadataNet revTo:nil];
  553. [self complete];
  554. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  555. NSInteger errorCode = response.statusCode;
  556. if (errorCode == 0)
  557. errorCode = error.code;
  558. if ([self.delegate respondsToSelector:@selector(renameMoveFileOrFolderFailure:message:errorCode:)])
  559. [self.delegate renameMoveFileOrFolderFailure:_metadataNet message:[CCError manageErrorOC:response.statusCode error:error] errorCode:errorCode];
  560. // Request trusted certificated
  561. if ([error code] == NSURLErrorServerCertificateUntrusted)
  562. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  563. [self complete];
  564. } errorBeforeRequest:^(NSError *error) {
  565. NSString *message;
  566. if (error.code == OCErrorMovingTheDestinyAndOriginAreTheSame) {
  567. message = NSLocalizedStringFromTable(@"_error_folder_destiny_is_the_same_", @"Error", nil);
  568. } else if (error.code == OCErrorMovingFolderInsideHimself) {
  569. message = NSLocalizedStringFromTable(@"_error_folder_destiny_is_the_same_", @"Error", nil);
  570. } else if (error.code == OCErrorMovingDestinyNameHaveForbiddenCharacters) {
  571. message = NSLocalizedStringFromTable(@"_forbidden_characters_from_server_", @"Error", nil);
  572. } else {
  573. message = NSLocalizedStringFromTable(@"_unknow_response_server_", @"Error", nil);
  574. }
  575. if ([self.delegate respondsToSelector:@selector(renameMoveFileOrFolderFailure:message:errorCode:)])
  576. [self.delegate renameMoveFileOrFolderFailure:_metadataNet message:message errorCode:error.code];
  577. [self complete];
  578. }];
  579. }
  580. #pragma --------------------------------------------------------------------------------------------
  581. #pragma mark ===== ReadFile =====
  582. #pragma --------------------------------------------------------------------------------------------
  583. - (void)readFile
  584. {
  585. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  586. NSString *fileName;
  587. if (_metadataNet.fileName)
  588. fileName = [NSString stringWithFormat:@"%@/%@", _metadataNet.serverUrl, _metadataNet.fileName];
  589. else
  590. fileName = _metadataNet.serverUrl;
  591. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  592. [communication setUserAgent:[CCUtility getUserAgent]];
  593. [communication readFile:fileName onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSArray *items, NSString *redirectedServer) {
  594. TableAccount *recordAccount = [CCCoreData getActiveAccount];
  595. if ([recordAccount.account isEqualToString:_metadataNet.account] && [items count] > 0) {
  596. CCMetadata *metadata = [[CCMetadata alloc] init];
  597. OCFileDto *itemDto = [items objectAtIndex:0];
  598. itemDto.fileName = _metadataNet.fileName;
  599. NSString *directoryID = [CCCoreData getDirectoryIDFromServerUrl:_metadataNet.serverUrl activeAccount:_metadataNet.account];
  600. NSString *cameraFolderName = [CCCoreData getCameraUploadFolderNameActiveAccount:_metadataNet.account];
  601. NSString *cameraFolderPath = [CCCoreData getCameraUploadFolderPathActiveAccount:_metadataNet.account activeUrl:_activeUrl];
  602. NSString *directoryUser = [CCUtility getDirectoryActiveUser:_activeUser activeUrl:_activeUrl];
  603. metadata = [CCUtility trasformedOCFileToCCMetadata:itemDto fileNamePrint:_metadataNet.fileNamePrint serverUrl:_metadataNet.serverUrl directoryID:directoryID cameraFolderName:cameraFolderName cameraFolderPath:cameraFolderPath activeAccount:_metadataNet.account directoryUser:directoryUser];
  604. if([self.delegate respondsToSelector:@selector(readFileSuccess:metadata:)])
  605. [self.delegate readFileSuccess:_metadataNet metadata:metadata];
  606. }
  607. // BUG 1038
  608. if ([items count] == 0) {
  609. #ifndef EXTENSION
  610. [app messageNotification:@"Server error" description:@"Read File WebDAV : [items NULL] please fix" visible:YES delay:k_dismissAfterSecond type:TWMessageBarMessageTypeError];
  611. #endif
  612. }
  613. [self complete];
  614. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  615. TableAccount *recordAccount = [CCCoreData getActiveAccount];
  616. _metadataNet.errorRetry++;
  617. NSInteger errorCode = response.statusCode;
  618. if (errorCode == 0)
  619. errorCode = error.code;
  620. if([self.delegate respondsToSelector:@selector(readFileFailure:message:errorCode:)] && [recordAccount.account isEqualToString:_metadataNet.account])
  621. [self.delegate readFileFailure:_metadataNet message:[CCError manageErrorOC:response.statusCode error:error] errorCode:errorCode];
  622. // Request trusted certificated
  623. if ([error code] == NSURLErrorServerCertificateUntrusted)
  624. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  625. [self complete];
  626. }];
  627. }
  628. - (NSError *)readFileSync:(NSString *)filePathName
  629. {
  630. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  631. __block NSError *returnError;
  632. dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
  633. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  634. [communication setUserAgent:[CCUtility getUserAgent]];
  635. [communication readFile:filePathName onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSArray *items, NSString *redirectedServer) {
  636. returnError = nil;
  637. dispatch_semaphore_signal(semaphore);
  638. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  639. // Request trusted certificated
  640. if ([error code] == NSURLErrorServerCertificateUntrusted)
  641. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  642. returnError = error;
  643. dispatch_semaphore_signal(semaphore);
  644. }];
  645. while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW))
  646. [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:k_timeout_webdav]];
  647. return returnError;
  648. }
  649. #pragma --------------------------------------------------------------------------------------------
  650. #pragma mark ===== Shared =====
  651. #pragma --------------------------------------------------------------------------------------------
  652. - (NSMutableDictionary *)getShareID
  653. {
  654. #ifndef EXTENSION
  655. return app.sharesID;
  656. #endif
  657. return [NSMutableDictionary new];
  658. }
  659. - (void)readShareServer
  660. {
  661. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  662. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  663. [communication setUserAgent:[CCUtility getUserAgent]];
  664. [communication readSharedByServer:[_activeUrl stringByAppendingString:@"/"] onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSArray *items, NSString *redirectedServer) {
  665. BOOL openWindow = NO;
  666. [[self getShareID] removeAllObjects];
  667. TableAccount *recordAccount = [CCCoreData getActiveAccount];
  668. if ([recordAccount.account isEqualToString:_metadataNet.account]) {
  669. for (OCSharedDto *item in items)
  670. [[self getShareID] setObject:item forKey:[@(item.idRemoteShared) stringValue]];
  671. if ([_metadataNet.selector isEqual:selectorOpenWindowShare]) openWindow = YES;
  672. if ([_metadataNet.action isEqual:actionUpdateShare]) openWindow = YES;
  673. if ([_metadataNet.action isEqual:actionShare]) openWindow = YES;
  674. if ([_metadataNet.action isEqual:actionShareWith]) openWindow = YES;
  675. }
  676. if([self.delegate respondsToSelector:@selector(readSharedSuccess:items:openWindow:)])
  677. [self.delegate readSharedSuccess:_metadataNet items:[self getShareID] openWindow:openWindow];
  678. [self complete];
  679. } failureRequest :^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  680. NSInteger errorCode = response.statusCode;
  681. if (errorCode == 0)
  682. errorCode = error.code;
  683. if([self.delegate respondsToSelector:@selector(shareFailure:message:errorCode:)])
  684. [self.delegate shareFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  685. // Request trusted certificated
  686. if ([error code] == NSURLErrorServerCertificateUntrusted)
  687. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  688. [self complete];
  689. }];
  690. }
  691. - (void)share
  692. {
  693. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  694. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  695. [communication setUserAgent:[CCUtility getUserAgent]];
  696. [communication shareFileOrFolderByServer:[_activeUrl stringByAppendingString:@"/"] andFileOrFolderPath:[_metadataNet.fileName encodeString:NSUTF8StringEncoding] andPassword:[_metadataNet.password encodeString:NSUTF8StringEncoding] onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *token, NSString *redirectedServer) {
  697. [self readShareServer];
  698. } failureRequest :^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  699. NSInteger errorCode = response.statusCode;
  700. if (errorCode == 0)
  701. errorCode = error.code;
  702. if([self.delegate respondsToSelector:@selector(shareFailure:message:errorCode:)])
  703. [self.delegate shareFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  704. // Request trusted certificated
  705. if ([error code] == NSURLErrorServerCertificateUntrusted)
  706. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  707. [self complete];
  708. }];
  709. }
  710. // * @param shareeType -> NSInteger: to set the type of sharee (user/group/federated)
  711. - (void)shareWith
  712. {
  713. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  714. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  715. [communication setUserAgent:[CCUtility getUserAgent]];
  716. [communication shareWith:_metadataNet.share shareeType:_metadataNet.shareeType inServer:[_activeUrl stringByAppendingString:@"/"] andFileOrFolderPath:[_metadataNet.fileName encodeString:NSUTF8StringEncoding] andPermissions:_metadataNet.sharePermission onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
  717. [self readShareServer];
  718. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  719. NSInteger errorCode = response.statusCode;
  720. if (errorCode == 0)
  721. errorCode = error.code;
  722. if([self.delegate respondsToSelector:@selector(shareFailure:message:errorCode:)])
  723. [self.delegate shareFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  724. // Request trusted certificated
  725. if ([error code] == NSURLErrorServerCertificateUntrusted)
  726. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  727. [self complete];
  728. }];
  729. }
  730. - (void)updateShare
  731. {
  732. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  733. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  734. [communication setUserAgent:[CCUtility getUserAgent]];
  735. [communication updateShare:[_metadataNet.share intValue] ofServerPath:[_activeUrl stringByAppendingString:@"/"] withPasswordProtect:[_metadataNet.password encodeString:NSUTF8StringEncoding] andExpirationTime:_metadataNet.expirationTime andPermissions:_metadataNet.sharePermission onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
  736. [self readShareServer];
  737. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  738. #ifndef EXTENSION
  739. [app messageNotification:@"_error_" description:[CCError manageErrorOC:response.statusCode error:error] visible:YES delay:k_dismissAfterSecond type:TWMessageBarMessageTypeError];
  740. #endif
  741. NSInteger errorCode = response.statusCode;
  742. if (errorCode == 0)
  743. errorCode = error.code;
  744. if([self.delegate respondsToSelector:@selector(shareFailure:message:errorCode:)])
  745. [self.delegate shareFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  746. // Request trusted certificated
  747. if ([error code] == NSURLErrorServerCertificateUntrusted)
  748. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  749. [self complete];
  750. }];
  751. }
  752. - (void)unShare
  753. {
  754. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  755. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  756. [communication setUserAgent:[CCUtility getUserAgent]];
  757. [communication unShareFileOrFolderByServer:[_activeUrl stringByAppendingString:@"/"] andIdRemoteShared:[_metadataNet.share intValue] onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
  758. if([self.delegate respondsToSelector:@selector(unShareSuccess:)])
  759. [self.delegate unShareSuccess:_metadataNet];
  760. [self complete];
  761. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  762. #ifndef EXTENSION
  763. [app messageNotification:@"_error_" description:[CCError manageErrorOC:response.statusCode error:error] visible:YES delay:k_dismissAfterSecond type:TWMessageBarMessageTypeError];
  764. #endif
  765. NSInteger errorCode = response.statusCode;
  766. if (errorCode == 0)
  767. errorCode = error.code;
  768. if([self.delegate respondsToSelector:@selector(shareFailure:message:errorCode:)])
  769. [self.delegate shareFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  770. // Request trusted certificated
  771. if ([error code] == NSURLErrorServerCertificateUntrusted)
  772. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  773. [self complete];
  774. }];
  775. }
  776. - (void)getUserAndGroup
  777. {
  778. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  779. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  780. [communication setUserAgent:[CCUtility getUserAgent]];
  781. [communication searchUsersAndGroupsWith:_metadataNet.options forPage:1 with:50 ofServer:[_activeUrl stringByAppendingString:@"/"] onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSArray *itemList, NSString *redirectedServer) {
  782. if([self.delegate respondsToSelector:@selector(getUserAndGroupSuccess:items:)])
  783. [self.delegate getUserAndGroupSuccess:_metadataNet items:itemList];
  784. [self complete];
  785. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  786. NSInteger errorCode = response.statusCode;
  787. if (errorCode == 0)
  788. errorCode = error.code;
  789. if([self.delegate respondsToSelector:@selector(getUserAndGroupFailure:message:errorCode:)])
  790. [self.delegate getUserAndGroupFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  791. // Request trusted certificated
  792. if ([error code] == NSURLErrorServerCertificateUntrusted)
  793. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  794. [self complete];
  795. }];
  796. }
  797. #pragma --------------------------------------------------------------------------------------------
  798. #pragma mark ===== Activity =====
  799. #pragma --------------------------------------------------------------------------------------------
  800. - (void)getActivityServer
  801. {
  802. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  803. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  804. [communication setUserAgent:[CCUtility getUserAgent]];
  805. [communication getActivityServer:[_activeUrl stringByAppendingString:@"/"] onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSArray *listOfActivity, NSString *redirectedServer) {
  806. if ([self.delegate respondsToSelector:@selector(getActivityServerSuccess:)])
  807. [self.delegate getActivityServerSuccess:listOfActivity];
  808. [self complete];
  809. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  810. NSInteger errorCode = response.statusCode;
  811. if (errorCode == 0)
  812. errorCode = error.code;
  813. if([self.delegate respondsToSelector:@selector(getActivityServerFailure:message:errorCode:)])
  814. [self.delegate getActivityServerFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  815. // Request trusted certificated
  816. if ([error code] == NSURLErrorServerCertificateUntrusted)
  817. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  818. [self complete];
  819. }];
  820. }
  821. #pragma --------------------------------------------------------------------------------------------
  822. #pragma mark ===== Notification =====
  823. #pragma --------------------------------------------------------------------------------------------
  824. - (void)getNotificationServer
  825. {
  826. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  827. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  828. [communication setUserAgent:[CCUtility getUserAgent]];
  829. [communication getNotificationServer:[_activeUrl stringByAppendingString:@"/"] onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSArray *listOfNotifications, NSString *redirectedServer) {
  830. if ([self.delegate respondsToSelector:@selector(getNotificationServerSuccess:)])
  831. [self.delegate getNotificationServerSuccess:listOfNotifications];
  832. [self complete];
  833. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  834. NSInteger errorCode = response.statusCode;
  835. if (errorCode == 0)
  836. errorCode = error.code;
  837. if([self.delegate respondsToSelector:@selector(getNotificationServerFailure:message:errorCode:)])
  838. [self.delegate getNotificationServerFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  839. // Request trusted certificated
  840. if ([error code] == NSURLErrorServerCertificateUntrusted)
  841. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  842. [self complete];
  843. }];
  844. }
  845. - (void)setNotificationServer
  846. {
  847. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  848. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  849. [communication setUserAgent:[CCUtility getUserAgent]];
  850. NSString *type = _metadataNet.options;
  851. [communication setNotificationServer:_metadataNet.serverUrl type:type onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
  852. if ([self.delegate respondsToSelector:@selector(setNotificationServerSuccess:)])
  853. [self.delegate setNotificationServerSuccess:_metadataNet];
  854. [self complete];
  855. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  856. NSInteger errorCode = response.statusCode;
  857. if (errorCode == 0)
  858. errorCode = error.code;
  859. if([self.delegate respondsToSelector:@selector(setNotificationServerFailure:message:errorCode:)])
  860. [self.delegate setNotificationServerFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  861. // Request trusted certificated
  862. if ([error code] == NSURLErrorServerCertificateUntrusted)
  863. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  864. [self complete];
  865. }];
  866. }
  867. - (void)subscribingNextcloudServer
  868. {
  869. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  870. communication.kindOfCredential = credentialNotSet;
  871. [communication setUserAgent:[CCUtility getUserAgent]];
  872. NSDictionary *parameter = _metadataNet.options;
  873. NSString *pushToken = [parameter objectForKey:@"pushToken"];
  874. NSString *pushTokenHash = [parameter objectForKey:@"pushTokenHash"];
  875. NSString *devicePublicKey = [parameter objectForKey:@"devicePublicKey"];
  876. // encode URL
  877. devicePublicKey = [CCUtility URLEncodeStringFromString:devicePublicKey];
  878. [communication subscribingNextcloudServerPush:_activeUrl pushTokenHash:pushTokenHash devicePublicKey:devicePublicKey onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *publicKey, NSString *deviceIdentifier, NSString *signature, NSString *redirectedServer) {
  879. // encode URL
  880. deviceIdentifier = [CCUtility URLEncodeStringFromString:deviceIdentifier];
  881. signature = [CCUtility URLEncodeStringFromString:signature];
  882. [communication subscribingPushProxy:k_pushNotificationServer pushToken:pushToken deviceIdentifier:deviceIdentifier deviceIdentifierSignature:signature userPublicKey:devicePublicKey onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *publicKey, NSString *deviceIdentifier, NSString *signature, NSString *redirectedServer) {
  883. NSLog(@"Service registered.");
  884. [self complete];
  885. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  886. #if !defined(EXTENSION) && defined(DEBUG)
  887. [app messageNotification:@"Subscribing Server Proxy Push Error" description:[error.userInfo valueForKey:@"NSLocalizedDescription"] visible:YES delay:k_dismissAfterSecond type:TWMessageBarMessageTypeError];
  888. #endif
  889. NSInteger errorCode = response.statusCode;
  890. if (errorCode == 0)
  891. errorCode = error.code;
  892. // Request trusted certificated
  893. if ([error code] == NSURLErrorServerCertificateUntrusted)
  894. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  895. [self complete];
  896. }];
  897. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  898. #if !defined(EXTENSION) && defined(DEBUG)
  899. [app messageNotification:@"Subscribing Server Push Error" description:[error.userInfo valueForKey:@"NSLocalizedDescription"] visible:YES delay:k_dismissAfterSecond type:TWMessageBarMessageTypeError];
  900. #endif
  901. NSInteger errorCode = response.statusCode;
  902. if (errorCode == 0)
  903. errorCode = error.code;
  904. // Request trusted certificated
  905. if ([error code] == NSURLErrorServerCertificateUntrusted)
  906. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  907. [self complete];
  908. }];
  909. }
  910. #pragma --------------------------------------------------------------------------------------------
  911. #pragma mark ===== User Profile =====
  912. #pragma --------------------------------------------------------------------------------------------
  913. - (void)getUserProfile
  914. {
  915. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  916. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  917. [communication setUserAgent:[CCUtility getUserAgent]];
  918. [communication getUserProfileServer:[_activeUrl stringByAppendingString:@"/"] onCommunication:communication successRequest:^(NSHTTPURLResponse *response, OCUserProfile *userProfile, NSString *redirectedServer) {
  919. if ([self.delegate respondsToSelector:@selector(getUserProfileSuccess:userProfile:)])
  920. [self.delegate getUserProfileSuccess:_metadataNet userProfile:userProfile];
  921. [self complete];
  922. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  923. NSInteger errorCode = response.statusCode;
  924. if (errorCode == 0)
  925. errorCode = error.code;
  926. if([self.delegate respondsToSelector:@selector(getUserProfileFailure:message:errorCode:)])
  927. [self.delegate getUserProfileFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  928. // Request trusted certificated
  929. if ([error code] == NSURLErrorServerCertificateUntrusted)
  930. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  931. [self complete];
  932. }];
  933. }
  934. #pragma --------------------------------------------------------------------------------------------
  935. #pragma mark ===== Server =====
  936. #pragma --------------------------------------------------------------------------------------------
  937. - (NSError *)checkServerSync:(NSString *)serverUrl
  938. {
  939. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  940. __block NSError *returnError;
  941. dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
  942. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  943. [communication setUserAgent:[CCUtility getUserAgent]];
  944. [communication checkServer:serverUrl onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
  945. returnError = nil;
  946. dispatch_semaphore_signal(semaphore);
  947. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  948. // Request trusted certificated
  949. if ([error code] == NSURLErrorServerCertificateUntrusted)
  950. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  951. returnError = error;
  952. dispatch_semaphore_signal(semaphore);
  953. }];
  954. while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW))
  955. [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:k_timeout_webdav]];
  956. return returnError;
  957. }
  958. - (void)getFeaturesSupportedByServer
  959. {
  960. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  961. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  962. [communication setUserAgent:[CCUtility getUserAgent]];
  963. [communication getFeaturesSupportedByServer:[_activeUrl stringByAppendingString:@"/"] onCommunication:communication successRequest:^(NSHTTPURLResponse *response, BOOL hasShareSupport, BOOL hasShareeSupport, BOOL hasCookiesSupport, BOOL hasForbiddenCharactersSupport, BOOL hasCapabilitiesSupport, BOOL hasFedSharesOptionShareSupport, NSString *redirectedServer) {
  964. TableAccount *recordAccount = [CCCoreData getActiveAccount];
  965. if ([self.delegate respondsToSelector:@selector(getFeaturesSupportedByServerSuccess:hasForbiddenCharactersSupport:hasShareSupport:hasShareeSupport:)] && [recordAccount.account isEqualToString:_metadataNet.account])
  966. [self.delegate getFeaturesSupportedByServerSuccess:hasCapabilitiesSupport hasForbiddenCharactersSupport:hasForbiddenCharactersSupport hasShareSupport:hasShareSupport hasShareeSupport:hasShareeSupport];
  967. [self complete];
  968. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  969. NSInteger errorCode = response.statusCode;
  970. if (errorCode == 0)
  971. errorCode = error.code;
  972. if([self.delegate respondsToSelector:@selector(getInfoServerFailure:message:errorCode:)])
  973. [self.delegate getInfoServerFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  974. // Request trusted certificated
  975. if ([error code] == NSURLErrorServerCertificateUntrusted)
  976. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  977. [self complete];
  978. }];
  979. }
  980. - (void)getCapabilitiesOfServer
  981. {
  982. OCCommunication *communication = [CCNetworking sharedNetworking].sharedOCCommunication;
  983. [communication setCredentialsWithUser:_activeUser andPassword:_activePassword];
  984. [communication setUserAgent:[CCUtility getUserAgent]];
  985. [communication getCapabilitiesOfServer:[_activeUrl stringByAppendingString:@"/"] onCommunication:communication successRequest:^(NSHTTPURLResponse *response, OCCapabilities *capabilities, NSString *redirectedServer) {
  986. TableAccount *recordAccount = [CCCoreData getActiveAccount];
  987. if ([self.delegate respondsToSelector:@selector(getCapabilitiesOfServerSuccess:)] && [recordAccount.account isEqualToString:_metadataNet.account])
  988. [self.delegate getCapabilitiesOfServerSuccess:capabilities];
  989. [self complete];
  990. } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
  991. NSInteger errorCode = response.statusCode;
  992. if (errorCode == 0)
  993. errorCode = error.code;
  994. if([self.delegate respondsToSelector:@selector(getInfoServerFailure:message:errorCode:)])
  995. [self.delegate getInfoServerFailure:_metadataNet message:[error.userInfo valueForKey:@"NSLocalizedDescription"] errorCode:errorCode];
  996. // Request trusted certificated
  997. if ([error code] == NSURLErrorServerCertificateUntrusted)
  998. [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:(UIViewController *)self.delegate delegate:self];
  999. [self complete];
  1000. }];
  1001. }
  1002. @end
  1003. #pragma --------------------------------------------------------------------------------------------
  1004. #pragma mark ===== OCURLSessionManager =====
  1005. #pragma --------------------------------------------------------------------------------------------
  1006. @implementation OCURLSessionManager
  1007. - (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
  1008. {
  1009. // The pinnning check
  1010. if ([[CCCertificate sharedManager] checkTrustedChallenge:challenge]) {
  1011. completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]);
  1012. } else {
  1013. completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil);
  1014. }
  1015. }
  1016. @end