Index: utils/ofarc/GZIPArchive.m ================================================================== --- utils/ofarc/GZIPArchive.m +++ utils/ofarc/GZIPArchive.m @@ -41,10 +41,12 @@ forKey: key]; [fileManager setAttributes: destinationAttributes ofItemAtPath: destination]; #endif + + [app quarantineFile: destination]; } static void setModificationDate(OFString *path, OFGZIPStream *stream) { Index: utils/ofarc/LHAArchive.m ================================================================== --- utils/ofarc/LHAArchive.m +++ utils/ofarc/LHAArchive.m @@ -48,23 +48,25 @@ setPermissions(OFString *path, OFLHAArchiveEntry *entry) { #ifdef OF_FILE_MANAGER_SUPPORTS_PERMISSIONS OFNumber *POSIXPermissions = entry.POSIXPermissions; - if (POSIXPermissions == nil) - return; - - POSIXPermissions = [OFNumber numberWithUnsignedShort: - POSIXPermissions.unsignedShortValue & 0777]; - - OFFileAttributes attributes = [OFDictionary - dictionaryWithObject: POSIXPermissions - forKey: OFFilePOSIXPermissions]; - - [[OFFileManager defaultManager] setAttributes: attributes - ofItemAtPath: path]; + if (POSIXPermissions != nil) { + OFFileAttributes attributes; + + POSIXPermissions = [OFNumber numberWithUnsignedShort: + POSIXPermissions.unsignedShortValue & 0777]; + attributes = [OFDictionary + dictionaryWithObject: POSIXPermissions + forKey: OFFilePOSIXPermissions]; + + [[OFFileManager defaultManager] setAttributes: attributes + ofItemAtPath: path]; + } #endif + + [app quarantineFile: path]; } static void setModificationDate(OFString *path, OFLHAArchiveEntry *entry) { Index: utils/ofarc/OFArc.h ================================================================== --- utils/ofarc/OFArc.h +++ utils/ofarc/OFArc.h @@ -29,10 +29,11 @@ # define S_IRWXO 0 #endif @interface OFArc: OFObject { + OFData *_quarantine; int8_t _overwrite; @public int8_t _outputLevel; int _exitStatus; } @@ -45,8 +46,9 @@ outFileName: (OFString *)outFileName; - (ssize_t)copyBlockFromStream: (OFStream *)input toStream: (OFStream *)output fileName: (OFString *)fileName; - (nullable OFString *)safeLocalPathForPath: (OFString *)path; +- (void)quarantineFile: (OFString *)path; @end OF_ASSUME_NONNULL_END Index: utils/ofarc/OFArc.m ================================================================== --- utils/ofarc/OFArc.m +++ utils/ofarc/OFArc.m @@ -34,10 +34,11 @@ #import "TarArchive.h" #import "ZIPArchive.h" #import "ZooArchive.h" #import "OFCreateDirectoryFailedException.h" +#import "OFGetItemAttributesFailedException.h" #import "OFInvalidArgumentException.h" #import "OFInvalidFormatException.h" #import "OFNotImplementedException.h" #import "OFOpenItemFailedException.h" #import "OFReadFailedException.h" @@ -473,10 +474,23 @@ archive = [self openArchiveWithIRI: IRI type: type mode: mode encoding: encoding]; + +#ifdef OF_MACOS + @try { + OFString *attributeName = @"com.apple.quarantine"; + + _quarantine = [[[OFFileManager defaultManager] + extendedAttributeDataForName: attributeName + ofItemAtIRI: IRI] retain]; + } @catch (OFGetItemAttributesFailedException *e) { + if (e.errNo != /*ENOATTR*/ 93) + @throw e; + } +#endif if (outputDir != nil) { OFFileManager *fileManager = [OFFileManager defaultManager]; @@ -814,6 +828,17 @@ objc_autoreleasePoolPop(pool); return [path autorelease]; } + +- (void)quarantineFile: (OFString *)path +{ +#ifdef OF_MACOS + if (_quarantine != nil) + [[OFFileManager defaultManager] + setExtendedAttributeData: _quarantine + forName: @"com.apple.quarantine" + ofItemAtPath: path]; +#endif +} @end Index: utils/ofarc/TarArchive.m ================================================================== --- utils/ofarc/TarArchive.m +++ utils/ofarc/TarArchive.m @@ -47,10 +47,12 @@ forKey: OFFilePOSIXPermissions]; [[OFFileManager defaultManager] setAttributes: attributes ofItemAtPath: path]; #endif + + [app quarantineFile: path]; } static void setModificationDate(OFString *path, OFTarArchiveEntry *entry) { Index: utils/ofarc/ZIPArchive.m ================================================================== --- utils/ofarc/ZIPArchive.m +++ utils/ofarc/ZIPArchive.m @@ -56,10 +56,12 @@ [[OFFileManager defaultManager] setAttributes: attributes ofItemAtPath: path]; } #endif + + [app quarantineFile: path]; } static void setModificationDate(OFString *path, OFZIPArchiveEntry *entry) { Index: utils/ofarc/ZooArchive.m ================================================================== --- utils/ofarc/ZooArchive.m +++ utils/ofarc/ZooArchive.m @@ -39,23 +39,25 @@ setPermissions(OFString *path, OFZooArchiveEntry *entry) { #ifdef OF_FILE_MANAGER_SUPPORTS_PERMISSIONS OFNumber *POSIXPermissions = entry.POSIXPermissions; - if (POSIXPermissions == nil) - return; - - POSIXPermissions = [OFNumber numberWithUnsignedShort: - POSIXPermissions.unsignedShortValue & 0777]; - - OFFileAttributes attributes = [OFDictionary - dictionaryWithObject: POSIXPermissions - forKey: OFFilePOSIXPermissions]; - - [[OFFileManager defaultManager] setAttributes: attributes - ofItemAtPath: path]; + if (POSIXPermissions != nil) { + OFFileAttributes attributes; + + POSIXPermissions = [OFNumber numberWithUnsignedShort: + POSIXPermissions.unsignedShortValue & 0777]; + attributes = [OFDictionary + dictionaryWithObject: POSIXPermissions + forKey: OFFilePOSIXPermissions]; + + [[OFFileManager defaultManager] setAttributes: attributes + ofItemAtPath: path]; + } #endif + + [app quarantineFile: path]; } static void setModificationDate(OFString *path, OFZooArchiveEntry *entry) {