OCNetworking.m 71 KB

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