// // Configure.m // OverSight // // Created by Patrick Wardle on 9/01/16. // Copyright (c) 2016 Objective-See. All rights reserved. // #import #import "Consts.h" #import "Logging.h" #import "Utilities.h" #import "Configure.h" @implementation Configure //invokes appropriate install || uninstall logic -(BOOL)configure:(NSUInteger)parameter { //return var BOOL wasConfigured = NO; //install extension if(ACTION_INSTALL_FLAG == parameter) { //dbg msg logMsg(LOG_DEBUG, @"installing..."); //if already installed though // ->uninstall everything first if(YES == [self isInstalled]) { //dbg msg logMsg(LOG_DEBUG, @"already installed, so uninstalling..."); //uninstall if(YES != [self uninstall]) { //bail goto bail; } //dbg msg logMsg(LOG_DEBUG, @"uninstalled"); } //install if(YES != [self install]) { //bail goto bail; } //dbg msg logMsg(LOG_DEBUG, @"installed!"); } //uninstall extension else if(ACTION_UNINSTALL_FLAG == parameter) { //dbg msg logMsg(LOG_DEBUG, @"uninstalling..."); //uninstall if(YES != [self uninstall]) { //bail goto bail; } //dbg msg logMsg(LOG_DEBUG, @"uninstalled!"); } //no errors wasConfigured = YES; //bail bail: return wasConfigured; } //determine if installed // ->simply checks if extension binary exists -(BOOL)isInstalled { //check if extension exists return [[NSFileManager defaultManager] fileExistsAtPath:[[EXTENSION_FOLDER stringByExpandingTildeInPath] stringByAppendingPathComponent:EXTENSION_NAME]]; } //install // a) create and copy extension to ~/Library/WhatsYourSign // b) add extension: 'pluginkit -a /path/2/WhatsYourSign.appex' // c) enable extension: 'pluginkit -e use -i com.objective-see.WhatsYourSignExt.FinderSync' -(BOOL)install { //return/status var BOOL wasInstalled = NO; //error NSError* error = nil; //path to finder sync (src) NSString* extensionPathSrc = nil; //path to finder sync (dest) NSString* extensionPathDest = nil; //results from 'pluginkit' cmd NSData* results = nil; //set src path // ->orginally stored in installer app's /Resource bundle extensionPathSrc = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:EXTENSION_NAME]; //set dest path extensionPathDest = [[EXTENSION_FOLDER stringByExpandingTildeInPath] stringByAppendingPathComponent:EXTENSION_NAME]; //check if extension folder needs to be created if(YES != [[NSFileManager defaultManager] fileExistsAtPath:[EXTENSION_FOLDER stringByExpandingTildeInPath]]) { //create it if(YES != [[NSFileManager defaultManager] createDirectoryAtPath:[EXTENSION_FOLDER stringByExpandingTildeInPath] withIntermediateDirectories:YES attributes:nil error:&error]) { //err msg logMsg(LOG_ERR, [NSString stringWithFormat:@"failed to create extension's directory %@ (%@)", EXTENSION_FOLDER, error]); //bail goto bail; } } //move extension into persistent location // ->'/Library/WhatsYourSign/' + extension name if(YES != [[NSFileManager defaultManager] copyItemAtPath:extensionPathSrc toPath:extensionPathDest error:&error]) { //err msg logMsg(LOG_ERR, [NSString stringWithFormat:@"failed to copy %@ -> %@ (%@)", extensionPathSrc, extensionPathDest, error]); //bail goto bail; } //dbg msg logMsg(LOG_DEBUG, [NSString stringWithFormat:@"copied %@ -> %@", extensionPathSrc, extensionPathDest]); //install extension via 'pluginkit -a results = execTask(PLUGIN_KIT, @[@"-a", extensionPathDest]); if(0 != results.length) { //err msg logMsg(LOG_ERR, [NSString stringWithFormat:@"pluginkit failed to install extension (%@)", [[NSString alloc] initWithData:results encoding:NSUTF8StringEncoding]]); //bail goto bail; } //nap // ->VM sometimes didn't enable [NSThread sleepForTimeInterval:0.5]; //enable extension via 'pluginkit -e use -i results = execTask(PLUGIN_KIT, @[@"-e", @"use", @"-i", EXTENSION_BUNDLE_ID]); if(0 != results.length) { //err msg logMsg(LOG_ERR, [NSString stringWithFormat:@"pluginkit failed to enable extension (%@)", [[NSString alloc] initWithData:results encoding:NSUTF8StringEncoding]]); //bail goto bail; } //no error wasInstalled = YES; //bail bail: return wasInstalled; } //uninstall // a) remove it (pluginkit -r ) // b) delete binary & folder; /Library/WhatsYourSign -(BOOL)uninstall { //return/status var BOOL wasUninstalled = NO; //status var // ->since want to try all uninstall steps, but record if any fail BOOL bAnyErrors = NO; //path to finder sync NSString* extensionPath = nil; //error NSError* error = nil; //init path extensionPath = [[EXTENSION_FOLDER stringByExpandingTildeInPath] stringByAppendingPathComponent:EXTENSION_NAME]; //this always seem to 'fail' with 'remove: no plugin at ' // ->but yet works, so just ignore any return from this invocation of execTask() execTask(PLUGIN_KIT, @[@"-r", extensionPath]); //delete folder if(YES != [[NSFileManager defaultManager] removeItemAtPath:[EXTENSION_FOLDER stringByExpandingTildeInPath] error:&error]) { //err msg logMsg(LOG_ERR, [NSString stringWithFormat:@"failed to delete extension directory %@ (%@)", EXTENSION_FOLDER, error]); //set flag bAnyErrors = YES; //keep uninstalling... } //only success when there were no errors if(YES != bAnyErrors) { //happy wasUninstalled = YES; } return wasUninstalled; } @end