Changeset 1152

Show
Ignore:
Timestamp:
02/19/2010 09:07:54 PM (2 years ago)
Author:
gbooker
Message:

Added ability to create the frameworks directory and correct its permissions if they are broken.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • branches/PlayerFramework/CommonMediaPlayer/Classes/CMPPlayerManager.h

    r1148 r1152  
    2020 */ 
    2121 
     22#import <Security/Security.h> 
    2223#import "CMPTypesDefines.h" 
    2324 
     
    6869} 
    6970 
     71static BOOL createDirectoryTree(NSFileManager *fm, NSString *directory) 
     72{ 
     73        BOOL isDir; 
     74        if([fm fileExistsAtPath:directory isDirectory:&isDir] && isDir) 
     75                return YES; 
     76        if(!createDirectoryTree(fm, [directory stringByDeletingLastPathComponent])) 
     77           return NO; 
     78        return [fm createDirectoryAtPath:directory attributes:nil]; 
     79} 
     80 
    7081static inline BOOL loadCMPFramework(NSString *frapPath) 
    7182{ 
     
    7788        { 
    7889                NSFileManager *fm = [NSFileManager defaultManager]; 
    79                 FrameworkLoadPrint(@"Going to copy %@", [frapPath stringByAppendingPathComponent:@"Contents/Frameworks/CommonMediaPlayer.framework"]); 
     90                NSString *frameworkInFrap = [frapPath stringByAppendingPathComponent:@"Contents/Frameworks/CommonMediaPlayer.framework"]; 
     91                FrameworkLoadPrint(@"Going to copy %@", frameworkInFrap); 
    8092                BOOL success = [fm removeFileAtPath:frameworkPath handler:nil]; 
    8193                FrameworkLoadPrint(@"Delete success is %d", success); 
    82                 success = [fm copyPath:[frapPath stringByAppendingPathComponent:@"Contents/Frameworks/CommonMediaPlayer.framework"] toPath:frameworkPath handler:nil]; 
     94                success = YES; 
     95                NSString *frameworksDir = [frameworkPath stringByDeletingLastPathComponent]; 
     96                BOOL isDir; 
     97                if([fm fileExistsAtPath:frameworksDir isDirectory:&isDir] && isDir) 
     98                { 
     99                        //Check permissions 
     100                        NSDictionary *attributes = [fm fileAttributesAtPath:frameworksDir traverseLink:YES]; 
     101                        if([[attributes objectForKey:NSFileOwnerAccountID] intValue] == 0) 
     102                        { 
     103                                //Owned by root 
     104                                AuthorizationItem authItems[2] = { 
     105                                        {kAuthorizationEnvironmentUsername, strlen("frontrow"), "frontrow", 0}, 
     106                                        {kAuthorizationEnvironmentPassword, strlen("frontrow"), "frontrow", 0}, 
     107                                }; 
     108                                AuthorizationEnvironment environ = {2, authItems}; 
     109                                AuthorizationItem rightSet[] = {{kAuthorizationRightExecute, 0, NULL, 0}}; 
     110                                AuthorizationRights rights = {1, rightSet}; 
     111                                AuthorizationRef auth; 
     112                                OSStatus result = AuthorizationCreate(&rights, &environ, kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights, &auth); 
     113                                if(result == errAuthorizationSuccess) 
     114                                { 
     115                                        char *command = "chown frontrow \"$FWDIR\""; 
     116                                        setenv("FWDIR", [frameworksDir fileSystemRepresentation], 1); 
     117                                        char *arguments[] = {"-c", command, NULL}; 
     118                                        result = AuthorizationExecuteWithPrivileges(auth, "/bin/sh", kAuthorizationFlagDefaults, arguments, NULL); 
     119                                        unsetenv("FWDIR"); 
     120                                } 
     121                                if(result != errAuthorizationSuccess) 
     122                                { 
     123                                        success = NO; 
     124                                        FrameworkLoadPrint(@"Failed to correct permissions on Frameworks directory"); 
     125                                } 
     126                                AuthorizationFree(auth, kAuthorizationFlagDefaults); 
     127                                int status; 
     128                                wait(&status); 
     129                        } 
     130                } 
     131                else 
     132                        success = createDirectoryTree(fm, frameworksDir); 
     133                FrameworkLoadPrint(@"Creation of dir is %d", success); 
     134                success = [fm copyPath:frameworkInFrap toPath:frameworkPath handler:nil]; 
    83135                FrameworkLoadPrint(@"Copy success is %d", success); 
    84136                if(!success || needCopy(frameworkPath))