diff options
author | Damiano Galassi <[email protected]> | 2017-01-25 11:03:00 +0100 |
---|---|---|
committer | Damiano Galassi <[email protected]> | 2017-01-25 11:03:00 +0100 |
commit | 178071e0ce842af53e8c51e6275e8956fc4aa27c (patch) | |
tree | 6337430f7ec1900ce562bf394954469cc68b80d2 /macosx | |
parent | 79c33c0ca996311224bbd3719c85238a3358cb5e (diff) |
MacGui: improve management of security scoped resources. Fix external SRT in the sandboxed build.
Diffstat (limited to 'macosx')
-rw-r--r-- | macosx/HBAudio.m | 2 | ||||
-rw-r--r-- | macosx/HBCodingUtilities.h | 3 | ||||
-rw-r--r-- | macosx/HBCore.m | 14 | ||||
-rw-r--r-- | macosx/HBJob+Private.h | 6 | ||||
-rw-r--r-- | macosx/HBJob.h | 8 | ||||
-rw-r--r-- | macosx/HBJob.m | 97 | ||||
-rw-r--r-- | macosx/HBSecurityAccessToken.h | 35 | ||||
-rw-r--r-- | macosx/HBSecurityAccessToken.m | 42 | ||||
-rw-r--r-- | macosx/HBSubtitles.m | 87 | ||||
-rw-r--r-- | macosx/HBSubtitlesTrack.m | 1 | ||||
-rw-r--r-- | macosx/HBUtilities.h | 1 | ||||
-rw-r--r-- | macosx/HBUtilities.m | 9 | ||||
-rw-r--r-- | macosx/HandBrake.xcodeproj/project.pbxproj | 8 |
13 files changed, 219 insertions, 94 deletions
diff --git a/macosx/HBAudio.m b/macosx/HBAudio.m index be7df2465..410749427 100644 --- a/macosx/HBAudio.m +++ b/macosx/HBAudio.m @@ -7,7 +7,7 @@ #import "HBAudio.h" #import "HBJob.h" -#import "HBJob+HBJobConversion.m" +#import "HBJob+HBJobConversion.h" #import "HBTitle.h" #import "HBAudioTrack.h" #import "HBAudioTrackPreset.h" diff --git a/macosx/HBCodingUtilities.h b/macosx/HBCodingUtilities.h index 17d188b7f..cc92f9b6e 100644 --- a/macosx/HBCodingUtilities.h +++ b/macosx/HBCodingUtilities.h @@ -23,6 +23,9 @@ #define decodeCollectionOfObjects2(x, cl, objectcl, objectcl2) x = [HBCodingUtilities decodeObjectOfClasses:[NSSet setWithObjects:[cl class], [objectcl class], [objectcl2 class], nil] forKey:OBJC_STRINGIFY(x) decoder:decoder]; +#define decodeCollectionOfObjects3(x, cl, objectcl, objectcl2, objectcl3) x = [HBCodingUtilities decodeObjectOfClasses:[NSSet setWithObjects:[cl class], [objectcl class], [objectcl2 class], [objectcl3 class], nil] forKey:OBJC_STRINGIFY(x) decoder:decoder]; + + #define decodeObjectOrFail(x, class) x = [HBCodingUtilities decodeObjectOfClass:class forKey:OBJC_STRINGIFY(x) decoder:decoder]; if (x == nil) {NSLog(@"Failed to decode: %@", OBJC_STRINGIFY(x)); goto fail;} NS_ASSUME_NONNULL_BEGIN diff --git a/macosx/HBCore.m b/macosx/HBCore.m index dbce136f6..7e9024b47 100644 --- a/macosx/HBCore.m +++ b/macosx/HBCore.m @@ -12,6 +12,7 @@ #import "HBStateFormatter+Private.h" #import "HBTitle+Private.h" +#import "HBJob+Private.h" #include <dlfcn.h> @@ -243,13 +244,8 @@ typedef void (^HBCoreCleanupHandler)(); NSAssert(url, @"[HBCore scanURL:] called with nil url."); #ifdef __SANDBOX_ENABLED__ - BOOL accessingSecurityScopedResource = [url startAccessingSecurityScopedResource]; - self.cleanupHandler = ^{ - if (accessingSecurityScopedResource) - { - [url stopAccessingSecurityScopedResource]; - } - }; + __block HBSecurityAccessToken *token = [HBSecurityAccessToken tokenWithObject:url]; + self.cleanupHandler = ^{ token = nil; }; #endif // Reset the titles array @@ -509,8 +505,8 @@ typedef void (^HBCoreCleanupHandler)(); #ifdef __SANDBOX_ENABLED__ HBJob *jobCopy = [job copy]; - [jobCopy startAccessingSecurityScopedResource]; - self.cleanupHandler = ^{ [jobCopy stopAccessingSecurityScopedResource]; }; + __block HBSecurityAccessToken *token = [HBSecurityAccessToken tokenWithObject:jobCopy]; + self.cleanupHandler = ^{ token = nil; }; #endif // Add the job to libhb diff --git a/macosx/HBJob+Private.h b/macosx/HBJob+Private.h index 2479516e6..839267253 100644 --- a/macosx/HBJob+Private.h +++ b/macosx/HBJob+Private.h @@ -7,6 +7,10 @@ // #import <HandBrakeKit/HandBrakeKit.h> +#import "HBSecurityAccessToken.h" + +@interface HBJob (Private) <HBSecurityScope> +@end @interface HBVideo (Private) @@ -44,7 +48,7 @@ @end -@interface HBSubtitles (Private) +@interface HBSubtitles (Private) <HBSecurityScope> - (instancetype)initWithJob:(HBJob *)job; diff --git a/macosx/HBJob.h b/macosx/HBJob.h index ff4af8d09..66a42ccec 100644 --- a/macosx/HBJob.h +++ b/macosx/HBJob.h @@ -86,14 +86,6 @@ typedef NS_ENUM(NSUInteger, HBJobState){ @property (nonatomic, readwrite, weak, nullable) NSUndoManager *undo; -/* Given a HBJob created by NSSecureCoding, make the resource referenced by the job accessible to the process. - */ -- (BOOL)startAccessingSecurityScopedResource; - -/* Revokes the access granted to the url by a prior successful call to startAccessingSecurityScopedResource. - */ -- (void)stopAccessingSecurityScopedResource; - @end NS_ASSUME_NONNULL_END diff --git a/macosx/HBJob.m b/macosx/HBJob.m index 3eac48e3d..725036377 100644 --- a/macosx/HBJob.m +++ b/macosx/HBJob.m @@ -10,9 +10,11 @@ #import "HBAudioDefaults.h" #import "HBSubtitlesDefaults.h" +#import "HBMutablePreset.h" #import "HBCodingUtilities.h" -#import "HBMutablePreset.h" +#import "HBUtilities.h" +#import "HBSecurityAccessToken.h" #include "hb.h" @@ -31,12 +33,12 @@ NSString *HBChaptersChangedNotification = @"HBChaptersChangedNotification"; @property (nonatomic, readwrite) NSData *outputURLFolderBookmark; /** - Keep track of startAccessingSecurityScopedResource return value - to avoid calling stopAccessingSecurityScopedResource when unnecessary - and stopping another instance from accessing the url. + Keep track of security scoped resources status. */ -@property (nonatomic, readwrite) BOOL accessingSecurityScopedFileURL; -@property (nonatomic, readwrite) BOOL accessingSecurityScopedOutputURL; +@property (nonatomic, readwrite) HBSecurityAccessToken *fileURLToken; +@property (nonatomic, readwrite) HBSecurityAccessToken *outputURLToken; +@property (nonatomic, readwrite) HBSecurityAccessToken *subtitlesToken; +@property (nonatomic, readwrite) NSInteger *accessCount; @end @@ -230,16 +232,14 @@ NSString *HBChaptersChangedNotification = @"HBChaptersChangedNotification"; - (BOOL)startAccessingSecurityScopedResource { #ifdef __SANDBOX_ENABLED__ - if (!self.accessingSecurityScopedFileURL) + if (self.accessCount == 0) { - self.accessingSecurityScopedFileURL = [self.fileURL startAccessingSecurityScopedResource]; + self.fileURLToken = [HBSecurityAccessToken tokenWithObject:self.fileURL]; + self.outputURLToken = [HBSecurityAccessToken tokenWithObject:self.outputURL]; + self.subtitlesToken = [HBSecurityAccessToken tokenWithObject:self.subtitles]; } - if (!self.accessingSecurityScopedOutputURL) - { - self.accessingSecurityScopedOutputURL = [self.outputURL startAccessingSecurityScopedResource]; - } - - return self.accessingSecurityScopedFileURL || self.accessingSecurityScopedOutputURL; + self.accessCount += 1; + return YES; #else return NO; #endif @@ -248,13 +248,13 @@ NSString *HBChaptersChangedNotification = @"HBChaptersChangedNotification"; - (void)stopAccessingSecurityScopedResource { #ifdef __SANDBOX_ENABLED__ - if (self.accessingSecurityScopedFileURL) - { - [self.fileURL stopAccessingSecurityScopedResource]; - } - if (self.accessingSecurityScopedOutputURL) + self.accessCount -= 1; + NSAssert(self.accessCount >= 0, @"[HBJob stopAccessingSecurityScopedResource:] unbalanced call"); + if (self.accessCount == 0) { - [self.outputURL stopAccessingSecurityScopedResource]; + self.fileURLToken = nil; + self.outputURLToken = nil; + self.subtitlesToken = nil; } #endif } @@ -322,41 +322,20 @@ NSString *HBChaptersChangedNotification = @"HBChaptersChangedNotification"; encodeObject(_uuid); #ifdef __SANDBOX_ENABLED__ - NSError *error = nil; - if (!_fileURLBookmark) { - _fileURLBookmark = [_fileURL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope|NSURLBookmarkCreationSecurityScopeAllowOnlyReadAccess - includingResourceValuesForKeys:nil - relativeToURL:nil - error:&error]; - - if (error) - { - NSLog(@"Error creating bookmark for URL (%@): %@", _fileURL, error); - } + _fileURLBookmark = [HBUtilities bookmarkFromURL:_fileURL + options:NSURLBookmarkCreationWithSecurityScope | + NSURLBookmarkCreationSecurityScopeAllowOnlyReadAccess]; } encodeObject(_fileURLBookmark); if (!_outputURLFolderBookmark) { - BOOL accessed = [_outputURL startAccessingSecurityScopedResource]; - - _outputURLFolderBookmark = [_outputURL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope - includingResourceValuesForKeys:nil - relativeToURL:nil - error:&error]; - - - if (error) - { - NSLog(@"Error creating bookmark for URL (%@): %@", _outputURL, error); - } - if (accessed) - { - [_outputURL stopAccessingSecurityScopedResource]; - } + __attribute__((unused)) HBSecurityAccessToken *token = [HBSecurityAccessToken tokenWithObject:_outputURL]; + _outputURLFolderBookmark = [HBUtilities bookmarkFromURL:_outputURL]; + token = nil; } encodeObject(_outputURLFolderBookmark); @@ -397,22 +376,11 @@ NSString *HBChaptersChangedNotification = @"HBChaptersChangedNotification"; decodeObject(_uuid, NSString); #ifdef __SANDBOX_ENABLED__ - NSError *error; - _fileURLBookmark = [HBCodingUtilities decodeObjectOfClass:[NSData class] forKey:@"_fileURLBookmark" decoder:decoder]; if (_fileURLBookmark) { - BOOL bookmarkDataIsStale; - _fileURL = [NSURL URLByResolvingBookmarkData:_fileURLBookmark - options:NSURLBookmarkResolutionWithSecurityScope - relativeToURL:nil - bookmarkDataIsStale:&bookmarkDataIsStale - error:&error]; - if (error) - { - NSLog(@"Error creating URL from bookmark (%@): %@", _outputURL, error); - } + _fileURL = [HBUtilities URLFromBookmark:_fileURLBookmark]; } else { @@ -423,16 +391,7 @@ NSString *HBChaptersChangedNotification = @"HBChaptersChangedNotification"; if (_outputURLFolderBookmark) { - BOOL bookmarkDataIsStale; - _outputURL = [NSURL URLByResolvingBookmarkData:_outputURLFolderBookmark - options:NSURLBookmarkResolutionWithSecurityScope - relativeToURL:nil - bookmarkDataIsStale:&bookmarkDataIsStale - error:&error]; - if (error) - { - NSLog(@"Error creating URL from bookmark (%@): %@", _outputURL, error); - } + _outputURL = [HBUtilities URLFromBookmark:_outputURLFolderBookmark]; } else { diff --git a/macosx/HBSecurityAccessToken.h b/macosx/HBSecurityAccessToken.h new file mode 100644 index 000000000..1ad0b3979 --- /dev/null +++ b/macosx/HBSecurityAccessToken.h @@ -0,0 +1,35 @@ +// +// HBSecurityAccessToken.h +// HandBrake +// +// Created by Damiano Galassi on 24/01/17. +// +// + +#import <Foundation/Foundation.h> + +@protocol HBSecurityScope <NSObject> + +/* Given an instance, make the resource referenced by the job accessible to the process. + */ +- (BOOL)startAccessingSecurityScopedResource; + +/* Revokes the access granted to the url by a prior successful call to startAccessingSecurityScopedResource. + */ +- (void)stopAccessingSecurityScopedResource; + +@end + +@interface NSURL (HBSecurityScope) <HBSecurityScope> + +- (BOOL)startAccessingSecurityScopedResource; +- (void)stopAccessingSecurityScopedResource; + +@end + +@interface HBSecurityAccessToken : NSObject + ++ (instancetype)tokenWithObject:(id<HBSecurityScope>)object; +- (instancetype)initWithObject:(id<HBSecurityScope>)object; + +@end diff --git a/macosx/HBSecurityAccessToken.m b/macosx/HBSecurityAccessToken.m new file mode 100644 index 000000000..027f66920 --- /dev/null +++ b/macosx/HBSecurityAccessToken.m @@ -0,0 +1,42 @@ +// +// HBSecurityAccessToken.m +// HandBrake +// +// Created by Damiano Galassi on 24/01/17. +// +// + +#import "HBSecurityAccessToken.h" + +@interface HBSecurityAccessToken () +@property (nonatomic, readonly) id<HBSecurityScope> object; +@property (nonatomic, readonly) BOOL accessed; +@end + +@implementation HBSecurityAccessToken + +- (instancetype)initWithObject:(id<HBSecurityScope>)object; +{ + self = [super init]; + if (self) + { + _object = object; + _accessed = [_object startAccessingSecurityScopedResource]; + } + return self; +} + ++ (instancetype)tokenWithObject:(id<HBSecurityScope>)object +{ + return [[self alloc] initWithObject:object]; +} + +- (void)dealloc +{ + if (_accessed) + { + [_object stopAccessingSecurityScopedResource]; + } +} + +@end diff --git a/macosx/HBSubtitles.m b/macosx/HBSubtitles.m index c98f9fcec..7a0ca3828 100644 --- a/macosx/HBSubtitles.m +++ b/macosx/HBSubtitles.m @@ -13,7 +13,9 @@ #import "HBJob+HBJobConversion.h" #import "HBTitle.h" #import "HBCodingUtilities.h" +#import "HBUtilities.h" #import "HBJob+Private.h" +#import "HBSecurityAccessToken.h" #include "common.h" @@ -22,6 +24,7 @@ extern NSString *keySubTrackLanguageIsoCode; extern NSString *keySubTrackType; extern NSString *keySubTrackSrtFileURL; +extern NSString *keySubTrackSrtFileURLBookmark; #define NONE_TRACK_INDEX 0 #define FOREIGN_TRACK_INDEX 1 @@ -30,6 +33,9 @@ extern NSString *keySubTrackSrtFileURL; @property (nonatomic, readwrite) NSArray<NSDictionary *> *sourceTracks; +@property (nonatomic, readonly) NSMutableArray<HBSecurityAccessToken *> *tokens; +@property (nonatomic, readwrite) NSInteger *accessCount; + @property (nonatomic, readwrite, weak) HBJob *job; @property (nonatomic, readwrite) int container; @@ -50,6 +56,7 @@ extern NSString *keySubTrackSrtFileURL; _tracks = [[NSMutableArray alloc] init]; _defaults = [[HBSubtitlesDefaults alloc] init]; + _tokens = [NSMutableArray array]; NSMutableArray *sourceTracks = [job.title.subtitlesTracks mutableCopy]; @@ -215,12 +222,26 @@ extern NSString *keySubTrackSrtFileURL; - (void)addSrtTrackFromURL:(NSURL *)srtURL { +#ifdef __SANDBOX_ENABLED__ + // Create the security scoped bookmark + NSData *bookmark = [HBUtilities bookmarkFromURL:srtURL + options:NSURLBookmarkCreationWithSecurityScope | + NSURLBookmarkCreationSecurityScopeAllowOnlyReadAccess]; +#endif + // Create a new entry for the subtitle source array so it shows up in our subtitle source list NSMutableArray *sourceTrack = [self.sourceTracks mutableCopy]; +#ifdef __SANDBOX_ENABLED__ [sourceTrack addObject:@{keySubTrackName: srtURL.lastPathComponent, - keySubTrackType: @(SRTSUB), - keySubTrackSrtFileURL: srtURL}]; - self.sourceTracks = sourceTrack; + keySubTrackType: @(SRTSUB), + keySubTrackSrtFileURL: srtURL, + keySubTrackSrtFileURLBookmark: bookmark}]; +#else + [sourceTrack addObject:@{keySubTrackName: srtURL.lastPathComponent, + keySubTrackType: @(SRTSUB), + keySubTrackSrtFileURL: srtURL}]; +#endif + self.sourceTracks = [sourceTrack copy]; HBSubtitlesTrack *track = [self trackFromSourceTrackIndex:self.sourceTracksArray.count - 1]; [self insertObject:track inTracksAtIndex:[self countOfTracks] - 1]; } @@ -396,6 +417,38 @@ extern NSString *keySubTrackSrtFileURL; }]; } +- (BOOL)startAccessingSecurityScopedResource +{ +#ifdef __SANDBOX_ENABLED__ + if (self.accessCount == 0) + { + for (NSDictionary *sourceTrack in self.sourceTracks) + { + if (sourceTrack[keySubTrackSrtFileURLBookmark]) + { + [self.tokens addObject:[HBSecurityAccessToken tokenWithObject:sourceTrack[keySubTrackSrtFileURL]]]; + } + } + } + self.accessCount += 1; + return YES; +#else + return NO; +#endif +} + +- (void)stopAccessingSecurityScopedResource +{ +#ifdef __SANDBOX_ENABLED__ + self.accessCount -= 1; + NSAssert(self.accessCount >= 0, @"[HBSubtitles stopAccessingSecurityScopedResource:] unbalanced call"); + if (self.accessCount == 0) + { + [self.tokens removeAllObjects]; + } +#endif +} + #pragma mark - NSCopying - (instancetype)copyWithZone:(NSZone *)zone @@ -419,6 +472,7 @@ extern NSString *keySubTrackSrtFileURL; } copy->_defaults = [_defaults copy]; + copy->_tokens = [NSMutableArray array]; } return copy; @@ -445,8 +499,33 @@ extern NSString *keySubTrackSrtFileURL; { self = [super init]; + _tokens = [NSMutableArray array]; + decodeInt(_container); - decodeCollectionOfObjects2(_sourceTracks, NSArray, NSDictionary, NSURL); + decodeCollectionOfObjects3(_sourceTracks, NSArray, NSDictionary, NSURL, NSData); + +#ifdef __SANDBOX_ENABLED__ + NSMutableArray *sourceTracks = [_sourceTracks mutableCopy]; + for (NSDictionary *sourceTrack in _sourceTracks) + { + if (sourceTrack[keySubTrackSrtFileURLBookmark]) + { + NSMutableDictionary<NSString *, id> *copy = [sourceTrack mutableCopy]; + NSURL *srtURL = [HBUtilities URLFromBookmark:sourceTrack[keySubTrackSrtFileURLBookmark]]; + if (srtURL) + { + copy[keySubTrackSrtFileURL] = srtURL; + } + [sourceTracks addObject:copy]; + } + else + { + [sourceTracks addObject:sourceTrack]; + } + } + _sourceTracks = [sourceTracks copy]; +#endif + decodeCollectionOfObjects(_tracks, NSMutableArray, HBSubtitlesTrack); for (HBSubtitlesTrack *track in _tracks) diff --git a/macosx/HBSubtitlesTrack.m b/macosx/HBSubtitlesTrack.m index bcff453fa..f87a7be5b 100644 --- a/macosx/HBSubtitlesTrack.m +++ b/macosx/HBSubtitlesTrack.m @@ -19,6 +19,7 @@ NSString *keySubTrackName = @"keySubTrackName"; NSString *keySubTrackLanguageIsoCode = @"keySubTrackLanguageIsoCode"; NSString *keySubTrackType = @"keySubTrackType"; NSString *keySubTrackSrtFileURL = @"keySubTrackSrtFileURL"; +NSString *keySubTrackSrtFileURLBookmark = @"keySubTrackSrtFileURLBookmark"; @interface HBSubtitlesTrack () @property (nonatomic, readwrite) BOOL validating; diff --git a/macosx/HBUtilities.h b/macosx/HBUtilities.h index c7f195b1f..1807cdca8 100644 --- a/macosx/HBUtilities.h +++ b/macosx/HBUtilities.h @@ -32,6 +32,7 @@ NS_ASSUME_NONNULL_BEGIN + (nullable NSURL *)URLFromBookmark:(NSData *)bookmark; + (nullable NSData *)bookmarkFromURL:(NSURL *)url; ++ (nullable NSData *)bookmarkFromURL:(NSURL *)url options:(NSURLBookmarkCreationOptions)options; + (NSString *)displayNameForURL:(NSURL *)URL; + (NSURL *)mediaURLFromURL:(NSURL *)URL; diff --git a/macosx/HBUtilities.m b/macosx/HBUtilities.m index a0db9927b..8d83f46f3 100644 --- a/macosx/HBUtilities.m +++ b/macosx/HBUtilities.m @@ -71,13 +71,13 @@ return isStale ? nil : url; } -+ (nullable NSData *)bookmarkFromURL:(NSURL *)url ++ (nullable NSData *)bookmarkFromURL:(NSURL *)url options:(NSURLBookmarkCreationOptions)options { NSParameterAssert(url); NSError *error; - NSData *bookmark = [url bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope includingResourceValuesForKeys:nil relativeToURL:nil error:&error]; + NSData *bookmark = [url bookmarkDataWithOptions:options includingResourceValuesForKeys:nil relativeToURL:nil error:&error]; if (error) { @@ -88,6 +88,11 @@ return bookmark; } ++ (nullable NSData *)bookmarkFromURL:(NSURL *)url +{ + return [HBUtilities bookmarkFromURL:url options:NSURLBookmarkCreationWithSecurityScope]; +} + + (NSString *)displayNameForURL:(NSURL *)URL { NSString *displayName = URL.lastPathComponent; diff --git a/macosx/HandBrake.xcodeproj/project.pbxproj b/macosx/HandBrake.xcodeproj/project.pbxproj index 091c5261e..bf1467439 100644 --- a/macosx/HandBrake.xcodeproj/project.pbxproj +++ b/macosx/HandBrake.xcodeproj/project.pbxproj @@ -169,6 +169,8 @@ A91CE2FC1C7DB99D0068F46F /* HBPreset.h in Headers */ = {isa = PBXBuildFile; fileRef = A9CF25F21990D64E0023F727 /* HBPreset.h */; settings = {ATTRIBUTES = (Public, ); }; }; A91CE2FD1C7DB99D0068F46F /* HBMutablePreset.h in Headers */ = {isa = PBXBuildFile; fileRef = A96CD1741BCC5F9100F372F1 /* HBMutablePreset.h */; settings = {ATTRIBUTES = (Public, ); }; }; A91CE2FE1C7DB99D0068F46F /* HBTreeNode.h in Headers */ = {isa = PBXBuildFile; fileRef = A9D488A31996270300E9B1BA /* HBTreeNode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A91D54871E378ABD006D0997 /* HBSecurityAccessToken.h in Headers */ = {isa = PBXBuildFile; fileRef = A91D54851E378ABD006D0997 /* HBSecurityAccessToken.h */; }; + A91D54881E378ABD006D0997 /* HBSecurityAccessToken.m in Sources */ = {isa = PBXBuildFile; fileRef = A91D54861E378ABD006D0997 /* HBSecurityAccessToken.m */; }; A91F97351D7B2A4E00D82DCE /* HBAudioTransformers.h in Headers */ = {isa = PBXBuildFile; fileRef = A91F97331D7B2A4E00D82DCE /* HBAudioTransformers.h */; }; A91F97361D7B2A4E00D82DCE /* HBAudioTransformers.m in Sources */ = {isa = PBXBuildFile; fileRef = A91F97341D7B2A4E00D82DCE /* HBAudioTransformers.m */; }; A92268781A6E555500A8D5C5 /* HBAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A92268771A6E555500A8D5C5 /* HBAppDelegate.m */; }; @@ -418,6 +420,8 @@ A91CE2CF1C7DABCE0068F46F /* libbz2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libbz2.tbd; path = usr/lib/libbz2.tbd; sourceTree = SDKROOT; }; A91CE2D11C7DABDA0068F46F /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; A91CE2D31C7DABE40068F46F /* libiconv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libiconv.tbd; path = usr/lib/libiconv.tbd; sourceTree = SDKROOT; }; + A91D54851E378ABD006D0997 /* HBSecurityAccessToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBSecurityAccessToken.h; sourceTree = "<group>"; }; + A91D54861E378ABD006D0997 /* HBSecurityAccessToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBSecurityAccessToken.m; sourceTree = "<group>"; }; A91F97331D7B2A4E00D82DCE /* HBAudioTransformers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBAudioTransformers.h; sourceTree = "<group>"; }; A91F97341D7B2A4E00D82DCE /* HBAudioTransformers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBAudioTransformers.m; sourceTree = "<group>"; }; A92268761A6E555500A8D5C5 /* HBAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBAppDelegate.h; sourceTree = "<group>"; }; @@ -966,6 +970,8 @@ A93B0DF71C804CF50051A3FA /* NSDictionary+HBAdditions.m */, A98F38041C7DCA7E00E469C8 /* HBStateFormatter+Private.h */, A98F38051C7DCA7E00E469C8 /* HBStateFormatter+Private.m */, + A91D54851E378ABD006D0997 /* HBSecurityAccessToken.h */, + A91D54861E378ABD006D0997 /* HBSecurityAccessToken.m */, ); name = Others; sourceTree = "<group>"; @@ -1247,6 +1253,7 @@ files = ( A9736F051C7DA5FE008F1D18 /* HandBrakeKit.h in Headers */, A91CE2D71C7DAEEE0068F46F /* HBCore.h in Headers */, + A91D54871E378ABD006D0997 /* HBSecurityAccessToken.h in Headers */, A91CE2D81C7DAEEE0068F46F /* HBTitle.h in Headers */, A91CE2D91C7DAEEE0068F46F /* HBJob.h in Headers */, A91CE2DA1C7DAEEE0068F46F /* HBRange.h in Headers */, @@ -1581,6 +1588,7 @@ A91CE2A01C7DA7320068F46F /* HBRange+UIAdditions.m in Sources */, A91CE2A21C7DA7320068F46F /* HBVideo+UIAdditions.m in Sources */, A91CE2A41C7DA7320068F46F /* HBPicture+UIAdditions.m in Sources */, + A91D54881E378ABD006D0997 /* HBSecurityAccessToken.m in Sources */, A91119A61C7DD64A001C463C /* HBDistributedArray.m in Sources */, A91CE2A61C7DA7320068F46F /* HBFilters+UIAdditions.m in Sources */, A91CE2A81C7DA7320068F46F /* HBDVDDetector.m in Sources */, |